diff --git a/public/conformance/auth.json b/public/conformance/auth.json new file mode 100644 index 0000000..f5814d8 --- /dev/null +++ b/public/conformance/auth.json @@ -0,0 +1 @@ +{"runs":[[0,18,0,"custom claims are measured in UTF-16 code units: é counts one, 🔥 counts two, at 999 to 1,001"],[18,18,1,"signUp validation order, canonical email and the issued tokens"],[36,16,1,"signInWithPassword success and every recorded failure"],[52,12,1,"emailPrivacyConfig.enableImprovedEmailPrivacy masks enumeration"],[64,12,1,"anonymous sign-up, its token claims and the upgrade to email+password"],[76,16,1,"createAuthUri reports registration and sign-in methods"],[92,19,1,"privileged signUp (Admin SDK createUser) fields and errors"],[111,10,1,"signInWithIdp with a fake Google id_token: new user, repeat, profile and verification fields"],[121,4,1,"signInWithIdp credential forms: fragment, query, JWT id_token, access_token alongside"],[125,13,1,"every provider id the widget offers plus OIDC and SAML"],[138,14,1,"signInWithIdp request validation and the not-implemented credential forms"],[152,15,1,"one account per email: federated sign-in against existing password accounts"],[167,13,1,"signIn.allowDuplicateEmails changes federated sign-in and sign-up semantics"],[180,20,1,"linking a federated identity to a signed-in account and unlinking it"],[200,23,1,"signInWithCustomToken: JSON and JWT tokens, claims and validation"],[223,22,1,"VERIFY_EMAIL: send, list, consume via update and via the action page"],[245,25,1,"PASSWORD_RESET: send, resetPassword, effects on providers and the action page"],[270,27,1,"EMAIL_SIGNIN: send, signInWithEmailLink for new and existing users, action page"],[297,18,1,"VERIFY_AND_CHANGE_EMAIL: send, consume via update and via the action page"],[315,17,1,"plain email updates issue RECOVER_EMAIL codes; the recoverEmail action page"],[332,16,1,"privileged sendOobCode with returnOobLink (Admin SDK generate*Link)"],[348,22,1,"sendVerificationCode and signInWithPhoneNumber for new and existing users"],[370,19,1,"linking a phone number to a signed-in account, collisions and temporary proofs"],[389,31,1,"client accounts:update: profile, email, password, token re-issue, deleteAttribute and errors"],[420,26,1,"privileged accounts:update: claims, phone, flags, timestamps, validSince, password and email"],[446,26,1,"privileged accounts:update: providers, MFA enrolments, deleteAttribute and the security forms"],[472,15,1,"securetoken grant: bodies, reuse, revocation and errors"],[487,24,1,"privileged lookup by every key, dedupe, not found; delete; project scoping"],[511,7,1,"batchCreate (importUsers): every imported field and the sign-ins it enables"],[518,14,1,"batchCreate: per-index errors, whole-request errors, overwrite and hash options"],[532,14,1,"batchGet (listUsers) paging by localId with maxResults and nextPageToken"],[546,14,1,"accounts:query and :queryAccounts: counts, sorting and the not-implemented filters"],[560,9,1,"batchDelete (deleteUsers): limits, NOT_DISABLED, force and lifecycle events"],[569,12,1,"createSessionCookie validity bounds and the cookie claims"],[581,21,1,"v2 project config, the emulator config routes and getProjects"],[602,28,1,"tenant create/get/list/patch/delete and the auto-created tenant"],[630,30,1,"client sign-in flows scoped to a tenant, tenant claims and isolation from the root project"],[660,23,1,"privileged account routes scoped to a tenant, tenant export and delete all"],[683,14,1,"SMS second factor: enrolment start/finalize and its validation"],[697,29,1,"SMS second factor: MFA sign-in, withdraw and ineligible first factors"],[726,12,1,"MFA users created by import, pending credentials on email link and IdP first factors"],[738,21,1,"passkey enrolment and sign-in as the emulator fakes them"],[759,22,1,"beforeCreate and beforeSignIn on password sign-up and sign-in: JWT payload, updates, errors"],[781,6,1,"blocking functions on IdP sign-ins with inbound credential forwarding"],[787,9,1,"blocking functions on email-link and phone sign ins"],[796,9,1,"blocking functions on MFA finalize and under a tenant"],[805,18,1,"trigger_multicast for every create and delete path; silent for imports and delete all"],[823,7,1,"readiness, the OpenAPI document, CORS and unknown routes"],[830,23,1,"the legacy v3 relyingparty routes rewrite onto v1 operations"],[853,9,1,"client operations the official emulator answers with 501"],[862,34,1,"privileged operations the official emulator answers with 501"],[896,3,1,"the popup handler page with and without accounts, the iframe page"],[899,13,1,"delete-all clears accounts but keeps issued codes; verification codes listing"],[912,11,1,"the record set the CLI export writes (batchGet + config) re-imported through the CLI's import route"],[923,4,1,"tenant accounts in the export layout"],[927,23,1,"id token claims per sign-in method, custom and session claims, multi-provider identities"],[950,32,1,"every operation against a disabled account"],[982,18,1,"tokens and codes of a deleted account against every operation"],[1000,14,1,"apiKey in the query, in the header, missing, and owner client routes"],[1014,22,1,"OpenAPI body validation: coercions, unknown fields, wrong types and enum handling"],[1036,19,1,"mixed-case e-mail addresses are lower-cased at every entry point"],[1055,22,1,"providerUserInfo ordering and content through links, unlinks and profile updates"],[1077,1,1,"signUp validation order, canonical email and the issued tokens"],[1078,1,1,"beforeCreate and beforeSignIn on password sign-up and sign-in: JWT payload, updates, errors"],[1079,6,1,"the popup handler page with and without accounts, the iframe page"],[1085,1,1,"OpenAPI body validation: coercions, unknown fields, wrong types and enum handling"],[1086,4,2,"Browser discovery, fake Google IdP, helper popup/iframe, and secure-token refresh routes expose the contract consumed by the Firebase browser SDK"],[1090,11,2,"Identity Toolkit client and privileged Admin routes preserve Firebase response, error, custom-claim, custom-token, and unsigned JWT contracts"],[1101,7,2,"Auth config/accounts import and export preserve persisted fields while user create/delete lifecycle operations multicast legacy Firebase Auth events to Functions"],[1108,8,2,"Sign-in popup and redirect in a real browser (loopback origin)"],[1116,2,2,"An IdP sign-in reuses a linked account and honours disabling"],[1118,8,2,"Sign-in popup and redirect in a real browser (insecure origin emulator.test)"],[1126,9,2,"Refresh grants reused: anonymous sign in"],[1135,9,2,"Refresh grants reused: password sign in"],[1144,9,2,"Refresh grants reused: custom sign in"],[1153,1,2,"Refresh grants reused: unknown sign in"],[1154,4,2,"Refresh from the browser SDK: forced, two tabs, reload"],[1158,2,2,"Browser discovery, fake Google IdP, helper popup/iframe, and secure-token refresh routes expose the contract consumed by the Firebase browser SDK"]],"cases":[{"t":"create","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"ascii 1000","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"ascii 1001","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"400 CLAIMS_TOO_LARGE","r":"c","k":"answer"},{"t":"accented 999","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"accented 1000","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"accented 1001","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"400 CLAIMS_TOO_LARGE","r":"c","k":"answer"},{"t":"lookup accented","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"emoji 1000","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"emoji 1001","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"400 CLAIMS_TOO_LARGE","r":"c","k":"answer"},{"t":"lookup emoji","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"signin carries claims","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"import","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchCreate","a":"200 {error: [2 items]}","r":"c","k":"answer"},{"t":"imported","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"configure blocking","q":"PATCH /identitytoolkit.googleapis.com/v2/projects/{project}/config","a":"200 {blockingFunctions, emailPrivacyConfig, signIn}","r":"c","k":"answer"},{"t":"blocking accented 1000","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"blocking emoji 1000","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"blocking emoji 1001","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"400 CLAIMS_TOO_LARGE","r":"c","k":"answer"},{"t":"lookup blocking","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"no api key","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"403 PERMISSION_DENIED: The request is missing a valid API key.","r":"c","k":"answer"},{"t":"missing email","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"400 MISSING_EMAIL","r":"c","k":"answer"},{"t":"missing password","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"400 MISSING_PASSWORD","r":"c","k":"answer"},{"t":"invalid email","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"400 INVALID_EMAIL","r":"c","k":"answer"},{"t":"weak password","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"400 WEAK_PASSWORD : Password should be at least 6 characters","r":"c","k":"answer"},{"t":"local id rejected","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"400 UNEXPECTED_PARAMETER : User ID","r":"c","k":"answer"},{"t":"ok","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"duplicate","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"400 EMAIL_EXISTS","r":"c","k":"answer"},{"t":"duplicate other case","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"400 EMAIL_EXISTS","r":"c","k":"answer"},{"t":"lookup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup missing token","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"400 MISSING_ID_TOKEN","r":"c","k":"answer"},{"t":"lookup garbage token","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"400 INVALID_ID_TOKEN","r":"c","k":"answer"},{"t":"without return secure token","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"empty email string","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"400 MISSING_EMAIL","r":"c","k":"answer"},{"t":"email as number","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"400 INVALID_EMAIL","r":"c","k":"answer"},{"t":"email as object","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"400 INVALID_ARGUMENT: Invalid JSON payload received. /email must be string","r":"c","k":"answer"},{"t":"snake case keys","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"snake case lookup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"signup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"missing email","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 MISSING_EMAIL","r":"c","k":"answer"},{"t":"invalid email","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 INVALID_EMAIL","r":"c","k":"answer"},{"t":"missing password","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 MISSING_PASSWORD","r":"c","k":"answer"},{"t":"unknown email","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 EMAIL_NOT_FOUND","r":"c","k":"answer"},{"t":"wrong password","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 INVALID_PASSWORD","r":"c","k":"answer"},{"t":"ok","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"captcha","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"501 NOT_IMPLEMENTED: captcha unimplemented","r":"c","k":"answer"},{"t":"id token param","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"501 NOT_IMPLEMENTED: idToken / pendingIdToken is no longer in use and unsupported by the Auth Emulator.","r":"c","k":"answer"},{"t":"disable","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"disabled","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 USER_DISABLED","r":"c","k":"answer"},{"t":"refresh disabled","q":"POST /securetoken.googleapis.com/v1/token","a":"400 USER_DISABLED","r":"c","k":"answer"},{"t":"lookup disabled","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"400 USER_DISABLED","r":"c","k":"answer"},{"t":"enable","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"ok again","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"lookup after","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"signup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"config default","q":"GET /emulator/v1/projects/{project}/config","a":"200 {emailPrivacyConfig, signIn}","r":"c","k":"answer"},{"t":"enable","q":"PATCH /emulator/v1/projects/{project}/config","a":"200 {emailPrivacyConfig, signIn}","r":"c","k":"answer"},{"t":"config after","q":"GET /emulator/v1/projects/{project}/config","a":"200 {emailPrivacyConfig, signIn}","r":"c","k":"answer"},{"t":"unknown email","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 INVALID_LOGIN_CREDENTIALS","r":"c","k":"answer"},{"t":"wrong password","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 INVALID_LOGIN_CREDENTIALS","r":"c","k":"answer"},{"t":"ok","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"create auth uri","q":"POST /identitytoolkit.googleapis.com/v1/accounts:createAuthUri","a":"200 identitytoolkit#CreateAuthUriResponse","r":"c","k":"answer"},{"t":"reset unknown","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"reset known","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"disable privacy","q":"PATCH /emulator/v1/projects/{project}/config","a":"200 {emailPrivacyConfig, signIn}","r":"c","k":"answer"},{"t":"unknown email again","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 EMAIL_NOT_FOUND","r":"c","k":"answer"},{"t":"anonymous","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"lookup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"refresh","q":"POST /securetoken.googleapis.com/v1/token","a":"200 {expires_in, project_id, user_id}","r":"c","k":"answer"},{"t":"upgrade","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup upgraded","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"old token lookup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"400 TOKEN_EXPIRED","r":"c","k":"answer"},{"t":"signin","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"second anonymous","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"anonymous with display name","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"lookup display name","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"delete anonymous","q":"POST /identitytoolkit.googleapis.com/v1/accounts:delete","a":"200 identitytoolkit#DeleteAccountResponse","r":"c","k":"answer"},{"t":"delete again","q":"POST /identitytoolkit.googleapis.com/v1/accounts:delete","a":"400 USER_NOT_FOUND","r":"c","k":"answer"},{"t":"missing identifier","q":"POST /identitytoolkit.googleapis.com/v1/accounts:createAuthUri","a":"400 MISSING_IDENTIFIER","r":"c","k":"answer"},{"t":"missing continue uri","q":"POST /identitytoolkit.googleapis.com/v1/accounts:createAuthUri","a":"400 MISSING_CONTINUE_URI","r":"c","k":"answer"},{"t":"invalid identifier","q":"POST /identitytoolkit.googleapis.com/v1/accounts:createAuthUri","a":"400 INVALID_IDENTIFIER","r":"c","k":"answer"},{"t":"invalid continue uri","q":"POST /identitytoolkit.googleapis.com/v1/accounts:createAuthUri","a":"400 INVALID_CONTINUE_URI","r":"c","k":"answer"},{"t":"provider id","q":"POST /identitytoolkit.googleapis.com/v1/accounts:createAuthUri","a":"501 NOT_IMPLEMENTED: Sign-in with IDP is not yet supported.","r":"c","k":"answer"},{"t":"unregistered","q":"POST /identitytoolkit.googleapis.com/v1/accounts:createAuthUri","a":"200 identitytoolkit#CreateAuthUriResponse","r":"c","k":"answer"},{"t":"signup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"password user","q":"POST /identitytoolkit.googleapis.com/v1/accounts:createAuthUri","a":"200 identitytoolkit#CreateAuthUriResponse","r":"c","k":"answer"},{"t":"google link","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"password and google","q":"POST /identitytoolkit.googleapis.com/v1/accounts:createAuthUri","a":"200 identitytoolkit#CreateAuthUriResponse","r":"c","k":"answer"},{"t":"with session id","q":"POST /identitytoolkit.googleapis.com/v1/accounts:createAuthUri","a":"200 identitytoolkit#CreateAuthUriResponse","r":"c","k":"answer"},{"t":"google only user","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"federated only","q":"POST /identitytoolkit.googleapis.com/v1/accounts:createAuthUri","a":"200 identitytoolkit#CreateAuthUriResponse","r":"c","k":"answer"},{"t":"email link send","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"email link signin","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithEmailLink","a":"200 identitytoolkit#EmailLinkSigninResponse","r":"c","k":"answer"},{"t":"email link user","q":"POST /identitytoolkit.googleapis.com/v1/accounts:createAuthUri","a":"200 identitytoolkit#CreateAuthUriResponse","r":"c","k":"answer"},{"t":"full","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"lookup","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"duplicate local id","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts","a":"400 DUPLICATE_LOCAL_ID","r":"c","k":"answer"},{"t":"duplicate email","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts","a":"400 EMAIL_EXISTS","r":"c","k":"answer"},{"t":"duplicate phone","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts","a":"400 PHONE_NUMBER_EXISTS","r":"c","k":"answer"},{"t":"invalid phone","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts","a":"400 INVALID_PHONE_NUMBER : Invalid format.","r":"c","k":"answer"},{"t":"disabled user","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"disabled signin","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 USER_DISABLED","r":"c","k":"answer"},{"t":"no identity","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"lookup empty","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"id token and local id","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts","a":"400 UNEXPECTED_PARAMETER : User ID","r":"c","k":"answer"},{"t":"weak password","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts","a":"400 WEAK_PASSWORD : Password should be at least 6 characters","r":"c","k":"answer"},{"t":"with mfa","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"lookup mfa","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"mfa invalid phone","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts","a":"400 INVALID_MFA_PHONE_NUMBER : Invalid format.","r":"c","k":"answer"},{"t":"custom attributes ignored","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"lookup claims","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"signup owner unscoped","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"lookup unscoped","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"first","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"lookup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"again","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"lookup again","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"refresh","q":"POST /securetoken.googleapis.com/v1/token","a":"200 {expires_in, project_id, user_id}","r":"c","k":"answer"},{"t":"no email","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"lookup no email","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"unverified email","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"lookup unverified","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"upper case email","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"request uri fragment","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"request uri query","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"jwt id token","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"access token with id token","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"facebook","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"github","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"twitter","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"apple","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"microsoft","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"yahoo","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"oidc","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"saml","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"saml missing assertion","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"400 INVALID_IDP_RESPONSE ((Missing assertion in SAMLResponse.))","r":"c","k":"answer"},{"t":"provider upper case","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"all users","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"lookup github","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup saml","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"missing request uri","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"400 MISSING_REQUEST_URI","r":"c","k":"answer"},{"t":"invalid request uri","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"400 INVALID_REQUEST_URI","r":"c","k":"answer"},{"t":"missing provider","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"400 INVALID_CREDENTIAL_OR_PROVIDER_ID : Invalid IdP response/credential: http://localhost/?id_token=%7B%22sub%22%3A%22x%22%7D","r":"c","k":"answer"},{"t":"missing sub","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"400 INVALID_IDP_RESPONSE : Invalid Idp Response: id_token missing required fields. ((Missing \"sub\" field. This field is required and must b…","r":"c","k":"answer"},{"t":"sub not string","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"400 INVALID_IDP_RESPONSE : ((The \"sub\" field must be a string.))","r":"c","k":"answer"},{"t":"id token not json","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"400 INVALID_IDP_RESPONSE : Unable to parse id_token: {not-json ((Auth Emulator failed to parse fake id_token as strict JSON.))","r":"c","k":"answer"},{"t":"id token garbage","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"400 INVALID_IDP_RESPONSE : Unable to parse id_token: garbage-token ((Auth Emulator only accepts strict JSON or JWTs as fake id_tokens.))","r":"c","k":"answer"},{"t":"access token only google","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"501 NOT_IMPLEMENTED: The Auth Emulator only support sign-in with google.com using id_token, not access_token. Please update your code to us…","r":"c","k":"answer"},{"t":"access token only facebook","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"501 NOT_IMPLEMENTED: The Auth Emulator does not support facebook.com sign-in with credentials.","r":"c","k":"answer"},{"t":"access token json claims","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"no credential","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"501 NOT_IMPLEMENTED: The Auth Emulator only supports sign-in with credentials (id_token required).","r":"c","k":"answer"},{"t":"return refresh token","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"501 NOT_IMPLEMENTED: returnRefreshToken is not implemented yet.","r":"c","k":"answer"},{"t":"pending id token","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"501 NOT_IMPLEMENTED: pendingIdToken is not implemented yet.","r":"c","k":"answer"},{"t":"no api key","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"403 PERMISSION_DENIED: The request is missing a valid API key.","r":"c","k":"answer"},{"t":"password unverified","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"google takes over unverified","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"lookup taken over","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"password signin after takeover","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 INVALID_PASSWORD","r":"c","k":"answer"},{"t":"bob password","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"verify bob","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"google joins verified","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"lookup joined","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"password still works","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"carol password","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"unverified provider email","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"unverified provider email return credential","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"recycled","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"lookup recycled","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"all users","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"allow","q":"PATCH /emulator/v1/projects/{project}/config","a":"200 {emailPrivacyConfig, signIn}","r":"c","k":"answer"},{"t":"config","q":"GET /emulator/v1/projects/{project}/config","a":"200 {emailPrivacyConfig, signIn}","r":"c","k":"answer"},{"t":"signup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"google same email","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"lookup google","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"facebook same email","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"signup duplicate","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"400 EMAIL_EXISTS","r":"c","k":"answer"},{"t":"create auth uri","q":"POST /identitytoolkit.googleapis.com/v1/accounts:createAuthUri","a":"200 identitytoolkit#CreateAuthUriResponse","r":"c","k":"answer"},{"t":"link google to password","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"lookup linked","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"import duplicate","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchCreate","a":"200 {error: [1 item]}","r":"c","k":"answer"},{"t":"import duplicate sanity","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchCreate","a":"200 {error: [1 item]}","r":"c","k":"answer"},{"t":"all users","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"signup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"link google","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"lookup linked","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"link google again same","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"400 FEDERATED_USER_ID_ALREADY_LINKED","r":"c","k":"answer"},{"t":"bob","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"link already linked","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"400 FEDERATED_USER_ID_ALREADY_LINKED","r":"c","k":"answer"},{"t":"link already linked return credential","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"link email of other","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"400 EMAIL_EXISTS","r":"c","k":"answer"},{"t":"link verified email marks verified","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"lookup bob","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"unlink google","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup unlinked","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"unlink missing","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"google signin after unlink","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"unlink password","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup no password","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"password signin after unlink","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 EMAIL_NOT_FOUND","r":"c","k":"answer"},{"t":"anonymous","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"anonymous link google","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"lookup anon linked","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"missing token","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken","a":"400 MISSING_CUSTOM_TOKEN","r":"c","k":"answer"},{"t":"json token","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken","a":"200 identitytoolkit#VerifyCustomTokenResponse","r":"c","k":"answer"},{"t":"lookup json","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"json token again","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken","a":"200 identitytoolkit#VerifyCustomTokenResponse","r":"c","k":"answer"},{"t":"json invalid","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken","a":"400 INVALID_CUSTOM_TOKEN : ((Auth Emulator only accepts strict JSON or JWTs as fake custom tokens.))","r":"c","k":"answer"},{"t":"jwt token","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken","a":"200 identitytoolkit#VerifyCustomTokenResponse","r":"c","k":"answer"},{"t":"lookup jwt","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"refresh","q":"POST /securetoken.googleapis.com/v1/token","a":"200 {expires_in, project_id, user_id}","r":"c","k":"answer"},{"t":"wrong audience","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken","a":"400 INVALID_CUSTOM_TOKEN : ((Invalid aud (audience): wrong-audience Note: Firebase ID Tokens / third-party tokens cannot be used with signI…","r":"c","k":"answer"},{"t":"garbage","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken","a":"400 INVALID_CUSTOM_TOKEN : Invalid assertion format","r":"c","k":"answer"},{"t":"missing uid","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken","a":"400 MISSING_IDENTIFIER","r":"c","k":"answer"},{"t":"user id field","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken","a":"200 identitytoolkit#VerifyCustomTokenResponse","r":"c","k":"answer"},{"t":"numeric uid","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken","a":"200 identitytoolkit#VerifyCustomTokenResponse","r":"c","k":"answer"},{"t":"forbidden claim","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken","a":"400 FORBIDDEN_CLAIM : iss","r":"c","k":"answer"},{"t":"claims not object","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken","a":"400 INVALID_CLAIMS","r":"c","k":"answer"},{"t":"signed jwt","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken","a":"200 identitytoolkit#VerifyCustomTokenResponse","r":"c","k":"answer"},{"t":"disable","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"disabled","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken","a":"400 USER_DISABLED","r":"c","k":"answer"},{"t":"tenant claim on root","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken","a":"200 identitytoolkit#VerifyCustomTokenResponse","r":"c","k":"answer"},{"t":"lookup tenant claim","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"existing password user","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"custom for password user","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken","a":"200 identitytoolkit#VerifyCustomTokenResponse","r":"c","k":"answer"},{"t":"lookup password user","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"signup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"missing type","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"400 MISSING_REQ_TYPE","r":"c","k":"answer"},{"t":"unspecified type","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"400 MISSING_REQ_TYPE","r":"c","k":"answer"},{"t":"unknown type","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"501 NOT_IMPLEMENTED: RECOVER_EMAIL","r":"c","k":"answer"},{"t":"missing token","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"400 INVALID_ID_TOKEN","r":"c","k":"answer"},{"t":"invalid continue url","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"400 INVALID_CONTINUE_URI : ((expected an absolute URI with valid scheme and host))","r":"c","k":"answer"},{"t":"send","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"list","q":"GET /emulator/v1/projects/{project}/oobCodes","a":"200 {oobCodes}","r":"c","k":"answer"},{"t":"consume","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup verified","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"consume again","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"400 INVALID_OOB_CODE","r":"c","k":"answer"},{"t":"list after","q":"GET /emulator/v1/projects/{project}/oobCodes","a":"200 {oobCodes}","r":"c","k":"answer"},{"t":"send with continue","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"action missing api key","q":"GET /emulator/action","a":"400 missing apiKey query parameter","r":"c","k":"answer"},{"t":"action missing oob","q":"GET /emulator/action","a":"400 missing oobCode query parameter","r":"c","k":"answer"},{"t":"action wrong mode","q":"GET /emulator/action","a":"400 Invalid mode","r":"c","k":"answer"},{"t":"action redirect","q":"GET /emulator/action","a":"303 See Other. Redirecting to http://localhost/after","r":"c","k":"answer"},{"t":"action used","q":"GET /emulator/action","a":"400 Your request to verify your email has expired or the link has already been used.","r":"c","k":"answer"},{"t":"send json page","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"action json","q":"GET /emulator/action","a":"200 {authEmulator}","r":"c","k":"answer"},{"t":"anonymous","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"anonymous no email","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"400 MISSING_EMAIL","r":"c","k":"answer"},{"t":"signup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"link google","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"missing email","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"400 MISSING_EMAIL","r":"c","k":"answer"},{"t":"unknown email","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"400 EMAIL_NOT_FOUND","r":"c","k":"answer"},{"t":"send","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"reset missing code","q":"POST /identitytoolkit.googleapis.com/v1/accounts:resetPassword","a":"400 MISSING_OOB_CODE","r":"c","k":"answer"},{"t":"reset invalid code","q":"POST /identitytoolkit.googleapis.com/v1/accounts:resetPassword","a":"400 INVALID_OOB_CODE","r":"c","k":"answer"},{"t":"verify code only","q":"POST /identitytoolkit.googleapis.com/v1/accounts:resetPassword","a":"200 identitytoolkit#ResetPasswordResponse","r":"c","k":"answer"},{"t":"reset weak","q":"POST /identitytoolkit.googleapis.com/v1/accounts:resetPassword","a":"400 WEAK_PASSWORD : Password should be at least 6 characters","r":"c","k":"answer"},{"t":"reset","q":"POST /identitytoolkit.googleapis.com/v1/accounts:resetPassword","a":"200 identitytoolkit#ResetPasswordResponse","r":"c","k":"answer"},{"t":"reset again","q":"POST /identitytoolkit.googleapis.com/v1/accounts:resetPassword","a":"400 INVALID_OOB_CODE","r":"c","k":"answer"},{"t":"old password","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 INVALID_PASSWORD","r":"c","k":"answer"},{"t":"new password","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"lookup after reset","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"old token","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"400 TOKEN_EXPIRED","r":"c","k":"answer"},{"t":"send 2","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"action no password","q":"GET /emulator/action","a":"400 missing newPassword query parameter","r":"c","k":"answer"},{"t":"action placeholder","q":"GET /emulator/action","a":"400 newPassword must be something other than 'NEW_PASSWORD_HERE'","r":"c","k":"answer"},{"t":"action weak","q":"GET /emulator/action","a":"400 WEAK_PASSWORD : Password should be at least 6 characters","r":"c","k":"answer"},{"t":"action redirect","q":"GET /emulator/action","a":"303 See Other. Redirecting to http://localhost/done","r":"c","k":"answer"},{"t":"action used","q":"GET /emulator/action","a":"400 Your request to reset your password has expired or the link has already been used.","r":"c","k":"answer"},{"t":"password4","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"send 3","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"action json","q":"GET /emulator/action","a":"200 {authEmulator}","r":"c","k":"answer"},{"t":"list","q":"GET /emulator/v1/projects/{project}/oobCodes","a":"200 {oobCodes}","r":"c","k":"answer"},{"t":"missing email","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"400 MISSING_EMAIL","r":"c","k":"answer"},{"t":"send","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"list","q":"GET /emulator/v1/projects/{project}/oobCodes","a":"200 {oobCodes}","r":"c","k":"answer"},{"t":"signin missing email","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithEmailLink","a":"400 MISSING_EMAIL","r":"c","k":"answer"},{"t":"signin missing code","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithEmailLink","a":"400 MISSING_OOB_CODE","r":"c","k":"answer"},{"t":"signin wrong email","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithEmailLink","a":"400 INVALID_EMAIL : The email provided does not match the sign-in email address.","r":"c","k":"answer"},{"t":"signin invalid code","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithEmailLink","a":"400 INVALID_OOB_CODE","r":"c","k":"answer"},{"t":"signin new","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithEmailLink","a":"200 identitytoolkit#EmailLinkSigninResponse","r":"c","k":"answer"},{"t":"lookup new","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"signin reuse","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithEmailLink","a":"400 INVALID_OOB_CODE","r":"c","k":"answer"},{"t":"send 2","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"signin existing","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithEmailLink","a":"200 identitytoolkit#EmailLinkSigninResponse","r":"c","k":"answer"},{"t":"verify code","q":"POST /identitytoolkit.googleapis.com/v1/accounts:resetPassword","a":"400 INVALID_OOB_CODE","r":"c","k":"answer"},{"t":"create auth uri","q":"POST /identitytoolkit.googleapis.com/v1/accounts:createAuthUri","a":"200 identitytoolkit#CreateAuthUriResponse","r":"c","k":"answer"},{"t":"signup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"send for alice","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"link to alice","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithEmailLink","a":"200 identitytoolkit#EmailLinkSigninResponse","r":"c","k":"answer"},{"t":"lookup alice","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"send for bob","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"link bob to alice","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithEmailLink","a":"200 identitytoolkit#EmailLinkSigninResponse","r":"c","k":"answer"},{"t":"lookup alice after bob","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"send for link again","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"link existing to alice","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithEmailLink","a":"400 EMAIL_EXISTS","r":"c","k":"answer"},{"t":"send 3","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"action no continue","q":"GET /emulator/action","a":"400 Missing continueUrl query parameter","r":"c","k":"answer"},{"t":"action redirect","q":"GET /emulator/action","a":"303 See Other. Redirecting to http://localhost/finish?x=1&mode=signIn&apiKey=fake-api-key&oobCode={{oob:send-3}}&lang=en","r":"c","k":"answer"},{"t":"signin page code","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithEmailLink","a":"200 identitytoolkit#EmailLinkSigninResponse","r":"c","k":"answer"},{"t":"signup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"missing new email","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"400 MISSING_NEW_EMAIL","r":"c","k":"answer"},{"t":"missing token","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"400 MISSING_ID_TOKEN","r":"c","k":"answer"},{"t":"bob","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"new email exists","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"400 EMAIL_EXISTS","r":"c","k":"answer"},{"t":"send","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"list","q":"GET /emulator/v1/projects/{project}/oobCodes","a":"200 {oobCodes}","r":"c","k":"answer"},{"t":"verify code","q":"POST /identitytoolkit.googleapis.com/v1/accounts:resetPassword","a":"200 identitytoolkit#ResetPasswordResponse","r":"c","k":"answer"},{"t":"consume","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup changed","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"old token after change","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"consume again","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"400 INVALID_OOB_CODE","r":"c","k":"answer"},{"t":"signin new email","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"send 2","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"action redirect","q":"GET /emulator/action","a":"303 See Other. Redirecting to http://localhost/changed","r":"c","k":"answer"},{"t":"action used","q":"GET /emulator/action","a":"400 Your request to change your email has expired or the link has already been used.","r":"c","k":"answer"},{"t":"send 3","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"action json","q":"GET /emulator/action","a":"200 {authEmulator}","r":"c","k":"answer"},{"t":"signup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"bob","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"rename","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"signin alice4","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"plain update","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup plain update","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"list recover","q":"GET /emulator/v1/projects/{project}/oobCodes","a":"200 {oobCodes}","r":"c","k":"answer"},{"t":"send verify","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"recover wrong mode","q":"GET /emulator/action","a":"400 Requested mode does not match the OOB code provided.","r":"c","k":"answer"},{"t":"recover","q":"GET /emulator/action","a":"200 {authEmulator}","r":"c","k":"answer"},{"t":"recover again","q":"GET /emulator/action","a":"400 Requested mode does not match the OOB code provided.","r":"c","k":"answer"},{"t":"lookup recovered","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"signin old email","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 EMAIL_NOT_FOUND","r":"c","k":"answer"},{"t":"signin recovered","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"update to same email","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"update to existing","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"400 EMAIL_EXISTS","r":"c","k":"answer"},{"t":"update invalid email","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"400 INVALID_EMAIL","r":"c","k":"answer"},{"t":"signup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"client return link","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"400 INSUFFICIENT_PERMISSION","r":"c","k":"answer"},{"t":"verify","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"verify unknown","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:sendOobCode","a":"400 USER_NOT_FOUND","r":"c","k":"answer"},{"t":"verify missing email","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:sendOobCode","a":"400 MISSING_EMAIL","r":"c","k":"answer"},{"t":"reset","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"signin","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"change","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"change unknown","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:sendOobCode","a":"400 USER_NOT_FOUND","r":"c","k":"answer"},{"t":"verify with token","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"no return link","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:sendOobCode","a":"400 INVALID_ID_TOKEN","r":"c","k":"answer"},{"t":"list","q":"GET /emulator/v1/projects/{project}/oobCodes","a":"200 {oobCodes}","r":"c","k":"answer"},{"t":"consume admin code","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"reset admin code","q":"POST /identitytoolkit.googleapis.com/v1/accounts:resetPassword","a":"200 identitytoolkit#ResetPasswordResponse","r":"c","k":"answer"},{"t":"list tenant","q":"GET /emulator/v1/projects/{project}/tenants/tenant-alpha/oobCodes","a":"200 {oobCodes}","r":"c","k":"answer"},{"t":"list after","q":"GET /emulator/v1/projects/{project}/oobCodes","a":"200 {oobCodes}","r":"c","k":"answer"},{"t":"missing phone","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendVerificationCode","a":"400 INVALID_PHONE_NUMBER : Invalid format.","r":"c","k":"answer"},{"t":"invalid phone","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendVerificationCode","a":"400 INVALID_PHONE_NUMBER : Invalid format.","r":"c","k":"answer"},{"t":"send","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendVerificationCode","a":"200 {sessionInfo}","r":"c","k":"answer"},{"t":"list","q":"GET /emulator/v1/projects/{project}/verificationCodes","a":"200 {verificationCodes}","r":"c","k":"answer"},{"t":"signin missing session","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPhoneNumber","a":"400 MISSING_SESSION_INFO","r":"c","k":"answer"},{"t":"signin missing code","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPhoneNumber","a":"400 MISSING_CODE","r":"c","k":"answer"},{"t":"signin invalid session","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPhoneNumber","a":"400 INVALID_SESSION_INFO","r":"c","k":"answer"},{"t":"signin wrong code","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPhoneNumber","a":"400 INVALID_CODE","r":"c","k":"answer"},{"t":"signin new","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPhoneNumber","a":"200 {expiresIn, isNewUser, localId, phoneNumber}","r":"c","k":"answer"},{"t":"lookup new","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"signin reuse","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPhoneNumber","a":"400 INVALID_SESSION_INFO","r":"c","k":"answer"},{"t":"list after","q":"GET /emulator/v1/projects/{project}/verificationCodes","a":"200 {verificationCodes}","r":"c","k":"answer"},{"t":"send 2","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendVerificationCode","a":"200 {sessionInfo}","r":"c","k":"answer"},{"t":"signin existing","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPhoneNumber","a":"200 {expiresIn, isNewUser, localId, phoneNumber}","r":"c","k":"answer"},{"t":"lookup existing","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"refresh","q":"POST /securetoken.googleapis.com/v1/token","a":"200 {expires_in, project_id, user_id}","r":"c","k":"answer"},{"t":"send 3","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendVerificationCode","a":"200 {sessionInfo}","r":"c","k":"answer"},{"t":"disable","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"signin disabled","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPhoneNumber","a":"400 USER_DISABLED","r":"c","k":"answer"},{"t":"temporary proof invalid","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPhoneNumber","a":"400 INVALID_TEMPORARY_PROOF","r":"c","k":"answer"},{"t":"temporary proof missing phone","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPhoneNumber","a":"400 MISSING_PHONE_NUMBER","r":"c","k":"answer"},{"t":"send tenant","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendVerificationCode","a":"400 UNSUPPORTED_TENANT_OPERATION","r":"c","k":"answer"},{"t":"signup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"send","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendVerificationCode","a":"200 {sessionInfo}","r":"c","k":"answer"},{"t":"link","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPhoneNumber","a":"200 {expiresIn, isNewUser, localId, phoneNumber}","r":"c","k":"answer"},{"t":"lookup linked","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"bob","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"send 2","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendVerificationCode","a":"200 {sessionInfo}","r":"c","k":"answer"},{"t":"link collision","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPhoneNumber","a":"200 {phoneNumber, temporaryProof, temporaryProofExpiresIn}","r":"c","k":"answer"},{"t":"proof with token","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPhoneNumber","a":"400 PHONE_NUMBER_EXISTS","r":"c","k":"answer"},{"t":"proof without token","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPhoneNumber","a":"200 {expiresIn, isNewUser, localId, phoneNumber}","r":"c","k":"answer"},{"t":"proof wrong phone","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPhoneNumber","a":"400 INVALID_TEMPORARY_PROOF","r":"c","k":"answer"},{"t":"unlink","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup unlinked","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"send 3","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendVerificationCode","a":"200 {sessionInfo}","r":"c","k":"answer"},{"t":"link bob","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPhoneNumber","a":"200 {expiresIn, isNewUser, localId, phoneNumber}","r":"c","k":"answer"},{"t":"lookup bob","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"admin set phone exists","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"400 PHONE_NUMBER_EXISTS","r":"c","k":"answer"},{"t":"admin set phone","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup admin phone","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"admin lookup by phone","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"signup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"no token","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"400 INVALID_REQ_TYPE : Unsupported request parameters.","r":"c","k":"answer"},{"t":"profile","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup profile","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"delete display name","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"delete photo","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup deleted","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"delete provider attr","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"501 NOT_IMPLEMENTED: deleteAttribute: PROVIDER","r":"c","k":"answer"},{"t":"delete raw user info","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"501 NOT_IMPLEMENTED: deleteAttribute: RAW_USER_INFO","r":"c","k":"answer"},{"t":"custom attributes","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"400 INSUFFICIENT_PERMISSION","r":"c","k":"answer"},{"t":"disable user","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"400 OPERATION_NOT_ALLOWED","r":"c","k":"answer"},{"t":"provider field","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"501 NOT_IMPLEMENTED: provider is not implemented yet.","r":"c","k":"answer"},{"t":"upgrade to federated","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"501 NOT_IMPLEMENTED: upgradeToFederatedLogin is not implemented yet.","r":"c","k":"answer"},{"t":"weak password","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"400 WEAK_PASSWORD : Password should be at least 6 characters","r":"c","k":"answer"},{"t":"password","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"old token after password","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"400 TOKEN_EXPIRED","r":"c","k":"answer"},{"t":"old refresh after password","q":"POST /securetoken.googleapis.com/v1/token","a":"200 {expires_in, project_id, user_id}","r":"c","k":"answer"},{"t":"lookup new token","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"signin old password","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 INVALID_PASSWORD","r":"c","k":"answer"},{"t":"signin new password","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"email","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup email","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"old token after email","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"400 TOKEN_EXPIRED","r":"c","k":"answer"},{"t":"delete password attr","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup no password","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"delete email attr","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup no email","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"set email again","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup final","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"garbage token","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"400 INVALID_ID_TOKEN","r":"c","k":"answer"},{"t":"unknown user token","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"400 USER_NOT_FOUND","r":"c","k":"answer"},{"t":"create","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"signin","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"missing local id","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"400 MISSING_LOCAL_ID","r":"c","k":"answer"},{"t":"unknown user","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"400 USER_NOT_FOUND","r":"c","k":"answer"},{"t":"claims invalid","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"400 INVALID_CLAIMS","r":"c","k":"answer"},{"t":"claims too large","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"400 CLAIMS_TOO_LARGE","r":"c","k":"answer"},{"t":"claims forbidden","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"400 FORBIDDEN_CLAIM : aud","r":"c","k":"answer"},{"t":"claims array","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"400 INVALID_CLAIMS","r":"c","k":"answer"},{"t":"claims","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"refresh with claims","q":"POST /securetoken.googleapis.com/v1/token","a":"200 {expires_in, project_id, user_id}","r":"c","k":"answer"},{"t":"phone invalid","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"400 INVALID_PHONE_NUMBER : Invalid format.","r":"c","k":"answer"},{"t":"phone","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"bob","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"phone exists","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"400 PHONE_NUMBER_EXISTS","r":"c","k":"answer"},{"t":"email verified","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"timestamps","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup timestamps","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"valid since","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"token after valid since","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"400 TOKEN_EXPIRED","r":"c","k":"answer"},{"t":"refresh after valid since","q":"POST /securetoken.googleapis.com/v1/token","a":"200 {expires_in, project_id, user_id}","r":"c","k":"answer"},{"t":"valid since reset","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"password","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"signin new password","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"email","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup email","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"email exists","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"400 EMAIL_EXISTS","r":"c","k":"answer"},{"t":"create","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"bob","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"signin new password","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"delete provider password","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup no password","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"delete provider phone","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"link provider missing provider","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"400 MISSING_PROVIDER_ID","r":"c","k":"answer"},{"t":"link provider missing raw id","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"400 MISSING_RAW_ID","r":"c","k":"answer"},{"t":"link provider","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup linked","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup by federated","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"mfa set","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup mfa","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"mfa missing id","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"400 INVALID_MFA_ENROLLMENT_ID : mfaEnrollmentId must be defined.","r":"c","k":"answer"},{"t":"mfa invalid phone","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"400 INVALID_MFA_PHONE_NUMBER : Invalid format.","r":"c","k":"answer"},{"t":"mfa clear","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup mfa cleared","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"delete attributes","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup deleted","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"disable","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"id token with disable","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"400 MISSING_LOCAL_ID","r":"c","k":"answer"},{"t":"id token privileged","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"400 MISSING_LOCAL_ID","r":"c","k":"answer"},{"t":"unauthenticated","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"403 PERMISSION_DENIED: The request is missing a valid API key.","r":"c","k":"answer"},{"t":"bad bearer","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"401 UNAUTHENTICATED: Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authenticat…","r":"c","k":"answer"},{"t":"service account token","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup final","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"signup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"missing grant type","q":"POST /securetoken.googleapis.com/v1/token","a":"400 MISSING_GRANT_TYPE","r":"c","k":"answer"},{"t":"invalid grant type","q":"POST /securetoken.googleapis.com/v1/token","a":"400 INVALID_GRANT_TYPE","r":"c","k":"answer"},{"t":"missing refresh token","q":"POST /securetoken.googleapis.com/v1/token","a":"400 MISSING_REFRESH_TOKEN","r":"c","k":"answer"},{"t":"garbage","q":"POST /securetoken.googleapis.com/v1/token","a":"400 INVALID_REFRESH_TOKEN","r":"c","k":"answer"},{"t":"base64 without marker","q":"POST /securetoken.googleapis.com/v1/token","a":"400 INVALID_REFRESH_TOKEN","r":"c","k":"answer"},{"t":"wrong project","q":"POST /securetoken.googleapis.com/v1/token","a":"400 INVALID_REFRESH_TOKEN","r":"c","k":"answer"},{"t":"unknown user","q":"POST /securetoken.googleapis.com/v1/token","a":"400 INVALID_REFRESH_TOKEN","r":"c","k":"answer"},{"t":"json","q":"POST /securetoken.googleapis.com/v1/token","a":"200 {expires_in, project_id, user_id}","r":"c","k":"answer"},{"t":"form","q":"POST /securetoken.googleapis.com/v1/token","a":"200 {expires_in, project_id, user_id}","r":"c","k":"answer"},{"t":"camel case","q":"POST /securetoken.googleapis.com/v1/token","a":"200 {expires_in, project_id, user_id}","r":"c","k":"answer"},{"t":"reuse","q":"POST /securetoken.googleapis.com/v1/token","a":"200 {expires_in, project_id, user_id}","r":"c","k":"answer"},{"t":"no api key","q":"POST /securetoken.googleapis.com/v1/token","a":"403 PERMISSION_DENIED: The request is missing a valid API key.","r":"c","k":"answer"},{"t":"delete","q":"POST /identitytoolkit.googleapis.com/v1/accounts:delete","a":"200 identitytoolkit#DeleteAccountResponse","r":"c","k":"answer"},{"t":"deleted user","q":"POST /securetoken.googleapis.com/v1/token","a":"400 INVALID_REFRESH_TOKEN","r":"c","k":"answer"},{"t":"alice","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"bob","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"by local id","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"by email","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"by phone","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"mixed dedupe","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"federated incomplete","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"none found","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"empty","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"initial email","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"501 NOT_IMPLEMENTED: Lookup by initialEmail is not implemented.","r":"c","k":"answer"},{"t":"unscoped owner lookup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"target project without owner","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"400 INSUFFICIENT_PERMISSION : Only authenticated requests can specify target_project_id.","r":"c","k":"answer"},{"t":"target project in body","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"other project path","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"other project create","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"other project lookup","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"delete missing local id","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:delete","a":"400 MISSING_LOCAL_ID","r":"c","k":"answer"},{"t":"delete unknown","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:delete","a":"400 USER_NOT_FOUND","r":"c","k":"answer"},{"t":"delete bob","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:delete","a":"200 identitytoolkit#DeleteAccountResponse","r":"c","k":"answer"},{"t":"delete bob again","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:delete","a":"400 USER_NOT_FOUND","r":"c","k":"answer"},{"t":"client delete owner","q":"POST /identitytoolkit.googleapis.com/v1/accounts:delete","a":"200 identitytoolkit#DeleteAccountResponse","r":"c","k":"answer"},{"t":"all users","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"projects","q":"GET /identitytoolkit.googleapis.com/v1/projects","a":"200 {authorizedDomains, projectId}","r":"c","k":"answer"},{"t":"projects client","q":"GET /identitytoolkit.googleapis.com/v1/projects","a":"200 {authorizedDomains, projectId}","r":"c","k":"answer"},{"t":"missing users","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchCreate","a":"400 MISSING_USER_ACCOUNT","r":"c","k":"answer"},{"t":"empty users","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchCreate","a":"400 MISSING_USER_ACCOUNT","r":"c","k":"answer"},{"t":"import","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchCreate","a":"200 {error: []}","r":"c","k":"answer"},{"t":"all users","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"signin raw password","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"signin hash","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"signin claims","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken","a":"200 identitytoolkit#VerifyCustomTokenResponse","r":"c","k":"answer"},{"t":"import","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchCreate","a":"200 {error: []}","r":"c","k":"answer"},{"t":"per index errors","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchCreate","a":"200 {error: [16 items]}","r":"c","k":"answer"},{"t":"duplicate local ids","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchCreate","a":"400 DUPLICATE_LOCAL_ID : same","r":"c","k":"answer"},{"t":"sanity duplicate email","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchCreate","a":"400 DUPLICATE_EMAIL : s@example.com","r":"c","k":"answer"},{"t":"sanity duplicate raw id","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchCreate","a":"400 DUPLICATE_RAW_ID : Provider id(google.com), Raw id(same-raw)","r":"c","k":"answer"},{"t":"sanity email exists","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchCreate","a":"200 {error: [1 item]}","r":"c","k":"answer"},{"t":"overwrite","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchCreate","a":"200 {error: []}","r":"c","k":"answer"},{"t":"lookup overwritten","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"overwrite duplicate ids","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchCreate","a":"200 {error: []}","r":"c","k":"answer"},{"t":"lookup same2","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"hash options ignored","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchCreate","a":"200 {error: []}","r":"c","k":"answer"},{"t":"signin scrypt","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 INVALID_PASSWORD","r":"c","k":"answer"},{"t":"lookup scrypt","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"all users after","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"import","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchCreate","a":"200 {error: []}","r":"c","k":"answer"},{"t":"default","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"page 1","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"page 2","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"page 3","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"past end","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"exact","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"over cap","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"zero","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"negative","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"not a number","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"400 INVALID_ARGUMENT: Invalid JSON payload received. must be integer","r":"c","k":"answer"},{"t":"tenant query","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"empty project","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"unauthenticated","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"403 PERMISSION_DENIED: The request is missing a valid API key.","r":"c","k":"answer"},{"t":"import","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchCreate","a":"200 {error: []}","r":"c","k":"answer"},{"t":"default","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:query","a":"200 {recordsCount, userInfo}","r":"c","k":"answer"},{"t":"count only","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:query","a":"200 {recordsCount}","r":"c","k":"answer"},{"t":"desc","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:query","a":"200 {recordsCount, userInfo}","r":"c","k":"answer"},{"t":"unspecified","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:query","a":"200 {recordsCount, userInfo}","r":"c","k":"answer"},{"t":"expression","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:query","a":"501 NOT_IMPLEMENTED: expression is not implemented.","r":"c","k":"answer"},{"t":"limit","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:query","a":"501 NOT_IMPLEMENTED: limit is not implemented.","r":"c","k":"answer"},{"t":"offset","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:query","a":"501 NOT_IMPLEMENTED: offset is not implemented.","r":"c","k":"answer"},{"t":"offset zero","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:query","a":"200 {recordsCount, userInfo}","r":"c","k":"answer"},{"t":"sort by name","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:query","a":"501 NOT_IMPLEMENTED: Only sorting by USER_ID is implemented.","r":"c","k":"answer"},{"t":"alias","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}:queryAccounts","a":"200 {recordsCount, userInfo}","r":"c","k":"answer"},{"t":"tenant","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:query","a":"200 {recordsCount, userInfo}","r":"c","k":"answer"},{"t":"empty project","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:query","a":"200 {recordsCount, userInfo}","r":"c","k":"answer"},{"t":"unauthenticated","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:query","a":"403 PERMISSION_DENIED: The request is missing a valid API key.","r":"c","k":"answer"},{"t":"import","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchCreate","a":"200 {error: []}","r":"c","k":"answer"},{"t":"empty","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchDelete","a":"400 LOCAL_ID_LIST_EXCEEDS_LIMIT","r":"c","k":"answer"},{"t":"missing","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchDelete","a":"400 LOCAL_ID_LIST_EXCEEDS_LIMIT","r":"c","k":"answer"},{"t":"too many","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchDelete","a":"400 LOCAL_ID_LIST_EXCEEDS_LIMIT","r":"c","k":"answer"},{"t":"mixed","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchDelete","a":"200 {errors}","r":"c","k":"answer"},{"t":"all users","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"force","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchDelete","a":"200 {}","r":"c","k":"answer"},{"t":"all users after","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"again","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchDelete","a":"200 {}","r":"c","k":"answer"},{"t":"signup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"missing token","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}:createSessionCookie","a":"400 MISSING_ID_TOKEN","r":"c","k":"answer"},{"t":"too short","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}:createSessionCookie","a":"400 INVALID_DURATION","r":"c","k":"answer"},{"t":"too long","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}:createSessionCookie","a":"400 INVALID_DURATION","r":"c","k":"answer"},{"t":"default","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}:createSessionCookie","a":"200 {…}","r":"c","k":"answer"},{"t":"hour","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}:createSessionCookie","a":"200 {…}","r":"c","k":"answer"},{"t":"numeric duration","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}:createSessionCookie","a":"200 {…}","r":"c","k":"answer"},{"t":"garbage token","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}:createSessionCookie","a":"400 INVALID_ID_TOKEN","r":"c","k":"answer"},{"t":"unauthenticated","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}:createSessionCookie","a":"403 PERMISSION_DENIED: The request is missing a valid API key.","r":"c","k":"answer"},{"t":"delete","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:delete","a":"200 identitytoolkit#DeleteAccountResponse","r":"c","k":"answer"},{"t":"deleted user","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}:createSessionCookie","a":"400 USER_NOT_FOUND","r":"c","k":"answer"},{"t":"tenant cookie","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/tenants/tenant-alpha:createSessionCookie","a":"400 USER_NOT_FOUND","r":"c","k":"answer"},{"t":"get default","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/config","a":"200 {blockingFunctions, emailPrivacyConfig, signIn}","r":"c","k":"answer"},{"t":"emulator default","q":"GET /emulator/v1/projects/{project}/config","a":"200 {emailPrivacyConfig, signIn}","r":"c","k":"answer"},{"t":"patch masked","q":"PATCH /identitytoolkit.googleapis.com/v2/projects/{project}/config","a":"200 {blockingFunctions, emailPrivacyConfig, signIn}","r":"c","k":"answer"},{"t":"get after masked","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/config","a":"200 {blockingFunctions, emailPrivacyConfig, signIn}","r":"c","k":"answer"},{"t":"emulator after masked","q":"GET /emulator/v1/projects/{project}/config","a":"200 {emailPrivacyConfig, signIn}","r":"c","k":"answer"},{"t":"patch unmasked","q":"PATCH /identitytoolkit.googleapis.com/v2/projects/{project}/config","a":"200 {blockingFunctions, emailPrivacyConfig, signIn}","r":"c","k":"answer"},{"t":"get after unmasked","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/config","a":"200 {blockingFunctions, emailPrivacyConfig, signIn}","r":"c","k":"answer"},{"t":"invalid event","q":"PATCH /identitytoolkit.googleapis.com/v2/projects/{project}/config","a":"400 INVALID_BLOCKING_FUNCTION : ((Event type is invalid.))","r":"c","k":"answer"},{"t":"invalid uri","q":"PATCH /identitytoolkit.googleapis.com/v2/projects/{project}/config","a":"400 INVALID_BLOCKING_FUNCTION : ((Expected an absolute URI with valid scheme and host.))","r":"c","k":"answer"},{"t":"blocking ok","q":"PATCH /identitytoolkit.googleapis.com/v2/projects/{project}/config","a":"200 {blockingFunctions, emailPrivacyConfig, signIn}","r":"c","k":"answer"},{"t":"get with blocking","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/config","a":"200 {blockingFunctions, emailPrivacyConfig, signIn}","r":"c","k":"answer"},{"t":"mask unknown field","q":"PATCH /identitytoolkit.googleapis.com/v2/projects/{project}/config","a":"200 {blockingFunctions, emailPrivacyConfig, signIn}","r":"c","k":"answer"},{"t":"get final","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/config","a":"200 {blockingFunctions, emailPrivacyConfig, signIn}","r":"c","k":"answer"},{"t":"emulator patch both","q":"PATCH /emulator/v1/projects/{project}/config","a":"200 {emailPrivacyConfig, signIn}","r":"c","k":"answer"},{"t":"get after emulator patch","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/config","a":"200 {blockingFunctions, emailPrivacyConfig, signIn}","r":"c","k":"answer"},{"t":"emulator patch empty","q":"PATCH /emulator/v1/projects/{project}/config","a":"200 {emailPrivacyConfig, signIn}","r":"c","k":"answer"},{"t":"emulator patch no auth","q":"PATCH /emulator/v1/projects/{project}/config","a":"200 {emailPrivacyConfig, signIn}","r":"c","k":"answer"},{"t":"tenant config","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/tenant-alpha/config","a":"404 NOT_FOUND: Not Found","r":"c","k":"answer"},{"t":"v2 unknown project","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/config","a":"200 {blockingFunctions, emailPrivacyConfig, signIn}","r":"c","k":"answer"},{"t":"recaptcha","q":"GET /identitytoolkit.googleapis.com/v1/recaptchaParams","a":"200 identitytoolkit#GetRecaptchaParamResponse","r":"c","k":"answer"},{"t":"recaptcha no key","q":"GET /identitytoolkit.googleapis.com/v1/recaptchaParams","a":"403 PERMISSION_DENIED: The request is missing a valid API key.","r":"c","k":"answer"},{"t":"list empty","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/tenants","a":"200 {tenants}","r":"c","k":"answer"},{"t":"get auto a","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/t-a","a":"200 {disableAuth, enableAnonymousUser, enableEmailLinkSignin, mfaConfig, …}","r":"c","k":"answer"},{"t":"get auto b","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/t-b","a":"200 {disableAuth, enableAnonymousUser, enableEmailLinkSignin, mfaConfig, …}","r":"c","k":"answer"},{"t":"get auto c","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/t-c","a":"200 {disableAuth, enableAnonymousUser, enableEmailLinkSignin, mfaConfig, …}","r":"c","k":"answer"},{"t":"list auto","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/tenants","a":"200 {tenants}","r":"c","k":"answer"},{"t":"list page 1","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/tenants","a":"200 {tenants}","r":"c","k":"answer"},{"t":"list page 2","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/tenants","a":"200 {tenants}","r":"c","k":"answer"},{"t":"list page past end","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/tenants","a":"200 {tenants}","r":"c","k":"answer"},{"t":"list page zero","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/tenants","a":"200 {tenants}","r":"c","k":"answer"},{"t":"create defaults","q":"POST /identitytoolkit.googleapis.com/v2/projects/{project}/tenants","a":"200 {disableAuth, displayName, enableAnonymousUser, enableEmailLinkSignin, …}","r":"c","k":"answer"},{"t":"create full","q":"POST /identitytoolkit.googleapis.com/v2/projects/{project}/tenants","a":"200 {disableAuth, displayName, enableAnonymousUser, enableEmailLinkSignin, …}","r":"c","k":"answer"},{"t":"create empty","q":"POST /identitytoolkit.googleapis.com/v2/projects/{project}/tenants","a":"200 {disableAuth, enableAnonymousUser, enableEmailLinkSignin, mfaConfig, …}","r":"c","k":"answer"},{"t":"create mfa partial","q":"POST /identitytoolkit.googleapis.com/v2/projects/{project}/tenants","a":"200 {disableAuth, enableAnonymousUser, enableEmailLinkSignin, mfaConfig, …}","r":"c","k":"answer"},{"t":"get","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/{{tenantId:create-full}}","a":"200 {disableAuth, displayName, enableAnonymousUser, enableEmailLinkSignin, …}","r":"c","k":"answer"},{"t":"list","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/tenants","a":"200 {tenants}","r":"c","k":"answer"},{"t":"patch masked","q":"PATCH /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/{{tenantId:create-full}}","a":"200 {disableAuth, displayName, enableAnonymousUser, enableEmailLinkSignin, …}","r":"c","k":"answer"},{"t":"get after masked","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/{{tenantId:create-full}}","a":"200 {disableAuth, displayName, enableAnonymousUser, enableEmailLinkSignin, …}","r":"c","k":"answer"},{"t":"patch mask nested","q":"PATCH /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/{{tenantId:create-full}}","a":"200 {disableAuth, displayName, enableAnonymousUser, enableEmailLinkSignin, …}","r":"c","k":"answer"},{"t":"get after nested","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/{{tenantId:create-full}}","a":"200 {disableAuth, displayName, enableAnonymousUser, enableEmailLinkSignin, …}","r":"c","k":"answer"},{"t":"patch unmasked","q":"PATCH /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/{{tenantId:create-full}}","a":"200 {disableAuth, displayName, enableAnonymousUser, enableEmailLinkSignin, …}","r":"c","k":"answer"},{"t":"get after unmasked","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/{{tenantId:create-full}}","a":"200 {disableAuth, displayName, enableAnonymousUser, enableEmailLinkSignin, …}","r":"c","k":"answer"},{"t":"delete","q":"DELETE /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/{{tenantId:create-defaults}}","a":"200 {}","r":"c","k":"answer"},{"t":"list after delete","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/tenants","a":"200 {tenants}","r":"c","k":"answer"},{"t":"get after delete","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/{{tenantId:create-defaults}}","a":"200 {disableAuth, enableAnonymousUser, enableEmailLinkSignin, mfaConfig, …}","r":"c","k":"answer"},{"t":"delete auto","q":"DELETE /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/t-a","a":"200 {}","r":"c","k":"answer"},{"t":"list final","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/tenants","a":"200 {tenants}","r":"c","k":"answer"},{"t":"list unauthenticated","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/tenants","a":"403 PERMISSION_DENIED: The request is missing a valid API key.","r":"c","k":"answer"},{"t":"create unauthenticated","q":"POST /identitytoolkit.googleapis.com/v2/projects/{project}/tenants","a":"403 PERMISSION_DENIED: The request is missing a valid API key.","r":"c","k":"answer"},{"t":"create","q":"POST /identitytoolkit.googleapis.com/v2/projects/{project}/tenants","a":"200 {disableAuth, displayName, enableAnonymousUser, enableEmailLinkSignin, …}","r":"c","k":"answer"},{"t":"signup not allowed","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"400 OPERATION_NOT_ALLOWED","r":"c","k":"answer"},{"t":"anonymous not allowed","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"400 ADMIN_ONLY_OPERATION","r":"c","k":"answer"},{"t":"email link not allowed","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"400 OPERATION_NOT_ALLOWED","r":"c","k":"answer"},{"t":"password signin not allowed","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 PASSWORD_LOGIN_DISABLED","r":"c","k":"answer"},{"t":"allow","q":"PATCH /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/{{tenantId:create}}","a":"200 {disableAuth, displayName, enableAnonymousUser, enableEmailLinkSignin, …}","r":"c","k":"answer"},{"t":"signup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"lookup tenant token","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup explicit tenant","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup wrong tenant","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"400 TENANT_ID_MISMATCH","r":"c","k":"answer"},{"t":"root lookup by email","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"tenant lookup by email","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/tenants/{{tenantId:create}}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"tenant lookup body mismatch","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/tenants/{{tenantId:create}}/accounts:lookup","a":"400 TENANT_ID_MISMATCH","r":"c","k":"answer"},{"t":"signin","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"signin root","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 EMAIL_NOT_FOUND","r":"c","k":"answer"},{"t":"refresh","q":"POST /securetoken.googleapis.com/v1/token","a":"200 {expires_in, project_id, user_id}","r":"c","k":"answer"},{"t":"refresh mismatch","q":"POST /securetoken.googleapis.com/v1/token","a":"400 TENANT_ID_MISMATCH: ((Refresh token tenant ID does not match target tenant ID.))","r":"c","k":"answer"},{"t":"anonymous","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"custom token","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken","a":"200 identitytoolkit#VerifyCustomTokenResponse","r":"c","k":"answer"},{"t":"custom token no body tenant","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken","a":"200 identitytoolkit#VerifyCustomTokenResponse","r":"c","k":"answer"},{"t":"custom token mismatch","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken","a":"400 TENANT_ID_MISMATCH","r":"c","k":"answer"},{"t":"custom token json","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken","a":"200 identitytoolkit#VerifyCustomTokenResponse","r":"c","k":"answer"},{"t":"idp","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"email link send","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"tenant oob codes","q":"GET /emulator/v1/projects/{project}/tenants/{{tenantId:create}}/oobCodes","a":"200 {oobCodes}","r":"c","k":"answer"},{"t":"root oob codes","q":"GET /emulator/v1/projects/{project}/oobCodes","a":"200 {oobCodes}","r":"c","k":"answer"},{"t":"email link signin","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithEmailLink","a":"200 identitytoolkit#EmailLinkSigninResponse","r":"c","k":"answer"},{"t":"phone send","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendVerificationCode","a":"400 UNSUPPORTED_TENANT_OPERATION","r":"c","k":"answer"},{"t":"tenant verification codes","q":"GET /emulator/v1/projects/{project}/tenants/{{tenantId:create}}/verificationCodes","a":"200 {verificationCodes}","r":"c","k":"answer"},{"t":"root verification codes","q":"GET /emulator/v1/projects/{project}/verificationCodes","a":"200 {verificationCodes}","r":"c","k":"answer"},{"t":"create","q":"POST /identitytoolkit.googleapis.com/v2/projects/{project}/tenants","a":"200 {disableAuth, displayName, enableAnonymousUser, enableEmailLinkSignin, …}","r":"c","k":"answer"},{"t":"signup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"signin","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"tenant create user","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/tenants/{{tenantId:create}}/accounts","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"tenant import","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/tenants/{{tenantId:create}}/accounts:batchCreate","a":"200 {error: [1 item]}","r":"c","k":"answer"},{"t":"tenant batch get","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/tenants/{{tenantId:create}}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"root batch get","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"root batch get tenant query","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"tenant query","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/tenants/{{tenantId:create}}/accounts:query","a":"200 {recordsCount, userInfo}","r":"c","k":"answer"},{"t":"tenant update","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/tenants/{{tenantId:create}}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"tenant send oob","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/tenants/{{tenantId:create}}/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"tenant session cookie","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/tenants/{{tenantId:create}}:createSessionCookie","a":"200 {…}","r":"c","k":"answer"},{"t":"root session cookie tenant token","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}:createSessionCookie","a":"200 {…}","r":"c","k":"answer"},{"t":"tenant batch delete","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/tenants/{{tenantId:create}}/accounts:batchDelete","a":"200 {}","r":"c","k":"answer"},{"t":"tenant delete user","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/tenants/{{tenantId:create}}/accounts:delete","a":"200 identitytoolkit#DeleteAccountResponse","r":"c","k":"answer"},{"t":"root delete tenant user","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:delete","a":"400 USER_NOT_FOUND","r":"c","k":"answer"},{"t":"get projects tenant","q":"GET /identitytoolkit.googleapis.com/v1/projects","a":"200 {authorizedDomains, projectId}","r":"c","k":"answer"},{"t":"tenant delete all","q":"DELETE /emulator/v1/projects/{project}/tenants/{{tenantId:create}}/accounts","a":"200 {}","r":"c","k":"answer"},{"t":"tenant batch get after","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/tenants/{{tenantId:create}}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"root batch get after","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"disable auth","q":"PATCH /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/{{tenantId:create}}","a":"200 {disableAuth, displayName, enableAnonymousUser, enableEmailLinkSignin, …}","r":"c","k":"answer"},{"t":"signin disabled tenant","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 PROJECT_DISABLED","r":"c","k":"answer"},{"t":"tenant batch get disabled","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/tenants/{{tenantId:create}}/accounts:batchGet","a":"400 PROJECT_DISABLED","r":"c","k":"answer"},{"t":"signup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"start unverified","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaEnrollment:start","a":"400 UNVERIFIED_EMAIL : Need to verify email first before enrolling second factors.","r":"c","k":"answer"},{"t":"verify","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"start missing token","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaEnrollment:start","a":"400 MISSING_ID_TOKEN","r":"c","k":"answer"},{"t":"start missing info","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaEnrollment:start","a":"400 INVALID_ARGUMENT : ((Missing phoneEnrollmentInfo.))","r":"c","k":"answer"},{"t":"start invalid phone","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaEnrollment:start","a":"400 INVALID_PHONE_NUMBER : Invalid format.","r":"c","k":"answer"},{"t":"start","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaEnrollment:start","a":"200 {phoneSessionInfo}","r":"c","k":"answer"},{"t":"codes","q":"GET /emulator/v1/projects/{project}/verificationCodes","a":"200 {verificationCodes}","r":"c","k":"answer"},{"t":"finalize missing code","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaEnrollment:finalize","a":"400 MISSING_CODE","r":"c","k":"answer"},{"t":"finalize wrong code","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaEnrollment:finalize","a":"400 INVALID_CODE","r":"c","k":"answer"},{"t":"finalize android proof","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaEnrollment:finalize","a":"501 NOT_IMPLEMENTED: androidVerificationProof is unsupported!","r":"c","k":"answer"},{"t":"finalize","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaEnrollment:finalize","a":"200 {…}","r":"c","k":"answer"},{"t":"lookup enrolled","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"start duplicate","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaEnrollment:start","a":"400 SECOND_FACTOR_EXISTS : Phone number already enrolled as second factor for this account.","r":"c","k":"answer"},{"t":"signup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"verify","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"start","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaEnrollment:start","a":"200 {phoneSessionInfo}","r":"c","k":"answer"},{"t":"finalize","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaEnrollment:finalize","a":"200 {…}","r":"c","k":"answer"},{"t":"signin pending","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"mfa start missing credential","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaSignIn:start","a":"400 MISSING_MFA_PENDING_CREDENTIAL : Request does not have MFA pending credential.","r":"c","k":"answer"},{"t":"mfa start missing enrollment","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaSignIn:start","a":"400 MISSING_MFA_ENROLLMENT_ID : No second factor identifier is provided.","r":"c","k":"answer"},{"t":"mfa start unknown enrollment","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaSignIn:start","a":"400 MFA_ENROLLMENT_NOT_FOUND","r":"c","k":"answer"},{"t":"mfa start bad credential","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaSignIn:start","a":"400 ((Invalid phoneVerificationInfo.mfaPendingCredential.))","r":"c","k":"answer"},{"t":"mfa start","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaSignIn:start","a":"200 {phoneResponseInfo}","r":"c","k":"answer"},{"t":"mfa finalize wrong code","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaSignIn:finalize","a":"400 INVALID_CODE","r":"c","k":"answer"},{"t":"mfa finalize missing credential","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaSignIn:finalize","a":"400 MISSING_CREDENTIAL : Please set MFA Pending Credential.","r":"c","k":"answer"},{"t":"mfa start 2","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaSignIn:start","a":"200 {phoneResponseInfo}","r":"c","k":"answer"},{"t":"mfa finalize","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaSignIn:finalize","a":"200 {…}","r":"c","k":"answer"},{"t":"lookup signed in","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"refresh","q":"POST /securetoken.googleapis.com/v1/token","a":"200 {expires_in, project_id, user_id}","r":"c","k":"answer"},{"t":"idp pending","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"phone first factor","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendVerificationCode","a":"200 {sessionInfo}","r":"c","k":"answer"},{"t":"withdraw unknown","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaEnrollment:withdraw","a":"400 MFA_ENROLLMENT_NOT_FOUND","r":"c","k":"answer"},{"t":"withdraw","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaEnrollment:withdraw","a":"200 {expiresIn}","r":"c","k":"answer"},{"t":"lookup withdrawn","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"signin plain","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"anonymous","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"start anonymous","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaEnrollment:start","a":"400 UNSUPPORTED_FIRST_FACTOR : MFA is not available for the given first factor.","r":"c","k":"answer"},{"t":"custom","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken","a":"200 identitytoolkit#VerifyCustomTokenResponse","r":"c","k":"answer"},{"t":"start custom","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaEnrollment:start","a":"400 UNSUPPORTED_FIRST_FACTOR : MFA is not available for the given first factor.","r":"c","k":"answer"},{"t":"tenant mfa disabled","q":"POST /identitytoolkit.googleapis.com/v2/projects/{project}/tenants","a":"200 {disableAuth, enableAnonymousUser, enableEmailLinkSignin, mfaConfig, …}","r":"c","k":"answer"},{"t":"tenant signup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"tenant start","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaEnrollment:start","a":"400 OPERATION_NOT_ALLOWED : SMS based MFA not enabled.","r":"c","k":"answer"},{"t":"import","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchCreate","a":"200 {error: []}","r":"c","k":"answer"},{"t":"signin pending","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"mfa start","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaSignIn:start","a":"200 {phoneResponseInfo}","r":"c","k":"answer"},{"t":"mfa finalize","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaSignIn:finalize","a":"200 {…}","r":"c","k":"answer"},{"t":"email link send","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"email link pending","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithEmailLink","a":"200 identitytoolkit#EmailLinkSigninResponse","r":"c","k":"answer"},{"t":"idp pending","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"mfa start idp","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaSignIn:start","a":"200 {phoneResponseInfo}","r":"c","k":"answer"},{"t":"mfa finalize idp","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaSignIn:finalize","a":"200 {…}","r":"c","k":"answer"},{"t":"lookup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"pending other project","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"mfa start wrong project","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaSignIn:start","a":"400 INVALID_PROJECT_ID : Project ID does not match MFA pending credential.","r":"c","k":"answer"},{"t":"signup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"enroll start missing token","q":"POST /identitytoolkit.googleapis.com/v2/accounts/passkeyEnrollment:start","a":"400 MISSING_ID_TOKEN","r":"c","k":"answer"},{"t":"enroll start","q":"POST /identitytoolkit.googleapis.com/v2/accounts/passkeyEnrollment:start","a":"200 {…}","r":"c","k":"answer"},{"t":"enroll finalize missing response","q":"POST /identitytoolkit.googleapis.com/v2/accounts/passkeyEnrollment:finalize","a":"400 MISSING_AUTHENTICATOR_RESPONSE","r":"c","k":"answer"},{"t":"enroll finalize missing id","q":"POST /identitytoolkit.googleapis.com/v2/accounts/passkeyEnrollment:finalize","a":"400 INVALID_CREDENTIAL_ID","r":"c","k":"answer"},{"t":"enroll finalize","q":"POST /identitytoolkit.googleapis.com/v2/accounts/passkeyEnrollment:finalize","a":"200 {localId}","r":"c","k":"answer"},{"t":"lookup enrolled","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"enroll duplicate","q":"POST /identitytoolkit.googleapis.com/v2/accounts/passkeyEnrollment:finalize","a":"400 CREDENTIAL_ALREADY_IN_USE","r":"c","k":"answer"},{"t":"enroll second","q":"POST /identitytoolkit.googleapis.com/v2/accounts/passkeyEnrollment:finalize","a":"200 {localId}","r":"c","k":"answer"},{"t":"enroll unnamed","q":"POST /identitytoolkit.googleapis.com/v2/accounts/passkeyEnrollment:finalize","a":"200 {localId}","r":"c","k":"answer"},{"t":"signin start","q":"POST /identitytoolkit.googleapis.com/v2/accounts/passkeySignIn:start","a":"200 {…}","r":"c","k":"answer"},{"t":"signin finalize missing","q":"POST /identitytoolkit.googleapis.com/v2/accounts/passkeySignIn:finalize","a":"400 MISSING_AUTHENTICATOR_RESPONSE","r":"c","k":"answer"},{"t":"signin finalize unknown","q":"POST /identitytoolkit.googleapis.com/v2/accounts/passkeySignIn:finalize","a":"400 PASSKEY_CREDENTIAL_NOT_FOUND","r":"c","k":"answer"},{"t":"signin finalize","q":"POST /identitytoolkit.googleapis.com/v2/accounts/passkeySignIn:finalize","a":"200 {…}","r":"c","k":"answer"},{"t":"lookup signed in","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"delete passkey","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup deleted","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"signin deleted","q":"POST /identitytoolkit.googleapis.com/v2/accounts/passkeySignIn:finalize","a":"400 PASSKEY_CREDENTIAL_NOT_FOUND","r":"c","k":"answer"},{"t":"disable","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"signin disabled","q":"POST /identitytoolkit.googleapis.com/v2/accounts/passkeySignIn:finalize","a":"400 USER_DISABLED","r":"c","k":"answer"},{"t":"all users","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"configure","q":"PATCH /identitytoolkit.googleapis.com/v2/projects/{project}/config","a":"200 {blockingFunctions, emailPrivacyConfig, signIn}","r":"c","k":"answer"},{"t":"signup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"lookup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"refresh","q":"POST /securetoken.googleapis.com/v1/token","a":"200 {expires_in, project_id, user_id}","r":"c","k":"answer"},{"t":"signin","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"lookup signin","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"signin empty response","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"signin no mask","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 BLOCKING_FUNCTION_ERROR_RESPONSE : ((Response UserRecord is missing updateMask.))","r":"c","k":"answer"},{"t":"signin function 500","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 BLOCKING_FUNCTION_ERROR_RESPONSE : ((HTTP request to {{functionsOrigin}}/blocking/beforeSignIn returned HTTP error 500: {\"error\":{\"mess…","r":"c","k":"answer"},{"t":"signin function 400","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 BLOCKING_FUNCTION_ERROR_RESPONSE : ((HTTP request to {{functionsOrigin}}/blocking/beforeSignIn returned HTTP error 400: {\"error\":{\"mess…","r":"c","k":"answer"},{"t":"signin disabled by function","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 USER_DISABLED","r":"c","k":"answer"},{"t":"signin after disable","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 USER_DISABLED","r":"c","k":"answer"},{"t":"signup create disables","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"400 USER_DISABLED","r":"c","k":"answer"},{"t":"lookup bob","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"signup create fails","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"400 BLOCKING_FUNCTION_ERROR_RESPONSE : ((HTTP request to {{functionsOrigin}}/blocking/beforeCreate returned HTTP error 400: {\"error\":{\"mess…","r":"c","k":"answer"},{"t":"lookup carol","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"signup bad claims","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"400 FORBIDDEN_CLAIM : iss","r":"c","k":"answer"},{"t":"anonymous not blocked","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"custom not blocked","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken","a":"200 identitytoolkit#VerifyCustomTokenResponse","r":"c","k":"answer"},{"t":"admin create not blocked","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"configure create only","q":"PATCH /identitytoolkit.googleapis.com/v2/projects/{project}/config","a":"200 {blockingFunctions, emailPrivacyConfig, signIn}","r":"c","k":"answer"},{"t":"signin no trigger","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"configure","q":"PATCH /identitytoolkit.googleapis.com/v2/projects/{project}/config","a":"200 {blockingFunctions, emailPrivacyConfig, signIn}","r":"c","k":"answer"},{"t":"idp new","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"lookup idp","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"idp existing","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"idp with access token","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"saml","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"configure","q":"PATCH /identitytoolkit.googleapis.com/v2/projects/{project}/config","a":"200 {blockingFunctions, emailPrivacyConfig, signIn}","r":"c","k":"answer"},{"t":"email link send","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"email link new","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithEmailLink","a":"200 identitytoolkit#EmailLinkSigninResponse","r":"c","k":"answer"},{"t":"email link send 2","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"email link existing","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithEmailLink","a":"200 identitytoolkit#EmailLinkSigninResponse","r":"c","k":"answer"},{"t":"phone send","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendVerificationCode","a":"200 {sessionInfo}","r":"c","k":"answer"},{"t":"phone new","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPhoneNumber","a":"200 {expiresIn, isNewUser, localId, phoneNumber}","r":"c","k":"answer"},{"t":"phone send 2","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendVerificationCode","a":"200 {sessionInfo}","r":"c","k":"answer"},{"t":"phone existing","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPhoneNumber","a":"200 {expiresIn, isNewUser, localId, phoneNumber}","r":"c","k":"answer"},{"t":"configure","q":"PATCH /identitytoolkit.googleapis.com/v2/projects/{project}/config","a":"200 {blockingFunctions, emailPrivacyConfig, signIn}","r":"c","k":"answer"},{"t":"mfa user","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchCreate","a":"200 {error: []}","r":"c","k":"answer"},{"t":"mfa pending","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"mfa start","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaSignIn:start","a":"200 {phoneResponseInfo}","r":"c","k":"answer"},{"t":"mfa finalize","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaSignIn:finalize","a":"200 {…}","r":"c","k":"answer"},{"t":"mfa enroll start","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaEnrollment:start","a":"200 {phoneSessionInfo}","r":"c","k":"answer"},{"t":"mfa enroll finalize","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaEnrollment:finalize","a":"200 {…}","r":"c","k":"answer"},{"t":"tenant","q":"POST /identitytoolkit.googleapis.com/v2/projects/{project}/tenants","a":"200 {disableAuth, enableAnonymousUser, enableEmailLinkSignin, mfaConfig, …}","r":"c","k":"answer"},{"t":"tenant signup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"signup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"anonymous","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"custom","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken","a":"200 identitytoolkit#VerifyCustomTokenResponse","r":"c","k":"answer"},{"t":"custom again","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken","a":"200 identitytoolkit#VerifyCustomTokenResponse","r":"c","k":"answer"},{"t":"idp","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"phone send","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendVerificationCode","a":"200 {sessionInfo}","r":"c","k":"answer"},{"t":"phone","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPhoneNumber","a":"200 {expiresIn, isNewUser, localId, phoneNumber}","r":"c","k":"answer"},{"t":"email link send","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"email link","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithEmailLink","a":"200 identitytoolkit#EmailLinkSigninResponse","r":"c","k":"answer"},{"t":"admin create","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"import","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchCreate","a":"200 {error: []}","r":"c","k":"answer"},{"t":"client delete","q":"POST /identitytoolkit.googleapis.com/v1/accounts:delete","a":"200 identitytoolkit#DeleteAccountResponse","r":"c","k":"answer"},{"t":"admin delete","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:delete","a":"200 identitytoolkit#DeleteAccountResponse","r":"c","k":"answer"},{"t":"batch delete","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchDelete","a":"200 {}","r":"c","k":"answer"},{"t":"tenant","q":"POST /identitytoolkit.googleapis.com/v2/projects/{project}/tenants","a":"200 {disableAuth, enableAnonymousUser, enableEmailLinkSignin, mfaConfig, …}","r":"c","k":"answer"},{"t":"tenant signup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"delete all","q":"DELETE /emulator/v1/projects/{project}/accounts","a":"200 {}","r":"c","k":"answer"},{"t":"all users","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"readiness","q":"GET /","a":"200 {authEmulator}","r":"c","k":"answer"},{"t":"openapi","q":"GET /emulator/openapi.json","a":"200 {$digest}","r":"c","k":"answer"},{"t":"unknown","q":"GET /nothing/here","a":"404 NOT_FOUND: Not Found","r":"c","k":"answer"},{"t":"unknown post","q":"POST /identitytoolkit.googleapis.com/v1/accounts:nope","a":"404 NOT_FOUND: Not Found","r":"c","k":"answer"},{"t":"get on post route","q":"GET /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"405 {message}","r":"c","k":"answer"},{"t":"preflight","q":"OPTIONS /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"204","r":"c","k":"answer"},{"t":"cors post","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"legacy signup","q":"POST /www.googleapis.com/identitytoolkit/v3/relyingparty/signupNewUser","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"legacy verify password","q":"POST /www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"legacy get account info","q":"POST /www.googleapis.com/identitytoolkit/v3/relyingparty/getAccountInfo","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"legacy set account info","q":"POST /www.googleapis.com/identitytoolkit/v3/relyingparty/setAccountInfo","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"legacy create auth uri","q":"POST /www.googleapis.com/identitytoolkit/v3/relyingparty/createAuthUri","a":"200 identitytoolkit#CreateAuthUriResponse","r":"c","k":"answer"},{"t":"legacy get oob","q":"POST /www.googleapis.com/identitytoolkit/v3/relyingparty/getOobConfirmationCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"legacy reset password","q":"POST /www.googleapis.com/identitytoolkit/v3/relyingparty/resetPassword","a":"200 identitytoolkit#ResetPasswordResponse","r":"c","k":"answer"},{"t":"legacy verify custom token","q":"POST /www.googleapis.com/identitytoolkit/v3/relyingparty/verifyCustomToken","a":"200 identitytoolkit#VerifyCustomTokenResponse","r":"c","k":"answer"},{"t":"legacy verify assertion","q":"POST /www.googleapis.com/identitytoolkit/v3/relyingparty/verifyAssertion","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"legacy send verification code","q":"POST /www.googleapis.com/identitytoolkit/v3/relyingparty/sendVerificationCode","a":"200 {sessionInfo}","r":"c","k":"answer"},{"t":"legacy verify phone","q":"POST /www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPhoneNumber","a":"200 {expiresIn, isNewUser, localId, phoneNumber}","r":"c","k":"answer"},{"t":"legacy recaptcha","q":"GET /www.googleapis.com/identitytoolkit/v3/relyingparty/getRecaptchaParam","a":"200 identitytoolkit#GetRecaptchaParamResponse","r":"c","k":"answer"},{"t":"legacy project config","q":"GET /www.googleapis.com/identitytoolkit/v3/relyingparty/getProjectConfig","a":"200 {authorizedDomains, projectId}","r":"c","k":"answer"},{"t":"legacy sign out","q":"POST /www.googleapis.com/identitytoolkit/v3/relyingparty/signOutUser","a":"501 NOT_IMPLEMENTED: signOutUser is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"legacy download","q":"POST /www.googleapis.com/identitytoolkit/v3/relyingparty/downloadAccount","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"legacy download no project","q":"POST /www.googleapis.com/identitytoolkit/v3/relyingparty/downloadAccount","a":"400 INSUFFICIENT_PERMISSION","r":"c","k":"answer"},{"t":"legacy upload","q":"POST /www.googleapis.com/identitytoolkit/v3/relyingparty/uploadAccount","a":"200 {error: []}","r":"c","k":"answer"},{"t":"legacy upload snake","q":"POST /www.googleapis.com/identitytoolkit/v3/relyingparty/uploadAccount","a":"200 {error: []}","r":"c","k":"answer"},{"t":"all users","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"legacy delete expired","q":"POST /www.googleapis.com/identitytoolkit/v3/relyingparty/deleteAccount","a":"400 TOKEN_EXPIRED","r":"c","k":"answer"},{"t":"legacy verify password 2","q":"POST /www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"legacy delete","q":"POST /www.googleapis.com/identitytoolkit/v3/relyingparty/deleteAccount","a":"200 identitytoolkit#DeleteAccountResponse","r":"c","k":"answer"},{"t":"legacy public keys","q":"GET /www.googleapis.com/identitytoolkit/v3/relyingparty/publicKeys","a":"404 NOT_FOUND: Not Found","r":"c","k":"answer"},{"t":"issue saml response","q":"POST /identitytoolkit.googleapis.com/v1/accounts:issueSamlResponse","a":"501 NOT_IMPLEMENTED: identitytoolkit.accounts.issueSamlResponse is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"game center","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithGameCenter","a":"501 NOT_IMPLEMENTED: identitytoolkit.accounts.signInWithGameCenter is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"verify ios client","q":"POST /identitytoolkit.googleapis.com/v1/accounts:verifyIosClient","a":"501 NOT_IMPLEMENTED: identitytoolkit.accounts.verifyIosClient is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"session cookie public keys no key","q":"GET /identitytoolkit.googleapis.com/v1/sessionCookiePublicKeys","a":"403 PERMISSION_DENIED: The request is missing a valid API key.","r":"c","k":"answer"},{"t":"session cookie public keys","q":"GET /identitytoolkit.googleapis.com/v1/sessionCookiePublicKeys","a":"501 NOT_IMPLEMENTED: identitytoolkit.getSessionCookiePublicKeys is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"revoke token","q":"POST /identitytoolkit.googleapis.com/v2/accounts:revokeToken","a":"501 NOT_IMPLEMENTED: identitytoolkit.accounts.revokeToken is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"default supported idps","q":"GET /identitytoolkit.googleapis.com/v2/defaultSupportedIdps","a":"501 NOT_IMPLEMENTED: identitytoolkit.defaultSupportedIdps.list is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"password policy","q":"GET /identitytoolkit.googleapis.com/v2/passwordPolicy","a":"501 NOT_IMPLEMENTED: identitytoolkit.getPasswordPolicy is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"recaptcha config","q":"GET /identitytoolkit.googleapis.com/v2/recaptchaConfig","a":"501 NOT_IMPLEMENTED: identitytoolkit.getRecaptchaConfig is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"default idp configs list","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/defaultSupportedIdpConfigs","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.defaultSupportedIdpConfigs.list is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"default idp configs create","q":"POST /identitytoolkit.googleapis.com/v2/projects/{project}/defaultSupportedIdpConfigs","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.defaultSupportedIdpConfigs.create is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"default idp config get","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/defaultSupportedIdpConfigs/google.com","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.defaultSupportedIdpConfigs.get is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"default idp config patch","q":"PATCH /identitytoolkit.googleapis.com/v2/projects/{project}/defaultSupportedIdpConfigs/google.com","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.defaultSupportedIdpConfigs.patch is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"default idp config delete","q":"DELETE /identitytoolkit.googleapis.com/v2/projects/{project}/defaultSupportedIdpConfigs/google.com","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.defaultSupportedIdpConfigs.delete is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"saml configs list","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/inboundSamlConfigs","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.inboundSamlConfigs.list is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"saml config create","q":"POST /identitytoolkit.googleapis.com/v2/projects/{project}/inboundSamlConfigs","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.inboundSamlConfigs.create is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"saml config get","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/inboundSamlConfigs/saml.x","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.inboundSamlConfigs.get is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"saml config patch","q":"PATCH /identitytoolkit.googleapis.com/v2/projects/{project}/inboundSamlConfigs/saml.x","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.inboundSamlConfigs.patch is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"saml config delete","q":"DELETE /identitytoolkit.googleapis.com/v2/projects/{project}/inboundSamlConfigs/saml.x","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.inboundSamlConfigs.delete is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"oauth configs list","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/oauthIdpConfigs","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.oauthIdpConfigs.list is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"oauth config create","q":"POST /identitytoolkit.googleapis.com/v2/projects/{project}/oauthIdpConfigs","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.oauthIdpConfigs.create is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"oauth config get","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/oauthIdpConfigs/oidc.x","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.oauthIdpConfigs.get is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"oauth config patch","q":"PATCH /identitytoolkit.googleapis.com/v2/projects/{project}/oauthIdpConfigs/oidc.x","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.oauthIdpConfigs.patch is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"oauth config delete","q":"DELETE /identitytoolkit.googleapis.com/v2/projects/{project}/oauthIdpConfigs/oidc.x","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.oauthIdpConfigs.delete is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"initialize auth","q":"POST /identitytoolkit.googleapis.com/v2/projects/{project}/identityPlatform:initializeAuth","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.identityPlatform.initializeAuth is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"tenant get iam","q":"POST /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/tenant-alpha:getIamPolicy","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.tenants.getIamPolicy is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"tenant set iam","q":"POST /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/tenant-alpha:setIamPolicy","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.tenants.setIamPolicy is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"tenant test iam","q":"POST /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/tenant-alpha:testIamPermissions","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.tenants.testIamPermissions is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"tenant default idp list","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/tenant-alpha/defaultSupportedIdpConfigs","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.tenants.defaultSupportedIdpConfigs.list is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"tenant default idp create","q":"POST /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/tenant-alpha/defaultSupportedIdpConfigs","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.tenants.defaultSupportedIdpConfigs.create is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"tenant default idp get","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/tenant-alpha/defaultSupportedIdpConfigs/google.com","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.tenants.defaultSupportedIdpConfigs.get is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"tenant default idp patch","q":"PATCH /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/tenant-alpha/defaultSupportedIdpConfigs/google.com","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.tenants.defaultSupportedIdpConfigs.patch is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"tenant default idp delete","q":"DELETE /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/tenant-alpha/defaultSupportedIdpConfigs/google.com","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.tenants.defaultSupportedIdpConfigs.delete is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"tenant saml list","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/tenant-alpha/inboundSamlConfigs","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.tenants.inboundSamlConfigs.list is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"tenant saml create","q":"POST /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/tenant-alpha/inboundSamlConfigs","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.tenants.inboundSamlConfigs.create is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"tenant saml get","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/tenant-alpha/inboundSamlConfigs/saml.x","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.tenants.inboundSamlConfigs.get is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"tenant saml patch","q":"PATCH /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/tenant-alpha/inboundSamlConfigs/saml.x","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.tenants.inboundSamlConfigs.patch is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"tenant saml delete","q":"DELETE /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/tenant-alpha/inboundSamlConfigs/saml.x","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.tenants.inboundSamlConfigs.delete is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"tenant oauth list","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/tenant-alpha/oauthIdpConfigs","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.tenants.oauthIdpConfigs.list is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"tenant oauth create","q":"POST /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/tenant-alpha/oauthIdpConfigs","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.tenants.oauthIdpConfigs.create is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"tenant oauth get","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/tenant-alpha/oauthIdpConfigs/oidc.x","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.tenants.oauthIdpConfigs.get is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"tenant oauth patch","q":"PATCH /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/tenant-alpha/oauthIdpConfigs/oidc.x","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.tenants.oauthIdpConfigs.patch is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"tenant oauth delete","q":"DELETE /identitytoolkit.googleapis.com/v2/projects/{project}/tenants/tenant-alpha/oauthIdpConfigs/oidc.x","a":"501 NOT_IMPLEMENTED: identitytoolkit.projects.tenants.oauthIdpConfigs.delete is not implemented in the Auth Emulator.","r":"c","k":"answer"},{"t":"handler missing params","q":"GET /emulator/auth/handler","a":"400 missing apiKey or providerId query parameters","r":"c","k":"answer"},{"t":"google","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"github","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"signup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"send oob","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"send code","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendVerificationCode","a":"200 {sessionInfo}","r":"c","k":"answer"},{"t":"delete all","q":"DELETE /emulator/v1/projects/{project}/accounts","a":"200 {}","r":"c","k":"answer"},{"t":"all users","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"oob codes","q":"GET /emulator/v1/projects/{project}/oobCodes","a":"200 {oobCodes}","r":"c","k":"answer"},{"t":"verification codes","q":"GET /emulator/v1/projects/{project}/verificationCodes","a":"200 {verificationCodes}","r":"c","k":"answer"},{"t":"consume after delete","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"400 INVALID_OOB_CODE","r":"c","k":"answer"},{"t":"phone after delete","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPhoneNumber","a":"200 {expiresIn, isNewUser, localId, phoneNumber}","r":"c","k":"answer"},{"t":"old token after delete","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"400 USER_NOT_FOUND","r":"c","k":"answer"},{"t":"old refresh after delete","q":"POST /securetoken.googleapis.com/v1/token","a":"400 INVALID_REFRESH_TOKEN","r":"c","k":"answer"},{"t":"delete all no auth","q":"DELETE /emulator/v1/projects/{project}/accounts","a":"200 {}","r":"c","k":"answer"},{"t":"delete all with body","q":"DELETE /emulator/v1/projects/{project}/accounts","a":"200 {}","r":"c","k":"answer"},{"t":"import","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchCreate","a":"200 {error: []}","r":"c","k":"answer"},{"t":"anonymous","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"custom","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken","a":"200 identitytoolkit#VerifyCustomTokenResponse","r":"c","k":"answer"},{"t":"export accounts","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"export config","q":"GET /emulator/v1/projects/{project}/config","a":"200 {emailPrivacyConfig, signIn}","r":"c","k":"answer"},{"t":"delete all","q":"DELETE /emulator/v1/projects/{project}/accounts","a":"200 {}","r":"c","k":"answer"},{"t":"cli import route","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/tenants//accounts:batchCreate","a":"200 {error: []}","r":"c","k":"answer"},{"t":"cli import empty","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/tenants//accounts:batchCreate","a":"400 MISSING_USER_ACCOUNT","r":"c","k":"answer"},{"t":"cli import config","q":"PATCH /emulator/v1/projects/{project}/config","a":"200 {emailPrivacyConfig, signIn}","r":"c","k":"answer"},{"t":"export after","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"signin reimported","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"tenant","q":"POST /identitytoolkit.googleapis.com/v2/projects/{project}/tenants","a":"200 {disableAuth, enableAnonymousUser, enableEmailLinkSignin, mfaConfig, …}","r":"c","k":"answer"},{"t":"tenant import","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/tenants/{{tenantId:tenant}}/accounts:batchCreate","a":"200 {error: []}","r":"c","k":"answer"},{"t":"tenant export","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/tenants/{{tenantId:tenant}}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"tenants export","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/tenants","a":"200 {tenants}","r":"c","k":"answer"},{"t":"password","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"anonymous","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"custom","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken","a":"200 identitytoolkit#VerifyCustomTokenResponse","r":"c","k":"answer"},{"t":"google","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"phone send","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendVerificationCode","a":"200 {sessionInfo}","r":"c","k":"answer"},{"t":"phone","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPhoneNumber","a":"200 {expiresIn, isNewUser, localId, phoneNumber}","r":"c","k":"answer"},{"t":"email link send","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"email link","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithEmailLink","a":"200 identitytoolkit#EmailLinkSigninResponse","r":"c","k":"answer"},{"t":"set claims","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"password signin","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"link google","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"phone send 2","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendVerificationCode","a":"200 {sessionInfo}","r":"c","k":"answer"},{"t":"link phone","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPhoneNumber","a":"200 {expiresIn, isNewUser, localId, phoneNumber}","r":"c","k":"answer"},{"t":"refresh multi","q":"POST /securetoken.googleapis.com/v1/token","a":"200 {expires_in, project_id, user_id}","r":"c","k":"answer"},{"t":"password signin multi","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"google signin multi","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"lookup multi","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"claims overwrite","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"refresh after overwrite","q":"POST /securetoken.googleapis.com/v1/token","a":"200 {expires_in, project_id, user_id}","r":"c","k":"answer"},{"t":"claims clear","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"refresh after clear","q":"POST /securetoken.googleapis.com/v1/token","a":"200 {expires_in, project_id, user_id}","r":"c","k":"answer"},{"t":"custom claims vs attributes","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken","a":"200 identitytoolkit#VerifyCustomTokenResponse","r":"c","k":"answer"},{"t":"refresh custom","q":"POST /securetoken.googleapis.com/v1/token","a":"200 {expires_in, project_id, user_id}","r":"c","k":"answer"},{"t":"signup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"google","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"phone send","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendVerificationCode","a":"200 {sessionInfo}","r":"c","k":"answer"},{"t":"phone","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPhoneNumber","a":"200 {expiresIn, isNewUser, localId, phoneNumber}","r":"c","k":"answer"},{"t":"disable password user","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"disable google user","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"disable phone user","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"400 USER_DISABLED","r":"c","k":"answer"},{"t":"update","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"400 USER_DISABLED","r":"c","k":"answer"},{"t":"delete","q":"POST /identitytoolkit.googleapis.com/v1/accounts:delete","a":"400 USER_DISABLED","r":"c","k":"answer"},{"t":"send oob","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"400 USER_DISABLED","r":"c","k":"answer"},{"t":"password signin","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 USER_DISABLED","r":"c","k":"answer"},{"t":"refresh","q":"POST /securetoken.googleapis.com/v1/token","a":"400 USER_DISABLED","r":"c","k":"answer"},{"t":"google signin","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"400 USER_DISABLED","r":"c","k":"answer"},{"t":"google signin return credential","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"400 USER_DISABLED","r":"c","k":"answer"},{"t":"custom","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken","a":"400 USER_DISABLED","r":"c","k":"answer"},{"t":"phone send 2","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendVerificationCode","a":"200 {sessionInfo}","r":"c","k":"answer"},{"t":"phone signin","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPhoneNumber","a":"400 USER_DISABLED","r":"c","k":"answer"},{"t":"email link send","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"email link","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithEmailLink","a":"400 USER_DISABLED","r":"c","k":"answer"},{"t":"mfa start","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaEnrollment:start","a":"400 USER_DISABLED","r":"c","k":"answer"},{"t":"create auth uri","q":"POST /identitytoolkit.googleapis.com/v1/accounts:createAuthUri","a":"200 identitytoolkit#CreateAuthUriResponse","r":"c","k":"answer"},{"t":"admin lookup","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"session cookie","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}:createSessionCookie","a":"400 USER_DISABLED","r":"c","k":"answer"},{"t":"admin update","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"enable","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup enabled","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"disable again","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"send reset","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"reset","q":"POST /identitytoolkit.googleapis.com/v1/accounts:resetPassword","a":"200 identitytoolkit#ResetPasswordResponse","r":"c","k":"answer"},{"t":"password signin after reset","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 USER_DISABLED","r":"c","k":"answer"},{"t":"lookup after reset","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"400 TOKEN_EXPIRED","r":"c","k":"answer"},{"t":"signup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"send oob","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"send reset","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"cookie","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}:createSessionCookie","a":"200 {…}","r":"c","k":"answer"},{"t":"delete","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:delete","a":"200 identitytoolkit#DeleteAccountResponse","r":"c","k":"answer"},{"t":"lookup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"400 USER_NOT_FOUND","r":"c","k":"answer"},{"t":"update","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"400 USER_NOT_FOUND","r":"c","k":"answer"},{"t":"delete again","q":"POST /identitytoolkit.googleapis.com/v1/accounts:delete","a":"400 USER_NOT_FOUND","r":"c","k":"answer"},{"t":"refresh","q":"POST /securetoken.googleapis.com/v1/token","a":"400 INVALID_REFRESH_TOKEN","r":"c","k":"answer"},{"t":"consume oob","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"400 INVALID_OOB_CODE","r":"c","k":"answer"},{"t":"reset","q":"POST /identitytoolkit.googleapis.com/v1/accounts:resetPassword","a":"400 INVALID_OOB_CODE","r":"c","k":"answer"},{"t":"link google","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"400 USER_NOT_FOUND","r":"c","k":"answer"},{"t":"mfa start","q":"POST /identitytoolkit.googleapis.com/v2/accounts/mfaEnrollment:start","a":"400 USER_NOT_FOUND","r":"c","k":"answer"},{"t":"session cookie","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}:createSessionCookie","a":"400 USER_NOT_FOUND","r":"c","k":"answer"},{"t":"signin","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 EMAIL_NOT_FOUND","r":"c","k":"answer"},{"t":"signup again","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"old token vs new user","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"400 USER_NOT_FOUND","r":"c","k":"answer"},{"t":"oob codes","q":"GET /emulator/v1/projects/{project}/oobCodes","a":"200 {oobCodes}","r":"c","k":"answer"},{"t":"query key","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"header key","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"any key value","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"empty key","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"403 PERMISSION_DENIED: The request is missing a valid API key.","r":"c","k":"answer"},{"t":"no key","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"403 PERMISSION_DENIED: The request is missing a valid API key.","r":"c","k":"answer"},{"t":"owner no key","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"owner and key","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"bad bearer with key","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"401 UNAUTHENTICATED: Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authenticat…","r":"c","k":"answer"},{"t":"basic auth with key","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"securetoken no key","q":"POST /securetoken.googleapis.com/v1/token","a":"403 PERMISSION_DENIED: The request is missing a valid API key.","r":"c","k":"answer"},{"t":"recaptcha no key","q":"GET /identitytoolkit.googleapis.com/v1/recaptchaParams","a":"403 PERMISSION_DENIED: The request is missing a valid API key.","r":"c","k":"answer"},{"t":"emulator routes no key","q":"GET /emulator/v1/projects/{project}/oobCodes","a":"200 {oobCodes}","r":"c","k":"answer"},{"t":"action no key","q":"GET /emulator/action","a":"400 missing apiKey query parameter","r":"c","k":"answer"},{"t":"owner on securetoken","q":"POST /securetoken.googleapis.com/v1/token","a":"403 PERMISSION_DENIED: The request is missing a valid API key.","r":"c","k":"answer"},{"t":"number to string","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"bool as string","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"unknown field","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"array for string","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 INVALID_ARGUMENT: Invalid JSON payload received. /email must be string","r":"c","k":"answer"},{"t":"object for string","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 INVALID_ARGUMENT: Invalid JSON payload received. /email must be string","r":"c","k":"answer"},{"t":"null field","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 INVALID_ARGUMENT: Invalid JSON payload received. /tenantId must be string","r":"c","k":"answer"},{"t":"enum index","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"400 MISSING_EMAIL","r":"c","k":"answer"},{"t":"enum unknown","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"400 INVALID_ARGUMENT: Invalid JSON payload received. /requestType must be equal to one of the allowed values","r":"c","k":"answer"},{"t":"enum number out of range","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"400 INVALID_ARGUMENT: Invalid JSON payload received. /requestType must be equal to one of the allowed values","r":"c","k":"answer"},{"t":"string for array","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"400 INVALID_ARGUMENT: Invalid JSON payload received. /localId must be array","r":"c","k":"answer"},{"t":"delete attribute enum index","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"delete attribute unknown","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"400 INVALID_ARGUMENT: Invalid JSON payload received. /deleteAttribute/0 must be equal to one of the allowed values","r":"c","k":"answer"},{"t":"batch get string max","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"400 INVALID_ARGUMENT: Invalid JSON payload received. must be integer","r":"c","k":"answer"},{"t":"query sort enum index","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:query","a":"200 {recordsCount, userInfo}","r":"c","k":"answer"},{"t":"body array","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"400 INVALID_ARGUMENT: Invalid JSON payload received. must be object","r":"c","k":"answer"},{"t":"empty body","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"text plain json","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"400 Invalid content-type: text/plain","r":"c","k":"answer"},{"t":"no content type","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"form body","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 Invalid content-type: application/x-www-form-urlencoded","r":"c","k":"answer"},{"t":"snake nested","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"snake admin","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"signup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"lookup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"signin","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"send reset","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"admin lookup","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"import","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchCreate","a":"200 {error: []}","r":"c","k":"answer"},{"t":"lookup imported","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"import collision","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchCreate","a":"200 {error: []}","r":"c","k":"answer"},{"t":"update email","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup changed","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"email link send","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendOobCode","a":"200 identitytoolkit#GetOobConfirmationCodeResponse","r":"c","k":"answer"},{"t":"email link signin","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithEmailLink","a":"200 identitytoolkit#EmailLinkSigninResponse","r":"c","k":"answer"},{"t":"idp","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"lookup idp","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"create auth uri","q":"POST /identitytoolkit.googleapis.com/v1/accounts:createAuthUri","a":"200 identitytoolkit#CreateAuthUriResponse","r":"c","k":"answer"},{"t":"admin create","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"lookup admin","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"admin update","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup admin changed","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"google first","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"link password","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup google password","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"link github","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"phone send","q":"POST /identitytoolkit.googleapis.com/v1/accounts:sendVerificationCode","a":"200 {sessionInfo}","r":"c","k":"answer"},{"t":"link phone","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPhoneNumber","a":"200 {expiresIn, isNewUser, localId, phoneNumber}","r":"c","k":"answer"},{"t":"lookup four","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"update profile","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup renamed","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup by github","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup by provider email","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"create auth uri provider email","q":"POST /identitytoolkit.googleapis.com/v1/accounts:createAuthUri","a":"200 identitytoolkit#CreateAuthUriResponse","r":"c","k":"answer"},{"t":"unlink github","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup by github after","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"relink github","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"lookup relinked","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"google profile refresh","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"lookup after refresh","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"admin link","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"admin relink existing","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"lookup final","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"export","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"malformed json","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"400 INVALID_ARGUMENT: Invalid JSON payload received. Expected property name or '}' in JSON at position 1 (line 1 column 2)","r":"d","k":"answer","w":"the JSON parse error text is V8's; Firenook reports serde's message with the same status and shape"},{"t":"signin function text","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"500 INTERNAL: BLOCKING_FUNCTION_ERROR_RESPONSE : ((Response body is not valid JSON.))","r":"d","k":"answer","w":"a blocking function's non-JSON body is reported with V8's parse error as the reason; Firenook reports serde's"},{"t":"handler empty","q":"GET /emulator/auth/handler","a":"200 {$html}","r":"d","k":"answer","w":"Firenook ships its own popup helper page; the accounts it offers are compared"},{"t":"handler google","q":"GET /emulator/auth/handler","a":"200 {$html}","r":"d","k":"answer","w":"Firenook ships its own popup helper page; the accounts it offers are compared"},{"t":"handler github","q":"GET /emulator/auth/handler","a":"200 {$html}","r":"d","k":"answer","w":"Firenook ships its own popup helper page; the accounts it offers are compared"},{"t":"handler tenant","q":"GET /emulator/auth/handler","a":"200 {$html}","r":"d","k":"answer","w":"Firenook ships its own popup helper page; the accounts it offers are compared"},{"t":"iframe","q":"GET /emulator/auth/iframe","a":"200 {$html}","r":"d","k":"answer","w":"Firenook ships its own popup helper page; the accounts it offers are compared"},{"t":"iframe no params","q":"GET /emulator/auth/iframe","a":"200 {$html}","r":"d","k":"answer","w":"Firenook ships its own popup helper page; the accounts it offers are compared"},{"t":"body string","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"400 INVALID_ARGUMENT: Invalid JSON payload received. Unexpected token '\"', \"\"just a string\"\" is not valid JSON","r":"d","k":"answer","w":"the JSON parse error text is V8's; Firenook reports serde's message with the same status and shape"},{"t":"create auth uri existing password user","q":"POST /identitytoolkit.googleapis.com/v1/accounts:createAuthUri","a":"200 identitytoolkit#CreateAuthUriResponse","r":"c","k":"answer"},{"t":"recaptcha parameters","q":"GET /identitytoolkit.googleapis.com/v1/recaptchaParams","a":"200 identitytoolkit#GetRecaptchaParamResponse","r":"c","k":"answer"},{"t":"fake google idp sign in","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp","a":"200 identitytoolkit#VerifyAssertionResponse","r":"c","k":"answer"},{"t":"idp secure token refresh","q":"POST /securetoken.googleapis.com/v1/token","a":"200 {expires_in, user_id, project_id}","r":"c","k":"answer"},{"t":"readiness","q":"GET /","a":"200 {authEmulator}","r":"c","k":"answer"},{"t":"password sign up","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signUp","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"client account lookup","q":"POST /identitytoolkit.googleapis.com/v1/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"client profile update","q":"POST /identitytoolkit.googleapis.com/v1/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"admin custom claims update","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:update","a":"200 identitytoolkit#SetAccountInfoResponse","r":"c","k":"answer"},{"t":"admin lookup by email","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"admin query users","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:query","a":"200 {recordsCount, userInfo}","r":"c","k":"answer"},{"t":"password sign in","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"200 identitytoolkit#VerifyPasswordResponse","r":"c","k":"answer"},{"t":"strict json custom token sign in","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken","a":"200 identitytoolkit#VerifyCustomTokenResponse","r":"c","k":"answer"},{"t":"secure token refresh","q":"POST /securetoken.googleapis.com/v1/token","a":"200 {expires_in, user_id, project_id}","r":"c","k":"answer"},{"t":"wrong password error","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithPassword","a":"400 INVALID_PASSWORD","r":"c","k":"answer"},{"t":"emulator config before","q":"GET /emulator/v1/projects/{project}/config","a":"200 {signIn, emailPrivacyConfig}","r":"c","k":"answer"},{"t":"emulator config update","q":"PATCH /emulator/v1/projects/{project}/config","a":"200 {signIn, emailPrivacyConfig}","r":"c","k":"answer"},{"t":"accounts json batch import","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchCreate","a":"200 {error: []}","r":"c","k":"answer"},{"t":"accounts json batch export","q":"GET /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:batchGet?maxResults=1000","a":"200 identitytoolkit#DownloadAccountResponse","r":"c","k":"answer"},{"t":"admin create user","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts","a":"200 identitytoolkit#SignupNewUserResponse","r":"c","k":"answer"},{"t":"admin delete user","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:delete","a":"200 identitytoolkit#DeleteAccountResponse","r":"c","k":"answer"},{"t":"emulator delete all accounts","q":"DELETE /emulator/v1/projects/{project}/accounts","a":"200 {}","r":"c","k":"answer"},{"t":"handler validation 1","q":"GET /emulator/auth/handler","a":"400 missing apiKey or providerId query parameters","r":"c","k":"answer"},{"t":"handler validation 2","q":"GET /emulator/auth/handler?apiKey=demo","a":"400 missing apiKey or providerId query parameters","r":"c","k":"answer"},{"t":"handler validation 3","q":"GET /emulator/auth/handler?providerId=google.com","a":"400 missing apiKey or providerId query parameters","r":"c","k":"answer"},{"t":"signInWithIdp 1","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp (google.com, from /emulator/auth/handler)","a":"200 · existing uid reused","r":"c","k":"answer"},{"t":"signInWithIdp 2","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp (google.com, from /emulator/auth/handler)","a":"200 · new user","r":"c","k":"answer"},{"t":"signInWithIdp 3","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp (google.com, from /emulator/auth/handler)","a":"200 · existing uid reused","r":"c","k":"answer"},{"t":"popup event 1","q":"/emulator/auth/handler page completes the google.com popup","a":"signInViaPopup event with id_token, providerId","r":"c","k":"behaviour"},{"t":"popup event 2","q":"/emulator/auth/handler page completes the google.com popup","a":"signInViaPopup event with id_token, providerId","r":"c","k":"behaviour"},{"t":"sign in to a linked account","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp (account linked to github.com and google.com)","a":"200 · existing uid reused","r":"c","k":"answer"},{"t":"sign in after disabling","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp (account disabled)","a":"400 USER_DISABLED","r":"c","k":"answer"},{"t":"handler validation 1","q":"GET /emulator/auth/handler","a":"400 missing apiKey or providerId query parameters","r":"c","k":"answer"},{"t":"handler validation 2","q":"GET /emulator/auth/handler?apiKey=demo","a":"400 missing apiKey or providerId query parameters","r":"c","k":"answer"},{"t":"handler validation 3","q":"GET /emulator/auth/handler?providerId=google.com","a":"400 missing apiKey or providerId query parameters","r":"c","k":"answer"},{"t":"signInWithIdp 1","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp (google.com, from /emulator/auth/handler)","a":"200 · existing uid reused","r":"c","k":"answer"},{"t":"signInWithIdp 2","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp (google.com, from /emulator/auth/handler)","a":"200 · new user","r":"c","k":"answer"},{"t":"signInWithIdp 3","q":"POST /identitytoolkit.googleapis.com/v1/accounts:signInWithIdp (google.com, from /emulator/auth/handler)","a":"200 · existing uid reused","r":"c","k":"answer"},{"t":"popup event 1","q":"/emulator/auth/handler page completes the google.com popup","a":"signInViaPopup event with id_token, providerId","r":"c","k":"behaviour"},{"t":"popup event 2","q":"/emulator/auth/handler page completes the google.com popup","a":"signInViaPopup event with id_token, providerId","r":"c","k":"behaviour"},{"t":"anonymous first","q":"POST /securetoken.googleapis.com/v1/token (refresh grant, anonymous first)","a":"200 · same refresh grant returned, expires in 3600","r":"c","k":"answer"},{"t":"anonymous repeat original","q":"POST /securetoken.googleapis.com/v1/token (refresh grant, anonymous repeat original)","a":"200 · same refresh grant returned, expires in 3600","r":"c","k":"answer"},{"t":"anonymous concurrent 1","q":"POST /securetoken.googleapis.com/v1/token (refresh grant, anonymous concurrent 1)","a":"200 · same refresh grant returned, expires in 3600","r":"c","k":"answer"},{"t":"anonymous concurrent 2","q":"POST /securetoken.googleapis.com/v1/token (refresh grant, anonymous concurrent 2)","a":"200 · same refresh grant returned, expires in 3600","r":"c","k":"answer"},{"t":"anonymous concurrent 3","q":"POST /securetoken.googleapis.com/v1/token (refresh grant, anonymous concurrent 3)","a":"200 · same refresh grant returned, expires in 3600","r":"c","k":"answer"},{"t":"anonymous concurrent 4","q":"POST /securetoken.googleapis.com/v1/token (refresh grant, anonymous concurrent 4)","a":"200 · same refresh grant returned, expires in 3600","r":"c","k":"answer"},{"t":"anonymous disabled","q":"POST /securetoken.googleapis.com/v1/token (refresh grant, anonymous disabled)","a":"400 USER_DISABLED","r":"c","k":"error"},{"t":"anonymous reenabled original","q":"POST /securetoken.googleapis.com/v1/token (refresh grant, anonymous reenabled original)","a":"200 · same refresh grant returned, expires in 3600","r":"c","k":"answer"},{"t":"anonymous deleted","q":"POST /securetoken.googleapis.com/v1/token (refresh grant, anonymous deleted)","a":"400 INVALID_REFRESH_TOKEN","r":"c","k":"error"},{"t":"password first","q":"POST /securetoken.googleapis.com/v1/token (refresh grant, password first)","a":"200 · same refresh grant returned, expires in 3600","r":"c","k":"answer"},{"t":"password repeat original","q":"POST /securetoken.googleapis.com/v1/token (refresh grant, password repeat original)","a":"200 · same refresh grant returned, expires in 3600","r":"c","k":"answer"},{"t":"password concurrent 1","q":"POST /securetoken.googleapis.com/v1/token (refresh grant, password concurrent 1)","a":"200 · same refresh grant returned, expires in 3600","r":"c","k":"answer"},{"t":"password concurrent 2","q":"POST /securetoken.googleapis.com/v1/token (refresh grant, password concurrent 2)","a":"200 · same refresh grant returned, expires in 3600","r":"c","k":"answer"},{"t":"password concurrent 3","q":"POST /securetoken.googleapis.com/v1/token (refresh grant, password concurrent 3)","a":"200 · same refresh grant returned, expires in 3600","r":"c","k":"answer"},{"t":"password concurrent 4","q":"POST /securetoken.googleapis.com/v1/token (refresh grant, password concurrent 4)","a":"200 · same refresh grant returned, expires in 3600","r":"c","k":"answer"},{"t":"password disabled","q":"POST /securetoken.googleapis.com/v1/token (refresh grant, password disabled)","a":"400 USER_DISABLED","r":"c","k":"error"},{"t":"password reenabled original","q":"POST /securetoken.googleapis.com/v1/token (refresh grant, password reenabled original)","a":"200 · same refresh grant returned, expires in 3600","r":"c","k":"answer"},{"t":"password deleted","q":"POST /securetoken.googleapis.com/v1/token (refresh grant, password deleted)","a":"400 INVALID_REFRESH_TOKEN","r":"c","k":"error"},{"t":"custom first","q":"POST /securetoken.googleapis.com/v1/token (refresh grant, custom first)","a":"200 · same refresh grant returned, expires in 3600","r":"c","k":"answer"},{"t":"custom repeat original","q":"POST /securetoken.googleapis.com/v1/token (refresh grant, custom repeat original)","a":"200 · same refresh grant returned, expires in 3600","r":"c","k":"answer"},{"t":"custom concurrent 1","q":"POST /securetoken.googleapis.com/v1/token (refresh grant, custom concurrent 1)","a":"200 · same refresh grant returned, expires in 3600","r":"c","k":"answer"},{"t":"custom concurrent 2","q":"POST /securetoken.googleapis.com/v1/token (refresh grant, custom concurrent 2)","a":"200 · same refresh grant returned, expires in 3600","r":"c","k":"answer"},{"t":"custom concurrent 3","q":"POST /securetoken.googleapis.com/v1/token (refresh grant, custom concurrent 3)","a":"200 · same refresh grant returned, expires in 3600","r":"c","k":"answer"},{"t":"custom concurrent 4","q":"POST /securetoken.googleapis.com/v1/token (refresh grant, custom concurrent 4)","a":"200 · same refresh grant returned, expires in 3600","r":"c","k":"answer"},{"t":"custom disabled","q":"POST /securetoken.googleapis.com/v1/token (refresh grant, custom disabled)","a":"400 USER_DISABLED","r":"c","k":"error"},{"t":"custom reenabled original","q":"POST /securetoken.googleapis.com/v1/token (refresh grant, custom reenabled original)","a":"200 · same refresh grant returned, expires in 3600","r":"c","k":"answer"},{"t":"custom deleted","q":"POST /securetoken.googleapis.com/v1/token (refresh grant, custom deleted)","a":"400 INVALID_REFRESH_TOKEN","r":"c","k":"error"},{"t":"unknown token","q":"POST /securetoken.googleapis.com/v1/token (refresh grant, unknown token)","a":"400 INVALID_REFRESH_TOKEN","r":"c","k":"error"},{"t":"browser refresh 1","q":"POST /securetoken.googleapis.com/v1/token from the browser SDK (browser refresh 1)","a":"200 · same refresh grant returned, expires in 3600","r":"c","k":"answer"},{"t":"browser refresh 2","q":"POST /securetoken.googleapis.com/v1/token from the browser SDK (browser refresh 2)","a":"200 · same refresh grant returned, expires in 3600","r":"c","k":"answer"},{"t":"browser refresh 3","q":"POST /securetoken.googleapis.com/v1/token from the browser SDK (browser refresh 3)","a":"200 · same refresh grant returned, expires in 3600","r":"c","k":"answer"},{"t":"browser refresh 4","q":"POST /securetoken.googleapis.com/v1/token from the browser SDK (browser refresh 4)","a":"200 · same refresh grant returned, expires in 3600","r":"c","k":"answer"},{"t":"oauth popup handler","q":"GET /emulator/auth/handler?providerId=google.com","a":"200 {byteLength, sha256, contains}","r":"u"},{"t":"oauth helper iframe","q":"GET /emulator/auth/iframe?appName=phase4","a":"200 {byteLength, sha256, contains}","r":"u"}]} \ No newline at end of file diff --git a/public/conformance/firestore-rules.json b/public/conformance/firestore-rules.json new file mode 100644 index 0000000..2cc77d2 --- /dev/null +++ b/public/conformance/firestore-rules.json @@ -0,0 +1 @@ +{"runs":[[0,4,0,"Rules expressions: literals and coercion"],[4,7,0,"Rules expressions: numeric arithmetic and comparison"],[11,5,0,"Rules expressions: boolean short circuit and errors"],[16,12,0,"Rules expressions: string list map and map diff"],[28,4,0,"Rules expressions: request auth method time query resource and existing resource"],[32,4,0,"Rules expressions: literals and coercion"],[36,7,0,"Rules expressions: numeric arithmetic and comparison"],[43,5,0,"Rules expressions: boolean short circuit and errors"],[48,12,0,"Rules expressions: string list map and map diff"],[60,4,0,"Rules expressions: request auth method time query resource and existing resource"],[64,4,0,"Rules expressions: literals and coercion"],[68,7,0,"Rules expressions: numeric arithmetic and comparison"],[75,5,0,"Rules expressions: boolean short circuit and errors"],[80,12,0,"Rules expressions: string list map and map diff"],[92,4,0,"Rules expressions: request auth method time query resource and existing resource"],[96,4,0,"Rules expressions: literals and coercion"],[100,7,0,"Rules expressions: numeric arithmetic and comparison"],[107,5,0,"Rules expressions: boolean short circuit and errors"],[112,12,0,"Rules expressions: string list map and map diff"],[124,4,0,"Rules expressions: request auth method time query resource and existing resource"],[128,4,0,"Rules expressions: literals and coercion"],[132,7,0,"Rules expressions: numeric arithmetic and comparison"],[139,5,0,"Rules expressions: boolean short circuit and errors"],[144,12,0,"Rules expressions: string list map and map diff"],[156,4,0,"Rules expressions: request auth method time query resource and existing resource"],[160,4,0,"Rules expressions: literals and coercion"],[164,7,0,"Rules expressions: numeric arithmetic and comparison"],[171,5,0,"Rules expressions: boolean short circuit and errors"],[176,12,0,"Rules expressions: string list map and map diff"],[188,4,0,"Rules expressions: request auth method time query resource and existing resource"],[192,4,0,"Rules expressions: literals and coercion"],[196,7,0,"Rules expressions: numeric arithmetic and comparison"],[203,5,0,"Rules expressions: boolean short circuit and errors"],[208,12,0,"Rules expressions: string list map and map diff"],[220,4,0,"Rules expressions: request auth method time query resource and existing resource"],[224,4,0,"Rules expressions: literals and coercion"],[228,7,0,"Rules expressions: numeric arithmetic and comparison"],[235,5,0,"Rules expressions: boolean short circuit and errors"],[240,12,0,"Rules expressions: string list map and map diff"],[252,4,0,"Rules expressions: request auth method time query resource and existing resource"],[256,4,0,"Rules expressions: literals and coercion"],[260,7,0,"Rules expressions: numeric arithmetic and comparison"],[267,5,0,"Rules expressions: boolean short circuit and errors"],[272,12,0,"Rules expressions: string list map and map diff"],[284,4,0,"Rules expressions: request auth method time query resource and existing resource"],[288,4,0,"Rules expressions: literals and coercion"],[292,7,0,"Rules expressions: numeric arithmetic and comparison"],[299,5,0,"Rules expressions: boolean short circuit and errors"],[304,12,0,"Rules expressions: string list map and map diff"],[316,4,0,"Rules expressions: request auth method time query resource and existing resource"],[320,4,0,"Rules expressions: literals and coercion"],[324,7,0,"Rules expressions: numeric arithmetic and comparison"],[331,5,0,"Rules expressions: boolean short circuit and errors"],[336,12,0,"Rules expressions: string list map and map diff"],[348,4,0,"Rules expressions: request auth method time query resource and existing resource"],[352,4,0,"Rules expressions: literals and coercion"],[356,7,0,"Rules expressions: numeric arithmetic and comparison"],[363,5,0,"Rules expressions: boolean short circuit and errors"],[368,12,0,"Rules expressions: string list map and map diff"],[380,4,0,"Rules expressions: request auth method time query resource and existing resource"],[384,4,0,"Rules expressions: literals and coercion"],[388,7,0,"Rules expressions: numeric arithmetic and comparison"],[395,5,0,"Rules expressions: boolean short circuit and errors"],[400,12,0,"Rules expressions: string list map and map diff"],[412,4,0,"Rules expressions: request auth method time query resource and existing resource"],[416,4,0,"Rules expressions: literals and coercion"],[420,7,0,"Rules expressions: numeric arithmetic and comparison"],[427,5,0,"Rules expressions: boolean short circuit and errors"],[432,12,0,"Rules expressions: string list map and map diff"],[444,4,0,"Rules expressions: request auth method time query resource and existing resource"],[448,4,0,"Rules expressions: literals and coercion"],[452,7,0,"Rules expressions: numeric arithmetic and comparison"],[459,5,0,"Rules expressions: boolean short circuit and errors"],[464,12,0,"Rules expressions: string list map and map diff"],[476,4,0,"Rules expressions: request auth method time query resource and existing resource"],[480,4,0,"Rules expressions: literals and coercion"],[484,7,0,"Rules expressions: numeric arithmetic and comparison"],[491,5,0,"Rules expressions: boolean short circuit and errors"],[496,12,0,"Rules expressions: string list map and map diff"],[508,4,0,"Rules expressions: request auth method time query resource and existing resource"],[512,4,0,"Rules expressions: literals and coercion"],[516,7,0,"Rules expressions: numeric arithmetic and comparison"],[523,5,0,"Rules expressions: boolean short circuit and errors"],[528,12,0,"Rules expressions: string list map and map diff"],[540,4,0,"Rules expressions: request auth method time query resource and existing resource"],[544,4,0,"Rules expressions: literals and coercion"],[548,7,0,"Rules expressions: numeric arithmetic and comparison"],[555,5,0,"Rules expressions: boolean short circuit and errors"],[560,12,0,"Rules expressions: string list map and map diff"],[572,4,0,"Rules expressions: request auth method time query resource and existing resource"],[576,4,0,"Rules expressions: literals and coercion"],[580,7,0,"Rules expressions: numeric arithmetic and comparison"],[587,5,0,"Rules expressions: boolean short circuit and errors"],[592,12,0,"Rules expressions: string list map and map diff"],[604,4,0,"Rules expressions: request auth method time query resource and existing resource"],[608,4,0,"Rules expressions: literals and coercion"],[612,7,0,"Rules expressions: numeric arithmetic and comparison"],[619,5,0,"Rules expressions: boolean short circuit and errors"],[624,12,0,"Rules expressions: string list map and map diff"],[636,4,0,"Rules expressions: request auth method time query resource and existing resource"],[640,4,0,"Rules expressions: literals and coercion"],[644,7,0,"Rules expressions: numeric arithmetic and comparison"],[651,5,0,"Rules expressions: boolean short circuit and errors"],[656,12,0,"Rules expressions: string list map and map diff"],[668,4,0,"Rules expressions: request auth method time query resource and existing resource"],[672,4,0,"Rules expressions: literals and coercion"],[676,7,0,"Rules expressions: numeric arithmetic and comparison"],[683,5,0,"Rules expressions: boolean short circuit and errors"],[688,12,0,"Rules expressions: string list map and map diff"],[700,4,0,"Rules expressions: request auth method time query resource and existing resource"],[704,4,0,"Rules expressions: literals and coercion"],[708,7,0,"Rules expressions: numeric arithmetic and comparison"],[715,5,0,"Rules expressions: boolean short circuit and errors"],[720,12,0,"Rules expressions: string list map and map diff"],[732,4,0,"Rules expressions: request auth method time query resource and existing resource"],[736,4,0,"Rules expressions: literals and coercion"],[740,7,0,"Rules expressions: numeric arithmetic and comparison"],[747,5,0,"Rules expressions: boolean short circuit and errors"],[752,12,0,"Rules expressions: string list map and map diff"],[764,4,0,"Rules expressions: request auth method time query resource and existing resource"],[768,4,0,"Rules expressions: literals and coercion"],[772,7,0,"Rules expressions: numeric arithmetic and comparison"],[779,5,0,"Rules expressions: boolean short circuit and errors"],[784,12,0,"Rules expressions: string list map and map diff"],[796,4,0,"Rules expressions: request auth method time query resource and existing resource"],[800,4,0,"Rules expressions: literals and coercion"],[804,7,0,"Rules expressions: numeric arithmetic and comparison"],[811,5,0,"Rules expressions: boolean short circuit and errors"],[816,12,0,"Rules expressions: string list map and map diff"],[828,4,0,"Rules expressions: request auth method time query resource and existing resource"],[832,4,0,"Rules expressions: literals and coercion"],[836,7,0,"Rules expressions: numeric arithmetic and comparison"],[843,5,0,"Rules expressions: boolean short circuit and errors"],[848,12,0,"Rules expressions: string list map and map diff"],[860,4,0,"Rules expressions: request auth method time query resource and existing resource"],[864,4,0,"Rules expressions: literals and coercion"],[868,7,0,"Rules expressions: numeric arithmetic and comparison"],[875,5,0,"Rules expressions: boolean short circuit and errors"],[880,12,0,"Rules expressions: string list map and map diff"],[892,4,0,"Rules expressions: request auth method time query resource and existing resource"],[896,4,0,"Rules expressions: literals and coercion"],[900,7,0,"Rules expressions: numeric arithmetic and comparison"],[907,5,0,"Rules expressions: boolean short circuit and errors"],[912,12,0,"Rules expressions: string list map and map diff"],[924,4,0,"Rules expressions: request auth method time query resource and existing resource"],[928,4,0,"Rules expressions: literals and coercion"],[932,7,0,"Rules expressions: numeric arithmetic and comparison"],[939,5,0,"Rules expressions: boolean short circuit and errors"],[944,12,0,"Rules expressions: string list map and map diff"],[956,4,0,"Rules expressions: request auth method time query resource and existing resource"],[960,4,0,"Rules expressions: literals and coercion"],[964,7,0,"Rules expressions: numeric arithmetic and comparison"],[971,5,0,"Rules expressions: boolean short circuit and errors"],[976,12,0,"Rules expressions: string list map and map diff"],[988,4,0,"Rules expressions: request auth method time query resource and existing resource"],[992,4,0,"Rules expressions: literals and coercion"],[996,7,0,"Rules expressions: numeric arithmetic and comparison"],[1003,5,0,"Rules expressions: boolean short circuit and errors"],[1008,12,0,"Rules expressions: string list map and map diff"],[1020,4,0,"Rules expressions: request auth method time query resource and existing resource"],[1024,6,0,"Language contract: string"],[1030,6,0,"Language contract: list"],[1036,3,0,"Language contract: map"],[1039,2,0,"Language contract: map diff"],[1041,3,0,"Language contract: set"],[1044,2,0,"Language contract: bytes"],[1046,2,0,"Language contract: duration"],[1048,3,0,"Language contract: timestamp"],[1051,2,0,"Language contract: latlng"],[1053,3,0,"Language contract: math"],[1056,2,0,"Language contract: hashing"],[1058,2,0,"Language contract: request"],[1060,1,0,"Language contract: path"],[1061,1,0,"Language contract: function"],[1062,1,0,"Language contract: resource"],[1063,1,0,"Language contract: query"],[1064,3,0,"Language contract: match"],[1067,1,0,"Limits: function depth"],[1068,2,0,"Limits: balanced expression terms"],[1070,1,0,"Compiler and source size: unexpected token"],[1071,1,0,"Compiler and source size: unclosed block"],[1072,1,0,"Compiler and source size: duplicate let"],[1073,1,0,"Compiler and source size: undefined name"],[1074,1,0,"Compiler and source size: invalid function arity"],[1075,1,0,"Compiler and source size: recursive function"],[1076,1,0,"Compiler and source size: invalid recursive wildcard"],[1077,4,0,"Compiler and source size: source bytes"],[1081,1,0,"complex-firestore.rules: production compile"],[1082,1,0,"Language contract: debug"],[1083,2,0,"Compiler and source size: source bytes"],[1085,8,0,"Limits: function depth"],[1093,9,0,"Limits: linear expression terms"],[1102,6,0,"Limits: balanced expression terms"],[1108,14,1,"Coverage after a rules reload and two reads"],[1122,1,1,"Setup"],[1123,13,1,"Coverage after a rules reload and two reads"],[1136,3,1,"A rejected reload keeps the last valid rules"],[1139,23,2,"Firestore requests with live rules evaluations"],[1162,26,2,"Requests websocket messages"],[1188,1,3,"Firestore requests with live rules evaluations"],[1189,5,3,"Firestore requests with live rules evaluations"],[1194,8,3,"Requests websocket messages"],[1202,2,4,"Reads as: no Authorization header (a signed-out client SDK)"],[1204,6,4,"Reads as: the owner credential (the Admin SDKs' emulator credential)"],[1210,6,4,"Reads as: the owner credential, lowercase scheme"],[1216,6,4,"Reads as: the owner credential, all uppercase"],[1222,2,4,"Reads as: a current unsigned token for alice"],[1224,2,4,"Reads as: current unsigned token for alice, lowercase scheme"],[1226,2,4,"Reads as: the token createMockUserToken builds without iat: iat 0, exp 3600"],[1228,2,4,"Reads as: a token issued a day from now"],[1230,2,4,"Reads as: a token whose aud and iss name another project"],[1232,2,4,"Reads as: a token whose aud alone names another project"],[1234,2,4,"Reads as: an unsigned token with only sub: alice"],[1236,2,4,"Reads as: a token whose header has no alg"],[1238,2,4,"Reads as: an RS256 header and a signature nobody checks"],[1240,2,4,"Reads as: standard padded base64 segments"],[1242,6,4,"Reads as: a token of two segments"],[1248,6,4,"Reads as: a token whose payload is an array"],[1254,6,4,"Reads as: a credential that is not a JWT"],[1260,2,4,"Reads as: no Authorization header (a signed-out client SDK)"],[1262,6,4,"Reads as: the owner credential (the Admin SDKs' emulator credential)"],[1268,6,4,"Reads as: the owner credential, lowercase scheme"],[1274,6,4,"Reads as: the owner credential, all uppercase"],[1280,2,4,"Reads as: a current unsigned token for alice"],[1282,2,4,"Reads as: current unsigned token for alice, lowercase scheme"],[1284,2,4,"Reads as: the token createMockUserToken builds without iat: iat 0, exp 3600"],[1286,2,4,"Reads as: a token issued a day from now"],[1288,2,4,"Reads as: a token whose aud and iss name another project"],[1290,2,4,"Reads as: a token whose aud alone names another project"],[1292,2,4,"Reads as: an unsigned token with only sub: alice"],[1294,2,4,"Reads as: a token whose header has no alg"],[1296,2,4,"Reads as: an RS256 header and a signature nobody checks"],[1298,2,4,"Reads as: standard padded base64 segments"],[1300,6,4,"Reads as: a token of two segments"],[1306,6,4,"Reads as: a token whose payload is an array"],[1312,6,4,"Reads as: a credential that is not a JWT"],[1318,3,4,"What request.auth holds for: no Authorization header (a signed-out client SDK)"],[1321,3,4,"What request.auth holds for: the owner credential (the Admin SDKs' emulator credential)"],[1324,3,4,"What request.auth holds for: the owner credential, lowercase scheme"],[1327,3,4,"What request.auth holds for: the owner credential, all uppercase"],[1330,3,4,"What request.auth holds for: a current unsigned token for alice"],[1333,3,4,"What request.auth holds for: current unsigned token for alice, lowercase scheme"],[1336,3,4,"What request.auth holds for: the token createMockUserToken builds without iat: iat 0, exp 3600"],[1339,3,4,"What request.auth holds for: a token issued a day from now"],[1342,3,4,"What request.auth holds for: a token whose aud and iss name another project"],[1345,3,4,"What request.auth holds for: a token whose aud alone names another project"],[1348,3,4,"What request.auth holds for: an unsigned token with only sub: alice"],[1351,3,4,"What request.auth holds for: an unsigned token with only user_id: alice"],[1354,3,4,"What request.auth holds for: an unsigned token with no claims"],[1357,3,4,"What request.auth holds for: an unsigned token with sub: 7"],[1360,3,4,"What request.auth holds for: a token whose header has no alg"],[1363,3,4,"What request.auth holds for: an RS256 header and a signature nobody checks"],[1366,3,4,"What request.auth holds for: standard padded base64 segments"],[1369,3,4,"What request.auth holds for: a token of two segments"],[1372,3,4,"What request.auth holds for: a token whose payload is an array"],[1375,3,4,"What request.auth holds for: a credential that is not a JWT"],[1378,12,4,"Metadata operations need the owner"],[1390,2,4,"Enterprise pipelines are evaluated as a list"],[1392,3,4,"The rules reload route reads the body as JSON"],[1395,4,4,"Reads as: no Authorization header (a signed-out client SDK)"],[1399,4,4,"Reads as: a current unsigned token for alice"],[1403,4,4,"Reads as: current unsigned token for alice, lowercase scheme"],[1407,4,4,"Reads as: the token createMockUserToken builds without iat: iat 0, exp 3600"],[1411,4,4,"Reads as: a token issued a day from now"],[1415,4,4,"Reads as: a token whose aud and iss name another project"],[1419,4,4,"Reads as: a token whose aud alone names another project"],[1423,4,4,"Reads as: an unsigned token with only sub: alice"],[1427,6,4,"Reads as: an unsigned token with only user_id: alice"],[1433,6,4,"Reads as: an unsigned token with no claims"],[1439,6,4,"Reads as: an unsigned token with sub: 7"],[1445,4,4,"Reads as: a token whose header has no alg"],[1449,4,4,"Reads as: an RS256 header and a signature nobody checks"],[1453,4,4,"Reads as: standard padded base64 segments"],[1457,6,4,"Reads as: a Basic credential"],[1463,6,4,"Reads as: the owner credential (Storage's admin credential), Firebase scheme"],[1469,4,4,"Reads as: no Authorization header (a signed-out client SDK)"],[1473,4,4,"Reads as: a current unsigned token for alice"],[1477,4,4,"Reads as: current unsigned token for alice, lowercase scheme"],[1481,4,4,"Reads as: the token createMockUserToken builds without iat: iat 0, exp 3600"],[1485,4,4,"Reads as: a token issued a day from now"],[1489,4,4,"Reads as: a token whose aud and iss name another project"],[1493,4,4,"Reads as: a token whose aud alone names another project"],[1497,4,4,"Reads as: an unsigned token with only sub: alice"],[1501,6,4,"Reads as: an unsigned token with only user_id: alice"],[1507,6,4,"Reads as: an unsigned token with no claims"],[1513,6,4,"Reads as: an unsigned token with sub: 7"],[1519,4,4,"Reads as: a token whose header has no alg"],[1523,4,4,"Reads as: an RS256 header and a signature nobody checks"],[1527,4,4,"Reads as: standard padded base64 segments"],[1531,6,4,"Reads as: a Basic credential"],[1537,6,4,"Reads as: the owner credential (Storage's admin credential), Firebase scheme"],[1543,3,4,"What request.auth holds for: a Basic credential"],[1546,3,4,"What request.auth holds for: the owner credential (Storage's admin credential), Firebase scheme"],[1549,5,4,"The message of a refused request"],[1554,6,4,"Metadata operations need the owner"],[1560,2,4,"Enterprise pipelines are evaluated as a list"],[1562,5,5,"The identifier \"duration\" in each position"],[1567,5,5,"The identifier \"hashing\" in each position"],[1572,5,5,"The identifier \"latlng\" in each position"],[1577,5,5,"The identifier \"math\" in each position"],[1582,5,5,"The identifier \"timestamp\" in each position"],[1587,5,5,"The identifier \"request\" in each position"],[1592,5,5,"The identifier \"resource\" in each position"],[1597,5,5,"The identifier \"value\" in each position"],[1602,123,6,"Paths and document names under allow get"],[1725,7,6,"Document names under allow list"],[1732,5,6,"Document names under allow create"],[1737,2,8,"Contributed rooms ruleset: a function outside the service block"],[1739,3,8,"Contributed rooms ruleset: the conditional operator inside a function"],[1742,2,8,"Contributed rooms ruleset: keys().hasOnly() and hasAll()"],[1744,3,8,"Contributed rooms ruleset: type, length and list-membership checks"],[1747,3,8,"Contributed rooms ruleset: diff().affectedKeys() on update, and a delete never allowed"],[1750,3,8,"Contributed rooms ruleset: exists() on another document"],[1753,1,8,"Contributed rooms ruleset: a field check in the proof of a list query"],[1754,3,8,"Contributed rooms ruleset: get() with a default on the payload, and is int"],[1757,1,8,"Contributed rooms ruleset: get() on the parent document"],[1758,1,8,"Contributed rooms ruleset: a null value on write"],[1759,2,8,"Contributed rooms ruleset: a query pinned to a missing document id"],[1761,2,8,"Contributed rooms ruleset: matches() on the document id"],[1763,2,8,"Contributed rooms ruleset: keys().hasAny()"],[1765,1,8,"Contributed rooms ruleset: a field check in the proof of a list query"],[1766,7,9,"Document access limits (10 and 20) and cached repeated access"],[1773,2,9,"getAfter sees the pending write of a commit"],[1775,5,9,"Runtime errors deny: missing fields, division by zero, list bounds, wrong types"],[1780,1,9,"complex-firestore.rules: public read"],[1781,2,9,"complex-firestore.rules: query limit validation"],[1783,2,9,"complex-firestore.rules: auth and custom claims"],[1785,2,9,"complex-firestore.rules: field change validation"],[1787,2,9,"complex-firestore.rules: nested and recursive matches"],[1789,2,9,"complex-firestore.rules: cross document access"],[1791,1,9,"complex-firestore.rules: create update delete resource differences"],[1792,1,9,"complex-firestore.rules: field change validation"],[1793,2,9,"complex-firestore.rules: create update delete resource differences"],[1795,2,9,"complex-firestore.rules: nested and recursive matches"],[1797,2,9,"complex-firestore.rules: create update delete resource differences"],[1799,2,9,"complex-firestore.rules: field change validation"],[1801,1,9,"complex-firestore.rules: nested and recursive matches"],[1802,4,9,"complex-firestore.rules: auth and custom claims"],[1806,2,9,"complex-firestore.rules: field change validation"],[1808,2,9,"complex-firestore.rules: timestamps durations and helper functions"],[1810,2,9,"complex-firestore.rules: nested and recursive matches"],[1812,2,9,"complex-firestore.rules: auth and custom claims"],[1814,9,9,"complex-firestore.rules: complex generated policy"],[1823,2,9,"complex-firestore.rules: getAfter batch invariant"],[1825,3,9,"query-authorization: owner equality"],[1828,3,9,"query-authorization: owner absent"],[1831,3,9,"query-authorization: owner wrong uid"],[1834,3,9,"query-authorization: owner unverified"],[1837,3,9,"query-authorization: owner in single"],[1840,3,9,"query-authorization: owner in mixed"],[1843,3,9,"query-authorization: owner array is not equality"],[1846,3,9,"query-authorization: owner inequality"],[1849,3,9,"query-authorization: owner bounded equality"],[1852,3,9,"query-authorization: owner compound and"],[1855,3,9,"query-authorization: owner compound or safe"],[1858,3,9,"query-authorization: owner compound or unsafe"],[1861,3,9,"query-authorization: owner empty"],[1864,3,9,"query-authorization: owner empty unconstrained"],[1867,3,9,"query-authorization: owner empty wrong uid"],[1870,3,9,"query-authorization: owner nonmatching extra filter"],[1873,3,9,"query-authorization: permission get allowed"],[1876,3,9,"query-authorization: permission get denied"],[1879,3,9,"query-authorization: permission get missing"],[1882,3,9,"query-authorization: permission in all granted"],[1885,3,9,"query-authorization: permission in mixed"],[1888,3,9,"query-authorization: short circuit missing get"],[1891,3,9,"query-authorization: array contains owner"],[1894,3,9,"query-authorization: array contains other"],[1897,3,9,"query-authorization: array any owner"],[1900,3,9,"query-authorization: array any mixed"],[1903,3,9,"query-authorization: array absent"],[1906,3,9,"query-authorization: range equality inside"],[1909,3,9,"query-authorization: range strict bound"],[1912,3,9,"query-authorization: range inclusive bound"],[1915,3,9,"query-authorization: range unsafe inclusive"],[1918,3,9,"query-authorization: range safe in"],[1921,3,9,"query-authorization: range unsafe in"],[1924,3,9,"query-authorization: range absent"],[1927,3,9,"query-authorization: not equal null"],[1930,3,9,"query-authorization: not equal string"],[1933,3,9,"query-authorization: not in blocked"],[1936,3,9,"query-authorization: limit allowed"],[1939,3,9,"query-authorization: limit denied"],[1942,3,9,"query-authorization: limit absent"],[1945,3,9,"query-authorization: offset allowed"],[1948,3,9,"query-authorization: offset denied"],[1951,3,9,"query-authorization: offset default"],[1954,3,9,"query-authorization: order desc"],[1957,3,9,"query-authorization: order asc"],[1960,3,9,"query-authorization: order absent"],[1963,3,9,"query-authorization: get fixed path"],[1966,3,9,"query-authorization: exists fixed path"],[1969,3,9,"query-authorization: exists constrained path"],[1972,3,9,"query-authorization: exists missing path"],[1975,3,9,"query-authorization: exists unconstrained path"],[1978,3,9,"query-authorization: group recursive owner"],[1981,3,9,"query-authorization: group recursive unconstrained"],[1984,3,9,"query-authorization: group recursive empty owner"],[1987,3,9,"query-authorization: group root only rule"],[1990,3,9,"query-authorization: nested collection owner"],[1993,1,9,"query-authorization: owner absent"],[1994,1,9,"query-authorization: owner empty unconstrained"],[1995,1,9,"query-authorization: get fixed path"],[1996,1,9,"query-authorization: limit allowed"],[1997,3,9,"query-authorization: owner equality"],[2000,2,9,"query-authorization: owner absent"],[2002,2,9,"query-authorization: owner wrong uid"],[2004,2,9,"query-authorization: owner unverified"],[2006,2,9,"query-authorization: owner in single"],[2008,2,9,"query-authorization: owner in mixed"],[2010,2,9,"query-authorization: owner array is not equality"],[2012,2,9,"query-authorization: owner inequality"],[2014,2,9,"query-authorization: owner bounded equality"],[2016,2,9,"query-authorization: owner compound and"],[2018,2,9,"query-authorization: owner compound or safe"],[2020,2,9,"query-authorization: owner compound or unsafe"],[2022,2,9,"query-authorization: owner empty"],[2024,2,9,"query-authorization: owner empty unconstrained"],[2026,2,9,"query-authorization: owner empty wrong uid"],[2028,2,9,"query-authorization: owner nonmatching extra filter"],[2030,2,9,"query-authorization: permission get allowed"],[2032,2,9,"query-authorization: permission get denied"],[2034,2,9,"query-authorization: permission get missing"],[2036,2,9,"query-authorization: permission in all granted"],[2038,2,9,"query-authorization: permission in mixed"],[2040,2,9,"query-authorization: short circuit missing get"],[2042,2,9,"query-authorization: array contains owner"],[2044,2,9,"query-authorization: array contains other"],[2046,2,9,"query-authorization: array any owner"],[2048,2,9,"query-authorization: array any mixed"],[2050,2,9,"query-authorization: array absent"],[2052,2,9,"query-authorization: range equality inside"],[2054,2,9,"query-authorization: range strict bound"],[2056,2,9,"query-authorization: range inclusive bound"],[2058,2,9,"query-authorization: range unsafe inclusive"],[2060,2,9,"query-authorization: range safe in"],[2062,2,9,"query-authorization: range unsafe in"],[2064,2,9,"query-authorization: range absent"],[2066,2,9,"query-authorization: not equal null"],[2068,2,9,"query-authorization: not equal string"],[2070,2,9,"query-authorization: not in blocked"],[2072,2,9,"query-authorization: limit allowed"],[2074,2,9,"query-authorization: limit denied"],[2076,2,9,"query-authorization: limit absent"],[2078,2,9,"query-authorization: offset default"],[2080,2,9,"query-authorization: order desc"],[2082,2,9,"query-authorization: order asc"],[2084,2,9,"query-authorization: order absent"],[2086,2,9,"query-authorization: get fixed path"],[2088,2,9,"query-authorization: exists fixed path"],[2090,2,9,"query-authorization: exists constrained path"],[2092,2,9,"query-authorization: exists missing path"],[2094,2,9,"query-authorization: exists unconstrained path"],[2096,2,9,"query-authorization: group recursive owner"],[2098,2,9,"query-authorization: group recursive unconstrained"],[2100,2,9,"query-authorization: group recursive empty owner"],[2102,2,9,"query-authorization: group root only rule"],[2104,2,9,"query-authorization: nested collection owner"],[2106,3,9,"query-authorization: owner equality"],[2109,2,9,"query-authorization: owner absent"],[2111,2,9,"query-authorization: owner wrong uid"],[2113,2,9,"query-authorization: owner unverified"],[2115,2,9,"query-authorization: owner in single"],[2117,2,9,"query-authorization: owner in mixed"],[2119,2,9,"query-authorization: owner array is not equality"],[2121,2,9,"query-authorization: owner inequality"],[2123,2,9,"query-authorization: owner bounded equality"],[2125,2,9,"query-authorization: owner compound and"],[2127,2,9,"query-authorization: owner compound or safe"],[2129,2,9,"query-authorization: owner compound or unsafe"],[2131,2,9,"query-authorization: owner empty"],[2133,2,9,"query-authorization: owner empty unconstrained"],[2135,2,9,"query-authorization: owner empty wrong uid"],[2137,2,9,"query-authorization: owner nonmatching extra filter"],[2139,2,9,"query-authorization: permission get allowed"],[2141,2,9,"query-authorization: permission get denied"],[2143,2,9,"query-authorization: permission get missing"],[2145,2,9,"query-authorization: permission in all granted"],[2147,2,9,"query-authorization: permission in mixed"],[2149,2,9,"query-authorization: short circuit missing get"],[2151,2,9,"query-authorization: array contains owner"],[2153,2,9,"query-authorization: array contains other"],[2155,2,9,"query-authorization: array any owner"],[2157,2,9,"query-authorization: array any mixed"],[2159,2,9,"query-authorization: array absent"],[2161,2,9,"query-authorization: range equality inside"],[2163,2,9,"query-authorization: range strict bound"],[2165,2,9,"query-authorization: range inclusive bound"],[2167,2,9,"query-authorization: range unsafe inclusive"],[2169,2,9,"query-authorization: range safe in"],[2171,2,9,"query-authorization: range unsafe in"],[2173,2,9,"query-authorization: range absent"],[2175,2,9,"query-authorization: not equal null"],[2177,2,9,"query-authorization: not equal string"],[2179,2,9,"query-authorization: not in blocked"],[2181,2,9,"query-authorization: limit allowed"],[2183,2,9,"query-authorization: limit denied"],[2185,2,9,"query-authorization: limit absent"],[2187,2,9,"query-authorization: offset default"],[2189,2,9,"query-authorization: order desc"],[2191,2,9,"query-authorization: order asc"],[2193,2,9,"query-authorization: order absent"],[2195,2,9,"query-authorization: get fixed path"],[2197,2,9,"query-authorization: exists fixed path"],[2199,2,9,"query-authorization: exists constrained path"],[2201,2,9,"query-authorization: exists missing path"],[2203,2,9,"query-authorization: exists unconstrained path"],[2205,2,9,"query-authorization: group recursive owner"],[2207,2,9,"query-authorization: group recursive unconstrained"],[2209,2,9,"query-authorization: group recursive empty owner"],[2211,2,9,"query-authorization: group root only rule"],[2213,2,9,"query-authorization: nested collection owner"],[2215,1,9,"query-authorization: owner equality"],[2216,3,9,"query-paths: owner equality"],[2219,3,9,"query-paths: owner absent"],[2222,3,9,"query-paths: owner empty unconstrained"],[2225,3,9,"query-paths: limit allowed"],[2228,3,9,"query-paths: get fixed path"],[2231,3,9,"query-paths: path members granted"],[2234,3,9,"query-paths: path members denied"],[2237,3,9,"query-paths: path members missing"],[2240,3,9,"query-paths: path-getMembers granted"],[2243,3,9,"query-paths: path-getMembers denied"],[2246,3,9,"query-paths: path-getMembers missing"],[2249,3,9,"query-paths: path-functionMembers granted"],[2252,3,9,"query-paths: path-functionMembers denied"],[2255,3,9,"query-paths: path-functionMembers missing"],[2258,3,9,"query-paths: path-reversedMembers granted"],[2261,3,9,"query-paths: path-reversedMembers denied"],[2264,3,9,"query-paths: path-reversedMembers missing"],[2267,3,9,"query-paths: path-unknownOnly granted"],[2270,3,9,"query-paths: path-unknownOnly denied"],[2273,3,9,"query-paths: path-unknownOnly missing"],[2276,3,9,"query-paths: path-negatedAnd granted"],[2279,3,9,"query-paths: path-negatedAnd denied"],[2282,3,9,"query-paths: path-negatedAnd missing"],[2285,3,9,"query-paths: path-literalOr granted"],[2288,3,9,"query-paths: path-literalOr denied"],[2291,3,9,"query-paths: path-literalOr missing"],[2294,3,9,"query-paths: path-concreteErrorOr granted"],[2297,3,9,"query-paths: path-concreteErrorOr denied"],[2300,3,9,"query-paths: path-concreteErrorOr missing"],[2303,3,9,"query-paths: path-concreteErrorAnd granted"],[2306,3,9,"query-paths: path-concreteErrorAnd denied"],[2309,3,9,"query-paths: path-concreteErrorAnd missing"],[2312,3,9,"query-paths: path-budgetErrorOr granted"],[2315,3,9,"query-paths: path-budgetErrorOr denied"],[2318,3,9,"query-paths: path-budgetErrorOr missing"],[2321,3,9,"query-paths: path members empty granted"],[2324,3,9,"query-paths: path members filtered denied"],[2327,1,9,"query-paths: owner absent"],[2328,1,9,"query-paths: owner empty unconstrained"],[2329,1,9,"query-paths: get fixed path"],[2330,1,9,"query-paths: limit allowed"],[2331,1,9,"query-paths: path members granted"],[2332,1,9,"query-paths: path members denied"],[2333,1,9,"query-paths: path members empty granted"],[2334,3,9,"query-paths: owner equality"],[2337,2,9,"query-paths: owner absent"],[2339,2,9,"query-paths: owner empty unconstrained"],[2341,2,9,"query-paths: limit allowed"],[2343,2,9,"query-paths: get fixed path"],[2345,2,9,"query-paths: path members granted"],[2347,2,9,"query-paths: path members denied"],[2349,2,9,"query-paths: path members missing"],[2351,2,9,"query-paths: path-getMembers granted"],[2353,2,9,"query-paths: path-getMembers denied"],[2355,2,9,"query-paths: path-getMembers missing"],[2357,2,9,"query-paths: path-functionMembers granted"],[2359,2,9,"query-paths: path-functionMembers denied"],[2361,2,9,"query-paths: path-functionMembers missing"],[2363,2,9,"query-paths: path-reversedMembers granted"],[2365,2,9,"query-paths: path-reversedMembers denied"],[2367,2,9,"query-paths: path-reversedMembers missing"],[2369,2,9,"query-paths: path-unknownOnly granted"],[2371,2,9,"query-paths: path-unknownOnly denied"],[2373,2,9,"query-paths: path-unknownOnly missing"],[2375,2,9,"query-paths: path-negatedAnd granted"],[2377,2,9,"query-paths: path-negatedAnd denied"],[2379,2,9,"query-paths: path-negatedAnd missing"],[2381,2,9,"query-paths: path-literalOr granted"],[2383,2,9,"query-paths: path-literalOr denied"],[2385,2,9,"query-paths: path-literalOr missing"],[2387,2,9,"query-paths: path-concreteErrorOr granted"],[2389,2,9,"query-paths: path-concreteErrorOr denied"],[2391,2,9,"query-paths: path-concreteErrorOr missing"],[2393,2,9,"query-paths: path-concreteErrorAnd granted"],[2395,2,9,"query-paths: path-concreteErrorAnd denied"],[2397,2,9,"query-paths: path-concreteErrorAnd missing"],[2399,2,9,"query-paths: path-budgetErrorOr granted"],[2401,2,9,"query-paths: path-budgetErrorOr denied"],[2403,2,9,"query-paths: path-budgetErrorOr missing"],[2405,2,9,"query-paths: path members empty granted"],[2407,2,9,"query-paths: path members filtered denied"],[2409,3,9,"query-paths: owner equality"],[2412,2,9,"query-paths: owner absent"],[2414,2,9,"query-paths: owner empty unconstrained"],[2416,2,9,"query-paths: limit allowed"],[2418,2,9,"query-paths: get fixed path"],[2420,2,9,"query-paths: path members granted"],[2422,2,9,"query-paths: path members denied"],[2424,2,9,"query-paths: path members missing"],[2426,2,9,"query-paths: path-getMembers granted"],[2428,2,9,"query-paths: path-getMembers denied"],[2430,2,9,"query-paths: path-getMembers missing"],[2432,2,9,"query-paths: path-functionMembers granted"],[2434,2,9,"query-paths: path-functionMembers denied"],[2436,2,9,"query-paths: path-functionMembers missing"],[2438,2,9,"query-paths: path-reversedMembers granted"],[2440,2,9,"query-paths: path-reversedMembers denied"],[2442,2,9,"query-paths: path-reversedMembers missing"],[2444,2,9,"query-paths: path-unknownOnly granted"],[2446,2,9,"query-paths: path-unknownOnly denied"],[2448,2,9,"query-paths: path-unknownOnly missing"],[2450,2,9,"query-paths: path-negatedAnd granted"],[2452,2,9,"query-paths: path-negatedAnd denied"],[2454,2,9,"query-paths: path-negatedAnd missing"],[2456,2,9,"query-paths: path-literalOr granted"],[2458,2,9,"query-paths: path-literalOr denied"],[2460,2,9,"query-paths: path-literalOr missing"],[2462,2,9,"query-paths: path-concreteErrorOr granted"],[2464,2,9,"query-paths: path-concreteErrorOr denied"],[2466,2,9,"query-paths: path-concreteErrorOr missing"],[2468,2,9,"query-paths: path-concreteErrorAnd granted"],[2470,2,9,"query-paths: path-concreteErrorAnd denied"],[2472,2,9,"query-paths: path-concreteErrorAnd missing"],[2474,2,9,"query-paths: path-budgetErrorOr granted"],[2476,2,9,"query-paths: path-budgetErrorOr denied"],[2478,2,9,"query-paths: path-budgetErrorOr missing"],[2480,2,9,"query-paths: path members empty granted"],[2482,2,9,"query-paths: path members filtered denied"],[2484,1,9,"query-paths: owner equality"]],"cases":[{"t":"case 0000","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0001","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0002","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0003","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0004","q":"get: 2 + 3 == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0005","q":"get: 11 - 4 == 7","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0006","q":"get: 2 * 3 == 6","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0007","q":"get: 9 / 3 == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0008","q":"get: 10 % 7 == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0009","q":"get: 0 < 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0010","q":"get: -1 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0011","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0012","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0013","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0014","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0015","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0016","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0017","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0018","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0019","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0020","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0021","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0022","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0023","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0024","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0025","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0026","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0027","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0028","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0029","q":"get: request.auth.uid == 'user-0'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0030","q":"get: request.auth.token.score == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0031","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0032","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0033","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0034","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0035","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0036","q":"get: 3 + 3 == 6","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0037","q":"get: 12 - 4 == 8","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0038","q":"get: 3 * 3 == 9","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0039","q":"get: 10 / 3 == 3.3333333333333335","a":"DENY","r":"c","k":"verdict"},{"t":"case 0040","q":"get: 11 % 7 == 4","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0041","q":"get: 1 < 2","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0042","q":"get: -2 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0043","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0044","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0045","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0046","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0047","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0048","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0049","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0050","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0051","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0052","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0053","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0054","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0055","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0056","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0057","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0058","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0059","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0060","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0061","q":"get: request.auth.uid == 'user-1'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0062","q":"get: request.auth.token.score == 2","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0063","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0064","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0065","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0066","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0067","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0068","q":"get: 4 + 3 == 7","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0069","q":"get: 13 - 4 == 9","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0070","q":"get: 4 * 3 == 12","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0071","q":"get: 11 / 3 == 3.6666666666666665","a":"DENY","r":"c","k":"verdict"},{"t":"case 0072","q":"get: 12 % 7 == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0073","q":"get: 2 < 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0074","q":"get: -3 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0075","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0076","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0077","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0078","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0079","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0080","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0081","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0082","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0083","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0084","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0085","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0086","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0087","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0088","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0089","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0090","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0091","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0092","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0093","q":"get: request.auth.uid == 'user-2'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0094","q":"get: request.auth.token.score == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0095","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0096","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0097","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0098","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0099","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0100","q":"get: 5 + 3 == 8","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0101","q":"get: 14 - 4 == 10","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0102","q":"get: 5 * 3 == 15","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0103","q":"get: 12 / 3 == 4","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0104","q":"get: 13 % 7 == 6","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0105","q":"get: 3 < 4","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0106","q":"get: -4 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0107","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0108","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0109","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0110","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0111","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0112","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0113","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0114","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0115","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0116","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0117","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0118","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0119","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0120","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0121","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0122","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0123","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0124","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0125","q":"get: request.auth.uid == 'user-3'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0126","q":"get: request.auth.token.score == 4","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0127","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0128","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0129","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0130","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0131","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0132","q":"get: 6 + 3 == 9","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0133","q":"get: 15 - 4 == 11","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0134","q":"get: 6 * 3 == 18","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0135","q":"get: 13 / 3 == 4.333333333333333","a":"DENY","r":"c","k":"verdict"},{"t":"case 0136","q":"get: 14 % 7 == 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0137","q":"get: 4 < 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0138","q":"get: -5 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0139","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0140","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0141","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0142","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0143","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0144","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0145","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0146","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0147","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0148","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0149","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0150","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0151","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0152","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0153","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0154","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0155","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0156","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0157","q":"get: request.auth.uid == 'user-4'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0158","q":"get: request.auth.token.score == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0159","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0160","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0161","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0162","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0163","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0164","q":"get: 7 + 3 == 10","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0165","q":"get: 16 - 4 == 12","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0166","q":"get: 7 * 3 == 21","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0167","q":"get: 14 / 3 == 4.666666666666667","a":"DENY","r":"c","k":"verdict"},{"t":"case 0168","q":"get: 15 % 7 == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0169","q":"get: 5 < 6","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0170","q":"get: -6 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0171","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0172","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0173","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0174","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0175","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0176","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0177","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0178","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0179","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0180","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0181","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0182","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0183","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0184","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0185","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0186","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0187","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0188","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0189","q":"get: request.auth.uid == 'user-5'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0190","q":"get: request.auth.token.score == 6","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0191","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0192","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0193","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0194","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0195","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0196","q":"get: 8 + 3 == 11","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0197","q":"get: 17 - 4 == 13","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0198","q":"get: 8 * 3 == 24","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0199","q":"get: 15 / 3 == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0200","q":"get: 16 % 7 == 2","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0201","q":"get: 6 < 7","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0202","q":"get: -7 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0203","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0204","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0205","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0206","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0207","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0208","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0209","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0210","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0211","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0212","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0213","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0214","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0215","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0216","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0217","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0218","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0219","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0220","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0221","q":"get: request.auth.uid == 'user-6'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0222","q":"get: request.auth.token.score == 7","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0223","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0224","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0225","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0226","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0227","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0228","q":"get: 9 + 3 == 12","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0229","q":"get: 18 - 4 == 14","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0230","q":"get: 2 * 3 == 6","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0231","q":"get: 16 / 3 == 5.333333333333333","a":"DENY","r":"c","k":"verdict"},{"t":"case 0232","q":"get: 17 % 7 == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0233","q":"get: 7 < 8","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0234","q":"get: -8 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0235","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0236","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0237","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0238","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0239","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0240","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0241","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0242","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0243","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0244","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0245","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0246","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0247","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0248","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0249","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0250","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0251","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0252","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0253","q":"get: request.auth.uid == 'user-7'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0254","q":"get: request.auth.token.score == 8","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0255","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0256","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0257","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0258","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0259","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0260","q":"get: 10 + 3 == 13","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0261","q":"get: 19 - 4 == 15","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0262","q":"get: 3 * 3 == 9","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0263","q":"get: 17 / 3 == 5.666666666666667","a":"DENY","r":"c","k":"verdict"},{"t":"case 0264","q":"get: 18 % 7 == 4","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0265","q":"get: 8 < 9","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0266","q":"get: -9 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0267","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0268","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0269","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0270","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0271","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0272","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0273","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0274","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0275","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0276","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0277","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0278","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0279","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0280","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0281","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0282","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0283","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0284","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0285","q":"get: request.auth.uid == 'user-0'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0286","q":"get: request.auth.token.score == 9","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0287","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0288","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0289","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0290","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0291","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0292","q":"get: 11 + 3 == 14","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0293","q":"get: 20 - 4 == 16","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0294","q":"get: 4 * 3 == 12","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0295","q":"get: 18 / 3 == 6","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0296","q":"get: 19 % 7 == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0297","q":"get: 9 < 10","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0298","q":"get: -10 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0299","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0300","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0301","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0302","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0303","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0304","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0305","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0306","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0307","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0308","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0309","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0310","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0311","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0312","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0313","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0314","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0315","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0316","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0317","q":"get: request.auth.uid == 'user-1'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0318","q":"get: request.auth.token.score == 10","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0319","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0320","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0321","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0322","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0323","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0324","q":"get: 12 + 3 == 15","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0325","q":"get: 21 - 4 == 17","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0326","q":"get: 5 * 3 == 15","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0327","q":"get: 19 / 3 == 6.333333333333333","a":"DENY","r":"c","k":"verdict"},{"t":"case 0328","q":"get: 20 % 7 == 6","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0329","q":"get: 10 < 11","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0330","q":"get: -11 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0331","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0332","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0333","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0334","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0335","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0336","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0337","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0338","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0339","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0340","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0341","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0342","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0343","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0344","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0345","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0346","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0347","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0348","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0349","q":"get: request.auth.uid == 'user-2'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0350","q":"get: request.auth.token.score == 11","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0351","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0352","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0353","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0354","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0355","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0356","q":"get: 13 + 3 == 16","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0357","q":"get: 22 - 4 == 18","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0358","q":"get: 6 * 3 == 18","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0359","q":"get: 20 / 3 == 6.666666666666667","a":"DENY","r":"c","k":"verdict"},{"t":"case 0360","q":"get: 21 % 7 == 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0361","q":"get: 11 < 12","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0362","q":"get: -12 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0363","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0364","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0365","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0366","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0367","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0368","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0369","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0370","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0371","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0372","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0373","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0374","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0375","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0376","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0377","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0378","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0379","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0380","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0381","q":"get: request.auth.uid == 'user-3'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0382","q":"get: request.auth.token.score == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0383","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0384","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0385","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0386","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0387","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0388","q":"get: 14 + 3 == 17","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0389","q":"get: 23 - 4 == 19","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0390","q":"get: 7 * 3 == 21","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0391","q":"get: 21 / 3 == 7","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0392","q":"get: 22 % 7 == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0393","q":"get: 12 < 13","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0394","q":"get: -13 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0395","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0396","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0397","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0398","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0399","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0400","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0401","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0402","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0403","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0404","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0405","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0406","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0407","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0408","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0409","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0410","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0411","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0412","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0413","q":"get: request.auth.uid == 'user-4'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0414","q":"get: request.auth.token.score == 2","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0415","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0416","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0417","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0418","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0419","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0420","q":"get: 15 + 3 == 18","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0421","q":"get: 24 - 4 == 20","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0422","q":"get: 8 * 3 == 24","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0423","q":"get: 22 / 3 == 7.333333333333333","a":"DENY","r":"c","k":"verdict"},{"t":"case 0424","q":"get: 23 % 7 == 2","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0425","q":"get: 13 < 14","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0426","q":"get: -14 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0427","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0428","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0429","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0430","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0431","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0432","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0433","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0434","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0435","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0436","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0437","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0438","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0439","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0440","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0441","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0442","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0443","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0444","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0445","q":"get: request.auth.uid == 'user-5'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0446","q":"get: request.auth.token.score == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0447","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0448","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0449","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0450","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0451","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0452","q":"get: 16 + 3 == 19","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0453","q":"get: 25 - 4 == 21","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0454","q":"get: 2 * 3 == 6","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0455","q":"get: 23 / 3 == 7.666666666666667","a":"DENY","r":"c","k":"verdict"},{"t":"case 0456","q":"get: 24 % 7 == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0457","q":"get: 14 < 15","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0458","q":"get: -15 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0459","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0460","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0461","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0462","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0463","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0464","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0465","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0466","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0467","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0468","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0469","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0470","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0471","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0472","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0473","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0474","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0475","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0476","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0477","q":"get: request.auth.uid == 'user-6'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0478","q":"get: request.auth.token.score == 4","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0479","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0480","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0481","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0482","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0483","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0484","q":"get: 17 + 3 == 20","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0485","q":"get: 26 - 4 == 22","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0486","q":"get: 3 * 3 == 9","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0487","q":"get: 24 / 3 == 8","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0488","q":"get: 25 % 7 == 4","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0489","q":"get: 15 < 16","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0490","q":"get: -16 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0491","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0492","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0493","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0494","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0495","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0496","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0497","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0498","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0499","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0500","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0501","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0502","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0503","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0504","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0505","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0506","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0507","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0508","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0509","q":"get: request.auth.uid == 'user-7'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0510","q":"get: request.auth.token.score == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0511","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0512","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0513","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0514","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0515","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0516","q":"get: 18 + 3 == 21","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0517","q":"get: 27 - 4 == 23","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0518","q":"get: 4 * 3 == 12","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0519","q":"get: 25 / 3 == 8.333333333333334","a":"DENY","r":"c","k":"verdict"},{"t":"case 0520","q":"get: 26 % 7 == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0521","q":"get: 16 < 17","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0522","q":"get: -17 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0523","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0524","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0525","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0526","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0527","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0528","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0529","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0530","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0531","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0532","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0533","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0534","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0535","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0536","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0537","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0538","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0539","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0540","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0541","q":"get: request.auth.uid == 'user-0'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0542","q":"get: request.auth.token.score == 6","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0543","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0544","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0545","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0546","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0547","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0548","q":"get: 19 + 3 == 22","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0549","q":"get: 28 - 4 == 24","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0550","q":"get: 5 * 3 == 15","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0551","q":"get: 26 / 3 == 8.666666666666666","a":"DENY","r":"c","k":"verdict"},{"t":"case 0552","q":"get: 27 % 7 == 6","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0553","q":"get: 17 < 18","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0554","q":"get: -18 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0555","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0556","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0557","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0558","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0559","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0560","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0561","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0562","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0563","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0564","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0565","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0566","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0567","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0568","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0569","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0570","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0571","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0572","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0573","q":"get: request.auth.uid == 'user-1'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0574","q":"get: request.auth.token.score == 7","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0575","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0576","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0577","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0578","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0579","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0580","q":"get: 20 + 3 == 23","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0581","q":"get: 29 - 4 == 25","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0582","q":"get: 6 * 3 == 18","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0583","q":"get: 27 / 3 == 9","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0584","q":"get: 28 % 7 == 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0585","q":"get: 18 < 19","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0586","q":"get: -19 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0587","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0588","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0589","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0590","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0591","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0592","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0593","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0594","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0595","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0596","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0597","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0598","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0599","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0600","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0601","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0602","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0603","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0604","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0605","q":"get: request.auth.uid == 'user-2'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0606","q":"get: request.auth.token.score == 8","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0607","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0608","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0609","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0610","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0611","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0612","q":"get: 21 + 3 == 24","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0613","q":"get: 30 - 4 == 26","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0614","q":"get: 7 * 3 == 21","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0615","q":"get: 28 / 3 == 9.333333333333334","a":"DENY","r":"c","k":"verdict"},{"t":"case 0616","q":"get: 29 % 7 == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0617","q":"get: 19 < 20","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0618","q":"get: -20 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0619","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0620","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0621","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0622","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0623","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0624","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0625","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0626","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0627","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0628","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0629","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0630","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0631","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0632","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0633","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0634","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0635","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0636","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0637","q":"get: request.auth.uid == 'user-3'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0638","q":"get: request.auth.token.score == 9","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0639","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0640","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0641","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0642","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0643","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0644","q":"get: 22 + 3 == 25","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0645","q":"get: 31 - 4 == 27","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0646","q":"get: 8 * 3 == 24","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0647","q":"get: 29 / 3 == 9.666666666666666","a":"DENY","r":"c","k":"verdict"},{"t":"case 0648","q":"get: 30 % 7 == 2","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0649","q":"get: 20 < 21","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0650","q":"get: -21 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0651","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0652","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0653","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0654","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0655","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0656","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0657","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0658","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0659","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0660","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0661","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0662","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0663","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0664","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0665","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0666","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0667","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0668","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0669","q":"get: request.auth.uid == 'user-4'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0670","q":"get: request.auth.token.score == 10","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0671","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0672","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0673","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0674","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0675","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0676","q":"get: 23 + 3 == 26","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0677","q":"get: 32 - 4 == 28","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0678","q":"get: 2 * 3 == 6","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0679","q":"get: 30 / 3 == 10","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0680","q":"get: 31 % 7 == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0681","q":"get: 21 < 22","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0682","q":"get: -22 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0683","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0684","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0685","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0686","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0687","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0688","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0689","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0690","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0691","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0692","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0693","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0694","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0695","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0696","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0697","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0698","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0699","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0700","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0701","q":"get: request.auth.uid == 'user-5'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0702","q":"get: request.auth.token.score == 11","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0703","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0704","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0705","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0706","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0707","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0708","q":"get: 24 + 3 == 27","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0709","q":"get: 33 - 4 == 29","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0710","q":"get: 3 * 3 == 9","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0711","q":"get: 31 / 3 == 10.333333333333334","a":"DENY","r":"c","k":"verdict"},{"t":"case 0712","q":"get: 32 % 7 == 4","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0713","q":"get: 22 < 23","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0714","q":"get: -23 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0715","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0716","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0717","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0718","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0719","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0720","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0721","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0722","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0723","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0724","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0725","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0726","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0727","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0728","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0729","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0730","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0731","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0732","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0733","q":"get: request.auth.uid == 'user-6'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0734","q":"get: request.auth.token.score == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0735","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0736","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0737","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0738","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0739","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0740","q":"get: 25 + 3 == 28","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0741","q":"get: 34 - 4 == 30","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0742","q":"get: 4 * 3 == 12","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0743","q":"get: 32 / 3 == 10.666666666666666","a":"DENY","r":"c","k":"verdict"},{"t":"case 0744","q":"get: 33 % 7 == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0745","q":"get: 23 < 24","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0746","q":"get: -24 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0747","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0748","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0749","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0750","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0751","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0752","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0753","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0754","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0755","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0756","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0757","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0758","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0759","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0760","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0761","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0762","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0763","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0764","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0765","q":"get: request.auth.uid == 'user-7'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0766","q":"get: request.auth.token.score == 2","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0767","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0768","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0769","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0770","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0771","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0772","q":"get: 26 + 3 == 29","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0773","q":"get: 35 - 4 == 31","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0774","q":"get: 5 * 3 == 15","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0775","q":"get: 33 / 3 == 11","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0776","q":"get: 34 % 7 == 6","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0777","q":"get: 24 < 25","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0778","q":"get: -25 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0779","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0780","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0781","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0782","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0783","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0784","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0785","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0786","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0787","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0788","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0789","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0790","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0791","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0792","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0793","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0794","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0795","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0796","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0797","q":"get: request.auth.uid == 'user-0'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0798","q":"get: request.auth.token.score == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0799","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0800","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0801","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0802","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0803","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0804","q":"get: 27 + 3 == 30","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0805","q":"get: 36 - 4 == 32","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0806","q":"get: 6 * 3 == 18","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0807","q":"get: 34 / 3 == 11.333333333333334","a":"DENY","r":"c","k":"verdict"},{"t":"case 0808","q":"get: 35 % 7 == 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0809","q":"get: 25 < 26","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0810","q":"get: -26 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0811","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0812","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0813","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0814","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0815","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0816","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0817","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0818","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0819","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0820","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0821","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0822","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0823","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0824","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0825","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0826","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0827","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0828","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0829","q":"get: request.auth.uid == 'user-1'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0830","q":"get: request.auth.token.score == 4","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0831","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0832","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0833","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0834","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0835","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0836","q":"get: 28 + 3 == 31","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0837","q":"get: 37 - 4 == 33","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0838","q":"get: 7 * 3 == 21","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0839","q":"get: 35 / 3 == 11.666666666666666","a":"DENY","r":"c","k":"verdict"},{"t":"case 0840","q":"get: 36 % 7 == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0841","q":"get: 26 < 27","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0842","q":"get: -27 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0843","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0844","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0845","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0846","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0847","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0848","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0849","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0850","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0851","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0852","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0853","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0854","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0855","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0856","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0857","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0858","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0859","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0860","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0861","q":"get: request.auth.uid == 'user-2'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0862","q":"get: request.auth.token.score == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0863","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0864","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0865","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0866","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0867","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0868","q":"get: 29 + 3 == 32","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0869","q":"get: 38 - 4 == 34","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0870","q":"get: 8 * 3 == 24","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0871","q":"get: 36 / 3 == 12","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0872","q":"get: 37 % 7 == 2","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0873","q":"get: 27 < 28","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0874","q":"get: -28 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0875","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0876","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0877","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0878","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0879","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0880","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0881","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0882","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0883","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0884","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0885","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0886","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0887","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0888","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0889","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0890","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0891","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0892","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0893","q":"get: request.auth.uid == 'user-3'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0894","q":"get: request.auth.token.score == 6","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0895","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0896","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0897","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0898","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0899","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0900","q":"get: 30 + 3 == 33","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0901","q":"get: 39 - 4 == 35","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0902","q":"get: 2 * 3 == 6","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0903","q":"get: 37 / 3 == 12.333333333333334","a":"DENY","r":"c","k":"verdict"},{"t":"case 0904","q":"get: 38 % 7 == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0905","q":"get: 28 < 29","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0906","q":"get: -29 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0907","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0908","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0909","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0910","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0911","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0912","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0913","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0914","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0915","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0916","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0917","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0918","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0919","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0920","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0921","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0922","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0923","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0924","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0925","q":"get: request.auth.uid == 'user-4'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0926","q":"get: request.auth.token.score == 7","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0927","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0928","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0929","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0930","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0931","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0932","q":"get: 31 + 3 == 34","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0933","q":"get: 40 - 4 == 36","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0934","q":"get: 3 * 3 == 9","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0935","q":"get: 38 / 3 == 12.666666666666666","a":"DENY","r":"c","k":"verdict"},{"t":"case 0936","q":"get: 39 % 7 == 4","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0937","q":"get: 29 < 30","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0938","q":"get: -30 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0939","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0940","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0941","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0942","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0943","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0944","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0945","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0946","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0947","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0948","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0949","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0950","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0951","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0952","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0953","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0954","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0955","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0956","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0957","q":"get: request.auth.uid == 'user-5'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0958","q":"get: request.auth.token.score == 8","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0959","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0960","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0961","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0962","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0963","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0964","q":"get: 32 + 3 == 35","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0965","q":"get: 41 - 4 == 37","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0966","q":"get: 4 * 3 == 12","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0967","q":"get: 39 / 3 == 13","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0968","q":"get: 40 % 7 == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0969","q":"get: 30 < 31","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0970","q":"get: -31 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0971","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0972","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0973","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0974","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 0975","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0976","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0977","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0978","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0979","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0980","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0981","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0982","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0983","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0984","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0985","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0986","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0987","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0988","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0989","q":"get: request.auth.uid == 'user-6'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0990","q":"get: request.auth.token.score == 9","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0991","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0992","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0993","q":"get: false","a":"DENY","r":"c","k":"verdict"},{"t":"case 0994","q":"get: null == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0995","q":"get: null != 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0996","q":"get: 33 + 3 == 36","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0997","q":"get: 42 - 4 == 38","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0998","q":"get: 5 * 3 == 15","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 0999","q":"get: 40 / 3 == 13.333333333333334","a":"DENY","r":"c","k":"verdict"},{"t":"case 1000","q":"get: 41 % 7 == 6","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 1001","q":"get: 31 < 32","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 1002","q":"get: -32 < 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 1003","q":"get: true && true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 1004","q":"get: false || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 1005","q":"get: !false","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 1006","q":"get: false && request.auth.token.missing == 1","a":"DENY","r":"c","k":"verdict"},{"t":"case 1007","q":"get: true || request.auth.token.missing == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 1008","q":"get: 'alpha' == 'alpha'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 1009","q":"get: 'alpha'.size() == 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 1010","q":"get: 'alphabet'.matches('^alpha.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 1011","q":"get: 'MiXeD'.lower() == 'mixed'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 1012","q":"get: 'MiXeD'.upper() == 'MIXED'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 1013","q":"get: ['a', 'b', 'c'].size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 1014","q":"get: 'b' in ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 1015","q":"get: ['a', 'b', 'c'].hasAll(['a', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 1016","q":"get: ['a', 'b', 'c'].hasAny(['x', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 1017","q":"get: ['a', 'b'].hasOnly(['b', 'a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 1018","q":"get: {'a': 1, 'b': 2}.a == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 1019","q":"get: {'a': 1, 'b': 2}.keys().hasAll(['a', 'b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 1020","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 1021","q":"get: request.auth.uid == 'user-7'","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 1022","q":"get: request.auth.token.score == 10","a":"ALLOW","r":"c","k":"verdict"},{"t":"case 1023","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"string trim","q":"get: ' {name} '.trim() == '{name}'","a":"ALLOW","r":"c","k":"verdict"},{"t":"string case","q":"get: 'FiRe'.lower() == 'fire' && 'FiRe'.upper() == 'FIRE'","a":"ALLOW","r":"c","k":"verdict"},{"t":"string replace","q":"get: 'abcabc'.replace('a', 'x') == 'xbcxbc'","a":"ALLOW","r":"c","k":"verdict"},{"t":"string split","q":"get: 'a,b,c'.split(',') == ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"string match","q":"get: 'phase3'.matches('^phase[0-9]$')","a":"ALLOW","r":"c","k":"verdict"},{"t":"string coercion","q":"get: string(123) == '123' && string(true) == 'true'","a":"ALLOW","r":"c","k":"verdict"},{"t":"list concat","q":"get: [1, 2].concat([3]) == [1, 2, 3]","a":"ALLOW","r":"c","k":"verdict"},{"t":"list membership","q":"get: [1, 2, 3].hasAll([1, 3]) && [1, 2, 3].hasAny([9, 2])","a":"ALLOW","r":"c","k":"verdict"},{"t":"list has only","q":"get: [1, 2, 2].hasOnly([2, 1])","a":"ALLOW","r":"c","k":"verdict"},{"t":"list join","q":"get: ['a', 'b', 'c'].join('-') == 'a-b-c'","a":"ALLOW","r":"c","k":"verdict"},{"t":"list remove all","q":"get: [1, 2, 3, 2].removeAll([2]) == [1, 3]","a":"ALLOW","r":"c","k":"verdict"},{"t":"list index range","q":"get: [10, 20, 30][1] == 20 && [10, 20, 30][0:2] == [10, 20]","a":"ALLOW","r":"c","k":"verdict"},{"t":"map get","q":"get: {'a': 1}.get('missing', 7) == 7 && {'a': 1}.get('a', 7) == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"map keys values","q":"get: {'a': 1, 'b': 2}.keys().hasOnly(['a', 'b']) && {'a': 1, 'b': 2}.values().hasAll([1, 2])","a":"ALLOW","r":"c","k":"verdict"},{"t":"map size membership","q":"get: {'a': 1, 'b': 2}.size() == 2 && 'a' in {'a': 1}","a":"ALLOW","r":"c","k":"verdict"},{"t":"map diff","q":"get: {'a': 1, 'b': 2}.diff({'a': 1, 'b': 3, 'c': 4}).affectedKeys().hasOnly(['b', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"map diff sets","q":"get: {'a': 1, 'b': 2}.diff({'a': 1, 'b': 3, 'c': 4}).changedKeys().hasOnly(['b']) && {'a': 1, 'b': 2}.diff({'a': 1, 'b': 3, 'c': 4}).addedK…","a":"ALLOW","r":"c","k":"verdict"},{"t":"set union","q":"get: ['a', 'b'].toSet().union(['b', 'c'].toSet()).hasOnly(['a', 'b', 'c'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"set intersection","q":"get: ['a', 'b'].toSet().intersection(['b', 'c'].toSet()).hasOnly(['b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"set difference","q":"get: ['a', 'b'].toSet().difference(['b'].toSet()).hasOnly(['a'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"bytes size hex","q":"get: 'abc'.toUtf8().size() == 3 && 'abc'.toUtf8().toHexString() == '616263'","a":"ALLOW","r":"c","k":"verdict"},{"t":"bytes base64 unicode","q":"get: 'é'.toUtf8().size() == 2 && 'abc'.toUtf8().toBase64() == 'YWJj'","a":"ALLOW","r":"c","k":"verdict"},{"t":"duration seconds","q":"get: duration.value(90, 's').seconds() == 90","a":"ALLOW","r":"c","k":"verdict"},{"t":"duration nanos","q":"get: duration.value(123, 'ns').nanos() == 123","a":"ALLOW","r":"c","k":"verdict"},{"t":"timestamp date","q":"get: timestamp.date(2024, 2, 29).year() == 2024 && timestamp.date(2024, 2, 29).month() == 2","a":"ALLOW","r":"c","k":"verdict"},{"t":"timestamp components","q":"get: timestamp.date(2024, 2, 29).day() == 29 && timestamp.date(2024, 2, 29).dayOfWeek() == 4","a":"ALLOW","r":"c","k":"verdict"},{"t":"timestamp arithmetic","q":"get: timestamp.date(2024, 2, 29) + duration.value(1, 'd') == timestamp.date(2024, 3, 1)","a":"ALLOW","r":"c","k":"verdict"},{"t":"latlng components","q":"get: latlng.value(1.25, 2.5).latitude() == 1.25 && latlng.value(1.25, 2.5).longitude() == 2.5","a":"ALLOW","r":"c","k":"verdict"},{"t":"latlng distance","q":"get: latlng.value(1, 2).distance(latlng.value(1, 2)) == 0.0","a":"ALLOW","r":"c","k":"verdict"},{"t":"math basic","q":"get: math.abs(-2) == 2 && math.ceil(1.2) == 2 && math.floor(1.8) == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"math round sqrt","q":"get: math.round(1.6) == 2 && math.sqrt(81) == 9","a":"ALLOW","r":"c","k":"verdict"},{"t":"math pow","q":"get: math.pow(2, 3) == 8","a":"ALLOW","r":"c","k":"verdict"},{"t":"hashing md5","q":"get: hashing.md5('abc'.toUtf8()).toHexString() == '900150983CD24FB0D6963F7D28E17F72'","a":"ALLOW","r":"c","k":"verdict"},{"t":"hashing sha256","q":"get: hashing.sha256('abc'.toUtf8()).toHexString() == 'BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD'","a":"ALLOW","r":"c","k":"verdict"},{"t":"request auth","q":"get: request.auth.uid == 'phase3-user' && request.auth.token.role == 'editor'","a":"ALLOW","r":"c","k":"verdict"},{"t":"request method time","q":"get: request.method == 'get' && request.time.year() == 2026","a":"ALLOW","r":"c","k":"verdict"},{"t":"path value","q":"get: resource.__name__ == /databases/$(database)/documents/phase3-language/path-value","a":"ALLOW","r":"c","k":"verdict"},{"t":"function let","q":"get: usesLet(3)","a":"ALLOW","r":"c","k":"verdict"},{"t":"resource update diff","q":"update: resource.data.name == 'before' && request.resource.data.name == 'after' && request.resource.data.diff(resource.data).affectedKeys()…","a":"ALLOW","r":"c","k":"verdict"},{"t":"query limit","q":"list: request.query.limit == 10","a":"ALLOW","r":"c","k":"verdict"},{"t":"nested match","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"recursive match","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"overlapping allow","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"function depth 22","q":"projects.test with the function-depth-22 source (888 bytes)","a":"compile ERROR: Maximum allowed call depth of 20 is reached for [f0->f1->f2->f3->f4->f5->f6->f7->f8->f9->f10->f11->f12->f13->f14->f15->f16->…","r":"c","k":"verdict"},{"t":"balanced expression terms 100","q":"projects.test with the balanced-expression-terms-100 source (3933 bytes)","a":"ALLOW","r":"c","k":"verdict"},{"t":"balanced expression terms 125","q":"projects.test with the balanced-expression-terms-125 source (4972 bytes)","a":"DENY, error: Unable to evaluate the expression as the maximum of 1000 expressions to evaluate has been reached.","r":"c","k":"verdict"},{"t":"unexpected token","q":"projects.test with the unexpected-token source (154 bytes)","a":"compile ERROR: Missing conditional expression after 'if'.","r":"c","k":"verdict"},{"t":"unclosed block","q":"projects.test with the unclosed-block source (89 bytes)","a":"compile ERROR: Missing 'match' keyword before path.","r":"c","k":"verdict"},{"t":"duplicate let","q":"projects.test with the duplicate-let source (245 bytes)","a":"compile ERROR: The identifier [value] is already bound in the current scope.","r":"c","k":"verdict"},{"t":"undefined name","q":"projects.test with the undefined-name source (170 bytes)","a":"compiled, WARNING: Invalid variable name: missingName.","r":"c","k":"verdict"},{"t":"invalid function arity","q":"projects.test with the invalid-function-arity source (169 bytes)","a":"compiled, WARNING: Incorrect number of arguments supplied to function: math.abs.","r":"c","k":"verdict"},{"t":"recursive function","q":"projects.test with the recursive-function source (210 bytes)","a":"compile ERROR: Recursive call is not allowed.","r":"c","k":"verdict"},{"t":"invalid recursive wildcard","q":"projects.test with the invalid-recursive-wildcard source (163 bytes)","a":"compile ERROR: Invalid glob match expression. Only one glob match is permitted in a match declaration path.","r":"c","k":"verdict"},{"t":"source bytes 255999","q":"projects.test with the source-bytes-255999 source (255999 bytes)","a":"compiled with no issues","r":"c","k":"verdict"},{"t":"source bytes 256000","q":"projects.test with the source-bytes-256000 source (256000 bytes)","a":"compiled with no issues","r":"c","k":"verdict"},{"t":"source bytes 256001","q":"projects.test with the source-bytes-256001 source (256001 bytes)","a":"compiled with no issues","r":"c","k":"verdict"},{"t":"source bytes 262145","q":"projects.test with the source-bytes-262145 source (262145 bytes)","a":"400 INVALID_ARGUMENT: Request contains an invalid argument.","r":"c","k":"verdict"},{"t":"production compile","q":"compile complex-firestore.rules (1193 non-blank lines)","a":"compiled with no issues","r":"c","k":"verdict"},{"t":"debug return","q":"get: debug(request.auth.uid) == 'phase3-user'","a":"DENY, error: Function not found error: Name: [debug].","r":"d","k":"verdict","w":"production's projects.test has no debug() (Function not found); Firenook evaluates debug() to its argument, as the emulator does"},{"t":"source bytes 262143","q":"projects.test with the source-bytes-262143 source (262143 bytes)","a":"400 INVALID_ARGUMENT: Request contains an invalid argument.","r":"d","k":"verdict","w":"the Rules API's request envelope refuses this source below the documented 256 KiB deployed-rules maximum; Firenook accepts a source up to 262,144 bytes"},{"t":"source bytes 262144","q":"projects.test with the source-bytes-262144 source (262144 bytes)","a":"400 INVALID_ARGUMENT: Request contains an invalid argument.","r":"d","k":"verdict","w":"the Rules API's request envelope refuses this source below the documented 256 KiB deployed-rules maximum; Firenook accepts a source up to 262,144 bytes"},{"t":"function depth 15","q":"projects.test with the function-depth-15 source (643 bytes)","a":"ALLOW","r":"u"},{"t":"function depth 16","q":"projects.test with the function-depth-16 source (678 bytes)","a":"ALLOW","r":"u"},{"t":"function depth 17","q":"projects.test with the function-depth-17 source (713 bytes)","a":"ALLOW","r":"u"},{"t":"function depth 18","q":"projects.test with the function-depth-18 source (748 bytes)","a":"ALLOW","r":"u"},{"t":"function depth 19","q":"projects.test with the function-depth-19 source (783 bytes)","a":"ALLOW","r":"u"},{"t":"function depth 20","q":"projects.test with the function-depth-20 source (818 bytes)","a":"ALLOW","r":"u"},{"t":"function depth 21","q":"projects.test with the function-depth-21 source (853 bytes)","a":"ALLOW","r":"u"},{"t":"function depth 23","q":"projects.test with the function-depth-23 source (923 bytes)","a":"compile ERROR: Maximum allowed call depth of 20 is reached for [f0->f1->f2->f3->f4->f5->f6->f7->f8->f9->f10->f11->f12->f13->f14->f15->f16->…","r":"u"},{"t":"linear expression terms 20","q":"projects.test with the linear-expression-terms-20 source (740 bytes)","a":"ALLOW","r":"u"},{"t":"linear expression terms 30","q":"projects.test with the linear-expression-terms-30 source (1040 bytes)","a":"ALLOW","r":"u"},{"t":"linear expression terms 40","q":"projects.test with the linear-expression-terms-40 source (1340 bytes)","a":"ALLOW","r":"u"},{"t":"linear expression terms 50","q":"projects.test with the linear-expression-terms-50 source (1640 bytes)","a":"ALLOW","r":"u"},{"t":"linear expression terms 60","q":"projects.test with the linear-expression-terms-60 source (1940 bytes)","a":"500 INTERNAL: Internal error encountered.","r":"u"},{"t":"linear expression terms 70","q":"projects.test with the linear-expression-terms-70 source (2240 bytes)","a":"500 INTERNAL: Internal error encountered.","r":"u"},{"t":"linear expression terms 80","q":"projects.test with the linear-expression-terms-80 source (2540 bytes)","a":"500 INTERNAL: Internal error encountered.","r":"u"},{"t":"linear expression terms 90","q":"projects.test with the linear-expression-terms-90 source (2840 bytes)","a":"500 INTERNAL: Internal error encountered.","r":"u"},{"t":"linear expression terms 100","q":"projects.test with the linear-expression-terms-100 source (3140 bytes)","a":"compile ERROR: Expression is too complex to evaluate safely.","r":"u"},{"t":"balanced expression terms 150","q":"projects.test with the balanced-expression-terms-150 source (5923 bytes)","a":"DENY, error: Unable to evaluate the expression as the maximum of 1000 expressions to evaluate has been reached.","r":"u"},{"t":"balanced expression terms 175","q":"projects.test with the balanced-expression-terms-175 source (6962 bytes)","a":"DENY, error: Unable to evaluate the expression as the maximum of 1000 expressions to evaluate has been reached.","r":"u"},{"t":"balanced expression terms 200","q":"projects.test with the balanced-expression-terms-200 source (7913 bytes)","a":"DENY, error: Unable to evaluate the expression as the maximum of 1000 expressions to evaluate has been reached.","r":"u"},{"t":"balanced expression terms 225","q":"projects.test with the balanced-expression-terms-225 source (8954 bytes)","a":"DENY, error: Unable to evaluate the expression as the maximum of 1000 expressions to evaluate has been reached.","r":"u"},{"t":"balanced expression terms 250","q":"projects.test with the balanced-expression-terms-250 source (9907 bytes)","a":"DENY, error: Unable to evaluate the expression as the maximum of 1000 expressions to evaluate has been reached.","r":"u"},{"t":"balanced expression terms 300","q":"projects.test with the balanced-expression-terms-300 source (11903 bytes)","a":"DENY, error: Unable to evaluate the expression as the maximum of 1000 expressions to evaluate has been reached.","r":"u"},{"t":"constant","q":"reload rules, read twice, GET :ruleCoverage: allow get: if true;","a":"read 200 · no report (constant rules)","r":"c","k":"answer"},{"t":"list and map","q":"reload rules, read twice, GET :ruleCoverage: allow get: if [1, 2].size() == 2 && {'ok': true}.ok;","a":"read 200 · coverage report with 6 expressions","r":"c","k":"answer"},{"t":"empty containers","q":"reload rules, read twice, GET :ruleCoverage: allow get: if [].size() == 0 && {}.size() == 0;","a":"read 200 · coverage report with 7 expressions","r":"c","k":"answer"},{"t":"slice","q":"reload rules, read twice, GET :ruleCoverage: allow get: if [1, 2, 3][1:2] == [2];","a":"read 200 · coverage report with 4 expressions","r":"c","k":"answer"},{"t":"method arguments","q":"reload rules, read twice, GET :ruleCoverage: allow get: if 'hello'.matches('h.*');","a":"read 200 · coverage report with 1 expression","r":"c","k":"answer"},{"t":"grouped literal","q":"reload rules, read twice, GET :ruleCoverage: allow get: if ('hello').size() == 5;","a":"read 200 · coverage report with 2 expressions","r":"c","k":"answer"},{"t":"constant function","q":"reload rules, read twice, GET :ruleCoverage: allow get: if accept();","a":"read 200 · coverage report with 1 expression","r":"c","k":"answer"},{"t":"duration","q":"reload rules, read twice, GET :ruleCoverage: allow get: if duration.value(1, 's') == duration.value(1000, 'ms');","a":"read 200 · coverage report with 3 expressions","r":"c","k":"answer"},{"t":"set","q":"reload rules, read twice, GET :ruleCoverage: allow get: if [1, 2].toSet().hasAll([1]);","a":"read 200 · coverage report with 4 expressions","r":"c","k":"answer"},{"t":"map diff","q":"reload rules, read twice, GET :ruleCoverage: allow get: if {'x': 1}.diff({'x': 2}).changedKeys().hasOnly(['x']);","a":"read 200 · coverage report with 6 expressions","r":"c","k":"answer"},{"t":"map diff statuses","q":"reload rules, read twice, GET :ruleCoverage: allow get: if {'same': 1, 'removed': 1, 'changed': 1}.diff({'same': 1, 'added': 1, 'changed':…","a":"read 200 · coverage report with 6 expressions","r":"c","k":"answer"},{"t":"map diff direction size","q":"reload rules, read twice, GET :ruleCoverage: allow get: if check();","a":"read 200 · coverage report with 19 expressions","r":"c","k":"answer"},{"t":"bytes","q":"reload rules, read twice, GET :ruleCoverage: allow get: if hashing.sha256('hello'.toUtf8()).size() == 32;","a":"read 200 · coverage report with 4 expressions","r":"c","k":"answer"},{"t":"timestamp","q":"reload rules, read twice, GET :ruleCoverage: allow get: if timestamp.date(2020, 1, 2).year() == 2020;","a":"read 200 · coverage report with 3 expressions","r":"c","k":"answer"},{"t":"owner seed","q":"PATCH /v1/projects/{project}/databases/(default)/documents/items/one (owner)","a":"200 {name, fields, createTime, updateTime}","r":"u"},{"t":"short circuit","q":"reload rules, read twice, GET :ruleCoverage: allow get: if false && resource.data.missing;","a":"read 403 · coverage report with 4 expressions","r":"u"},{"t":"field equality","q":"reload rules, read twice, GET :ruleCoverage: allow get: if resource.data.visible == true;","a":"read 200 · coverage report with 4 expressions","r":"u"},{"t":"missing field","q":"reload rules, read twice, GET :ruleCoverage: allow get: if resource.data.missing == true;","a":"read 403 · coverage report with 4 expressions","r":"u"},{"t":"function","q":"reload rules, read twice, GET :ruleCoverage: allow get: if accept(resource.data.visible);","a":"read 200 · coverage report with 8 expressions","r":"u"},{"t":"unicode crlf","q":"reload rules, read twice, GET :ruleCoverage: allow get: if '中文🚀' == '中文🚀' && resource.data.visible;","a":"read 200 · coverage report with 5 expressions","r":"u"},{"t":"parentheses","q":"reload rules, read twice, GET :ruleCoverage: allow get: if (resource.data.visible == true) || false;","a":"read 200 · coverage report with 5 expressions","r":"u"},{"t":"unary","q":"reload rules, read twice, GET :ruleCoverage: allow get: if !resource.data.visible;","a":"read 403 · coverage report with 4 expressions","r":"u"},{"t":"index","q":"reload rules, read twice, GET :ruleCoverage: allow get: if resource.data['visible'];","a":"read 200 · coverage report with 3 expressions","r":"u"},{"t":"simple function","q":"reload rules, read twice, GET :ruleCoverage: allow get: if accept(resource.data.visible);","a":"read 200 · coverage report with 5 expressions","r":"u"},{"t":"path interpolation","q":"reload rules, read twice, GET :ruleCoverage: allow get: if exists(/databases/$(database)/documents/items/one);","a":"read 200 · coverage report with 3 expressions","r":"u"},{"t":"type check","q":"reload rules, read twice, GET :ruleCoverage: allow get: if resource.data.visible is bool;","a":"read 200 · coverage report with 4 expressions","r":"u"},{"t":"nested grouping","q":"reload rules, read twice, GET :ruleCoverage: allow get: if ((resource.data.visible));","a":"read 200 · coverage report with 3 expressions","r":"u"},{"t":"request","q":"reload rules, read twice, GET :ruleCoverage: allow get: if request.auth == null && request.method == \"get\";","a":"read 200 · coverage report with 7 expressions","r":"u"},{"t":"invalid reload","q":"PUT /emulator/v1/projects/{project}:securityRules (source \"broken\")","a":"400 INVALID_ARGUMENT: Error compiling rules: L1:1 mismatched input 'broken' expecting {'function', 'import', 'service', 'rules_version'}","r":"u"},{"t":"coverage after the rejected reload","q":"GET :ruleCoverage after the rejected reload","a":"coverage of the last valid rules, 7 expressions","r":"u"},{"t":"namespace name as a function parameter","q":"PUT :securityRules with function accept(duration)","a":"400 INVALID_ARGUMENT: Error compiling rules: L4:19 duration is a package and cannot be used as variable name.","r":"u"},{"t":"create typed","q":"PATCH /values/typed","a":"200 {name, fields, createTime, updateTime} · 2 evaluation messages","r":"u"},{"t":"get typed","q":"GET /values/typed","a":"200 {name, fields, createTime, updateTime} · 1 evaluation message","r":"u"},{"t":"get authenticated","q":"GET /values/typed (signed in)","a":"200 {name, fields, createTime, updateTime} · 1 evaluation message","r":"u"},{"t":"query","q":"POST :runQuery","a":"200 [1 item] · 1 evaluation message","r":"u"},{"t":"query unbounded","q":"POST :runQuery","a":"200 [1 item] · 1 evaluation message","r":"u"},{"t":"query group","q":"POST :runQuery","a":"403 PERMISSION_DENIED: No matching allow statements · 1 evaluation message","r":"u"},{"t":"query nested","q":"POST /parents/p:runQuery","a":"403 PERMISSION_DENIED: No matching allow statements · 1 evaluation message","r":"u"},{"t":"query nested group","q":"POST /parents/p:runQuery","a":"403 PERMISSION_DENIED: No matching allow statements · 1 evaluation message","r":"u"},{"t":"get mask","q":"GET /values/typed?mask.fieldPaths=yes&mask.fieldPaths=text","a":"200 {name, fields, createTime, updateTime} · 1 evaluation message","r":"u"},{"t":"patch mask","q":"PATCH /values/typed?updateMask.fieldPaths=text","a":"200 {name, fields, createTime, updateTime} · 2 evaluation messages","r":"u"},{"t":"patch quoted mask","q":"PATCH /values/typed?updateMask.fieldPaths=%60a.b%60&updateMask.fieldPaths=nested.active","a":"200 {name, fields, createTime, updateTime} · 2 evaluation messages","r":"u"},{"t":"commit transform","q":"POST :commit","a":"200 {writeResults, commitTime} · 2 evaluation messages","r":"u"},{"t":"batch get mask","q":"POST :batchGet","a":"200 [1 item] · 1 evaluation message","r":"u"},{"t":"begin read transaction","q":"POST :beginTransaction","a":"200 {transaction} · 0 evaluation messages","r":"u"},{"t":"transaction get","q":"POST :batchGet","a":"200 [1 item] · 1 evaluation message","r":"u"},{"t":"rollback","q":"POST :rollback","a":"200 {} · 0 evaluation messages","r":"u"},{"t":"begin write transaction","q":"POST :beginTransaction","a":"200 {transaction} · 0 evaluation messages","r":"u"},{"t":"write transaction get","q":"POST :batchGet","a":"200 [1 item] · 1 evaluation message","r":"u"},{"t":"write rollback","q":"POST :rollback","a":"200 {} · 0 evaluation messages","r":"u"},{"t":"commit replacement transform","q":"POST :commit","a":"200 {writeResults, commitTime} · 2 evaluation messages","r":"u"},{"t":"commit empty mask","q":"POST :commit","a":"200 {writeResults, commitTime} · 2 evaluation messages","r":"u"},{"t":"delete","q":"DELETE /values/typed","a":"200 {} · 1 evaluation message","r":"u"},{"t":"get missing","q":"GET /values/missing","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/values/missing) not found. · 1 evaluation message","r":"u"},{"t":"initial history","q":"connect to the requests websocket","a":"empty history","r":"u"},{"t":"evaluation request 1","q":"rules evaluation event 1","a":"allow create /databases/(default)/documents/values/typed","r":"u"},{"t":"evaluation request 2","q":"rules evaluation event 2","a":"allow update /databases/(default)/documents/values/typed","r":"u"},{"t":"evaluation request 3","q":"rules evaluation event 3","a":"allow get /databases/(default)/documents/values/typed","r":"u"},{"t":"evaluation request 4","q":"rules evaluation event 4","a":"allow get /databases/(default)/documents/values/typed","r":"u"},{"t":"evaluation request 5","q":"rules evaluation event 5","a":"allow list /databases/(default)/documents/values/*","r":"u"},{"t":"evaluation request 6","q":"rules evaluation event 6","a":"allow list /databases/(default)/documents/values/*","r":"u"},{"t":"evaluation request 7","q":"rules evaluation event 7","a":"deny list /databases/(default)/documents/**/values/*","r":"u"},{"t":"evaluation request 8","q":"rules evaluation event 8","a":"deny list /databases/(default)/documents/parents/p/values/*","r":"u"},{"t":"evaluation request 9","q":"rules evaluation event 9","a":"deny list /databases/(default)/documents/parents/p/**/values/*","r":"u"},{"t":"evaluation request 10","q":"rules evaluation event 10","a":"allow get /databases/(default)/documents/values/typed","r":"u"},{"t":"evaluation request 11","q":"rules evaluation event 11","a":"allow create /databases/(default)/documents/values/typed","r":"u"},{"t":"evaluation request 12","q":"rules evaluation event 12","a":"allow update /databases/(default)/documents/values/typed","r":"u"},{"t":"evaluation request 13","q":"rules evaluation event 13","a":"allow create /databases/(default)/documents/values/typed","r":"u"},{"t":"evaluation request 14","q":"rules evaluation event 14","a":"allow update /databases/(default)/documents/values/typed","r":"u"},{"t":"evaluation request 15","q":"rules evaluation event 15","a":"allow create /databases/(default)/documents/values/typed","r":"u"},{"t":"evaluation request 16","q":"rules evaluation event 16","a":"allow update /databases/(default)/documents/values/typed","r":"u"},{"t":"evaluation request 17","q":"rules evaluation event 17","a":"allow get /databases/(default)/documents/values/typed","r":"u"},{"t":"evaluation request 18","q":"rules evaluation event 18","a":"allow get /databases/(default)/documents/values/typed","r":"u"},{"t":"evaluation request 19","q":"rules evaluation event 19","a":"allow get /databases/(default)/documents/values/typed","r":"u"},{"t":"evaluation request 20","q":"rules evaluation event 20","a":"allow create /databases/(default)/documents/values/typed","r":"u"},{"t":"evaluation request 21","q":"rules evaluation event 21","a":"allow update /databases/(default)/documents/values/typed","r":"u"},{"t":"evaluation request 22","q":"rules evaluation event 22","a":"allow create /databases/(default)/documents/values/typed","r":"u"},{"t":"evaluation request 23","q":"rules evaluation event 23","a":"allow update /databases/(default)/documents/values/typed","r":"u"},{"t":"evaluation request 24","q":"rules evaluation event 24","a":"allow delete /databases/(default)/documents/values/typed","r":"u"},{"t":"evaluation request 25","q":"rules evaluation event 25","a":"allow get /databases/(default)/documents/values/missing","r":"u"},{"t":"create typed","q":"PATCH /values/typed","a":"200 {name, fields, createTime, updateTime} · 2 evaluation messages","r":"c","k":"status"},{"t":"get typed","q":"GET /values/typed","a":"200 {name, fields, createTime, updateTime} · 1 evaluation message","r":"u"},{"t":"get authenticated","q":"GET /values/typed (signed in)","a":"200 {name, fields, createTime, updateTime} · 1 evaluation message","r":"u"},{"t":"query","q":"POST :runQuery","a":"200 [1 item] · 1 evaluation message","r":"u"},{"t":"delete","q":"DELETE /values/typed","a":"200 {} · 1 evaluation message","r":"u"},{"t":"get missing","q":"GET /values/missing","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/values/missing) not found. · 1 evaluation message","r":"u"},{"t":"initial history","q":"connect to the requests websocket","a":"empty history","r":"u"},{"t":"evaluation request 1","q":"rules evaluation event 1","a":"allow create /databases/(default)/documents/values/typed","r":"u"},{"t":"evaluation request 2","q":"rules evaluation event 2","a":"allow update /databases/(default)/documents/values/typed","r":"u"},{"t":"evaluation request 3","q":"rules evaluation event 3","a":"allow get /databases/(default)/documents/values/typed","r":"u"},{"t":"evaluation request 4","q":"rules evaluation event 4","a":"allow get /databases/(default)/documents/values/typed","r":"u"},{"t":"evaluation request 5","q":"rules evaluation event 5","a":"allow list /databases/(default)/documents/values/*","r":"u"},{"t":"evaluation request 6","q":"rules evaluation event 6","a":"allow delete /databases/(default)/documents/values/typed","r":"u"},{"t":"evaluation request 7","q":"rules evaluation event 7","a":"allow get /databases/(default)/documents/values/missing","r":"u"},{"t":"anon/x on (default) over gRPC","q":"GetDocument anon/x on (default) as absent","a":"NOT_FOUND: Document (projects/{project}/databases/(default)/documents/anon/x) not found.","r":"c","k":"status"},{"t":"anon/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/anon/x as absent","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/anon/x) not found.","r":"c","k":"status"},{"t":"deny/x on (default) over gRPC","q":"GetDocument deny/x on (default) as owner","a":"NOT_FOUND: Document (projects/{project}/databases/(default)/documents/deny/x) not found.","r":"c","k":"status"},{"t":"deny/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/deny/x as owner","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/deny/x) not found.","r":"c","k":"status"},{"t":"anon/x on (default) over gRPC","q":"GetDocument anon/x on (default) as owner","a":"NOT_FOUND: Document (projects/{project}/databases/(default)/documents/anon/x) not found.","r":"c","k":"status"},{"t":"anon/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/anon/x as owner","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/anon/x) not found.","r":"c","k":"status"},{"t":"alice/x on (default) over gRPC","q":"GetDocument alice/x on (default) as owner","a":"NOT_FOUND: Document (projects/{project}/databases/(default)/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/alice/x as owner","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/alice/x) not found.","r":"c","k":"status"},{"t":"deny/x on (default) over gRPC","q":"GetDocument deny/x on (default) as owner-lowercase","a":"NOT_FOUND: Document (projects/{project}/databases/(default)/documents/deny/x) not found.","r":"c","k":"status"},{"t":"deny/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/deny/x as owner-lowercase","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/deny/x) not found.","r":"c","k":"status"},{"t":"anon/x on (default) over gRPC","q":"GetDocument anon/x on (default) as owner-lowercase","a":"NOT_FOUND: Document (projects/{project}/databases/(default)/documents/anon/x) not found.","r":"c","k":"status"},{"t":"anon/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/anon/x as owner-lowercase","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/anon/x) not found.","r":"c","k":"status"},{"t":"alice/x on (default) over gRPC","q":"GetDocument alice/x on (default) as owner-lowercase","a":"NOT_FOUND: Document (projects/{project}/databases/(default)/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/alice/x as owner-lowercase","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/alice/x) not found.","r":"c","k":"status"},{"t":"deny/x on (default) over gRPC","q":"GetDocument deny/x on (default) as owner-uppercase","a":"NOT_FOUND: Document (projects/{project}/databases/(default)/documents/deny/x) not found.","r":"c","k":"status"},{"t":"deny/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/deny/x as owner-uppercase","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/deny/x) not found.","r":"c","k":"status"},{"t":"anon/x on (default) over gRPC","q":"GetDocument anon/x on (default) as owner-uppercase","a":"NOT_FOUND: Document (projects/{project}/databases/(default)/documents/anon/x) not found.","r":"c","k":"status"},{"t":"anon/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/anon/x as owner-uppercase","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/anon/x) not found.","r":"c","k":"status"},{"t":"alice/x on (default) over gRPC","q":"GetDocument alice/x on (default) as owner-uppercase","a":"NOT_FOUND: Document (projects/{project}/databases/(default)/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/alice/x as owner-uppercase","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on (default) over gRPC","q":"GetDocument alice/x on (default) as user","a":"NOT_FOUND: Document (projects/{project}/databases/(default)/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/alice/x as user","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on (default) over gRPC","q":"GetDocument alice/x on (default) as user-lowercase-scheme","a":"NOT_FOUND: Document (projects/{project}/databases/(default)/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/alice/x as user-lowercase-scheme","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on (default) over gRPC","q":"GetDocument alice/x on (default) as issued-at-zero","a":"NOT_FOUND: Document (projects/{project}/databases/(default)/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/alice/x as issued-at-zero","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on (default) over gRPC","q":"GetDocument alice/x on (default) as issued-tomorrow","a":"NOT_FOUND: Document (projects/{project}/databases/(default)/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/alice/x as issued-tomorrow","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on (default) over gRPC","q":"GetDocument alice/x on (default) as other-project","a":"NOT_FOUND: Document (projects/{project}/databases/(default)/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/alice/x as other-project","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on (default) over gRPC","q":"GetDocument alice/x on (default) as other-audience","a":"NOT_FOUND: Document (projects/{project}/databases/(default)/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/alice/x as other-audience","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on (default) over gRPC","q":"GetDocument alice/x on (default) as sub-only","a":"NOT_FOUND: Document (projects/{project}/databases/(default)/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/alice/x as sub-only","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on (default) over gRPC","q":"GetDocument alice/x on (default) as no-alg","a":"NOT_FOUND: Document (projects/{project}/databases/(default)/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/alice/x as no-alg","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on (default) over gRPC","q":"GetDocument alice/x on (default) as signed","a":"NOT_FOUND: Document (projects/{project}/databases/(default)/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/alice/x as signed","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on (default) over gRPC","q":"GetDocument alice/x on (default) as padded-base64","a":"NOT_FOUND: Document (projects/{project}/databases/(default)/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/alice/x as padded-base64","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/alice/x) not found.","r":"c","k":"status"},{"t":"deny/x on (default) over gRPC","q":"GetDocument deny/x on (default) as two-segments","a":"INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"deny/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/deny/x as two-segments","a":"400 INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"anon/x on (default) over gRPC","q":"GetDocument anon/x on (default) as two-segments","a":"INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"anon/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/anon/x as two-segments","a":"400 INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"alice/x on (default) over gRPC","q":"GetDocument alice/x on (default) as two-segments","a":"INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"alice/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/alice/x as two-segments","a":"400 INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"deny/x on (default) over gRPC","q":"GetDocument deny/x on (default) as array-claims","a":"INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"deny/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/deny/x as array-claims","a":"400 INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"anon/x on (default) over gRPC","q":"GetDocument anon/x on (default) as array-claims","a":"INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"anon/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/anon/x as array-claims","a":"400 INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"alice/x on (default) over gRPC","q":"GetDocument alice/x on (default) as array-claims","a":"INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"alice/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/alice/x as array-claims","a":"400 INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"deny/x on (default) over gRPC","q":"GetDocument deny/x on (default) as not-a-jwt","a":"INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"deny/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/deny/x as not-a-jwt","a":"400 INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"anon/x on (default) over gRPC","q":"GetDocument anon/x on (default) as not-a-jwt","a":"INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"anon/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/anon/x as not-a-jwt","a":"400 INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"alice/x on (default) over gRPC","q":"GetDocument alice/x on (default) as not-a-jwt","a":"INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"alice/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/alice/x as not-a-jwt","a":"400 INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"anon/x on unlisted over gRPC","q":"GetDocument anon/x on unlisted as absent","a":"NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/anon/x) not found.","r":"c","k":"status"},{"t":"anon/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/anon/x as absent","a":"404 NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/anon/x) not found.","r":"c","k":"status"},{"t":"deny/x on unlisted over gRPC","q":"GetDocument deny/x on unlisted as owner","a":"NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/deny/x) not found.","r":"c","k":"status"},{"t":"deny/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/deny/x as owner","a":"404 NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/deny/x) not found.","r":"c","k":"status"},{"t":"anon/x on unlisted over gRPC","q":"GetDocument anon/x on unlisted as owner","a":"NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/anon/x) not found.","r":"c","k":"status"},{"t":"anon/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/anon/x as owner","a":"404 NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/anon/x) not found.","r":"c","k":"status"},{"t":"alice/x on unlisted over gRPC","q":"GetDocument alice/x on unlisted as owner","a":"NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/alice/x as owner","a":"404 NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/alice/x) not found.","r":"c","k":"status"},{"t":"deny/x on unlisted over gRPC","q":"GetDocument deny/x on unlisted as owner-lowercase","a":"NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/deny/x) not found.","r":"c","k":"status"},{"t":"deny/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/deny/x as owner-lowercase","a":"404 NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/deny/x) not found.","r":"c","k":"status"},{"t":"anon/x on unlisted over gRPC","q":"GetDocument anon/x on unlisted as owner-lowercase","a":"NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/anon/x) not found.","r":"c","k":"status"},{"t":"anon/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/anon/x as owner-lowercase","a":"404 NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/anon/x) not found.","r":"c","k":"status"},{"t":"alice/x on unlisted over gRPC","q":"GetDocument alice/x on unlisted as owner-lowercase","a":"NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/alice/x as owner-lowercase","a":"404 NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/alice/x) not found.","r":"c","k":"status"},{"t":"deny/x on unlisted over gRPC","q":"GetDocument deny/x on unlisted as owner-uppercase","a":"NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/deny/x) not found.","r":"c","k":"status"},{"t":"deny/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/deny/x as owner-uppercase","a":"404 NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/deny/x) not found.","r":"c","k":"status"},{"t":"anon/x on unlisted over gRPC","q":"GetDocument anon/x on unlisted as owner-uppercase","a":"NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/anon/x) not found.","r":"c","k":"status"},{"t":"anon/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/anon/x as owner-uppercase","a":"404 NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/anon/x) not found.","r":"c","k":"status"},{"t":"alice/x on unlisted over gRPC","q":"GetDocument alice/x on unlisted as owner-uppercase","a":"NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/alice/x as owner-uppercase","a":"404 NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on unlisted over gRPC","q":"GetDocument alice/x on unlisted as user","a":"NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/alice/x as user","a":"404 NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on unlisted over gRPC","q":"GetDocument alice/x on unlisted as user-lowercase-scheme","a":"NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/alice/x as user-lowercase-scheme","a":"404 NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on unlisted over gRPC","q":"GetDocument alice/x on unlisted as issued-at-zero","a":"NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/alice/x as issued-at-zero","a":"404 NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on unlisted over gRPC","q":"GetDocument alice/x on unlisted as issued-tomorrow","a":"NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/alice/x as issued-tomorrow","a":"404 NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on unlisted over gRPC","q":"GetDocument alice/x on unlisted as other-project","a":"NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/alice/x as other-project","a":"404 NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on unlisted over gRPC","q":"GetDocument alice/x on unlisted as other-audience","a":"NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/alice/x as other-audience","a":"404 NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on unlisted over gRPC","q":"GetDocument alice/x on unlisted as sub-only","a":"NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/alice/x as sub-only","a":"404 NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on unlisted over gRPC","q":"GetDocument alice/x on unlisted as no-alg","a":"NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/alice/x as no-alg","a":"404 NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on unlisted over gRPC","q":"GetDocument alice/x on unlisted as signed","a":"NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/alice/x as signed","a":"404 NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on unlisted over gRPC","q":"GetDocument alice/x on unlisted as padded-base64","a":"NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/alice/x) not found.","r":"c","k":"status"},{"t":"alice/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/alice/x as padded-base64","a":"404 NOT_FOUND: Document (projects/{project}/databases/unlisted/documents/alice/x) not found.","r":"c","k":"status"},{"t":"deny/x on unlisted over gRPC","q":"GetDocument deny/x on unlisted as two-segments","a":"INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"deny/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/deny/x as two-segments","a":"400 INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"anon/x on unlisted over gRPC","q":"GetDocument anon/x on unlisted as two-segments","a":"INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"anon/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/anon/x as two-segments","a":"400 INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"alice/x on unlisted over gRPC","q":"GetDocument alice/x on unlisted as two-segments","a":"INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"alice/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/alice/x as two-segments","a":"400 INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"deny/x on unlisted over gRPC","q":"GetDocument deny/x on unlisted as array-claims","a":"INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"deny/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/deny/x as array-claims","a":"400 INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"anon/x on unlisted over gRPC","q":"GetDocument anon/x on unlisted as array-claims","a":"INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"anon/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/anon/x as array-claims","a":"400 INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"alice/x on unlisted over gRPC","q":"GetDocument alice/x on unlisted as array-claims","a":"INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"alice/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/alice/x as array-claims","a":"400 INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"deny/x on unlisted over gRPC","q":"GetDocument deny/x on unlisted as not-a-jwt","a":"INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"deny/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/deny/x as not-a-jwt","a":"400 INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"anon/x on unlisted over gRPC","q":"GetDocument anon/x on unlisted as not-a-jwt","a":"INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"anon/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/anon/x as not-a-jwt","a":"400 INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"alice/x on unlisted over gRPC","q":"GetDocument alice/x on unlisted as not-a-jwt","a":"INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"alice/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/alice/x as not-a-jwt","a":"400 INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"uid-null/x","q":"GET uid-null/x as absent","a":"403 PERMISSION_DENIED: false for 'get' @ L7","r":"c","k":"status"},{"t":"token-sub/x","q":"GET token-sub/x as absent","a":"403 PERMISSION_DENIED: Null value error. for 'get' @ L8, Null value error. for 'get' @ L8","r":"c","k":"status"},{"t":"token-keys/x","q":"GET token-keys/x as absent","a":"403 PERMISSION_DENIED: Null value error. for 'get' @ L9, Null value error. for 'get' @ L9","r":"c","k":"status"},{"t":"uid-null/x","q":"GET uid-null/x as owner","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/uid-null/x) not found.","r":"c","k":"status"},{"t":"token-sub/x","q":"GET token-sub/x as owner","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/token-sub/x) not found.","r":"c","k":"status"},{"t":"token-keys/x","q":"GET token-keys/x as owner","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/token-keys/x) not found.","r":"c","k":"status"},{"t":"uid-null/x","q":"GET uid-null/x as owner-lowercase","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/uid-null/x) not found.","r":"c","k":"status"},{"t":"token-sub/x","q":"GET token-sub/x as owner-lowercase","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/token-sub/x) not found.","r":"c","k":"status"},{"t":"token-keys/x","q":"GET token-keys/x as owner-lowercase","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/token-keys/x) not found.","r":"c","k":"status"},{"t":"uid-null/x","q":"GET uid-null/x as owner-uppercase","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/uid-null/x) not found.","r":"c","k":"status"},{"t":"token-sub/x","q":"GET token-sub/x as owner-uppercase","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/token-sub/x) not found.","r":"c","k":"status"},{"t":"token-keys/x","q":"GET token-keys/x as owner-uppercase","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/token-keys/x) not found.","r":"c","k":"status"},{"t":"uid-null/x","q":"GET uid-null/x as user","a":"403 PERMISSION_DENIED: false for 'get' @ L7","r":"c","k":"status"},{"t":"token-sub/x","q":"GET token-sub/x as user","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/token-sub/x) not found.","r":"c","k":"status"},{"t":"token-keys/x","q":"GET token-keys/x as user","a":"403 PERMISSION_DENIED: false for 'get' @ L9","r":"c","k":"status"},{"t":"uid-null/x","q":"GET uid-null/x as user-lowercase-scheme","a":"403 PERMISSION_DENIED: false for 'get' @ L7","r":"c","k":"status"},{"t":"token-sub/x","q":"GET token-sub/x as user-lowercase-scheme","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/token-sub/x) not found.","r":"c","k":"status"},{"t":"token-keys/x","q":"GET token-keys/x as user-lowercase-scheme","a":"403 PERMISSION_DENIED: false for 'get' @ L9","r":"c","k":"status"},{"t":"uid-null/x","q":"GET uid-null/x as issued-at-zero","a":"403 PERMISSION_DENIED: false for 'get' @ L7","r":"c","k":"status"},{"t":"token-sub/x","q":"GET token-sub/x as issued-at-zero","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/token-sub/x) not found.","r":"c","k":"status"},{"t":"token-keys/x","q":"GET token-keys/x as issued-at-zero","a":"403 PERMISSION_DENIED: false for 'get' @ L9","r":"c","k":"status"},{"t":"uid-null/x","q":"GET uid-null/x as issued-tomorrow","a":"403 PERMISSION_DENIED: false for 'get' @ L7","r":"c","k":"status"},{"t":"token-sub/x","q":"GET token-sub/x as issued-tomorrow","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/token-sub/x) not found.","r":"c","k":"status"},{"t":"token-keys/x","q":"GET token-keys/x as issued-tomorrow","a":"403 PERMISSION_DENIED: false for 'get' @ L9","r":"c","k":"status"},{"t":"uid-null/x","q":"GET uid-null/x as other-project","a":"403 PERMISSION_DENIED: false for 'get' @ L7","r":"c","k":"status"},{"t":"token-sub/x","q":"GET token-sub/x as other-project","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/token-sub/x) not found.","r":"c","k":"status"},{"t":"token-keys/x","q":"GET token-keys/x as other-project","a":"403 PERMISSION_DENIED: false for 'get' @ L9","r":"c","k":"status"},{"t":"uid-null/x","q":"GET uid-null/x as other-audience","a":"403 PERMISSION_DENIED: false for 'get' @ L7","r":"c","k":"status"},{"t":"token-sub/x","q":"GET token-sub/x as other-audience","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/token-sub/x) not found.","r":"c","k":"status"},{"t":"token-keys/x","q":"GET token-keys/x as other-audience","a":"403 PERMISSION_DENIED: false for 'get' @ L9","r":"c","k":"status"},{"t":"uid-null/x","q":"GET uid-null/x as sub-only","a":"403 PERMISSION_DENIED: false for 'get' @ L7","r":"c","k":"status"},{"t":"token-sub/x","q":"GET token-sub/x as sub-only","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/token-sub/x) not found.","r":"c","k":"status"},{"t":"token-keys/x","q":"GET token-keys/x as sub-only","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/token-keys/x) not found.","r":"c","k":"status"},{"t":"uid-null/x","q":"GET uid-null/x as user-id-only","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/uid-null/x) not found.","r":"c","k":"status"},{"t":"token-sub/x","q":"GET token-sub/x as user-id-only","a":"403 PERMISSION_DENIED: Property sub is undefined on object. for 'get' @ L8, Property sub is undefined on object. for 'get' @ L8","r":"c","k":"status"},{"t":"token-keys/x","q":"GET token-keys/x as user-id-only","a":"403 PERMISSION_DENIED: false for 'get' @ L9","r":"c","k":"status"},{"t":"uid-null/x","q":"GET uid-null/x as empty-claims","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/uid-null/x) not found.","r":"c","k":"status"},{"t":"token-sub/x","q":"GET token-sub/x as empty-claims","a":"403 PERMISSION_DENIED: Property sub is undefined on object. for 'get' @ L8, Property sub is undefined on object. for 'get' @ L8","r":"c","k":"status"},{"t":"token-keys/x","q":"GET token-keys/x as empty-claims","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/token-keys/x) not found.","r":"c","k":"status"},{"t":"uid-null/x","q":"GET uid-null/x as numeric-sub","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/uid-null/x) not found.","r":"c","k":"status"},{"t":"token-sub/x","q":"GET token-sub/x as numeric-sub","a":"403 PERMISSION_DENIED: false for 'get' @ L8","r":"c","k":"status"},{"t":"token-keys/x","q":"GET token-keys/x as numeric-sub","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/token-keys/x) not found.","r":"c","k":"status"},{"t":"uid-null/x","q":"GET uid-null/x as no-alg","a":"403 PERMISSION_DENIED: false for 'get' @ L7","r":"c","k":"status"},{"t":"token-sub/x","q":"GET token-sub/x as no-alg","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/token-sub/x) not found.","r":"c","k":"status"},{"t":"token-keys/x","q":"GET token-keys/x as no-alg","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/token-keys/x) not found.","r":"c","k":"status"},{"t":"uid-null/x","q":"GET uid-null/x as signed","a":"403 PERMISSION_DENIED: false for 'get' @ L7","r":"c","k":"status"},{"t":"token-sub/x","q":"GET token-sub/x as signed","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/token-sub/x) not found.","r":"c","k":"status"},{"t":"token-keys/x","q":"GET token-keys/x as signed","a":"403 PERMISSION_DENIED: false for 'get' @ L9","r":"c","k":"status"},{"t":"uid-null/x","q":"GET uid-null/x as padded-base64","a":"403 PERMISSION_DENIED: false for 'get' @ L7","r":"c","k":"status"},{"t":"token-sub/x","q":"GET token-sub/x as padded-base64","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/token-sub/x) not found.","r":"c","k":"status"},{"t":"token-keys/x","q":"GET token-keys/x as padded-base64","a":"404 NOT_FOUND: Document (projects/{project}/databases/(default)/documents/token-keys/x) not found.","r":"c","k":"status"},{"t":"uid-null/x","q":"GET uid-null/x as two-segments","a":"400 INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"token-sub/x","q":"GET token-sub/x as two-segments","a":"400 INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"token-keys/x","q":"GET token-keys/x as two-segments","a":"400 INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"uid-null/x","q":"GET uid-null/x as array-claims","a":"400 INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"token-sub/x","q":"GET token-sub/x as array-claims","a":"400 INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"token-keys/x","q":"GET token-keys/x as array-claims","a":"400 INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"uid-null/x","q":"GET uid-null/x as not-a-jwt","a":"400 INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"token-sub/x","q":"GET token-sub/x as not-a-jwt","a":"400 INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"token-keys/x","q":"GET token-keys/x as not-a-jwt","a":"400 INVALID_ARGUMENT: invalid jwt","r":"c","k":"status"},{"t":"ListCollectionIds over gRPC (rules, absent)","q":"ListCollectionIds as absent (with rules)","a":"PERMISSION_DENIED: Metadata operations require admin authentication.","r":"c","k":"error"},{"t":"listCollectionIds over REST (rules, absent)","q":"POST :listCollectionIds as absent (with rules)","a":"403 PERMISSION_DENIED: Metadata operations require admin authentication.","r":"c","k":"status"},{"t":"ListCollectionIds over gRPC (rules, user)","q":"ListCollectionIds as user (with rules)","a":"PERMISSION_DENIED: Metadata operations require admin authentication.","r":"c","k":"error"},{"t":"listCollectionIds over REST (rules, user)","q":"POST :listCollectionIds as user (with rules)","a":"403 PERMISSION_DENIED: Metadata operations require admin authentication.","r":"c","k":"status"},{"t":"ListCollectionIds over gRPC (rules, owner)","q":"ListCollectionIds as owner (with rules)","a":"OK","r":"c","k":"status"},{"t":"listCollectionIds over REST (rules, owner)","q":"POST :listCollectionIds as owner (with rules)","a":"200","r":"c","k":"status"},{"t":"ListCollectionIds over gRPC (open, absent)","q":"ListCollectionIds as absent (no rules)","a":"PERMISSION_DENIED: Metadata operations require admin authentication.","r":"c","k":"error"},{"t":"listCollectionIds over REST (open, absent)","q":"POST :listCollectionIds as absent (no rules)","a":"403 PERMISSION_DENIED: Metadata operations require admin authentication.","r":"c","k":"status"},{"t":"ListCollectionIds over gRPC (open, user)","q":"ListCollectionIds as user (no rules)","a":"PERMISSION_DENIED: Metadata operations require admin authentication.","r":"c","k":"error"},{"t":"listCollectionIds over REST (open, user)","q":"POST :listCollectionIds as user (no rules)","a":"403 PERMISSION_DENIED: Metadata operations require admin authentication.","r":"c","k":"status"},{"t":"ListCollectionIds over gRPC (open, owner)","q":"ListCollectionIds as owner (no rules)","a":"OK","r":"c","k":"status"},{"t":"listCollectionIds over REST (open, owner)","q":"POST :listCollectionIds as owner (no rules)","a":"200","r":"c","k":"status"},{"t":"pipeline as owner","q":"Enterprise ExecutePipeline as owner","a":"OK","r":"c","k":"status"},{"t":"query as owner","q":"Enterprise RunQuery as owner","a":"OK","r":"c","k":"status"},{"t":"json","q":"PUT /emulator/v1/projects/…:securityRules (json body)","a":"200 · the new rules then govern a read (403)","r":"c","k":"answer"},{"t":"text plain","q":"PUT /emulator/v1/projects/…:securityRules (text-plain body)","a":"200 · the new rules then govern a read (403)","r":"c","k":"answer"},{"t":"no content type","q":"PUT /emulator/v1/projects/…:securityRules (no-content-type body)","a":"200 · the new rules then govern a read (403)","r":"c","k":"answer"},{"t":"deny/x on (default) over gRPC","q":"GetDocument deny/x on (default) as absent","a":"PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/deny/x as absent","a":"403 PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"alice/x on (default) over gRPC","q":"GetDocument alice/x on (default) as absent","a":"PERMISSION_DENIED: Null value error. for 'get' @ L6, Null value error. for 'get' @ L6","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"alice/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/alice/x as absent","a":"403 PERMISSION_DENIED: Null value error. for 'get' @ L6, Null value error. for 'get' @ L6","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on (default) over gRPC","q":"GetDocument deny/x on (default) as user","a":"PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/deny/x as user","a":"403 PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on (default) over gRPC","q":"GetDocument anon/x on (default) as user","a":"PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/anon/x as user","a":"403 PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on (default) over gRPC","q":"GetDocument deny/x on (default) as user-lowercase-scheme","a":"PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/deny/x as user-lowercase-scheme","a":"403 PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on (default) over gRPC","q":"GetDocument anon/x on (default) as user-lowercase-scheme","a":"PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/anon/x as user-lowercase-scheme","a":"403 PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on (default) over gRPC","q":"GetDocument deny/x on (default) as issued-at-zero","a":"PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/deny/x as issued-at-zero","a":"403 PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on (default) over gRPC","q":"GetDocument anon/x on (default) as issued-at-zero","a":"PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/anon/x as issued-at-zero","a":"403 PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on (default) over gRPC","q":"GetDocument deny/x on (default) as issued-tomorrow","a":"PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/deny/x as issued-tomorrow","a":"403 PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on (default) over gRPC","q":"GetDocument anon/x on (default) as issued-tomorrow","a":"PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/anon/x as issued-tomorrow","a":"403 PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on (default) over gRPC","q":"GetDocument deny/x on (default) as other-project","a":"PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/deny/x as other-project","a":"403 PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on (default) over gRPC","q":"GetDocument anon/x on (default) as other-project","a":"PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/anon/x as other-project","a":"403 PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on (default) over gRPC","q":"GetDocument deny/x on (default) as other-audience","a":"PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/deny/x as other-audience","a":"403 PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on (default) over gRPC","q":"GetDocument anon/x on (default) as other-audience","a":"PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/anon/x as other-audience","a":"403 PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on (default) over gRPC","q":"GetDocument deny/x on (default) as sub-only","a":"PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/deny/x as sub-only","a":"403 PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on (default) over gRPC","q":"GetDocument anon/x on (default) as sub-only","a":"PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/anon/x as sub-only","a":"403 PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on (default) over gRPC","q":"GetDocument deny/x on (default) as user-id-only","a":"PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/deny/x as user-id-only","a":"403 PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on (default) over gRPC","q":"GetDocument anon/x on (default) as user-id-only","a":"PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/anon/x as user-id-only","a":"403 PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"alice/x on (default) over gRPC","q":"GetDocument alice/x on (default) as user-id-only","a":"PERMISSION_DENIED: false for 'get' @ L6","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"alice/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/alice/x as user-id-only","a":"403 PERMISSION_DENIED: false for 'get' @ L6","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on (default) over gRPC","q":"GetDocument deny/x on (default) as empty-claims","a":"PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/deny/x as empty-claims","a":"403 PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on (default) over gRPC","q":"GetDocument anon/x on (default) as empty-claims","a":"PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/anon/x as empty-claims","a":"403 PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"alice/x on (default) over gRPC","q":"GetDocument alice/x on (default) as empty-claims","a":"PERMISSION_DENIED: false for 'get' @ L6","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"alice/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/alice/x as empty-claims","a":"403 PERMISSION_DENIED: false for 'get' @ L6","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on (default) over gRPC","q":"GetDocument deny/x on (default) as numeric-sub","a":"PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/deny/x as numeric-sub","a":"403 PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on (default) over gRPC","q":"GetDocument anon/x on (default) as numeric-sub","a":"PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/anon/x as numeric-sub","a":"403 PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"alice/x on (default) over gRPC","q":"GetDocument alice/x on (default) as numeric-sub","a":"PERMISSION_DENIED: false for 'get' @ L6","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"alice/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/alice/x as numeric-sub","a":"403 PERMISSION_DENIED: false for 'get' @ L6","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on (default) over gRPC","q":"GetDocument deny/x on (default) as no-alg","a":"PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/deny/x as no-alg","a":"403 PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on (default) over gRPC","q":"GetDocument anon/x on (default) as no-alg","a":"PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/anon/x as no-alg","a":"403 PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on (default) over gRPC","q":"GetDocument deny/x on (default) as signed","a":"PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/deny/x as signed","a":"403 PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on (default) over gRPC","q":"GetDocument anon/x on (default) as signed","a":"PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/anon/x as signed","a":"403 PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on (default) over gRPC","q":"GetDocument deny/x on (default) as padded-base64","a":"PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/deny/x as padded-base64","a":"403 PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on (default) over gRPC","q":"GetDocument anon/x on (default) as padded-base64","a":"PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/anon/x as padded-base64","a":"403 PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on (default) over gRPC","q":"GetDocument deny/x on (default) as basic","a":"UNKNOWN","r":"d","k":"status","w":"a credential that is not a Bearer token is refused as INVALID_ARGUMENT, where the official emulator answers an empty UNKNOWN"},{"t":"deny/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/deny/x as basic","a":"500 UNKNOWN: {\"error\":{\"code\":500,\"status\":\"UNKNOWN\"}}","r":"d","k":"status","w":"a credential that is not a Bearer token is refused as INVALID_ARGUMENT, where the official emulator answers an empty UNKNOWN"},{"t":"anon/x on (default) over gRPC","q":"GetDocument anon/x on (default) as basic","a":"UNKNOWN","r":"d","k":"status","w":"a credential that is not a Bearer token is refused as INVALID_ARGUMENT, where the official emulator answers an empty UNKNOWN"},{"t":"anon/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/anon/x as basic","a":"500 UNKNOWN: {\"error\":{\"code\":500,\"status\":\"UNKNOWN\"}}","r":"d","k":"status","w":"a credential that is not a Bearer token is refused as INVALID_ARGUMENT, where the official emulator answers an empty UNKNOWN"},{"t":"alice/x on (default) over gRPC","q":"GetDocument alice/x on (default) as basic","a":"UNKNOWN","r":"d","k":"status","w":"a credential that is not a Bearer token is refused as INVALID_ARGUMENT, where the official emulator answers an empty UNKNOWN"},{"t":"alice/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/alice/x as basic","a":"500 UNKNOWN: {\"error\":{\"code\":500,\"status\":\"UNKNOWN\"}}","r":"d","k":"status","w":"a credential that is not a Bearer token is refused as INVALID_ARGUMENT, where the official emulator answers an empty UNKNOWN"},{"t":"deny/x on (default) over gRPC","q":"GetDocument deny/x on (default) as firebase-owner","a":"UNKNOWN","r":"d","k":"status","w":"a credential that is not a Bearer token is refused as INVALID_ARGUMENT, where the official emulator answers an empty UNKNOWN"},{"t":"deny/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/deny/x as firebase-owner","a":"500 UNKNOWN: {\"error\":{\"code\":500,\"status\":\"UNKNOWN\"}}","r":"d","k":"status","w":"a credential that is not a Bearer token is refused as INVALID_ARGUMENT, where the official emulator answers an empty UNKNOWN"},{"t":"anon/x on (default) over gRPC","q":"GetDocument anon/x on (default) as firebase-owner","a":"UNKNOWN","r":"d","k":"status","w":"a credential that is not a Bearer token is refused as INVALID_ARGUMENT, where the official emulator answers an empty UNKNOWN"},{"t":"anon/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/anon/x as firebase-owner","a":"500 UNKNOWN: {\"error\":{\"code\":500,\"status\":\"UNKNOWN\"}}","r":"d","k":"status","w":"a credential that is not a Bearer token is refused as INVALID_ARGUMENT, where the official emulator answers an empty UNKNOWN"},{"t":"alice/x on (default) over gRPC","q":"GetDocument alice/x on (default) as firebase-owner","a":"UNKNOWN","r":"d","k":"status","w":"a credential that is not a Bearer token is refused as INVALID_ARGUMENT, where the official emulator answers an empty UNKNOWN"},{"t":"alice/x on (default) over REST","q":"GET /v1/…/databases/(default)/documents/alice/x as firebase-owner","a":"500 UNKNOWN: {\"error\":{\"code\":500,\"status\":\"UNKNOWN\"}}","r":"d","k":"status","w":"a credential that is not a Bearer token is refused as INVALID_ARGUMENT, where the official emulator answers an empty UNKNOWN"},{"t":"deny/x on unlisted over gRPC","q":"GetDocument deny/x on unlisted as absent","a":"PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/deny/x as absent","a":"403 PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"alice/x on unlisted over gRPC","q":"GetDocument alice/x on unlisted as absent","a":"PERMISSION_DENIED: Null value error. for 'get' @ L6, Null value error. for 'get' @ L6","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"alice/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/alice/x as absent","a":"403 PERMISSION_DENIED: Null value error. for 'get' @ L6, Null value error. for 'get' @ L6","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on unlisted over gRPC","q":"GetDocument deny/x on unlisted as user","a":"PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/deny/x as user","a":"403 PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on unlisted over gRPC","q":"GetDocument anon/x on unlisted as user","a":"PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/anon/x as user","a":"403 PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on unlisted over gRPC","q":"GetDocument deny/x on unlisted as user-lowercase-scheme","a":"PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/deny/x as user-lowercase-scheme","a":"403 PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on unlisted over gRPC","q":"GetDocument anon/x on unlisted as user-lowercase-scheme","a":"PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/anon/x as user-lowercase-scheme","a":"403 PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on unlisted over gRPC","q":"GetDocument deny/x on unlisted as issued-at-zero","a":"PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/deny/x as issued-at-zero","a":"403 PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on unlisted over gRPC","q":"GetDocument anon/x on unlisted as issued-at-zero","a":"PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/anon/x as issued-at-zero","a":"403 PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on unlisted over gRPC","q":"GetDocument deny/x on unlisted as issued-tomorrow","a":"PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/deny/x as issued-tomorrow","a":"403 PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on unlisted over gRPC","q":"GetDocument anon/x on unlisted as issued-tomorrow","a":"PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/anon/x as issued-tomorrow","a":"403 PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on unlisted over gRPC","q":"GetDocument deny/x on unlisted as other-project","a":"PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/deny/x as other-project","a":"403 PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on unlisted over gRPC","q":"GetDocument anon/x on unlisted as other-project","a":"PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/anon/x as other-project","a":"403 PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on unlisted over gRPC","q":"GetDocument deny/x on unlisted as other-audience","a":"PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/deny/x as other-audience","a":"403 PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on unlisted over gRPC","q":"GetDocument anon/x on unlisted as other-audience","a":"PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/anon/x as other-audience","a":"403 PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on unlisted over gRPC","q":"GetDocument deny/x on unlisted as sub-only","a":"PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/deny/x as sub-only","a":"403 PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on unlisted over gRPC","q":"GetDocument anon/x on unlisted as sub-only","a":"PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/anon/x as sub-only","a":"403 PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on unlisted over gRPC","q":"GetDocument deny/x on unlisted as user-id-only","a":"PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/deny/x as user-id-only","a":"403 PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on unlisted over gRPC","q":"GetDocument anon/x on unlisted as user-id-only","a":"PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/anon/x as user-id-only","a":"403 PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"alice/x on unlisted over gRPC","q":"GetDocument alice/x on unlisted as user-id-only","a":"PERMISSION_DENIED: false for 'get' @ L6","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"alice/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/alice/x as user-id-only","a":"403 PERMISSION_DENIED: false for 'get' @ L6","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on unlisted over gRPC","q":"GetDocument deny/x on unlisted as empty-claims","a":"PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/deny/x as empty-claims","a":"403 PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on unlisted over gRPC","q":"GetDocument anon/x on unlisted as empty-claims","a":"PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/anon/x as empty-claims","a":"403 PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"alice/x on unlisted over gRPC","q":"GetDocument alice/x on unlisted as empty-claims","a":"PERMISSION_DENIED: false for 'get' @ L6","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"alice/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/alice/x as empty-claims","a":"403 PERMISSION_DENIED: false for 'get' @ L6","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on unlisted over gRPC","q":"GetDocument deny/x on unlisted as numeric-sub","a":"PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/deny/x as numeric-sub","a":"403 PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on unlisted over gRPC","q":"GetDocument anon/x on unlisted as numeric-sub","a":"PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/anon/x as numeric-sub","a":"403 PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"alice/x on unlisted over gRPC","q":"GetDocument alice/x on unlisted as numeric-sub","a":"PERMISSION_DENIED: false for 'get' @ L6","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"alice/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/alice/x as numeric-sub","a":"403 PERMISSION_DENIED: false for 'get' @ L6","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on unlisted over gRPC","q":"GetDocument deny/x on unlisted as no-alg","a":"PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/deny/x as no-alg","a":"403 PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on unlisted over gRPC","q":"GetDocument anon/x on unlisted as no-alg","a":"PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/anon/x as no-alg","a":"403 PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on unlisted over gRPC","q":"GetDocument deny/x on unlisted as signed","a":"PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/deny/x as signed","a":"403 PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on unlisted over gRPC","q":"GetDocument anon/x on unlisted as signed","a":"PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/anon/x as signed","a":"403 PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on unlisted over gRPC","q":"GetDocument deny/x on unlisted as padded-base64","a":"PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/deny/x as padded-base64","a":"403 PERMISSION_DENIED: false for 'get' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on unlisted over gRPC","q":"GetDocument anon/x on unlisted as padded-base64","a":"PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"anon/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/anon/x as padded-base64","a":"403 PERMISSION_DENIED: false for 'get' @ L5","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"deny/x on unlisted over gRPC","q":"GetDocument deny/x on unlisted as basic","a":"UNKNOWN","r":"d","k":"status","w":"a credential that is not a Bearer token is refused as INVALID_ARGUMENT, where the official emulator answers an empty UNKNOWN"},{"t":"deny/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/deny/x as basic","a":"500 UNKNOWN: {\"error\":{\"code\":500,\"status\":\"UNKNOWN\"}}","r":"d","k":"status","w":"a credential that is not a Bearer token is refused as INVALID_ARGUMENT, where the official emulator answers an empty UNKNOWN"},{"t":"anon/x on unlisted over gRPC","q":"GetDocument anon/x on unlisted as basic","a":"UNKNOWN","r":"d","k":"status","w":"a credential that is not a Bearer token is refused as INVALID_ARGUMENT, where the official emulator answers an empty UNKNOWN"},{"t":"anon/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/anon/x as basic","a":"500 UNKNOWN: {\"error\":{\"code\":500,\"status\":\"UNKNOWN\"}}","r":"d","k":"status","w":"a credential that is not a Bearer token is refused as INVALID_ARGUMENT, where the official emulator answers an empty UNKNOWN"},{"t":"alice/x on unlisted over gRPC","q":"GetDocument alice/x on unlisted as basic","a":"UNKNOWN","r":"d","k":"status","w":"a credential that is not a Bearer token is refused as INVALID_ARGUMENT, where the official emulator answers an empty UNKNOWN"},{"t":"alice/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/alice/x as basic","a":"500 UNKNOWN: {\"error\":{\"code\":500,\"status\":\"UNKNOWN\"}}","r":"d","k":"status","w":"a credential that is not a Bearer token is refused as INVALID_ARGUMENT, where the official emulator answers an empty UNKNOWN"},{"t":"deny/x on unlisted over gRPC","q":"GetDocument deny/x on unlisted as firebase-owner","a":"UNKNOWN","r":"d","k":"status","w":"a credential that is not a Bearer token is refused as INVALID_ARGUMENT, where the official emulator answers an empty UNKNOWN"},{"t":"deny/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/deny/x as firebase-owner","a":"500 UNKNOWN: {\"error\":{\"code\":500,\"status\":\"UNKNOWN\"}}","r":"d","k":"status","w":"a credential that is not a Bearer token is refused as INVALID_ARGUMENT, where the official emulator answers an empty UNKNOWN"},{"t":"anon/x on unlisted over gRPC","q":"GetDocument anon/x on unlisted as firebase-owner","a":"UNKNOWN","r":"d","k":"status","w":"a credential that is not a Bearer token is refused as INVALID_ARGUMENT, where the official emulator answers an empty UNKNOWN"},{"t":"anon/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/anon/x as firebase-owner","a":"500 UNKNOWN: {\"error\":{\"code\":500,\"status\":\"UNKNOWN\"}}","r":"d","k":"status","w":"a credential that is not a Bearer token is refused as INVALID_ARGUMENT, where the official emulator answers an empty UNKNOWN"},{"t":"alice/x on unlisted over gRPC","q":"GetDocument alice/x on unlisted as firebase-owner","a":"UNKNOWN","r":"d","k":"status","w":"a credential that is not a Bearer token is refused as INVALID_ARGUMENT, where the official emulator answers an empty UNKNOWN"},{"t":"alice/x on unlisted over REST","q":"GET /v1/…/databases/unlisted/documents/alice/x as firebase-owner","a":"500 UNKNOWN: {\"error\":{\"code\":500,\"status\":\"UNKNOWN\"}}","r":"d","k":"status","w":"a credential that is not a Bearer token is refused as INVALID_ARGUMENT, where the official emulator answers an empty UNKNOWN"},{"t":"uid-null/x","q":"GET uid-null/x as basic","a":"500 UNKNOWN: {\"error\":{\"code\":500,\"status\":\"UNKNOWN\"}}","r":"d","k":"status","w":"a credential that is not a Bearer token is refused as INVALID_ARGUMENT, where the official emulator answers an empty UNKNOWN"},{"t":"token-sub/x","q":"GET token-sub/x as basic","a":"500 UNKNOWN: {\"error\":{\"code\":500,\"status\":\"UNKNOWN\"}}","r":"d","k":"status","w":"a credential that is not a Bearer token is refused as INVALID_ARGUMENT, where the official emulator answers an empty UNKNOWN"},{"t":"token-keys/x","q":"GET token-keys/x as basic","a":"500 UNKNOWN: {\"error\":{\"code\":500,\"status\":\"UNKNOWN\"}}","r":"d","k":"status","w":"a credential that is not a Bearer token is refused as INVALID_ARGUMENT, where the official emulator answers an empty UNKNOWN"},{"t":"uid-null/x","q":"GET uid-null/x as firebase-owner","a":"500 UNKNOWN: {\"error\":{\"code\":500,\"status\":\"UNKNOWN\"}}","r":"d","k":"status","w":"a credential that is not a Bearer token is refused as INVALID_ARGUMENT, where the official emulator answers an empty UNKNOWN"},{"t":"token-sub/x","q":"GET token-sub/x as firebase-owner","a":"500 UNKNOWN: {\"error\":{\"code\":500,\"status\":\"UNKNOWN\"}}","r":"d","k":"status","w":"a credential that is not a Bearer token is refused as INVALID_ARGUMENT, where the official emulator answers an empty UNKNOWN"},{"t":"token-keys/x","q":"GET token-keys/x as firebase-owner","a":"500 UNKNOWN: {\"error\":{\"code\":500,\"status\":\"UNKNOWN\"}}","r":"d","k":"status","w":"a credential that is not a Bearer token is refused as INVALID_ARGUMENT, where the official emulator answers an empty UNKNOWN"},{"t":"twoAllows over gRPC","q":"read refused by rules (twoAllows)","a":"PERMISSION_DENIED: false for 'get' @ L11, false for 'get' @ L12","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"twoAllows over REST","q":"read refused by rules (twoAllows)","a":"403 PERMISSION_DENIED: false for 'get' @ L11, false for 'get' @ L12","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"noMatchingAllow over gRPC","q":"read refused by rules (noMatchingAllow)","a":"PERMISSION_DENIED: No matching allow statements","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"noMatchingAllow over REST","q":"read refused by rules (noMatchingAllow)","a":"403 PERMISSION_DENIED: No matching allow statements","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"create over REST","q":"create refused by rules (create)","a":"403 PERMISSION_DENIED: false for 'create' @ L14","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"PartitionQuery over gRPC (rules, absent)","q":"PartitionQuery as absent (with rules)","a":"UNIMPLEMENTED: Method google.firestore.v1.Firestore/PartitionQuery is unimplemented","r":"d","k":"status","w":"the official emulator does not implement PartitionQuery; Firenook answers it for the owner, as the Admin SDKs' getPartitions() asks it"},{"t":"PartitionQuery over gRPC (rules, user)","q":"PartitionQuery as user (with rules)","a":"UNIMPLEMENTED: Method google.firestore.v1.Firestore/PartitionQuery is unimplemented","r":"d","k":"status","w":"the official emulator does not implement PartitionQuery; Firenook answers it for the owner, as the Admin SDKs' getPartitions() asks it"},{"t":"PartitionQuery over gRPC (rules, owner)","q":"PartitionQuery as owner (with rules)","a":"UNIMPLEMENTED: Method google.firestore.v1.Firestore/PartitionQuery is unimplemented","r":"d","k":"status","w":"the official emulator does not implement PartitionQuery; Firenook answers it for the owner, as the Admin SDKs' getPartitions() asks it"},{"t":"PartitionQuery over gRPC (open, absent)","q":"PartitionQuery as absent (no rules)","a":"UNIMPLEMENTED: Method google.firestore.v1.Firestore/PartitionQuery is unimplemented","r":"d","k":"status","w":"the official emulator does not implement PartitionQuery; Firenook answers it for the owner, as the Admin SDKs' getPartitions() asks it"},{"t":"PartitionQuery over gRPC (open, user)","q":"PartitionQuery as user (no rules)","a":"UNIMPLEMENTED: Method google.firestore.v1.Firestore/PartitionQuery is unimplemented","r":"d","k":"status","w":"the official emulator does not implement PartitionQuery; Firenook answers it for the owner, as the Admin SDKs' getPartitions() asks it"},{"t":"PartitionQuery over gRPC (open, owner)","q":"PartitionQuery as owner (no rules)","a":"UNIMPLEMENTED: Method google.firestore.v1.Firestore/PartitionQuery is unimplemented","r":"d","k":"status","w":"the official emulator does not implement PartitionQuery; Firenook answers it for the owner, as the Admin SDKs' getPartitions() asks it"},{"t":"pipeline as user","q":"Enterprise ExecutePipeline as user","a":"PERMISSION_DENIED: false for 'list' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"query as user","q":"Enterprise RunQuery as user","a":"PERMISSION_DENIED: false for 'list' @ L4","r":"d","k":"error","w":"Firenook's denial starts with production's text (\"Missing or insufficient permissions.\"), then names the rule lines the official emulator names"},{"t":"duration as a parameter","q":"install rules using \"duration\" as a parameter: function accept(duration) { return duration; }","a":"400 Error compiling rules: L4:18 duration is a package and cannot be used as variable name. L4:37 duration is a package and cannot be used…","r":"c","k":"verdict"},{"t":"duration as a binding","q":"install rules using \"duration\" as a binding: function accept() { let duration = true; return duration; }","a":"400 Error compiling rules: L4:26 duration is a package and cannot be used as variable name. L4:50 duration is a package and cannot be used…","r":"c","k":"verdict"},{"t":"duration as a function","q":"install rules using \"duration\" as a function: function duration() { return true; }","a":"200 rules installed","r":"c","k":"verdict"},{"t":"duration as a wildcard","q":"install rules using \"duration\" as a wildcard: allow get: if duration == 'one';","a":"400 Error compiling rules: L4:16 duration is a package and cannot be used as variable name. L4:42 duration is a package and cannot be used…","r":"c","k":"verdict"},{"t":"duration as a field","q":"install rules using \"duration\" as a field: allow get: if {'duration': true}.duration;","a":"200 rules installed","r":"c","k":"verdict"},{"t":"hashing as a parameter","q":"install rules using \"hashing\" as a parameter: function accept(hashing) { return hashing; }","a":"400 Error compiling rules: L4:18 hashing is a package and cannot be used as variable name. L4:36 hashing is a package and cannot be used as…","r":"c","k":"verdict"},{"t":"hashing as a binding","q":"install rules using \"hashing\" as a binding: function accept() { let hashing = true; return hashing; }","a":"400 Error compiling rules: L4:26 hashing is a package and cannot be used as variable name. L4:49 hashing is a package and cannot be used as…","r":"c","k":"verdict"},{"t":"hashing as a function","q":"install rules using \"hashing\" as a function: function hashing() { return true; }","a":"200 rules installed","r":"c","k":"verdict"},{"t":"hashing as a wildcard","q":"install rules using \"hashing\" as a wildcard: allow get: if hashing == 'one';","a":"400 Error compiling rules: L4:16 hashing is a package and cannot be used as variable name. L4:41 hashing is a package and cannot be used as…","r":"c","k":"verdict"},{"t":"hashing as a field","q":"install rules using \"hashing\" as a field: allow get: if {'hashing': true}.hashing;","a":"200 rules installed","r":"c","k":"verdict"},{"t":"latlng as a parameter","q":"install rules using \"latlng\" as a parameter: function accept(latlng) { return latlng; }","a":"400 Error compiling rules: L4:18 latlng is a package and cannot be used as variable name. L4:35 latlng is a package and cannot be used as v…","r":"c","k":"verdict"},{"t":"latlng as a binding","q":"install rules using \"latlng\" as a binding: function accept() { let latlng = true; return latlng; }","a":"400 Error compiling rules: L4:26 latlng is a package and cannot be used as variable name. L4:48 latlng is a package and cannot be used as v…","r":"c","k":"verdict"},{"t":"latlng as a function","q":"install rules using \"latlng\" as a function: function latlng() { return true; }","a":"200 rules installed","r":"c","k":"verdict"},{"t":"latlng as a wildcard","q":"install rules using \"latlng\" as a wildcard: allow get: if latlng == 'one';","a":"400 Error compiling rules: L4:16 latlng is a package and cannot be used as variable name. L4:40 latlng is a package and cannot be used as v…","r":"c","k":"verdict"},{"t":"latlng as a field","q":"install rules using \"latlng\" as a field: allow get: if {'latlng': true}.latlng;","a":"200 rules installed","r":"c","k":"verdict"},{"t":"math as a parameter","q":"install rules using \"math\" as a parameter: function accept(math) { return math; }","a":"400 Error compiling rules: L4:18 math is a package and cannot be used as variable name. L4:33 math is a package and cannot be used as varia…","r":"c","k":"verdict"},{"t":"math as a binding","q":"install rules using \"math\" as a binding: function accept() { let math = true; return math; }","a":"400 Error compiling rules: L4:26 math is a package and cannot be used as variable name. L4:46 math is a package and cannot be used as varia…","r":"c","k":"verdict"},{"t":"math as a function","q":"install rules using \"math\" as a function: function math() { return true; }","a":"200 rules installed","r":"c","k":"verdict"},{"t":"math as a wildcard","q":"install rules using \"math\" as a wildcard: allow get: if math == 'one';","a":"400 Error compiling rules: L4:16 math is a package and cannot be used as variable name. L4:38 math is a package and cannot be used as varia…","r":"c","k":"verdict"},{"t":"math as a field","q":"install rules using \"math\" as a field: allow get: if {'math': true}.math;","a":"200 rules installed","r":"c","k":"verdict"},{"t":"timestamp as a parameter","q":"install rules using \"timestamp\" as a parameter: function accept(timestamp) { return timestamp; }","a":"400 Error compiling rules: L4:18 timestamp is a package and cannot be used as variable name. L4:38 timestamp is a package and cannot be use…","r":"c","k":"verdict"},{"t":"timestamp as a binding","q":"install rules using \"timestamp\" as a binding: function accept() { let timestamp = true; return timestamp; }","a":"400 Error compiling rules: L4:26 timestamp is a package and cannot be used as variable name. L4:51 timestamp is a package and cannot be use…","r":"c","k":"verdict"},{"t":"timestamp as a function","q":"install rules using \"timestamp\" as a function: function timestamp() { return true; }","a":"200 rules installed","r":"c","k":"verdict"},{"t":"timestamp as a wildcard","q":"install rules using \"timestamp\" as a wildcard: allow get: if timestamp == 'one';","a":"400 Error compiling rules: L4:16 timestamp is a package and cannot be used as variable name. L4:43 timestamp is a package and cannot be use…","r":"c","k":"verdict"},{"t":"timestamp as a field","q":"install rules using \"timestamp\" as a field: allow get: if {'timestamp': true}.timestamp;","a":"200 rules installed","r":"c","k":"verdict"},{"t":"request as a parameter","q":"install rules using \"request\" as a parameter: function accept(request) { return request; }","a":"200 rules installed","r":"c","k":"verdict"},{"t":"request as a binding","q":"install rules using \"request\" as a binding: function accept() { let request = true; return request; }","a":"200 rules installed","r":"c","k":"verdict"},{"t":"request as a function","q":"install rules using \"request\" as a function: function request() { return true; }","a":"200 rules installed","r":"c","k":"verdict"},{"t":"request as a wildcard","q":"install rules using \"request\" as a wildcard: allow get: if request == 'one';","a":"200 rules installed","r":"c","k":"verdict"},{"t":"request as a field","q":"install rules using \"request\" as a field: allow get: if {'request': true}.request;","a":"200 rules installed","r":"c","k":"verdict"},{"t":"resource as a parameter","q":"install rules using \"resource\" as a parameter: function accept(resource) { return resource; }","a":"200 rules installed","r":"c","k":"verdict"},{"t":"resource as a binding","q":"install rules using \"resource\" as a binding: function accept() { let resource = true; return resource; }","a":"200 rules installed","r":"c","k":"verdict"},{"t":"resource as a function","q":"install rules using \"resource\" as a function: function resource() { return true; }","a":"200 rules installed","r":"c","k":"verdict"},{"t":"resource as a wildcard","q":"install rules using \"resource\" as a wildcard: allow get: if resource == 'one';","a":"200 rules installed","r":"c","k":"verdict"},{"t":"resource as a field","q":"install rules using \"resource\" as a field: allow get: if {'resource': true}.resource;","a":"200 rules installed","r":"c","k":"verdict"},{"t":"value as a parameter","q":"install rules using \"value\" as a parameter: function accept(value) { return value; }","a":"200 rules installed","r":"c","k":"verdict"},{"t":"value as a binding","q":"install rules using \"value\" as a binding: function accept() { let value = true; return value; }","a":"200 rules installed","r":"c","k":"verdict"},{"t":"value as a function","q":"install rules using \"value\" as a function: function value() { return true; }","a":"200 rules installed","r":"c","k":"verdict"},{"t":"value as a wildcard","q":"install rules using \"value\" as a wildcard: allow get: if value == 'one';","a":"200 rules installed","r":"c","k":"verdict"},{"t":"value as a field","q":"install rules using \"value\" as a field: allow get: if {'value': true}.value;","a":"200 rules installed","r":"c","k":"verdict"},{"t":"is a path","q":"get c/x: path('a/b') is path","a":"200 (expression held)","r":"c","k":"status"},{"t":"is not a string","q":"get c/x: path('a/b') is string","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"equals the same path","q":"get c/x: path('a/b') == path('a/b')","a":"200 (expression held)","r":"c","k":"status"},{"t":"differs from another path","q":"get c/x: path('a/b') != path('a/c')","a":"200 (expression held)","r":"c","k":"status"},{"t":"equals a literal with its slash","q":"get c/x: path('/a/b') == /a/b","a":"200 (expression held)","r":"c","k":"status"},{"t":"equals a literal without its slash","q":"get c/x: path('a/b') == /a/b","a":"200 (expression held)","r":"c","k":"status"},{"t":"not equal to a string","q":"get c/x: path('a/b') == 'a/b'","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"string of it keeps the text","q":"get c/x: string(path('a/b')) == 'a/b'","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"string of it keeps the slash","q":"get c/x: string(path('/a/b')) == '/a/b'","a":"200 (expression held)","r":"c","k":"status"},{"t":"first segment without a slash","q":"get c/x: path('a/b')[0] == 'a'","a":"200 (expression held)","r":"c","k":"status"},{"t":"first segment with a slash","q":"get c/x: path('/a/b')[0] == 'a'","a":"200 (expression held)","r":"c","k":"status"},{"t":"last segment","q":"get c/x: path('/a/b')[1] == 'b'","a":"200 (expression held)","r":"c","k":"status"},{"t":"exists with it","q":"get c/x: exists(path('/databases/' + database + '/documents/c/x'))","a":"200 (expression held)","r":"c","k":"status"},{"t":"get with it","q":"get c/x: get(path('/databases/' + database + '/documents/c/x')).data.v == 1","a":"200 (expression held)","r":"c","k":"status"},{"t":"exists with a string is an error","q":"get c/x: exists('/databases/' + database + '/documents/c/x')","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"exists for a missing document","q":"get c/x: exists(path('/databases/' + database + '/documents/c/missing'))","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"equals the document name","q":"get c/x: resource.__name__ == path('/databases/' + database + '/documents/c/x')","a":"200 (expression held)","r":"c","k":"status"},{"t":"an integer is an error","q":"get c/x: path(1) is path","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"a null is an error","q":"get c/x: path(null) is path","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"no argument is an error","q":"get c/x: path() is path","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"two arguments is an error","q":"get c/x: path('a', 'b') is path","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"empty text","q":"get c/x: path('') is path","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"a doubled slash","q":"get c/x: path('a//b') is path","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"a trailing slash","q":"get c/x: path('a/b/') == path('a/b')","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"a trailing slash alone","q":"get c/x: path('a/b/') is path","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"the root alone","q":"get c/x: path('/') is path","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"two leading slashes","q":"get c/x: path('//a') is path","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"a space in a segment","q":"get c/x: path('a b/c') == /a%20b/c","a":"200 (expression held)","r":"c","k":"status"},{"t":"a space is kept","q":"get c/x: path('a b/c')[0] == 'a b'","a":"200 (expression held)","r":"c","k":"status"},{"t":"a single segment","q":"get c/x: path('a') == /a","a":"200 (expression held)","r":"c","k":"status"},{"t":"an odd number of segments reads too","q":"get c/x: path('/databases/' + database + '/documents/c')[4] == 'c'","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"a leading slash is kept","q":"get c/x: path('/a/b') == path('a/b')","a":"200 (expression held)","r":"c","k":"status"},{"t":"an interpolated literal","q":"get c/x: /a/$('b') == path('/a/b')","a":"200 (expression held)","r":"c","k":"status"},{"t":"interpolating a string in a literal","q":"get c/x: /a/$('b') == /a/b","a":"200 (expression held)","r":"c","k":"status"},{"t":"interpolating a string function","q":"get c/x: /a/$(string(1)) == /a/1","a":"200 (expression held)","r":"c","k":"status"},{"t":"interpolating an index","q":"get c/x: /a/$(['b'][0]) == /a/b","a":"200 (expression held)","r":"c","k":"status"},{"t":"interpolating a map key","q":"get c/x: /a/$({'k': 'b'}['k']) == /a/b","a":"200 (expression held)","r":"c","k":"status"},{"t":"the name against a literal","q":"get c/x: /databases/$(database)/documents/c/x == resource.__name__","a":"200 (expression held)","r":"c","k":"status"},{"t":"the name against a literal reversed","q":"get c/x: resource.__name__ == /databases/$(database)/documents/c/x","a":"200 (expression held)","r":"c","k":"status"},{"t":"the name against the request path","q":"get c/x: resource.__name__ == request.path","a":"200 (expression held)","r":"c","k":"status"},{"t":"the name is a path","q":"get c/x: resource.__name__ is path","a":"200 (expression held)","r":"c","k":"status"},{"t":"the name as a string","q":"get c/x: string(resource.__name__) == '/databases/' + database + '/documents/c/x'","a":"200 (expression held)","r":"c","k":"status"},{"t":"the name with a project","q":"get c/x: string(resource.__name__) == '/projects/{project}/databases/' + database + '/documents/c/x'","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"the name first segment databases","q":"get c/x: resource.__name__[0] == 'databases'","a":"200 (expression held)","r":"c","k":"status"},{"t":"the name first segment projects","q":"get c/x: resource.__name__[0] == 'projects'","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"the name last segment","q":"get c/x: resource.__name__[4] == 'x'","a":"200 (expression held)","r":"c","k":"status"},{"t":"the request path as a string","q":"get c/x: string(request.path) == '/databases/' + database + '/documents/c/x'","a":"200 (expression held)","r":"c","k":"status"},{"t":"the request path with a project","q":"get c/x: string(request.path) == '/projects/{project}/databases/' + database + '/documents/c/x'","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"a percent escape is read in a literal","q":"get c/x: /a%20b/c[0] == 'a b'","a":"200 (expression held)","r":"c","k":"status"},{"t":"a percent escape is kept as text","q":"get c/x: /a%20b/c[0] == 'a%20b'","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"a percent escape in string of a literal","q":"get c/x: string(/a%20b/c) == '/a%20b/c'","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"a space in string of a literal","q":"get c/x: string(/a%20b/c) == '/a b/c'","a":"200 (expression held)","r":"c","k":"status"},{"t":"a percent escape through path","q":"get c/x: path('a%20b/c')[0] == 'a%20b'","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"a percent escape through path is read","q":"get c/x: path('a%20b/c')[0] == 'a b'","a":"200 (expression held)","r":"c","k":"status"},{"t":"string of a spaced path","q":"get c/x: string(path('a b/c')) == '/a b/c'","a":"200 (expression held)","r":"c","k":"status"},{"t":"string of a spaced path encoded","q":"get c/x: string(path('a b/c')) == '/a%20b/c'","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"a slash escape in a literal","q":"get c/x: /a%2Fb/c[0] == 'a/b'","a":"200 (expression held)","r":"c","k":"status"},{"t":"the name by index","q":"get c/x: resource['__name__'] == /databases/$(database)/documents/c/x","a":"200 (expression held)","r":"c","k":"status"},{"t":"string of a slash escape read","q":"get c/x: string(/a%2Fb/c) == '/a/b/c'","a":"200 (expression held)","r":"c","k":"status"},{"t":"string of a slash escape kept","q":"get c/x: string(/a%2Fb/c) == '/a%2Fb/c'","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"a slash escape equals two segments","q":"get c/x: /a%2Fb/c == /a/b/c","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"a slash escape through path","q":"get c/x: path('a%2Fb/c')[0] == 'a/b'","a":"200 (expression held)","r":"c","k":"status"},{"t":"interpolated slash one segment","q":"get c/x: /a/$('b/c')[1] == 'b/c'","a":"200 (expression held)","r":"c","k":"status"},{"t":"interpolated slash two segments","q":"get c/x: /a/$('b/c')[2] == 'c'","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"interpolated slash equals","q":"get c/x: /a/$('b/c') == /a/b/c","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"interpolated escape kept","q":"get c/x: /a/$('b%20c')[1] == 'b%20c'","a":"200 (expression held)","r":"c","k":"status"},{"t":"interpolated escape read","q":"get c/x: /a/$('b%20c')[1] == 'b c'","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"a bad escape through path","q":"get c/x: path('a%zz') is path","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"a bad escape kept through path","q":"get c/x: path('a%zz')[0] == 'a%zz'","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"a bad escape in a literal","q":"get c/x: /a%zz/c is path","a":"rules refused (400)","r":"c","k":"verdict"},{"t":"a literal right after if","q":"get c/x: /a/b is path","a":"200 (expression held)","r":"c","k":"status"},{"t":"a dot in a literal","q":"get c/x: /a/b.c[1] == 'b.c'","a":"200 (expression held)","r":"c","k":"status"},{"t":"an interpolation then index","q":"get c/x: /a/$('b')[1] == 'b'","a":"200 (expression held)","r":"c","k":"status"},{"t":"a literal indexed","q":"get c/x: /a/b[1] == 'b'","a":"200 (expression held)","r":"c","k":"status"},{"t":"a literal range","q":"get c/x: /a/b/c[1:3] == /b/c","a":"200 (expression held)","r":"c","k":"status"},{"t":"a path range","q":"get c/x: path('/a/b/c')[1:3] == /b/c","a":"200 (expression held)","r":"c","k":"status"},{"t":"bind through path","q":"get c/x: path('/a/{x}/c').bind({'x': 'b'}) == /a/b/c","a":"200 (expression held)","r":"c","k":"status"},{"t":"bind on a literal","q":"get c/x: /a/{x}/c.bind({'x': 'b'}) == /a/b/c","a":"rules refused (400)","r":"c","k":"verdict"},{"t":"bind an integer","q":"get c/x: path('/a/{x}/c').bind({'x': 1}) == /a/1/c","a":"200 (expression held)","r":"c","k":"status"},{"t":"bind a missing key","q":"get c/x: path('/a/{x}/c').bind({'y': 'b'}) is path","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"bind a missing key keeps it","q":"get c/x: string(path('/a/{x}/c').bind({'y': 'b'})) == '/a/{x}/c'","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"bind an extra key","q":"get c/x: path('/a/{x}/c').bind({'x': 'b', 'y': 'd'}) == /a/b/c","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"bind part of a segment","q":"get c/x: path('/a/p{x}q/c').bind({'x': 'b'}) == /a/pbq/c","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"bind part of a segment kept","q":"get c/x: string(path('/a/p{x}q/c').bind({'x': 'b'})) == '/a/p{x}q/c'","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"bind two keys","q":"get c/x: path('/{x}/{y}').bind({'x': 'a', 'y': 'b'}) == /a/b","a":"200 (expression held)","r":"c","k":"status"},{"t":"bind a slash value","q":"get c/x: path('/a/{x}').bind({'x': 'b/c'})[1] == 'b/c'","a":"200 (expression held)","r":"c","k":"status"},{"t":"bind a path value","q":"get c/x: path('/a/{x}').bind({'x': path('b/c')}) == /a/b/c","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"bind nothing","q":"get c/x: path('/a/b').bind({}) == /a/b","a":"200 (expression held)","r":"c","k":"status"},{"t":"bind a non map","q":"get c/x: path('/a/{x}').bind('b') is path","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"bind on the request path","q":"get c/x: request.path.bind({}) == request.path","a":"200 (expression held)","r":"c","k":"status"},{"t":"a size of a path","q":"get c/x: path('/a/b').size() == 2","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"interpolating a path","q":"get c/x: /a/$(path('b/c')) == /a/b/c","a":"200 (expression held)","r":"c","k":"status"},{"t":"interpolating a path segment","q":"get c/x: /a/$(path('b/c'))[2] == 'c'","a":"200 (expression held)","r":"c","k":"status"},{"t":"interpolating a literal","q":"get c/x: /a/$(/b/c) == /a/b/c","a":"200 (expression held)","r":"c","k":"status"},{"t":"interpolating an integer","q":"get c/x: /a/$(1) == /a/1","a":"200 (expression held)","r":"c","k":"status"},{"t":"interpolating a bool is an error","q":"get c/x: /a/$(true) is path","a":"200 (expression held)","r":"c","k":"status"},{"t":"interpolating the request path","q":"get c/x: /a/$(request.path)[1] == request.path[0]","a":"200 (expression held)","r":"c","k":"status"},{"t":"interpolating inside a segment","q":"get c/x: /a/p$('b')q == /a/pbq","a":"rules refused (400)","r":"c","k":"verdict"},{"t":"interpolating an empty string","q":"get c/x: /a/$('')/c is path","a":"200 (expression held)","r":"c","k":"status"},{"t":"interpolating a bool reads as text","q":"get c/x: /a/$(true)[1] == 'true'","a":"200 (expression held)","r":"c","k":"status"},{"t":"interpolating a float","q":"get c/x: /a/$(1.5) is path","a":"200 (expression held)","r":"c","k":"status"},{"t":"interpolating a float reads as text","q":"get c/x: /a/$(1.5)[1] == '1.5'","a":"200 (expression held)","r":"c","k":"status"},{"t":"interpolating a null","q":"get c/x: /a/$(null) is path","a":"200 (expression held)","r":"c","k":"status"},{"t":"interpolating a list","q":"get c/x: /a/$([1]) is path","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"interpolating a map","q":"get c/x: /a/$({'k': 1}) is path","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"bind a bool","q":"get c/x: path('/a/{x}').bind({'x': true})[1] == 'true'","a":"200 (expression held)","r":"c","k":"status"},{"t":"bind a float","q":"get c/x: path('/a/{x}').bind({'x': 1.5})[1] == '1.5'","a":"200 (expression held)","r":"c","k":"status"},{"t":"bind a null","q":"get c/x: path('/a/{x}').bind({'x': null}) is path","a":"200 (expression held)","r":"c","k":"status"},{"t":"bind a list","q":"get c/x: path('/a/{x}').bind({'x': [1]}) is path","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"bind a recursive template","q":"get c/x: path('/a/{x=**}').bind({'x': 'b'}) is path","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"bind keeps spaces","q":"get c/x: path('/a/{x}').bind({'x': 'b c'})[1] == 'b c'","a":"200 (expression held)","r":"c","k":"status"},{"t":"bind does not read an escape","q":"get c/x: path('/a/{x}').bind({'x': 'b%20c'})[1] == 'b%20c'","a":"200 (expression held)","r":"c","k":"status"},{"t":"the name by index is a path","q":"get c/x: resource['__name__'] is path","a":"200 (expression held)","r":"c","k":"status"},{"t":"the id by index","q":"get c/x: resource['id'] == 'x'","a":"200 (expression held)","r":"c","k":"status"},{"t":"the data by index","q":"get c/x: resource['data'].v == 1","a":"200 (expression held)","r":"c","k":"status"},{"t":"the id","q":"get c/x: resource.id == 'x'","a":"200 (expression held)","r":"c","k":"status"},{"t":"the id is a string","q":"get c/x: resource.id is string","a":"200 (expression held)","r":"c","k":"status"},{"t":"the id of a get","q":"get c/x: get(path('/databases/' + database + '/documents/c/x')).id == 'x'","a":"200 (expression held)","r":"c","k":"status"},{"t":"the name of a get","q":"get c/x: get(path('/databases/' + database + '/documents/c/x')).__name__ == path('/databases/' + database + '/documents/c/x')","a":"200 (expression held)","r":"c","k":"status"},{"t":"the id against a wildcard","q":"get c/x: resource.id == id","a":"200 (expression held)","r":"c","k":"status"},{"t":"a literal in parentheses","q":"get c/x: (/a/b) == /a/b","a":"200 (expression held)","r":"c","k":"status"},{"t":"a literal negated equal","q":"get c/x: /a/b != /a/c","a":"200 (expression held)","r":"c","k":"status"},{"t":"a literal in a list","q":"get c/x: /a/b in [/a/b]","a":"200 (expression held)","r":"c","k":"status"},{"t":"list the id","q":"list c: resource.id == 'x'","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"list the id differs","q":"list c: resource.id != 'nope'","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"list the id is a string","q":"list c: resource.id is string","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"list the name is a path","q":"list c: resource.__name__ is path","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"list the name equals","q":"list c: resource.__name__ == /databases/$(database)/documents/c/x","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"list the name by index","q":"list c: resource['__name__'] is path","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"list the id by index","q":"list c: resource['id'] is string","a":"403 (expression false or an error)","r":"c","k":"status"},{"t":"create the id","q":"create c/new: request.resource.id == 'new'","a":"200 (expression held)","r":"c","k":"status"},{"t":"create the id is a string","q":"create c/new: request.resource.id is string","a":"200 (expression held)","r":"c","k":"status"},{"t":"create the name","q":"create c/new: request.resource.__name__ == /databases/$(database)/documents/c/new","a":"200 (expression held)","r":"c","k":"status"},{"t":"create the name by index","q":"create c/new: request.resource['__name__'] == /databases/$(database)/documents/c/new","a":"200 (expression held)","r":"c","k":"status"},{"t":"create the name against the request path","q":"create c/new: request.resource.__name__ == request.path","a":"200 (expression held)","r":"c","k":"status"},{"t":"member get room","q":"GET documents/rooms/r1 as u-member","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"answer"},{"t":"anonymous get room","q":"GET documents/rooms/r1 signed out","a":"403 PERMISSION_DENIED: false for 'get' @ L26","r":"c","k":"status"},{"t":"lead create room","q":"POST documents:commit as u-lead","a":"200 {writeResults, commitTime}","r":"c","k":"answer"},{"t":"member create room","q":"POST documents:commit as u-member","a":"403 PERMISSION_DENIED: false for 'create' @ L29, false for 'update' @ L39","r":"c","k":"status"},{"t":"anonymous create room","q":"POST documents:commit signed out","a":"403 PERMISSION_DENIED: false for 'create' @ L29, false for 'update' @ L39","r":"c","k":"status"},{"t":"create room unknown field","q":"POST documents:commit as u-lead","a":"403 PERMISSION_DENIED: evaluation error at L29:24 for 'create' @ L29, evaluation error at L39:24 for 'update' @ L39, false for 'create' @ L…","r":"c","k":"status"},{"t":"create room missing field","q":"POST documents:commit as u-lead","a":"403 PERMISSION_DENIED: false for 'create' @ L29, evaluation error at L39:24 for 'update' @ L39, false for 'create' @ L29","r":"c","k":"status"},{"t":"create room title not string","q":"POST documents:commit as u-lead","a":"403 PERMISSION_DENIED: evaluation error at L29:24 for 'create' @ L29, evaluation error at L39:24 for 'update' @ L39, false for 'create' @ L…","r":"c","k":"status"},{"t":"create room title too long","q":"POST documents:commit as u-lead","a":"403 PERMISSION_DENIED: evaluation error at L29:24 for 'create' @ L29, evaluation error at L39:24 for 'update' @ L39, false for 'create' @ L…","r":"c","k":"status"},{"t":"create room visibility not listed","q":"POST documents:commit as u-lead","a":"403 PERMISSION_DENIED: evaluation error at L29:24 for 'create' @ L29, evaluation error at L39:24 for 'update' @ L39, false for 'create' @ L…","r":"c","k":"status"},{"t":"update room allowed field","q":"POST documents:commit as u-lead","a":"200 {writeResults, commitTime}","r":"c","k":"answer"},{"t":"update room locked field","q":"POST documents:commit as u-lead","a":"403 PERMISSION_DENIED: evaluation error at L39:24 for 'update' @ L39, false for 'update' @ L39","r":"c","k":"status"},{"t":"lead delete room","q":"POST documents:commit as u-lead","a":"403 PERMISSION_DENIED: false for 'delete' @ L43","r":"c","k":"status"},{"t":"outsider get entry","q":"GET documents/rooms/r1/entries/e1 as u-outsider","a":"403 PERMISSION_DENIED: evaluation error at L52:23 for 'get' @ L52, false for 'get' @ L52","r":"c","k":"status"},{"t":"member get entry","q":"GET documents/rooms/r1/entries/e1 as u-member","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"answer"},{"t":"member list foreign members","q":"POST documents/rooms/r2:runQuery as u-member","a":"403 PERMISSION_DENIED: evaluation error at L47:24 for 'list' @ L47, false for 'list' @ L47","r":"c","k":"status"},{"t":"outsider query entries with field","q":"POST documents/rooms/r1:runQuery as u-outsider","a":"403 PERMISSION_DENIED: evaluation error at L55:24 for 'list' @ L55, false for 'list' @ L55","r":"c","k":"status"},{"t":"create entry without optional field","q":"POST documents:commit as u-member","a":"200 {writeResults, commitTime}","r":"c","k":"answer"},{"t":"create entry over limit","q":"POST documents:commit as u-member","a":"403 PERMISSION_DENIED: false for 'create' @ L58, evaluation error at L63:26 for 'update' @ L63, false for 'create' @ L58","r":"c","k":"status"},{"t":"create entry not integer","q":"POST documents:commit as u-member","a":"403 PERMISSION_DENIED: false for 'create' @ L58, evaluation error at L63:26 for 'update' @ L63, false for 'create' @ L58","r":"c","k":"status"},{"t":"update entry in open room","q":"POST documents:commit as u-member","a":"200 {writeResults, commitTime}","r":"c","k":"answer"},{"t":"create room with null field","q":"POST documents:commit as u-lead","a":"200 {writeResults, commitTime}","r":"c","k":"answer"},{"t":"anonymous query missing document id","q":"POST documents:runQuery signed out","a":"403 PERMISSION_DENIED: false for 'list' @ L27","r":"c","k":"status"},{"t":"member query missing document id","q":"POST documents:runQuery as u-member","a":"403 PERMISSION_DENIED: evaluation error at L27:22 for 'list' @ L27","r":"c","k":"status"},{"t":"get matching document id","q":"GET documents/marks/yellow as u-member","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"answer"},{"t":"get non matching document id","q":"GET documents/marks/YELLOW_1 as u-member","a":"403 PERMISSION_DENIED: false for 'get' @ L71","r":"c","k":"status"},{"t":"create mark both fields","q":"POST documents:commit as u-member","a":"200 {writeResults, commitTime}","r":"c","k":"answer"},{"t":"create mark wrong type","q":"POST documents:commit as u-member","a":"403 PERMISSION_DENIED: false for 'create' @ L73","r":"c","k":"status"},{"t":"member query entries with field","q":"POST documents/rooms/r1:runQuery as u-member","a":"200 [1 item]","r":"d","k":"answer","w":"Firenook ends a runQuery stream without \"done\": true, as production does"},{"t":"probe/access 10","q":"GET /v1/projects/{project}/databases/(default)/documents/probe/access-10","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"verdict"},{"t":"probe/access 11","q":"GET /v1/projects/{project}/databases/(default)/documents/probe/access-11","a":"403 PERMISSION_DENIED: evaluation error at L17:21 for 'get' @ L17, Service call error. Function: [get], Argument: [path_value { segments {…","r":"c","k":"verdict"},{"t":"probe/cached 11","q":"GET /v1/projects/{project}/databases/(default)/documents/probe/cached-11","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"verdict"},{"t":"probe/exists 10","q":"GET /v1/projects/{project}/databases/(default)/documents/probe/exists-10","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"verdict"},{"t":"probe/exists 11","q":"GET /v1/projects/{project}/databases/(default)/documents/probe/exists-11","a":"403 PERMISSION_DENIED: evaluation error at L55:21 for 'get' @ L55, Service call error. Function: [exists], Argument: [path_value { segments…","r":"c","k":"verdict"},{"t":"batch 20 distinct access calls","q":"POST /v1/projects/{project}/databases/(default)/documents:commit","a":"200 {writeResults, commitTime}","r":"c","k":"verdict"},{"t":"batch 21 distinct access calls","q":"POST /v1/projects/{project}/databases/(default)/documents:commit","a":"403 PERMISSION_DENIED: evaluation error at L68:32 for 'create' @ L68, evaluation error at L68:32 for 'update' @ L68, evaluation error at L6…","r":"c","k":"verdict"},{"t":"get after sees pending write","q":"POST /v1/projects/{project}/databases/(default)/documents:commit","a":"200 {writeResults, commitTime}","r":"c","k":"verdict"},{"t":"get after denies stale invariant","q":"POST /v1/projects/{project}/databases/(default)/documents:commit","a":"403 PERMISSION_DENIED: evaluation error at L71:24 for 'update' @ L71, evaluation error at L74:24 for 'create' @ L74, false for 'update' @ L…","r":"c","k":"verdict"},{"t":"runtime/missing field","q":"GET /v1/projects/{project}/databases/(default)/documents/runtime/missing-field","a":"403 PERMISSION_DENIED: evaluation error at L77:21 for 'get' @ L77, Property missing is undefined on object. for 'get' @ L77","r":"c","k":"verdict"},{"t":"runtime/division zero","q":"GET /v1/projects/{project}/databases/(default)/documents/runtime/division-zero","a":"403 PERMISSION_DENIED: Divide by zero error. for 'get' @ L80, Divide by zero error. for 'get' @ L80","r":"c","k":"verdict"},{"t":"runtime/list out of bounds","q":"GET /v1/projects/{project}/databases/(default)/documents/runtime/list-out-of-bounds","a":"403 PERMISSION_DENIED: Index out of bound error. Index: [2] , size: [1]. for 'get' @ L83, Index out of bound error. Index: [2] , size: [1].…","r":"c","k":"verdict"},{"t":"runtime/wrong type method","q":"GET /v1/projects/{project}/databases/(default)/documents/runtime/wrong-type-method","a":"403 PERMISSION_DENIED: evaluation error at L86:21 for 'get' @ L86, Function not found error: Name: [size]. for 'get' @ L86","r":"c","k":"verdict"},{"t":"runtime/missing get resource","q":"GET /v1/projects/{project}/databases/(default)/documents/runtime/missing-get-resource","a":"403 PERMISSION_DENIED: evaluation error at L89:21 for 'get' @ L89, Null value error. for 'get' @ L89","r":"c","k":"verdict"},{"t":"public get","q":"GET /v1/projects/{project}/databases/(default)/documents/public/news","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"verdict"},{"t":"public list bounded","q":"POST /v1/projects/{project}/databases/(default)/documents:runQuery","a":"200 [1 item]","r":"c","k":"verdict"},{"t":"public list oversized","q":"POST /v1/projects/{project}/databases/(default)/documents:runQuery","a":"403 PERMISSION_DENIED: false for 'list' @ L67, false for 'list' @ L1190","r":"c","k":"verdict"},{"t":"tenant claim read","q":"GET /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"verdict"},{"t":"tenant wrong claim","q":"GET /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a","a":"403 PERMISSION_DENIED: evaluation error at L71:21 for 'get' @ L71, false for 'get' @ L1190, false for 'get' @ L71, false for 'get' @ L1190","r":"c","k":"verdict"},{"t":"tenant admin update","q":"PATCH /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"verdict"},{"t":"tenant editor update","q":"PATCH /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a","a":"403 PERMISSION_DENIED: false for 'create' @ L1190, false for 'update' @ L74, false for 'update' @ L1190","r":"c","k":"verdict"},{"t":"member self read","q":"GET /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a/members/alice","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"verdict"},{"t":"member other read","q":"GET /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a/members/alice","a":"403 PERMISSION_DENIED: false for 'get' @ L78, false for 'get' @ L1190","r":"c","k":"verdict"},{"t":"project member read","q":"GET /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a/projects/{project}","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"verdict"},{"t":"project nonmember read","q":"GET /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a/projects/{project}","a":"403 PERMISSION_DENIED: evaluation error at L89:23 for 'get' @ L89, false for 'get' @ L1190, false for 'get' @ L89, false for 'get' @ L1190","r":"c","k":"verdict"},{"t":"project owner update","q":"PATCH /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a/projects/{project}","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"verdict"},{"t":"project owner forbidden change","q":"PATCH /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a/projects/{project}","a":"403 PERMISSION_DENIED: false for 'create' @ L92, false for 'create' @ L1190, evaluation error at L96:26 for 'update' @ L96, false for 'upda…","r":"c","k":"verdict"},{"t":"project admin delete","q":"DELETE /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a/projects/{project}","a":"200 {}","r":"c","k":"verdict"},{"t":"project member delete","q":"DELETE /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a/projects/{project}","a":"403 PERMISSION_DENIED: false for 'delete' @ L102, false for 'delete' @ L1190","r":"c","k":"verdict"},{"t":"task member read","q":"GET /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a/projects/{project}/tasks/task-1","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"verdict"},{"t":"task nonmember read","q":"GET /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a/projects/{project}/tasks/task-1","a":"403 PERMISSION_DENIED: evaluation error at L104:25 for 'get' @ L104, false for 'get' @ L1190, false for 'get' @ L104, false for 'get' @ L11…","r":"c","k":"verdict"},{"t":"task self create","q":"PATCH /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a/projects/{project}/tasks/task-create-alice","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"verdict"},{"t":"task other create","q":"PATCH /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a/projects/{project}/tasks/task-create-bob","a":"403 PERMISSION_DENIED: false for 'create' @ L107, false for 'create' @ L1190, evaluation error at L110:28 for 'update' @ L110, false for 'u…","r":"c","k":"verdict"},{"t":"task assignee update","q":"PATCH /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a/projects/{project}/tasks/task-update-allow","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"verdict"},{"t":"task forbidden update","q":"PATCH /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a/projects/{project}/tasks/task-update-deny","a":"403 PERMISSION_DENIED: evaluation error at L107:28 for 'create' @ L107, false for 'create' @ L1190, evaluation error at L110:28 for 'update…","r":"c","k":"verdict"},{"t":"comment member read","q":"GET /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a/projects/{project}/tasks/task-1/comments/comment-1","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"verdict"},{"t":"comment author create","q":"PATCH /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a/projects/{project}/tasks/task-1/comments/comment-new","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"verdict"},{"t":"comment impersonation","q":"PATCH /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a/projects/{project}/tasks/task-1/comments/comment-bad","a":"403 PERMISSION_DENIED: false for 'create' @ L121, false for 'create' @ L1190, evaluation error at L125:38 for 'update' @ L125, false for 'u…","r":"c","k":"verdict"},{"t":"profile self read","q":"GET /v1/projects/{project}/databases/(default)/documents/profiles/alice","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"verdict"},{"t":"profile other read","q":"GET /v1/projects/{project}/databases/(default)/documents/profiles/alice","a":"403 PERMISSION_DENIED: false for 'get' @ L136, false for 'get' @ L1190","r":"c","k":"verdict"},{"t":"profile self update","q":"PATCH /v1/projects/{project}/databases/(default)/documents/profiles/alice","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"verdict"},{"t":"profile role injection","q":"PATCH /v1/projects/{project}/databases/(default)/documents/profiles/alice","a":"403 PERMISSION_DENIED: false for 'create' @ L142, false for 'create' @ L1190, evaluation error at L138:24 for 'update' @ L138, false for 'u…","r":"c","k":"verdict"},{"t":"audit admin create","q":"PATCH /v1/projects/{project}/databases/(default)/documents/audits/admin-event","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"verdict"},{"t":"audit editor create","q":"PATCH /v1/projects/{project}/databases/(default)/documents/audits/editor-event","a":"403 PERMISSION_DENIED: false for 'create' @ L145, false for 'create' @ L1190, false for 'update' @ L150, false for 'update' @ L1190","r":"c","k":"verdict"},{"t":"recursive asset member","q":"GET /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a/assets/folder/deep/file","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"verdict"},{"t":"recursive asset nonmember","q":"GET /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a/assets/folder/deep/file","a":"403 PERMISSION_DENIED: evaluation error at L131:23 for 'get' @ L131, false for 'get' @ L1190, false for 'get' @ L131, false for 'get' @ L11…","r":"c","k":"verdict"},{"t":"stats admin read","q":"GET /v1/projects/{project}/databases/(default)/documents/stats/overview","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"verdict"},{"t":"stats editor read","q":"GET /v1/projects/{project}/databases/(default)/documents/stats/overview","a":"403 PERMISSION_DENIED: false for 'get' @ L153, false for 'get' @ L1190","r":"c","k":"verdict"},{"t":"generated entity 00","q":"GET /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a/entity-00/document-00","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"verdict"},{"t":"generated entity 01","q":"GET /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a/entity-01/document-01","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"verdict"},{"t":"generated entity 02","q":"GET /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a/entity-02/document-02","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"verdict"},{"t":"generated entity 03","q":"GET /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a/entity-03/document-03","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"verdict"},{"t":"generated entity 04","q":"GET /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a/entity-04/document-04","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"verdict"},{"t":"generated entity 05","q":"GET /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a/entity-05/document-05","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"verdict"},{"t":"generated entity 06","q":"GET /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a/entity-06/document-06","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"verdict"},{"t":"generated entity 07","q":"GET /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a/entity-07/document-07","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"verdict"},{"t":"generated entity wrong tenant","q":"GET /v1/projects/{project}/databases/(default)/documents/tenants/tenant-a/entity-00/document-00","a":"403 PERMISSION_DENIED: evaluation error at L166:21 for 'get' @ L166, false for 'get' @ L1190, false for 'get' @ L166, false for 'get' @ L11…","r":"c","k":"verdict"},{"t":"get after atomic allow","q":"POST /v1/projects/{project}/databases/(default)/documents:commit","a":"200 {writeResults, commitTime}","r":"c","k":"verdict"},{"t":"get after atomic deny","q":"POST /v1/projects/{project}/databases/(default)/documents:commit","a":"403 PERMISSION_DENIED: false for 'create' @ L1190, evaluation error at L157:24 for 'update' @ L157, false for 'update' @ L1190, evaluation…","r":"c","k":"verdict"},{"t":"RunQuery over gRPC","q":"RunQuery records where createdBy == \"query-owner\" order by updatedAt desc limit 12","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery records where createdBy == \"query-owner\" order by updatedAt desc limit 12","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen records where createdBy == \"query-owner\" order by updatedAt desc limit 12","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery records","a":"PERMISSION_DENIED: Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery records","a":"PERMISSION_DENIED: Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen records","a":"PERMISSION_DENIED: Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery records where createdBy == \"other-owner\"","a":"PERMISSION_DENIED: Property permissionId is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery records where createdBy == \"other-owner\"","a":"PERMISSION_DENIED: Property permissionId is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen records where createdBy == \"other-owner\"","a":"PERMISSION_DENIED: Property permissionId is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery records where createdBy == \"query-owner\"","a":"PERMISSION_DENIED: false for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery records where createdBy == \"query-owner\"","a":"PERMISSION_DENIED: false for 'list' @ L8","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen records where createdBy == \"query-owner\"","a":"PERMISSION_DENIED: false for 'list' @ L8","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery records where createdBy in [\"query-owner\"]","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery records where createdBy in [\"query-owner\"]","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen records where createdBy in [\"query-owner\"]","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery records where createdBy in [\"query-owner\",\"other-owner\"]","a":"PERMISSION_DENIED: false for 'list' @ L8, Property permissionId is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery records where createdBy in [\"query-owner\",\"other-owner\"]","a":"PERMISSION_DENIED: false for 'list' @ L8, Property permissionId is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen records where createdBy in [\"query-owner\",\"other-owner\"]","a":"PERMISSION_DENIED: false for 'list' @ L8, Property permissionId is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery records where createdBy array-contains \"query-owner\"","a":"PERMISSION_DENIED: evaluation error at L8:42 for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery records where createdBy array-contains \"query-owner\"","a":"PERMISSION_DENIED: evaluation error at L8:42 for 'list' @ L8","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen records where createdBy array-contains \"query-owner\"","a":"PERMISSION_DENIED: evaluation error at L8:42 for 'list' @ L8","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery records where createdBy >= \"query-owner\"","a":"PERMISSION_DENIED: evaluation error at L8:42 for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery records where createdBy >= \"query-owner\"","a":"PERMISSION_DENIED: evaluation error at L8:42 for 'list' @ L8","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen records where createdBy >= \"query-owner\"","a":"PERMISSION_DENIED: evaluation error at L8:42 for 'list' @ L8","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery records where (createdBy >= \"query-owner\" and createdBy <= \"query-owner\")","a":"PERMISSION_DENIED: evaluation error at L8:42 for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery records where (createdBy >= \"query-owner\" and createdBy <= \"query-owner\")","a":"PERMISSION_DENIED: evaluation error at L8:42 for 'list' @ L8","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen records where (createdBy >= \"query-owner\" and createdBy <= \"query-owner\")","a":"PERMISSION_DENIED: evaluation error at L8:42 for 'list' @ L8","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery records where (createdBy == \"query-owner\" and published == false)","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery records where (createdBy == \"query-owner\" and published == false)","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen records where (createdBy == \"query-owner\" and published == false)","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery records where ((createdBy == \"query-owner\" and published == false) or (createdBy == \"query-owner\" and published == true))","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery records where ((createdBy == \"query-owner\" and published == false) or (createdBy == \"query-owner\" and published == true…","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen records where ((createdBy == \"query-owner\" and published == false) or (createdBy == \"query-owner\" and published == true))","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery records where (createdBy == \"query-owner\" or published == true)","a":"PERMISSION_DENIED: false for 'list' @ L8, Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery records where (createdBy == \"query-owner\" or published == true)","a":"PERMISSION_DENIED: false for 'list' @ L8, Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen records where (createdBy == \"query-owner\" or published == true)","a":"PERMISSION_DENIED: false for 'list' @ L8, Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery emptyRecords where createdBy == \"query-owner\"","a":"OK · 0 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery emptyRecords where createdBy == \"query-owner\"","a":"OK · count 0","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen emptyRecords where createdBy == \"query-owner\"","a":"OK · 0 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery emptyRecords","a":"PERMISSION_DENIED: Property createdBy is undefined on object. for 'list' @ L9","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery emptyRecords","a":"PERMISSION_DENIED: Property createdBy is undefined on object. for 'list' @ L9","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen emptyRecords","a":"PERMISSION_DENIED: Property createdBy is undefined on object. for 'list' @ L9","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery emptyRecords where createdBy == \"other-owner\"","a":"PERMISSION_DENIED: Property permissionId is undefined on object. for 'list' @ L9","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery emptyRecords where createdBy == \"other-owner\"","a":"PERMISSION_DENIED: Property permissionId is undefined on object. for 'list' @ L9","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen emptyRecords where createdBy == \"other-owner\"","a":"PERMISSION_DENIED: Property permissionId is undefined on object. for 'list' @ L9","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery records where (createdBy == \"query-owner\" and updatedAt == -1)","a":"OK · 0 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery records where (createdBy == \"query-owner\" and updatedAt == -1)","a":"OK · count 0","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen records where (createdBy == \"query-owner\" and updatedAt == -1)","a":"OK · 0 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery records where permissionId == \"granted\"","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery records where permissionId == \"granted\"","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen records where permissionId == \"granted\"","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery records where permissionId == \"denied\"","a":"PERMISSION_DENIED: Property createdBy is undefined on object. for 'list' @ L8, Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery records where permissionId == \"denied\"","a":"PERMISSION_DENIED: Property createdBy is undefined on object. for 'list' @ L8, Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen records where permissionId == \"denied\"","a":"PERMISSION_DENIED: Property createdBy is undefined on object. for 'list' @ L8, Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery records where permissionId == \"missing\"","a":"PERMISSION_DENIED: Property createdBy is undefined on object. for 'list' @ L8, Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery records where permissionId == \"missing\"","a":"PERMISSION_DENIED: Property createdBy is undefined on object. for 'list' @ L8, Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen records where permissionId == \"missing\"","a":"PERMISSION_DENIED: Property createdBy is undefined on object. for 'list' @ L8, Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery records where permissionId in [\"granted\",\"granted2\"]","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery records where permissionId in [\"granted\",\"granted2\"]","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen records where permissionId in [\"granted\",\"granted2\"]","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery records where permissionId in [\"granted\",\"denied\"]","a":"PERMISSION_DENIED: Property createdBy is undefined on object. for 'list' @ L8, Property createdBy is undefined on object. for 'list' @ L8,…","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery records where permissionId in [\"granted\",\"denied\"]","a":"PERMISSION_DENIED: Property createdBy is undefined on object. for 'list' @ L8, Property createdBy is undefined on object. for 'list' @ L8,…","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen records where permissionId in [\"granted\",\"denied\"]","a":"PERMISSION_DENIED: Property createdBy is undefined on object. for 'list' @ L8, Property createdBy is undefined on object. for 'list' @ L8,…","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery shortCircuit where createdBy == \"query-owner\"","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery shortCircuit where createdBy == \"query-owner\"","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen shortCircuit where createdBy == \"query-owner\"","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery shared where members array-contains \"query-owner\"","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery shared where members array-contains \"query-owner\"","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen shared where members array-contains \"query-owner\"","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery shared where members array-contains \"other-owner\"","a":"PERMISSION_DENIED: evaluation error at L11:41 for 'list' @ L11","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery shared where members array-contains \"other-owner\"","a":"PERMISSION_DENIED: evaluation error at L11:41 for 'list' @ L11","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen shared where members array-contains \"other-owner\"","a":"PERMISSION_DENIED: evaluation error at L11:41 for 'list' @ L11","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery shared where members array-contains-any [\"query-owner\"]","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery shared where members array-contains-any [\"query-owner\"]","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen shared where members array-contains-any [\"query-owner\"]","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery shared where members array-contains-any [\"query-owner\",\"other-owner\"]","a":"PERMISSION_DENIED: false for 'list' @ L11, evaluation error at L11:41 for 'list' @ L11","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery shared where members array-contains-any [\"query-owner\",\"other-owner\"]","a":"PERMISSION_DENIED: false for 'list' @ L11, evaluation error at L11:41 for 'list' @ L11","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen shared where members array-contains-any [\"query-owner\",\"other-owner\"]","a":"PERMISSION_DENIED: false for 'list' @ L11, evaluation error at L11:41 for 'list' @ L11","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery shared","a":"PERMISSION_DENIED: Property members is undefined on object. for 'list' @ L11","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery shared","a":"PERMISSION_DENIED: Property members is undefined on object. for 'list' @ L11","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen shared","a":"PERMISSION_DENIED: Property members is undefined on object. for 'list' @ L11","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery ratings where score == 5","a":"OK · 0 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery ratings where score == 5","a":"OK · count 0","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen ratings where score == 5","a":"OK · 0 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery ratings where score > 5","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery ratings where score > 5","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen ratings where score > 5","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery ratings where score >= 5","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery ratings where score >= 5","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen ratings where score >= 5","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery ratings where score >= 4","a":"PERMISSION_DENIED: evaluation error at L12:42 for 'list' @ L12","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery ratings where score >= 4","a":"PERMISSION_DENIED: evaluation error at L12:42 for 'list' @ L12","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen ratings where score >= 4","a":"PERMISSION_DENIED: evaluation error at L12:42 for 'list' @ L12","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery ratings where score in [5,7]","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery ratings where score in [5,7]","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen ratings where score in [5,7]","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery ratings where score in [4,7]","a":"PERMISSION_DENIED: false for 'list' @ L12","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery ratings where score in [4,7]","a":"PERMISSION_DENIED: false for 'list' @ L12","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen ratings where score in [4,7]","a":"PERMISSION_DENIED: false for 'list' @ L12","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery ratings","a":"PERMISSION_DENIED: Property score is undefined on object. for 'list' @ L12","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery ratings","a":"PERMISSION_DENIED: Property score is undefined on object. for 'list' @ L12","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen ratings","a":"PERMISSION_DENIED: Property score is undefined on object. for 'list' @ L12","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery nonnull where value != null","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery nonnull where value != null","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen nonnull where value != null","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery notblocked where value != \"blocked\"","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery notblocked where value != \"blocked\"","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen notblocked where value != \"blocked\"","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery notblocked where value not-in [\"blocked\",\"also-blocked\"]","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery notblocked where value not-in [\"blocked\",\"also-blocked\"]","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen notblocked where value not-in [\"blocked\",\"also-blocked\"]","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery limited limit 12","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery limited limit 12","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen limited limit 12","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery limited limit 13","a":"PERMISSION_DENIED: false for 'list' @ L15","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery limited limit 13","a":"PERMISSION_DENIED: false for 'list' @ L15","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen limited limit 13","a":"PERMISSION_DENIED: false for 'list' @ L15","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery limited","a":"PERMISSION_DENIED: Unsupported operation error. Received: null <= int. Expected: string <= string, bytes <= bytes, int <= int, float <= flo…","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery limited","a":"PERMISSION_DENIED: Unsupported operation error. Received: null <= int. Expected: string <= string, bytes <= bytes, int <= int, float <= flo…","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen limited","a":"PERMISSION_DENIED: Unsupported operation error. Received: null <= int. Expected: string <= string, bytes <= bytes, int <= int, float <= flo…","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery offsets offset 2","a":"OK · 0 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery offsets offset 2","a":"OK · count 0","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen offsets offset 2","a":"OK · 0 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery offsets offset 3","a":"PERMISSION_DENIED: false for 'list' @ L16","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery offsets offset 3","a":"PERMISSION_DENIED: false for 'list' @ L16","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen offsets offset 3","a":"PERMISSION_DENIED: false for 'list' @ L16","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery offsets","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery offsets","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen offsets","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery ordering order by updatedAt desc","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery ordering order by updatedAt desc","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen ordering order by updatedAt desc","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery ordering order by updatedAt asc","a":"PERMISSION_DENIED: false for 'list' @ L17","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery ordering order by updatedAt asc","a":"PERMISSION_DENIED: false for 'list' @ L17","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen ordering order by updatedAt asc","a":"PERMISSION_DENIED: false for 'list' @ L17","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery ordering","a":"PERMISSION_DENIED: Property updatedAt is undefined on object. for 'list' @ L17","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery ordering","a":"PERMISSION_DENIED: Property updatedAt is undefined on object. for 'list' @ L17","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen ordering","a":"PERMISSION_DENIED: Property updatedAt is undefined on object. for 'list' @ L17","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery fixedGet","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery fixedGet","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen fixedGet","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery fixedExists","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery fixedExists","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen fixedExists","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery dynamicExists where permissionId == \"granted\"","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery dynamicExists where permissionId == \"granted\"","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen dynamicExists where permissionId == \"granted\"","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery dynamicExists where permissionId == \"missing\"","a":"PERMISSION_DENIED: evaluation error at L20:48 for 'list' @ L20, false for 'list' @ L20","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery dynamicExists where permissionId == \"missing\"","a":"PERMISSION_DENIED: evaluation error at L20:48 for 'list' @ L20, false for 'list' @ L20","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen dynamicExists where permissionId == \"missing\"","a":"PERMISSION_DENIED: evaluation error at L20:48 for 'list' @ L20, false for 'list' @ L20","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery dynamicExists","a":"PERMISSION_DENIED: Property permissionId is undefined on object. for 'list' @ L20","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery dynamicExists","a":"PERMISSION_DENIED: Property permissionId is undefined on object. for 'list' @ L20","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen dynamicExists","a":"PERMISSION_DENIED: Property permissionId is undefined on object. for 'list' @ L20","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery group groupDocs where createdBy == \"query-owner\"","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery group groupDocs where createdBy == \"query-owner\"","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen group groupDocs where createdBy == \"query-owner\"","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery group groupDocs","a":"PERMISSION_DENIED: Property createdBy is undefined on object. for 'list' @ L21","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery group groupDocs","a":"PERMISSION_DENIED: Property createdBy is undefined on object. for 'list' @ L21","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen group groupDocs","a":"PERMISSION_DENIED: Property createdBy is undefined on object. for 'list' @ L21","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery group emptyGroup where createdBy == \"query-owner\"","a":"OK · 0 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery group emptyGroup where createdBy == \"query-owner\"","a":"OK · count 0","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen group emptyGroup where createdBy == \"query-owner\"","a":"OK · 0 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery group records where createdBy == \"query-owner\"","a":"PERMISSION_DENIED: No matching allow statements","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery group records where createdBy == \"query-owner\"","a":"PERMISSION_DENIED: No matching allow statements","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen group records where createdBy == \"query-owner\"","a":"PERMISSION_DENIED: No matching allow statements","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery parents/p1/groupDocs where createdBy == \"query-owner\"","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery parents/p1/groupDocs where createdBy == \"query-owner\"","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen parents/p1/groupDocs where createdBy == \"query-owner\"","a":"OK · 1 document","r":"c","k":"answer"},{"t":"ListDocuments over gRPC","q":"ListDocuments records","a":"PERMISSION_DENIED: Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"ListDocuments over gRPC","q":"ListDocuments emptyRecords","a":"PERMISSION_DENIED: Property createdBy is undefined on object. for 'list' @ L9","r":"c","k":"status"},{"t":"ListDocuments over gRPC","q":"ListDocuments fixedGet","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"ListDocuments over gRPC","q":"ListDocuments limited limit 12","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"ListenChanges over gRPC","q":"ListenChanges records where createdBy == \"query-owner\" order by updatedAt desc limit 12","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen records where createdBy == \"query-owner\" order by updatedAt desc limit 12","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery records where createdBy == \"query-owner\" order by updatedAt desc limit 12","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen records","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery records","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen records where createdBy == \"other-owner\"","a":"permission-denied: Property permissionId is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery records where createdBy == \"other-owner\"","a":"permission-denied: Property permissionId is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen records where createdBy == \"query-owner\"","a":"permission-denied: false for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery records where createdBy == \"query-owner\"","a":"permission-denied: false for 'list' @ L8","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen records where createdBy in [\"query-owner\"]","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery records where createdBy in [\"query-owner\"]","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen records where createdBy in [\"query-owner\",\"other-owner\"]","a":"permission-denied: false for 'list' @ L8, Property permissionId is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery records where createdBy in [\"query-owner\",\"other-owner\"]","a":"permission-denied: false for 'list' @ L8, Property permissionId is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen records where createdBy array-contains \"query-owner\"","a":"permission-denied: evaluation error at L8:42 for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery records where createdBy array-contains \"query-owner\"","a":"permission-denied: evaluation error at L8:42 for 'list' @ L8","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen records where createdBy >= \"query-owner\"","a":"permission-denied: evaluation error at L8:42 for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery records where createdBy >= \"query-owner\"","a":"permission-denied: evaluation error at L8:42 for 'list' @ L8","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen records where (createdBy >= \"query-owner\" and createdBy <= \"query-owner\")","a":"permission-denied: evaluation error at L8:42 for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery records where (createdBy >= \"query-owner\" and createdBy <= \"query-owner\")","a":"permission-denied: evaluation error at L8:42 for 'list' @ L8","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen records where (createdBy == \"query-owner\" and published == false)","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery records where (createdBy == \"query-owner\" and published == false)","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen records where ((createdBy == \"query-owner\" and published == false) or (createdBy == \"query-owner\" and published == true))","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery records where ((createdBy == \"query-owner\" and published == false) or (createdBy == \"query-owner\" and published == true…","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen records where (createdBy == \"query-owner\" or published == true)","a":"permission-denied: false for 'list' @ L8, Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery records where (createdBy == \"query-owner\" or published == true)","a":"permission-denied: false for 'list' @ L8, Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen emptyRecords where createdBy == \"query-owner\"","a":"OK · 0 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery emptyRecords where createdBy == \"query-owner\"","a":"OK · count 0","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen emptyRecords","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L9","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery emptyRecords","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L9","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen emptyRecords where createdBy == \"other-owner\"","a":"permission-denied: Property permissionId is undefined on object. for 'list' @ L9","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery emptyRecords where createdBy == \"other-owner\"","a":"permission-denied: Property permissionId is undefined on object. for 'list' @ L9","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen records where (createdBy == \"query-owner\" and updatedAt == -1)","a":"OK · 0 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery records where (createdBy == \"query-owner\" and updatedAt == -1)","a":"OK · count 0","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen records where permissionId == \"granted\"","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery records where permissionId == \"granted\"","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen records where permissionId == \"denied\"","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L8, Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery records where permissionId == \"denied\"","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L8, Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen records where permissionId == \"missing\"","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L8, Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery records where permissionId == \"missing\"","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L8, Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen records where permissionId in [\"granted\",\"granted2\"]","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery records where permissionId in [\"granted\",\"granted2\"]","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen records where permissionId in [\"granted\",\"denied\"]","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L8, Property createdBy is undefined on object. for 'list' @ L8,…","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery records where permissionId in [\"granted\",\"denied\"]","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L8, Property createdBy is undefined on object. for 'list' @ L8,…","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen shortCircuit where createdBy == \"query-owner\"","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery shortCircuit where createdBy == \"query-owner\"","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen shared where members array-contains \"query-owner\"","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery shared where members array-contains \"query-owner\"","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen shared where members array-contains \"other-owner\"","a":"permission-denied: evaluation error at L11:41 for 'list' @ L11","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery shared where members array-contains \"other-owner\"","a":"permission-denied: evaluation error at L11:41 for 'list' @ L11","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen shared where members array-contains-any [\"query-owner\"]","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery shared where members array-contains-any [\"query-owner\"]","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen shared where members array-contains-any [\"query-owner\",\"other-owner\"]","a":"permission-denied: false for 'list' @ L11, evaluation error at L11:41 for 'list' @ L11","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery shared where members array-contains-any [\"query-owner\",\"other-owner\"]","a":"permission-denied: false for 'list' @ L11, evaluation error at L11:41 for 'list' @ L11","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen shared","a":"permission-denied: Property members is undefined on object. for 'list' @ L11","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery shared","a":"permission-denied: Property members is undefined on object. for 'list' @ L11","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen ratings where score == 5","a":"OK · 0 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery ratings where score == 5","a":"OK · count 0","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen ratings where score > 5","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery ratings where score > 5","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen ratings where score >= 5","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery ratings where score >= 5","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen ratings where score >= 4","a":"permission-denied: evaluation error at L12:42 for 'list' @ L12","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery ratings where score >= 4","a":"permission-denied: evaluation error at L12:42 for 'list' @ L12","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen ratings where score in [5,7]","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery ratings where score in [5,7]","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen ratings where score in [4,7]","a":"permission-denied: false for 'list' @ L12","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery ratings where score in [4,7]","a":"permission-denied: false for 'list' @ L12","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen ratings","a":"permission-denied: Property score is undefined on object. for 'list' @ L12","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery ratings","a":"permission-denied: Property score is undefined on object. for 'list' @ L12","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen nonnull where value != null","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery nonnull where value != null","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen notblocked where value != \"blocked\"","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery notblocked where value != \"blocked\"","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen notblocked where value not-in [\"blocked\",\"also-blocked\"]","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery notblocked where value not-in [\"blocked\",\"also-blocked\"]","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen limited limit 12","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery limited limit 12","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen limited limit 13","a":"permission-denied: false for 'list' @ L15","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery limited limit 13","a":"permission-denied: false for 'list' @ L15","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen limited","a":"permission-denied: Unsupported operation error. Received: null <= int. Expected: string <= string, bytes <= bytes, int <= int, float <= flo…","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery limited","a":"permission-denied: Unsupported operation error. Received: null <= int. Expected: string <= string, bytes <= bytes, int <= int, float <= flo…","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen offsets","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery offsets","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen ordering order by updatedAt desc","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery ordering order by updatedAt desc","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen ordering order by updatedAt asc","a":"permission-denied: false for 'list' @ L17","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery ordering order by updatedAt asc","a":"permission-denied: false for 'list' @ L17","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen ordering","a":"permission-denied: Property updatedAt is undefined on object. for 'list' @ L17","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery ordering","a":"permission-denied: Property updatedAt is undefined on object. for 'list' @ L17","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen fixedGet","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery fixedGet","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen fixedExists","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery fixedExists","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen dynamicExists where permissionId == \"granted\"","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery dynamicExists where permissionId == \"granted\"","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen dynamicExists where permissionId == \"missing\"","a":"permission-denied: evaluation error at L20:48 for 'list' @ L20, false for 'list' @ L20","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery dynamicExists where permissionId == \"missing\"","a":"permission-denied: evaluation error at L20:48 for 'list' @ L20, false for 'list' @ L20","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen dynamicExists","a":"permission-denied: Property permissionId is undefined on object. for 'list' @ L20","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery dynamicExists","a":"permission-denied: Property permissionId is undefined on object. for 'list' @ L20","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen group groupDocs where createdBy == \"query-owner\"","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery group groupDocs where createdBy == \"query-owner\"","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen group groupDocs","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L21","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery group groupDocs","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L21","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen group emptyGroup where createdBy == \"query-owner\"","a":"OK · 0 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery group emptyGroup where createdBy == \"query-owner\"","a":"OK · count 0","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen group records where createdBy == \"query-owner\"","a":"permission-denied: No matching allow statements","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery group records where createdBy == \"query-owner\"","a":"permission-denied: No matching allow statements","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen parents/p1/groupDocs where createdBy == \"query-owner\"","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery parents/p1/groupDocs where createdBy == \"query-owner\"","a":"OK · count 1","r":"c","k":"answer"},{"t":"ListenChanges from the browser SDK (long-poll WebChannel)","q":"ListenChanges records where createdBy == \"query-owner\" order by updatedAt desc limit 12","a":"OK · 0 documents","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen records where createdBy == \"query-owner\" order by updatedAt desc limit 12","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery records where createdBy == \"query-owner\" order by updatedAt desc limit 12","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen records","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery records","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen records where createdBy == \"other-owner\"","a":"permission-denied: Property permissionId is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery records where createdBy == \"other-owner\"","a":"permission-denied: Property permissionId is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen records where createdBy == \"query-owner\"","a":"permission-denied: false for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery records where createdBy == \"query-owner\"","a":"permission-denied: false for 'list' @ L8","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen records where createdBy in [\"query-owner\"]","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery records where createdBy in [\"query-owner\"]","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen records where createdBy in [\"query-owner\",\"other-owner\"]","a":"permission-denied: false for 'list' @ L8, Property permissionId is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery records where createdBy in [\"query-owner\",\"other-owner\"]","a":"permission-denied: false for 'list' @ L8, Property permissionId is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen records where createdBy array-contains \"query-owner\"","a":"permission-denied: evaluation error at L8:42 for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery records where createdBy array-contains \"query-owner\"","a":"permission-denied: evaluation error at L8:42 for 'list' @ L8","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen records where createdBy >= \"query-owner\"","a":"permission-denied: evaluation error at L8:42 for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery records where createdBy >= \"query-owner\"","a":"permission-denied: evaluation error at L8:42 for 'list' @ L8","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen records where (createdBy >= \"query-owner\" and createdBy <= \"query-owner\")","a":"permission-denied: evaluation error at L8:42 for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery records where (createdBy >= \"query-owner\" and createdBy <= \"query-owner\")","a":"permission-denied: evaluation error at L8:42 for 'list' @ L8","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen records where (createdBy == \"query-owner\" and published == false)","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery records where (createdBy == \"query-owner\" and published == false)","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen records where ((createdBy == \"query-owner\" and published == false) or (createdBy == \"query-owner\" and published == true))","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery records where ((createdBy == \"query-owner\" and published == false) or (createdBy == \"query-owner\" and published == true…","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen records where (createdBy == \"query-owner\" or published == true)","a":"permission-denied: false for 'list' @ L8, Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery records where (createdBy == \"query-owner\" or published == true)","a":"permission-denied: false for 'list' @ L8, Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen emptyRecords where createdBy == \"query-owner\"","a":"OK · 0 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery emptyRecords where createdBy == \"query-owner\"","a":"OK · count 0","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen emptyRecords","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L9","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery emptyRecords","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L9","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen emptyRecords where createdBy == \"other-owner\"","a":"permission-denied: Property permissionId is undefined on object. for 'list' @ L9","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery emptyRecords where createdBy == \"other-owner\"","a":"permission-denied: Property permissionId is undefined on object. for 'list' @ L9","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen records where (createdBy == \"query-owner\" and updatedAt == -1)","a":"OK · 0 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery records where (createdBy == \"query-owner\" and updatedAt == -1)","a":"OK · count 0","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen records where permissionId == \"granted\"","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery records where permissionId == \"granted\"","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen records where permissionId == \"denied\"","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L8, Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery records where permissionId == \"denied\"","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L8, Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen records where permissionId == \"missing\"","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L8, Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery records where permissionId == \"missing\"","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L8, Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen records where permissionId in [\"granted\",\"granted2\"]","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery records where permissionId in [\"granted\",\"granted2\"]","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen records where permissionId in [\"granted\",\"denied\"]","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L8, Property createdBy is undefined on object. for 'list' @ L8,…","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery records where permissionId in [\"granted\",\"denied\"]","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L8, Property createdBy is undefined on object. for 'list' @ L8,…","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen shortCircuit where createdBy == \"query-owner\"","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery shortCircuit where createdBy == \"query-owner\"","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen shared where members array-contains \"query-owner\"","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery shared where members array-contains \"query-owner\"","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen shared where members array-contains \"other-owner\"","a":"permission-denied: evaluation error at L11:41 for 'list' @ L11","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery shared where members array-contains \"other-owner\"","a":"permission-denied: evaluation error at L11:41 for 'list' @ L11","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen shared where members array-contains-any [\"query-owner\"]","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery shared where members array-contains-any [\"query-owner\"]","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen shared where members array-contains-any [\"query-owner\",\"other-owner\"]","a":"permission-denied: false for 'list' @ L11, evaluation error at L11:41 for 'list' @ L11","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery shared where members array-contains-any [\"query-owner\",\"other-owner\"]","a":"permission-denied: false for 'list' @ L11, evaluation error at L11:41 for 'list' @ L11","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen shared","a":"permission-denied: Property members is undefined on object. for 'list' @ L11","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery shared","a":"permission-denied: Property members is undefined on object. for 'list' @ L11","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen ratings where score == 5","a":"OK · 0 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery ratings where score == 5","a":"OK · count 0","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen ratings where score > 5","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery ratings where score > 5","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen ratings where score >= 5","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery ratings where score >= 5","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen ratings where score >= 4","a":"permission-denied: evaluation error at L12:42 for 'list' @ L12","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery ratings where score >= 4","a":"permission-denied: evaluation error at L12:42 for 'list' @ L12","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen ratings where score in [5,7]","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery ratings where score in [5,7]","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen ratings where score in [4,7]","a":"permission-denied: false for 'list' @ L12","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery ratings where score in [4,7]","a":"permission-denied: false for 'list' @ L12","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen ratings","a":"permission-denied: Property score is undefined on object. for 'list' @ L12","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery ratings","a":"permission-denied: Property score is undefined on object. for 'list' @ L12","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen nonnull where value != null","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery nonnull where value != null","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen notblocked where value != \"blocked\"","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery notblocked where value != \"blocked\"","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen notblocked where value not-in [\"blocked\",\"also-blocked\"]","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery notblocked where value not-in [\"blocked\",\"also-blocked\"]","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen limited limit 12","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery limited limit 12","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen limited limit 13","a":"permission-denied: false for 'list' @ L15","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery limited limit 13","a":"permission-denied: false for 'list' @ L15","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen limited","a":"permission-denied: Unsupported operation error. Received: null <= int. Expected: string <= string, bytes <= bytes, int <= int, float <= flo…","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery limited","a":"permission-denied: Unsupported operation error. Received: null <= int. Expected: string <= string, bytes <= bytes, int <= int, float <= flo…","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen offsets","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery offsets","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen ordering order by updatedAt desc","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery ordering order by updatedAt desc","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen ordering order by updatedAt asc","a":"permission-denied: false for 'list' @ L17","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery ordering order by updatedAt asc","a":"permission-denied: false for 'list' @ L17","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen ordering","a":"permission-denied: Property updatedAt is undefined on object. for 'list' @ L17","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery ordering","a":"permission-denied: Property updatedAt is undefined on object. for 'list' @ L17","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen fixedGet","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery fixedGet","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen fixedExists","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery fixedExists","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen dynamicExists where permissionId == \"granted\"","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery dynamicExists where permissionId == \"granted\"","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen dynamicExists where permissionId == \"missing\"","a":"permission-denied: evaluation error at L20:48 for 'list' @ L20, false for 'list' @ L20","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery dynamicExists where permissionId == \"missing\"","a":"permission-denied: evaluation error at L20:48 for 'list' @ L20, false for 'list' @ L20","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen dynamicExists","a":"permission-denied: Property permissionId is undefined on object. for 'list' @ L20","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery dynamicExists","a":"permission-denied: Property permissionId is undefined on object. for 'list' @ L20","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen group groupDocs where createdBy == \"query-owner\"","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery group groupDocs where createdBy == \"query-owner\"","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen group groupDocs","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L21","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery group groupDocs","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L21","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen group emptyGroup where createdBy == \"query-owner\"","a":"OK · 0 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery group emptyGroup where createdBy == \"query-owner\"","a":"OK · count 0","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen group records where createdBy == \"query-owner\"","a":"permission-denied: No matching allow statements","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery group records where createdBy == \"query-owner\"","a":"permission-denied: No matching allow statements","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen parents/p1/groupDocs where createdBy == \"query-owner\"","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery parents/p1/groupDocs where createdBy == \"query-owner\"","a":"OK · count 1","r":"c","k":"answer"},{"t":"ListenChanges from the browser SDK (streaming WebChannel)","q":"ListenChanges records where createdBy == \"query-owner\" order by updatedAt desc limit 12","a":"OK · 0 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery records where createdBy == \"query-owner\" order by updatedAt desc limit 12","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery records where createdBy == \"query-owner\" order by updatedAt desc limit 12","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen records where createdBy == \"query-owner\" order by updatedAt desc limit 12","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery records","a":"PERMISSION_DENIED: Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery records","a":"PERMISSION_DENIED: Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen records","a":"PERMISSION_DENIED: Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery emptyRecords","a":"PERMISSION_DENIED: Property createdBy is undefined on object. for 'list' @ L9","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery emptyRecords","a":"PERMISSION_DENIED: Property createdBy is undefined on object. for 'list' @ L9","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen emptyRecords","a":"PERMISSION_DENIED: Property createdBy is undefined on object. for 'list' @ L9","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery limited limit 12","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery limited limit 12","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen limited limit 12","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery fixedGet","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery fixedGet","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen fixedGet","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/granted/members","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/granted/members","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen queryParents/granted/members","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/denied/members","a":"PERMISSION_DENIED: Null value error. for 'list' @ L28, Null value error. for 'list' @ L28","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/denied/members","a":"PERMISSION_DENIED: Null value error. for 'list' @ L28, Null value error. for 'list' @ L28","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen queryParents/denied/members","a":"PERMISSION_DENIED: Null value error. for 'list' @ L28, Null value error. for 'list' @ L28","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/missing/members","a":"PERMISSION_DENIED: Null value error. for 'list' @ L28, Null value error. for 'list' @ L28","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/missing/members","a":"PERMISSION_DENIED: Null value error. for 'list' @ L28, Null value error. for 'list' @ L28","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen queryParents/missing/members","a":"PERMISSION_DENIED: Null value error. for 'list' @ L28, Null value error. for 'list' @ L28","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/granted/getMembers","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/granted/getMembers","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen queryParents/granted/getMembers","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/denied/getMembers","a":"PERMISSION_DENIED: Null value error. for 'list' @ L31, Null value error. for 'list' @ L31","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/denied/getMembers","a":"PERMISSION_DENIED: Null value error. for 'list' @ L31, Null value error. for 'list' @ L31","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen queryParents/denied/getMembers","a":"PERMISSION_DENIED: Null value error. for 'list' @ L31, Null value error. for 'list' @ L31","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/missing/getMembers","a":"PERMISSION_DENIED: Null value error. for 'list' @ L31, Null value error. for 'list' @ L31","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/missing/getMembers","a":"PERMISSION_DENIED: Null value error. for 'list' @ L31, Null value error. for 'list' @ L31","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen queryParents/missing/getMembers","a":"PERMISSION_DENIED: Null value error. for 'list' @ L31, Null value error. for 'list' @ L31","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/granted/functionMembers","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/granted/functionMembers","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen queryParents/granted/functionMembers","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/denied/functionMembers","a":"PERMISSION_DENIED: Null value error. for 'list' @ L33, Null value error. for 'list' @ L33","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/denied/functionMembers","a":"PERMISSION_DENIED: Null value error. for 'list' @ L33, Null value error. for 'list' @ L33","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen queryParents/denied/functionMembers","a":"PERMISSION_DENIED: Null value error. for 'list' @ L33, Null value error. for 'list' @ L33","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/missing/functionMembers","a":"PERMISSION_DENIED: Null value error. for 'list' @ L33, Null value error. for 'list' @ L33","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/missing/functionMembers","a":"PERMISSION_DENIED: Null value error. for 'list' @ L33, Null value error. for 'list' @ L33","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen queryParents/missing/functionMembers","a":"PERMISSION_DENIED: Null value error. for 'list' @ L33, Null value error. for 'list' @ L33","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/granted/reversedMembers","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/granted/reversedMembers","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen queryParents/granted/reversedMembers","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/denied/reversedMembers","a":"PERMISSION_DENIED: evaluation error at L35:24 for 'list' @ L35, Null value error. for 'list' @ L35","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/denied/reversedMembers","a":"PERMISSION_DENIED: evaluation error at L35:24 for 'list' @ L35, Null value error. for 'list' @ L35","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen queryParents/denied/reversedMembers","a":"PERMISSION_DENIED: evaluation error at L35:24 for 'list' @ L35, Null value error. for 'list' @ L35","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/missing/reversedMembers","a":"PERMISSION_DENIED: evaluation error at L35:24 for 'list' @ L35, Null value error. for 'list' @ L35","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/missing/reversedMembers","a":"PERMISSION_DENIED: evaluation error at L35:24 for 'list' @ L35, Null value error. for 'list' @ L35","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen queryParents/missing/reversedMembers","a":"PERMISSION_DENIED: evaluation error at L35:24 for 'list' @ L35, Null value error. for 'list' @ L35","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/granted/unknownOnly","a":"PERMISSION_DENIED: Null value error. for 'list' @ L37","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/granted/unknownOnly","a":"PERMISSION_DENIED: Null value error. for 'list' @ L37","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen queryParents/granted/unknownOnly","a":"PERMISSION_DENIED: Null value error. for 'list' @ L37","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/denied/unknownOnly","a":"PERMISSION_DENIED: Null value error. for 'list' @ L37","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/denied/unknownOnly","a":"PERMISSION_DENIED: Null value error. for 'list' @ L37","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen queryParents/denied/unknownOnly","a":"PERMISSION_DENIED: Null value error. for 'list' @ L37","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/missing/unknownOnly","a":"PERMISSION_DENIED: Null value error. for 'list' @ L37","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/missing/unknownOnly","a":"PERMISSION_DENIED: Null value error. for 'list' @ L37","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen queryParents/missing/unknownOnly","a":"PERMISSION_DENIED: Null value error. for 'list' @ L37","r":"c","k":"status"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/granted/negatedAnd","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/granted/negatedAnd","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen queryParents/granted/negatedAnd","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/denied/negatedAnd","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/denied/negatedAnd","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen queryParents/denied/negatedAnd","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/missing/negatedAnd","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/missing/negatedAnd","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen queryParents/missing/negatedAnd","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/granted/literalOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/granted/literalOr","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen queryParents/granted/literalOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/denied/literalOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/denied/literalOr","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen queryParents/denied/literalOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/missing/literalOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/missing/literalOr","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen queryParents/missing/literalOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/granted/concreteErrorOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/granted/concreteErrorOr","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen queryParents/granted/concreteErrorOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/denied/concreteErrorOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/denied/concreteErrorOr","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen queryParents/denied/concreteErrorOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/missing/concreteErrorOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/missing/concreteErrorOr","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen queryParents/missing/concreteErrorOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/granted/concreteErrorAnd","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/granted/concreteErrorAnd","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen queryParents/granted/concreteErrorAnd","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/denied/concreteErrorAnd","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/denied/concreteErrorAnd","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen queryParents/denied/concreteErrorAnd","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/missing/concreteErrorAnd","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/missing/concreteErrorAnd","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen queryParents/missing/concreteErrorAnd","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/granted/budgetErrorOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/granted/budgetErrorOr","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen queryParents/granted/budgetErrorOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/denied/budgetErrorOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/denied/budgetErrorOr","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen queryParents/denied/budgetErrorOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/missing/budgetErrorOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/missing/budgetErrorOr","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen queryParents/missing/budgetErrorOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/emptyGranted/members","a":"OK · 0 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/emptyGranted/members","a":"OK · count 0","r":"c","k":"answer"},{"t":"Listen over gRPC","q":"Listen queryParents/emptyGranted/members","a":"OK · 0 documents","r":"c","k":"answer"},{"t":"RunQuery over gRPC","q":"RunQuery queryParents/denied/members where uid == \"query-owner\"","a":"PERMISSION_DENIED: Null value error. for 'list' @ L28, Null value error. for 'list' @ L28","r":"c","k":"status"},{"t":"RunAggregationQuery over gRPC","q":"RunAggregationQuery queryParents/denied/members where uid == \"query-owner\"","a":"PERMISSION_DENIED: Null value error. for 'list' @ L28, Null value error. for 'list' @ L28","r":"c","k":"status"},{"t":"Listen over gRPC","q":"Listen queryParents/denied/members where uid == \"query-owner\"","a":"PERMISSION_DENIED: Null value error. for 'list' @ L28, Null value error. for 'list' @ L28","r":"c","k":"status"},{"t":"ListDocuments over gRPC","q":"ListDocuments records","a":"PERMISSION_DENIED: Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"ListDocuments over gRPC","q":"ListDocuments emptyRecords","a":"PERMISSION_DENIED: Property createdBy is undefined on object. for 'list' @ L9","r":"c","k":"status"},{"t":"ListDocuments over gRPC","q":"ListDocuments fixedGet","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"ListDocuments over gRPC","q":"ListDocuments limited limit 12","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"ListDocuments over gRPC","q":"ListDocuments queryParents/granted/members","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"ListDocuments over gRPC","q":"ListDocuments queryParents/denied/members","a":"PERMISSION_DENIED: Null value error. for 'list' @ L28, Null value error. for 'list' @ L28","r":"c","k":"status"},{"t":"ListDocuments over gRPC","q":"ListDocuments queryParents/emptyGranted/members","a":"OK · 0 documents","r":"c","k":"answer"},{"t":"ListenChanges over gRPC","q":"ListenChanges records where createdBy == \"query-owner\" order by updatedAt desc limit 12","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen records where createdBy == \"query-owner\" order by updatedAt desc limit 12","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery records where createdBy == \"query-owner\" order by updatedAt desc limit 12","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen records","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery records","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen emptyRecords","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L9","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery emptyRecords","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L9","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen limited limit 12","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery limited limit 12","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen fixedGet","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery fixedGet","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/granted/members","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/granted/members","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/denied/members","a":"permission-denied: Null value error. for 'list' @ L28, Null value error. for 'list' @ L28","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/denied/members","a":"permission-denied: Null value error. for 'list' @ L28, Null value error. for 'list' @ L28","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/missing/members","a":"permission-denied: Null value error. for 'list' @ L28, Null value error. for 'list' @ L28","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/missing/members","a":"permission-denied: Null value error. for 'list' @ L28, Null value error. for 'list' @ L28","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/granted/getMembers","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/granted/getMembers","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/denied/getMembers","a":"permission-denied: Null value error. for 'list' @ L31, Null value error. for 'list' @ L31","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/denied/getMembers","a":"permission-denied: Null value error. for 'list' @ L31, Null value error. for 'list' @ L31","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/missing/getMembers","a":"permission-denied: Null value error. for 'list' @ L31, Null value error. for 'list' @ L31","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/missing/getMembers","a":"permission-denied: Null value error. for 'list' @ L31, Null value error. for 'list' @ L31","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/granted/functionMembers","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/granted/functionMembers","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/denied/functionMembers","a":"permission-denied: Null value error. for 'list' @ L33, Null value error. for 'list' @ L33","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/denied/functionMembers","a":"permission-denied: Null value error. for 'list' @ L33, Null value error. for 'list' @ L33","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/missing/functionMembers","a":"permission-denied: Null value error. for 'list' @ L33, Null value error. for 'list' @ L33","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/missing/functionMembers","a":"permission-denied: Null value error. for 'list' @ L33, Null value error. for 'list' @ L33","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/granted/reversedMembers","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/granted/reversedMembers","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/denied/reversedMembers","a":"permission-denied: evaluation error at L35:24 for 'list' @ L35, Null value error. for 'list' @ L35","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/denied/reversedMembers","a":"permission-denied: evaluation error at L35:24 for 'list' @ L35, Null value error. for 'list' @ L35","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/missing/reversedMembers","a":"permission-denied: evaluation error at L35:24 for 'list' @ L35, Null value error. for 'list' @ L35","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/missing/reversedMembers","a":"permission-denied: evaluation error at L35:24 for 'list' @ L35, Null value error. for 'list' @ L35","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/granted/unknownOnly","a":"permission-denied: Null value error. for 'list' @ L37","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/granted/unknownOnly","a":"permission-denied: Null value error. for 'list' @ L37","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/denied/unknownOnly","a":"permission-denied: Null value error. for 'list' @ L37","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/denied/unknownOnly","a":"permission-denied: Null value error. for 'list' @ L37","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/missing/unknownOnly","a":"permission-denied: Null value error. for 'list' @ L37","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/missing/unknownOnly","a":"permission-denied: Null value error. for 'list' @ L37","r":"c","k":"status"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/granted/negatedAnd","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/granted/negatedAnd","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/denied/negatedAnd","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/denied/negatedAnd","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/missing/negatedAnd","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/missing/negatedAnd","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/granted/literalOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/granted/literalOr","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/denied/literalOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/denied/literalOr","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/missing/literalOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/missing/literalOr","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/granted/concreteErrorOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/granted/concreteErrorOr","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/denied/concreteErrorOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/denied/concreteErrorOr","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/missing/concreteErrorOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/missing/concreteErrorOr","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/granted/concreteErrorAnd","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/granted/concreteErrorAnd","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/denied/concreteErrorAnd","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/denied/concreteErrorAnd","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/missing/concreteErrorAnd","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/missing/concreteErrorAnd","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/granted/budgetErrorOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/granted/budgetErrorOr","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/denied/budgetErrorOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/denied/budgetErrorOr","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/missing/budgetErrorOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/missing/budgetErrorOr","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/emptyGranted/members","a":"OK · 0 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/emptyGranted/members","a":"OK · count 0","r":"c","k":"answer"},{"t":"Listen from the browser SDK (long-poll WebChannel)","q":"Listen queryParents/denied/members where uid == \"query-owner\"","a":"permission-denied: Null value error. for 'list' @ L28, Null value error. for 'list' @ L28","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (long-poll WebChannel)","q":"RunAggregationQuery queryParents/denied/members where uid == \"query-owner\"","a":"permission-denied: Null value error. for 'list' @ L28, Null value error. for 'list' @ L28","r":"c","k":"status"},{"t":"ListenChanges from the browser SDK (long-poll WebChannel)","q":"ListenChanges records where createdBy == \"query-owner\" order by updatedAt desc limit 12","a":"OK · 0 documents","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen records where createdBy == \"query-owner\" order by updatedAt desc limit 12","a":"OK · 1 document","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery records where createdBy == \"query-owner\" order by updatedAt desc limit 12","a":"OK · count 1","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen records","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery records","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L8","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen emptyRecords","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L9","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery emptyRecords","a":"permission-denied: Property createdBy is undefined on object. for 'list' @ L9","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen limited limit 12","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery limited limit 12","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen fixedGet","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery fixedGet","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/granted/members","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/granted/members","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/denied/members","a":"permission-denied: Null value error. for 'list' @ L28, Null value error. for 'list' @ L28","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/denied/members","a":"permission-denied: Null value error. for 'list' @ L28, Null value error. for 'list' @ L28","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/missing/members","a":"permission-denied: Null value error. for 'list' @ L28, Null value error. for 'list' @ L28","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/missing/members","a":"permission-denied: Null value error. for 'list' @ L28, Null value error. for 'list' @ L28","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/granted/getMembers","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/granted/getMembers","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/denied/getMembers","a":"permission-denied: Null value error. for 'list' @ L31, Null value error. for 'list' @ L31","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/denied/getMembers","a":"permission-denied: Null value error. for 'list' @ L31, Null value error. for 'list' @ L31","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/missing/getMembers","a":"permission-denied: Null value error. for 'list' @ L31, Null value error. for 'list' @ L31","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/missing/getMembers","a":"permission-denied: Null value error. for 'list' @ L31, Null value error. for 'list' @ L31","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/granted/functionMembers","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/granted/functionMembers","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/denied/functionMembers","a":"permission-denied: Null value error. for 'list' @ L33, Null value error. for 'list' @ L33","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/denied/functionMembers","a":"permission-denied: Null value error. for 'list' @ L33, Null value error. for 'list' @ L33","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/missing/functionMembers","a":"permission-denied: Null value error. for 'list' @ L33, Null value error. for 'list' @ L33","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/missing/functionMembers","a":"permission-denied: Null value error. for 'list' @ L33, Null value error. for 'list' @ L33","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/granted/reversedMembers","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/granted/reversedMembers","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/denied/reversedMembers","a":"permission-denied: evaluation error at L35:24 for 'list' @ L35, Null value error. for 'list' @ L35","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/denied/reversedMembers","a":"permission-denied: evaluation error at L35:24 for 'list' @ L35, Null value error. for 'list' @ L35","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/missing/reversedMembers","a":"permission-denied: evaluation error at L35:24 for 'list' @ L35, Null value error. for 'list' @ L35","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/missing/reversedMembers","a":"permission-denied: evaluation error at L35:24 for 'list' @ L35, Null value error. for 'list' @ L35","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/granted/unknownOnly","a":"permission-denied: Null value error. for 'list' @ L37","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/granted/unknownOnly","a":"permission-denied: Null value error. for 'list' @ L37","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/denied/unknownOnly","a":"permission-denied: Null value error. for 'list' @ L37","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/denied/unknownOnly","a":"permission-denied: Null value error. for 'list' @ L37","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/missing/unknownOnly","a":"permission-denied: Null value error. for 'list' @ L37","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/missing/unknownOnly","a":"permission-denied: Null value error. for 'list' @ L37","r":"c","k":"status"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/granted/negatedAnd","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/granted/negatedAnd","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/denied/negatedAnd","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/denied/negatedAnd","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/missing/negatedAnd","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/missing/negatedAnd","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/granted/literalOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/granted/literalOr","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/denied/literalOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/denied/literalOr","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/missing/literalOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/missing/literalOr","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/granted/concreteErrorOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/granted/concreteErrorOr","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/denied/concreteErrorOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/denied/concreteErrorOr","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/missing/concreteErrorOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/missing/concreteErrorOr","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/granted/concreteErrorAnd","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/granted/concreteErrorAnd","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/denied/concreteErrorAnd","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/denied/concreteErrorAnd","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/missing/concreteErrorAnd","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/missing/concreteErrorAnd","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/granted/budgetErrorOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/granted/budgetErrorOr","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/denied/budgetErrorOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/denied/budgetErrorOr","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/missing/budgetErrorOr","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/missing/budgetErrorOr","a":"OK · count 2","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/emptyGranted/members","a":"OK · 0 documents","r":"c","k":"answer"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/emptyGranted/members","a":"OK · count 0","r":"c","k":"answer"},{"t":"Listen from the browser SDK (streaming WebChannel)","q":"Listen queryParents/denied/members where uid == \"query-owner\"","a":"permission-denied: Null value error. for 'list' @ L28, Null value error. for 'list' @ L28","r":"c","k":"status"},{"t":"RunAggregationQuery from the browser SDK (streaming WebChannel)","q":"RunAggregationQuery queryParents/denied/members where uid == \"query-owner\"","a":"permission-denied: Null value error. for 'list' @ L28, Null value error. for 'list' @ L28","r":"c","k":"status"},{"t":"ListenChanges from the browser SDK (streaming WebChannel)","q":"ListenChanges records where createdBy == \"query-owner\" order by updatedAt desc limit 12","a":"OK · 0 documents","r":"c","k":"answer"}]} \ No newline at end of file diff --git a/public/conformance/firestore.json b/public/conformance/firestore.json new file mode 100644 index 0000000..4e5b406 --- /dev/null +++ b/public/conformance/firestore.json @@ -0,0 +1 @@ +{"runs":[[0,1,0,"Browser RunAggregationQuery count request and response envelope"],[1,2,0,"Browser aggregation serializes multiple where clauses as a composite filter"],[3,1,0,"Browser RunAggregationQuery count request and response envelope"],[4,2,0,"Browser observes the maximum-aggregation validation response"],[6,9,0,"Browser transactions pin multi-write validation, verify writes, and quoted update masks"],[15,7,0,"An identical document replacement preserves the document update time"],[22,2,1,"A lost streaming Listen backchannel reopens with replay bookkeeping"],[24,9,1,"A named query loaded from an SDK bundle resumes Listen from a nanosecond-precision expired read time"],[33,2,1,"Listen handshake and backchannel in forced long-polling mode"],[35,1,1,"Listen handshake and backchannel in streaming mode"],[36,6,1,"Browser queries pin special-value range filtering, multiple-inequality ordering, and key-order validation"],[42,8,1,"CJK, emoji, combining, and mixed text use UTF-16 frame lengths"],[50,1,1,"An unknown session returns the exact browser-visible HTTP 400 body"],[51,3,1,"Write handshake and acknowledgement in forced long-polling mode"],[54,6,1,"Two writes may be in flight with the last acknowledged stream token"],[60,3,1,"Write handshake and acknowledgement in streaming mode"],[63,1,1,"A lost streaming Listen backchannel reopens with replay bookkeeping"],[64,7,1,"A named query loaded from an SDK bundle resumes Listen from a nanosecond-precision expired read time"],[71,1,1,"Listen handshake and backchannel in forced long-polling mode"],[72,1,1,"Listen handshake and backchannel in streaming mode"],[73,7,1,"Browser queries pin special-value range filtering, multiple-inequality ordering, and key-order validation"],[80,44,1,"Signed 64-bit Datastore numeric resource IDs are accepted and sort numerically before ordinary string IDs"],[124,5,1,"A reserved resource ID in a query parent returns the browser-visible INVALID_ARGUMENT contract"],[129,8,1,"CJK, emoji, combining, and mixed text use UTF-16 frame lengths"],[137,35,1,"A second browser client may update a server document absent from its local cache"],[172,2,1,"Write handshake and acknowledgement in forced long-polling mode"],[174,9,1,"A missing-document update returns the browser-visible Firestore Write stream error envelope"],[183,4,1,"Two writes may be in flight with the last acknowledged stream token"],[187,1,1,"Write handshake and acknowledgement in streaming mode"],[188,21,2,"Collection ids, document listing, masks and page tokens"],[209,1,2,"Collection ids, document listing, masks and page tokens"],[210,1,3,"Node SDK get() (BatchGetDocuments) of the \"flat\" document"],[211,1,3,"gRPC GetDocument of the \"flat\" document"],[212,1,3,"gRPC ListDocuments of the \"flat\" document"],[213,1,3,"gRPC RunQuery of the \"flat\" document"],[214,1,3,"REST GET document of the \"flat\" document"],[215,1,3,"Node SDK get() (BatchGetDocuments) of the \"nested\" document"],[216,1,3,"gRPC GetDocument of the \"nested\" document"],[217,1,3,"gRPC ListDocuments of the \"nested\" document"],[218,1,3,"gRPC RunQuery of the \"nested\" document"],[219,1,3,"REST GET document of the \"nested\" document"],[220,1,3,"Node SDK get() (BatchGetDocuments) of the \"unicode\" document"],[221,1,3,"gRPC GetDocument of the \"unicode\" document"],[222,1,3,"gRPC ListDocuments of the \"unicode\" document"],[223,1,3,"gRPC RunQuery of the \"unicode\" document"],[224,1,3,"REST GET document of the \"unicode\" document"],[225,1,3,"Node SDK get() (BatchGetDocuments) of the \"wide-mixed-map\" document"],[226,1,3,"gRPC GetDocument of the \"wide-mixed-map\" document"],[227,1,3,"gRPC ListDocuments of the \"wide-mixed-map\" document"],[228,1,3,"gRPC RunQuery of the \"wide-mixed-map\" document"],[229,1,3,"REST GET document of the \"wide-mixed-map\" document"],[230,1,3,"browser SDK server read (long-poll) of the \"flat\" document"],[231,1,3,"browser SDK server read (long-poll) of the \"nested\" document"],[232,1,3,"browser SDK server read (long-poll) of the \"unicode\" document"],[233,1,3,"browser SDK server read (long-poll) of the \"wide-mixed-map\" document"],[234,1,3,"browser SDK server read (streaming) of the \"flat\" document"],[235,1,3,"browser SDK server read (streaming) of the \"nested\" document"],[236,1,3,"browser SDK server read (streaming) of the \"unicode\" document"],[237,1,3,"browser SDK server read (streaming) of the \"wide-mixed-map\" document"],[238,1,4,"Importing an export split across LevelDB shards"],[239,64,6,"Kindless queries (all descendants, no collection id)"],[303,5,6,"Aggregations over a kindless query"],[308,4,6,"A kindless listener"],[312,9,6,"Rules \"allow-all\" for a kindless query"],[321,9,6,"Rules \"signed-in\" for a kindless query"],[330,9,6,"Rules \"list-only\" for a kindless query"],[339,9,6,"Rules \"get-only\" for a kindless query"],[348,9,6,"Rules \"one-collection\" for a kindless query"],[357,9,6,"Rules \"one-group\" for a kindless query"],[366,9,6,"Rules \"one-subtree\" for a kindless query"],[375,9,6,"Rules \"wildcard-subtree\" for a kindless query"],[384,9,6,"Rules \"deny-all\" for a kindless query"],[393,4,6,"One database never sees another"],[397,8,6,"Admin SDK recursiveDelete"],[405,2,6,"Kindless queries (all descendants, no collection id)"],[407,11,7,"A listener resuming with a token or read time"],[418,1,7,"A listener resuming with a token or read time"],[419,1,8,"emulators:export of four synthetic documents"],[420,16,9,"REST read masks, transactions and read times"],[436,6,9,"REST read masks, transactions and read times"],[442,3,9,"The same transaction over gRPC GetDocument"],[445,1,10,"Browser aggregation serializes multiple where clauses as a composite filter"],[446,1,10,"Browser observes the maximum-aggregation validation response"],[447,3,10,"Browser Firestore REST v1 calls accept JSON carried as text/plain and require origin-echoing credentialed CORS headers"],[450,3,10,"Browser transactions pin multi-write validation, verify writes, and quoted update masks"],[453,1,10,"An identical document replacement preserves the document update time"],[454,1,10,"Browser aggregation serializes multiple where clauses as a composite filter"],[455,2,10,"Browser RunAggregationQuery count request and response envelope"],[457,1,10,"Browser observes the maximum-aggregation validation response"],[458,7,10,"Browser transactions pin multi-write validation, verify writes, and quoted update masks"],[465,6,10,"An identical document replacement preserves the document update time"],[471,2,11,"A lost streaming Listen backchannel reopens with replay bookkeeping"],[473,10,11,"A named query loaded from an SDK bundle resumes Listen from a nanosecond-precision expired read time"],[483,2,11,"Listen handshake and backchannel in forced long-polling mode"],[485,2,11,"Listen handshake and backchannel in streaming mode"],[487,7,11,"Browser queries pin special-value range filtering, multiple-inequality ordering, and key-order validation"],[494,10,11,"CJK, emoji, combining, and mixed text use UTF-16 frame lengths"],[504,3,11,"Write handshake and acknowledgement in forced long-polling mode"],[507,6,11,"Two writes may be in flight with the last acknowledged stream token"],[513,3,11,"Write handshake and acknowledgement in streaming mode"],[516,1,11,"A lost streaming Listen backchannel reopens with replay bookkeeping"],[517,7,11,"A named query loaded from an SDK bundle resumes Listen from a nanosecond-precision expired read time"],[524,1,11,"Listen handshake and backchannel in forced long-polling mode"],[525,1,11,"Listen handshake and backchannel in streaming mode"],[526,9,11,"Browser queries pin special-value range filtering, multiple-inequality ordering, and key-order validation"],[535,39,11,"Signed 64-bit Datastore numeric resource IDs are accepted and sort numerically before ordinary string IDs"],[574,6,11,"A reserved resource ID in a query parent returns the browser-visible INVALID_ARGUMENT contract"],[580,8,11,"CJK, emoji, combining, and mixed text use UTF-16 frame lengths"],[588,1,11,"An unknown session returns the exact browser-visible HTTP 400 body"],[589,9,11,"A six-mutation browser batch returns one WriteResult per mutation in both WebChannel variants"],[598,37,11,"A second browser client may update a server document absent from its local cache"],[635,2,11,"Write handshake and acknowledgement in forced long-polling mode"],[637,9,11,"A missing-document update returns the browser-visible Firestore Write stream error envelope"],[646,3,11,"Two writes may be in flight with the last acknowledged stream token"],[649,1,11,"Write handshake and acknowledgement in streaming mode"]],"cases":[{"t":"aggregation-count #2","q":"POST /v1/projects/{project}/databases/(default)/documents:runAggregationQuery","a":"200 [1 item]","r":"c","k":"answer"},{"t":"aggregation-composite-filter #1","q":"OPTIONS /v1/projects/{project}/databases/(default)/documents:runAggregationQuery","a":"200","r":"u"},{"t":"aggregation-composite-filter #2","q":"POST /v1/projects/{project}/databases/(default)/documents:runAggregationQuery","a":"400 FAILED_PRECONDITION: The query requires an index. You can create it here: https://console.firebase.google.com/v1/r/project/{project}/fi…","r":"u"},{"t":"aggregation-count #1","q":"OPTIONS /v1/projects/{project}/databases/(default)/documents:runAggregationQuery","a":"200","r":"u"},{"t":"aggregation-limit-error #1","q":"OPTIONS /v1/projects/{project}/databases/(default)/documents:runAggregationQuery","a":"200","r":"u"},{"t":"aggregation-limit-error #2","q":"POST /v1/projects/{project}/databases/(default)/documents:runAggregationQuery","a":"400 INVALID_ARGUMENT: The maximum number of aggregations allowed in an aggregation query is 5. Received: 6","r":"u"},{"t":"transaction-commit #1","q":"OPTIONS /v1/projects/{project}/databases/(default)/documents:batchGet","a":"200","r":"u"},{"t":"transaction-commit #2","q":"POST /v1/projects/{project}/databases/(default)/documents:batchGet","a":"200 [1 item]","r":"u"},{"t":"transaction-commit #3","q":"OPTIONS /v1/projects/{project}/databases/(default)/documents:commit","a":"200","r":"u"},{"t":"transaction-commit #4","q":"POST /v1/projects/{project}/databases/(default)/documents:commit","a":"400 INVALID_ARGUMENT: Cannot delete then update an entity in the same request.","r":"u"},{"t":"transaction-commit #5","q":"POST /v1/projects/{project}/databases/(default)/documents:batchGet","a":"200 [1 item]","r":"u"},{"t":"transaction-commit #6","q":"POST /v1/projects/{project}/databases/(default)/documents:commit","a":"200 {writeResults, commitTime}","r":"u"},{"t":"transaction-commit #7","q":"POST /v1/projects/{project}/databases/(default)/documents:commit","a":"200 {writeResults, commitTime}","r":"u"},{"t":"transaction-commit #8","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"u"},{"t":"transaction-commit #9","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, documentChange, targetChange CURRENT, targetChange NO_CHANGE ×2","r":"u"},{"t":"transaction-noop-write #1","q":"OPTIONS /v1/projects/{project}/databases/(default)/documents:batchGet","a":"200","r":"u"},{"t":"transaction-noop-write #2","q":"POST /v1/projects/{project}/databases/(default)/documents:batchGet","a":"200 [1 item]","r":"u"},{"t":"transaction-noop-write #3","q":"OPTIONS /v1/projects/{project}/databases/(default)/documents:commit","a":"200","r":"u"},{"t":"transaction-noop-write #4","q":"POST /v1/projects/{project}/databases/(default)/documents:commit","a":"200 {writeResults, commitTime}","r":"u"},{"t":"transaction-noop-write #5","q":"POST /v1/projects/{project}/databases/(default)/documents:commit","a":"200 {writeResults, commitTime}","r":"u"},{"t":"transaction-noop-write #6","q":"POST /v1/projects/{project}/databases/(default)/documents:batchGet","a":"200 [1 item]","r":"u"},{"t":"transaction-noop-write #7","q":"POST /v1/projects/{project}/databases/(default)/documents:commit","a":"200 {writeResults, commitTime}","r":"u"},{"t":"backchannel-reconnect-replay #1","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"backchannel-reconnect-replay #3","q":"POST /google.firestore.v1.Firestore/Listen/channel (terminate)","a":"200","r":"c","k":"status"},{"t":"bundle-nanosecond-read-time #1","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"bundle-nanosecond-read-time #3","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"c","k":"status"},{"t":"bundle-nanosecond-read-time #7","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"bundle-nanosecond-read-time #11","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"c","k":"status"},{"t":"bundle-nanosecond-read-time #12","q":"POST /google.firestore.v1.Firestore/Listen/channel (terminate)","a":"200","r":"c","k":"status"},{"t":"bundle-nanosecond-read-time #13","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"bundle-nanosecond-read-time #15","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"c","k":"status"},{"t":"bundle-nanosecond-read-time #16","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"bundle-nanosecond-read-time #19","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"c","k":"status"},{"t":"listen-long-poll #1","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"listen-long-poll #5","q":"POST /google.firestore.v1.Firestore/Listen/channel (terminate)","a":"200","r":"c","k":"status"},{"t":"listen-streaming #1","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"multiple-inequality-query #1","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"multiple-inequality-query #4","q":"POST /google.firestore.v1.Firestore/Listen/channel (send)","a":"200 · forward-channel ack","r":"c","k":"status"},{"t":"multiple-inequality-query #5","q":"POST /google.firestore.v1.Firestore/Listen/channel (send)","a":"200 · forward-channel ack","r":"c","k":"status"},{"t":"multiple-inequality-query #9","q":"POST /google.firestore.v1.Firestore/Listen/channel (send)","a":"200 · forward-channel ack","r":"c","k":"status"},{"t":"multiple-inequality-query #11","q":"POST /google.firestore.v1.Firestore/Listen/channel (send)","a":"200 · forward-channel ack","r":"c","k":"status"},{"t":"multiple-inequality-query #14","q":"POST /google.firestore.v1.Firestore/Listen/channel (terminate)","a":"200","r":"c","k":"status"},{"t":"unicode-framing #1","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"unicode-framing #2","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"unicode-framing #6","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"c","k":"status"},{"t":"unicode-framing #13","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"c","k":"status"},{"t":"unicode-framing #15","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"unicode-framing #14","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"unicode-framing #18","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"c","k":"status"},{"t":"unicode-framing #21","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"c","k":"status"},{"t":"unknown-sid #1","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"400 HTML page \"Error 400 (Bad Request)!!1\"","r":"c","k":"answer"},{"t":"write-long-poll #1","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"write-long-poll #3","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"c","k":"status"},{"t":"write-long-poll #5","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"c","k":"status"},{"t":"write-overlap #1","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"write-overlap #3","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"c","k":"status"},{"t":"write-overlap #6","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"c","k":"status"},{"t":"write-overlap #7","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"write-overlap #9","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"c","k":"status"},{"t":"write-overlap #10","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"c","k":"status"},{"t":"write-streaming #1","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"write-streaming #3","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"c","k":"status"},{"t":"write-streaming #4","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"c","k":"status"},{"t":"backchannel-reconnect-replay #2","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, documentChange, targetChange CURRENT, targetChange NO_CHANGE ×3","r":"u"},{"t":"bundle-nanosecond-read-time #2","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened","r":"u"},{"t":"bundle-nanosecond-read-time #4","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop, writeResults ×1","r":"u"},{"t":"bundle-nanosecond-read-time #5","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · writeResults ×1","r":"u"},{"t":"bundle-nanosecond-read-time #6","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop","r":"u"},{"t":"bundle-nanosecond-read-time #8","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, documentChange, targetChange CURRENT, targetChange NO_CHANGE, targetChange RESET, documentChange, targetChange CURR…","r":"u"},{"t":"bundle-nanosecond-read-time #14","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened, writeResults ×1 ×2","r":"u"},{"t":"bundle-nanosecond-read-time #17","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, documentChange, targetChange CURRENT, targetChange NO_CHANGE","r":"u"},{"t":"listen-long-poll #2","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, documentChange, targetChange CURRENT, targetChange NO_CHANGE ×2","r":"u"},{"t":"listen-streaming #2","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, documentChange, targetChange CURRENT, targetChange NO_CHANGE ×2","r":"u"},{"t":"multiple-inequality-query #2","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, documentChange ×3, targetChange CURRENT, targetChange NO_CHANGE, existenceFilter, targetChange NO_CHANGE","r":"u"},{"t":"multiple-inequality-query #3","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · noop, targetChange REMOVE","r":"u"},{"t":"multiple-inequality-query #6","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD","r":"u"},{"t":"multiple-inequality-query #7","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange REMOVE","r":"u"},{"t":"multiple-inequality-query #8","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · noop, targetChange REMOVE","r":"u"},{"t":"multiple-inequality-query #10","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD","r":"u"},{"t":"multiple-inequality-query #12","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange REMOVE","r":"u"},{"t":"numeric-resource-id-ordering #1","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"u"},{"t":"numeric-resource-id-ordering #2","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened","r":"u"},{"t":"numeric-resource-id-ordering #3","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #4","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop, writeResults ×1","r":"u"},{"t":"numeric-resource-id-ordering #5","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #6","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop, writeResults ×1","r":"u"},{"t":"numeric-resource-id-ordering #7","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #8","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop, writeResults ×1","r":"u"},{"t":"numeric-resource-id-ordering #9","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #10","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop, writeResults ×1","r":"u"},{"t":"numeric-resource-id-ordering #11","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #12","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop, writeResults ×1","r":"u"},{"t":"numeric-resource-id-ordering #13","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop, writeResults ×1","r":"u"},{"t":"numeric-resource-id-ordering #14","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"u"},{"t":"numeric-resource-id-ordering #15","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, documentChange ×5, targetChange CURRENT, targetChange NO_CHANGE, existenceFilter, targetChange NO_CHANGE","r":"u"},{"t":"numeric-resource-id-ordering #16","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · noop, targetChange REMOVE","r":"u"},{"t":"numeric-resource-id-ordering #17","q":"POST /google.firestore.v1.Firestore/Listen/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #18","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #19","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #20","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #21","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #22","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #23","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · noop","r":"u"},{"t":"numeric-resource-id-ordering #24","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · writeResults ×1 ×2","r":"u"},{"t":"numeric-resource-id-ordering #25","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · writeResults ×1 ×2","r":"u"},{"t":"numeric-resource-id-ordering #27","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"u"},{"t":"numeric-resource-id-ordering #28","q":"POST /google.firestore.v1.Firestore/Listen/channel (terminate)","a":"200","r":"u"},{"t":"numeric-resource-id-ordering #29","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"u"},{"t":"numeric-resource-id-ordering #30","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened, writeResults ×1 ×10","r":"u"},{"t":"numeric-resource-id-ordering #31","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #32","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #33","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #34","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #35","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #36","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"u"},{"t":"numeric-resource-id-ordering #37","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, documentChange ×5, targetChange CURRENT, targetChange NO_CHANGE, existenceFilter, targetChange NO_CHANGE, targetCha…","r":"u"},{"t":"numeric-resource-id-ordering #38","q":"POST /google.firestore.v1.Firestore/Listen/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #39","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #40","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #41","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #42","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #43","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #44","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"u"},{"t":"numeric-resource-id-ordering #45","q":"POST /google.firestore.v1.Firestore/Listen/channel (terminate)","a":"200","r":"u"},{"t":"reserved-resource-id-error #1","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"u"},{"t":"reserved-resource-id-error #2","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, targetChange REMOVE","r":"u"},{"t":"reserved-resource-id-error #4","q":"POST /google.firestore.v1.Firestore/Listen/channel (terminate)","a":"200","r":"u"},{"t":"reserved-resource-id-error #5","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"u"},{"t":"reserved-resource-id-error #6","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, targetChange REMOVE","r":"u"},{"t":"unicode-framing #3","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened","r":"u"},{"t":"unicode-framing #4","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, documentDelete, targetChange CURRENT, targetChange NO_CHANGE, documentDelete, targetChange NO_CHANGE","r":"u"},{"t":"unicode-framing #5","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · noop, documentChange","r":"u"},{"t":"unicode-framing #7","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop, writeResults ×1","r":"u"},{"t":"unicode-framing #8","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop","r":"u"},{"t":"unicode-framing #9","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange NO_CHANGE","r":"u"},{"t":"unicode-framing #16","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened, writeResults ×1","r":"u"},{"t":"unicode-framing #17","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, documentChange, targetChange CURRENT, targetChange NO_CHANGE ×2","r":"u"},{"t":"write-cross-client-update #1","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"u"},{"t":"write-cross-client-update #2","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened","r":"u"},{"t":"write-cross-client-update #3","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"write-cross-client-update #4","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop, writeResults ×1","r":"u"},{"t":"write-cross-client-update #5","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop","r":"u"},{"t":"write-cross-client-update #6","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"u"},{"t":"write-cross-client-update #7","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened","r":"u"},{"t":"write-cross-client-update #8","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"write-cross-client-update #9","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop, writeResults ×1","r":"u"},{"t":"write-cross-client-update #10","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop","r":"u"},{"t":"write-cross-client-update #11","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"u"},{"t":"write-cross-client-update #12","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, documentChange, targetChange CURRENT, targetChange NO_CHANGE ×3","r":"u"},{"t":"write-cross-client-update #13","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · noop, targetChange REMOVE","r":"u"},{"t":"write-cross-client-update #14","q":"POST /google.firestore.v1.Firestore/Listen/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"write-cross-client-update #15","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"u"},{"t":"write-cross-client-update #16","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, documentChange, targetChange CURRENT, targetChange NO_CHANGE ×3","r":"u"},{"t":"write-cross-client-update #19","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"u"},{"t":"write-cross-client-update #21","q":"POST /google.firestore.v1.Firestore/Listen/channel (terminate)","a":"200","r":"u"},{"t":"write-cross-client-update #22","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"u"},{"t":"write-cross-client-update #23","q":"POST /google.firestore.v1.Firestore/Listen/channel (terminate)","a":"200","r":"u"},{"t":"write-cross-client-update #24","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"u"},{"t":"write-cross-client-update #25","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened, writeResults ×1","r":"u"},{"t":"write-cross-client-update #26","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"write-cross-client-update #27","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"u"},{"t":"write-cross-client-update #28","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened, writeResults ×1","r":"u"},{"t":"write-cross-client-update #29","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"write-cross-client-update #30","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"u"},{"t":"write-cross-client-update #31","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, documentChange, targetChange CURRENT, targetChange NO_CHANGE ×2, targetChange REMOVE","r":"u"},{"t":"write-cross-client-update #32","q":"POST /google.firestore.v1.Firestore/Listen/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"write-cross-client-update #33","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"u"},{"t":"write-cross-client-update #34","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, documentChange, targetChange CURRENT, targetChange NO_CHANGE ×2","r":"u"},{"t":"write-cross-client-update #35","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"u"},{"t":"write-cross-client-update #37","q":"POST /google.firestore.v1.Firestore/Listen/channel (terminate)","a":"200","r":"u"},{"t":"write-cross-client-update #38","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"u"},{"t":"write-cross-client-update #39","q":"POST /google.firestore.v1.Firestore/Listen/channel (terminate)","a":"200","r":"u"},{"t":"write-long-poll #2","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened","r":"u"},{"t":"write-long-poll #4","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop, writeResults ×1","r":"u"},{"t":"write-missing-update-error #1","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"u"},{"t":"write-missing-update-error #2","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened","r":"u"},{"t":"write-missing-update-error #3","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"write-missing-update-error #4","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop, __sm__, close","r":"u"},{"t":"write-missing-update-error #5","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"u"},{"t":"write-missing-update-error #6","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"u"},{"t":"write-missing-update-error #7","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened, __sm__, close","r":"u"},{"t":"write-missing-update-error #8","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"write-missing-update-error #9","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"u"},{"t":"write-overlap #2","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened","r":"u"},{"t":"write-overlap #4","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop, writeResults ×1","r":"u"},{"t":"write-overlap #5","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · writeResults ×1","r":"u"},{"t":"write-overlap #8","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened, writeResults ×1 ×2","r":"u"},{"t":"write-streaming #2","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened, writeResults ×1","r":"u"},{"t":"seed-notes/a","q":"PATCH /notes/a (owner)","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"answer"},{"t":"seed-notes/b","q":"PATCH /notes/b (owner)","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"answer"},{"t":"seed-notes/missing/children/one","q":"PATCH /notes/missing/children/one (owner)","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"answer"},{"t":"seed-other/z","q":"PATCH /other/z (owner)","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"answer"},{"t":"root ids empty body","q":"POST :listCollectionIds (owner)","a":"200 · 2 collection ids","r":"c","k":"answer"},{"t":"nested ids empty body","q":"POST /notes/missing:listCollectionIds (owner)","a":"200 · 1 collection id","r":"c","k":"answer"},{"t":"ids anonymous","q":"POST :listCollectionIds","a":"403 PERMISSION_DENIED: Metadata operations require admin authentication.","r":"c","k":"status"},{"t":"list default","q":"GET /notes (owner)","a":"200 · 2 documents","r":"c","k":"answer"},{"t":"list show missing","q":"GET /notes?showMissing=true (owner)","a":"200 · 3 documents","r":"c","k":"answer"},{"t":"list desc","q":"GET /notes?orderBy=title%20desc (owner)","a":"200 · 2 documents","r":"c","k":"answer"},{"t":"list mask","q":"GET /notes?mask.fieldPaths=title (owner)","a":"200 · 2 documents","r":"c","k":"answer"},{"t":"list empty mask","q":"GET /notes?mask.fieldPaths=absent (owner)","a":"200 · 2 documents","r":"c","k":"answer"},{"t":"list anonymous","q":"GET /notes","a":"403 PERMISSION_DENIED: false for 'list' @ L1","r":"c","k":"status"},{"t":"list empty","q":"GET /empty (owner)","a":"200 {}","r":"c","k":"answer"},{"t":"list conflicting order","q":"GET /notes?showMissing=true&orderBy=title (owner)","a":"400 INVALID_ARGUMENT: cannot specify an order when show_missing is true","r":"c","k":"status"},{"t":"list page 1","q":"GET /notes?pageSize=1 (owner)","a":"200 · 1 document, next page token","r":"c","k":"answer"},{"t":"list page 2","q":"GET /notes?pageSize=1&pageToken=CkRwcm9qZWN0cy9kZW1vLWZpcmVzaWRlLWxpc3RpbmcvZGF0YWJhc2VzLyhkZWZhdWx0KS9kb2N1bWVudHMvbm90ZXMvYRIIgq7GejCYclY…","a":"200 · 1 document, next page token","r":"c","k":"answer"},{"t":"list page 3","q":"GET /notes?pageSize=1&pageToken=CkRwcm9qZWN0cy9kZW1vLWZpcmVzaWRlLWxpc3RpbmcvZGF0YWJhc2VzLyhkZWZhdWx0KS9kb2N1bWVudHMvbm90ZXMvYhIIVXZZZ%2Bl29…","a":"200 {}","r":"c","k":"answer"},{"t":"ids page 1","q":"POST :listCollectionIds (owner)","a":"200 · 1 collection id, next page token","r":"c","k":"answer"},{"t":"ids page 2","q":"POST :listCollectionIds (owner)","a":"200 · 1 collection id, next page token","r":"c","k":"answer"},{"t":"ids page 3","q":"POST :listCollectionIds (owner)","a":"200 {}","r":"c","k":"answer"},{"t":"list invalid size","q":"GET /notes?pageSize=invalid (owner)","a":"no answer (timed out)","r":"d","k":"status","w":"the official emulator never answered this request (recorded as a timeout); Firenook answers 400 INVALID_ARGUMENT instead of hanging"},{"t":"read 8 times","q":"Node SDK get() (BatchGetDocuments): flat","a":"{\"zulu\":\"last\",\"alpha\":\"first\",\"middle\":true,\"number\":42,\"nullable\":null}, the same each time","r":"c","k":"answer"},{"t":"read 8 times","q":"gRPC GetDocument: flat","a":"{\"zulu\":{\"stringValue\":\"last\",\"valueType\":\"stringValue\"},\"alpha\":{\"stringValue\":\"first\",\"valueType\":\"stringValue\"},\"middle\":{\"booleanValue\"…","r":"c","k":"answer"},{"t":"read 8 times","q":"gRPC ListDocuments: flat","a":"{\"zulu\":{\"stringValue\":\"last\",\"valueType\":\"stringValue\"},\"alpha\":{\"stringValue\":\"first\",\"valueType\":\"stringValue\"},\"middle\":{\"booleanValue\"…","r":"c","k":"answer"},{"t":"read 8 times","q":"gRPC RunQuery: flat","a":"{\"zulu\":{\"stringValue\":\"last\",\"valueType\":\"stringValue\"},\"alpha\":{\"stringValue\":\"first\",\"valueType\":\"stringValue\"},\"middle\":{\"booleanValue\"…","r":"c","k":"answer"},{"t":"read 8 times","q":"REST GET document: flat","a":"{\"zulu\":{\"stringValue\":\"last\"},\"alpha\":{\"stringValue\":\"first\"},\"middle\":{\"booleanValue\":true},\"number\":{\"integerValue\":\"42\"},\"nullable\":{\"n…","r":"c","k":"answer"},{"t":"read 8 times","q":"Node SDK get() (BatchGetDocuments): nested","a":"{\"zulu\":{\"third\":3,\"first\":1,\"second\":2},\"array\":[{\"z\":\"z\",\"a\":\"a\",\"m\":\"m\"},{\"nested\":{\"right\":false,\"left\":true}}],\"emptyMap\":{},\"emptyArr…","r":"c","k":"answer"},{"t":"read 8 times","q":"gRPC GetDocument: nested","a":"{\"zulu\":{\"mapValue\":{\"fields\":{\"third\":{\"integerValue\":\"3\",\"valueType\":\"integerValue\"},\"first\":{\"integerValue\":\"1\",\"valueType\":\"integerValu…","r":"c","k":"answer"},{"t":"read 8 times","q":"gRPC ListDocuments: nested","a":"{\"zulu\":{\"mapValue\":{\"fields\":{\"third\":{\"integerValue\":\"3\",\"valueType\":\"integerValue\"},\"first\":{\"integerValue\":\"1\",\"valueType\":\"integerValu…","r":"c","k":"answer"},{"t":"read 8 times","q":"gRPC RunQuery: nested","a":"{\"zulu\":{\"mapValue\":{\"fields\":{\"third\":{\"integerValue\":\"3\",\"valueType\":\"integerValue\"},\"first\":{\"integerValue\":\"1\",\"valueType\":\"integerValu…","r":"c","k":"answer"},{"t":"read 8 times","q":"REST GET document: nested","a":"{\"zulu\":{\"mapValue\":{\"fields\":{\"third\":{\"integerValue\":\"3\"},\"first\":{\"integerValue\":\"1\"},\"second\":{\"integerValue\":\"2\"}}}},\"array\":{\"arrayVa…","r":"c","k":"answer"},{"t":"read 8 times","q":"Node SDK get() (BatchGetDocuments): unicode","a":"{\"2\":\"two\",\"10\":\"ten\",\"漢字\":\"資料\",\"😀\":\"emoji\",\"é\":\"accent\",\"mixed\":{\"🧪\":\"实验\",\"latin\":\"Café\",\"日本語\":\"値\"}}, the same each time","r":"c","k":"answer"},{"t":"read 8 times","q":"gRPC GetDocument: unicode","a":"{\"2\":{\"stringValue\":\"two\",\"valueType\":\"stringValue\"},\"10\":{\"stringValue\":\"ten\",\"valueType\":\"stringValue\"},\"漢字\":{\"stringValue\":\"資料\",\"valueTy…","r":"c","k":"answer"},{"t":"read 8 times","q":"gRPC ListDocuments: unicode","a":"{\"2\":{\"stringValue\":\"two\",\"valueType\":\"stringValue\"},\"10\":{\"stringValue\":\"ten\",\"valueType\":\"stringValue\"},\"漢字\":{\"stringValue\":\"資料\",\"valueTy…","r":"c","k":"answer"},{"t":"read 8 times","q":"gRPC RunQuery: unicode","a":"{\"2\":{\"stringValue\":\"two\",\"valueType\":\"stringValue\"},\"10\":{\"stringValue\":\"ten\",\"valueType\":\"stringValue\"},\"漢字\":{\"stringValue\":\"資料\",\"valueTy…","r":"c","k":"answer"},{"t":"read 8 times","q":"REST GET document: unicode","a":"{\"2\":{\"stringValue\":\"two\"},\"10\":{\"stringValue\":\"ten\"},\"漢字\":{\"stringValue\":\"資料\"},\"😀\":{\"stringValue\":\"emoji\"},\"é\":{\"stringValue\":\"accent\"},\"…","r":"c","k":"answer"},{"t":"read 8 times","q":"Node SDK get() (BatchGetDocuments): wide-mixed-map","a":"{\"stringField\":\"value\",\"stringArray\":[\"item-one\"],\"label\":\"Synthetic record\",\"objectWithEmptyArray\":{\"tag\":\"plain\",\"items\":[]},\"objectWithN…","r":"c","k":"answer"},{"t":"read 8 times","q":"gRPC GetDocument: wide-mixed-map","a":"{\"stringField\":{\"stringValue\":\"value\",\"valueType\":\"stringValue\"},\"stringArray\":{\"arrayValue\":{\"values\":[{\"stringValue\":\"item-one\",\"valueTyp…","r":"c","k":"answer"},{"t":"read 8 times","q":"gRPC ListDocuments: wide-mixed-map","a":"{\"stringField\":{\"stringValue\":\"value\",\"valueType\":\"stringValue\"},\"stringArray\":{\"arrayValue\":{\"values\":[{\"stringValue\":\"item-one\",\"valueTyp…","r":"c","k":"answer"},{"t":"read 8 times","q":"gRPC RunQuery: wide-mixed-map","a":"{\"stringField\":{\"stringValue\":\"value\",\"valueType\":\"stringValue\"},\"stringArray\":{\"arrayValue\":{\"values\":[{\"stringValue\":\"item-one\",\"valueTyp…","r":"c","k":"answer"},{"t":"read 8 times","q":"REST GET document: wide-mixed-map","a":"{\"stringField\":{\"stringValue\":\"value\"},\"stringArray\":{\"arrayValue\":{\"values\":[{\"stringValue\":\"item-one\"}]}},\"label\":{\"stringValue\":\"Synthet…","r":"c","k":"answer"},{"t":"read 8 times","q":"browser SDK server read (long-poll): flat","a":"{\"zulu\":\"last\",\"alpha\":\"first\",\"middle\":true,\"number\":42,\"nullable\":null}, the same each time","r":"c","k":"answer"},{"t":"read 8 times","q":"browser SDK server read (long-poll): nested","a":"{\"zulu\":{\"third\":3,\"first\":1,\"second\":2},\"array\":[{\"z\":\"z\",\"a\":\"a\",\"m\":\"m\"},{\"nested\":{\"right\":false,\"left\":true}}],\"emptyMap\":{},\"emptyArr…","r":"c","k":"answer"},{"t":"read 8 times","q":"browser SDK server read (long-poll): unicode","a":"{\"2\":\"two\",\"10\":\"ten\",\"漢字\":\"資料\",\"😀\":\"emoji\",\"é\":\"accent\",\"mixed\":{\"🧪\":\"实验\",\"latin\":\"Café\",\"日本語\":\"値\"}}, the same each time","r":"c","k":"answer"},{"t":"read 8 times","q":"browser SDK server read (long-poll): wide-mixed-map","a":"{\"stringField\":\"value\",\"stringArray\":[\"item-one\"],\"label\":\"Synthetic record\",\"objectWithEmptyArray\":{\"tag\":\"plain\",\"items\":[]},\"objectWithN…","r":"c","k":"answer"},{"t":"read 8 times","q":"browser SDK server read (streaming): flat","a":"{\"zulu\":\"last\",\"alpha\":\"first\",\"middle\":true,\"number\":42,\"nullable\":null}, the same each time","r":"c","k":"answer"},{"t":"read 8 times","q":"browser SDK server read (streaming): nested","a":"{\"zulu\":{\"third\":3,\"first\":1,\"second\":2},\"array\":[{\"z\":\"z\",\"a\":\"a\",\"m\":\"m\"},{\"nested\":{\"right\":false,\"left\":true}}],\"emptyMap\":{},\"emptyArr…","r":"c","k":"answer"},{"t":"read 8 times","q":"browser SDK server read (streaming): unicode","a":"{\"2\":\"two\",\"10\":\"ten\",\"漢字\":\"資料\",\"😀\":\"emoji\",\"é\":\"accent\",\"mixed\":{\"🧪\":\"实验\",\"latin\":\"Café\",\"日本語\":\"値\"}}, the same each time","r":"c","k":"answer"},{"t":"read 8 times","q":"browser SDK server read (streaming): wide-mixed-map","a":"{\"stringField\":\"value\",\"stringArray\":[\"item-one\"],\"label\":\"Synthetic record\",\"objectWithEmptyArray\":{\"tag\":\"plain\",\"items\":[]},\"objectWithN…","r":"c","k":"answer"},{"t":"import","q":"import an export of 4 shards","a":"import accepted · 4 documents verified","r":"u"},{"t":"root-all over gRPC","q":"RunQuery at the root: {\"from\":[{\"allDescendants\":true}]}","a":"OK · 14 documents","r":"c","k":"answer"},{"t":"root-all over REST","q":"POST :runQuery at the root: {\"from\":[{\"allDescendants\":true}]}","a":"200 · 14 documents","r":"c","k":"answer"},{"t":"root-explicit-empty-id over gRPC","q":"RunQuery at the root: {\"from\":[{\"collectionId\":\"\",\"allDescendants\":true}]}","a":"OK · 14 documents","r":"c","k":"answer"},{"t":"root-explicit-empty-id over REST","q":"POST :runQuery at the root: {\"from\":[{\"collectionId\":\"\",\"allDescendants\":true}]}","a":"200 · 14 documents","r":"c","k":"answer"},{"t":"under-document over gRPC","q":"RunQuery under top/parent: {\"from\":[{\"allDescendants\":true}]}","a":"OK · 3 documents","r":"c","k":"answer"},{"t":"under-document over REST","q":"POST :runQuery under top/parent: {\"from\":[{\"allDescendants\":true}]}","a":"200 · 3 documents","r":"c","k":"answer"},{"t":"under-missing-document over gRPC","q":"RunQuery under rd/ghost: {\"from\":[{\"allDescendants\":true}]}","a":"OK · 1 document","r":"c","k":"answer"},{"t":"under-missing-document over REST","q":"POST :runQuery under rd/ghost: {\"from\":[{\"allDescendants\":true}]}","a":"200 · 1 document","r":"c","k":"answer"},{"t":"under-nothing over gRPC","q":"RunQuery under nope/nope: {\"from\":[{\"allDescendants\":true}]}","a":"OK · 0 documents","r":"c","k":"answer"},{"t":"under-nothing over REST","q":"POST :runQuery under nope/nope: {\"from\":[{\"allDescendants\":true}]}","a":"200 · 0 documents","r":"c","k":"answer"},{"t":"sdk-range-root over gRPC","q":"RunQuery at the root: {\"from\":[{\"allDescendants\":true}],\"select\":{\"fields\":[{\"fieldPath\":\"__name__\"}]},\"where\":{\"compositeFilter\":{\"op\":\"AN…","a":"OK · 6 documents","r":"c","k":"answer"},{"t":"sdk-range-root over REST","q":"POST :runQuery at the root: {\"from\":[{\"allDescendants\":true}],\"select\":{\"fields\":[{\"fieldPath\":\"__name__\"}]},\"where\":{\"compositeFilter\":{\"o…","a":"200 · 6 documents","r":"c","k":"answer"},{"t":"sdk-range-sub over gRPC","q":"RunQuery under top/parent: {\"from\":[{\"allDescendants\":true}],\"select\":{\"fields\":[{\"fieldPath\":\"__name__\"}]},\"where\":{\"compositeFilter\":{\"op…","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"sdk-range-sub over REST","q":"POST :runQuery under top/parent: {\"from\":[{\"allDescendants\":true}],\"select\":{\"fields\":[{\"fieldPath\":\"__name__\"}]},\"where\":{\"compositeFilter…","a":"200 · 2 documents","r":"c","k":"answer"},{"t":"sdk-range-small-limit over gRPC","q":"RunQuery at the root: {\"from\":[{\"allDescendants\":true}],\"select\":{\"fields\":[{\"fieldPath\":\"__name__\"}]},\"where\":{\"compositeFilter\":{\"op\":\"AN…","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"sdk-range-small-limit over REST","q":"POST :runQuery at the root: {\"from\":[{\"allDescendants\":true}],\"select\":{\"fields\":[{\"fieldPath\":\"__name__\"}]},\"where\":{\"compositeFilter\":{\"o…","a":"200 · 2 documents","r":"c","k":"answer"},{"t":"limit over gRPC","q":"RunQuery at the root: {\"from\":[{\"allDescendants\":true}],\"limit\":{\"value\":3}}","a":"OK · 3 documents","r":"c","k":"answer"},{"t":"limit over REST","q":"POST :runQuery at the root: {\"from\":[{\"allDescendants\":true}],\"limit\":{\"value\":3}}","a":"200 · 3 documents","r":"c","k":"answer"},{"t":"limit-zero over gRPC","q":"RunQuery at the root: {\"from\":[{\"allDescendants\":true}],\"limit\":{\"value\":0}}","a":"OK · 0 documents","r":"c","k":"answer"},{"t":"limit-zero over REST","q":"POST :runQuery at the root: {\"from\":[{\"allDescendants\":true}],\"limit\":{\"value\":0}}","a":"200 · 0 documents","r":"c","k":"answer"},{"t":"offset over gRPC","q":"RunQuery at the root: {\"from\":[{\"allDescendants\":true}],\"offset\":2,\"limit\":{\"value\":2}}","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"offset over REST","q":"POST :runQuery at the root: {\"from\":[{\"allDescendants\":true}],\"offset\":2,\"limit\":{\"value\":2}}","a":"200 · 2 documents","r":"c","k":"answer"},{"t":"start-after over gRPC","q":"RunQuery at the root: {\"from\":[{\"allDescendants\":true}],\"orderBy\":[{\"field\":{\"fieldPath\":\"__name__\"},\"direction\":\"ASCENDING\"}],\"startAt\":{\"…","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"start-after over REST","q":"POST :runQuery at the root: {\"from\":[{\"allDescendants\":true}],\"orderBy\":[{\"field\":{\"fieldPath\":\"__name__\"},\"direction\":\"ASCENDING\"}],\"start…","a":"200 · 2 documents","r":"c","k":"answer"},{"t":"start-at over gRPC","q":"RunQuery at the root: {\"from\":[{\"allDescendants\":true}],\"orderBy\":[{\"field\":{\"fieldPath\":\"__name__\"},\"direction\":\"ASCENDING\"}],\"startAt\":{\"…","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"start-at over REST","q":"POST :runQuery at the root: {\"from\":[{\"allDescendants\":true}],\"orderBy\":[{\"field\":{\"fieldPath\":\"__name__\"},\"direction\":\"ASCENDING\"}],\"start…","a":"200 · 2 documents","r":"c","k":"answer"},{"t":"end-before over gRPC","q":"RunQuery at the root: {\"from\":[{\"allDescendants\":true}],\"orderBy\":[{\"field\":{\"fieldPath\":\"__name__\"},\"direction\":\"ASCENDING\"}],\"endAt\":{\"va…","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"end-before over REST","q":"POST :runQuery at the root: {\"from\":[{\"allDescendants\":true}],\"orderBy\":[{\"field\":{\"fieldPath\":\"__name__\"},\"direction\":\"ASCENDING\"}],\"endAt…","a":"200 · 2 documents","r":"c","k":"answer"},{"t":"end-at over gRPC","q":"RunQuery at the root: {\"from\":[{\"allDescendants\":true}],\"orderBy\":[{\"field\":{\"fieldPath\":\"__name__\"},\"direction\":\"ASCENDING\"}],\"endAt\":{\"va…","a":"OK · 3 documents","r":"c","k":"answer"},{"t":"end-at over REST","q":"POST :runQuery at the root: {\"from\":[{\"allDescendants\":true}],\"orderBy\":[{\"field\":{\"fieldPath\":\"__name__\"},\"direction\":\"ASCENDING\"}],\"endAt…","a":"200 · 3 documents","r":"c","k":"answer"},{"t":"name-equal over gRPC","q":"RunQuery at the root: {\"from\":[{\"allDescendants\":true}],\"where\":{\"fieldFilter\":{\"field\":{\"fieldPath\":\"__name__\"},\"op\":\"EQUAL\",\"value\":{\"ref…","a":"OK · 1 document","r":"c","k":"answer"},{"t":"name-equal over REST","q":"POST :runQuery at the root: {\"from\":[{\"allDescendants\":true}],\"where\":{\"fieldFilter\":{\"field\":{\"fieldPath\":\"__name__\"},\"op\":\"EQUAL\",\"value\"…","a":"200 · 1 document","r":"c","k":"answer"},{"t":"name-equal-outside-parent over gRPC","q":"RunQuery under top/parent: {\"from\":[{\"allDescendants\":true}],\"where\":{\"fieldFilter\":{\"field\":{\"fieldPath\":\"__name__\"},\"op\":\"EQUAL\",\"value\":…","a":"OK · 0 documents","r":"c","k":"answer"},{"t":"name-equal-outside-parent over REST","q":"POST :runQuery under top/parent: {\"from\":[{\"allDescendants\":true}],\"where\":{\"fieldFilter\":{\"field\":{\"fieldPath\":\"__name__\"},\"op\":\"EQUAL\",\"v…","a":"200 · 0 documents","r":"c","k":"answer"},{"t":"name-in over gRPC","q":"RunQuery at the root: {\"from\":[{\"allDescendants\":true}],\"where\":{\"fieldFilter\":{\"field\":{\"fieldPath\":\"__name__\"},\"op\":\"IN\",\"value\":{\"arrayV…","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"name-in over REST","q":"POST :runQuery at the root: {\"from\":[{\"allDescendants\":true}],\"where\":{\"fieldFilter\":{\"field\":{\"fieldPath\":\"__name__\"},\"op\":\"IN\",\"value\":{\"…","a":"200 · 2 documents","r":"c","k":"answer"},{"t":"name-not-equal over gRPC","q":"RunQuery at the root: {\"from\":[{\"allDescendants\":true}],\"where\":{\"fieldFilter\":{\"field\":{\"fieldPath\":\"__name__\"},\"op\":\"NOT_EQUAL\",\"value\":{…","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"name-not-equal over REST","q":"POST :runQuery at the root: {\"from\":[{\"allDescendants\":true}],\"where\":{\"fieldFilter\":{\"field\":{\"fieldPath\":\"__name__\"},\"op\":\"NOT_EQUAL\",\"va…","a":"200 · 2 documents","r":"c","k":"answer"},{"t":"name-not-in over gRPC","q":"RunQuery at the root: {\"from\":[{\"allDescendants\":true}],\"where\":{\"fieldFilter\":{\"field\":{\"fieldPath\":\"__name__\"},\"op\":\"NOT_IN\",\"value\":{\"ar…","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"name-not-in over REST","q":"POST :runQuery at the root: {\"from\":[{\"allDescendants\":true}],\"where\":{\"fieldFilter\":{\"field\":{\"fieldPath\":\"__name__\"},\"op\":\"NOT_IN\",\"value…","a":"200 · 2 documents","r":"c","k":"answer"},{"t":"name-or over gRPC","q":"RunQuery at the root: {\"from\":[{\"allDescendants\":true}],\"where\":{\"compositeFilter\":{\"op\":\"OR\",\"filters\":[{\"fieldFilter\":{\"field\":{\"fieldPat…","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"name-or over REST","q":"POST :runQuery at the root: {\"from\":[{\"allDescendants\":true}],\"where\":{\"compositeFilter\":{\"op\":\"OR\",\"filters\":[{\"fieldFilter\":{\"field\":{\"fi…","a":"200 · 2 documents","r":"c","k":"answer"},{"t":"name-greater-than over gRPC","q":"RunQuery at the root: {\"from\":[{\"allDescendants\":true}],\"where\":{\"fieldFilter\":{\"field\":{\"fieldPath\":\"__name__\"},\"op\":\"GREATER_THAN\",\"value…","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"name-greater-than over REST","q":"POST :runQuery at the root: {\"from\":[{\"allDescendants\":true}],\"where\":{\"fieldFilter\":{\"field\":{\"fieldPath\":\"__name__\"},\"op\":\"GREATER_THAN\",…","a":"200 · 2 documents","r":"c","k":"answer"},{"t":"name-not-a-reference over gRPC","q":"RunQuery at the root: {\"from\":[{\"allDescendants\":true}],\"where\":{\"fieldFilter\":{\"field\":{\"fieldPath\":\"__name__\"},\"op\":\"GREATER_THAN\",\"value…","a":"INVALID_ARGUMENT: __key__ filter value must be a Key","r":"c","k":"error"},{"t":"name-not-a-reference over REST","q":"POST :runQuery at the root: {\"from\":[{\"allDescendants\":true}],\"where\":{\"fieldFilter\":{\"field\":{\"fieldPath\":\"__name__\"},\"op\":\"GREATER_THAN\",…","a":"400 __key__ filter value must be a Key","r":"c","k":"error"},{"t":"name-descending over gRPC","q":"RunQuery at the root: {\"from\":[{\"allDescendants\":true}],\"orderBy\":[{\"field\":{\"fieldPath\":\"__name__\"},\"direction\":\"DESCENDING\"}],\"limit\":{\"v…","a":"FAILED_PRECONDITION: Firestore does not support descending key scans","r":"c","k":"error"},{"t":"name-descending over REST","q":"POST :runQuery at the root: {\"from\":[{\"allDescendants\":true}],\"orderBy\":[{\"field\":{\"fieldPath\":\"__name__\"},\"direction\":\"DESCENDING\"}],\"limi…","a":"400 Firestore does not support descending key scans","r":"c","k":"error"},{"t":"field-equal over gRPC","q":"RunQuery at the root: {\"from\":[{\"allDescendants\":true}],\"where\":{\"fieldFilter\":{\"field\":{\"fieldPath\":\"n\"},\"op\":\"EQUAL\",\"value\":{\"integerVal…","a":"INVALID_ARGUMENT: kind is required for filter: n","r":"c","k":"error"},{"t":"field-equal over REST","q":"POST :runQuery at the root: {\"from\":[{\"allDescendants\":true}],\"where\":{\"fieldFilter\":{\"field\":{\"fieldPath\":\"n\"},\"op\":\"EQUAL\",\"value\":{\"inte…","a":"400 kind is required for filter: n","r":"c","k":"error"},{"t":"field-inequality over gRPC","q":"RunQuery at the root: {\"from\":[{\"allDescendants\":true}],\"where\":{\"fieldFilter\":{\"field\":{\"fieldPath\":\"n\"},\"op\":\"GREATER_THAN\",\"value\":{\"int…","a":"INVALID_ARGUMENT: kind is required for all orders except __key__ ascending","r":"c","k":"error"},{"t":"field-inequality over REST","q":"POST :runQuery at the root: {\"from\":[{\"allDescendants\":true}],\"where\":{\"fieldFilter\":{\"field\":{\"fieldPath\":\"n\"},\"op\":\"GREATER_THAN\",\"value\"…","a":"400 kind is required for all orders except __key__ ascending","r":"c","k":"error"},{"t":"field-unary over gRPC","q":"RunQuery at the root: {\"from\":[{\"allDescendants\":true}],\"where\":{\"unaryFilter\":{\"field\":{\"fieldPath\":\"missing\"},\"op\":\"IS_NULL\"}}}","a":"INVALID_ARGUMENT: kind is required for filter: missing","r":"c","k":"error"},{"t":"field-unary over REST","q":"POST :runQuery at the root: {\"from\":[{\"allDescendants\":true}],\"where\":{\"unaryFilter\":{\"field\":{\"fieldPath\":\"missing\"},\"op\":\"IS_NULL\"}}}","a":"400 kind is required for filter: missing","r":"c","k":"error"},{"t":"field-order over gRPC","q":"RunQuery at the root: {\"from\":[{\"allDescendants\":true}],\"orderBy\":[{\"field\":{\"fieldPath\":\"n\"},\"direction\":\"ASCENDING\"}],\"limit\":{\"value\":2}}","a":"INVALID_ARGUMENT: kind is required for all orders except __key__ ascending","r":"c","k":"error"},{"t":"field-order over REST","q":"POST :runQuery at the root: {\"from\":[{\"allDescendants\":true}],\"orderBy\":[{\"field\":{\"fieldPath\":\"n\"},\"direction\":\"ASCENDING\"}],\"limit\":{\"val…","a":"400 kind is required for all orders except __key__ ascending","r":"c","k":"error"},{"t":"field-in-composite over gRPC","q":"RunQuery at the root: {\"from\":[{\"allDescendants\":true}],\"where\":{\"compositeFilter\":{\"op\":\"AND\",\"filters\":[{\"fieldFilter\":{\"field\":{\"fieldPa…","a":"INVALID_ARGUMENT: kind is required for filter: n","r":"c","k":"error"},{"t":"field-in-composite over REST","q":"POST :runQuery at the root: {\"from\":[{\"allDescendants\":true}],\"where\":{\"compositeFilter\":{\"op\":\"AND\",\"filters\":[{\"fieldFilter\":{\"field\":{\"f…","a":"400 kind is required for filter: n","r":"c","k":"error"},{"t":"select-field over gRPC","q":"RunQuery at the root: {\"from\":[{\"allDescendants\":true}],\"select\":{\"fields\":[{\"fieldPath\":\"n\"}]},\"limit\":{\"value\":1}}","a":"OK · 1 document","r":"c","k":"answer"},{"t":"select-field over REST","q":"POST :runQuery at the root: {\"from\":[{\"allDescendants\":true}],\"select\":{\"fields\":[{\"fieldPath\":\"n\"}]},\"limit\":{\"value\":1}}","a":"200 · 1 document","r":"c","k":"answer"},{"t":"nearest over gRPC","q":"RunQuery at the root: {\"from\":[{\"allDescendants\":true}],\"findNearest\":{\"vectorField\":{\"fieldPath\":\"v\"},\"queryVector\":{\"mapValue\":{\"fields\":…","a":"OK · 0 documents","r":"c","k":"answer"},{"t":"nearest over REST","q":"POST :runQuery at the root: {\"from\":[{\"allDescendants\":true}],\"findNearest\":{\"vectorField\":{\"fieldPath\":\"v\"},\"queryVector\":{\"mapValue\":{\"fi…","a":"200 · 0 documents","r":"c","k":"answer"},{"t":"parent-is-a-collection over gRPC","q":"RunQuery under top: {\"from\":[{\"allDescendants\":true}]}","a":"INVALID_ARGUMENT: Document parent name \"projects/{project}/databases/(default)/documents/top\" lacks \"/\" at index 65.","r":"c","k":"error"},{"t":"parent-is-a-collection over REST","q":"POST :runQuery under top: {\"from\":[{\"allDescendants\":true}]}","a":"400 Document parent name \"projects/{project}/databases/(default)/documents/top\" lacks \"/\" at index 65.","r":"c","k":"error"},{"t":"count root","q":"RunAggregationQuery count-root","a":"OK · value 14","r":"c","k":"answer"},{"t":"count under document","q":"RunAggregationQuery count-under-document","a":"OK · value 3","r":"c","k":"answer"},{"t":"count sdk range","q":"RunAggregationQuery count-sdk-range","a":"OK · value 6","r":"c","k":"answer"},{"t":"count limit","q":"RunAggregationQuery count-limit","a":"OK · value 4","r":"c","k":"answer"},{"t":"sum","q":"RunAggregationQuery sum","a":"INVALID_ARGUMENT: kind is required for all orders except __key__ ascending","r":"c","k":"error"},{"t":"root","q":"Listen root","a":"OK · 14 documents, 0 changes after","r":"c","k":"answer"},{"t":"sdk range","q":"Listen sdk-range","a":"OK · 6 documents, 0 changes after","r":"c","k":"answer"},{"t":"changes under document","q":"Listen changes-under-document","a":"OK · 3 documents, 0 changes after","r":"c","k":"answer"},{"t":"control collection","q":"Listen control-collection","a":"OK · 1 document, 4 changes after","r":"c","k":"answer"},{"t":"user: RunQuery at the root","q":"RunQuery at the root as user (rules allow-all)","a":"OK · first documents rc/a, rd/__id5__","r":"c","k":"answer"},{"t":"user: RunQuery under top/parent","q":"RunQuery under top/parent as user (rules allow-all)","a":"OK · first documents top/parent/c1/one, top/parent/c1/one/c2/two","r":"c","k":"answer"},{"t":"user: Listen at the root","q":"Listen at the root as user (rules allow-all)","a":"OK","r":"c","k":"answer"},{"t":"signed-out: RunQuery at the root","q":"RunQuery at the root as signed-out (rules allow-all)","a":"OK · first documents rc/a, rd/__id5__","r":"c","k":"answer"},{"t":"signed-out: RunQuery under top/parent","q":"RunQuery under top/parent as signed-out (rules allow-all)","a":"OK · first documents top/parent/c1/one, top/parent/c1/one/c2/two","r":"c","k":"answer"},{"t":"signed-out: Listen at the root","q":"Listen at the root as signed-out (rules allow-all)","a":"OK","r":"c","k":"answer"},{"t":"owner: RunQuery at the root","q":"RunQuery at the root as owner (rules allow-all)","a":"OK · first documents rc/a, rd/__id5__","r":"c","k":"answer"},{"t":"owner: RunQuery under top/parent","q":"RunQuery under top/parent as owner (rules allow-all)","a":"OK · first documents top/parent/c1/one, top/parent/c1/one/c2/two","r":"c","k":"answer"},{"t":"owner: Listen at the root","q":"Listen at the root as owner (rules allow-all)","a":"OK","r":"c","k":"answer"},{"t":"user: RunQuery at the root","q":"RunQuery at the root as user (rules signed-in)","a":"OK · first documents rc/a, rd/__id5__","r":"c","k":"answer"},{"t":"user: RunQuery under top/parent","q":"RunQuery under top/parent as user (rules signed-in)","a":"OK · first documents top/parent/c1/one, top/parent/c1/one/c2/two","r":"c","k":"answer"},{"t":"user: Listen at the root","q":"Listen at the root as user (rules signed-in)","a":"OK","r":"c","k":"answer"},{"t":"signed-out: RunQuery at the root","q":"RunQuery at the root as signed-out (rules signed-in)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"signed-out: RunQuery under top/parent","q":"RunQuery under top/parent as signed-out (rules signed-in)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"signed-out: Listen at the root","q":"Listen at the root as signed-out (rules signed-in)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"owner: RunQuery at the root","q":"RunQuery at the root as owner (rules signed-in)","a":"OK · first documents rc/a, rd/__id5__","r":"c","k":"answer"},{"t":"owner: RunQuery under top/parent","q":"RunQuery under top/parent as owner (rules signed-in)","a":"OK · first documents top/parent/c1/one, top/parent/c1/one/c2/two","r":"c","k":"answer"},{"t":"owner: Listen at the root","q":"Listen at the root as owner (rules signed-in)","a":"OK","r":"c","k":"answer"},{"t":"user: RunQuery at the root","q":"RunQuery at the root as user (rules list-only)","a":"OK · first documents rc/a, rd/__id5__","r":"c","k":"answer"},{"t":"user: RunQuery under top/parent","q":"RunQuery under top/parent as user (rules list-only)","a":"OK · first documents top/parent/c1/one, top/parent/c1/one/c2/two","r":"c","k":"answer"},{"t":"user: Listen at the root","q":"Listen at the root as user (rules list-only)","a":"OK","r":"c","k":"answer"},{"t":"signed-out: RunQuery at the root","q":"RunQuery at the root as signed-out (rules list-only)","a":"OK · first documents rc/a, rd/__id5__","r":"c","k":"answer"},{"t":"signed-out: RunQuery under top/parent","q":"RunQuery under top/parent as signed-out (rules list-only)","a":"OK · first documents top/parent/c1/one, top/parent/c1/one/c2/two","r":"c","k":"answer"},{"t":"signed-out: Listen at the root","q":"Listen at the root as signed-out (rules list-only)","a":"OK","r":"c","k":"answer"},{"t":"owner: RunQuery at the root","q":"RunQuery at the root as owner (rules list-only)","a":"OK · first documents rc/a, rd/__id5__","r":"c","k":"answer"},{"t":"owner: RunQuery under top/parent","q":"RunQuery under top/parent as owner (rules list-only)","a":"OK · first documents top/parent/c1/one, top/parent/c1/one/c2/two","r":"c","k":"answer"},{"t":"owner: Listen at the root","q":"Listen at the root as owner (rules list-only)","a":"OK","r":"c","k":"answer"},{"t":"user: RunQuery at the root","q":"RunQuery at the root as user (rules get-only)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"user: RunQuery under top/parent","q":"RunQuery under top/parent as user (rules get-only)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"user: Listen at the root","q":"Listen at the root as user (rules get-only)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"signed-out: RunQuery at the root","q":"RunQuery at the root as signed-out (rules get-only)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"signed-out: RunQuery under top/parent","q":"RunQuery under top/parent as signed-out (rules get-only)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"signed-out: Listen at the root","q":"Listen at the root as signed-out (rules get-only)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"owner: RunQuery at the root","q":"RunQuery at the root as owner (rules get-only)","a":"OK · first documents rc/a, rd/__id5__","r":"c","k":"answer"},{"t":"owner: RunQuery under top/parent","q":"RunQuery under top/parent as owner (rules get-only)","a":"OK · first documents top/parent/c1/one, top/parent/c1/one/c2/two","r":"c","k":"answer"},{"t":"owner: Listen at the root","q":"Listen at the root as owner (rules get-only)","a":"OK","r":"c","k":"answer"},{"t":"user: RunQuery at the root","q":"RunQuery at the root as user (rules one-collection)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"user: RunQuery under top/parent","q":"RunQuery under top/parent as user (rules one-collection)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"user: Listen at the root","q":"Listen at the root as user (rules one-collection)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"signed-out: RunQuery at the root","q":"RunQuery at the root as signed-out (rules one-collection)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"signed-out: RunQuery under top/parent","q":"RunQuery under top/parent as signed-out (rules one-collection)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"signed-out: Listen at the root","q":"Listen at the root as signed-out (rules one-collection)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"owner: RunQuery at the root","q":"RunQuery at the root as owner (rules one-collection)","a":"OK · first documents rc/a, rd/__id5__","r":"c","k":"answer"},{"t":"owner: RunQuery under top/parent","q":"RunQuery under top/parent as owner (rules one-collection)","a":"OK · first documents top/parent/c1/one, top/parent/c1/one/c2/two","r":"c","k":"answer"},{"t":"owner: Listen at the root","q":"Listen at the root as owner (rules one-collection)","a":"OK","r":"c","k":"answer"},{"t":"user: RunQuery at the root","q":"RunQuery at the root as user (rules one-group)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"user: RunQuery under top/parent","q":"RunQuery under top/parent as user (rules one-group)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"user: Listen at the root","q":"Listen at the root as user (rules one-group)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"signed-out: RunQuery at the root","q":"RunQuery at the root as signed-out (rules one-group)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"signed-out: RunQuery under top/parent","q":"RunQuery under top/parent as signed-out (rules one-group)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"signed-out: Listen at the root","q":"Listen at the root as signed-out (rules one-group)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"owner: RunQuery at the root","q":"RunQuery at the root as owner (rules one-group)","a":"OK · first documents rc/a, rd/__id5__","r":"c","k":"answer"},{"t":"owner: RunQuery under top/parent","q":"RunQuery under top/parent as owner (rules one-group)","a":"OK · first documents top/parent/c1/one, top/parent/c1/one/c2/two","r":"c","k":"answer"},{"t":"owner: Listen at the root","q":"Listen at the root as owner (rules one-group)","a":"OK","r":"c","k":"answer"},{"t":"user: RunQuery at the root","q":"RunQuery at the root as user (rules one-subtree)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"user: RunQuery under top/parent","q":"RunQuery under top/parent as user (rules one-subtree)","a":"OK · first documents top/parent/c1/one, top/parent/c1/one/c2/two","r":"c","k":"answer"},{"t":"user: Listen at the root","q":"Listen at the root as user (rules one-subtree)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"signed-out: RunQuery at the root","q":"RunQuery at the root as signed-out (rules one-subtree)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"signed-out: RunQuery under top/parent","q":"RunQuery under top/parent as signed-out (rules one-subtree)","a":"OK · first documents top/parent/c1/one, top/parent/c1/one/c2/two","r":"c","k":"answer"},{"t":"signed-out: Listen at the root","q":"Listen at the root as signed-out (rules one-subtree)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"owner: RunQuery at the root","q":"RunQuery at the root as owner (rules one-subtree)","a":"OK · first documents rc/a, rd/__id5__","r":"c","k":"answer"},{"t":"owner: RunQuery under top/parent","q":"RunQuery under top/parent as owner (rules one-subtree)","a":"OK · first documents top/parent/c1/one, top/parent/c1/one/c2/two","r":"c","k":"answer"},{"t":"owner: Listen at the root","q":"Listen at the root as owner (rules one-subtree)","a":"OK","r":"c","k":"answer"},{"t":"user: RunQuery at the root","q":"RunQuery at the root as user (rules wildcard-subtree)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"user: RunQuery under top/parent","q":"RunQuery under top/parent as user (rules wildcard-subtree)","a":"OK · first documents top/parent/c1/one, top/parent/c1/one/c2/two","r":"c","k":"answer"},{"t":"user: Listen at the root","q":"Listen at the root as user (rules wildcard-subtree)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"signed-out: RunQuery at the root","q":"RunQuery at the root as signed-out (rules wildcard-subtree)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"signed-out: RunQuery under top/parent","q":"RunQuery under top/parent as signed-out (rules wildcard-subtree)","a":"OK · first documents top/parent/c1/one, top/parent/c1/one/c2/two","r":"c","k":"answer"},{"t":"signed-out: Listen at the root","q":"Listen at the root as signed-out (rules wildcard-subtree)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"owner: RunQuery at the root","q":"RunQuery at the root as owner (rules wildcard-subtree)","a":"OK · first documents rc/a, rd/__id5__","r":"c","k":"answer"},{"t":"owner: RunQuery under top/parent","q":"RunQuery under top/parent as owner (rules wildcard-subtree)","a":"OK · first documents top/parent/c1/one, top/parent/c1/one/c2/two","r":"c","k":"answer"},{"t":"owner: Listen at the root","q":"Listen at the root as owner (rules wildcard-subtree)","a":"OK","r":"c","k":"answer"},{"t":"user: RunQuery at the root","q":"RunQuery at the root as user (rules deny-all)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"user: RunQuery under top/parent","q":"RunQuery under top/parent as user (rules deny-all)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"user: Listen at the root","q":"Listen at the root as user (rules deny-all)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"signed-out: RunQuery at the root","q":"RunQuery at the root as signed-out (rules deny-all)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"signed-out: RunQuery under top/parent","q":"RunQuery under top/parent as signed-out (rules deny-all)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"signed-out: Listen at the root","q":"Listen at the root as signed-out (rules deny-all)","a":"PERMISSION_DENIED","r":"c","k":"status"},{"t":"owner: RunQuery at the root","q":"RunQuery at the root as owner (rules deny-all)","a":"OK · first documents rc/a, rd/__id5__","r":"c","k":"answer"},{"t":"owner: RunQuery under top/parent","q":"RunQuery under top/parent as owner (rules deny-all)","a":"OK · first documents top/parent/c1/one, top/parent/c1/one/c2/two","r":"c","k":"answer"},{"t":"owner: Listen at the root","q":"Listen at the root as owner (rules deny-all)","a":"OK","r":"c","k":"answer"},{"t":"kindless query on the named database","q":"kindless query on the named database","a":"OK · 2 documents","r":"c","k":"answer"},{"t":"kindless query on (default)","q":"kindless query on (default)","a":"OK · 14 documents","r":"c","k":"answer"},{"t":"named database after recursiveDelete on (default)","q":"named database after recursiveDelete on (default)","a":"OK · 1 document","r":"c","k":"answer"},{"t":"(default) after recursiveDelete on the named database","q":"(default) after recursiveDelete on the named database","a":"OK · 14 documents","r":"c","k":"answer"},{"t":"root collection","q":"recursiveDelete root-collection","a":"completed · 8 documents left","r":"c","k":"behaviour"},{"t":"document","q":"recursiveDelete document","a":"completed · 10 documents left","r":"c","k":"behaviour"},{"t":"subcollection","q":"recursiveDelete subcollection","a":"completed · 12 documents left","r":"c","k":"behaviour"},{"t":"document under collection","q":"recursiveDelete document-under-collection","a":"completed · 11 documents left","r":"c","k":"behaviour"},{"t":"missing document with children","q":"recursiveDelete missing-document-with-children","a":"completed · 13 documents left","r":"c","k":"behaviour"},{"t":"nothing there","q":"recursiveDelete nothing-there","a":"completed · 14 documents left","r":"c","k":"behaviour"},{"t":"more than one page","q":"recursiveDelete more-than-one-page","a":"completed · 14 documents left","r":"c","k":"behaviour"},{"t":"custom writer","q":"recursiveDelete custom-writer","a":"completed · 12 documents left","r":"c","k":"behaviour"},{"t":"empty-id-direct-children over gRPC","q":"RunQuery at the root: {\"from\":[{\"collectionId\":\"\",\"allDescendants\":false}]}","a":"OK · 7 documents","r":"d","k":"status","w":"a selector with an empty id and no allDescendants lists direct children in the official emulator; no SDK sends it and Firenook refuses it as an invalid scope"},{"t":"empty-id-direct-children over REST","q":"POST :runQuery at the root: {\"from\":[{\"collectionId\":\"\",\"allDescendants\":false}]}","a":"200 · 7 documents","r":"d","k":"status","w":"a selector with an empty id and no allDescendants lists direct children in the official emulator; no SDK sends it and Firenook refuses it as an invalid scope"},{"t":"no token","q":"Listen with no token","a":"ADD, documentChange ×3, CURRENT, NO_CHANGE · 3 documents","r":"c","k":"answer"},{"t":"empty token","q":"Listen with empty token","a":"ADD, RESET, documentChange ×3, CURRENT, NO_CHANGE · 3 documents","r":"c","k":"answer"},{"t":"malformed token","q":"Listen with malformed token","a":"ADD, RESET, documentChange ×3, CURRENT, NO_CHANGE · 3 documents","r":"c","k":"answer"},{"t":"text token","q":"Listen with text token","a":"ADD, RESET, documentChange ×3, CURRENT, NO_CHANGE · 3 documents","r":"c","k":"answer"},{"t":"token from the other emulator","q":"Listen with token from the other emulator","a":"ADD, RESET, documentChange ×3, CURRENT, NO_CHANGE · 3 documents","r":"c","k":"answer"},{"t":"read time a day ago","q":"Listen with read time a day ago","a":"ADD, RESET, documentChange ×3, CURRENT, NO_CHANGE · 3 documents","r":"c","k":"behaviour"},{"t":"read time a day ahead","q":"Listen with read time a day ahead","a":"ADD, RESET, documentChange ×3, CURRENT, NO_CHANGE · 3 documents","r":"c","k":"answer"},{"t":"read time with nanoseconds","q":"Listen with read time with nanoseconds","a":"ADD, RESET, documentChange ×3, CURRENT, NO_CHANGE · 3 documents","r":"c","k":"behaviour"},{"t":"read time zero","q":"Listen with read time zero","a":"ADD, RESET, documentChange ×3, CURRENT, NO_CHANGE · 3 documents","r":"c","k":"behaviour"},{"t":"own token after a restart","q":"Listen with own token after a restart","a":"ADD, RESET, CURRENT, NO_CHANGE · 0 documents","r":"c","k":"answer"},{"t":"own token after a restart and a write","q":"Listen with own token after a restart and a write","a":"ADD, RESET, documentChange, CURRENT, NO_CHANGE · 1 document","r":"c","k":"answer"},{"t":"own token","q":"Listen with own token","a":"ADD, RESET, documentChange ×3, CURRENT, NO_CHANGE · 3 documents","r":"d","k":"answer","w":"a token this run issued replays only what changed since, where the official emulator resends everything; the client ends up with the same data"},{"t":"official export","q":"firebase emulators:export (firebase-tools 15.28.1) of 4 synthetic documents","a":"export written: one all_namespaces/all_kinds LevelDB log (output-0) and its metadata files","r":"u"},{"t":"seed","q":"PATCH /notes/a (owner)","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"answer"},{"t":"get mask","q":"GET /notes/a?mask.fieldPaths=title (owner)","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"answer"},{"t":"get nested mask","q":"GET /notes/a?mask.fieldPaths=nested.one (owner)","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"answer"},{"t":"get absent mask","q":"GET /notes/a?mask.fieldPaths=absent (owner)","a":"200 {name, createTime, updateTime}","r":"c","k":"answer"},{"t":"get repeated mask","q":"GET /notes/a?mask.fieldPaths=title&mask.fieldPaths=visible (owner)","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"answer"},{"t":"get invalid mask","q":"GET /notes/a?mask.fieldPaths=a..b (owner)","a":"400 INVALID_ARGUMENT: Invalid property path \"a..b\". Unquoted property paths must match regex ([a-zA-Z_][a-zA-Z_0-9]*), and quoted property…","r":"c","k":"status"},{"t":"get anonymous","q":"GET /notes/a?mask.fieldPaths=title","a":"403 PERMISSION_DENIED: false for 'get' @ L1","r":"c","k":"status"},{"t":"begin read only","q":"POST :beginTransaction (owner)","a":"200 {transaction}","r":"c","k":"answer"},{"t":"mutate","q":"PATCH /notes/a (owner)","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"answer"},{"t":"get current","q":"GET /notes/a (owner)","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"answer"},{"t":"get invalid read time","q":"GET /notes/a?readTime=not-a-timestamp (owner)","a":"400 INVALID_ARGUMENT: Only timestamps past epoch are supported.","r":"c","k":"status"},{"t":"batch mask","q":"POST :batchGet (owner)","a":"200 [2 items]","r":"c","k":"answer"},{"t":"batch read only","q":"POST :batchGet (owner)","a":"200 [2 items]","r":"c","k":"answer"},{"t":"batch new read only","q":"POST :batchGet (owner)","a":"200 [3 items]","r":"c","k":"answer"},{"t":"batch read time","q":"POST :batchGet (owner)","a":"200 [2 items]","r":"c","k":"answer"},{"t":"rollback","q":"POST :rollback (owner)","a":"200 {}","r":"c","k":"answer"},{"t":"get in read only","q":"GET /notes/a?transaction=EQcAAAAAAAAA (owner)","a":"no answer (timed out)","r":"d","k":"status","w":"the official REST GET never answered this read (recorded as a timeout); Firenook answers from the transaction's snapshot, as the official gRPC GetDocument does"},{"t":"get read only after mutation","q":"GET /notes/a?transaction=EQcAAAAAAAAA&mask.fieldPaths=title (owner)","a":"no answer (timed out)","r":"d","k":"status","w":"the official REST GET never answered this read (recorded as a timeout); Firenook answers from the transaction's snapshot, as the official gRPC GetDocument does"},{"t":"get read time","q":"GET /notes/a?readTime=2026-09-10T20%3A35%3A25.241297Z (owner)","a":"400 INVALID_ARGUMENT: Only timestamps past epoch are supported.","r":"d","k":"status","w":"the official REST GET refuses a valid readTime (400) that its batchGet reads at; Firenook reads at it"},{"t":"get selector conflict","q":"GET /notes/a?transaction=EQcAAAAAAAAA&readTime=2026-09-10T20%3A35%3A25.241297Z (owner)","a":"no answer (timed out)","r":"d","k":"status","w":"the official REST GET never answered this read (recorded as a timeout); Firenook refuses it with 400"},{"t":"get invalid transaction","q":"GET /notes/a?transaction=YmFk (owner)","a":"no answer (timed out)","r":"d","k":"status","w":"the official REST GET never answered this read (recorded as a timeout); Firenook refuses it with 400"},{"t":"get rolled back","q":"GET /notes/a?transaction=EQcAAAAAAAAA (owner)","a":"no answer (timed out)","r":"d","k":"status","w":"the official REST GET never answered this read (recorded as a timeout); Firenook answers 409 ABORTED, as the official gRPC GetDocument answers code 10"},{"t":"get in read only","q":"GetDocument get-in-read-only","a":"OK · notes/a with title","r":"u"},{"t":"get read only after mutation","q":"GetDocument get-read-only-after-mutation","a":"OK · notes/a with title","r":"u"},{"t":"get rolled back","q":"GetDocument get-rolled-back","a":"ABORTED","r":"u"},{"t":"aggregation-composite-filter #2","q":"POST /v1/projects/{project}/databases/(default)/documents:runAggregationQuery","a":"200 [1 item]","r":"c","k":"answer"},{"t":"aggregation-limit-error #2","q":"POST /v1/projects/{project}/databases/(default)/documents:runAggregationQuery","a":"400 INVALID_ARGUMENT: The maximum number of aggregations allowed in an aggregation query is 5. Received: 6","r":"c","k":"error"},{"t":"cors-preflight #1","q":"OPTIONS /v1/projects/{project}/databases/(default)/documents:commit","a":"200","r":"c","k":"answer"},{"t":"cors-preflight #2","q":"POST /v1/projects/{project}/databases/(default)/documents:commit","a":"200 {}","r":"c","k":"status"},{"t":"cors-preflight #3","q":"POST /v1/projects/{project}/databases/(default)/documents:commit","a":"200 {}","r":"c","k":"status"},{"t":"transaction-commit #4","q":"POST /v1/projects/{project}/databases/(default)/documents:commit","a":"400 INVALID_ARGUMENT: Cannot delete then update an entity in the same request.","r":"c","k":"answer"},{"t":"transaction-commit #6","q":"POST /v1/projects/{project}/databases/(default)/documents:commit","a":"200 {writeResults, commitTime}","r":"c","k":"status"},{"t":"transaction-commit #7","q":"POST /v1/projects/{project}/databases/(default)/documents:commit","a":"200 {writeResults, commitTime}","r":"c","k":"behaviour"},{"t":"transaction-noop-write #5","q":"POST /v1/projects/{project}/databases/(default)/documents:commit","a":"200 {writeResults, commitTime}","r":"c","k":"status"},{"t":"aggregation-composite-filter #1","q":"OPTIONS /v1/projects/{project}/databases/(default)/documents:runAggregationQuery","a":"200","r":"u"},{"t":"aggregation-count #1","q":"OPTIONS /v1/projects/{project}/databases/(default)/documents:runAggregationQuery","a":"200","r":"u"},{"t":"aggregation-count #2","q":"POST /v1/projects/{project}/databases/(default)/documents:runAggregationQuery","a":"200 [1 item]","r":"u"},{"t":"aggregation-limit-error #1","q":"OPTIONS /v1/projects/{project}/databases/(default)/documents:runAggregationQuery","a":"200","r":"u"},{"t":"transaction-commit #1","q":"OPTIONS /v1/projects/{project}/databases/(default)/documents:batchGet","a":"200","r":"u"},{"t":"transaction-commit #2","q":"POST /v1/projects/{project}/databases/(default)/documents:batchGet","a":"200 [1 item]","r":"u"},{"t":"transaction-commit #3","q":"OPTIONS /v1/projects/{project}/databases/(default)/documents:commit","a":"200","r":"u"},{"t":"transaction-commit #5","q":"POST /v1/projects/{project}/databases/(default)/documents:batchGet","a":"200 [1 item]","r":"u"},{"t":"transaction-commit #8","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"u"},{"t":"transaction-commit #9","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, documentChange, targetChange CURRENT, targetChange NO_CHANGE","r":"u"},{"t":"transaction-commit #12","q":"POST /google.firestore.v1.Firestore/Listen/channel (terminate)","a":"200","r":"u"},{"t":"transaction-noop-write #1","q":"OPTIONS /v1/projects/{project}/databases/(default)/documents:batchGet","a":"200","r":"u"},{"t":"transaction-noop-write #2","q":"POST /v1/projects/{project}/databases/(default)/documents:batchGet","a":"200 [1 item]","r":"u"},{"t":"transaction-noop-write #3","q":"OPTIONS /v1/projects/{project}/databases/(default)/documents:commit","a":"200","r":"u"},{"t":"transaction-noop-write #4","q":"POST /v1/projects/{project}/databases/(default)/documents:commit","a":"200 {writeResults, commitTime}","r":"u"},{"t":"transaction-noop-write #6","q":"POST /v1/projects/{project}/databases/(default)/documents:batchGet","a":"200 [1 item]","r":"u"},{"t":"transaction-noop-write #7","q":"POST /v1/projects/{project}/databases/(default)/documents:commit","a":"200 {writeResults, commitTime}","r":"u"},{"t":"backchannel-reconnect-replay #1","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"backchannel-reconnect-replay #3","q":"POST /google.firestore.v1.Firestore/Listen/channel (terminate)","a":"200","r":"c","k":"status"},{"t":"bundle-nanosecond-read-time #1","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"bundle-nanosecond-read-time #3","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"c","k":"status"},{"t":"bundle-nanosecond-read-time #7","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"bundle-nanosecond-read-time #11","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"c","k":"status"},{"t":"bundle-nanosecond-read-time #12","q":"POST /google.firestore.v1.Firestore/Listen/channel (terminate)","a":"200","r":"c","k":"status"},{"t":"bundle-nanosecond-read-time #13","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"bundle-nanosecond-read-time #15","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"c","k":"status"},{"t":"bundle-nanosecond-read-time #16","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"bundle-nanosecond-read-time #19","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"c","k":"status"},{"t":"bundle-nanosecond-read-time #20","q":"POST /google.firestore.v1.Firestore/Listen/channel (terminate)","a":"200","r":"c","k":"status"},{"t":"listen-long-poll #1","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"listen-long-poll #5","q":"POST /google.firestore.v1.Firestore/Listen/channel (terminate)","a":"200","r":"c","k":"status"},{"t":"listen-streaming #1","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"listen-streaming #4","q":"POST /google.firestore.v1.Firestore/Listen/channel (terminate)","a":"200","r":"c","k":"status"},{"t":"multiple-inequality-query #1","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"multiple-inequality-query #4","q":"POST /google.firestore.v1.Firestore/Listen/channel (send)","a":"200 · forward-channel ack","r":"c","k":"status"},{"t":"multiple-inequality-query #6","q":"POST /google.firestore.v1.Firestore/Listen/channel (send)","a":"200 · forward-channel ack","r":"c","k":"status"},{"t":"multiple-inequality-query #9","q":"POST /google.firestore.v1.Firestore/Listen/channel (send)","a":"200 · forward-channel ack","r":"c","k":"status"},{"t":"multiple-inequality-query #11","q":"POST /google.firestore.v1.Firestore/Listen/channel (send)","a":"200 · forward-channel ack","r":"c","k":"status"},{"t":"multiple-inequality-query #14","q":"POST /google.firestore.v1.Firestore/Listen/channel (send)","a":"200 · forward-channel ack","r":"c","k":"status"},{"t":"multiple-inequality-query #17","q":"POST /google.firestore.v1.Firestore/Listen/channel (terminate)","a":"200","r":"c","k":"status"},{"t":"unicode-framing #1","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"unicode-framing #2","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"unicode-framing #7","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"c","k":"status"},{"t":"unicode-framing #13","q":"POST /google.firestore.v1.Firestore/Listen/channel (terminate)","a":"200","r":"c","k":"status"},{"t":"unicode-framing #14","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"c","k":"status"},{"t":"unicode-framing #15","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"unicode-framing #16","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"unicode-framing #19","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"c","k":"status"},{"t":"unicode-framing #21","q":"POST /google.firestore.v1.Firestore/Listen/channel (terminate)","a":"200","r":"c","k":"status"},{"t":"unicode-framing #22","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"c","k":"status"},{"t":"write-long-poll #1","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"write-long-poll #3","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"c","k":"status"},{"t":"write-long-poll #6","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"c","k":"status"},{"t":"write-overlap #1","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"write-overlap #3","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"c","k":"status"},{"t":"write-overlap #6","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"c","k":"status"},{"t":"write-overlap #7","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"write-overlap #9","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"c","k":"status"},{"t":"write-overlap #10","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"c","k":"status"},{"t":"write-streaming #1","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"c","k":"status"},{"t":"write-streaming #3","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"c","k":"status"},{"t":"write-streaming #4","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"c","k":"status"},{"t":"backchannel-reconnect-replay #2","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, documentChange, targetChange CURRENT, targetChange NO_CHANGE, noop","r":"u"},{"t":"bundle-nanosecond-read-time #2","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened","r":"u"},{"t":"bundle-nanosecond-read-time #4","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop ×2, writeResults ×1","r":"u"},{"t":"bundle-nanosecond-read-time #5","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · writeResults ×1","r":"u"},{"t":"bundle-nanosecond-read-time #6","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop ×2","r":"u"},{"t":"bundle-nanosecond-read-time #8","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, targetChange RESET, documentChange, targetChange CURRENT, targetChange NO_CHANGE","r":"u"},{"t":"bundle-nanosecond-read-time #14","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened, noop, writeResults ×1 ×2","r":"u"},{"t":"bundle-nanosecond-read-time #17","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, targetChange RESET, documentChange, targetChange CURRENT, targetChange NO_CHANGE, noop","r":"u"},{"t":"listen-long-poll #2","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, documentChange, targetChange CURRENT, targetChange NO_CHANGE","r":"u"},{"t":"listen-streaming #2","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, documentChange, targetChange CURRENT, targetChange NO_CHANGE, noop","r":"u"},{"t":"multiple-inequality-query #2","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, documentChange ×3, targetChange CURRENT, targetChange NO_CHANGE","r":"u"},{"t":"multiple-inequality-query #3","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · noop ×2, targetChange REMOVE","r":"u"},{"t":"multiple-inequality-query #5","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · noop, targetChange ADD","r":"u"},{"t":"multiple-inequality-query #7","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · documentChange ×2, targetChange CURRENT, targetChange NO_CHANGE","r":"u"},{"t":"multiple-inequality-query #8","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · noop ×2, targetChange REMOVE","r":"u"},{"t":"multiple-inequality-query #10","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · noop, targetChange ADD","r":"u"},{"t":"multiple-inequality-query #12","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange REMOVE","r":"u"},{"t":"multiple-inequality-query #13","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · noop ×2, targetChange ADD","r":"u"},{"t":"multiple-inequality-query #15","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange REMOVE","r":"u"},{"t":"numeric-resource-id-ordering #1","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"u"},{"t":"numeric-resource-id-ordering #2","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened","r":"u"},{"t":"numeric-resource-id-ordering #3","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #4","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop ×2, writeResults ×1","r":"u"},{"t":"numeric-resource-id-ordering #5","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop, writeResults ×1","r":"u"},{"t":"numeric-resource-id-ordering #6","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #7","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop, writeResults ×1","r":"u"},{"t":"numeric-resource-id-ordering #8","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #9","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop, writeResults ×1","r":"u"},{"t":"numeric-resource-id-ordering #10","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #11","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop, writeResults ×1","r":"u"},{"t":"numeric-resource-id-ordering #12","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #13","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop, writeResults ×1","r":"u"},{"t":"numeric-resource-id-ordering #14","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"u"},{"t":"numeric-resource-id-ordering #15","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, documentChange ×5, targetChange CURRENT, targetChange NO_CHANGE","r":"u"},{"t":"numeric-resource-id-ordering #16","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · noop ×2, targetChange REMOVE","r":"u"},{"t":"numeric-resource-id-ordering #17","q":"POST /google.firestore.v1.Firestore/Listen/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #18","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #19","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · noop","r":"u"},{"t":"numeric-resource-id-ordering #20","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop, writeResults ×1","r":"u"},{"t":"numeric-resource-id-ordering #21","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #22","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · writeResults ×1 ×3","r":"u"},{"t":"numeric-resource-id-ordering #23","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop ×2","r":"u"},{"t":"numeric-resource-id-ordering #24","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"u"},{"t":"numeric-resource-id-ordering #25","q":"POST /google.firestore.v1.Firestore/Listen/channel (terminate)","a":"200","r":"u"},{"t":"numeric-resource-id-ordering #26","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"u"},{"t":"numeric-resource-id-ordering #27","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened, noop, writeResults ×1 ×10","r":"u"},{"t":"numeric-resource-id-ordering #28","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #29","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #30","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #31","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #32","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #33","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"u"},{"t":"numeric-resource-id-ordering #34","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, documentChange ×5, targetChange CURRENT, targetChange NO_CHANGE, noop, targetChange REMOVE","r":"u"},{"t":"numeric-resource-id-ordering #35","q":"POST /google.firestore.v1.Firestore/Listen/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #36","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #37","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"numeric-resource-id-ordering #38","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"u"},{"t":"numeric-resource-id-ordering #39","q":"POST /google.firestore.v1.Firestore/Listen/channel (terminate)","a":"200","r":"u"},{"t":"reserved-resource-id-error #1","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"u"},{"t":"reserved-resource-id-error #2","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange REMOVE","r":"u"},{"t":"reserved-resource-id-error #4","q":"POST /google.firestore.v1.Firestore/Listen/channel (terminate)","a":"200","r":"u"},{"t":"reserved-resource-id-error #5","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"u"},{"t":"reserved-resource-id-error #6","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange REMOVE, noop","r":"u"},{"t":"reserved-resource-id-error #7","q":"POST /google.firestore.v1.Firestore/Listen/channel (terminate)","a":"200","r":"u"},{"t":"unicode-framing #4","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, documentDelete, targetChange CURRENT, targetChange NO_CHANGE","r":"u"},{"t":"unicode-framing #5","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened","r":"u"},{"t":"unicode-framing #6","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · noop ×2, documentChange","r":"u"},{"t":"unicode-framing #8","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop ×2, writeResults ×1","r":"u"},{"t":"unicode-framing #9","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange NO_CHANGE","r":"u"},{"t":"unicode-framing #10","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop","r":"u"},{"t":"unicode-framing #17","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened, noop, writeResults ×1","r":"u"},{"t":"unicode-framing #18","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, documentChange, targetChange CURRENT, targetChange NO_CHANGE, noop, documentChange, targetChange NO_CHANGE","r":"u"},{"t":"unknown-sid #1","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"400 (empty body)","r":"u"},{"t":"write-batch-six #1","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"u"},{"t":"write-batch-six #2","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened","r":"u"},{"t":"write-batch-six #3","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"write-batch-six #4","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop ×2, writeResults ×6","r":"u"},{"t":"write-batch-six #6","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"u"},{"t":"write-batch-six #7","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"u"},{"t":"write-batch-six #8","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened, noop, writeResults ×6","r":"u"},{"t":"write-batch-six #9","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"write-batch-six #10","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"u"},{"t":"write-cross-client-update #1","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"u"},{"t":"write-cross-client-update #2","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened","r":"u"},{"t":"write-cross-client-update #3","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"write-cross-client-update #4","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop ×2, writeResults ×1","r":"u"},{"t":"write-cross-client-update #5","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop","r":"u"},{"t":"write-cross-client-update #6","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"u"},{"t":"write-cross-client-update #7","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened","r":"u"},{"t":"write-cross-client-update #8","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"write-cross-client-update #9","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop ×2, writeResults ×1","r":"u"},{"t":"write-cross-client-update #10","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop","r":"u"},{"t":"write-cross-client-update #11","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"u"},{"t":"write-cross-client-update #12","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, documentChange, targetChange CURRENT, targetChange NO_CHANGE","r":"u"},{"t":"write-cross-client-update #13","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · noop ×2, targetChange REMOVE","r":"u"},{"t":"write-cross-client-update #14","q":"POST /google.firestore.v1.Firestore/Listen/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"write-cross-client-update #15","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"u"},{"t":"write-cross-client-update #16","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · noop","r":"u"},{"t":"write-cross-client-update #17","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, documentChange, targetChange CURRENT, targetChange NO_CHANGE","r":"u"},{"t":"write-cross-client-update #18","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · noop ×2","r":"u"},{"t":"write-cross-client-update #20","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"u"},{"t":"write-cross-client-update #21","q":"POST /google.firestore.v1.Firestore/Listen/channel (terminate)","a":"200","r":"u"},{"t":"write-cross-client-update #22","q":"POST /google.firestore.v1.Firestore/Listen/channel (terminate)","a":"200","r":"u"},{"t":"write-cross-client-update #23","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"u"},{"t":"write-cross-client-update #24","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"u"},{"t":"write-cross-client-update #25","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened, noop, writeResults ×1","r":"u"},{"t":"write-cross-client-update #26","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"write-cross-client-update #27","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"u"},{"t":"write-cross-client-update #28","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened, noop, writeResults ×1","r":"u"},{"t":"write-cross-client-update #29","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"write-cross-client-update #30","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"u"},{"t":"write-cross-client-update #31","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, documentChange, targetChange CURRENT, targetChange NO_CHANGE, noop, targetChange REMOVE","r":"u"},{"t":"write-cross-client-update #32","q":"POST /google.firestore.v1.Firestore/Listen/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"write-cross-client-update #33","q":"POST /google.firestore.v1.Firestore/Listen/channel (open)","a":"200 · session created","r":"u"},{"t":"write-cross-client-update #34","q":"GET /google.firestore.v1.Firestore/Listen/channel (backchannel)","a":"200 · targetChange ADD, documentChange, targetChange CURRENT, targetChange NO_CHANGE, noop","r":"u"},{"t":"write-cross-client-update #35","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"u"},{"t":"write-cross-client-update #37","q":"POST /google.firestore.v1.Firestore/Listen/channel (terminate)","a":"200","r":"u"},{"t":"write-cross-client-update #38","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"u"},{"t":"write-cross-client-update #39","q":"POST /google.firestore.v1.Firestore/Listen/channel (terminate)","a":"200","r":"u"},{"t":"write-long-poll #2","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened","r":"u"},{"t":"write-long-poll #4","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop ×2, writeResults ×1","r":"u"},{"t":"write-missing-update-error #1","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"u"},{"t":"write-missing-update-error #2","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened","r":"u"},{"t":"write-missing-update-error #3","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"write-missing-update-error #4","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop ×2, error NOT_FOUND: no entity to update: app: \"{project}\" path < Element { type: \"{project}\" name: \"oracle-missing-update\" } >","r":"u"},{"t":"write-missing-update-error #5","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"u"},{"t":"write-missing-update-error #6","q":"POST /google.firestore.v1.Firestore/Write/channel (open)","a":"200 · session created","r":"u"},{"t":"write-missing-update-error #7","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened, noop, error NOT_FOUND: no entity to update: app: \"{project}\" path < Element { type: \"{project}\" name: \"oracle-missing-…","r":"u"},{"t":"write-missing-update-error #8","q":"POST /google.firestore.v1.Firestore/Write/channel (send)","a":"200 · forward-channel ack","r":"u"},{"t":"write-missing-update-error #9","q":"POST /google.firestore.v1.Firestore/Write/channel (terminate)","a":"200","r":"u"},{"t":"write-overlap #2","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened","r":"u"},{"t":"write-overlap #4","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · noop ×2, writeResults ×1 ×2","r":"u"},{"t":"write-overlap #8","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened, noop, writeResults ×1 ×2","r":"u"},{"t":"write-streaming #2","q":"GET /google.firestore.v1.Firestore/Write/channel (backchannel)","a":"200 · stream opened, noop, writeResults ×1","r":"u"}]} \ No newline at end of file diff --git a/public/conformance/functions.json b/public/conformance/functions.json new file mode 100644 index 0000000..9f69d22 --- /dev/null +++ b/public/conformance/functions.json @@ -0,0 +1 @@ +{"runs":[[0,4,0,"v1 and v2 Firestore create triggers use distinct registration bodies and dispatch exact legacy-event and CloudEvent envelopes to the Functions emulator"],[4,1,0,"v1 and v2 Firestore create triggers use distinct registration bodies and dispatch exact legacy-event and CloudEvent envelopes to the Functions emulator"],[5,7,1,"Callable and HTTP functions: envelopes, typed errors and unknown functions"],[12,2,1,"Functions discovery at startup and after a source change"],[14,6,2,"Functions startup: inventory and trigger records"],[20,2,2,"Registration with the auxiliary emulators at startup"],[22,3,3,"GET /backends after readiness: every codebase, the static manifest, the broken codebases and the local extension backend."],[25,7,3,"404 bodies for an unknown function id (lists every registered trigger key), an unknown region, an unknown project and an unknown path."],[32,6,3,"Explicit and multi-region deployments answer on their region path only."],[38,9,3,"Secondary, ESM and static-manifest codebases serve; the broken and invalid-dotenv codebases export nothing."],[47,3,3,"A Realtime Database export is discovered but ignored; its trigger route still exists. The task-queue export registers with the Tasks emulator."],[50,13,3,"Every HTTP method reaches the v2 onRequest handler; the handler records url, path, query, headers, ip and body parsing."],[63,8,3,"Sub-paths, query strings, trailing slashes, encoded characters and dot segments under the function route."],[71,8,3,"Status codes, custom headers, redirects, empty bodies, text bodies and chunked streaming responses pass through the proxy."],[79,6,3,"Synchronous throw, asynchronous rejection, throw after headers, a handler that never responds, and a per-function timeout."],[85,8,3,"SDK-level CORS on onRequest({cors}) for preflights and simple requests with allowed, disallowed and absent origins."],[93,4,3,"First-generation https.onRequest, region and runWith options on the secondary codebase."],[97,2,3,"The handler's Admin SDK reaches the emulated Firestore through the injected environment."],[99,14,3,"Data shapes, missing data, invalid bodies and wrong methods on a v2 onCall."],[113,21,3,"HttpsError status mapping for every canonical code, details passthrough, and unhandled failures."],[134,14,3,"Authorization headers as seen by onCall: valid, sub-only, expired, malformed, wrong scheme, plus instance id and App Check headers."],[148,5,3,"First-generation https.onCall envelope, context and errors."],[153,9,3,"Server-sent chunks with Accept: text/event-stream, non-streaming clients on a streaming function, and an error after a chunk."],[162,5,3,"Preflight and simple requests on v1 and v2 callables from any origin (the SDK enables CORS for callables)."],[167,5,3,"Create, update and delete one document; created/updated/deleted/written handlers observe CloudEvents with snapshots, params and attributes."],[172,4,3,"WithAuthContext handlers observe authType and authId for an owner write, a user-token REST write and an admin write."],[176,3,3,"First-generation onCreate/onUpdate/onDelete/onWrite envelopes: change snapshots and context."],[179,9,3,"Nested wildcards, multi-segment wildcards, exact documents, non-matching paths and a regional trigger."],[188,5,3,"One commit with three writes yields three events; handler failures and slow handlers do not block delivery."],[193,4,3,"Upload, metadata patch and delete on the default bucket; finalized/metadataUpdated/deleted CloudEvents with StorageObjectData."],[197,3,3,"A trigger bound to a second bucket fires only for that bucket; default-bucket triggers ignore it."],[200,5,3,"Published messages with JSON data, plain data, attributes and ordering keys reach two v2 handlers on the same topic."],[205,4,3,"First-generation onPublish message accessors and context."],[209,5,3,"Manual firing of v2 and v1 schedules through the trigger route, and the schedule metadata in the inventory."],[214,3,3,"Sign-up and deletion fan out to two onCreate handlers, one onDelete handler and the extension's auth resource."],[217,7,3,"beforeUserCreated: pass-through, claims and display name applied by the handler, rejection with HttpsError, and the seven-second deadline."],[224,4,3,"beforeUserSignedIn: session claims returned by the handler and a rejection with details."],[228,7,3,"The dotenv chain, .secret.local, declared secrets, reserved system variables and emulator host variables as observed by handlers."],[235,4,3,"A handler that exits its process: the in-flight response, the next invocation of the same and of another function in the codebase."],[239,2,3,"Two slow requests to the same function overlap; a third to another function is not queued behind them."],[241,12,3,"Editing the primary codebase adds a function, removes one and changes a trigger path; the inventory, routes and trigger keys after the reload."],[253,4,3,"The local extension's backend in /backends: resolved resources, substituted spec, injected params, secrets and the dropped task-queue resource."],[257,9,3,"HTTPS, Firestore v1, v2function Firestore, schedule and custom-event delivery for the local extension."],[266,8,3,"The hub's disable/enable background trigger switches and their effect on event delivery and trigger keys."],[274,5,3,"First-generation beforeCreate/beforeSignIn handlers: user and context shapes, applied claims and rejection."],[279,5,3,"--inspect-functions: the debug port log, sequential execution and the per-request debug target in a shared worker."],[284,1,3,"An extension instance whose env files omit a required parameter without default: the startup failure and its message."],[285,1,3,"The dotenv chain, .secret.local, declared secrets, reserved system variables and emulator host variables as observed by handlers."],[286,1,3,"A handler that exits its process: the in-flight response, the next invocation of the same and of another function in the codebase."],[287,1,3,"GET /backends after readiness: every codebase, the static manifest, the broken codebases and the local extension backend."],[288,3,3,"Two registry extensions resolved from the shared cache: backends, substituted specs, secrets as Secret Manager names, and the dropped task-queue resources."],[291,7,3,"Deliveries reach the registry extensions' handlers: a Firestore create into Stripe's checkout session handler, a user sign-up into createCustomer, a Firestore write into Algolia's indexer; their outbound calls fail deliberately."],[298,3,4,"Pub/Sub delivery across a Functions source reload"]],"cases":[{"t":"v1 document create","q":"PUT /emulator/v1/projects/{project}/triggers/us-central1-v1Created","a":"200 {}","r":"c","k":"status"},{"t":"v2 document created","q":"POST /emulator/v1/projects/{project}/eventarcTrigger?eventarcTriggerId=us-central1-v2Created","a":"200 {eventType, database, namespace, document}","r":"c","k":"answer"},{"t":"dispatch 1","q":"the document write, as dispatched to Functions","a":"POST /functions/projects/{project}/triggers/us-central1-v1Created with {data, context}","r":"c","k":"behaviour"},{"t":"dispatch 2","q":"the document write, as dispatched to Functions","a":"POST /functions/projects/{project}/triggers/us-central1-v2Created with binary body (189 bytes)","r":"c","k":"behaviour"},{"t":"document write","q":"PATCH /v1/projects/{project}/databases/(default)/documents/phase4Triggers/oracle?currentDocument.exists=false","a":"200 {name, fields, createTime, updateTime}","r":"u"},{"t":"functions backends","q":"GET /backends","a":"200 {backends}","r":"u"},{"t":"http function get","q":"GET /{project}/us-central1/httpEcho?mode=get","a":"200 {method, query, body, unicode}","r":"u"},{"t":"http function post","q":"POST /{project}/us-central1/httpEcho","a":"200 {method, query, body, unicode}","r":"u"},{"t":"callable success","q":"POST /{project}/us-central1/callableEcho","a":"200 {result}","r":"u"},{"t":"callable typed error","q":"POST /{project}/us-central1/callableEcho","a":"400 INVALID_ARGUMENT: phase4 invalid","r":"u"},{"t":"callable invalid get","q":"GET /{project}/us-central1/callableEcho","a":"400 INVALID_ARGUMENT: Bad Request","r":"u"},{"t":"unknown function","q":"POST /{project}/us-central1/missingFunction","a":"404 Function us-central1-missingFunction does not exist, valid functions are: us-central1-httpEcho, us-central1-callableEcho, us-central1-s…","r":"u"},{"t":"official connect","q":"start Functions and change the source (official connect)","a":"1 startup discovery call · after reload us-central1-alpha, us-central1-beta (rediscovered)","r":"u"},{"t":"prior adapter double discovery","q":"start Functions and change the source (prior adapter double discovery)","a":"2 startup discovery calls · after reload us-central1-alpha, us-central1-beta (rediscovered)","r":"u"},{"t":"healthy","q":"start Functions (healthy), then GET /backends","a":"200 · 2 backends, 4 trigger records","r":"u"},{"t":"failed codebase","q":"start Functions (failed codebase), then GET /backends","a":"200 · 2 backends, 2 trigger records","r":"u"},{"t":"missing auxiliary","q":"start Functions (missing auxiliary), then GET /backends","a":"200 · 2 backends, 4 trigger records (2 ignored)","r":"u"},{"t":"predefined backend","q":"start Functions (predefined backend), then GET /backends","a":"200 · 1 backend, 1 trigger record","r":"u"},{"t":"colliding backends","q":"start Functions (colliding backends), then GET /backends","a":"200 · 2 backends, 2 trigger records","r":"u"},{"t":"unsupported predefined","q":"start Functions (unsupported predefined), then GET /backends","a":"200 · 1 backend, 2 trigger records (1 ignored)","r":"u"},{"t":"eventarc registration","q":"POST /emulator/v1/projects/{project}/triggers/us-central1-event-0-projects/{project}/locations/us-central1/channels/firebase","a":"200 {res}","r":"u"},{"t":"tasks registration","q":"POST /projects/{project}/locations/us-central1/queues/task","a":"200 {taskQueueConfig}","r":"u"},{"t":"backends","q":"GET /backends","a":"200 {backends}","r":"c","k":"answer"},{"t":"backends cors","q":"OPTIONS /backends","a":"404 Not Found","r":"c","k":"answer"},{"t":"startup logs","q":"emulator log lines matching \"functions\"","a":"0 log lines matched","r":"c","k":"behaviour"},{"t":"unknown function","q":"GET /{project}/us-central1/nope","a":"404 Function us-central1-nope does not exist, valid functions are: us-central1-ext-synthetic-httpFn, us-central1-ext-synthetic-firestoreFn-…","r":"c","k":"answer"},{"t":"unknown region","q":"GET /{project}/mars-north1/httpEcho","a":"404 Function mars-north1-httpEcho does not exist, valid functions are: us-central1-ext-synthetic-httpFn, us-central1-ext-synthetic-firestor…","r":"c","k":"answer"},{"t":"unknown project","q":"GET /other-project/us-central1/httpEcho","a":"404 Not Found","r":"c","k":"answer"},{"t":"unknown path","q":"GET /nope","a":"404 Not Found","r":"c","k":"answer"},{"t":"root","q":"GET /","a":"404 Not Found","r":"c","k":"answer"},{"t":"trigger route get","q":"GET /functions/projects/{project}/triggers/us-central1-docWritten-0","a":"404 Not Found","r":"c","k":"answer"},{"t":"trigger unknown","q":"POST /functions/projects/{project}/triggers/us-central1-missing-0","a":"404 Function us-central1-missing-0 does not exist, valid functions are: us-central1-ext-synthetic-httpFn, us-central1-ext-synthetic-firesto…","r":"c","k":"answer"},{"t":"alt region","q":"GET /{project}/europe-west1/httpRegion","a":"200 {region} · handler saw 1 event","r":"c","k":"answer"},{"t":"alt region on default","q":"GET /{project}/us-central1/httpRegion","a":"404 Function us-central1-httpRegion does not exist, valid functions are: us-central1-ext-synthetic-httpFn, us-central1-ext-synthetic-firest…","r":"c","k":"answer"},{"t":"multi default","q":"GET /{project}/us-central1/httpMultiRegion","a":"200 {multi} · handler saw 1 event","r":"c","k":"answer"},{"t":"multi alt","q":"GET /{project}/europe-west1/httpMultiRegion","a":"200 {multi} · handler saw 1 event","r":"c","k":"answer"},{"t":"v1 region","q":"GET /{project}/europe-west1/v1Region","a":"200 {v1Region} · handler saw 1 event","r":"c","k":"answer"},{"t":"callable region","q":"POST /{project}/europe-west1/callableRegion","a":"200 {result} · handler saw 1 event","r":"c","k":"answer"},{"t":"secondary http","q":"GET /{project}/us-central1/secondaryHttp","a":"200 {codebase} · handler saw 1 event","r":"c","k":"answer"},{"t":"secondary callable","q":"POST /{project}/us-central1/secondaryCallable","a":"200 {result} · handler saw 1 event","r":"c","k":"answer"},{"t":"esm http","q":"GET /{project}/us-central1/esmHttp/sub","a":"200 {esm, path} · handler saw 1 event","r":"c","k":"answer"},{"t":"esm callable","q":"POST /{project}/us-central1/esmCallable","a":"200 {result} · handler saw 1 event","r":"c","k":"answer"},{"t":"yaml http","q":"GET /{project}/us-central1/yamlHttp/static?x=1","a":"200 {manifest, path} · handler saw 1 event","r":"c","k":"answer"},{"t":"yaml event","q":"Firestore set manifested/one","a":"200 {name, fields, createTime, updateTime} · handler saw 1 event","r":"c","k":"answer"},{"t":"broken never loads","q":"GET /{project}/us-central1/neverLoads","a":"404 Function us-central1-neverLoads does not exist, valid functions are: us-central1-ext-synthetic-httpFn, us-central1-ext-synthetic-firest…","r":"c","k":"answer"},{"t":"bad env http","q":"GET /{project}/us-central1/badEnvHttp","a":"404 Function us-central1-badEnvHttp does not exist, valid functions are: us-central1-ext-synthetic-httpFn, us-central1-ext-synthetic-firest…","r":"c","k":"answer"},{"t":"load failure logs","q":"emulator log lines matching \"Failed to load\"","a":"0 log lines matched","r":"c","k":"behaviour"},{"t":"ignored logs","q":"emulator log lines matching \"ignored because\"","a":"0 log lines matched","r":"c","k":"behaviour"},{"t":"db trigger post","q":"POST /functions/projects/{project}/triggers/us-central1-dbIgnored-0","a":"200 {status} · handler saw 1 event","r":"c","k":"answer"},{"t":"task queue http","q":"POST /{project}/us-central1/taskQueue","a":"204 · handler saw 1 event","r":"c","k":"answer"},{"t":"get","q":"GET /{project}/us-central1/httpEcho","a":"200 {echo, unicode} · handler saw 1 event","r":"c","k":"answer"},{"t":"post json","q":"POST /{project}/us-central1/httpEcho","a":"200 {echo, unicode} · handler saw 1 event","r":"c","k":"answer"},{"t":"put text","q":"PUT /{project}/us-central1/httpEcho","a":"200 {echo, unicode} · handler saw 1 event","r":"c","k":"answer"},{"t":"patch form","q":"PATCH /{project}/us-central1/httpEcho","a":"200 {echo, unicode} · handler saw 1 event","r":"c","k":"answer"},{"t":"delete","q":"DELETE /{project}/us-central1/httpEcho?soft=true","a":"200 {echo, unicode} · handler saw 1 event","r":"c","k":"answer"},{"t":"head","q":"HEAD /{project}/us-central1/httpEcho","a":"200 · handler saw 1 event","r":"c","k":"answer"},{"t":"options no cors","q":"OPTIONS /{project}/us-central1/httpEcho","a":"204","r":"c","k":"answer"},{"t":"post bytes","q":"POST /{project}/us-central1/httpEcho","a":"200 {echo, unicode} · handler saw 1 event","r":"c","k":"answer"},{"t":"post invalid json","q":"POST /{project}/us-central1/httpEcho","a":"400 SyntaxError: Expected property name or '}' in JSON at position 1 (line 1 column 2)    at {{stack}}","r":"c","k":"answer"},{"t":"post empty json","q":"POST /{project}/us-central1/httpEcho","a":"200 {echo, unicode} · handler saw 1 event","r":"c","k":"answer"},{"t":"post xml","q":"POST /{project}/us-central1/httpEcho","a":"200 {echo, unicode} · handler saw 1 event","r":"c","k":"answer"},{"t":"post large","q":"POST /{project}/us-central1/httpEcho","a":"200 {echo, unicode} · handler saw 1 event","r":"c","k":"answer"},{"t":"custom headers","q":"GET /{project}/us-central1/httpEcho","a":"200 {echo, unicode} · handler saw 1 event","r":"c","k":"answer"},{"t":"subpath","q":"GET /{project}/us-central1/httpEcho/a/b/c","a":"200 {echo, unicode} · handler saw 1 event","r":"c","k":"answer"},{"t":"subpath query","q":"GET /{project}/us-central1/httpEcho/a?x=1&y=2&y=3&empty=&flag","a":"200 {echo, unicode} · handler saw 1 event","r":"c","k":"answer"},{"t":"trailing slash","q":"GET /{project}/us-central1/httpEcho/","a":"200 {echo, unicode} · handler saw 1 event","r":"c","k":"answer"},{"t":"double slash","q":"GET /{project}/us-central1/httpEcho//double","a":"200 {echo, unicode} · handler saw 1 event","r":"c","k":"answer"},{"t":"encoded","q":"GET /{project}/us-central1/httpEcho/sp%20ace/%E7%81%AB?q=%F0%9F%94%A5","a":"200 {echo, unicode} · handler saw 1 event","r":"c","k":"answer"},{"t":"dot segments","q":"GET /{project}/us-central1/httpEcho/a/../b","a":"200 {echo, unicode} · handler saw 1 event","r":"c","k":"answer"},{"t":"query only","q":"GET /{project}/us-central1/httpEcho?only=query","a":"200 {echo, unicode} · handler saw 1 event","r":"c","k":"answer"},{"t":"name prefix","q":"GET /{project}/us-central1/httpEchoNot","a":"404 Function us-central1-httpEchoNot does not exist, valid functions are: us-central1-ext-synthetic-httpFn, us-central1-ext-synthetic-fires…","r":"c","k":"answer"},{"t":"status 201","q":"GET /{project}/us-central1/httpEcho?mode=status","a":"201 {code} · handler saw 1 event","r":"c","k":"answer"},{"t":"status 404","q":"GET /{project}/us-central1/httpEcho?mode=status","a":"404 {code} · handler saw 1 event","r":"c","k":"answer"},{"t":"status 500","q":"GET /{project}/us-central1/httpEcho?mode=status","a":"500 {code} · handler saw 1 event","r":"c","k":"answer"},{"t":"redirect","q":"GET /{project}/us-central1/httpEcho?mode=redirect","a":"302 Found. Redirecting to /redirected · handler saw 1 event","r":"c","k":"answer"},{"t":"empty 204","q":"GET /{project}/us-central1/httpEcho?mode=empty","a":"204 · handler saw 1 event","r":"c","k":"answer"},{"t":"text","q":"GET /{project}/us-central1/httpEcho?mode=text","a":"200 plain text 火🔥 · handler saw 1 event","r":"c","k":"answer"},{"t":"stream","q":"GET /{project}/us-central1/httpEcho?mode=stream","a":"200 chunk-1 · handler saw 1 event","r":"c","k":"answer"},{"t":"header mode","q":"GET /{project}/us-central1/httpEcho","a":"201 {code} · handler saw 1 event","r":"c","k":"answer"},{"t":"throw","q":"GET /{project}/us-central1/httpEcho?mode=throw","a":"500 Internal Server Error · handler saw 1 event","r":"c","k":"answer"},{"t":"reject","q":"GET /{project}/us-central1/httpEcho?mode=reject","a":"500 Internal Server Error · handler saw 1 event","r":"c","k":"answer"},{"t":"throw after headers","q":"GET /{project}/us-central1/httpEcho?mode=throw-after-headers","a":"client error: client timeout after 4000ms · handler saw 1 event","r":"c","k":"answer"},{"t":"timeout","q":"GET /{project}/us-central1/httpTimeout","a":"500 {code} · handler saw 1 event","r":"c","k":"answer"},{"t":"after timeout","q":"GET /{project}/us-central1/httpEcho","a":"200 {echo, unicode} · handler saw 1 event","r":"c","k":"answer"},{"t":"timeout logs","q":"emulator log lines matching \"timed out\"","a":"1 log line matched","r":"c","k":"behaviour"},{"t":"all preflight","q":"OPTIONS /{project}/us-central1/httpCorsAll","a":"204","r":"c","k":"answer"},{"t":"all get","q":"GET /{project}/us-central1/httpCorsAll","a":"200 {cors} · handler saw 1 event","r":"c","k":"answer"},{"t":"origin preflight allowed","q":"OPTIONS /{project}/us-central1/httpCorsOrigin","a":"204","r":"c","k":"answer"},{"t":"origin preflight denied","q":"OPTIONS /{project}/us-central1/httpCorsOrigin","a":"204","r":"c","k":"answer"},{"t":"origin get allowed","q":"GET /{project}/us-central1/httpCorsOrigin","a":"200 {cors} · handler saw 1 event","r":"c","k":"answer"},{"t":"origin get denied","q":"GET /{project}/us-central1/httpCorsOrigin","a":"200 {cors} · handler saw 1 event","r":"c","k":"answer"},{"t":"no origin","q":"GET /{project}/us-central1/httpCorsOrigin","a":"200 {cors} · handler saw 1 event","r":"c","k":"answer"},{"t":"plain preflight","q":"OPTIONS /{project}/us-central1/httpEcho","a":"204","r":"c","k":"answer"},{"t":"v1 get","q":"GET /{project}/us-central1/v1Http/legacy?x=1","a":"200 {v1, echo} · handler saw 1 event","r":"c","k":"answer"},{"t":"v1 post","q":"POST /{project}/us-central1/v1Http","a":"200 {v1, echo} · handler saw 1 event","r":"c","k":"answer"},{"t":"v1 options","q":"GET /{project}/us-central1/v1Options","a":"200 {options} · handler saw 1 event","r":"c","k":"answer"},{"t":"v1 preflight","q":"OPTIONS /{project}/us-central1/v1Http","a":"200 {v1, echo} · handler saw 1 event","r":"c","k":"answer"},{"t":"round trip","q":"GET /{project}/us-central1/adminRoundTrip?id=wired","a":"200 {wrote, data} · handler saw 1 event","r":"c","k":"answer"},{"t":"read back","q":"Firestore update probe/wired","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"answer"},{"t":"object","q":"POST /{project}/us-central1/callableEcho","a":"200 {result} · handler saw 1 event","r":"c","k":"answer"},{"t":"null","q":"POST /{project}/us-central1/callableEcho","a":"200 {result} · handler saw 1 event","r":"c","k":"answer"},{"t":"string","q":"POST /{project}/us-central1/callableEcho","a":"200 {result} · handler saw 1 event","r":"c","k":"answer"},{"t":"number","q":"POST /{project}/us-central1/callableEcho","a":"200 {result} · handler saw 1 event","r":"c","k":"answer"},{"t":"array","q":"POST /{project}/us-central1/callableEcho","a":"200 {result} · handler saw 1 event","r":"c","k":"answer"},{"t":"long encoded","q":"POST /{project}/us-central1/callableEcho","a":"200 {result} · handler saw 1 event","r":"c","k":"answer"},{"t":"missing data","q":"POST /{project}/us-central1/callableEcho","a":"400 INVALID_ARGUMENT: Bad Request","r":"c","k":"answer"},{"t":"empty object","q":"POST /{project}/us-central1/callableEcho","a":"400 INVALID_ARGUMENT: Bad Request","r":"c","k":"answer"},{"t":"invalid json","q":"POST /{project}/us-central1/callableEcho","a":"400 SyntaxError: Expected property name or '}' in JSON at position 1 (line 1 column 2)    at {{stack}}","r":"c","k":"answer"},{"t":"text body","q":"POST /{project}/us-central1/callableEcho","a":"400 INVALID_ARGUMENT: Bad Request","r":"c","k":"answer"},{"t":"get method","q":"GET /{project}/us-central1/callableEcho","a":"400 INVALID_ARGUMENT: Bad Request","r":"c","k":"answer"},{"t":"put method","q":"PUT /{project}/us-central1/callableEcho","a":"400 INVALID_ARGUMENT: Bad Request","r":"c","k":"answer"},{"t":"return undefined","q":"POST /{project}/us-central1/callableEcho","a":"200 {result} · handler saw 1 event","r":"c","k":"answer"},{"t":"extra keys","q":"POST /{project}/us-central1/callableEcho","a":"400 INVALID_ARGUMENT: Bad Request","r":"c","k":"answer"},{"t":"code ok","q":"POST /{project}/us-central1/callableEcho","a":"200 OK: synthetic ok · handler saw 1 event","r":"c","k":"answer"},{"t":"code cancelled","q":"POST /{project}/us-central1/callableEcho","a":"499 CANCELLED: synthetic cancelled · handler saw 1 event","r":"c","k":"answer"},{"t":"code unknown","q":"POST /{project}/us-central1/callableEcho","a":"500 UNKNOWN: synthetic unknown · handler saw 1 event","r":"c","k":"answer"},{"t":"code invalid argument","q":"POST /{project}/us-central1/callableEcho","a":"400 INVALID_ARGUMENT: synthetic invalid-argument · handler saw 1 event","r":"c","k":"answer"},{"t":"code deadline exceeded","q":"POST /{project}/us-central1/callableEcho","a":"504 DEADLINE_EXCEEDED: synthetic deadline-exceeded · handler saw 1 event","r":"c","k":"answer"},{"t":"code not found","q":"POST /{project}/us-central1/callableEcho","a":"404 NOT_FOUND: synthetic not-found · handler saw 1 event","r":"c","k":"answer"},{"t":"code already exists","q":"POST /{project}/us-central1/callableEcho","a":"409 ALREADY_EXISTS: synthetic already-exists · handler saw 1 event","r":"c","k":"answer"},{"t":"code permission denied","q":"POST /{project}/us-central1/callableEcho","a":"403 PERMISSION_DENIED: synthetic permission-denied · handler saw 1 event","r":"c","k":"answer"},{"t":"code resource exhausted","q":"POST /{project}/us-central1/callableEcho","a":"429 RESOURCE_EXHAUSTED: synthetic resource-exhausted · handler saw 1 event","r":"c","k":"answer"},{"t":"code failed precondition","q":"POST /{project}/us-central1/callableEcho","a":"400 FAILED_PRECONDITION: synthetic failed-precondition · handler saw 1 event","r":"c","k":"answer"},{"t":"code aborted","q":"POST /{project}/us-central1/callableEcho","a":"409 ABORTED: synthetic aborted · handler saw 1 event","r":"c","k":"answer"},{"t":"code out of range","q":"POST /{project}/us-central1/callableEcho","a":"400 OUT_OF_RANGE: synthetic out-of-range · handler saw 1 event","r":"c","k":"answer"},{"t":"code unimplemented","q":"POST /{project}/us-central1/callableEcho","a":"501 UNIMPLEMENTED: synthetic unimplemented · handler saw 1 event","r":"c","k":"answer"},{"t":"code internal","q":"POST /{project}/us-central1/callableEcho","a":"500 INTERNAL: synthetic internal · handler saw 1 event","r":"c","k":"answer"},{"t":"code unavailable","q":"POST /{project}/us-central1/callableEcho","a":"503 UNAVAILABLE: synthetic unavailable · handler saw 1 event","r":"c","k":"answer"},{"t":"code data loss","q":"POST /{project}/us-central1/callableEcho","a":"500 DATA_LOSS: synthetic data-loss · handler saw 1 event","r":"c","k":"answer"},{"t":"code unauthenticated","q":"POST /{project}/us-central1/callableEcho","a":"401 UNAUTHENTICATED: synthetic unauthenticated · handler saw 1 event","r":"c","k":"answer"},{"t":"bad code","q":"POST /{project}/us-central1/callableEcho","a":"500 INTERNAL · handler saw 1 event","r":"c","k":"answer"},{"t":"plain throw","q":"POST /{project}/us-central1/callableEcho","a":"500 INTERNAL · handler saw 1 event","r":"c","k":"answer"},{"t":"plain reject","q":"POST /{project}/us-central1/callableEcho","a":"500 INTERNAL · handler saw 1 event","r":"c","k":"answer"},{"t":"no details","q":"POST /{project}/us-central1/callableEcho","a":"404 NOT_FOUND: custom message · handler saw 1 event","r":"c","k":"answer"},{"t":"bearer alice","q":"POST /{project}/us-central1/callableEcho","a":"200 {result} · handler saw 1 event","r":"c","k":"answer"},{"t":"bearer admin claim","q":"POST /{project}/us-central1/callableEcho","a":"200 {result} · handler saw 1 event","r":"c","k":"answer"},{"t":"bearer subonly","q":"POST /{project}/us-central1/callableEcho","a":"200 {result} · handler saw 1 event","r":"c","k":"answer"},{"t":"bearer expired","q":"POST /{project}/us-central1/callableEcho","a":"200 {result} · handler saw 1 event","r":"c","k":"answer"},{"t":"bearer garbage","q":"POST /{project}/us-central1/callableEcho","a":"200 {result} · handler saw 1 event","r":"c","k":"answer"},{"t":"bearer empty","q":"POST /{project}/us-central1/callableEcho","a":"401 UNAUTHENTICATED: Unauthenticated","r":"c","k":"answer"},{"t":"basic scheme","q":"POST /{project}/us-central1/callableEcho","a":"401 UNAUTHENTICATED: Unauthenticated","r":"c","k":"answer"},{"t":"lowercase bearer","q":"POST /{project}/us-central1/callableEcho","a":"200 {result} · handler saw 1 event","r":"c","k":"answer"},{"t":"auth required without","q":"POST /{project}/us-central1/callableAuthRequired","a":"401 UNAUTHENTICATED: sign in first · handler saw 1 event","r":"c","k":"answer"},{"t":"auth required with","q":"POST /{project}/us-central1/callableAuthRequired","a":"200 {result} · handler saw 1 event","r":"c","k":"answer"},{"t":"instance id token","q":"POST /{project}/us-central1/callableEcho","a":"200 {result} · handler saw 1 event","r":"c","k":"answer"},{"t":"app check header","q":"POST /{project}/us-central1/callableEcho","a":"200 {result} · handler saw 1 event","r":"c","k":"answer"},{"t":"app check enforced without","q":"POST /{project}/us-central1/callableAppCheck","a":"401 UNAUTHENTICATED: Unauthenticated","r":"c","k":"answer"},{"t":"app check enforced with","q":"POST /{project}/us-central1/callableAppCheck","a":"200 {result} · handler saw 1 event","r":"c","k":"answer"},{"t":"v1 data","q":"POST /{project}/us-central1/v1Callable","a":"200 {result} · handler saw 1 event","r":"c","k":"answer"},{"t":"v1 auth","q":"POST /{project}/us-central1/v1Callable","a":"200 {result} · handler saw 1 event","r":"c","k":"answer"},{"t":"v1 error","q":"POST /{project}/us-central1/v1Callable","a":"400 FAILED_PRECONDITION: v1 failed-precondition · handler saw 1 event","r":"c","k":"answer"},{"t":"v1 missing data","q":"POST /{project}/us-central1/v1Callable","a":"400 INVALID_ARGUMENT: Bad Request","r":"c","k":"answer"},{"t":"v1 get","q":"GET /{project}/us-central1/v1Callable","a":"400 INVALID_ARGUMENT: Bad Request","r":"c","k":"answer"},{"t":"stream three","q":"POST /{project}/us-central1/callableStream","a":"200 data: {\"message\":{\"chunk\":1,\"unicode\":\"火🔥\"}} · handler saw 1 event","r":"c","k":"answer"},{"t":"stream zero","q":"POST /{project}/us-central1/callableStream","a":"200 data: {\"message\":{\"chunk\":1,\"unicode\":\"火🔥\"}} · handler saw 1 event","r":"c","k":"answer"},{"t":"stream error after chunk","q":"POST /{project}/us-central1/callableStream","a":"200 data: {\"message\":{\"chunk\":1,\"unicode\":\"火🔥\"}} · handler saw 1 event","r":"c","k":"answer"},{"t":"stream error before chunk","q":"POST /{project}/us-central1/callableStream","a":"200 data: {\"message\":{\"chunk\":1,\"unicode\":\"火🔥\"}} · handler saw 1 event","r":"c","k":"answer"},{"t":"no accept","q":"POST /{project}/us-central1/callableStream","a":"200 {result} · handler saw 1 event","r":"c","k":"answer"},{"t":"accept json","q":"POST /{project}/us-central1/callableStream","a":"200 {result} · handler saw 1 event","r":"c","k":"answer"},{"t":"stream auth","q":"POST /{project}/us-central1/callableStream","a":"200 data: {\"message\":{\"chunk\":1,\"unicode\":\"火🔥\"}} · handler saw 1 event","r":"c","k":"answer"},{"t":"stream non streaming function","q":"POST /{project}/us-central1/callableEcho","a":"200 data: {\"result\":{\"echo\":{\"data\":1,\"auth\":null,\"app\":{\"$undefined\":true},\"instanceIdToken\":{\"$undefined\":true},\"acceptsStreaming\":true,\"…","r":"c","k":"answer"},{"t":"stream preflight","q":"OPTIONS /{project}/us-central1/callableStream","a":"204","r":"c","k":"answer"},{"t":"v2 preflight","q":"OPTIONS /{project}/us-central1/callableEcho","a":"204","r":"c","k":"answer"},{"t":"v2 post origin","q":"POST /{project}/us-central1/callableEcho","a":"200 {result} · handler saw 1 event","r":"c","k":"answer"},{"t":"v1 preflight","q":"OPTIONS /{project}/us-central1/v1Callable","a":"204","r":"c","k":"answer"},{"t":"v1 post origin","q":"POST /{project}/us-central1/v1Callable","a":"200 {result} · handler saw 1 event","r":"c","k":"answer"},{"t":"preflight no method","q":"OPTIONS /{project}/us-central1/callableEcho","a":"204","r":"c","k":"answer"},{"t":"create","q":"Firestore set items/alpha","a":"200 {name, fields, createTime, updateTime} · handler saw 2 events","r":"c","k":"answer"},{"t":"update","q":"Firestore update items/alpha","a":"200 {name, fields, createTime, updateTime} · handler saw 2 events","r":"c","k":"answer"},{"t":"delete","q":"Firestore delete items/alpha","a":"200 {} · handler saw 2 events","r":"c","k":"answer"},{"t":"recreate","q":"Firestore set items/alpha","a":"200 {name, fields, createTime, updateTime} · handler saw 2 events","r":"c","k":"answer"},{"t":"noop update","q":"Firestore update items/alpha","a":"200 {name, fields, createTime, updateTime} · handler saw 2 events","r":"c","k":"answer"},{"t":"owner write","q":"Firestore set audited/one","a":"200 {name, fields, createTime, updateTime} · handler saw 2 events","r":"c","k":"answer"},{"t":"user write","q":"Firestore set audited/two","a":"200 {name, fields, createTime, updateTime} · handler saw 2 events","r":"c","k":"answer"},{"t":"user update","q":"Firestore update audited/two","a":"200 {name, fields, createTime, updateTime} · handler saw 1 event","r":"c","k":"answer"},{"t":"admin delete","q":"Firestore delete audited/two","a":"200 {} · handler saw 1 event","r":"c","k":"answer"},{"t":"create","q":"Firestore set legacy/one","a":"200 {name, fields, createTime, updateTime} · handler saw 2 events","r":"c","k":"answer"},{"t":"update","q":"Firestore update legacy/one","a":"200 {name, fields, createTime, updateTime} · handler saw 2 events","r":"c","k":"answer"},{"t":"delete","q":"Firestore delete legacy/one","a":"200 {} · handler saw 2 events","r":"c","k":"answer"},{"t":"nested","q":"Firestore set tenants/t1/rooms/r1/messages/m1","a":"200 {name, fields, createTime, updateTime} · handler saw 1 event","r":"c","k":"answer"},{"t":"nested shallow miss","q":"Firestore set tenants/t1/rooms/r1","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"answer"},{"t":"deep one","q":"Firestore set deep/a","a":"200 {name, fields, createTime, updateTime} · handler saw 1 event","r":"c","k":"answer"},{"t":"deep three","q":"Firestore set deep/a/b/c","a":"200 {name, fields, createTime, updateTime} · handler saw 1 event","r":"c","k":"answer"},{"t":"deep five","q":"Firestore set deep/a/b/c/d/e","a":"200 {name, fields, createTime, updateTime} · handler saw 1 event","r":"c","k":"answer"},{"t":"exact","q":"Firestore set config/settings","a":"200 {name, fields, createTime, updateTime} · handler saw 1 event","r":"c","k":"answer"},{"t":"exact miss","q":"Firestore set config/other","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"answer"},{"t":"regional","q":"Firestore set regional/r","a":"200 {name, fields, createTime, updateTime} · handler saw 1 event","r":"c","k":"answer"},{"t":"unrelated","q":"Firestore set unrelated/u","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"answer"},{"t":"commit","q":"Firestore commit (3 writes)","a":"200 {writeResults, commitTime} · handler saw 6 events","r":"c","k":"answer"},{"t":"throwing","q":"Firestore set throwing/t1","a":"200 {name, fields, createTime, updateTime} · handler saw 1 event","r":"c","k":"answer"},{"t":"throwing again","q":"Firestore set throwing/t2","a":"200 {name, fields, createTime, updateTime} · handler saw 1 event","r":"c","k":"answer"},{"t":"slow","q":"Firestore set slow/s1","a":"200 {name, fields, createTime, updateTime} · handler saw 1 event","r":"c","k":"answer"},{"t":"handler error logs","q":"emulator log lines matching \"handler failure\"","a":"2 log lines matched","r":"c","k":"behaviour"},{"t":"upload","q":"Storage upload {project}/folder/object one.txt","a":"200 {name, bucket, generation, metageneration, …} · handler saw 3 events","r":"c","k":"answer"},{"t":"patch","q":"Storage patch {project}/folder/object one.txt","a":"200 {name, bucket, generation, metageneration, …} · handler saw 2 events","r":"c","k":"answer"},{"t":"overwrite","q":"Storage upload {project}/folder/object one.txt","a":"200 {name, bucket, generation, metageneration, …} · handler saw 3 events","r":"c","k":"answer"},{"t":"delete","q":"Storage delete {project}/folder/object one.txt","a":"204 · handler saw 2 events","r":"c","k":"answer"},{"t":"second upload","q":"Storage upload synthetic-second-bucket.example.test/second.bin","a":"200 {name, bucket, generation, metageneration, …} · handler saw 1 event","r":"c","k":"answer"},{"t":"second delete","q":"Storage delete synthetic-second-bucket.example.test/second.bin","a":"204","r":"c","k":"answer"},{"t":"default upload","q":"Storage upload {project}/default.bin","a":"200 {name, bucket, generation, metageneration, …} · handler saw 3 events","r":"c","k":"answer"},{"t":"json message","q":"Pub/Sub publish to synthetic-topic (1 message)","a":"200 {messageIds} · handler saw 2 events","r":"c","k":"answer"},{"t":"plain message","q":"Pub/Sub publish to synthetic-topic (1 message)","a":"200 {messageIds} · handler saw 2 events","r":"c","k":"answer"},{"t":"attributes only","q":"Pub/Sub publish to synthetic-topic (1 message)","a":"200 {messageIds} · handler saw 2 events","r":"c","k":"answer"},{"t":"two messages","q":"Pub/Sub publish to synthetic-topic (2 messages)","a":"200 {messageIds} · handler saw 4 events","r":"c","k":"answer"},{"t":"unknown topic","q":"Pub/Sub publish to no-such-topic (1 message)","a":"404 NOT_FOUND: Topic not found","r":"c","k":"answer"},{"t":"json","q":"Pub/Sub publish to legacy-topic (1 message)","a":"200 {messageIds} · handler saw 1 event","r":"c","k":"answer"},{"t":"plain","q":"Pub/Sub publish to legacy-topic (1 message)","a":"200 {messageIds} · handler saw 1 event","r":"c","k":"answer"},{"t":"topics","q":"Pub/Sub list topics","a":"200 {topics}","r":"c","k":"answer"},{"t":"subscriptions","q":"Pub/Sub list subscriptions","a":"200 {subscriptions}","r":"c","k":"answer"},{"t":"v2 tick","q":"POST /functions/projects/{project}/triggers/us-central1-scheduledTick-0","a":"200 · handler saw 1 event","r":"c","k":"answer"},{"t":"v2 cron","q":"POST /functions/projects/{project}/triggers/us-central1-scheduledCron-0","a":"200 · handler saw 1 event","r":"c","k":"answer"},{"t":"v1 run","q":"POST /functions/projects/{project}/triggers/us-central1-v1Scheduled-0","a":"200 {status} · handler saw 1 event","r":"c","k":"answer"},{"t":"v2 tick empty body","q":"POST /functions/projects/{project}/triggers/us-central1-scheduledTick-0","a":"200 · handler saw 1 event","r":"c","k":"answer"},{"t":"v2 tick https route","q":"POST /{project}/us-central1/scheduledTick","a":"404 Function us-central1-scheduledTick does not exist, valid functions are: us-central1-ext-synthetic-httpFn, us-central1-ext-synthetic-fir…","r":"c","k":"answer"},{"t":"sign up","q":"Auth signUp","a":"200 identitytoolkit#SignupNewUserResponse · handler saw 5 events","r":"c","k":"answer"},{"t":"lookup","q":"Auth lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"delete","q":"Auth delete","a":"200 identitytoolkit#DeleteAccountResponse · handler saw 1 event","r":"c","k":"answer"},{"t":"claims sign up","q":"Auth signUp","a":"200 identitytoolkit#SignupNewUserResponse · handler saw 5 events","r":"c","k":"answer"},{"t":"claims lookup","q":"Auth lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"claims sign in","q":"Auth signIn","a":"200 identitytoolkit#VerifyPasswordResponse · handler saw 1 event","r":"c","k":"answer"},{"t":"reject sign up","q":"Auth signUp","a":"400 BLOCKING_FUNCTION_ERROR_RESPONSE : ((HTTP request to {{origin:functions}}/{project}/us-central1/blockCreate returned HTTP error 403: {\"…","r":"c","k":"answer"},{"t":"reject lookup absent","q":"Auth signIn","a":"400 EMAIL_NOT_FOUND","r":"c","k":"answer"},{"t":"slow sign up","q":"Auth signUp","a":"200 identitytoolkit#SignupNewUserResponse · handler saw 5 events","r":"c","k":"answer"},{"t":"blocking logs","q":"emulator log lines matching \"blocking\"","a":"0 log lines matched","r":"c","k":"behaviour"},{"t":"plain sign up","q":"Auth signUp","a":"400 BLOCKING_FUNCTION_ERROR_RESPONSE : ((HTTP request to {{origin:functions}}/{project}/us-central1/blockSignIn returned HTTP error 403: {\"…","r":"c","k":"answer"},{"t":"rejected sign in","q":"Auth signIn","a":"400 BLOCKING_FUNCTION_ERROR_RESPONSE : ((HTTP request to {{origin:functions}}/{project}/us-central1/blockSignIn returned HTTP error 403: {\"…","r":"c","k":"answer"},{"t":"wrong password","q":"Auth signIn","a":"400 INVALID_PASSWORD","r":"c","k":"answer"},{"t":"claims sign in again","q":"Auth signIn","a":"200 identitytoolkit#VerifyPasswordResponse · handler saw 1 event","r":"c","k":"answer"},{"t":"primary env","q":"GET /{project}/us-central1/httpEcho?mode=empty","a":"204 · handler saw 1 event","r":"c","k":"answer"},{"t":"secrets","q":"GET /{project}/us-central1/httpSecrets","a":"200 {declared, undeclared} · handler saw 1 event","r":"c","k":"answer"},{"t":"secondary env","q":"GET /{project}/us-central1/secondaryHttp","a":"200 {codebase} · handler saw 1 event","r":"c","k":"answer"},{"t":"v1 env","q":"GET /{project}/us-central1/v1Http","a":"200 {v1, echo} · handler saw 1 event","r":"c","k":"answer"},{"t":"event env","q":"Firestore set items/env","a":"200 {name, fields, createTime, updateTime} · handler saw 2 events","r":"c","k":"answer"},{"t":"callable env","q":"POST /{project}/us-central1/callableEcho","a":"200 {result} · handler saw 1 event","r":"c","k":"answer"},{"t":"extension env","q":"GET /{project}/us-central1/ext-synthetic-httpFn","a":"200 {extension, mode, note} · handler saw 1 event","r":"c","k":"answer"},{"t":"crash","q":"GET /{project}/us-central1/httpEcho?mode=crash","a":"200 {crashing} · handler saw 1 event","r":"c","k":"answer"},{"t":"same function after","q":"GET /{project}/us-central1/httpEcho?mode=empty","a":"204 · handler saw 1 event","r":"c","k":"answer"},{"t":"other function after","q":"POST /{project}/us-central1/callableEcho","a":"200 {result} · handler saw 1 event","r":"c","k":"answer"},{"t":"event after","q":"Firestore set items/after-crash","a":"200 {name, fields, createTime, updateTime} · handler saw 2 events","r":"c","k":"answer"},{"t":"overlap","q":"3 parallel GET /{project}/us-central1/httpEcho?mode=slow&ms=1500","a":"statuses 200, 200, 200 · handler saw 3 events","r":"c","k":"answer"},{"t":"slow plus other","q":"3 parallel GET /{project}/us-central1/httpEcho?mode=slow&ms=1500","a":"statuses 200, 200, 200 · handler saw 3 events","r":"c","k":"answer"},{"t":"before removable","q":"GET /{project}/us-central1/removable","a":"200 {removable} · handler saw 1 event","r":"c","k":"answer"},{"t":"before change","q":"Firestore set before-change/one","a":"200 {name, fields, createTime, updateTime} · handler saw 1 event","r":"c","k":"answer"},{"t":"reload logs","q":"emulator log lines matching \"Loaded functions definitions\"","a":"1 log line matched","r":"c","k":"behaviour"},{"t":"backends after","q":"GET /backends","a":"200 {backends}","r":"c","k":"answer"},{"t":"added","q":"GET /{project}/us-central1/addedLater","a":"200 {added} · handler saw 1 event","r":"c","k":"answer"},{"t":"removed","q":"GET /{project}/us-central1/removable","a":"500 {code}","r":"c","k":"answer"},{"t":"old path miss","q":"Firestore set before-change/two","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"answer"},{"t":"new path hit","q":"Firestore set after-change/one","a":"200 {name, fields, createTime, updateTime} · handler saw 1 event","r":"c","k":"answer"},{"t":"existing still works","q":"Firestore set items/after-reload","a":"200 {name, fields, createTime, updateTime} · handler saw 2 events","r":"c","k":"answer"},{"t":"trigger key generation","q":"POST /functions/projects/{project}/triggers/us-central1-scheduledTick-0","a":"200 · handler saw 1 event","r":"c","k":"answer"},{"t":"trigger key generation 1","q":"POST /functions/projects/{project}/triggers/us-central1-scheduledTick-1","a":"404 Function us-central1-scheduledTick-1 does not exist, valid functions are: us-central1-ext-synthetic-httpFn, us-central1-ext-synthetic-f…","r":"c","k":"answer"},{"t":"restored","q":"GET /{project}/us-central1/removable","a":"200 {removable} · handler saw 1 event","r":"c","k":"answer"},{"t":"backends","q":"GET /backends","a":"200 {backends}","r":"c","k":"answer"},{"t":"extension logs","q":"emulator log lines matching \"extensions\"","a":"0 log lines matched","r":"c","k":"behaviour"},{"t":"missing trigger logs","q":"emulator log lines matching \"missing a trigger\"","a":"0 log lines matched","r":"c","k":"behaviour"},{"t":"queue route","q":"GET /{project}/us-central1/ext-synthetic-queueFn","a":"500 {code}","r":"c","k":"answer"},{"t":"https","q":"GET /{project}/us-central1/ext-synthetic-httpFn/tail?x=1","a":"200 {extension, mode, note} · handler saw 1 event","r":"c","k":"answer"},{"t":"firestore v1","q":"Firestore set synthetic-items/one","a":"200 {name, fields, createTime, updateTime} · handler saw 1 event","r":"c","k":"answer"},{"t":"firestore v1 miss","q":"Firestore set other-items/one","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"answer"},{"t":"firestore v2","q":"Firestore set synthetic-items-v2/one","a":"200 {name, fields, createTime, updateTime} · handler saw 1 event","r":"c","k":"answer"},{"t":"schedule","q":"POST /functions/projects/{project}/triggers/us-central1-ext-synthetic-scheduledFn-0","a":"200 {status} · handler saw 1 event","r":"c","k":"answer"},{"t":"publish listened","q":"GET /{project}/us-central1/ext-synthetic-httpFn?publish=test-publisher.synthetic.v1.complete","a":"200 {published} · handler saw 2 events","r":"c","k":"answer"},{"t":"publish unlistened","q":"GET /{project}/us-central1/ext-synthetic-httpFn?publish=test-publisher.synthetic.v1.ignored","a":"200 {published} · handler saw 1 event","r":"c","k":"answer"},{"t":"publish undeclared","q":"GET /{project}/us-central1/ext-synthetic-httpFn?publish=test-publisher.synthetic.v1.undeclared","a":"200 {published} · handler saw 1 event","r":"c","k":"answer"},{"t":"eventarc logs","q":"emulator log lines matching \"eventarc\"","a":"0 log lines matched","r":"c","k":"behaviour"},{"t":"disable","q":"hub PUT /functions/disableBackgroundTriggers","a":"200 {enabled}","r":"c","k":"answer"},{"t":"write while disabled","q":"Firestore set items/disabled","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"answer"},{"t":"http while disabled","q":"GET /{project}/us-central1/httpEcho?mode=empty","a":"204 · handler saw 1 event","r":"c","k":"answer"},{"t":"trigger while disabled","q":"POST /functions/projects/{project}/triggers/us-central1-scheduledTick-0","a":"204","r":"c","k":"answer"},{"t":"enable","q":"hub PUT /functions/enableBackgroundTriggers","a":"200 {enabled}","r":"c","k":"answer"},{"t":"write after enable","q":"Firestore set items/enabled","a":"200 {name, fields, createTime, updateTime} · handler saw 2 events","r":"c","k":"answer"},{"t":"trigger generation after enable","q":"POST /functions/projects/{project}/triggers/us-central1-scheduledTick-1","a":"200 · handler saw 1 event","r":"c","k":"answer"},{"t":"backends after enable","q":"GET /backends","a":"200 {backends}","r":"c","k":"answer"},{"t":"backends","q":"GET /backends","a":"200 {backends}","r":"c","k":"answer"},{"t":"sign up","q":"Auth signUp","a":"200 identitytoolkit#SignupNewUserResponse · handler saw 3 events","r":"c","k":"answer"},{"t":"lookup","q":"Auth lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"c","k":"answer"},{"t":"sign in","q":"Auth signIn","a":"200 identitytoolkit#VerifyPasswordResponse · handler saw 1 event","r":"c","k":"answer"},{"t":"reject","q":"Auth signUp","a":"400 BLOCKING_FUNCTION_ERROR_RESPONSE : ((HTTP request to {{origin:functions}}/{project}/us-central1/v1BeforeCreate returned HTTP error 400:…","r":"c","k":"answer"},{"t":"debug logs","q":"emulator log lines matching \"debug port\"","a":"0 log lines matched","r":"c","k":"behaviour"},{"t":"http","q":"GET /{project}/us-central1/httpEcho?mode=empty","a":"204 · handler saw 1 event","r":"c","k":"answer"},{"t":"callable","q":"POST /{project}/us-central1/callableEcho","a":"200 {result} · handler saw 1 event","r":"c","k":"answer"},{"t":"event","q":"Firestore set items/debug","a":"200 {name, fields, createTime, updateTime} · handler saw 2 events","r":"c","k":"answer"},{"t":"secondary","q":"GET /{project}/us-central1/secondaryHttp","a":"200 {codebase} · handler saw 1 event","r":"c","k":"answer"},{"t":"startup logs","q":"emulator log lines matching \"\"","a":"0 log lines matched","r":"c","k":"behaviour"},{"t":"env logs","q":"emulator log lines matching \"environment variables\"","a":"1 log line matched","r":"d","k":"behaviour","w":"the official emulator logs env loading at every lazy worker start (here after an earlier timeout killed the worker); Firenook loads env once per (re)load and keeps its worker"},{"t":"crash logs","q":"emulator log lines matching \"exited\"","a":"0 log lines matched","r":"d","k":"behaviour","w":"Firenook logs the worker exit it recovers from (\"functions worker exited; starting a new one\"); the official runtime's kill message has no such line"},{"t":"hub emulators","q":"hub GET /emulators","a":"200 {hub, logging, extensions, auth, …}","r":"u"},{"t":"backends","q":"GET /backends","a":"200 {backends}","r":"u"},{"t":"extension logs","q":"emulator log lines matching \"extension\"","a":"0 log lines matched","r":"u"},{"t":"missing trigger logs","q":"emulator log lines matching \"missing a trigger\"","a":"0 log lines matched","r":"u"},{"t":"checkout session","q":"Firestore set customers/synthetic-user/checkout_sessions/one","a":"200 {name, fields, createTime, updateTime}","r":"u"},{"t":"checkout session read","q":"Firestore update customers/synthetic-user/checkout_sessions/one","a":"200 {name, fields, createTime, updateTime}","r":"u"},{"t":"sign up","q":"Auth signUp","a":"200 identitytoolkit#SignupNewUserResponse · handler saw 4 events","r":"u"},{"t":"algolia write","q":"Firestore set searchable/one","a":"200 {name, fields, createTime, updateTime}","r":"u"},{"t":"delivery logs","q":"emulator log lines matching \"ext-\"","a":"4 log lines matched","r":"u"},{"t":"portal link","q":"POST /{project}/us-central1/ext-stripe-createPortalLink","a":"401 UNAUTHENTICATED: The function must be called while authenticated!","r":"u"},{"t":"webhook","q":"POST /{project}/us-central1/ext-stripe-handleWebhookEvents","a":"401 Webhook Error: Invalid Secret","r":"u"},{"t":"initial","q":"publish to alpha-topic (initial)","a":"delivered to alpha v1 · 1 registered function","r":"c","k":"behaviour"},{"t":"added handler","q":"publish to beta-topic (added handler)","a":"delivered to beta v2 · 2 registered functions","r":"c","k":"behaviour"},{"t":"updated handler","q":"publish to alpha-topic (updated handler)","a":"delivered to alpha v2 · 2 registered functions","r":"c","k":"behaviour"}]} \ No newline at end of file diff --git a/public/conformance/pubsub.json b/public/conformance/pubsub.json new file mode 100644 index 0000000..7eed276 --- /dev/null +++ b/public/conformance/pubsub.json @@ -0,0 +1 @@ +{"runs":[[0,4,0,"Function topics, schedules and background-trigger controls"],[4,4,0,"Function topics, schedules and background-trigger controls"],[8,20,1,"topic name validation on create, get and delete"],[28,31,1,"topic create/get/list/update/delete over gRPC"],[59,20,1,"topic create/get/list/update/delete over HTTP/JSON"],[79,24,1,"listTopicSubscriptions, listTopicSnapshots and detachSubscription"],[103,22,1,"publish request validation and message id allocation"],[125,14,1,"publish over HTTP/JSON including malformed bodies"],[139,55,1,"createSubscription names, bounds and policies"],[194,20,1,"subscription create/get/list/update/delete over HTTP/JSON"],[214,34,1,"updateSubscription masks and modifyPushConfig"],[248,17,1,"a deleted topic leaves _deleted-topic_ subscriptions behind"],[265,33,1,"pull, acknowledge and modifyAckDeadline over gRPC"],[298,15,1,"pull, acknowledge and modifyAckDeadline over HTTP/JSON"],[313,13,1,"maxMessages batching across a larger backlog"],[326,12,1,"an unacknowledged message is redelivered after its ack deadline"],[338,7,1,"pull without returnImmediately waits for redelivery"],[345,19,1,"deliveryAttempt and dead-letter forwarding after maxDeliveryAttempts"],[364,22,1,"retainAckedMessages, seek to a time and seek to the future"],[386,42,1,"snapshot create/get/list/delete and seek to a snapshot"],[428,23,1,"ordering keys: one key delivers in order and blocks on its outstanding message; the unordered mirror"],[451,26,1,"attribute filters: equality, existence, hasPrefix, NOT/AND/OR"],[477,9,1,"streamingPull delivery, in-stream ack and modifyAckDeadline"],[486,9,1,"messages outstanding on a closed stream and delivery to a live stream"],[495,6,1,"one ordering key over streamingPull"],[501,16,1,"push envelope, attributes header, pull on a push subscription and switching"],[517,12,1,"push retries on non-2xx endpoint answers"],[529,60,1,"Avro schema create/get/list/commit/rollback/delete and validation"],[589,25,1,"schema operations over HTTP/JSON"],[614,30,1,"topics bound to a schema validate published messages"],[644,12,1,"IAM policy calls on topics, subscriptions and schemas"],[656,40,1,"unknown paths, methods and bodies on the HTTP surface"],[696,18,1,"resources are scoped by project and cross-project references"],[714,10,1,"exactly-once delivery flags on pull and acknowledge"],[724,11,1,"topic and subscription message retention settings"],[735,22,1,"pagination parameters over HTTP/JSON for every list"],[757,18,1,"every subscription gets its own copy; subscriptions created later start empty"],[775,24,1,"deliveryAttempt, dead-letter forwarding, filters and error mapping over HTTP/JSON"],[799,21,1,"push envelopes for every message shape and push subscriptions' lifecycle"],[820,12,1,"two streams on one subscription share the backlog; ids belong to the subscription"],[832,18,1,"topic fields over HTTP/JSON: labels, storage policy, KMS, schema settings, masks"],[850,17,1,"detached subscriptions and expiration policies"],[867,28,1,"snapshot contents across subscriptions, acked messages and later publishes"],[895,13,1,"modifyAckDeadline extends, shortens and expires leases"]],"cases":[{"t":"list function topics","q":"GET /v1/projects/{project}/topics","a":"200 {topics}","r":"c","k":"answer"},{"t":"publish custom topic","q":"POST /v1/projects/{project}/topics/phase4-topic:publish","a":"200 {messageIds}","r":"c","k":"answer"},{"t":"publish schedule topic","q":"POST /v1/projects/{project}/topics/firebase-schedule-scheduledTick:publish","a":"200 {messageIds}","r":"c","k":"answer"},{"t":"publish while disabled","q":"POST /v1/projects/{project}/topics/phase4-topic:publish","a":"200 {messageIds}","r":"c","k":"answer"},{"t":"invoke schedule cloudevent directly","q":"POST /functions/projects/{project}/triggers/us-central1-scheduledTick-0","a":"200","r":"u"},{"t":"disable background triggers","q":"PUT /functions/disableBackgroundTriggers","a":"200 {enabled}","r":"u"},{"t":"enable background triggers","q":"PUT /functions/enableBackgroundTriggers","a":"200 {enabled}","r":"u"},{"t":"publish after reenable","q":"POST /v1/projects/{project}/topics/phase4-topic:publish","a":"200 {messageIds}","r":"u"},{"t":"two chars","q":"Publisher.createTopic topics/ab","a":"INVALID_ARGUMENT: Invalid [topics] name: (name=projects/{project}/topics/ab)","r":"c","k":"answer"},{"t":"three chars","q":"Publisher.createTopic topics/abc","a":"OK {name}","r":"c","k":"answer"},{"t":"starts with digit","q":"Publisher.createTopic topics/1abc","a":"INVALID_ARGUMENT: Invalid [topics] name: (name=projects/{project}/topics/1abc)","r":"c","k":"answer"},{"t":"starts with goog","q":"Publisher.createTopic topics/goog-topic","a":"INVALID_ARGUMENT: Invalid [topics] name: (name=projects/{project}/topics/goog-topic)","r":"c","k":"answer"},{"t":"contains goog","q":"Publisher.createTopic topics/my-goog-topic","a":"OK {name}","r":"c","k":"answer"},{"t":"uppercase goog","q":"Publisher.createTopic topics/GoogTopic","a":"OK {name}","r":"c","k":"answer"},{"t":"allowed chars","q":"Publisher.createTopic topics/Topic_1.two~three+four%five-six","a":"OK {name}","r":"c","k":"answer"},{"t":"invalid char","q":"Publisher.createTopic topics/topic with space","a":"INVALID_ARGUMENT: Invalid [topics] name: (name=projects/{project}/topics/topic with space)","r":"c","k":"answer"},{"t":"invalid slash","q":"Publisher.createTopic topics/topic/extra","a":"INVALID_ARGUMENT: Invalid [topics] name: (name=projects/{project}/topics/topic/extra)","r":"c","k":"answer"},{"t":"max length","q":"Publisher.createTopic topics/txxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx…","a":"OK {name}","r":"c","k":"answer"},{"t":"too long","q":"Publisher.createTopic topics/txxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx…","a":"INVALID_ARGUMENT: Invalid [topics] name: (name=projects/{project}/topics/txxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx…","r":"c","k":"answer"},{"t":"empty name","q":"Publisher.createTopic","a":"INVALID_ARGUMENT: Invalid [topics] name: (name=)","r":"c","k":"answer"},{"t":"bare name","q":"Publisher.createTopic just-a-name","a":"INVALID_ARGUMENT: Invalid [topics] name: (name=just-a-name)","r":"c","k":"answer"},{"t":"wrong collection","q":"Publisher.createTopic subscriptions/not-a-topic","a":"INVALID_ARGUMENT: Invalid [topics] name: (name=projects/{project}/subscriptions/not-a-topic)","r":"c","k":"answer"},{"t":"no project","q":"Publisher.createTopic projects//topics/abc","a":"OK {name}","r":"c","k":"answer"},{"t":"get invalid","q":"Publisher.getTopic abc","a":"INVALID_ARGUMENT: Invalid [topics] name: (name=abc)","r":"c","k":"answer"},{"t":"get missing","q":"Publisher.getTopic topics/missing-topic","a":"NOT_FOUND: Topic not found","r":"c","k":"answer"},{"t":"delete invalid","q":"Publisher.deleteTopic abc","a":"INVALID_ARGUMENT: Invalid [topics] name: (name=abc)","r":"c","k":"answer"},{"t":"delete missing","q":"Publisher.deleteTopic topics/missing-topic","a":"NOT_FOUND: Topic not found","r":"c","k":"answer"},{"t":"list","q":"Publisher.listTopics projects/{project}","a":"OK {topics}","r":"c","k":"answer"},{"t":"create plain","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"create labels","q":"Publisher.createTopic topics/events","a":"OK {labels, name}","r":"c","k":"answer"},{"t":"create retention","q":"Publisher.createTopic topics/audit","a":"OK {messageRetentionDuration, name}","r":"c","k":"answer"},{"t":"create retention short","q":"Publisher.createTopic topics/short-retention","a":"INVALID_ARGUMENT: message_retention_duration out of bounds","r":"c","k":"answer"},{"t":"create retention long","q":"Publisher.createTopic topics/long-retention","a":"INVALID_ARGUMENT: message_retention_duration out of bounds","r":"c","k":"answer"},{"t":"create kms","q":"Publisher.createTopic topics/kms","a":"OK {kmsKeyName, name}","r":"c","k":"answer"},{"t":"create policy","q":"Publisher.createTopic topics/policy","a":"OK {messageStoragePolicy, name}","r":"c","k":"answer"},{"t":"create schema missing","q":"Publisher.createTopic topics/with-schema","a":"NOT_FOUND: Schema could not be found","r":"c","k":"answer"},{"t":"create duplicate","q":"Publisher.createTopic topics/orders","a":"ALREADY_EXISTS: Topic already exists","r":"c","k":"answer"},{"t":"get","q":"Publisher.getTopic topics/events","a":"OK {labels, name}","r":"c","k":"answer"},{"t":"list all","q":"Publisher.listTopics projects/{project}","a":"OK {topics}","r":"c","k":"answer"},{"t":"list page 1","q":"Publisher.listTopics projects/{project}","a":"OK {topics}","r":"c","k":"answer"},{"t":"list page 2","q":"Publisher.listTopics projects/{project}","a":"OK {topics}","r":"c","k":"answer"},{"t":"list bad token","q":"Publisher.listTopics projects/{project}","a":"OK {topics}","r":"c","k":"answer"},{"t":"list page size zero","q":"Publisher.listTopics projects/{project}","a":"OK {topics}","r":"c","k":"answer"},{"t":"list negative","q":"Publisher.listTopics projects/{project}","a":"OK {topics}","r":"c","k":"answer"},{"t":"list other project","q":"Publisher.listTopics projects/{project}","a":"OK {}","r":"c","k":"answer"},{"t":"list bad project","q":"Publisher.listTopics nope","a":"UNKNOWN: Application error processing RPC","r":"c","k":"answer"},{"t":"update labels","q":"Publisher.updateTopic topics/events","a":"INVALID_ARGUMENT: Invalid update_mask provided in the UpdateTopicRequest: labels is not a known Topic field. Note that field paths must be…","r":"c","k":"answer"},{"t":"update retention","q":"Publisher.updateTopic topics/events","a":"OK {labels, messageRetentionDuration, name}","r":"c","k":"answer"},{"t":"update camel mask","q":"Publisher.updateTopic topics/events","a":"INVALID_ARGUMENT: Invalid update_mask provided in the UpdateTopicRequest: messageRetentionDuration is not a known Topic field. Note that fi…","r":"c","k":"answer"},{"t":"update no mask","q":"Publisher.updateTopic topics/events","a":"INVALID_ARGUMENT: The update_mask in the UpdateTopicRequest must be set, and must contain a non-empty paths list.","r":"c","k":"answer"},{"t":"update empty mask","q":"Publisher.updateTopic topics/events","a":"INVALID_ARGUMENT: The update_mask in the UpdateTopicRequest must be set, and must contain a non-empty paths list.","r":"c","k":"answer"},{"t":"update missing","q":"Publisher.updateTopic topics/missing-topic","a":"NOT_FOUND: Topic not found.","r":"c","k":"answer"},{"t":"update kms","q":"Publisher.updateTopic topics/events","a":"INVALID_ARGUMENT: Invalid update_mask provided in the UpdateTopicRequest: kms_key_name is not a known Topic field. Note that field paths mu…","r":"c","k":"answer"},{"t":"update policy","q":"Publisher.updateTopic topics/events","a":"INVALID_ARGUMENT: Invalid update_mask provided in the UpdateTopicRequest: message_storage_policy is not a known Topic field. Note that fiel…","r":"c","k":"answer"},{"t":"get after update","q":"Publisher.getTopic topics/events","a":"OK {labels, messageRetentionDuration, name}","r":"c","k":"answer"},{"t":"delete","q":"Publisher.deleteTopic topics/orders","a":"OK {}","r":"c","k":"answer"},{"t":"delete again","q":"Publisher.deleteTopic topics/orders","a":"NOT_FOUND: Topic not found","r":"c","k":"answer"},{"t":"get deleted","q":"Publisher.getTopic topics/orders","a":"NOT_FOUND: Topic not found","r":"c","k":"answer"},{"t":"list after delete","q":"Publisher.listTopics projects/{project}","a":"OK {topics}","r":"c","k":"answer"},{"t":"put","q":"PUT /v1/projects/{project}/topics/orders","a":"200 {name}","r":"c","k":"answer"},{"t":"put labels","q":"PUT /v1/projects/{project}/topics/events","a":"200 {labels, messageRetentionDuration, name}","r":"c","k":"answer"},{"t":"put duplicate","q":"PUT /v1/projects/{project}/topics/orders","a":"409 ALREADY_EXISTS: Topic already exists","r":"c","k":"answer"},{"t":"put invalid name","q":"PUT /v1/projects/{project}/topics/ab","a":"400 INVALID_ARGUMENT: Invalid [topics] name: (name=projects/{project}/topics/ab)","r":"c","k":"answer"},{"t":"put no body","q":"PUT /v1/projects/{project}/topics/nobody","a":"200 {name}","r":"c","k":"answer"},{"t":"get","q":"GET /v1/projects/{project}/topics/events","a":"200 {labels, messageRetentionDuration, name}","r":"c","k":"answer"},{"t":"get missing","q":"GET /v1/projects/{project}/topics/missing-topic","a":"404 NOT_FOUND: Topic not found","r":"c","k":"answer"},{"t":"list","q":"GET /v1/projects/{project}/topics","a":"200 {topics}","r":"c","k":"answer"},{"t":"list page","q":"GET /v1/projects/{project}/topics?pageSize=1","a":"200 {topics}","r":"c","k":"answer"},{"t":"list page token","q":"GET /v1/projects/{project}/topics?pageSize=1&pageToken=projects%{project}%2Ftopics%2Fnobody","a":"200 {topics}","r":"c","k":"answer"},{"t":"list other project","q":"GET /v1/projects/{project}/topics","a":"200 {}","r":"c","k":"answer"},{"t":"patch retention","q":"PATCH /v1/projects/{project}/topics/events","a":"200 {labels, messageRetentionDuration, name}","r":"c","k":"answer"},{"t":"patch labels","q":"PATCH /v1/projects/{project}/topics/events","a":"400 INVALID_ARGUMENT: Invalid update_mask provided in the UpdateTopicRequest: labels is not a known Topic field. Note that field paths must…","r":"c","k":"answer"},{"t":"patch no mask","q":"PATCH /v1/projects/{project}/topics/events","a":"400 INVALID_ARGUMENT: The update_mask in the UpdateTopicRequest must be set, and must contain a non-empty paths list.","r":"c","k":"answer"},{"t":"patch query mask","q":"PATCH /v1/projects/{project}/topics/events?updateMask=message_retention_duration","a":"200 {labels, messageRetentionDuration, name}","r":"c","k":"answer"},{"t":"get after patch","q":"GET /v1/projects/{project}/topics/events","a":"200 {labels, messageRetentionDuration, name}","r":"c","k":"answer"},{"t":"delete","q":"DELETE /v1/projects/{project}/topics/orders","a":"200 {}","r":"c","k":"answer"},{"t":"delete again","q":"DELETE /v1/projects/{project}/topics/orders","a":"404 NOT_FOUND: Topic not found","r":"c","k":"answer"},{"t":"delete invalid","q":"DELETE /v1/projects/{project}/topics/ab","a":"400 INVALID_ARGUMENT: Invalid [topics] name: (name=projects/{project}/topics/ab)","r":"c","k":"answer"},{"t":"list after","q":"GET /v1/projects/{project}/topics","a":"200 {topics}","r":"c","k":"answer"},{"t":"topic","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"subscriptions empty","q":"Publisher.listTopicSubscriptions topics/orders","a":"OK {}","r":"c","k":"answer"},{"t":"subscriptions missing","q":"Publisher.listTopicSubscriptions topics/missing-topic","a":"OK {}","r":"c","k":"answer"},{"t":"snapshots empty","q":"Publisher.listTopicSnapshots topics/orders","a":"OK {}","r":"c","k":"answer"},{"t":"snapshots missing","q":"Publisher.listTopicSnapshots topics/missing-topic","a":"OK {}","r":"c","k":"answer"},{"t":"sub a","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"sub b","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"sub c","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"snap a","q":"Subscriber.createSnapshot subscriptions/sub-a","a":"OK {expireTime, name, topic}","r":"c","k":"answer"},{"t":"snap b","q":"Subscriber.createSnapshot subscriptions/sub-b","a":"OK {expireTime, name, topic}","r":"c","k":"answer"},{"t":"subscriptions","q":"Publisher.listTopicSubscriptions topics/orders","a":"OK {subscriptions}","r":"c","k":"answer"},{"t":"subscriptions page 1","q":"Publisher.listTopicSubscriptions topics/orders","a":"OK {subscriptions}","r":"c","k":"answer"},{"t":"subscriptions page 2","q":"Publisher.listTopicSubscriptions topics/orders","a":"OK {subscriptions}","r":"c","k":"answer"},{"t":"snapshots","q":"Publisher.listTopicSnapshots topics/orders","a":"OK {snapshots}","r":"c","k":"answer"},{"t":"snapshots page 1","q":"Publisher.listTopicSnapshots topics/orders","a":"OK {snapshots}","r":"c","k":"answer"},{"t":"snapshots page 2","q":"Publisher.listTopicSnapshots topics/orders","a":"OK {snapshots}","r":"c","k":"answer"},{"t":"detach","q":"Publisher.detachSubscription subscriptions/sub-a","a":"UNIMPLEMENTED: Method google.pubsub.v1.Publisher/DetachSubscription is unimplemented","r":"c","k":"answer"},{"t":"detach missing","q":"Publisher.detachSubscription subscriptions/missing-sub","a":"UNIMPLEMENTED: Method google.pubsub.v1.Publisher/DetachSubscription is unimplemented","r":"c","k":"answer"},{"t":"subscriptions http","q":"GET /v1/projects/{project}/topics/orders/subscriptions","a":"200 {subscriptions}","r":"c","k":"answer"},{"t":"snapshots http","q":"GET /v1/projects/{project}/topics/orders/snapshots?pageSize=1","a":"200 {snapshots}","r":"c","k":"answer"},{"t":"detach http","q":"POST /v1/projects/{project}/subscriptions/sub-a:detach","a":"501 UNIMPLEMENTED: Method google.pubsub.v1.Publisher/DetachSubscription is unimplemented","r":"c","k":"answer"},{"t":"delete sub b","q":"Subscriber.deleteSubscription subscriptions/sub-b","a":"OK {}","r":"c","k":"answer"},{"t":"subscriptions after delete","q":"Publisher.listTopicSubscriptions topics/orders","a":"OK {subscriptions}","r":"c","k":"answer"},{"t":"snapshots outlive their subscription","q":"Publisher.listTopicSnapshots topics/orders","a":"OK {snapshots}","r":"c","k":"answer"},{"t":"topic","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"missing topic","q":"Publisher.publish topics/missing-topic","a":"NOT_FOUND: Topic not found","r":"c","k":"answer"},{"t":"invalid topic","q":"Publisher.publish orders","a":"INVALID_ARGUMENT: Invalid [topics] name: (name=orders)","r":"c","k":"answer"},{"t":"no messages","q":"Publisher.publish topics/orders","a":"INVALID_ARGUMENT: No messages to publish","r":"c","k":"answer"},{"t":"empty message","q":"Publisher.publish topics/orders","a":"INVALID_ARGUMENT: Some messages are empty","r":"c","k":"answer"},{"t":"empty data only","q":"Publisher.publish topics/orders","a":"INVALID_ARGUMENT: Some messages are empty","r":"c","k":"answer"},{"t":"attributes only","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"ordering key only","q":"Publisher.publish topics/orders","a":"INVALID_ARGUMENT: Some messages are empty","r":"c","k":"answer"},{"t":"data only","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"batch","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"one empty message rejects the whole batch","q":"Publisher.publish topics/orders","a":"INVALID_ARGUMENT: Some messages are empty","r":"c","k":"answer"},{"t":"the server assigns ids regardless","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"client publish time","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"many attributes","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"long attribute key","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"long attribute value","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"empty attribute key","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"goog attribute","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"long ordering key","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"10 MB + 1 byte","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"large data ok","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"after all","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"put topic","q":"PUT /v1/projects/{project}/topics/orders","a":"200 {name}","r":"c","k":"answer"},{"t":"publish","q":"POST /v1/projects/{project}/topics/orders:publish","a":"200 {messageIds}","r":"c","k":"answer"},{"t":"publish batch","q":"POST /v1/projects/{project}/topics/orders:publish","a":"200 {messageIds}","r":"c","k":"answer"},{"t":"publish missing","q":"POST /v1/projects/{project}/topics/missing-topic:publish","a":"404 NOT_FOUND: Topic not found","r":"c","k":"answer"},{"t":"publish empty","q":"POST /v1/projects/{project}/topics/orders:publish","a":"400 INVALID_ARGUMENT: No messages to publish","r":"c","k":"answer"},{"t":"publish no body","q":"POST /v1/projects/{project}/topics/orders:publish","a":"400 INVALID_ARGUMENT: No messages to publish","r":"c","k":"answer"},{"t":"publish bad base64","q":"POST /v1/projects/{project}/topics/orders:publish","a":"400 INVALID_ARGUMENT: Payload isn't valid for request.","r":"c","k":"answer"},{"t":"publish bad json","q":"POST /v1/projects/{project}/topics/orders:publish","a":"400 INVALID_ARGUMENT: Payload isn't valid for request.","r":"c","k":"answer"},{"t":"publish unknown field","q":"POST /v1/projects/{project}/topics/orders:publish","a":"400 INVALID_ARGUMENT: Payload isn't valid for request.","r":"c","k":"answer"},{"t":"publish wrong type","q":"POST /v1/projects/{project}/topics/orders:publish","a":"400 INVALID_ARGUMENT: Payload isn't valid for request.","r":"c","k":"answer"},{"t":"proto JSON accepts snake case","q":"POST /v1/projects/{project}/topics/orders:publish","a":"200 {messageIds}","r":"c","k":"answer"},{"t":"publish get","q":"GET /v1/projects/{project}/topics/orders:publish","a":"400 INVALID_ARGUMENT: Invalid [topics] name: (name=projects/{project}/topics/orders:publish)","r":"c","k":"answer"},{"t":"publish attributes only","q":"POST /v1/projects/{project}/topics/orders:publish","a":"200 {messageIds}","r":"c","k":"answer"},{"t":"publish empty message","q":"POST /v1/projects/{project}/topics/orders:publish","a":"400 INVALID_ARGUMENT: Some messages are empty","r":"c","k":"answer"},{"t":"topic","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"dead letter topic","q":"Publisher.createTopic topics/dead-letters","a":"OK {name}","r":"c","k":"answer"},{"t":"defaults","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"duplicate","q":"Subscriber.createSubscription topics/orders","a":"ALREADY_EXISTS: Subscription already exists","r":"c","k":"answer"},{"t":"missing topic","q":"Subscriber.createSubscription topics/missing-topic","a":"NOT_FOUND: Subscription topic does not exist","r":"c","k":"answer"},{"t":"invalid topic name","q":"Subscriber.createSubscription orders","a":"INVALID_ARGUMENT: Invalid [topics] name: (name=orders)","r":"c","k":"answer"},{"t":"no topic","q":"Subscriber.createSubscription subscriptions/no-topic-field","a":"INVALID_ARGUMENT: Invalid [topics] name: (name=)","r":"c","k":"answer"},{"t":"short name","q":"Subscriber.createSubscription topics/orders","a":"INVALID_ARGUMENT: Invalid [subscriptions] name: (name=projects/{project}/subscriptions/ab)","r":"c","k":"answer"},{"t":"goog name","q":"Subscriber.createSubscription topics/orders","a":"INVALID_ARGUMENT: Invalid [subscriptions] name: (name=projects/{project}/subscriptions/goog-sub)","r":"c","k":"answer"},{"t":"bare name","q":"Subscriber.createSubscription topics/orders","a":"INVALID_ARGUMENT: Invalid [subscriptions] name: (name=bare)","r":"c","k":"answer"},{"t":"cross-project subscription","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"deadline zero","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"deadline nine","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"deadline ten","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"deadline max","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"deadline over","q":"Subscriber.createSubscription topics/orders","a":"INVALID_ARGUMENT: ack_deadline_secs out of bounds","r":"c","k":"answer"},{"t":"deadline negative","q":"Subscriber.createSubscription topics/orders","a":"INVALID_ARGUMENT: ack_deadline_secs out of bounds","r":"c","k":"answer"},{"t":"retention short","q":"Subscriber.createSubscription topics/orders","a":"INVALID_ARGUMENT: message_retention_duration out of bounds","r":"c","k":"answer"},{"t":"retention min","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"retention long","q":"Subscriber.createSubscription topics/orders","a":"INVALID_ARGUMENT: message_retention_duration out of bounds","r":"c","k":"answer"},{"t":"retention max","q":"Subscriber.createSubscription topics/orders","a":"INVALID_ARGUMENT: message_retention_duration out of bounds","r":"c","k":"answer"},{"t":"retain acked","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"ordering","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, enableMessageOrdering, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"exactly once","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, enableExactlyOnceDelivery, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"labels","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, labels, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"detached","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, detached, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"expiration ttl","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, expirationPolicy, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"expiration never","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, expirationPolicy, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"expiration short","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, expirationPolicy, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"dead letter","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, deadLetterPolicy, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"dead letter default attempts","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, deadLetterPolicy, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"dead letter few attempts","q":"Subscriber.createSubscription topics/orders","a":"OUT_OF_RANGE: The value for max_delivery_attempts is too small. You passed 4 in the request, but the minimum value is 5.","r":"c","k":"answer"},{"t":"dead letter many attempts","q":"Subscriber.createSubscription topics/orders","a":"OUT_OF_RANGE: The value for max_delivery_attempts is too large. You passed 101 in the request, but the maximum value is 100.","r":"c","k":"answer"},{"t":"dead letter missing topic","q":"Subscriber.createSubscription topics/orders","a":"NOT_FOUND: Dead letter topic not found","r":"c","k":"answer"},{"t":"dead letter same topic","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, deadLetterPolicy, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"retry policy","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"retry policy inverted","q":"Subscriber.createSubscription topics/orders","a":"INVALID_ARGUMENT: The value for maximum_backoff is too small. You passed 1s in the request, but the minimum value is 60s.","r":"c","k":"answer"},{"t":"retry policy empty","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"filter","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, filter, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"filter invalid","q":"Subscriber.createSubscription topics/orders","a":"UNKNOWN: Application error processing RPC","r":"c","k":"answer"},{"t":"filter unknown function","q":"Subscriber.createSubscription topics/orders","a":"UNKNOWN: Application error processing RPC","r":"c","k":"answer"},{"t":"push","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"push attributes","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"push oidc","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"push invalid endpoint","q":"Subscriber.createSubscription topics/orders","a":"INVALID_ARGUMENT: Unsupported push_endpoint","r":"c","k":"answer"},{"t":"push attributes only","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"everything","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, deadLetterPolicy, enableExactlyOnceDelivery, enableMessageOrdering, …}","r":"c","k":"answer"},{"t":"get everything","q":"Subscriber.getSubscription subscriptions/everything","a":"OK {ackDeadlineSeconds, deadLetterPolicy, enableExactlyOnceDelivery, enableMessageOrdering, …}","r":"c","k":"answer"},{"t":"get missing","q":"Subscriber.getSubscription subscriptions/missing-sub","a":"NOT_FOUND: Subscription does not exist","r":"c","k":"answer"},{"t":"get invalid","q":"Subscriber.getSubscription everything","a":"INVALID_ARGUMENT: Invalid [subscriptions] name: (name=everything)","r":"c","k":"answer"},{"t":"list","q":"Subscriber.listSubscriptions projects/{project}","a":"OK {subscriptions}","r":"c","k":"answer"},{"t":"list page 1","q":"Subscriber.listSubscriptions projects/{project}","a":"OK {subscriptions}","r":"c","k":"answer"},{"t":"list page 2","q":"Subscriber.listSubscriptions projects/{project}","a":"OK {subscriptions}","r":"c","k":"answer"},{"t":"list other project","q":"Subscriber.listSubscriptions projects/{project}","a":"OK {subscriptions}","r":"c","k":"answer"},{"t":"list bad project","q":"Subscriber.listSubscriptions nope","a":"UNKNOWN: Application error processing RPC","r":"c","k":"answer"},{"t":"put topic","q":"PUT /v1/projects/{project}/topics/orders","a":"200 {name}","r":"c","k":"answer"},{"t":"put","q":"PUT /v1/projects/{project}/subscriptions/sub-a","a":"200 {ackDeadlineSeconds, filter, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"put duplicate","q":"PUT /v1/projects/{project}/subscriptions/sub-a","a":"409 ALREADY_EXISTS: Subscription already exists","r":"c","k":"answer"},{"t":"put missing topic","q":"PUT /v1/projects/{project}/subscriptions/sub-b","a":"404 NOT_FOUND: Subscription topic does not exist","r":"c","k":"answer"},{"t":"put no topic","q":"PUT /v1/projects/{project}/subscriptions/sub-b","a":"400 INVALID_ARGUMENT: Invalid [topics] name: (name=)","r":"c","k":"answer"},{"t":"put durations","q":"PUT /v1/projects/{project}/subscriptions/sub-c","a":"200 {ackDeadlineSeconds, expirationPolicy, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"put bad duration","q":"PUT /v1/projects/{project}/subscriptions/sub-d","a":"400 INVALID_ARGUMENT: Payload isn't valid for request.","r":"c","k":"answer"},{"t":"get","q":"GET /v1/projects/{project}/subscriptions/sub-a","a":"200 {ackDeadlineSeconds, filter, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"get missing","q":"GET /v1/projects/{project}/subscriptions/missing-sub","a":"404 NOT_FOUND: Subscription does not exist","r":"c","k":"answer"},{"t":"list","q":"GET /v1/projects/{project}/subscriptions","a":"200 {subscriptions}","r":"c","k":"answer"},{"t":"list page","q":"GET /v1/projects/{project}/subscriptions?pageSize=1","a":"200 {subscriptions}","r":"c","k":"answer"},{"t":"patch deadline","q":"PATCH /v1/projects/{project}/subscriptions/sub-a","a":"200 {ackDeadlineSeconds, filter, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"patch camel","q":"PATCH /v1/projects/{project}/subscriptions/sub-a","a":"200 {ackDeadlineSeconds, filter, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"patch push","q":"PATCH /v1/projects/{project}/subscriptions/sub-a?updateMask=push_config","a":"200 {ackDeadlineSeconds, filter, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"get after patch","q":"GET /v1/projects/{project}/subscriptions/sub-a","a":"200 {ackDeadlineSeconds, filter, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"modify push config","q":"POST /v1/projects/{project}/subscriptions/sub-a:modifyPushConfig","a":"200 {}","r":"c","k":"answer"},{"t":"get after modify","q":"GET /v1/projects/{project}/subscriptions/sub-a","a":"200 {ackDeadlineSeconds, filter, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"delete","q":"DELETE /v1/projects/{project}/subscriptions/sub-a","a":"200 {}","r":"c","k":"answer"},{"t":"delete again","q":"DELETE /v1/projects/{project}/subscriptions/sub-a","a":"404 NOT_FOUND: Subscription does not exist","r":"c","k":"answer"},{"t":"list after","q":"GET /v1/projects/{project}/subscriptions","a":"200 {subscriptions}","r":"c","k":"answer"},{"t":"topic","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"other topic","q":"Publisher.createTopic topics/other","a":"OK {name}","r":"c","k":"answer"},{"t":"dead letter topic","q":"Publisher.createTopic topics/dead-letters","a":"OK {name}","r":"c","k":"answer"},{"t":"sub","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"no mask","q":"Subscriber.updateSubscription subscriptions/sub-a","a":"INVALID_ARGUMENT: The update_mask in the UpdateSubscriptionRequest must be set, and must contain a non-empty paths list.","r":"c","k":"answer"},{"t":"empty mask","q":"Subscriber.updateSubscription subscriptions/sub-a","a":"INVALID_ARGUMENT: The update_mask in the UpdateSubscriptionRequest must be set, and must contain a non-empty paths list.","r":"c","k":"answer"},{"t":"ack deadline","q":"Subscriber.updateSubscription subscriptions/sub-a","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"ack deadline out of bounds","q":"Subscriber.updateSubscription subscriptions/sub-a","a":"INVALID_ARGUMENT: ack_deadline_secs out of bounds","r":"c","k":"answer"},{"t":"camel mask","q":"Subscriber.updateSubscription subscriptions/sub-a","a":"INVALID_ARGUMENT: Invalid update_mask provided in the UpdateSubscriptionRequest: ackDeadlineSeconds is not a known Subscription field. Note…","r":"c","k":"answer"},{"t":"unknown field","q":"Subscriber.updateSubscription subscriptions/sub-a","a":"INVALID_ARGUMENT: Invalid update_mask provided in the UpdateSubscriptionRequest: bogus is not a known Subscription field. Note that field p…","r":"c","k":"answer"},{"t":"labels","q":"Subscriber.updateSubscription subscriptions/sub-a","a":"INVALID_ARGUMENT: Invalid update_mask provided in the UpdateSubscriptionRequest: labels is not a known Subscription field. Note that field…","r":"c","k":"answer"},{"t":"topic field","q":"Subscriber.updateSubscription subscriptions/sub-a","a":"INVALID_ARGUMENT: Invalid update_mask provided in the UpdateSubscriptionRequest: the topic field in the Subscription is not mutable.","r":"c","k":"answer"},{"t":"push config","q":"Subscriber.updateSubscription subscriptions/sub-a","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"push config clear","q":"Subscriber.updateSubscription subscriptions/sub-a","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"retain acked","q":"Subscriber.updateSubscription subscriptions/sub-a","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"retention","q":"Subscriber.updateSubscription subscriptions/sub-a","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"retention out of bounds","q":"Subscriber.updateSubscription subscriptions/sub-a","a":"INVALID_ARGUMENT: message_retention_duration out of bounds","r":"c","k":"answer"},{"t":"ordering","q":"Subscriber.updateSubscription subscriptions/sub-a","a":"INVALID_ARGUMENT: Invalid update_mask provided in the UpdateSubscriptionRequest: the enable_message_ordering field in the Subscription is n…","r":"c","k":"answer"},{"t":"filter","q":"Subscriber.updateSubscription subscriptions/sub-a","a":"INVALID_ARGUMENT: Updating the filter field is currently unsupported in the Pub/Sub Emulator.","r":"c","k":"answer"},{"t":"expiration","q":"Subscriber.updateSubscription subscriptions/sub-a","a":"INVALID_ARGUMENT: Updating the expiration_policy field is currently unsupported in the Pub/Sub Emulator.","r":"c","k":"answer"},{"t":"dead letter","q":"Subscriber.updateSubscription subscriptions/sub-a","a":"OK {ackDeadlineSeconds, deadLetterPolicy, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"retry","q":"Subscriber.updateSubscription subscriptions/sub-a","a":"OK {ackDeadlineSeconds, deadLetterPolicy, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"exactly once","q":"Subscriber.updateSubscription subscriptions/sub-a","a":"OK {ackDeadlineSeconds, deadLetterPolicy, enableExactlyOnceDelivery, messageRetentionDuration, …}","r":"c","k":"answer"},{"t":"detached","q":"Subscriber.updateSubscription subscriptions/sub-a","a":"INVALID_ARGUMENT: Invalid update_mask provided in the UpdateSubscriptionRequest: the detached field in the Subscription is not mutable.","r":"c","k":"answer"},{"t":"multiple","q":"Subscriber.updateSubscription subscriptions/sub-a","a":"OK {ackDeadlineSeconds, deadLetterPolicy, enableExactlyOnceDelivery, messageRetentionDuration, …}","r":"c","k":"answer"},{"t":"missing","q":"Subscriber.updateSubscription subscriptions/missing-sub","a":"NOT_FOUND: Subscription not found.","r":"c","k":"answer"},{"t":"get","q":"Subscriber.getSubscription subscriptions/sub-a","a":"OK {ackDeadlineSeconds, deadLetterPolicy, enableExactlyOnceDelivery, messageRetentionDuration, …}","r":"c","k":"answer"},{"t":"modify push","q":"Subscriber.modifyPushConfig subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"modify push oidc","q":"Subscriber.modifyPushConfig subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"get after modify","q":"Subscriber.getSubscription subscriptions/sub-a","a":"OK {ackDeadlineSeconds, deadLetterPolicy, enableExactlyOnceDelivery, messageRetentionDuration, …}","r":"c","k":"answer"},{"t":"modify push clear","q":"Subscriber.modifyPushConfig subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"modify push missing","q":"Subscriber.modifyPushConfig subscriptions/missing-sub","a":"NOT_FOUND: Subscription does not exist","r":"c","k":"answer"},{"t":"modify push no config","q":"Subscriber.modifyPushConfig subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"get final","q":"Subscriber.getSubscription subscriptions/sub-a","a":"OK {ackDeadlineSeconds, deadLetterPolicy, enableExactlyOnceDelivery, messageRetentionDuration, …}","r":"c","k":"answer"},{"t":"topic","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"sub","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"publish","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"delete topic","q":"Publisher.deleteTopic topics/orders","a":"OK {}","r":"c","k":"answer"},{"t":"get","q":"Subscriber.getSubscription subscriptions/sub-a","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"list","q":"Subscriber.listSubscriptions projects/{project}","a":"OK {subscriptions}","r":"c","k":"answer"},{"t":"pull","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"publish after","q":"Publisher.publish topics/orders","a":"NOT_FOUND: Topic not found","r":"c","k":"answer"},{"t":"recreate","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"publish recreated","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"pull recreated","q":"Subscriber.pull subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"get recreated","q":"Subscriber.getSubscription subscriptions/sub-a","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"children","q":"Publisher.listTopicSubscriptions topics/orders","a":"OK {}","r":"c","k":"answer"},{"t":"delete sub","q":"Subscriber.deleteSubscription subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"delete sub again","q":"Subscriber.deleteSubscription subscriptions/sub-a","a":"NOT_FOUND: Subscription does not exist","r":"c","k":"answer"},{"t":"delete invalid","q":"Subscriber.deleteSubscription sub-a","a":"INVALID_ARGUMENT: Invalid [subscriptions] name: (name=sub-a)","r":"c","k":"answer"},{"t":"list after","q":"Subscriber.listSubscriptions projects/{project}","a":"OK {}","r":"c","k":"answer"},{"t":"topic","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"sub","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"pull no max","q":"Subscriber.pull subscriptions/sub-a","a":"INVALID_ARGUMENT: No max_messages specified","r":"c","k":"answer"},{"t":"pull zero max","q":"Subscriber.pull subscriptions/sub-a","a":"INVALID_ARGUMENT: No max_messages specified","r":"c","k":"answer"},{"t":"pull negative max","q":"Subscriber.pull subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"pull missing","q":"Subscriber.pull subscriptions/missing-sub","a":"NOT_FOUND: Subscription does not exist","r":"c","k":"answer"},{"t":"pull invalid","q":"Subscriber.pull sub-a","a":"INVALID_ARGUMENT: Invalid [subscriptions] name: (name=sub-a)","r":"c","k":"answer"},{"t":"pull empty","q":"Subscriber.pull subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"publish","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"pull two","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull rest","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull outstanding","q":"Subscriber.pull subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"ack one","q":"Subscriber.acknowledge subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"ack again","q":"Subscriber.acknowledge subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"ack unknown","q":"Subscriber.acknowledge subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"ack garbage","q":"Subscriber.acknowledge subscriptions/sub-a","a":"INVALID_ARGUMENT: Invalid ack id (ack_id=garbage)","r":"c","k":"answer"},{"t":"ack empty","q":"Subscriber.acknowledge subscriptions/sub-a","a":"INVALID_ARGUMENT: No ack ids specified.","r":"c","k":"answer"},{"t":"ack missing sub","q":"Subscriber.acknowledge subscriptions/missing-sub","a":"NOT_FOUND: Subscription does not exist","r":"c","k":"answer"},{"t":"ack other subscription id","q":"Subscriber.acknowledge subscriptions/sub-a","a":"INVALID_ARGUMENT: Subscription projects/{project}/subscriptions/sub-a received an invalid ack ID projects/{project}/subscriptions/other-sub…","r":"c","k":"answer"},{"t":"extend","q":"Subscriber.modifyAckDeadline subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"extend over","q":"Subscriber.modifyAckDeadline subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"extend negative","q":"Subscriber.modifyAckDeadline subscriptions/sub-a","a":"INVALID_ARGUMENT: Ack deadline cannot be negative","r":"c","k":"answer"},{"t":"modify empty","q":"Subscriber.modifyAckDeadline subscriptions/sub-a","a":"INVALID_ARGUMENT: No ack ids specified","r":"c","k":"answer"},{"t":"modify garbage","q":"Subscriber.modifyAckDeadline subscriptions/sub-a","a":"INVALID_ARGUMENT: Invalid ack id (ack_id=garbage)","r":"c","k":"answer"},{"t":"modify missing sub","q":"Subscriber.modifyAckDeadline subscriptions/missing-sub","a":"NOT_FOUND: Subscription does not exist","r":"c","k":"answer"},{"t":"nack","q":"Subscriber.modifyAckDeadline subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"pull after nack","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"nack acked","q":"Subscriber.modifyAckDeadline subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"pull after nack acked","q":"Subscriber.pull subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"publish more","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"pull blocking","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull one more","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull none left","q":"Subscriber.pull subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"put topic","q":"PUT /v1/projects/{project}/topics/orders","a":"200 {name}","r":"c","k":"answer"},{"t":"put sub","q":"PUT /v1/projects/{project}/subscriptions/sub-a","a":"200 {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"pull empty","q":"POST /v1/projects/{project}/subscriptions/sub-a:pull","a":"200 {}","r":"c","k":"answer"},{"t":"pull no max","q":"POST /v1/projects/{project}/subscriptions/sub-a:pull","a":"400 INVALID_ARGUMENT: No max_messages specified","r":"c","k":"answer"},{"t":"pull missing","q":"POST /v1/projects/{project}/subscriptions/missing-sub:pull","a":"404 NOT_FOUND: Subscription does not exist","r":"c","k":"answer"},{"t":"publish","q":"POST /v1/projects/{project}/topics/orders:publish","a":"200 {messageIds}","r":"c","k":"answer"},{"t":"pull","q":"POST /v1/projects/{project}/subscriptions/sub-a:pull","a":"200 {receivedMessages}","r":"c","k":"answer"},{"t":"modify","q":"POST /v1/projects/{project}/subscriptions/sub-a:modifyAckDeadline","a":"200 {}","r":"c","k":"answer"},{"t":"pull after nack","q":"POST /v1/projects/{project}/subscriptions/sub-a:pull","a":"200 {receivedMessages}","r":"c","k":"answer"},{"t":"ack","q":"POST /v1/projects/{project}/subscriptions/sub-a:acknowledge","a":"200 {}","r":"c","k":"answer"},{"t":"ack empty","q":"POST /v1/projects/{project}/subscriptions/sub-a:acknowledge","a":"400 INVALID_ARGUMENT: No ack ids specified.","r":"c","k":"answer"},{"t":"ack garbage","q":"POST /v1/projects/{project}/subscriptions/sub-a:acknowledge","a":"400 INVALID_ARGUMENT: Invalid ack id (ack_id=garbage)","r":"c","k":"answer"},{"t":"ack no body","q":"POST /v1/projects/{project}/subscriptions/sub-a:acknowledge","a":"400 INVALID_ARGUMENT: No ack ids specified.","r":"c","k":"answer"},{"t":"modify over","q":"POST /v1/projects/{project}/subscriptions/sub-a:modifyAckDeadline","a":"200 {}","r":"c","k":"answer"},{"t":"pull none","q":"POST /v1/projects/{project}/subscriptions/sub-a:pull","a":"200 {}","r":"c","k":"answer"},{"t":"topic","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"sub","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"publish a","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"publish b","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"pull 5 a","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull 5 b","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull 5 c","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull 5 d","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull 5 e","q":"Subscriber.pull subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"pull 1000","q":"Subscriber.pull subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"ack all","q":"Subscriber.acknowledge subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"nack rest","q":"Subscriber.modifyAckDeadline subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"pull redelivered","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"topic","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"sub","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"publish","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"pull","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull leased","q":"Subscriber.pull subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"pull redelivered","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"extend","q":"Subscriber.modifyAckDeadline subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"pull still leased","q":"Subscriber.pull subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"ack expired id","q":"Subscriber.acknowledge subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"pull after stale ack","q":"Subscriber.pull subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"ack current","q":"Subscriber.acknowledge subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"pull after ack","q":"Subscriber.pull subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"topic","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"sub","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"publish","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"pull","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull blocks until redelivery","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"ack","q":"Subscriber.acknowledge subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"the client deadline expires before the emulator's long poll","q":"Subscriber.pull subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"topic","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"dead letter topic","q":"Publisher.createTopic topics/dead-letters","a":"OK {name}","r":"c","k":"answer"},{"t":"dlq sub","q":"Subscriber.createSubscription topics/dead-letters","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"sub","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, deadLetterPolicy, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"plain sub","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"publish","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"attempt 1","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"nack 1","q":"Subscriber.modifyAckDeadline subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"attempt 2","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"nack 2","q":"Subscriber.modifyAckDeadline subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"attempt 3","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"nack 3","q":"Subscriber.modifyAckDeadline subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"attempt 4","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"nack 4","q":"Subscriber.modifyAckDeadline subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"attempt 5","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"nack 5","q":"Subscriber.modifyAckDeadline subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"attempt 6","q":"Subscriber.pull subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"dead letters","q":"Subscriber.pull subscriptions/dlq-sub","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"plain","q":"Subscriber.pull subscriptions/plain","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"topic","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"retaining","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"plain","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"publish 1","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"publish 2","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"pull retaining","q":"Subscriber.pull subscriptions/retaining","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"ack retaining","q":"Subscriber.acknowledge subscriptions/retaining","a":"OK {}","r":"c","k":"answer"},{"t":"pull plain","q":"Subscriber.pull subscriptions/plain","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"ack plain","q":"Subscriber.acknowledge subscriptions/plain","a":"OK {}","r":"c","k":"answer"},{"t":"seek retaining epoch","q":"Subscriber.seek subscriptions/retaining","a":"OK {}","r":"c","k":"answer"},{"t":"pull retaining after seek","q":"Subscriber.pull subscriptions/retaining","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"seek plain epoch","q":"Subscriber.seek subscriptions/plain","a":"OK {}","r":"c","k":"answer"},{"t":"pull plain after seek","q":"Subscriber.pull subscriptions/plain","a":"OK {}","r":"c","k":"answer"},{"t":"seek retaining between","q":"Subscriber.seek subscriptions/retaining","a":"OK {}","r":"c","k":"answer"},{"t":"pull retaining between","q":"Subscriber.pull subscriptions/retaining","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"seek future","q":"Subscriber.seek subscriptions/retaining","a":"OK {}","r":"c","k":"answer"},{"t":"pull retaining future","q":"Subscriber.pull subscriptions/retaining","a":"OK {}","r":"c","k":"answer"},{"t":"seek none","q":"Subscriber.seek subscriptions/retaining","a":"INVALID_ARGUMENT: No target was specified in the SeekRequest. Must specify either a time or a snapshot","r":"c","k":"answer"},{"t":"seek both","q":"Subscriber.seek subscriptions/retaining","a":"NOT_FOUND: Snapshot does not exist","r":"c","k":"answer"},{"t":"seek missing","q":"Subscriber.seek subscriptions/missing-sub","a":"NOT_FOUND: Subscription does not exist","r":"c","k":"answer"},{"t":"seek http","q":"POST /v1/projects/{project}/subscriptions/retaining:seek","a":"200 {}","r":"c","k":"answer"},{"t":"pull http after seek","q":"POST /v1/projects/{project}/subscriptions/retaining:pull","a":"200 {receivedMessages}","r":"c","k":"answer"},{"t":"topic","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"sub","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"publish 1","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"create","q":"Subscriber.createSnapshot subscriptions/sub-a","a":"OK {expireTime, name, topic}","r":"c","k":"answer"},{"t":"create duplicate","q":"Subscriber.createSnapshot subscriptions/sub-a","a":"ALREADY_EXISTS: Snapshot already exists","r":"c","k":"answer"},{"t":"create missing sub","q":"Subscriber.createSnapshot subscriptions/missing-sub","a":"NOT_FOUND: Subscription does not exist","r":"c","k":"answer"},{"t":"create invalid name","q":"Subscriber.createSnapshot subscriptions/sub-a","a":"INVALID_ARGUMENT: Invalid [snapshots] name: (name=snap)","r":"c","k":"answer"},{"t":"create short name","q":"Subscriber.createSnapshot subscriptions/sub-a","a":"INVALID_ARGUMENT: Invalid [snapshots] name: (name=projects/{project}/snapshots/ab)","r":"c","k":"answer"},{"t":"create no sub","q":"Subscriber.createSnapshot snapshots/snap-c","a":"NOT_FOUND: Subscription does not exist","r":"c","k":"answer"},{"t":"get","q":"Subscriber.getSnapshot snapshots/snap-a","a":"OK {expireTime, name, topic}","r":"c","k":"answer"},{"t":"get missing","q":"Subscriber.getSnapshot snapshots/missing-snap","a":"NOT_FOUND: Snapshot does not exist","r":"c","k":"answer"},{"t":"get invalid","q":"Subscriber.getSnapshot snap-a","a":"INVALID_ARGUMENT: Invalid [snapshots] name: (name=snap-a)","r":"c","k":"answer"},{"t":"list","q":"Subscriber.listSnapshots projects/{project}","a":"OK {snapshots}","r":"c","k":"answer"},{"t":"list other project","q":"Subscriber.listSnapshots projects/{project}","a":"OK {}","r":"c","k":"answer"},{"t":"pull 1","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"ack 1","q":"Subscriber.acknowledge subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"publish 2","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"pull 2","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"ack 2","q":"Subscriber.acknowledge subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"pull empty","q":"Subscriber.pull subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"seek","q":"Subscriber.seek subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"pull after seek","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"seek missing snapshot","q":"Subscriber.seek subscriptions/sub-a","a":"NOT_FOUND: Snapshot does not exist","r":"c","k":"answer"},{"t":"create second","q":"Subscriber.createSnapshot subscriptions/sub-a","a":"OK {expireTime, name, topic}","r":"c","k":"answer"},{"t":"list page 1","q":"Subscriber.listSnapshots projects/{project}","a":"OK {snapshots}","r":"c","k":"answer"},{"t":"list page 2","q":"Subscriber.listSnapshots projects/{project}","a":"OK {snapshots}","r":"c","k":"answer"},{"t":"update","q":"Subscriber.updateSnapshot snapshots/snap-a","a":"UNIMPLEMENTED: Method google.pubsub.v1.Subscriber/UpdateSnapshot is unimplemented","r":"c","k":"answer"},{"t":"delete","q":"Subscriber.deleteSnapshot snapshots/snap-a","a":"OK {}","r":"c","k":"answer"},{"t":"delete again","q":"Subscriber.deleteSnapshot snapshots/snap-a","a":"NOT_FOUND: Snapshot does not exist","r":"c","k":"answer"},{"t":"seek deleted","q":"Subscriber.seek subscriptions/sub-a","a":"NOT_FOUND: Snapshot does not exist","r":"c","k":"answer"},{"t":"delete sub","q":"Subscriber.deleteSubscription subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"get after sub delete","q":"Subscriber.getSnapshot snapshots/snap-b","a":"OK {expireTime, name, topic}","r":"c","k":"answer"},{"t":"sub again","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"seek other sub","q":"Subscriber.seek subscriptions/sub-b","a":"OK {}","r":"c","k":"answer"},{"t":"pull sub b","q":"Subscriber.pull subscriptions/sub-b","a":"OK {}","r":"c","k":"answer"},{"t":"put http","q":"PUT /v1/projects/{project}/snapshots/snap-http","a":"200 {expireTime, name, topic}","r":"c","k":"answer"},{"t":"get http","q":"GET /v1/projects/{project}/snapshots/snap-http","a":"200 {expireTime, name, topic}","r":"c","k":"answer"},{"t":"list http","q":"GET /v1/projects/{project}/snapshots","a":"200 {snapshots}","r":"c","k":"answer"},{"t":"seek http","q":"POST /v1/projects/{project}/subscriptions/sub-b:seek","a":"200 {}","r":"c","k":"answer"},{"t":"patch http","q":"PATCH /v1/projects/{project}/snapshots/snap-http","a":"501 UNIMPLEMENTED: Method google.pubsub.v1.Subscriber/UpdateSnapshot is unimplemented","r":"c","k":"answer"},{"t":"delete http","q":"DELETE /v1/projects/{project}/snapshots/snap-http","a":"200 {}","r":"c","k":"answer"},{"t":"get http deleted","q":"GET /v1/projects/{project}/snapshots/snap-http","a":"404 NOT_FOUND: Snapshot does not exist","r":"c","k":"answer"},{"t":"topic","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"single topic","q":"Publisher.createTopic topics/single-key","a":"OK {name}","r":"c","k":"answer"},{"t":"ordered","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, enableMessageOrdering, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"unordered","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"single","q":"Subscriber.createSubscription topics/single-key","a":"OK {ackDeadlineSeconds, enableMessageOrdering, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"publish","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"the set of messages an ordered subscription delivers at once; the official emulator interleaves keys differently from run to run","q":"Subscriber.pull subscriptions/ordered","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull unordered","q":"Subscriber.pull subscriptions/unordered","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"ack ordered","q":"Subscriber.acknowledge subscriptions/ordered","a":"OK {}","r":"c","k":"answer"},{"t":"pull ordered drained","q":"Subscriber.pull subscriptions/ordered","a":"OK {}","r":"c","k":"answer"},{"t":"publish more","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"pull more","q":"Subscriber.pull subscriptions/ordered","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull unordered more","q":"Subscriber.pull subscriptions/unordered","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"publish single key","q":"Publisher.publish topics/single-key","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"pull max one","q":"Subscriber.pull subscriptions/single","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull max one again","q":"Subscriber.pull subscriptions/single","a":"OK {}","r":"c","k":"answer"},{"t":"ack first single","q":"Subscriber.acknowledge subscriptions/single","a":"OK {}","r":"c","k":"answer"},{"t":"pull max one after ack","q":"Subscriber.pull subscriptions/single","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull single rest","q":"Subscriber.pull subscriptions/single","a":"OK {}","r":"c","k":"answer"},{"t":"nack second single","q":"Subscriber.modifyAckDeadline subscriptions/single","a":"OK {}","r":"c","k":"answer"},{"t":"pull single after nack","q":"Subscriber.pull subscriptions/single","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"ack second single","q":"Subscriber.acknowledge subscriptions/single","a":"OK {}","r":"c","k":"answer"},{"t":"pull single third","q":"Subscriber.pull subscriptions/single","a":"OK {}","r":"c","k":"answer"},{"t":"topic","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"equality","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, filter, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"inequality","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, filter, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"existence","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, filter, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"prefix","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, filter, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"not","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, filter, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"and","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, filter, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"or","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, filter, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"parentheses","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, filter, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"unfiltered","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"invalid","q":"Subscriber.createSubscription topics/orders","a":"UNKNOWN: Application error processing RPC","r":"c","k":"answer"},{"t":"unknown function","q":"Subscriber.createSubscription topics/orders","a":"UNKNOWN: Application error processing RPC","r":"c","k":"answer"},{"t":"data filter","q":"Subscriber.createSubscription topics/orders","a":"UNKNOWN: Application error processing RPC","r":"c","k":"answer"},{"t":"ordering key filter","q":"Subscriber.createSubscription topics/orders","a":"UNKNOWN: Application error processing RPC","r":"c","k":"answer"},{"t":"publish","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"pull equality","q":"Subscriber.pull subscriptions/equality","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull inequality","q":"Subscriber.pull subscriptions/inequality","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull existence","q":"Subscriber.pull subscriptions/existence","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull prefix","q":"Subscriber.pull subscriptions/prefix","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull not","q":"Subscriber.pull subscriptions/negated","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull and","q":"Subscriber.pull subscriptions/conjunction","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull or","q":"Subscriber.pull subscriptions/disjunction","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull parentheses","q":"Subscriber.pull subscriptions/parenthesised","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull unfiltered","q":"Subscriber.pull subscriptions/unfiltered","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"update filter","q":"Subscriber.updateSubscription subscriptions/equality","a":"INVALID_ARGUMENT: Updating the filter field is currently unsupported in the Pub/Sub Emulator.","r":"c","k":"answer"},{"t":"get equality","q":"Subscriber.getSubscription subscriptions/equality","a":"OK {ackDeadlineSeconds, filter, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"topic","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"sub","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"publish","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"stream","q":"Subscriber.streamingPull (stream, 2 writes)","a":"OK · 4 messages received","r":"c","k":"answer"},{"t":"pull after stream","q":"Subscriber.pull subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"stream missing","q":"Subscriber.streamingPull (stream, 1 write)","a":"NOT_FOUND: Subscription does not exist (resource=missing-sub) · 0 messages received","r":"c","k":"answer"},{"t":"stream no subscription","q":"Subscriber.streamingPull (stream, 1 write)","a":"INVALID_ARGUMENT: first message must set subscription · 0 messages received","r":"c","k":"answer"},{"t":"stream bad deadline","q":"Subscriber.streamingPull (stream, 1 write)","a":"INVALID_ARGUMENT: stream_ack_deadline_seconds must be between 10 and 600 seconds · 0 messages received","r":"c","k":"answer"},{"t":"stream invalid name","q":"Subscriber.streamingPull (stream, 1 write)","a":"INVALID_ARGUMENT: Invalid [subscriptions] name: (name=sub-a) · 0 messages received","r":"c","k":"answer"},{"t":"topic","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"sub","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"publish","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"stream then close","q":"Subscriber.streamingPull (stream, 1 write)","a":"CANCELLED: Cancelled on client · 1 message received","r":"c","k":"answer"},{"t":"pull right after close","q":"Subscriber.pull subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"pull after deadline","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"nack","q":"Subscriber.modifyAckDeadline subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"stream live publish","q":"Subscriber.streamingPull (stream, 2 writes)","a":"OK · 1 message received","r":"c","k":"answer"},{"t":"pull drained","q":"Subscriber.pull subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"topic","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"sub","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, enableMessageOrdering, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"publish","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"stream","q":"Subscriber.streamingPull (stream, 2 writes)","a":"OK · 3 messages received","r":"c","k":"answer"},{"t":"publish more","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"pull after","q":"Subscriber.pull subscriptions/ordered","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"topic","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"push sub","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"publish","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"pushed","q":"push endpoint: wait up to 3000 ms for 2 or more pushes","a":"2 distinct pushes received","r":"c","k":"behaviour"},{"t":"pull on push sub","q":"Subscriber.pull subscriptions/push-sub","a":"OK {}","r":"c","k":"answer"},{"t":"to pull","q":"Subscriber.modifyPushConfig subscriptions/push-sub","a":"OK {}","r":"c","k":"answer"},{"t":"publish pull mode","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"no pushes","q":"push endpoint: wait up to 500 ms for 0 or more pushes","a":"0 distinct pushes received","r":"c","k":"behaviour"},{"t":"pull in pull mode","q":"Subscriber.pull subscriptions/push-sub","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"to push with outstanding","q":"Subscriber.modifyPushConfig subscriptions/push-sub","a":"OK {}","r":"c","k":"answer"},{"t":"still leased","q":"push endpoint: wait up to 800 ms for 0 or more pushes","a":"0 distinct pushes received","r":"c","k":"behaviour"},{"t":"publish push again","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"pushed again","q":"push endpoint: wait up to 3000 ms for 1 or more pushes","a":"1 distinct push received","r":"c","k":"behaviour"},{"t":"nack outstanding","q":"Subscriber.modifyAckDeadline subscriptions/push-sub","a":"OK {}","r":"c","k":"answer"},{"t":"pushed after nack","q":"push endpoint: wait up to 3000 ms for 1 or more pushes","a":"1 distinct push received","r":"c","k":"behaviour"},{"t":"get","q":"Subscriber.getSubscription subscriptions/push-sub","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"topic","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"push sub","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"publish","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"retried 500","q":"push endpoint: wait up to 4000 ms for 3 or more pushes","a":"1 distinct push received","r":"c","k":"behaviour"},{"t":"retried 404","q":"push endpoint: wait up to 3000 ms for 2 or more pushes","a":"1 distinct push received","r":"c","k":"behaviour"},{"t":"delivered","q":"push endpoint: wait up to 3000 ms for 1 or more pushes","a":"1 distinct push received","r":"c","k":"behaviour"},{"t":"stops","q":"push endpoint: wait up to 1500 ms for 0 or more pushes","a":"0 distinct pushes received","r":"c","k":"behaviour"},{"t":"publish 204","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"delivered 204","q":"push endpoint: wait up to 3000 ms for 1 or more pushes","a":"1 distinct push received","r":"c","k":"behaviour"},{"t":"publish 302","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"retried 302","q":"push endpoint: wait up to 3000 ms for 2 or more pushes","a":"1 distinct push received","r":"c","k":"behaviour"},{"t":"delivered after 302","q":"push endpoint: wait up to 3000 ms for 1 or more pushes","a":"1 distinct push received","r":"c","k":"behaviour"},{"t":"create","q":"SchemaService.createSchema projects/{project}","a":"OK {definition, name, revisionCreateTime, revisionId, …}","r":"c","k":"answer"},{"t":"create duplicate","q":"SchemaService.createSchema projects/{project}","a":"ALREADY_EXISTS: Schema already exists","r":"c","k":"answer"},{"t":"create invalid json","q":"SchemaService.createSchema projects/{project}","a":"INVALID_ARGUMENT: Could not parse schema definition","r":"c","k":"answer"},{"t":"create invalid avro","q":"SchemaService.createSchema projects/{project}","a":"INVALID_ARGUMENT: Could not parse schema definition","r":"c","k":"answer"},{"t":"create empty definition","q":"SchemaService.createSchema projects/{project}","a":"INVALID_ARGUMENT: Could not parse schema definition","r":"c","k":"answer"},{"t":"create no type","q":"SchemaService.createSchema projects/{project}","a":"INVALID_ARGUMENT: Invalid schema type","r":"c","k":"answer"},{"t":"create protobuf","q":"SchemaService.createSchema projects/{project}","a":"UNIMPLEMENTED: Protocol buffer support not implemented in emulator","r":"c","k":"answer"},{"t":"create no id","q":"SchemaService.createSchema projects/{project}","a":"INVALID_ARGUMENT: Invalid [schemas] name: (name=projects/{project}/schemas/)","r":"c","k":"answer"},{"t":"create name only","q":"SchemaService.createSchema schemas/named","a":"INVALID_ARGUMENT: Invalid [schemas] name: (name=projects/{project}/schemas/)","r":"c","k":"answer"},{"t":"create short id","q":"SchemaService.createSchema projects/{project}","a":"INVALID_ARGUMENT: Invalid [schemas] name: (name=projects/{project}/schemas/ab)","r":"c","k":"answer"},{"t":"create goog id","q":"SchemaService.createSchema projects/{project}","a":"INVALID_ARGUMENT: Invalid [schemas] name: (name=projects/{project}/schemas/goog-schema)","r":"c","k":"answer"},{"t":"create bad parent","q":"SchemaService.createSchema nope","a":"INVALID_ARGUMENT: Invalid [schemas] name: (name=nope/schemas/readings2)","r":"c","k":"answer"},{"t":"create primitive","q":"SchemaService.createSchema projects/{project}","a":"OK {definition, name, revisionCreateTime, revisionId, …}","r":"c","k":"answer"},{"t":"get","q":"SchemaService.getSchema schemas/readings","a":"OK {definition, name, revisionCreateTime, revisionId, …}","r":"c","k":"answer"},{"t":"get basic","q":"SchemaService.getSchema schemas/readings","a":"OK {name, revisionCreateTime, revisionId, type}","r":"c","k":"answer"},{"t":"get full","q":"SchemaService.getSchema schemas/readings","a":"OK {definition, name, revisionCreateTime, revisionId, …}","r":"c","k":"answer"},{"t":"get missing","q":"SchemaService.getSchema schemas/missing-schema","a":"NOT_FOUND: Schema not found","r":"c","k":"answer"},{"t":"get invalid","q":"SchemaService.getSchema readings","a":"INVALID_ARGUMENT: Invalid [schemas] name: (name=readings)","r":"c","k":"answer"},{"t":"list","q":"SchemaService.listSchemas projects/{project}","a":"OK {schemas}","r":"c","k":"answer"},{"t":"list full","q":"SchemaService.listSchemas projects/{project}","a":"OK {schemas}","r":"c","k":"answer"},{"t":"list page 1","q":"SchemaService.listSchemas projects/{project}","a":"OK {schemas}","r":"c","k":"answer"},{"t":"list page 2","q":"SchemaService.listSchemas projects/{project}","a":"OK {schemas}","r":"c","k":"answer"},{"t":"list other project","q":"SchemaService.listSchemas projects/{project}","a":"OK {}","r":"c","k":"answer"},{"t":"commit","q":"SchemaService.commitSchema schemas/readings","a":"OK {definition, name, revisionCreateTime, revisionId, …}","r":"c","k":"answer"},{"t":"commit invalid","q":"SchemaService.commitSchema schemas/readings","a":"INVALID_ARGUMENT: Could not parse schema definition","r":"c","k":"answer"},{"t":"commit missing","q":"SchemaService.commitSchema schemas/missing-schema","a":"NOT_FOUND: Schema not found","r":"c","k":"answer"},{"t":"commit no schema","q":"SchemaService.commitSchema schemas/readings","a":"INVALID_ARGUMENT: Invalid schema type","r":"c","k":"answer"},{"t":"revisions","q":"SchemaService.listSchemaRevisions schemas/readings","a":"OK {schemas}","r":"c","k":"answer"},{"t":"revisions basic","q":"SchemaService.listSchemaRevisions schemas/readings","a":"OK {schemas}","r":"c","k":"answer"},{"t":"revisions page","q":"SchemaService.listSchemaRevisions schemas/readings","a":"OK {schemas}","r":"c","k":"answer"},{"t":"revisions missing","q":"SchemaService.listSchemaRevisions schemas/missing-schema","a":"NOT_FOUND: Schema not found","r":"c","k":"answer"},{"t":"get at revision","q":"SchemaService.getSchema schemas/readings@{{revisionId:create}}","a":"OK {definition, name, revisionCreateTime, revisionId, …}","r":"c","k":"answer"},{"t":"get at missing revision","q":"SchemaService.getSchema schemas/readings@deadbeef","a":"NOT_FOUND: Schema revision not found","r":"c","k":"answer"},{"t":"get latest","q":"SchemaService.getSchema schemas/readings","a":"OK {definition, name, revisionCreateTime, revisionId, …}","r":"c","k":"answer"},{"t":"rollback","q":"SchemaService.rollbackSchema schemas/readings","a":"OK {definition, name, revisionCreateTime, revisionId, …}","r":"c","k":"answer"},{"t":"rollback missing revision","q":"SchemaService.rollbackSchema schemas/readings","a":"NOT_FOUND: Revision not found","r":"c","k":"answer"},{"t":"rollback missing schema","q":"SchemaService.rollbackSchema schemas/missing-schema","a":"NOT_FOUND: Schema not found","r":"c","k":"answer"},{"t":"revisions after rollback","q":"SchemaService.listSchemaRevisions schemas/readings","a":"OK {schemas}","r":"c","k":"answer"},{"t":"delete revision","q":"SchemaService.deleteSchemaRevision schemas/readings","a":"NOT_FOUND: Schema revision not found","r":"c","k":"answer"},{"t":"delete revision at name","q":"SchemaService.deleteSchemaRevision schemas/readings@{{revisionId:commit}}","a":"OK {definition, name, revisionCreateTime, revisionId, …}","r":"c","k":"answer"},{"t":"delete revision missing","q":"SchemaService.deleteSchemaRevision schemas/readings","a":"NOT_FOUND: Schema revision not found","r":"c","k":"answer"},{"t":"revisions after delete","q":"SchemaService.listSchemaRevisions schemas/readings","a":"OK {schemas}","r":"c","k":"answer"},{"t":"delete last revision","q":"SchemaService.deleteSchemaRevision schemas/primitive@{{revisionId:create-primitive}}","a":"INVALID_ARGUMENT: Cannot delete last revision. Please use DeleteSchema.","r":"c","k":"answer"},{"t":"validate ok","q":"SchemaService.validateSchema projects/{project}","a":"OK {}","r":"c","k":"answer"},{"t":"validate bad","q":"SchemaService.validateSchema projects/{project}","a":"INVALID_ARGUMENT: Could not parse schema definition","r":"c","k":"answer"},{"t":"validate no type","q":"SchemaService.validateSchema projects/{project}","a":"INVALID_ARGUMENT: Invalid schema type","r":"c","k":"answer"},{"t":"validate protobuf","q":"SchemaService.validateSchema projects/{project}","a":"UNIMPLEMENTED: Protocol buffer support not implemented in emulator","r":"c","k":"answer"},{"t":"validate message by name","q":"SchemaService.validateMessage schemas/readings","a":"OK {}","r":"c","k":"answer"},{"t":"validate message by name bad","q":"SchemaService.validateMessage schemas/readings","a":"INVALID_ARGUMENT: Could not parse JSON Avro message","r":"c","k":"answer"},{"t":"validate message by schema","q":"SchemaService.validateMessage projects/{project}","a":"OK {}","r":"c","k":"answer"},{"t":"validate message binary","q":"SchemaService.validateMessage projects/{project}","a":"OK {}","r":"c","k":"answer"},{"t":"validate message binary bad","q":"SchemaService.validateMessage projects/{project}","a":"INVALID_ARGUMENT: Could not parse binary Avro message","r":"c","k":"answer"},{"t":"validate message no encoding","q":"SchemaService.validateMessage projects/{project}","a":"INVALID_ARGUMENT: No encoding provided.","r":"c","k":"answer"},{"t":"validate message no schema","q":"SchemaService.validateMessage projects/{project}","a":"INVALID_ARGUMENT: Invalid schema type","r":"c","k":"answer"},{"t":"validate message missing schema","q":"SchemaService.validateMessage schemas/missing-schema","a":"NOT_FOUND: Schema not found","r":"c","k":"answer"},{"t":"validate message at revision","q":"SchemaService.validateMessage schemas/readings@{{revisionId:create}}","a":"OK {}","r":"c","k":"answer"},{"t":"delete","q":"SchemaService.deleteSchema schemas/readings","a":"OK {}","r":"c","k":"answer"},{"t":"delete again","q":"SchemaService.deleteSchema schemas/readings","a":"NOT_FOUND: Schema not found","r":"c","k":"answer"},{"t":"get deleted","q":"SchemaService.getSchema schemas/readings","a":"NOT_FOUND: Schema not found","r":"c","k":"answer"},{"t":"list after delete","q":"SchemaService.listSchemas projects/{project}","a":"OK {schemas}","r":"c","k":"answer"},{"t":"create","q":"POST /v1/projects/{project}/schemas?schemaId=readings","a":"200 {definition, name, revisionCreateTime, revisionId, …}","r":"c","k":"answer"},{"t":"create duplicate","q":"POST /v1/projects/{project}/schemas?schemaId=readings","a":"409 ALREADY_EXISTS: Schema already exists","r":"c","k":"answer"},{"t":"create no id","q":"POST /v1/projects/{project}/schemas","a":"400 INVALID_ARGUMENT: Invalid [schemas] name: (name=projects/{project}/schemas/)","r":"c","k":"answer"},{"t":"create invalid","q":"POST /v1/projects/{project}/schemas?schemaId=broken","a":"400 INVALID_ARGUMENT: Could not parse schema definition","r":"c","k":"answer"},{"t":"create protobuf","q":"POST /v1/projects/{project}/schemas?schemaId=proto","a":"501 UNIMPLEMENTED: Protocol buffer support not implemented in emulator","r":"c","k":"answer"},{"t":"get","q":"GET /v1/projects/{project}/schemas/readings","a":"200 {definition, name, revisionCreateTime, revisionId, …}","r":"c","k":"answer"},{"t":"get basic","q":"GET /v1/projects/{project}/schemas/readings?view=BASIC","a":"200 {name, revisionCreateTime, revisionId, type}","r":"c","k":"answer"},{"t":"get missing","q":"GET /v1/projects/{project}/schemas/missing-schema","a":"404 NOT_FOUND: Schema not found","r":"c","k":"answer"},{"t":"list","q":"GET /v1/projects/{project}/schemas","a":"200 {schemas}","r":"c","k":"answer"},{"t":"list full","q":"GET /v1/projects/{project}/schemas?view=FULL","a":"200 {schemas}","r":"c","k":"answer"},{"t":"commit","q":"POST /v1/projects/{project}/schemas/readings:commit","a":"200 {definition, name, revisionCreateTime, revisionId, …}","r":"c","k":"answer"},{"t":"revisions","q":"GET /v1/projects/{project}/schemas/readings:listRevisions","a":"200 {schemas}","r":"c","k":"answer"},{"t":"revisions basic","q":"GET /v1/projects/{project}/schemas/readings:listRevisions?view=BASIC","a":"200 {schemas}","r":"c","k":"answer"},{"t":"get at revision","q":"GET /v1/projects/{project}/schemas/readings@{{revisionId:create}}","a":"200 {definition, name, revisionCreateTime, revisionId, …}","r":"c","k":"answer"},{"t":"rollback","q":"POST /v1/projects/{project}/schemas/readings:rollback","a":"200 {definition, name, revisionCreateTime, revisionId, …}","r":"c","k":"answer"},{"t":"delete revision","q":"DELETE /v1/projects/{project}/schemas/readings@{{revisionId:commit}}:deleteRevision","a":"200 {definition, name, revisionCreateTime, revisionId, …}","r":"c","k":"answer"},{"t":"delete revision query","q":"DELETE /v1/projects/{project}/schemas/readings:deleteRevision?revisionId={{revisionId:rollback}}","a":"404 NOT_FOUND: Schema revision not found","r":"c","k":"answer"},{"t":"revisions after","q":"GET /v1/projects/{project}/schemas/readings:listRevisions","a":"200 {schemas}","r":"c","k":"answer"},{"t":"validate","q":"POST /v1/projects/{project}/schemas:validate","a":"200 {}","r":"c","k":"answer"},{"t":"validate bad","q":"POST /v1/projects/{project}/schemas:validate","a":"400 INVALID_ARGUMENT: Could not parse schema definition","r":"c","k":"answer"},{"t":"validate message","q":"POST /v1/projects/{project}/schemas:validateMessage","a":"200 {}","r":"c","k":"answer"},{"t":"validate message bad","q":"POST /v1/projects/{project}/schemas:validateMessage","a":"400 INVALID_ARGUMENT: Could not parse JSON Avro message","r":"c","k":"answer"},{"t":"delete","q":"DELETE /v1/projects/{project}/schemas/readings","a":"200 {}","r":"c","k":"answer"},{"t":"delete again","q":"DELETE /v1/projects/{project}/schemas/readings","a":"404 NOT_FOUND: Schema not found","r":"c","k":"answer"},{"t":"list after","q":"GET /v1/projects/{project}/schemas","a":"200 {}","r":"c","k":"answer"},{"t":"create","q":"SchemaService.createSchema projects/{project}","a":"OK {definition, name, revisionCreateTime, revisionId, …}","r":"c","k":"answer"},{"t":"topic json","q":"Publisher.createTopic topics/readings-json","a":"OK {name, schemaSettings}","r":"c","k":"answer"},{"t":"topic binary","q":"Publisher.createTopic topics/readings-binary","a":"OK {name, schemaSettings}","r":"c","k":"answer"},{"t":"topic no encoding","q":"Publisher.createTopic topics/readings-unspecified","a":"INVALID_ARGUMENT: Invalid schema encoding provided","r":"c","k":"answer"},{"t":"topic missing schema","q":"Publisher.createTopic topics/readings-missing","a":"NOT_FOUND: Schema could not be found","r":"c","k":"answer"},{"t":"topic invalid schema name","q":"Publisher.createTopic topics/readings-invalid","a":"NOT_FOUND: Schema could not be found","r":"c","k":"answer"},{"t":"topic revision range","q":"Publisher.createTopic topics/readings-range","a":"OK {name, schemaSettings}","r":"c","k":"answer"},{"t":"topic bad revision range","q":"Publisher.createTopic topics/readings-bad-range","a":"NOT_FOUND: First revision could not be found","r":"c","k":"answer"},{"t":"sub json","q":"Subscriber.createSubscription topics/readings-json","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"sub binary","q":"Subscriber.createSubscription topics/readings-binary","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"publish json ok","q":"Publisher.publish topics/readings-json","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"publish json bad","q":"Publisher.publish topics/readings-json","a":"INVALID_ARGUMENT: Could not parse message","r":"c","k":"answer"},{"t":"publish json not json","q":"Publisher.publish topics/readings-json","a":"INVALID_ARGUMENT: Could not parse message","r":"c","k":"answer"},{"t":"publish json mixed","q":"Publisher.publish topics/readings-json","a":"INVALID_ARGUMENT: Could not parse message","r":"c","k":"answer"},{"t":"publish json empty data attributes","q":"Publisher.publish topics/readings-json","a":"INVALID_ARGUMENT: Could not parse message","r":"c","k":"answer"},{"t":"publish binary ok","q":"Publisher.publish topics/readings-binary","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"publish binary bad","q":"Publisher.publish topics/readings-binary","a":"INVALID_ARGUMENT: Could not parse message","r":"c","k":"answer"},{"t":"publish unspecified","q":"Publisher.publish topics/readings-unspecified","a":"NOT_FOUND: Topic not found","r":"c","k":"answer"},{"t":"pull json","q":"Subscriber.pull subscriptions/sub-json","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull binary","q":"Subscriber.pull subscriptions/sub-binary","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"get topic","q":"Publisher.getTopic topics/readings-json","a":"OK {name, schemaSettings}","r":"c","k":"answer"},{"t":"update encoding","q":"Publisher.updateTopic topics/readings-json","a":"OK {name, schemaSettings}","r":"c","k":"answer"},{"t":"update clear schema","q":"Publisher.updateTopic topics/readings-json","a":"INVALID_ARGUMENT: No schema name provided","r":"c","k":"answer"},{"t":"publish after clear","q":"Publisher.publish topics/readings-json","a":"INVALID_ARGUMENT: Could not parse message","r":"c","k":"answer"},{"t":"commit","q":"SchemaService.commitSchema schemas/readings","a":"OK {definition, name, revisionCreateTime, revisionId, …}","r":"c","k":"answer"},{"t":"publish after commit","q":"Publisher.publish topics/readings-binary","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"delete schema","q":"SchemaService.deleteSchema schemas/readings","a":"OK {}","r":"c","k":"answer"},{"t":"publish after schema delete","q":"Publisher.publish topics/readings-binary","a":"NOT_FOUND: Schema associated with topic deleted.","r":"c","k":"answer"},{"t":"get topic after schema delete","q":"Publisher.getTopic topics/readings-binary","a":"OK {name, schemaSettings}","r":"c","k":"answer"},{"t":"publish http json bad","q":"POST /v1/projects/{project}/topics/readings-range:publish","a":"404 NOT_FOUND: Schema associated with topic deleted.","r":"c","k":"answer"},{"t":"topic","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"sub","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"get topic","q":"IAMPolicy.getIamPolicy topics/orders","a":"UNIMPLEMENTED","r":"c","k":"answer"},{"t":"set topic","q":"IAMPolicy.setIamPolicy topics/orders","a":"UNIMPLEMENTED","r":"c","k":"answer"},{"t":"test topic","q":"IAMPolicy.testIamPermissions topics/orders","a":"UNIMPLEMENTED","r":"c","k":"answer"},{"t":"get subscription","q":"IAMPolicy.getIamPolicy subscriptions/sub-a","a":"UNIMPLEMENTED","r":"c","k":"answer"},{"t":"get missing","q":"IAMPolicy.getIamPolicy topics/missing-topic","a":"UNIMPLEMENTED","r":"c","k":"answer"},{"t":"get topic http","q":"GET /v1/projects/{project}/topics/orders:getIamPolicy","a":"501 UNIMPLEMENTED","r":"c","k":"answer"},{"t":"set topic http","q":"POST /v1/projects/{project}/topics/orders:setIamPolicy","a":"501 UNIMPLEMENTED","r":"c","k":"answer"},{"t":"test topic http","q":"POST /v1/projects/{project}/topics/orders:testIamPermissions","a":"501 UNIMPLEMENTED","r":"c","k":"answer"},{"t":"get subscription http","q":"GET /v1/projects/{project}/subscriptions/sub-a:getIamPolicy","a":"501 UNIMPLEMENTED","r":"c","k":"answer"},{"t":"get schema http","q":"GET /v1/projects/{project}/schemas/x:getIamPolicy","a":"400 INVALID_ARGUMENT: Invalid [schemas] name: (name=projects/{project}/schemas/x:getIamPolicy)","r":"c","k":"answer"},{"t":"put topic","q":"PUT /v1/projects/{project}/topics/orders","a":"200 {name}","r":"c","k":"answer"},{"t":"root","q":"GET /","a":"200 Ok","r":"c","k":"answer"},{"t":"v1 root","q":"GET /v1","a":"404 Not Found","r":"c","k":"answer"},{"t":"projects","q":"GET /v1/projects","a":"404 Not Found","r":"c","k":"answer"},{"t":"project","q":"GET /v1/projects/{project}","a":"404 Not Found","r":"c","k":"answer"},{"t":"unknown collection","q":"GET /v1/projects/{project}/nothing","a":"404 Not Found","r":"c","k":"answer"},{"t":"unknown verb","q":"POST /v1/projects/{project}/topics/orders:frobnicate","a":"404 Not Found","r":"c","k":"answer"},{"t":"post topic","q":"POST /v1/projects/{project}/topics/orders","a":"404 Not Found","r":"c","k":"answer"},{"t":"get publish","q":"GET /v1/projects/{project}/topics/orders:publish","a":"400 INVALID_ARGUMENT: Invalid [topics] name: (name=projects/{project}/topics/orders:publish)","r":"c","k":"answer"},{"t":"put publish","q":"PUT /v1/projects/{project}/topics/orders:publish","a":"400 INVALID_ARGUMENT: Payload isn't valid for request.","r":"c","k":"answer"},{"t":"delete publish","q":"DELETE /v1/projects/{project}/topics/orders:publish","a":"400 INVALID_ARGUMENT: Invalid [topics] name: (name=projects/{project}/topics/orders:publish)","r":"c","k":"answer"},{"t":"trailing slash","q":"GET /v1/projects/{project}/topics/orders/","a":"404 Not Found","r":"c","k":"answer"},{"t":"double slash","q":"GET /v1//projects/{project}/topics/orders","a":"404 Not Found","r":"c","k":"answer"},{"t":"encoded colon","q":"POST /v1/projects/{project}/topics/orders%3Apublish","a":"200 {messageIds}","r":"c","k":"answer"},{"t":"query alt","q":"GET /v1/projects/{project}/topics/orders?alt=json","a":"200 {name}","r":"c","k":"answer"},{"t":"query pretty","q":"GET /v1/projects/{project}/topics/orders?prettyPrint=false","a":"200 {name}","r":"c","k":"answer"},{"t":"query unknown","q":"GET /v1/projects/{project}/topics/orders?bogus=1","a":"200 {name}","r":"c","k":"answer"},{"t":"v2","q":"GET /v2/projects/{project}/topics/orders","a":"404 Not Found (Unsupported API version \"v2\")","r":"c","k":"answer"},{"t":"no version","q":"GET /projects/{project}/topics/orders","a":"404 Not Found","r":"c","k":"answer"},{"t":"head","q":"HEAD /v1/projects/{project}/topics/orders","a":"404 (empty body)","r":"c","k":"answer"},{"t":"options","q":"OPTIONS /v1/projects/{project}/topics/orders","a":"200","r":"c","k":"answer"},{"t":"bad json","q":"PUT /v1/projects/{project}/topics/broken","a":"400 INVALID_ARGUMENT: Payload isn't valid for request.","r":"c","k":"answer"},{"t":"json array","q":"PUT /v1/projects/{project}/topics/broken","a":"400 INVALID_ARGUMENT: Payload isn't valid for request.","r":"c","k":"answer"},{"t":"json string","q":"PUT /v1/projects/{project}/topics/broken","a":"400 INVALID_ARGUMENT: Payload isn't valid for request.","r":"c","k":"answer"},{"t":"empty body","q":"PUT /v1/projects/{project}/topics/emptybody","a":"200 {name}","r":"c","k":"answer"},{"t":"unknown field","q":"PUT /v1/projects/{project}/topics/unknown-field","a":"400 INVALID_ARGUMENT: Payload isn't valid for request.","r":"c","k":"answer"},{"t":"wrong type","q":"PUT /v1/projects/{project}/topics/wrong-type","a":"400 INVALID_ARGUMENT: Payload isn't valid for request.","r":"c","k":"answer"},{"t":"snake case field","q":"PUT /v1/projects/{project}/topics/snake","a":"200 {messageRetentionDuration, name}","r":"c","k":"answer"},{"t":"get snake","q":"GET /v1/projects/{project}/topics/snake","a":"200 {messageRetentionDuration, name}","r":"c","k":"answer"},{"t":"int as string","q":"PUT /v1/projects/{project}/subscriptions/sub-int","a":"200 {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"bool as string","q":"PUT /v1/projects/{project}/subscriptions/sub-bool","a":"200 {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"null field","q":"PUT /v1/projects/{project}/subscriptions/sub-null","a":"200 {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"duration fraction","q":"PUT /v1/projects/{project}/subscriptions/sub-fraction","a":"200 {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"duration no unit","q":"PUT /v1/projects/{project}/subscriptions/sub-no-unit","a":"400 INVALID_ARGUMENT: Payload isn't valid for request.","r":"c","k":"answer"},{"t":"enum unknown","q":"POST /v1/projects/{project}/schemas?schemaId=enum-unknown","a":"400 INVALID_ARGUMENT: Payload isn't valid for request.","r":"c","k":"answer"},{"t":"timestamp seek","q":"POST /v1/projects/{project}/subscriptions/sub-int:seek","a":"400 INVALID_ARGUMENT: Payload isn't valid for request.","r":"c","k":"answer"},{"t":"bytes invalid","q":"POST /v1/projects/{project}/topics/orders:publish","a":"400 INVALID_ARGUMENT: Payload isn't valid for request.","r":"c","k":"answer"},{"t":"URL-safe base64","q":"POST /v1/projects/{project}/topics/orders:publish","a":"200 {messageIds}","r":"c","k":"answer"},{"t":"bytes unpadded","q":"POST /v1/projects/{project}/topics/orders:publish","a":"200 {messageIds}","r":"c","k":"answer"},{"t":"content type text","q":"PUT /v1/projects/{project}/topics/text-body","a":"200 {name}","r":"c","k":"answer"},{"t":"topic","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"other topic","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"list a","q":"Publisher.listTopics projects/{project}","a":"OK {topics}","r":"c","k":"answer"},{"t":"list b","q":"Publisher.listTopics projects/{project}","a":"OK {topics}","r":"c","k":"answer"},{"t":"cross subscription","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"local subscription","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"publish","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"pull cross","q":"Subscriber.pull subscriptions/cross","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull local","q":"Subscriber.pull subscriptions/local","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"list subs a","q":"Subscriber.listSubscriptions projects/{project}","a":"OK {subscriptions}","r":"c","k":"answer"},{"t":"list subs b","q":"Subscriber.listSubscriptions projects/{project}","a":"OK {subscriptions}","r":"c","k":"answer"},{"t":"topic subscriptions","q":"Publisher.listTopicSubscriptions topics/orders","a":"OK {subscriptions}","r":"c","k":"answer"},{"t":"get other","q":"Publisher.getTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"delete other","q":"Publisher.deleteTopic topics/orders","a":"OK {}","r":"c","k":"answer"},{"t":"get local after","q":"Publisher.getTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"cross snapshot","q":"Subscriber.createSnapshot subscriptions/local","a":"OK {expireTime, name, topic}","r":"c","k":"answer"},{"t":"list snapshots a","q":"Subscriber.listSnapshots projects/{project}","a":"OK {}","r":"c","k":"answer"},{"t":"list snapshots b","q":"Subscriber.listSnapshots projects/{project}","a":"OK {snapshots}","r":"c","k":"answer"},{"t":"topic","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"sub","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, enableExactlyOnceDelivery, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"publish","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"pull","q":"Subscriber.pull subscriptions/exactly-once","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"ack","q":"Subscriber.acknowledge subscriptions/exactly-once","a":"OK {}","r":"c","k":"answer"},{"t":"ack again","q":"Subscriber.acknowledge subscriptions/exactly-once","a":"INVALID_ARGUMENT","r":"c","k":"answer"},{"t":"modify","q":"Subscriber.modifyAckDeadline subscriptions/exactly-once","a":"OK {}","r":"c","k":"answer"},{"t":"stream","q":"Subscriber.streamingPull (stream, 1 write)","a":"OK · 0 messages received","r":"c","k":"answer"},{"t":"pull after","q":"Subscriber.pull subscriptions/exactly-once","a":"OK {}","r":"c","k":"answer"},{"t":"get","q":"Subscriber.getSubscription subscriptions/exactly-once","a":"OK {ackDeadlineSeconds, enableExactlyOnceDelivery, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"topic retained","q":"Publisher.createTopic topics/retained","a":"OK {messageRetentionDuration, name}","r":"c","k":"answer"},{"t":"sub late","q":"Subscriber.createSubscription topics/retained","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"publish before sub","q":"Publisher.publish topics/retained","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"sub after publish","q":"Subscriber.createSubscription topics/retained","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"publish after sub","q":"Publisher.publish topics/retained","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"pull late","q":"Subscriber.pull subscriptions/late","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull after","q":"Subscriber.pull subscriptions/after","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"seek after epoch","q":"Subscriber.seek subscriptions/after","a":"OK {}","r":"c","k":"answer"},{"t":"pull after seek","q":"Subscriber.pull subscriptions/after","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"update retention","q":"Subscriber.updateSubscription subscriptions/late","a":"INVALID_ARGUMENT: message_retention_duration out of bounds","r":"c","k":"answer"},{"t":"get late","q":"Subscriber.getSubscription subscriptions/late","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"t1","q":"PUT /v1/projects/{project}/topics/alpha","a":"200 {name}","r":"c","k":"answer"},{"t":"t2","q":"PUT /v1/projects/{project}/topics/beta","a":"200 {name}","r":"c","k":"answer"},{"t":"t3","q":"PUT /v1/projects/{project}/topics/gamma","a":"200 {name}","r":"c","k":"answer"},{"t":"s1","q":"PUT /v1/projects/{project}/subscriptions/alpha-sub","a":"200 {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"s2","q":"PUT /v1/projects/{project}/subscriptions/beta-sub","a":"200 {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"s3","q":"PUT /v1/projects/{project}/subscriptions/gamma-sub","a":"200 {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"snap1","q":"PUT /v1/projects/{project}/snapshots/alpha-snap","a":"200 {expireTime, name, topic}","r":"c","k":"answer"},{"t":"snap2","q":"PUT /v1/projects/{project}/snapshots/beta-snap","a":"200 {expireTime, name, topic}","r":"c","k":"answer"},{"t":"sch1","q":"POST /v1/projects/{project}/schemas?schemaId=alpha-schema","a":"200 {definition, name, revisionCreateTime, revisionId, …}","r":"c","k":"answer"},{"t":"sch2","q":"POST /v1/projects/{project}/schemas?schemaId=beta-schema","a":"200 {definition, name, revisionCreateTime, revisionId, …}","r":"c","k":"answer"},{"t":"topics 1","q":"GET /v1/projects/{project}/topics?pageSize=2","a":"200 {topics}","r":"c","k":"answer"},{"t":"topics 2","q":"GET /v1/projects/{project}/topics?pageSize=2&pageToken=projects%{project}%2Ftopics%2Fgamma","a":"200 {topics}","r":"c","k":"answer"},{"t":"topics negative","q":"GET /v1/projects/{project}/topics?pageSize=-5","a":"200 {topics}","r":"c","k":"answer"},{"t":"subs 1","q":"GET /v1/projects/{project}/subscriptions?pageSize=2","a":"200 {subscriptions}","r":"c","k":"answer"},{"t":"subs 2","q":"GET /v1/projects/{project}/subscriptions?pageSize=2&pageToken=projects%{project}%2Fsubscriptions%2Fgamma-sub","a":"200 {subscriptions}","r":"c","k":"answer"},{"t":"topic subs 1","q":"GET /v1/projects/{project}/topics/alpha/subscriptions?pageSize=1","a":"200 {subscriptions}","r":"c","k":"answer"},{"t":"topic subs 2","q":"GET /v1/projects/{project}/topics/alpha/subscriptions?pageSize=1&pageToken=projects%{project}%2Fsubscriptions%2Fbeta-sub","a":"200 {subscriptions}","r":"c","k":"answer"},{"t":"snapshots 1","q":"GET /v1/projects/{project}/snapshots?pageSize=1","a":"200 {snapshots}","r":"c","k":"answer"},{"t":"snapshots 2","q":"GET /v1/projects/{project}/snapshots?pageSize=1&pageToken=projects%{project}%2Fsnapshots%2Fbeta-snap","a":"200 {snapshots}","r":"c","k":"answer"},{"t":"topic snapshots","q":"GET /v1/projects/{project}/topics/alpha/snapshots?pageSize=1","a":"200 {snapshots}","r":"c","k":"answer"},{"t":"schemas 1","q":"GET /v1/projects/{project}/schemas?pageSize=1&view=BASIC","a":"200 {schemas}","r":"c","k":"answer"},{"t":"schemas 2","q":"GET /v1/projects/{project}/schemas?pageSize=1&pageToken=projects%{project}%2Fschemas%2Fbeta-schema","a":"200 {schemas}","r":"c","k":"answer"},{"t":"topic","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"sub a","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"sub b","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"publish","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"sub late","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"publish later","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"pull a","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull b","q":"Subscriber.pull subscriptions/sub-b","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull late","q":"Subscriber.pull subscriptions/sub-late","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"ack a one","q":"Subscriber.acknowledge subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"nack b one","q":"Subscriber.modifyAckDeadline subscriptions/sub-b","a":"OK {}","r":"c","k":"answer"},{"t":"pull a again","q":"Subscriber.pull subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"pull b again","q":"Subscriber.pull subscriptions/sub-b","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"delete b","q":"Subscriber.deleteSubscription subscriptions/sub-b","a":"OK {}","r":"c","k":"answer"},{"t":"publish after delete","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"pull a final","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull late final","q":"Subscriber.pull subscriptions/sub-late","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"list","q":"Subscriber.listSubscriptions projects/{project}","a":"OK {subscriptions}","r":"c","k":"answer"},{"t":"topic","q":"PUT /v1/projects/{project}/topics/orders","a":"200 {name}","r":"c","k":"answer"},{"t":"dead letter topic","q":"PUT /v1/projects/{project}/topics/dead-letters","a":"200 {name}","r":"c","k":"answer"},{"t":"dlq sub","q":"PUT /v1/projects/{project}/subscriptions/dlq-sub","a":"200 {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"sub","q":"PUT /v1/projects/{project}/subscriptions/sub-a","a":"200 {ackDeadlineSeconds, deadLetterPolicy, filter, messageRetentionDuration, …}","r":"c","k":"answer"},{"t":"sub bad filter","q":"PUT /v1/projects/{project}/subscriptions/sub-b","a":"500 UNKNOWN: Application error processing RPC","r":"c","k":"answer"},{"t":"sub few attempts","q":"PUT /v1/projects/{project}/subscriptions/sub-c","a":"400 OUT_OF_RANGE: The value for max_delivery_attempts is too small. You passed 2 in the request, but the minimum value is 5.","r":"c","k":"answer"},{"t":"sub dlq missing","q":"PUT /v1/projects/{project}/subscriptions/sub-d","a":"404 NOT_FOUND: Dead letter topic not found","r":"c","k":"answer"},{"t":"publish","q":"POST /v1/projects/{project}/topics/orders:publish","a":"200 {messageIds}","r":"c","k":"answer"},{"t":"attempt 1","q":"POST /v1/projects/{project}/subscriptions/sub-a:pull","a":"200 {receivedMessages}","r":"c","k":"answer"},{"t":"nack 1","q":"POST /v1/projects/{project}/subscriptions/sub-a:modifyAckDeadline","a":"200 {}","r":"c","k":"answer"},{"t":"attempt 2","q":"POST /v1/projects/{project}/subscriptions/sub-a:pull","a":"200 {receivedMessages}","r":"c","k":"answer"},{"t":"nack 2","q":"POST /v1/projects/{project}/subscriptions/sub-a:modifyAckDeadline","a":"200 {}","r":"c","k":"answer"},{"t":"attempt 3","q":"POST /v1/projects/{project}/subscriptions/sub-a:pull","a":"200 {receivedMessages}","r":"c","k":"answer"},{"t":"nack 3","q":"POST /v1/projects/{project}/subscriptions/sub-a:modifyAckDeadline","a":"200 {}","r":"c","k":"answer"},{"t":"attempt 4","q":"POST /v1/projects/{project}/subscriptions/sub-a:pull","a":"200 {receivedMessages}","r":"c","k":"answer"},{"t":"nack 4","q":"POST /v1/projects/{project}/subscriptions/sub-a:modifyAckDeadline","a":"200 {}","r":"c","k":"answer"},{"t":"attempt 5","q":"POST /v1/projects/{project}/subscriptions/sub-a:pull","a":"200 {receivedMessages}","r":"c","k":"answer"},{"t":"nack 5","q":"POST /v1/projects/{project}/subscriptions/sub-a:modifyAckDeadline","a":"200 {}","r":"c","k":"answer"},{"t":"attempt 6","q":"POST /v1/projects/{project}/subscriptions/sub-a:pull","a":"200 {}","r":"c","k":"answer"},{"t":"dead letters","q":"POST /v1/projects/{project}/subscriptions/dlq-sub:pull","a":"200 {receivedMessages}","r":"c","k":"answer"},{"t":"delete topic","q":"DELETE /v1/projects/{project}/topics/orders","a":"200 {}","r":"c","k":"answer"},{"t":"get sub after topic delete","q":"GET /v1/projects/{project}/subscriptions/sub-a","a":"200 {ackDeadlineSeconds, deadLetterPolicy, filter, messageRetentionDuration, …}","r":"c","k":"answer"},{"t":"publish deleted","q":"POST /v1/projects/{project}/topics/orders:publish","a":"404 NOT_FOUND: Topic not found","r":"c","k":"answer"},{"t":"snapshot of deleted topic sub","q":"PUT /v1/projects/{project}/snapshots/orphan","a":"200 {expireTime, name, topic}","r":"c","k":"answer"},{"t":"topic","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"publish before sub","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"push sub","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"no backfill","q":"push endpoint: wait up to 600 ms for 0 or more pushes","a":"0 distinct pushes received","r":"c","k":"behaviour"},{"t":"publish shapes","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"pushed shapes","q":"push endpoint: wait up to 3000 ms for 3 or more pushes","a":"3 distinct pushes received","r":"c","k":"behaviour"},{"t":"update to pull","q":"Subscriber.updateSubscription subscriptions/push-sub","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"publish pull mode","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"no push in pull mode","q":"push endpoint: wait up to 600 ms for 0 or more pushes","a":"0 distinct pushes received","r":"c","k":"behaviour"},{"t":"pull in pull mode","q":"Subscriber.pull subscriptions/push-sub","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"ack pull mode","q":"Subscriber.acknowledge subscriptions/push-sub","a":"OK {}","r":"c","k":"answer"},{"t":"update to push","q":"Subscriber.updateSubscription subscriptions/push-sub","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"publish push mode","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"pushed with attributes","q":"push endpoint: wait up to 3000 ms for 1 or more pushes","a":"1 distinct push received","r":"c","k":"behaviour"},{"t":"delete sub","q":"Subscriber.deleteSubscription subscriptions/push-sub","a":"OK {}","r":"c","k":"answer"},{"t":"publish after delete","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"no push after delete","q":"push endpoint: wait up to 600 ms for 0 or more pushes","a":"0 distinct pushes received","r":"c","k":"behaviour"},{"t":"push sub again","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"no push for earlier","q":"push endpoint: wait up to 600 ms for 0 or more pushes","a":"0 distinct pushes received","r":"c","k":"behaviour"},{"t":"delete topic","q":"Publisher.deleteTopic topics/orders","a":"OK {}","r":"c","k":"answer"},{"t":"get after topic delete","q":"Subscriber.getSubscription subscriptions/push-sub","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"topic","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"sub","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"other","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"publish","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"stream a","q":"Subscriber.streamingPull (stream, 1 write)","a":"OK · 2 messages received","r":"c","k":"answer"},{"t":"acknowledging sub-a's ids on sub-b's stream","q":"Subscriber.streamingPull (stream, 2 writes)","a":"INVALID_ARGUMENT: Subscription projects/{project}/subscriptions/sub-b received an invalid ack ID projects/{project}/subscriptions/sub-a:1,…","r":"c","k":"answer"},{"t":"ack by pull path","q":"Subscriber.acknowledge subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"modify by pull path","q":"Subscriber.modifyAckDeadline subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"pull after","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull b","q":"Subscriber.pull subscriptions/sub-b","a":"OK {}","r":"c","k":"answer"},{"t":"modifying a pull ack id from a stream","q":"Subscriber.streamingPull (stream, 1 write)","a":"OK · 1 message received","r":"c","k":"answer"},{"t":"pull final","q":"Subscriber.pull subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"create full","q":"PUT /v1/projects/{project}/topics/full","a":"200 {kmsKeyName, labels, messageRetentionDuration, messageStoragePolicy, …}","r":"c","k":"answer"},{"t":"get full","q":"GET /v1/projects/{project}/topics/full","a":"200 {kmsKeyName, labels, messageRetentionDuration, messageStoragePolicy, …}","r":"c","k":"answer"},{"t":"create schema missing","q":"PUT /v1/projects/{project}/topics/with-schema","a":"404 NOT_FOUND: Schema could not be found","r":"c","k":"answer"},{"t":"create schema","q":"POST /v1/projects/{project}/schemas?schemaId=readings","a":"200 {definition, name, revisionCreateTime, revisionId, …}","r":"c","k":"answer"},{"t":"create with schema","q":"PUT /v1/projects/{project}/topics/with-schema","a":"200 {name, schemaSettings}","r":"c","k":"answer"},{"t":"publish schema ok","q":"POST /v1/projects/{project}/topics/with-schema:publish","a":"200 {messageIds}","r":"c","k":"answer"},{"t":"publish schema bad","q":"POST /v1/projects/{project}/topics/with-schema:publish","a":"400 INVALID_ARGUMENT: Could not parse message","r":"c","k":"answer"},{"t":"patch mask in body and query","q":"PATCH /v1/projects/{project}/topics/full?updateMask=message_retention_duration","a":"400 INVALID_ARGUMENT: Invalid update_mask provided in the UpdateTopicRequest: labels is not a known Topic field. Note that field paths must…","r":"c","k":"answer"},{"t":"patch schema","q":"PATCH /v1/projects/{project}/topics/full","a":"200 {kmsKeyName, labels, messageRetentionDuration, messageStoragePolicy, …}","r":"c","k":"answer"},{"t":"patch unknown field","q":"PATCH /v1/projects/{project}/topics/full","a":"400 INVALID_ARGUMENT: Invalid update_mask provided in the UpdateTopicRequest: bogus is not a known Topic field. Note that field paths must…","r":"c","k":"answer"},{"t":"patch missing","q":"PATCH /v1/projects/{project}/topics/missing-topic","a":"404 NOT_FOUND: Topic not found.","r":"c","k":"answer"},{"t":"get after patch","q":"GET /v1/projects/{project}/topics/full","a":"200 {kmsKeyName, labels, messageRetentionDuration, messageStoragePolicy, …}","r":"c","k":"answer"},{"t":"sub","q":"PUT /v1/projects/{project}/subscriptions/full-sub","a":"200 {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"delete topic","q":"DELETE /v1/projects/{project}/topics/full","a":"200 {}","r":"c","k":"answer"},{"t":"get sub","q":"GET /v1/projects/{project}/subscriptions/full-sub","a":"200 {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"topic subscriptions deleted","q":"GET /v1/projects/{project}/topics/full/subscriptions","a":"200 {}","r":"c","k":"answer"},{"t":"delete schema","q":"DELETE /v1/projects/{project}/schemas/readings","a":"200 {}","r":"c","k":"answer"},{"t":"get with schema after","q":"GET /v1/projects/{project}/topics/with-schema","a":"200 {name, schemaSettings}","r":"c","k":"answer"},{"t":"topic","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"detached","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, detached, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"attached","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"expiring","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, expirationPolicy, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"expiring short","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, expirationPolicy, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"expiring zero","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, expirationPolicy, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"never expiring","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, expirationPolicy, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"publish","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"pull detached","q":"Subscriber.pull subscriptions/detached","a":"FAILED_PRECONDITION: Subscription is detached.","r":"c","k":"answer"},{"t":"pull attached","q":"Subscriber.pull subscriptions/attached","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull expiring short","q":"Subscriber.pull subscriptions/expiring-short","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"get detached","q":"Subscriber.getSubscription subscriptions/detached","a":"OK {ackDeadlineSeconds, detached, messageRetentionDuration, name, …}","r":"c","k":"answer"},{"t":"topic subscriptions","q":"Publisher.listTopicSubscriptions topics/orders","a":"OK {subscriptions}","r":"c","k":"answer"},{"t":"attach","q":"Subscriber.updateSubscription subscriptions/detached","a":"INVALID_ARGUMENT: Invalid update_mask provided in the UpdateSubscriptionRequest: the detached field in the Subscription is not mutable.","r":"c","k":"answer"},{"t":"update expiration never","q":"Subscriber.updateSubscription subscriptions/expiring","a":"INVALID_ARGUMENT: Updating the expiration_policy field is currently unsupported in the Pub/Sub Emulator.","r":"c","k":"answer"},{"t":"update expiration ttl","q":"Subscriber.updateSubscription subscriptions/never","a":"INVALID_ARGUMENT: Updating the expiration_policy field is currently unsupported in the Pub/Sub Emulator.","r":"c","k":"answer"},{"t":"list","q":"Subscriber.listSubscriptions projects/{project}","a":"OK {subscriptions}","r":"c","k":"answer"},{"t":"topic","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"other topic","q":"Publisher.createTopic topics/other","a":"OK {name}","r":"c","k":"answer"},{"t":"sub a","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"sub b","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"sub other","q":"Subscriber.createSubscription topics/other","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"publish 1","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"pull a","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"ack a one","q":"Subscriber.acknowledge subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"snapshot","q":"Subscriber.createSnapshot subscriptions/sub-a","a":"OK {expireTime, name, topic}","r":"c","k":"answer"},{"t":"ack a two","q":"Subscriber.acknowledge subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"publish 2","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"pull a three","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"ack a three","q":"Subscriber.acknowledge subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"seek a","q":"Subscriber.seek subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"pull a after seek","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull b before seek","q":"Subscriber.pull subscriptions/sub-b","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"ack b all","q":"Subscriber.acknowledge subscriptions/sub-b","a":"OK {}","r":"c","k":"answer"},{"t":"seek b","q":"Subscriber.seek subscriptions/sub-b","a":"OK {}","r":"c","k":"answer"},{"t":"pull b after seek","q":"Subscriber.pull subscriptions/sub-b","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"seek other topic","q":"Subscriber.seek subscriptions/sub-other","a":"FAILED_PRECONDITION: The subscription's topic projects/{project}/topics/other is different from that of the snapshot projects/{project}/top…","r":"c","k":"answer"},{"t":"snapshot other topic name clash","q":"Subscriber.createSnapshot subscriptions/sub-other","a":"ALREADY_EXISTS: Snapshot already exists","r":"c","k":"answer"},{"t":"get","q":"Subscriber.getSnapshot snapshots/snap","a":"OK {expireTime, name, topic}","r":"c","k":"answer"},{"t":"topic snapshots","q":"Publisher.listTopicSnapshots topics/orders","a":"OK {snapshots}","r":"c","k":"answer"},{"t":"other topic snapshots","q":"Publisher.listTopicSnapshots topics/other","a":"OK {}","r":"c","k":"answer"},{"t":"delete topic","q":"Publisher.deleteTopic topics/orders","a":"OK {}","r":"c","k":"answer"},{"t":"get after topic delete","q":"Subscriber.getSnapshot snapshots/snap","a":"OK {expireTime, name, topic}","r":"c","k":"answer"},{"t":"seek after topic delete","q":"Subscriber.seek subscriptions/sub-a","a":"FAILED_PRECONDITION: The subscription's topic _deleted-topic_ is different from that of the snapshot projects/{project}/topics/orders; they…","r":"c","k":"answer"},{"t":"list","q":"Subscriber.listSnapshots projects/{project}","a":"OK {snapshots}","r":"c","k":"answer"},{"t":"topic","q":"Publisher.createTopic topics/orders","a":"OK {name}","r":"c","k":"answer"},{"t":"sub","q":"Subscriber.createSubscription topics/orders","a":"OK {ackDeadlineSeconds, messageRetentionDuration, name, pushConfig, …}","r":"c","k":"answer"},{"t":"publish","q":"Publisher.publish topics/orders","a":"OK {messageIds}","r":"c","k":"answer"},{"t":"pull","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"shorten to one second","q":"Subscriber.modifyAckDeadline subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"extend second","q":"Subscriber.modifyAckDeadline subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"mixed ids","q":"Subscriber.modifyAckDeadline subscriptions/sub-a","a":"INVALID_ARGUMENT: Invalid ack id (ack_id=garbage)","r":"c","k":"answer"},{"t":"pull after short lease","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"pull after default","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"ack everything seen","q":"Subscriber.acknowledge subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"pull after extension","q":"Subscriber.pull subscriptions/sub-a","a":"OK {receivedMessages}","r":"c","k":"answer"},{"t":"ack last","q":"Subscriber.acknowledge subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"},{"t":"pull empty","q":"Subscriber.pull subscriptions/sub-a","a":"OK {}","r":"c","k":"answer"}]} \ No newline at end of file diff --git a/public/conformance/storage-rules.json b/public/conformance/storage-rules.json new file mode 100644 index 0000000..0dfad42 --- /dev/null +++ b/public/conformance/storage-rules.json @@ -0,0 +1 @@ +{"runs":[[0,68,0,"resource fields and types"],[68,38,0,"request resource fields and types"],[106,18,0,"null resource per method"],[124,20,0,"request method strings"],[144,40,0,"request path segments and bindings"],[184,10,0,"request time"],[194,27,0,"request auth shapes"],[221,27,0,"firestore get and exists"],[248,32,0,"match patterns"],[280,23,0,"functions and let"],[303,2,0,"resource fields and types"],[305,1,0,"request resource fields and types"],[306,7,1,"allow get admits metadata and media reads only"],[313,6,1,"allow list admits list on root and prefixes only"],[319,5,1,"allow create admits uploads, including uploads over an existing object"],[324,5,1,"allow update admits metadata PATCH but not an upload over an existing object"],[329,4,1,"allow delete admits deletes; a missing object is 404 after the rules pass"],[333,6,1,"allow read, write admits every operation"],[339,4,1,"a ruleset without rules_version = '2' loads, admits get, and denies list"],[343,21,1,"request.resource fields for a v0 media upload (no metadata part)"],[364,4,1,"key set, null stored resource, method and path for a create of a new object"],[368,10,1,"request.resource fields for a v0 multipart upload carrying a metadata part"],[378,13,1,"resource and request.resource on a metadata PATCH"],[391,18,1,"resource and request.resource on get, list and delete"],[409,22,1,"media, multipart and resumable uploads are checked once, at finalize, with the received bytes"],[431,7,1,"an upload over an existing object is checked as create with resource set to the stored object"],[438,7,1,"request.auth derivation from the Authorization header"],[445,14,1,"request.auth.token is the raw claim map; custom claims, identities, standard claims, expiry"],[459,14,1,"owner credentials, download tokens and admin-only routes under a deny-all ruleset"],[473,8,1,"the GCS JSON API never consults rules, with or without a user token"],[481,10,1,"firestore.get and firestore.exists read the registered Firestore emulator at request time"],[491,13,1,"the value returned by firestore.get: id, __name__, map shape, path forms"],[504,17,1,"latest-state reads, repeated and many distinct firestore.* accesses in one request, bare get/exists, other methods"],[521,36,1,"single and recursive wildcards, bindings, unicode names, and list prefixes"],[557,13,1,"evaluation errors deny with 403 and the emulator's warning text"],[570,23,1,"/internal/setRules request and response shapes, failure behaviour, multi-bucket targets"],[593,13,1,"resource-keyed rulesets: one file per bucket, unconfigured buckets, one invalid file of several"],[606,28,1,"the consumer's default and assets rulesets verbatim, two targeted buckets"],[634,1,1,"key set, null stored resource, method and path for a create of a new object"],[635,1,1,"resource and request.resource on a metadata PATCH"],[636,2,1,"resource and request.resource on get, list and delete"],[638,1,1,"an upload over an existing object is checked as create with resource set to the stored object"],[639,1,1,"the GCS JSON API never consults rules, with or without a user token"]],"cases":[{"t":"res is map","q":"get: resource is map","a":"ALLOW","r":"c","k":"verdict"},{"t":"res name string","q":"get: resource.name is string && resource.name == 'lang/res-name-string'","a":"ALLOW","r":"c","k":"verdict"},{"t":"res name split","q":"get: resource.name.split('/')[0] == 'lang' && resource.name.split('/').size() == 2","a":"ALLOW","r":"c","k":"verdict"},{"t":"res name matches","q":"get: resource.name.matches('^lang/.*$')","a":"ALLOW","r":"c","k":"verdict"},{"t":"res bucket","q":"get: resource.bucket == bucket && resource.bucket is string","a":"ALLOW","r":"c","k":"verdict"},{"t":"res generation int","q":"get: resource.generation is int && resource.generation > 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"res generation value","q":"get: resource.generation == 1757000000000000","a":"ALLOW","r":"c","k":"verdict"},{"t":"res metageneration","q":"get: resource.metageneration is int && resource.metageneration == 2","a":"ALLOW","r":"c","k":"verdict"},{"t":"res size int","q":"get: resource.size is int","a":"ALLOW","r":"c","k":"verdict"},{"t":"res size limit","q":"get: resource.size < 5 * 1024 * 1024 && resource.size >= 2048","a":"ALLOW","r":"c","k":"verdict"},{"t":"res size arith","q":"get: resource.size / 1024 == 2 && resource.size % 1000 == 48","a":"ALLOW","r":"c","k":"verdict"},{"t":"res size float compare","q":"get: resource.size < 2048.5 && resource.size > 2047.5","a":"ALLOW","r":"c","k":"verdict"},{"t":"res time created ts","q":"get: resource.timeCreated is timestamp","a":"ALLOW","r":"c","k":"verdict"},{"t":"res time created parts","q":"get: resource.timeCreated.year() == 2026 && resource.timeCreated.month() == 1 && resource.timeCreated.day() == 10 && resource.timeCreated.h…","a":"ALLOW","r":"c","k":"verdict"},{"t":"res updated ts","q":"get: resource.updated is timestamp && resource.updated > resource.timeCreated","a":"ALLOW","r":"c","k":"verdict"},{"t":"res updated diff","q":"get: resource.updated - resource.timeCreated == duration.value(49, 'h') + duration.value(30, 'm')","a":"ALLOW","r":"c","k":"verdict"},{"t":"res updated before now","q":"get: resource.updated < request.time && resource.timeCreated < request.time","a":"ALLOW","r":"c","k":"verdict"},{"t":"res time created seconds","q":"get: resource.timeCreated.toMillis() == 1768032000000","a":"ALLOW","r":"c","k":"verdict"},{"t":"res time created string false","q":"get: resource.timeCreated is string","a":"DENY","r":"c","k":"verdict"},{"t":"res md5 string","q":"get: resource.md5Hash is string && resource.md5Hash.size() == 24","a":"ALLOW","r":"c","k":"verdict"},{"t":"res crc32c string","q":"get: resource.crc32c is string && resource.crc32c == 'z8SuHQ=='","a":"ALLOW","r":"c","k":"verdict"},{"t":"res etag string","q":"get: resource.etag is string && resource.etag.size() > 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"res content disposition","q":"get: resource.contentDisposition == 'inline'","a":"ALLOW","r":"c","k":"verdict"},{"t":"res content encoding","q":"get: resource.contentEncoding == 'identity'","a":"ALLOW","r":"c","k":"verdict"},{"t":"res content type matches","q":"get: resource.contentType.matches('image/.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"res content type in","q":"get: resource.contentType in ['image/png', 'image/jpeg']","a":"ALLOW","r":"c","k":"verdict"},{"t":"res content type split","q":"get: resource.contentType.split('/')[1] == 'png'","a":"ALLOW","r":"c","k":"verdict"},{"t":"res metadata map","q":"get: resource.metadata is map && resource.metadata.size() == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"res metadata field","q":"get: resource.metadata.owner == 'alice' && resource.metadata.visibility == 'private'","a":"ALLOW","r":"c","k":"verdict"},{"t":"res metadata string number","q":"get: resource.metadata.version is string && resource.metadata.version == '3' && int(resource.metadata.version) == 3","a":"ALLOW","r":"c","k":"verdict"},{"t":"res metadata in","q":"get: 'owner' in resource.metadata && !('missing' in resource.metadata)","a":"ALLOW","r":"c","k":"verdict"},{"t":"res metadata get default","q":"get: resource.metadata.get('missing', 'fallback') == 'fallback' && resource.metadata.get('owner', 'x') == 'alice'","a":"ALLOW","r":"c","k":"verdict"},{"t":"res metadata keys","q":"get: resource.metadata.keys().hasAll(['owner', 'visibility', 'version'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"res metadata missing error","q":"get: resource.metadata.missing == 'x'","a":"DENY, error: Property missing is undefined on object.","r":"c","k":"verdict"},{"t":"res metadata index","q":"get: resource.metadata['owner'] == 'alice'","a":"ALLOW","r":"c","k":"verdict"},{"t":"res keys","q":"get: resource.keys().hasAll(['name', 'bucket', 'size', 'contentType', 'metadata'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"res keys count","q":"get: resource.keys().size() == 14","a":"ALLOW","r":"c","k":"verdict"},{"t":"res in name","q":"get: 'name' in resource && 'size' in resource","a":"ALLOW","r":"c","k":"verdict"},{"t":"res in missing","q":"get: !('cacheControl' in resource)","a":"ALLOW","r":"c","k":"verdict"},{"t":"res missing field error","q":"get: resource.cacheControl == null","a":"DENY, error: Property cacheControl is undefined on object.","r":"c","k":"verdict"},{"t":"res missing field short circuit","q":"get: !('cacheControl' in resource) || resource.cacheControl == 'no-cache'","a":"ALLOW","r":"c","k":"verdict"},{"t":"res empty metadata","q":"get: resource.metadata is map && resource.metadata.size() == 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"res get default field","q":"get: resource.get('cacheControl', 'none') == 'none' && resource.get('size', 0) == 2048","a":"ALLOW","r":"c","k":"verdict"},{"t":"res equality self","q":"get: resource == resource","a":"ALLOW","r":"c","k":"verdict"},{"t":"res size string coercion","q":"get: string(resource.size) == '2048'","a":"ALLOW","r":"c","k":"verdict"},{"t":"res name hash","q":"get: hashing.sha256(resource.name).toHexString().size() == 64","a":"ALLOW","r":"c","k":"verdict"},{"t":"res name split dot size","q":"get: 'photo.png'.split('.').size() == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"res name split dot first","q":"get: 'photo.png'.split('.')[0] == 'photo.png'","a":"DENY","r":"c","k":"verdict"},{"t":"res name split escaped dot","q":"get: 'photo.png'.split('[.]') == ['photo', 'png']","a":"ALLOW","r":"c","k":"verdict"},{"t":"res name split literal o","q":"get: 'photo.png'.split('o') == ['ph', 't', '.png']","a":"ALLOW","r":"c","k":"verdict"},{"t":"res name split leading","q":"get: 'photo.png'.split('p') == ['', 'hoto.', 'ng']","a":"ALLOW","r":"c","k":"verdict"},{"t":"res name split trailing","q":"get: 'photo.png'.split('g') == ['photo.pn', '']","a":"DENY","r":"c","k":"verdict"},{"t":"res name split class","q":"get: 'a1b22c'.split('[0-9]+') == ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"res name split no match","q":"get: 'photo'.split('x') == ['photo']","a":"ALLOW","r":"c","k":"verdict"},{"t":"res name split empty pattern size","q":"get: 'ab'.split('').size() == 1","a":"DENY","r":"c","k":"verdict"},{"t":"res name split star size","q":"get: 'ab'.split('b*').size() == 1","a":"DENY","r":"c","k":"verdict"},{"t":"res name split slash","q":"get: resource.name.split('/') == ['lang', 'res-name-split-slash']","a":"ALLOW","r":"c","k":"verdict"},{"t":"res name split dotstar size","q":"get: 'photo.png'.split('.*').size() == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"res name split alternation","q":"get: 'a-b_c'.split('-|_') == ['a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"res name split dot value","q":"get: 'photo.png'.split('.') == ['']","a":"ALLOW","r":"c","k":"verdict"},{"t":"res name split empty pattern value","q":"get: 'ab'.split('') == ['', 'a', 'b']","a":"ALLOW","r":"c","k":"verdict"},{"t":"res name split star value","q":"get: 'ab'.split('b*') == ['', 'a']","a":"ALLOW","r":"c","k":"verdict"},{"t":"res name split zero width everywhere","q":"get: 'abc'.split('x*') == ['', 'a', 'b', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"res name split inner empties kept","q":"get: 'a,b,,c,,'.split(',') == ['a', 'b', '', 'c']","a":"ALLOW","r":"c","k":"verdict"},{"t":"res name split only delimiters","q":"get: ',,,'.split(',') == ['']","a":"ALLOW","r":"c","k":"verdict"},{"t":"res name split empty string","q":"get: ''.split(',') == ['']","a":"ALLOW","r":"c","k":"verdict"},{"t":"res name split anchored","q":"get: 'photo.png'.split('^photo') == ['', '.png']","a":"ALLOW","r":"c","k":"verdict"},{"t":"res delete resource","q":"delete: resource.size == 2048 && resource.metadata.owner == request.auth.uid","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr is map","q":"create: request.resource is map","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr name","q":"create: request.resource.name == 'lang/rr-name'","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr name matches","q":"create: request.resource.name.matches('^lang/rr-.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr bucket","q":"create: request.resource.bucket == bucket","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr generation","q":"create: request.resource.generation is int && request.resource.metageneration == 1","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr size int","q":"create: request.resource.size is int && request.resource.size == 4096","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr size limit allow","q":"create: request.resource.size < 5 * 1024 * 1024","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr size limit deny","q":"create: request.resource.size < 1024","a":"DENY","r":"c","k":"verdict"},{"t":"rr time created","q":"create: request.resource.timeCreated is timestamp && request.resource.timeCreated <= request.time","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr updated","q":"create: request.resource.updated == request.resource.timeCreated","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr md5","q":"create: request.resource.md5Hash == '1B2M2Y8AsgTpgAmY7PhCfg=='","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr crc32c","q":"create: request.resource.crc32c is string","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr etag","q":"create: request.resource.etag is string","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr content disposition","q":"create: request.resource.contentDisposition.matches('attachment.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr content encoding","q":"create: request.resource.contentEncoding == 'gzip'","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr content type allow","q":"create: request.resource.contentType.matches('image/.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr content type deny","q":"create: request.resource.contentType.matches('video/.*')","a":"DENY","r":"c","k":"verdict"},{"t":"rr content type in","q":"create: request.resource.contentType in ['image/jpeg', 'image/png']","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr metadata owner","q":"create: request.resource.metadata.owner == request.auth.uid","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr metadata keys","q":"create: request.resource.metadata.keys().hasOnly(['owner', 'visibility'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr metadata missing error","q":"create: request.resource.metadata.version == '3'","a":"DENY, error: Property version is undefined on object.","r":"c","k":"verdict"},{"t":"rr metadata in","q":"create: 'visibility' in request.resource.metadata","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr metadata empty","q":"create: request.resource.metadata.size() == 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr keys count","q":"create: request.resource.keys().size() == 14","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr missing cache control","q":"create: !('cacheControl' in request.resource)","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr update size grew","q":"update: request.resource.size > resource.size","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr update name stable","q":"update: request.resource.name == resource.name && request.resource.bucket == resource.bucket","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr update content type changed","q":"update: request.resource.contentType != resource.contentType","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr update metadata diff","q":"update: request.resource.metadata.diff(resource.metadata).affectedKeys().hasOnly(['visibility', 'version'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr update metadata changed","q":"update: request.resource.metadata.diff(resource.metadata).changedKeys().hasOnly(['visibility'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr update metadata removed","q":"update: request.resource.metadata.diff(resource.metadata).removedKeys().hasOnly(['version'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr update owner locked","q":"update: request.resource.metadata.owner == resource.metadata.owner","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr update generation differs","q":"update: request.resource.generation != resource.generation","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr update updated later","q":"update: request.resource.updated > resource.updated","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr update timestamps","q":"update: request.resource.timeCreated > resource.timeCreated","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr equality","q":"update: request.resource == request.resource && request.resource != resource","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr metadata string only","q":"create: request.resource.metadata.count is string","a":"ALLOW","r":"c","k":"verdict"},{"t":"rr size zero","q":"create: request.resource.size == 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"null get resource present","q":"get: resource != null && resource.size == 2048","a":"ALLOW","r":"c","k":"verdict"},{"t":"null get request resource","q":"get: request.resource == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"null get missing object","q":"get: resource == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"null get missing object field error","q":"get: resource.size == 0","a":"DENY, error: Null value error.","r":"c","k":"verdict"},{"t":"null get missing object guarded","q":"get: resource == null || resource.size == 0","a":"ALLOW","r":"c","k":"verdict"},{"t":"null list both","q":"list: resource == null && request.resource == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"null list field error","q":"list: resource.name == 'x'","a":"DENY, error: Null value error.","r":"c","k":"verdict"},{"t":"null create resource","q":"create: resource == null && request.resource != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"null create resource field error","q":"create: resource.size == 0","a":"DENY, error: Null value error.","r":"c","k":"verdict"},{"t":"null create over existing","q":"create: resource != null && request.resource.generation != resource.generation","a":"ALLOW","r":"c","k":"verdict"},{"t":"null update both","q":"update: resource != null && request.resource != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"null update missing before","q":"update: resource == null && request.resource != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"null delete resource","q":"delete: resource != null && request.resource == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"null delete missing","q":"delete: resource == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"null delete missing field error","q":"delete: resource.metadata.owner == request.auth.uid","a":"DENY, error: Null value error.","r":"c","k":"verdict"},{"t":"null delete request resource error","q":"delete: request.resource.size == 0","a":"DENY, error: Null value error.","r":"c","k":"verdict"},{"t":"null get request resource field error","q":"get: request.resource.name == 'x'","a":"DENY, error: Null value error.","r":"c","k":"verdict"},{"t":"null is null typecheck","q":"get: resource is map && !(request.resource is map)","a":"ALLOW","r":"c","k":"verdict"},{"t":"method get string","q":"get: request.method == 'get'","a":"ALLOW","r":"c","k":"verdict"},{"t":"method get not list","q":"get: request.method != 'list'","a":"ALLOW","r":"c","k":"verdict"},{"t":"method list string","q":"list: request.method == 'list'","a":"ALLOW","r":"c","k":"verdict"},{"t":"method create string","q":"create: request.method == 'create'","a":"ALLOW","r":"c","k":"verdict"},{"t":"method update string","q":"update: request.method == 'update'","a":"ALLOW","r":"c","k":"verdict"},{"t":"method delete string","q":"delete: request.method == 'delete'","a":"ALLOW","r":"c","k":"verdict"},{"t":"method in list","q":"update: request.method in ['create', 'update']","a":"ALLOW","r":"c","k":"verdict"},{"t":"method is string","q":"delete: request.method is string && request.method.size() == 6","a":"ALLOW","r":"c","k":"verdict"},{"t":"method read covers get","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"method read covers list","q":"list: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"method get excludes list","q":"list: true","a":"DENY (evaluation error)","r":"c","k":"verdict"},{"t":"method list excludes get","q":"get: true","a":"DENY (evaluation error)","r":"c","k":"verdict"},{"t":"method write covers create","q":"create: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"method write covers update","q":"update: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"method write covers delete","q":"delete: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"method create excludes update","q":"update: true","a":"DENY (evaluation error)","r":"c","k":"verdict"},{"t":"method update excludes delete","q":"delete: true","a":"DENY (evaluation error)","r":"c","k":"verdict"},{"t":"method read excludes write","q":"create: true","a":"DENY (evaluation error)","r":"c","k":"verdict"},{"t":"method comma list","q":"delete: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"method multiple allows or","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"path is path","q":"get: request.path is path","a":"ALLOW","r":"c","k":"verdict"},{"t":"path index 0","q":"get: request.path[0] == 'b'","a":"ALLOW","r":"c","k":"verdict"},{"t":"path index 1 bucket","q":"get: request.path[1] == bucket && request.path[1] == 'corpus'","a":"ALLOW","r":"c","k":"verdict"},{"t":"path index 2","q":"get: request.path[2] == 'o'","a":"ALLOW","r":"c","k":"verdict"},{"t":"path index 3","q":"get: request.path[3] == 'lang'","a":"ALLOW","r":"c","k":"verdict"},{"t":"path index 4","q":"get: request.path[4] == 'path-index-4'","a":"ALLOW","r":"c","k":"verdict"},{"t":"path index out of range","q":"get: request.path[5] == 'x'","a":"DENY, error: Index out of bound error. Index: [5] , size: [5].","r":"c","k":"verdict"},{"t":"path equality","q":"get: request.path == /b/corpus/o/lang/path-equality","a":"ALLOW","r":"c","k":"verdict"},{"t":"path inequality","q":"get: request.path != /b/corpus/o/lang/other","a":"ALLOW","r":"c","k":"verdict"},{"t":"path interpolated equality","q":"get: request.path == /b/$(bucket)/o/lang/$(request.path[4])","a":"ALLOW","r":"c","k":"verdict"},{"t":"path slice tail","q":"get: request.path[3:5] == /lang/path-slice-tail","a":"ALLOW","r":"c","k":"verdict"},{"t":"path slice head","q":"get: request.path[0:3] == /b/corpus/o","a":"ALLOW","r":"c","k":"verdict"},{"t":"path string coercion","q":"get: string(request.path) == '/b/corpus/o/lang/path-string-coercion'","a":"ALLOW","r":"c","k":"verdict"},{"t":"path string contains","q":"get: string(request.path).matches('.*/lang/.*')","a":"ALLOW","r":"c","k":"verdict"},{"t":"path bucket binding type","q":"get: bucket is string && bucket == 'corpus'","a":"ALLOW","r":"c","k":"verdict"},{"t":"path single wildcard bind","q":"get: name == 'path-single-wildcard-bind' && name is string","a":"ALLOW","r":"c","k":"verdict"},{"t":"path single wildcard no deep match","q":"get: true","a":"DENY","r":"c","k":"verdict"},{"t":"path recursive bind path","q":"get: allPaths is path && allPaths == /deep/x/path-recursive-bind-path","a":"DENY","r":"c","k":"verdict"},{"t":"path recursive bind index","q":"get: allPaths[0] == 'deep'","a":"DENY","r":"c","k":"verdict"},{"t":"path recursive single segment","q":"get: allPaths == /deep/path-recursive-single-segment","a":"DENY","r":"c","k":"verdict"},{"t":"path recursive string compare","q":"get: string(allPaths) == '/deep/z/path-recursive-string-compare'","a":"DENY","r":"c","k":"verdict"},{"t":"path root recursive","q":"get: allPaths[0] == 'anywhere'","a":"ALLOW","r":"c","k":"verdict"},{"t":"path unicode name","q":"get: name == '火🔥.txt'","a":"ALLOW","r":"c","k":"verdict"},{"t":"path space name","q":"get: name == 'has space.txt' && name.size() == 14","a":"DENY","r":"c","k":"verdict"},{"t":"path dot segment literal","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"path user scoped allow","q":"get: request.auth.uid == uid","a":"ALLOW","r":"c","k":"verdict"},{"t":"path user scoped deny","q":"get: request.auth.uid == uid","a":"DENY","r":"c","k":"verdict"},{"t":"path binding in list","q":"get: bucket in ['corpus', 'other']","a":"ALLOW","r":"c","k":"verdict"},{"t":"path path in list","q":"get: request.path in [/b/corpus/o/lang/path-path-in-list, /b/corpus/o/lang/other]","a":"ALLOW","r":"c","k":"verdict"},{"t":"path size not a function","q":"get: request.path.size() == 5","a":"DENY, error: Function not found error: Name: [size].","r":"c","k":"verdict"},{"t":"path index string error","q":"get: request.path['b'] == 'b'","a":"DENY, error: Property b is undefined on object.","r":"c","k":"verdict"},{"t":"path binding concat","q":"get: bucket + '-suffix' == 'corpus-suffix'","a":"ALLOW","r":"c","k":"verdict"},{"t":"path wildcard name with dot","q":"get: name.split('.')[1] == 'png'","a":"DENY, error: Index out of bound error. Index: [1] , size: [1].","r":"c","k":"verdict"},{"t":"path recursive tail excludes prefix","q":"get: allPaths == /p/path-recursive-tail-excludes-prefix","a":"ALLOW","r":"c","k":"verdict"},{"t":"path recursive tail index","q":"get: allPaths[0] == 'q'","a":"ALLOW","r":"c","k":"verdict"},{"t":"path recursive tail single","q":"get: allPaths == /path-recursive-tail-single","a":"ALLOW","r":"c","k":"verdict"},{"t":"path recursive tail string","q":"get: string(allPaths) == '/r/path-recursive-tail-string'","a":"ALLOW","r":"c","k":"verdict"},{"t":"path space name size","q":"get: name == 'has space.txt' && name.size() == 13","a":"ALLOW","r":"c","k":"verdict"},{"t":"path wildcard split regex escaped","q":"get: name.split('[.]')[1] == 'png'","a":"ALLOW","r":"c","k":"verdict"},{"t":"path unknown variable is null","q":"get: nosuchvariable == null","a":"DENY, error: Null value error.","r":"c","k":"verdict"},{"t":"time is timestamp","q":"get: request.time is timestamp","a":"ALLOW","r":"c","k":"verdict"},{"t":"time year","q":"get: request.time.year() == 2026 && request.time.month() == 1 && request.time.day() == 15","a":"ALLOW","r":"c","k":"verdict"},{"t":"time clock","q":"get: request.time.hours() == 12 && request.time.minutes() == 34 && request.time.seconds() == 56","a":"ALLOW","r":"c","k":"verdict"},{"t":"time nanos","q":"get: request.time.nanos() == 123456789","a":"ALLOW","r":"c","k":"verdict"},{"t":"time millis","q":"get: request.time.toMillis() == 1768480496123","a":"ALLOW","r":"c","k":"verdict"},{"t":"time day of week","q":"get: request.time.dayOfWeek() == 4 && request.time.dayOfYear() == 15","a":"ALLOW","r":"c","k":"verdict"},{"t":"time compare date","q":"get: request.time > timestamp.date(2026, 1, 1) && request.time < timestamp.date(2027, 1, 1)","a":"ALLOW","r":"c","k":"verdict"},{"t":"time plus duration","q":"get: request.time + duration.value(1, 'h') > request.time","a":"ALLOW","r":"c","k":"verdict"},{"t":"time minus created","q":"get: request.time - resource.timeCreated > duration.value(5, 'd')","a":"ALLOW","r":"c","k":"verdict"},{"t":"time string form","q":"get: string(request.time) is string","a":"DENY, error: Unsupported operation error. Received: string(timestamp). Expected: string(int), string(float), string(null), string(string),…","r":"c","k":"verdict"},{"t":"auth null","q":"get: request.auth == null","a":"ALLOW","r":"c","k":"verdict"},{"t":"auth null uid error","q":"get: request.auth.uid == 'alice'","a":"DENY, error: Null value error.","r":"c","k":"verdict"},{"t":"auth null guarded","q":"get: request.auth != null && request.auth.uid == 'alice'","a":"DENY","r":"c","k":"verdict"},{"t":"auth null or","q":"get: request.auth == null || request.auth.uid == 'alice'","a":"ALLOW","r":"c","k":"verdict"},{"t":"auth present","q":"get: request.auth != null","a":"ALLOW","r":"c","k":"verdict"},{"t":"auth uid","q":"get: request.auth.uid == 'alice' && request.auth.uid is string","a":"ALLOW","r":"c","k":"verdict"},{"t":"auth uid matches token sub","q":"get: request.auth.uid == request.auth.token.sub && request.auth.uid == request.auth.token.user_id","a":"ALLOW","r":"c","k":"verdict"},{"t":"auth token map","q":"get: request.auth.token is map","a":"ALLOW","r":"c","k":"verdict"},{"t":"auth token email","q":"get: request.auth.token.email == 'alice@example.test' && request.auth.token.email_verified == true","a":"ALLOW","r":"c","k":"verdict"},{"t":"auth token email domain","q":"get: request.auth.token.email.matches('.*@example[.]test$')","a":"ALLOW","r":"c","k":"verdict"},{"t":"auth token custom claim false","q":"get: request.auth.token.admin == true","a":"DENY","r":"c","k":"verdict"},{"t":"auth token custom claim true","q":"get: request.auth.token.admin == true","a":"ALLOW","r":"c","k":"verdict"},{"t":"auth token custom claim string","q":"get: request.auth.token.plan == 'pro' && request.auth.token.quota >= 5","a":"ALLOW","r":"c","k":"verdict"},{"t":"auth token missing claim error","q":"get: request.auth.token.missing == true","a":"DENY, error: Property missing is undefined on object.","r":"c","k":"verdict"},{"t":"auth token missing claim in","q":"get: !('missing' in request.auth.token)","a":"ALLOW","r":"c","k":"verdict"},{"t":"auth token get default","q":"get: request.auth.token.get('missing', false) == false","a":"ALLOW","r":"c","k":"verdict"},{"t":"auth token provider","q":"get: request.auth.token.firebase.sign_in_provider == 'password'","a":"ALLOW","r":"c","k":"verdict"},{"t":"auth token identities","q":"get: request.auth.token.firebase.identities.email[0] == 'alice@example.test'","a":"ALLOW","r":"c","k":"verdict"},{"t":"auth token identities keys","q":"get: request.auth.token.firebase.identities.keys().hasOnly(['email'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"auth token issuer","q":"get: request.auth.token.iss == 'https://securetoken.google.com/{project}' && request.auth.token.aud == '{project}'","a":"ALLOW","r":"c","k":"verdict"},{"t":"auth token iat exp","q":"get: request.auth.token.iat is int && request.auth.token.exp > request.auth.token.iat","a":"ALLOW","r":"c","k":"verdict"},{"t":"auth admin uid","q":"get: request.auth.uid == 'admin-user' && request.auth.token.firebase.sign_in_provider == 'custom'","a":"ALLOW","r":"c","k":"verdict"},{"t":"auth admin no email","q":"get: !('email' in request.auth.token)","a":"ALLOW","r":"c","k":"verdict"},{"t":"auth uid binding","q":"get: request.auth.uid == uid","a":"ALLOW","r":"c","k":"verdict"},{"t":"auth owner or admin","q":"get: request.auth.uid == resource.metadata.owner || request.auth.token.admin == true","a":"ALLOW","r":"c","k":"verdict"},{"t":"auth in list","q":"get: request.auth.uid in ['alice', 'bob']","a":"ALLOW","r":"c","k":"verdict"},{"t":"auth token keys count","q":"get: request.auth.token.keys().size() == 12","a":"ALLOW","r":"c","k":"verdict"},{"t":"fs get data bool","q":"get: firestore.get(/databases/(default)/documents/users/alice).data.admin == true","a":"ALLOW","r":"c","k":"verdict"},{"t":"fs get data string","q":"get: firestore.get(/databases/(default)/documents/users/alice).data.plan == 'pro'","a":"ALLOW","r":"c","k":"verdict"},{"t":"fs get data int","q":"get: firestore.get(/databases/(default)/documents/users/alice).data.limit > resource.size / 1024","a":"ALLOW","r":"c","k":"verdict"},{"t":"fs get data list","q":"get: firestore.get(/databases/(default)/documents/users/alice).data.tags.hasAny(['b'])","a":"ALLOW","r":"c","k":"verdict"},{"t":"fs get data map","q":"get: firestore.get(/databases/(default)/documents/users/alice).data is map","a":"ALLOW","r":"c","k":"verdict"},{"t":"fs get data missing field error","q":"get: firestore.get(/databases/(default)/documents/users/alice).data.missing == true","a":"DENY, error: Property missing is undefined on object.","r":"c","k":"verdict"},{"t":"fs get data in","q":"get: 'admin' in firestore.get(/databases/(default)/documents/users/alice).data","a":"ALLOW","r":"c","k":"verdict"},{"t":"fs get id","q":"get: firestore.get(/databases/(default)/documents/users/alice).id == 'alice'","a":"ALLOW","r":"c","k":"verdict"},{"t":"fs get name","q":"get: firestore.get(/databases/(default)/documents/users/alice).__name__ == /databases/(default)/documents/users/alice","a":"ALLOW","r":"c","k":"verdict"},{"t":"fs get interpolated uid","q":"get: firestore.get(/databases/(default)/documents/users/$(request.auth.uid)).data.admin == true","a":"ALLOW","r":"c","k":"verdict"},{"t":"fs get interpolated bucket","q":"get: firestore.get(/databases/(default)/documents/buckets/$(bucket)).data.open == true","a":"ALLOW","r":"c","k":"verdict"},{"t":"fs get interpolated binding","q":"get: firestore.get(/databases/(default)/documents/objects/$(name)).data.public == true","a":"ALLOW","r":"c","k":"verdict"},{"t":"fs get undefined error","q":"get: firestore.get(/databases/(default)/documents/users/alice).data.admin == true","a":"DENY, error: Service call error. Function: [firestore.get], Argument: [path_value { segments { simple: \"databases\" } segments { simple: \"(d…","r":"c","k":"verdict"},{"t":"fs get wrong path unmocked","q":"get: firestore.get(/databases/(default)/documents/users/bob).data.admin == true","a":"DENY, error: Service call error. Function: [firestore.get], Argument: [path_value { segments { simple: \"databases\" } segments { simple: \"(d…","r":"c","k":"verdict"},{"t":"fs exists true","q":"get: firestore.exists(/databases/(default)/documents/users/alice)","a":"ALLOW","r":"c","k":"verdict"},{"t":"fs exists false","q":"get: firestore.exists(/databases/(default)/documents/users/alice)","a":"DENY","r":"c","k":"verdict"},{"t":"fs exists negated","q":"get: !firestore.exists(/databases/(default)/documents/users/alice)","a":"ALLOW","r":"c","k":"verdict"},{"t":"fs exists interpolated","q":"get: firestore.exists(/databases/(default)/documents/users/$(request.auth.uid))","a":"ALLOW","r":"c","k":"verdict"},{"t":"fs get and exists","q":"get: firestore.exists(/databases/(default)/documents/users/alice) && firestore.get(/databases/(default)/documents/users/alice).data.admin =…","a":"ALLOW","r":"c","k":"verdict"},{"t":"fs get short circuit","q":"get: request.auth.token.admin == true || firestore.get(/databases/(default)/documents/users/alice).data.admin == true","a":"ALLOW","r":"c","k":"verdict"},{"t":"fs get no mock error","q":"get: firestore.get(/databases/(default)/documents/users/alice).data.admin == true","a":"DENY, error: Function not found error: Name: [firestore.get].","r":"c","k":"verdict"},{"t":"fs exists no mock error","q":"get: firestore.exists(/databases/(default)/documents/users/alice)","a":"DENY, error: Function not found error: Name: [firestore.exists].","r":"c","k":"verdict"},{"t":"fs get named database","q":"get: firestore.get(/databases/secondary/documents/users/alice).data.admin == true","a":"ALLOW","r":"c","k":"verdict"},{"t":"fs get nested map","q":"get: firestore.get(/databases/(default)/documents/users/alice).data.profile.role == 'editor'","a":"ALLOW","r":"c","k":"verdict"},{"t":"fs get list index","q":"get: firestore.get(/databases/(default)/documents/users/alice).data.tags[1] == 'b'","a":"ALLOW","r":"c","k":"verdict"},{"t":"fs bare get unavailable","q":"get: get(/databases/(default)/documents/users/alice).data.admin == true","a":"DENY, error: Function not found error: Name: [get].","r":"c","k":"verdict"},{"t":"fs bare exists unavailable","q":"get: exists(/databases/(default)/documents/users/alice)","a":"DENY, error: Function not found error: Name: [exists].","r":"c","k":"verdict"},{"t":"match nested literal","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"match nested wildcard inherits","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"match parent does not cover child","q":"get: true","a":"DENY (evaluation error)","r":"c","k":"verdict"},{"t":"match overlapping allows or","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"match recursive and single both","q":"get: true","a":"DENY","r":"c","k":"verdict"},{"t":"match recursive deep in nested","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"match no match denies","q":"get: true","a":"DENY (evaluation error)","r":"c","k":"verdict"},{"t":"match literal case sensitive","q":"get: true","a":"DENY (evaluation error)","r":"c","k":"verdict"},{"t":"match error in one allow other allows","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"match error only allow denies","q":"get: true","a":"DENY, error: Property missing is undefined on object.","r":"c","k":"verdict"},{"t":"match non boolean condition","q":"get: true","a":"DENY, error: Type error. Received: [int] Expected: [bool].","r":"c","k":"verdict"},{"t":"match wildcard then literal","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"match bucket wildcard other bucket","q":"get: bucket == 'other-bucket'","a":"ALLOW","r":"c","k":"verdict"},{"t":"match list on prefix","q":"list: true","a":"DENY","r":"c","k":"verdict"},{"t":"match list on root","q":"list: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"match recursive tail and single","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"match list on prefix tail","q":"list: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"list single wildcard exact path","q":"list: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"list single wildcard longer path","q":"list: true","a":"DENY","r":"c","k":"verdict"},{"t":"list recursive shorter path unbound wildcard","q":"list: true","a":"DENY","r":"c","k":"verdict"},{"t":"list recursive shorter path unbound wildcard null","q":"list: true","a":"DENY","r":"c","k":"verdict"},{"t":"list recursive shorter path unbound wildcard access","q":"list: true","a":"DENY","r":"c","k":"verdict"},{"t":"list recursive zero segments true","q":"list: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"list recursive zero segments binding is path","q":"list: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"list recursive zero segments binding null","q":"list: true","a":"DENY","r":"c","k":"verdict"},{"t":"list recursive one segment index","q":"list: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"list literal then wildcards partial","q":"list: true","a":"DENY","r":"c","k":"verdict"},{"t":"list literal then wildcards partial unbound","q":"list: true","a":"DENY","r":"c","k":"verdict"},{"t":"get recursive zero segments","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"get recursive zero segments null","q":"get: true","a":"DENY","r":"c","k":"verdict"},{"t":"get single wildcard shorter path","q":"get: true","a":"DENY (evaluation error)","r":"c","k":"verdict"},{"t":"list recursive zero segments resource null","q":"list: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"fn service level","q":"get: isOwner()","a":"ALLOW","r":"c","k":"verdict"},{"t":"fn service level with args","q":"get: sizeUnder(3000)","a":"ALLOW","r":"c","k":"verdict"},{"t":"fn match level","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"fn let binding","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"fn path argument","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"fn resource argument","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"fn request resource argument","q":"create: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"fn calls function","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"fn firestore in function","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"fn error propagates","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"fn let shadow binding","q":"get: true","a":"ALLOW","r":"c","k":"verdict"},{"t":"fn service level inherits binding","q":"get: bucketIs('corpus')","a":"DENY, error: Null value error.","r":"c","k":"verdict"},{"t":"fn error left or true inline","q":"get: resource.metadata.missing == 'x' || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"fn error left or false inline","q":"get: resource.metadata.missing == 'x' || false","a":"DENY, error: Property missing is undefined on object.","r":"c","k":"verdict"},{"t":"fn error left and false inline","q":"get: resource.metadata.missing == 'x' && false","a":"DENY","r":"c","k":"verdict"},{"t":"fn error left and true inline","q":"get: resource.metadata.missing == 'x' && true","a":"DENY, error: Property missing is undefined on object.","r":"c","k":"verdict"},{"t":"fn error right or true inline","q":"get: false || resource.metadata.missing == 'x'","a":"DENY, error: Property missing is undefined on object.","r":"c","k":"verdict"},{"t":"fn error both or","q":"get: resource.metadata.missing == 'x' || resource.metadata.other == 'y'","a":"DENY, error: Property missing is undefined on object.","r":"c","k":"verdict"},{"t":"fn error left and false function","q":"get: true","a":"DENY","r":"c","k":"verdict"},{"t":"fn error not","q":"get: !(resource.metadata.missing == 'x') || true","a":"ALLOW","r":"c","k":"verdict"},{"t":"fn error in ternary like or","q":"get: (resource.metadata.missing == 'x' || true) && resource.size == 2048","a":"ALLOW","r":"c","k":"verdict"},{"t":"fn error nested and or","q":"get: (resource.metadata.missing == 'x' && true) || resource.size == 2048","a":"ALLOW","r":"c","k":"verdict"},{"t":"fn service level unknown binding null","q":"get: bucketIsNull()","a":"DENY, error: Null value error.","r":"c","k":"verdict"},{"t":"res cache control present","q":"get: resource.cacheControl == 'public, max-age=60'","a":"ALLOW","r":"d","k":"verdict","w":"the Storage runtime's object has fourteen keys and no cacheControl or contentLanguage, so Firenook denies with an error where production allowed a supplied resource that had them"},{"t":"res content language present","q":"get: resource.contentLanguage == 'ja'","a":"ALLOW","r":"d","k":"verdict","w":"the Storage runtime's object has fourteen keys and no cacheControl or contentLanguage, so Firenook denies with an error where production allowed a supplied resource that had them"},{"t":"rr cache control present","q":"create: request.resource.cacheControl == 'no-store'","a":"ALLOW","r":"d","k":"verdict","w":"the Storage runtime's object has fourteen keys and no cacheControl or contentLanguage, so Firenook denies with an error where production allowed a supplied resource that had them"},{"t":"owner bypass seed","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=m%2Fget.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"get metadata","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/m%2Fget.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"get media","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/m%2Fget.txt?alt=media","a":"200 {byteLength, sha256, utf8}","r":"c","k":"status"},{"t":"list denied","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?prefix=m%2F&delimiter=%2F","a":"403 Permission denied. No LIST permission.","r":"c","k":"error"},{"t":"patch denied","q":"PATCH /v0/b/demo-synthetic-app.appspot.com/o/m%2Fget.txt","a":"403 Permission denied. No WRITE permission.","r":"c","k":"error"},{"t":"delete denied","q":"DELETE /v0/b/demo-synthetic-app.appspot.com/o/m%2Fget.txt","a":"403 Permission denied. No WRITE permission.","r":"c","k":"error"},{"t":"create denied","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=m%2Fnew.txt","a":"403 Permission denied. No WRITE permission.","r":"c","k":"error"},{"t":"owner bypass seed","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=l%2Fone.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"list root","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?delimiter=%2F","a":"200 {prefixes, items}","r":"c","k":"status"},{"t":"list prefix","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?prefix=l%2F&delimiter=%2F","a":"200 {prefixes, items}","r":"c","k":"status"},{"t":"list prefix no delimiter","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?prefix=l%2F","a":"200 {prefixes, items}","r":"c","k":"status"},{"t":"prefix without trailing slash","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?prefix=l","a":"400 The prefix parameter is required to be empty or ends with a single / character.","r":"c","k":"error"},{"t":"get denied","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/l%2Fone.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"create new","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=c%2Fnew.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"create over existing","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=c%2Fnew.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"patch denied","q":"PATCH /v0/b/demo-synthetic-app.appspot.com/o/c%2Fnew.txt","a":"403 Permission denied. No WRITE permission.","r":"c","k":"error"},{"t":"delete denied","q":"DELETE /v0/b/demo-synthetic-app.appspot.com/o/c%2Fnew.txt","a":"403 Permission denied. No WRITE permission.","r":"c","k":"error"},{"t":"get denied","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/c%2Fnew.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"owner bypass seed","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=u%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"patch allowed","q":"PATCH /v0/b/demo-synthetic-app.appspot.com/o/u%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"upload over existing denied","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=u%2Fobj.txt","a":"403 Permission denied. No WRITE permission.","r":"c","k":"error"},{"t":"delete denied","q":"DELETE /v0/b/demo-synthetic-app.appspot.com/o/u%2Fobj.txt","a":"403 Permission denied. No WRITE permission.","r":"c","k":"error"},{"t":"patch missing object","q":"PATCH /v0/b/demo-synthetic-app.appspot.com/o/u%2Fmissing.txt","a":"404 Not Found","r":"c","k":"status"},{"t":"owner bypass seed","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=d%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"get denied","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/d%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"delete allowed","q":"DELETE /v0/b/demo-synthetic-app.appspot.com/o/d%2Fobj.txt","a":"204","r":"c","k":"status"},{"t":"delete missing","q":"DELETE /v0/b/demo-synthetic-app.appspot.com/o/d%2Fobj.txt","a":"404 Not Found","r":"c","k":"status"},{"t":"create","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=rw%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"get","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/rw%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"list","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?prefix=rw%2F&delimiter=%2F","a":"200 {prefixes, items}","r":"c","k":"status"},{"t":"patch","q":"PATCH /v0/b/demo-synthetic-app.appspot.com/o/rw%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"delete","q":"DELETE /v0/b/demo-synthetic-app.appspot.com/o/rw%2Fobj.txt","a":"204","r":"c","k":"status"},{"t":"anonymous get missing","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/rw%2Fobj.txt","a":"404 Not Found","r":"c","k":"status"},{"t":"owner bypass seed","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=v1%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"get","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/v1%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"list denied","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?prefix=v1%2F&delimiter=%2F","a":"403 Permission denied. No LIST permission.","r":"c","k":"error"},{"t":"create","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=v1%2Fnew.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"size","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=rr%2Fsize.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"size is int","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=rr%2Fsize-int.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"content type defaulted","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=rr%2Fct.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"content type header ignored","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=rr%2Fct2.txt","a":"403 Permission denied. No WRITE permission.","r":"c","k":"error"},{"t":"name","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=rr%2Fname.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"bucket","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=rr%2Fbucket.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"generation int","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=rr%2Fgen.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"metageneration one","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=rr%2Fmetagen.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"time created timestamp","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=rr%2Ftc.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"updated equals created","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=rr%2Fupd.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"md5 base64","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=rr%2Fmd5.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"crc32c string","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=rr%2Fcrc.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"etag string","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=rr%2Fetag.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"metadata empty map","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=rr%2Fmeta.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"download token not in metadata","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=rr%2Ftoken.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"content disposition null","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=rr%2Fcd.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"content disposition in","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=rr%2Fcd2.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"content encoding null","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=rr%2Fce.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"cache control absent","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=rr%2Fcc.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"cache control access error","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=rr%2Fcc2.txt","a":"403 Permission denied. No WRITE permission.","r":"c","k":"error"},{"t":"content language absent","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=rr%2Fcl.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"keys count","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=rr%2Fkeys.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"resource null for new","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=rr%2Fresnull.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"path segments","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=rr%2Fpath.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"empty body size zero","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=rr%2Fempty.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"content type from metadata","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=mp%2Fct.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"custom metadata","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=mp%2Fmeta.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"custom metadata strings","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=mp%2Fmeta-types.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"content disposition","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=mp%2Fcd.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"content encoding","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=mp%2Fce.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"cache control not exposed","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=mp%2Fcc.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"content language not exposed","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=mp%2Fcl.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"name from metadata","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=mp%2Fnamed.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"size of part","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=mp%2Fsize.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"download token in metadata stripped","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=mp%2Ftok.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"owner bypass seed","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=up%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"before content type","q":"PATCH /v0/b/demo-synthetic-app.appspot.com/o/up%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"after content type","q":"PATCH /v0/b/demo-synthetic-app.appspot.com/o/up%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"after metadata merged","q":"PATCH /v0/b/demo-synthetic-app.appspot.com/o/up%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"after metadata removed","q":"PATCH /v0/b/demo-synthetic-app.appspot.com/o/up%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"after metageneration increment","q":"PATCH /v0/b/demo-synthetic-app.appspot.com/o/up%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"after updated later","q":"PATCH /v0/b/demo-synthetic-app.appspot.com/o/up%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"size and hashes stable","q":"PATCH /v0/b/demo-synthetic-app.appspot.com/o/up%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"content type null removes","q":"PATCH /v0/b/demo-synthetic-app.appspot.com/o/up%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"after cache control not exposed","q":"PATCH /v0/b/demo-synthetic-app.appspot.com/o/up%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"metadata diff","q":"PATCH /v0/b/demo-synthetic-app.appspot.com/o/up%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"denied patch leaves object","q":"PATCH /v0/b/demo-synthetic-app.appspot.com/o/up%2Fobj.txt","a":"403 Permission denied. No WRITE permission.","r":"c","k":"error"},{"t":"final metadata","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/up%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"owner bypass seed","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=gl%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"get request resource null","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/gl%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"get request resource field error","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/gl%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"get resource fields","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/gl%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"get resource timestamps","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/gl%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"get resource typed","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/gl%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"list both null","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?prefix=gl%2F&delimiter=%2F","a":"200 {prefixes, items}","r":"c","k":"status"},{"t":"list resource field error","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?prefix=gl%2F&delimiter=%2F","a":"403 Permission denied. No LIST permission.","r":"c","k":"error"},{"t":"list path prefix without slash","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?prefix=gl%2F&delimiter=%2F","a":"200 {prefixes, items}","r":"c","k":"status"},{"t":"list path root","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?delimiter=%2F","a":"200 {prefixes, items}","r":"c","k":"status"},{"t":"list path nested prefix","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?prefix=gl%2Fdeeper%2F&delimiter=%2F","a":"200 {prefixes, items}","r":"c","k":"status"},{"t":"list root matches recursive zero segments","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?delimiter=%2F","a":"200 {prefixes, items}","r":"c","k":"status"},{"t":"delete resource present","q":"DELETE /v0/b/demo-synthetic-app.appspot.com/o/gl%2Fobj.txt","a":"204","r":"c","k":"status"},{"t":"delete missing resource null","q":"DELETE /v0/b/demo-synthetic-app.appspot.com/o/gl%2Fobj.txt","a":"404 Not Found","r":"c","k":"status"},{"t":"delete missing field error","q":"DELETE /v0/b/demo-synthetic-app.appspot.com/o/gl%2Fobj.txt","a":"403 Permission denied. No WRITE permission.","r":"c","k":"error"},{"t":"get missing resource null","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/gl%2Fobj.txt","a":"404 Not Found","r":"c","k":"status"},{"t":"get missing field error","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/gl%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"get missing allowed","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/gl%2Fobj.txt","a":"404 Not Found","r":"c","k":"status"},{"t":"media denied octet stream","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=res%2Fmedia.txt","a":"403 Permission denied. No WRITE permission.","r":"c","k":"error"},{"t":"multipart allowed","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=res%2Fmp.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"multipart denied too large","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=res%2Fmp-large.txt","a":"403 Permission denied. No WRITE permission.","r":"c","k":"error"},{"t":"resumable start","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=res%2Fresumable.txt","a":"200 OK","r":"c","k":"status"},{"t":"resumable upload chunk","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=res%2Fresumable.txt&upload_id=&upload_protocol=resumable","a":"200 OK","r":"c","k":"status"},{"t":"resumable query","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=res%2Fresumable.txt&upload_id=&upload_protocol=resumable","a":"200 OK","r":"c","k":"status"},{"t":"resumable finalize allowed","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=res%2Fresumable.txt&upload_id=&upload_protocol=resumable","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"resumable large start","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=res%2Flarge.txt","a":"200 OK","r":"c","k":"status"},{"t":"resumable large upload","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=res%2Flarge.txt&upload_id=&upload_protocol=resumable","a":"200 OK","r":"c","k":"status"},{"t":"resumable large finalize denied","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=res%2Flarge.txt&upload_id=&upload_protocol=resumable","a":"403 Permission denied. No WRITE permission.","r":"c","k":"error"},{"t":"resumable large query after denial","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=res%2Flarge.txt&upload_id=&upload_protocol=resumable","a":"200 OK","r":"c","k":"status"},{"t":"resumable large finalize again","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=res%2Flarge.txt&upload_id=&upload_protocol=resumable","a":"403 Forbidden","r":"c","k":"status"},{"t":"resumable large object absent","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/res%2Flarge.txt","a":"404 Not Found","r":"c","k":"status"},{"t":"resumable anonymous start not checked","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=res%2Fanon.txt","a":"200 OK","r":"c","k":"status"},{"t":"resumable anonymous finalize denied","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=res%2Fanon.txt&upload_id=&upload_protocol=resumable","a":"403 Permission denied. No WRITE permission.","r":"c","k":"error"},{"t":"resumable auth captured at start","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=res%2Fauth-start.txt","a":"200 OK","r":"c","k":"status"},{"t":"the emulator stores the start authorization on the upload","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=res%2Fauth-start.txt&upload_id=&upload_protocol=resumable","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"resumable cancel","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=res%2Fcancel.txt","a":"200 OK","r":"c","k":"status"},{"t":"resumable cancel command","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=res%2Fcancel.txt&upload_id=&upload_protocol=resumable","a":"200 OK","r":"c","k":"status"},{"t":"resumable cancelled finalize","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=res%2Fcancel.txt&upload_id=&upload_protocol=resumable","a":"400 Bad Request","r":"c","k":"status"},{"t":"gcs resumable not checked","q":"POST /upload/storage/v1/b/demo-synthetic-app.appspot.com/o?uploadType=resumable&name=res%2Fgcs.txt","a":"200 OK","r":"c","k":"status"},{"t":"gcs resumable finalize bypasses rules","q":"PUT /upload/storage/v1/b/demo-synthetic-app.appspot.com/o?name=res%2Fgcs.txt&uploadType=resumable&upload_id=","a":"200 storage#object","r":"c","k":"status"},{"t":"first upload","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=ov%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"overwrite denied resource present","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=ov%2Fobj.txt","a":"403 Permission denied. No WRITE permission.","r":"c","k":"error"},{"t":"overwrite denied under update only","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=ov%2Fobj.txt","a":"403 Permission denied. No WRITE permission.","r":"c","k":"error"},{"t":"overwrite resource is previous","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=ov%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"overwrite metadata not merged","q":"PATCH /v0/b/demo-synthetic-app.appspot.com/o/ov%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"overwrite metadata not merged check","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=ov%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"final object","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/ov%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"owner bypass seed","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=auth%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"anonymous denied","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/auth%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"bearer alice","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/auth%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"firebase scheme alice","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/auth%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"bearer bob denied","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/auth%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"sub only uid null denied","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/auth%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"sub only uid is null","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/auth%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"owner bypass seed","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=auth%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"token is full payload","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/auth%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"token standard claims","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/auth%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"token identities list","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/auth%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"custom claim admin","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/auth%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"custom claim missing error","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/auth%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"anonymous auth null","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/auth%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"anonymous uid error","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/auth%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"malformed token auth null","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/auth%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"basic scheme auth null","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/auth%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"bearer only auth null","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/auth%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"expired token accepted","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/auth%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"token keys","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/auth%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"auth keys","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/auth%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"owner upload","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=by%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"firebase owner get","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/by%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"alice get denied","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/by%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"token download","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/by%2Fobj.txt?alt=media","a":"200 {byteLength, sha256, utf8}","r":"c","k":"status"},{"t":"token metadata","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/by%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"wrong token denied","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/by%2Fobj.txt?alt=media","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"token does not cover patch","q":"PATCH /v0/b/demo-synthetic-app.appspot.com/o/by%2Fobj.txt","a":"403 Permission denied. No WRITE permission.","r":"c","k":"error"},{"t":"token does not cover delete","q":"DELETE /v0/b/demo-synthetic-app.appspot.com/o/by%2Fobj.txt","a":"403 Permission denied. No WRITE permission.","r":"c","k":"error"},{"t":"create token alice denied","q":"POST /v0/b/demo-synthetic-app.appspot.com/o/by%2Fobj.txt?create_token=true","a":"403 Missing admin credentials.","r":"c","k":"error"},{"t":"create token alice denied even when rules allow","q":"POST /v0/b/demo-synthetic-app.appspot.com/o/by%2Fobj.txt?create_token=true","a":"403 Missing admin credentials.","r":"c","k":"error"},{"t":"create token owner","q":"POST /v0/b/demo-synthetic-app.appspot.com/o/by%2Fobj.txt?create_token=true","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"delete token alice denied","q":"POST /v0/b/demo-synthetic-app.appspot.com/o/by%2Fobj.txt?delete_token=","a":"403 Missing admin credentials.","r":"c","k":"error"},{"t":"copy alice denied","q":"POST /b/demo-synthetic-app.appspot.com/o/by%2Fobj.txt/copyTo/b/demo-synthetic-app.appspot.com/o/by%2Fcopy.txt","a":"200 storage#object","r":"c","k":"status"},{"t":"owner delete","q":"DELETE /v0/b/demo-synthetic-app.appspot.com/o/by%2Fobj.txt","a":"204","r":"c","k":"status"},{"t":"json media upload anonymous","q":"POST /upload/storage/v1/b/demo-synthetic-app.appspot.com/o?uploadType=media&name=js%2Fobj.txt","a":"200 storage#object","r":"c","k":"status"},{"t":"json get metadata anonymous","q":"GET /storage/v1/b/demo-synthetic-app.appspot.com/o/js%2Fobj.txt","a":"200 storage#object","r":"c","k":"status"},{"t":"json download anonymous","q":"GET /download/storage/v1/b/demo-synthetic-app.appspot.com/o/js%2Fobj.txt?alt=media","a":"200 {byteLength, sha256, utf8}","r":"c","k":"status"},{"t":"json list anonymous","q":"GET /storage/v1/b/demo-synthetic-app.appspot.com/o?prefix=js%2F","a":"200 storage#objects","r":"c","k":"status"},{"t":"json get with user token","q":"GET /storage/v1/b/demo-synthetic-app.appspot.com/o/js%2Fobj.txt","a":"200 storage#object","r":"c","k":"status"},{"t":"json upload with user token","q":"POST /upload/storage/v1/b/demo-synthetic-app.appspot.com/o?uploadType=media&name=js%2Falice.txt","a":"200 storage#object","r":"c","k":"status"},{"t":"json delete anonymous","q":"DELETE /storage/v1/b/demo-synthetic-app.appspot.com/o/js%2Fobj.txt","a":"204","r":"c","k":"status"},{"t":"v0 get of json object denied","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/js%2Falice.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"owner bypass seed","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=fs%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"get admin true","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"get missing doc bob","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"exists true","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"exists false","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"exists false negated","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"data int","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"data string list map","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"data missing field error","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"data keys","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"owner bypass seed","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=fs%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"document id","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"document name","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"document name is path","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"document name first segment projects","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"document name first segment databases","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"document name project form","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"document is map","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"document keys","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"wrong database path","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"path without databases prefix","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"get missing document error","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"get missing document guarded","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"owner bypass seed","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=fs%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"latest state before write","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"same ruleset; the document changed after the ruleset loaded","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"one access","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"two accesses","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"three accesses","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"four accesses","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"ten accesses","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"eleven accesses","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"twenty one accesses","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"repeated access cached","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"exists and get same doc","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"bare get unavailable","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"bare exists unavailable","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"firestore on create","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=fs%2Fnew.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"firestore on list","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?prefix=fs%2F&delimiter=%2F","a":"200 {prefixes, items}","r":"c","k":"status"},{"t":"firestore with anonymous uid error","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/fs%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"alice upload own","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=users%2Falice%2Fa.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"alice upload nested","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=users%2Falice%2Fdeep%2Fer%2Fb.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"bob get alice denied","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/users%2Falice%2Fa.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"alice get own","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/users%2Falice%2Fa.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"list path /users/alice binds allPaths to zero segments","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?prefix=users%2Falice%2F&delimiter=%2F","a":"200 {prefixes, items}","r":"c","k":"status"},{"t":"alice list nested prefix","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?prefix=users%2Falice%2Fdeep%2F&delimiter=%2F","a":"200 {prefixes, items}","r":"c","k":"status"},{"t":"bob list alice denied","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?prefix=users%2Falice%2F&delimiter=%2F","a":"403 Permission denied. No LIST permission.","r":"c","k":"error"},{"t":"/users has no uid segment","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?prefix=users%2F&delimiter=%2F","a":"403 Permission denied. No LIST permission.","r":"c","k":"error"},{"t":"alice list bucket root denied","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?delimiter=%2F","a":"403 Permission denied. No LIST permission.","r":"c","k":"error"},{"t":"alice upload bob denied","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=users%2Fbob%2Fx.txt","a":"403 Permission denied. No WRITE permission.","r":"c","k":"error"},{"t":"owner bypass seed","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=public%2Fp.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"owner bypass seed","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=public%2Fnested%2Fq.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"owner bypass seed","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=uni%2F%E7%81%AB%F0%9F%94%A5%20space.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"owner bypass seed","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=tail%2Fa%2Fb.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"public single segment","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/public%2Fp.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"public nested not matched","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/public%2Fnested%2Fq.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"unicode percent encoded","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/uni%2F%E7%81%AB%F0%9F%94%A5%20space.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"unencoded unicode in the request target","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/uni%2F火🔥%20space.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"tail binding excludes prefix","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/tail%2Fa%2Fb.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"root recursive list zero segments true","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?delimiter=%2F","a":"200 {prefixes, items}","r":"c","k":"status"},{"t":"root recursive list zero segments null","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?delimiter=%2F","a":"403 Permission denied. No LIST permission.","r":"c","k":"error"},{"t":"root recursive list zero segments is path","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?delimiter=%2F","a":"200 {prefixes, items}","r":"c","k":"status"},{"t":"root recursive list one segment is path","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?prefix=users%2F&delimiter=%2F","a":"403 Permission denied. No LIST permission.","r":"c","k":"error"},{"t":"list on /users: does /users/{uid}/... match with uid unbound","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?prefix=users%2F&delimiter=%2F","a":"403 Permission denied. No LIST permission.","r":"c","k":"error"},{"t":"list partial match bound and unbound","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?prefix=a%2Fq%2F&delimiter=%2F","a":"403 Permission denied. No LIST permission.","r":"c","k":"error"},{"t":"prefix /a/q/c conflicts with the literal b","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?prefix=a%2Fq%2Fc%2F&delimiter=%2F","a":"403 Permission denied. No LIST permission.","r":"c","k":"error"},{"t":"list partial match shorter than literal","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?prefix=a%2F&delimiter=%2F","a":"403 Permission denied. No LIST permission.","r":"c","k":"error"},{"t":"list exact match single wildcard","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?prefix=a%2Fq%2F&delimiter=%2F","a":"403 Permission denied. No LIST permission.","r":"c","k":"error"},{"t":"list longer than pattern denied","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?prefix=a%2Fq%2Fextra%2F&delimiter=%2F","a":"403 Permission denied. No LIST permission.","r":"c","k":"error"},{"t":"get on an object named users/alice: zero-segment recursive tail","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/users%2Falice","a":"404 Not Found","r":"c","k":"status"},{"t":"owner bypass seed","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=users%2Falice","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"get object at zero segment tail","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/users%2Falice","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"get object at zero segment tail is path","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/users%2Falice","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"bucket binding","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/public%2Fp.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"object name with encoded slash","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=enc%2Fx.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"object name with trailing slash","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=trail%2Fx.txt%2F","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"owner bypass seed","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=err%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"missing metadata field","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/err%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"division by zero","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/err%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"non boolean condition","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/err%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"null auth property","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/err%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"unknown variable","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/err%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"unknown function","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/err%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"string of timestamp","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/err%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"path index out of range","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/err%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"request query undefined","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/err%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"error in one allow other allows","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/err%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"error in first allow second allows","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/err%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"error in nested block other block allows","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/err%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"owner bypass seed","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=life%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"owner bypass seed","q":"POST /v0/b/synthetic-objects.example.test/o?name=life%2Fasset.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"single file governs every bucket default","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/life%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"single file governs every bucket assets","q":"GET /v0/b/synthetic-objects.example.test/o/life%2Fasset.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"single file governs unconfigured bucket","q":"GET /v0/b/unconfigured.example.test/o/life%2Fnone.txt","a":"404 Not Found","r":"c","k":"status"},{"t":"a trailing semicolon is optional; the allow sits on /b/{bucket}/o and matches no object","q":"PUT /internal/setRules","a":"200 {message}","r":"c","k":"error"},{"t":"after missing semicolon get","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/life%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"set rules syntax error","q":"PUT /internal/setRules","a":"400 {message}","r":"c","k":"error"},{"t":"does the previous ruleset survive a failed reload","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/life%2Fobj.txt","a":"403 Permission denied. Storage Emulator has no loaded ruleset.","r":"c","k":"error"},{"t":"after syntax error owner get","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/life%2Fobj.txt","a":"403 Permission denied. Storage Emulator has no loaded ruleset.","r":"c","k":"error"},{"t":"after syntax error json api","q":"GET /storage/v1/b/demo-synthetic-app.appspot.com/o/life%2Fobj.txt","a":"200 storage#object","r":"c","k":"status"},{"t":"after syntax error list","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?prefix=life%2F&delimiter=%2F","a":"403 Permission denied. Storage Emulator has no loaded ruleset.","r":"c","k":"error"},{"t":"after syntax error upload","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=life%2Fnew.txt","a":"403 Permission denied. Storage Emulator has no loaded ruleset.","r":"c","k":"error"},{"t":"set rules semantic error","q":"PUT /internal/setRules","a":"400 {message}","r":"c","k":"error"},{"t":"after semantic error get","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/life%2Fobj.txt","a":"403 Permission denied. Storage Emulator has no loaded ruleset.","r":"c","k":"error"},{"t":"set rules firestore service","q":"PUT /internal/setRules","a":"200 {message}","r":"c","k":"error"},{"t":"after firestore service get","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/life%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"set rules missing files","q":"PUT /internal/setRules","a":"400 {message}","r":"c","k":"error"},{"t":"set rules empty files","q":"PUT /internal/setRules","a":"400 {message}","r":"c","k":"error"},{"t":"set rules file without content","q":"PUT /internal/setRules","a":"400 {message}","r":"c","k":"error"},{"t":"set rules multi without resource","q":"PUT /internal/setRules","a":"400 {message}","r":"c","k":"error"},{"t":"set rules valid single","q":"PUT /internal/setRules","a":"200 {message}","r":"c","k":"error"},{"t":"after valid get","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/life%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"owner bypass seed","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=life%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"owner bypass seed","q":"POST /v0/b/synthetic-objects.example.test/o?name=life%2Fasset.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"set rules multi bucket","q":"PUT /internal/setRules","a":"200 {message}","r":"c","k":"error"},{"t":"multi default alice","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/life%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"multi default anonymous denied","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/life%2Fobj.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"multi assets anonymous get","q":"GET /v0/b/synthetic-objects.example.test/o/life%2Fasset.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"multi assets list denied","q":"GET /v0/b/synthetic-objects.example.test/o?prefix=life%2F&delimiter=%2F","a":"403 Permission denied. No LIST permission.","r":"c","k":"error"},{"t":"multi unconfigured bucket","q":"GET /v0/b/unconfigured.example.test/o/life%2Fnone.txt","a":"403 Permission denied. Storage Emulator has no loaded ruleset.","r":"c","k":"error"},{"t":"multi unconfigured bucket owner","q":"GET /v0/b/unconfigured.example.test/o/life%2Fnone.txt","a":"403 Permission denied. Storage Emulator has no loaded ruleset.","r":"c","k":"error"},{"t":"multi unconfigured bucket json api","q":"GET /storage/v1/b/unconfigured.example.test/o/life%2Fnone.txt","a":"404 No such object: unconfigured.example.test/life/none.txt","r":"c","k":"error"},{"t":"set rules multi one invalid","q":"PUT /internal/setRules","a":"200 {message}","r":"c","k":"error"},{"t":"multi one invalid default get","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/life%2Fobj.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"multi one invalid assets get","q":"GET /v0/b/synthetic-objects.example.test/o/life%2Fasset.txt","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"default alice upload","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=users%2Falice%2Forders%2Fdeck.png","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"default alice get","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/users%2Falice%2Forders%2Fdeck.png","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"default alice media","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/users%2Falice%2Forders%2Fdeck.png?alt=media","a":"200 {byteLength, sha256, utf8}","r":"c","k":"status"},{"t":"default bob get denied","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/users%2Falice%2Forders%2Fdeck.png","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"default admin get","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/users%2Falice%2Forders%2Fdeck.png","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"default anonymous get denied","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/users%2Falice%2Forders%2Fdeck.png","a":"403 Permission denied. No READ permission.","r":"c","k":"error"},{"t":"default alice list","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?prefix=users%2Falice%2Forders%2F&delimiter=%2F","a":"200 {prefixes, items}","r":"c","k":"status"},{"t":"default alice list user root","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?prefix=users%2Falice%2F&delimiter=%2F","a":"200 {prefixes, items}","r":"c","k":"status"},{"t":"default bob list denied","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?prefix=users%2Falice%2F&delimiter=%2F","a":"403 Permission denied. No LIST permission.","r":"c","k":"error"},{"t":"default alice patch","q":"PATCH /v0/b/demo-synthetic-app.appspot.com/o/users%2Falice%2Forders%2Fdeck.png","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"default alice delete","q":"DELETE /v0/b/demo-synthetic-app.appspot.com/o/users%2Falice%2Forders%2Fdeck.png","a":"204","r":"c","k":"status"},{"t":"default alice outside users denied","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=shared%2Fx.txt","a":"403 Permission denied. No WRITE permission.","r":"c","k":"error"},{"t":"default admin outside users denied","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=shared%2Fx.txt","a":"403 Permission denied. No WRITE permission.","r":"c","k":"error"},{"t":"default token read bypass","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=users%2Falice%2Forders%2Fshared.png","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"default token read anonymous","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/users%2Falice%2Forders%2Fshared.png?alt=media","a":"200 {byteLength, sha256, utf8}","r":"c","k":"status"},{"t":"assets admin upload","q":"POST /v0/b/synthetic-objects.example.test/o?name=users%2Falice%2Fimages%2Flogo.png","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"assets admin upload catalog","q":"POST /v0/b/synthetic-objects.example.test/o?name=catalog%2Fcache.json","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"assets anonymous get","q":"GET /v0/b/synthetic-objects.example.test/o/catalog%2Fcache.json","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"assets anonymous media","q":"GET /v0/b/synthetic-objects.example.test/o/catalog%2Fcache.json?alt=media","a":"200 {}","r":"c","k":"status"},{"t":"assets anonymous list denied","q":"GET /v0/b/synthetic-objects.example.test/o?prefix=users%2Falice%2Fimages%2F&delimiter=%2F","a":"403 Permission denied. No LIST permission.","r":"c","k":"error"},{"t":"assets anonymous root list denied","q":"GET /v0/b/synthetic-objects.example.test/o?delimiter=%2F","a":"403 Permission denied. No LIST permission.","r":"c","k":"error"},{"t":"assets alice list own","q":"GET /v0/b/synthetic-objects.example.test/o?prefix=users%2Falice%2Fimages%2F&delimiter=%2F","a":"200 {prefixes, items}","r":"c","k":"status"},{"t":"assets alice upload own","q":"POST /v0/b/synthetic-objects.example.test/o?name=users%2Falice%2Ffonts%2Ff.ttf","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"assets alice upload catalog denied","q":"POST /v0/b/synthetic-objects.example.test/o?name=catalog%2Fother.json","a":"403 Permission denied. No WRITE permission.","r":"c","k":"error"},{"t":"assets bob get alice asset","q":"GET /v0/b/synthetic-objects.example.test/o/users%2Falice%2Fimages%2Flogo.png","a":"200 {name, bucket, generation, metageneration, …}","r":"c","k":"status"},{"t":"assets bob delete alice asset denied","q":"DELETE /v0/b/synthetic-objects.example.test/o/users%2Falice%2Fimages%2Flogo.png","a":"403 Permission denied. No WRITE permission.","r":"c","k":"error"},{"t":"assets admin delete catalog","q":"DELETE /v0/b/synthetic-objects.example.test/o/catalog%2Fcache.json","a":"204","r":"c","k":"status"},{"t":"assets alice get missing","q":"GET /v0/b/synthetic-objects.example.test/o/catalog%2Fmissing.json","a":"404 Not Found","r":"c","k":"status"},{"t":"method string","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=rr%2Fmethod.txt","a":"403 Permission denied. No WRITE permission.","r":"d","k":"status","w":"production's rules define request.method, which the official emulator leaves undefined; Firenook follows production"},{"t":"method update","q":"PATCH /v0/b/demo-synthetic-app.appspot.com/o/up%2Fobj.txt","a":"403 Permission denied. No WRITE permission.","r":"d","k":"status","w":"production's rules define request.method, which the official emulator leaves undefined; Firenook follows production"},{"t":"get media uses get","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/gl%2Fobj.txt?alt=media","a":"403 Permission denied. No READ permission.","r":"d","k":"status","w":"production's rules define request.method, which the official emulator leaves undefined; Firenook follows production"},{"t":"list method string","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?prefix=gl%2F&delimiter=%2F","a":"403 Permission denied. No LIST permission.","r":"d","k":"status","w":"production's rules define request.method, which the official emulator leaves undefined; Firenook follows production"},{"t":"overwrite method is create","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=ov%2Fobj.txt","a":"403 Permission denied. No WRITE permission.","r":"d","k":"status","w":"production's rules define request.method, which the official emulator leaves undefined; Firenook follows production"},{"t":"json patch anonymous","q":"PATCH /storage/v1/b/demo-synthetic-app.appspot.com/o/js%2Fobj.txt","a":"501 Not Implemented","r":"d","k":"status","w":"Firenook answers the Cloud Storage API's JSON PATCH, which the official emulator does not implement (501); rules are not consulted either way"}]} \ No newline at end of file diff --git a/public/conformance/storage.json b/public/conformance/storage.json new file mode 100644 index 0000000..2f7a7f5 --- /dev/null +++ b/public/conformance/storage.json @@ -0,0 +1 @@ +{"runs":[[0,1,0,"Default bucket discovery"],[1,1,0,"Default bucket discovery"],[2,2,1,"gzip content encoding: gcs resumable"],[4,1,1,"gzip content encoding: gcs multipart"],[5,1,1,"gzip content encoding: firebase multipart"],[6,2,1,"gzip content encoding: firebase resumable"],[8,1,1,"gzip content encoding: gcs copy"],[9,12,1,"gzip content encoding: gcs resumable"],[21,12,1,"gzip content encoding: gcs multipart"],[33,12,1,"gzip content encoding: firebase multipart"],[45,12,1,"gzip content encoding: firebase resumable"],[57,12,1,"gzip content encoding: gcs copy"],[69,9,1,"List pagination over 1002 objects"],[78,4,1,"A missing object"],[82,9,1,"Firebase Storage v0 metadata, token bypass, list, media, metadata update, and token mutation routes match the browser SDK contract"],[91,8,1,"GCS JSON media and resumable uploads, query/finalize idempotence, metadata/list/download, and object copy routes match Admin SDK behavior"],[99,2,1,"List pagination over 1002 objects"],[101,1,1,"A missing object"],[102,9,1,"Two independent synthetic bucket policies remain distinct, and the official buckets/blobs/metadata export layout re-imports byte-identically without lifecycle events"],[111,4,2,"Storage targets: no firebaserc"],[115,4,2,"Storage targets: mapped then unmapped"],[119,4,2,"Storage targets: unmapped then mapped"],[123,4,2,"Storage targets: every target mapped"],[127,1,2,"Storage targets: real project unmapped"],[128,29,3,"Resumable, multipart and media uploads as the native SDKs send them"],[157,2,3,"Downloads as the native SDKs send them"],[159,4,3,"Download token routes"],[163,3,3,"CORS for native and web clients"],[166,5,3,"List rules: single wildcard"],[171,5,3,"List rules: single wildcard read"],[176,5,3,"List rules: single wildcard get only"],[181,5,3,"List rules: recursive wildcard"],[186,5,3,"List rules: root single wildcard"],[191,5,3,"List rules: root recursive wildcard"],[196,5,3,"List rules: exact folder"],[201,5,3,"List rules: deeper single wildcard"],[206,5,3,"List rules: two wildcards"],[211,5,3,"List rules: three wildcards"],[216,5,3,"List rules: nested match"],[221,5,3,"List rules: wildcard then literal"],[226,5,3,"List rules: binds the folder"],[231,5,3,"List rules: name is empty"],[236,5,3,"List rules: name is a string"],[241,5,3,"List rules: name unknown denies"],[246,5,3,"List rules: name not equal"],[251,5,3,"List rules: name negated"],[256,5,3,"List rules: name or true"],[261,5,3,"List rules: name and true"],[266,5,3,"List rules: recursive binding is path"],[271,5,3,"List rules: recursive binding negated"],[276,5,3,"List rules: recursive value empty"],[281,5,3,"List rules: recursive value slash"],[286,5,3,"List rules: recursive value sub"],[291,5,3,"List rules: recursive value slash sub"],[296,5,3,"List rules: recursive value deep"],[301,5,3,"List rules: recursive value is string"],[306,5,3,"List rules: recursive then wildcard"],[311,5,3,"List rules: recursive equals sub"],[316,5,3,"List rules: recursive equals slash sub"],[321,5,3,"List rules: request path"]],"cases":[{"t":"bucket list 1","q":"GET /b","a":"200 · 1 bucket: {project}","r":"c","k":"answer"},{"t":"bucket list 2","q":"GET /b","a":"200 · 1 bucket: {project}","r":"u"},{"t":"gcs resumable","q":"POST /upload/storage/v1/b/synthetic-objects.example.test/o?name=gcs-resumable.json&uploadType=resumable","a":"200 · 2 bytes","r":"c","k":"status"},{"t":"gcs resumable","q":"PUT /upload/storage/v1/b/synthetic-objects.example.test/o?name=gcs-resumable.json&uploadType=resumable&upload_id=","a":"200 · 937 bytes","r":"c","k":"status"},{"t":"gcs multipart","q":"POST /upload/storage/v1/b/synthetic-objects.example.test/o?uploadType=multipart&name=gcs-multipart.json","a":"200 · 937 bytes","r":"c","k":"status"},{"t":"firebase multipart","q":"POST /v0/b/synthetic-objects.example.test/o?name=firebase-multipart.json","a":"200 · 605 bytes","r":"c","k":"status"},{"t":"firebase resumable","q":"POST /v0/b/synthetic-objects.example.test/o?name=firebase-resumable.json","a":"200 · 2 bytes","r":"c","k":"status"},{"t":"firebase resumable","q":"POST /v0/b/synthetic-objects.example.test/o?name=firebase-resumable.json&upload_id=&upload_protocol=resumable","a":"200 · 605 bytes","r":"c","k":"status"},{"t":"gcs copy","q":"POST /b/synthetic-objects.example.test/o/gcs-resumable.json/copyTo/b/synthetic-objects.example.test/o/gcs-copy.json","a":"200 · 917 bytes","r":"c","k":"status"},{"t":"probe:gcs resumable","q":"GET /storage/v1/b/synthetic-objects.example.test/o/gcs-resumable.json","a":"200 · 937 bytes","r":"c","k":"status"},{"t":"probe:gcs resumable","q":"GET /storage/v1/b/synthetic-objects.example.test/o/gcs-resumable.json?alt=media","a":"200 · content-encoding gzip · 74 bytes","r":"c","k":"answer"},{"t":"probe:gcs resumable","q":"GET /storage/v1/b/synthetic-objects.example.test/o/gcs-resumable.json?alt=media","a":"200 · 53 bytes","r":"c","k":"answer"},{"t":"probe:gcs resumable","q":"GET /storage/v1/b/synthetic-objects.example.test/o/gcs-resumable.json?alt=media","a":"206 · content-encoding gzip · 10 bytes","r":"c","k":"answer"},{"t":"probe:gcs resumable","q":"GET /storage/v1/b/synthetic-objects.example.test/o/gcs-resumable.json?alt=media","a":"200 · 53 bytes","r":"c","k":"answer"},{"t":"probe:gcs resumable","q":"GET /storage/v1/b/synthetic-objects.example.test/o/gcs-resumable.json?alt=media","a":"200 · content-encoding gzip · 74 bytes","r":"c","k":"answer"},{"t":"probe:gcs resumable","q":"GET /v0/b/synthetic-objects.example.test/o/gcs-resumable.json","a":"200 · 600 bytes","r":"c","k":"status"},{"t":"probe:gcs resumable","q":"GET /v0/b/synthetic-objects.example.test/o/gcs-resumable.json?alt=media","a":"200 · content-encoding gzip · 74 bytes","r":"c","k":"answer"},{"t":"probe:gcs resumable","q":"GET /v0/b/synthetic-objects.example.test/o/gcs-resumable.json?alt=media","a":"200 · 53 bytes","r":"c","k":"answer"},{"t":"probe:gcs resumable","q":"GET /v0/b/synthetic-objects.example.test/o/gcs-resumable.json?alt=media","a":"206 · content-encoding gzip · 10 bytes","r":"c","k":"answer"},{"t":"probe:gcs resumable","q":"GET /v0/b/synthetic-objects.example.test/o/gcs-resumable.json?alt=media","a":"200 · 53 bytes","r":"c","k":"answer"},{"t":"probe:gcs resumable","q":"GET /v0/b/synthetic-objects.example.test/o/gcs-resumable.json?alt=media","a":"200 · content-encoding gzip · 74 bytes","r":"c","k":"answer"},{"t":"probe:gcs multipart","q":"GET /storage/v1/b/synthetic-objects.example.test/o/gcs-multipart.json","a":"200 · 937 bytes","r":"c","k":"status"},{"t":"probe:gcs multipart","q":"GET /storage/v1/b/synthetic-objects.example.test/o/gcs-multipart.json?alt=media","a":"200 · content-encoding gzip · 74 bytes","r":"c","k":"answer"},{"t":"probe:gcs multipart","q":"GET /storage/v1/b/synthetic-objects.example.test/o/gcs-multipart.json?alt=media","a":"200 · 53 bytes","r":"c","k":"answer"},{"t":"probe:gcs multipart","q":"GET /storage/v1/b/synthetic-objects.example.test/o/gcs-multipart.json?alt=media","a":"206 · content-encoding gzip · 10 bytes","r":"c","k":"answer"},{"t":"probe:gcs multipart","q":"GET /storage/v1/b/synthetic-objects.example.test/o/gcs-multipart.json?alt=media","a":"200 · 53 bytes","r":"c","k":"answer"},{"t":"probe:gcs multipart","q":"GET /storage/v1/b/synthetic-objects.example.test/o/gcs-multipart.json?alt=media","a":"200 · content-encoding gzip · 74 bytes","r":"c","k":"answer"},{"t":"probe:gcs multipart","q":"GET /v0/b/synthetic-objects.example.test/o/gcs-multipart.json","a":"200 · 600 bytes","r":"c","k":"status"},{"t":"probe:gcs multipart","q":"GET /v0/b/synthetic-objects.example.test/o/gcs-multipart.json?alt=media","a":"200 · content-encoding gzip · 74 bytes","r":"c","k":"answer"},{"t":"probe:gcs multipart","q":"GET /v0/b/synthetic-objects.example.test/o/gcs-multipart.json?alt=media","a":"200 · 53 bytes","r":"c","k":"answer"},{"t":"probe:gcs multipart","q":"GET /v0/b/synthetic-objects.example.test/o/gcs-multipart.json?alt=media","a":"206 · content-encoding gzip · 10 bytes","r":"c","k":"answer"},{"t":"probe:gcs multipart","q":"GET /v0/b/synthetic-objects.example.test/o/gcs-multipart.json?alt=media","a":"200 · 53 bytes","r":"c","k":"answer"},{"t":"probe:gcs multipart","q":"GET /v0/b/synthetic-objects.example.test/o/gcs-multipart.json?alt=media","a":"200 · content-encoding gzip · 74 bytes","r":"c","k":"answer"},{"t":"probe:firebase multipart","q":"GET /storage/v1/b/synthetic-objects.example.test/o/firebase-multipart.json","a":"200 · 1028 bytes","r":"c","k":"status"},{"t":"probe:firebase multipart","q":"GET /storage/v1/b/synthetic-objects.example.test/o/firebase-multipart.json?alt=media","a":"200 · content-encoding gzip · 74 bytes","r":"c","k":"answer"},{"t":"probe:firebase multipart","q":"GET /storage/v1/b/synthetic-objects.example.test/o/firebase-multipart.json?alt=media","a":"200 · 53 bytes","r":"c","k":"answer"},{"t":"probe:firebase multipart","q":"GET /storage/v1/b/synthetic-objects.example.test/o/firebase-multipart.json?alt=media","a":"206 · content-encoding gzip · 10 bytes","r":"c","k":"answer"},{"t":"probe:firebase multipart","q":"GET /storage/v1/b/synthetic-objects.example.test/o/firebase-multipart.json?alt=media","a":"200 · 53 bytes","r":"c","k":"answer"},{"t":"probe:firebase multipart","q":"GET /storage/v1/b/synthetic-objects.example.test/o/firebase-multipart.json?alt=media","a":"200 · content-encoding gzip · 74 bytes","r":"c","k":"answer"},{"t":"probe:firebase multipart","q":"GET /v0/b/synthetic-objects.example.test/o/firebase-multipart.json","a":"200 · 605 bytes","r":"c","k":"status"},{"t":"probe:firebase multipart","q":"GET /v0/b/synthetic-objects.example.test/o/firebase-multipart.json?alt=media","a":"200 · content-encoding gzip · 74 bytes","r":"c","k":"answer"},{"t":"probe:firebase multipart","q":"GET /v0/b/synthetic-objects.example.test/o/firebase-multipart.json?alt=media","a":"200 · 53 bytes","r":"c","k":"answer"},{"t":"probe:firebase multipart","q":"GET /v0/b/synthetic-objects.example.test/o/firebase-multipart.json?alt=media","a":"206 · content-encoding gzip · 10 bytes","r":"c","k":"answer"},{"t":"probe:firebase multipart","q":"GET /v0/b/synthetic-objects.example.test/o/firebase-multipart.json?alt=media","a":"200 · 53 bytes","r":"c","k":"answer"},{"t":"probe:firebase multipart","q":"GET /v0/b/synthetic-objects.example.test/o/firebase-multipart.json?alt=media","a":"200 · content-encoding gzip · 74 bytes","r":"c","k":"answer"},{"t":"probe:firebase resumable","q":"GET /storage/v1/b/synthetic-objects.example.test/o/firebase-resumable.json","a":"200 · 1028 bytes","r":"c","k":"status"},{"t":"probe:firebase resumable","q":"GET /storage/v1/b/synthetic-objects.example.test/o/firebase-resumable.json?alt=media","a":"200 · content-encoding gzip · 74 bytes","r":"c","k":"answer"},{"t":"probe:firebase resumable","q":"GET /storage/v1/b/synthetic-objects.example.test/o/firebase-resumable.json?alt=media","a":"200 · 53 bytes","r":"c","k":"answer"},{"t":"probe:firebase resumable","q":"GET /storage/v1/b/synthetic-objects.example.test/o/firebase-resumable.json?alt=media","a":"206 · content-encoding gzip · 10 bytes","r":"c","k":"answer"},{"t":"probe:firebase resumable","q":"GET /storage/v1/b/synthetic-objects.example.test/o/firebase-resumable.json?alt=media","a":"200 · 53 bytes","r":"c","k":"answer"},{"t":"probe:firebase resumable","q":"GET /storage/v1/b/synthetic-objects.example.test/o/firebase-resumable.json?alt=media","a":"200 · content-encoding gzip · 74 bytes","r":"c","k":"answer"},{"t":"probe:firebase resumable","q":"GET /v0/b/synthetic-objects.example.test/o/firebase-resumable.json","a":"200 · 605 bytes","r":"c","k":"status"},{"t":"probe:firebase resumable","q":"GET /v0/b/synthetic-objects.example.test/o/firebase-resumable.json?alt=media","a":"200 · content-encoding gzip · 74 bytes","r":"c","k":"answer"},{"t":"probe:firebase resumable","q":"GET /v0/b/synthetic-objects.example.test/o/firebase-resumable.json?alt=media","a":"200 · 53 bytes","r":"c","k":"answer"},{"t":"probe:firebase resumable","q":"GET /v0/b/synthetic-objects.example.test/o/firebase-resumable.json?alt=media","a":"206 · content-encoding gzip · 10 bytes","r":"c","k":"answer"},{"t":"probe:firebase resumable","q":"GET /v0/b/synthetic-objects.example.test/o/firebase-resumable.json?alt=media","a":"200 · 53 bytes","r":"c","k":"answer"},{"t":"probe:firebase resumable","q":"GET /v0/b/synthetic-objects.example.test/o/firebase-resumable.json?alt=media","a":"200 · content-encoding gzip · 74 bytes","r":"c","k":"answer"},{"t":"probe:gcs copy","q":"GET /storage/v1/b/synthetic-objects.example.test/o/gcs-copy.json","a":"200 · 917 bytes","r":"c","k":"status"},{"t":"probe:gcs copy","q":"GET /storage/v1/b/synthetic-objects.example.test/o/gcs-copy.json?alt=media","a":"200 · content-encoding gzip · 74 bytes","r":"c","k":"answer"},{"t":"probe:gcs copy","q":"GET /storage/v1/b/synthetic-objects.example.test/o/gcs-copy.json?alt=media","a":"200 · 53 bytes","r":"c","k":"answer"},{"t":"probe:gcs copy","q":"GET /storage/v1/b/synthetic-objects.example.test/o/gcs-copy.json?alt=media","a":"206 · content-encoding gzip · 10 bytes","r":"c","k":"answer"},{"t":"probe:gcs copy","q":"GET /storage/v1/b/synthetic-objects.example.test/o/gcs-copy.json?alt=media","a":"200 · 53 bytes","r":"c","k":"answer"},{"t":"probe:gcs copy","q":"GET /storage/v1/b/synthetic-objects.example.test/o/gcs-copy.json?alt=media","a":"200 · content-encoding gzip · 74 bytes","r":"c","k":"answer"},{"t":"probe:gcs copy","q":"GET /v0/b/synthetic-objects.example.test/o/gcs-copy.json","a":"200 · 595 bytes","r":"c","k":"status"},{"t":"probe:gcs copy","q":"GET /v0/b/synthetic-objects.example.test/o/gcs-copy.json?alt=media","a":"200 · content-encoding gzip · 74 bytes","r":"c","k":"answer"},{"t":"probe:gcs copy","q":"GET /v0/b/synthetic-objects.example.test/o/gcs-copy.json?alt=media","a":"200 · 53 bytes","r":"c","k":"answer"},{"t":"probe:gcs copy","q":"GET /v0/b/synthetic-objects.example.test/o/gcs-copy.json?alt=media","a":"206 · content-encoding gzip · 10 bytes","r":"c","k":"answer"},{"t":"probe:gcs copy","q":"GET /v0/b/synthetic-objects.example.test/o/gcs-copy.json?alt=media","a":"200 · 53 bytes","r":"c","k":"answer"},{"t":"probe:gcs copy","q":"GET /v0/b/synthetic-objects.example.test/o/gcs-copy.json?alt=media","a":"200 · content-encoding gzip · 74 bytes","r":"c","k":"answer"},{"t":"gcs default first","q":"GET /storage/v1/b/…/o (default first)","a":"200 · 1000 items, next page token objects/1000.json","r":"c","k":"answer"},{"t":"gcs default second","q":"GET /storage/v1/b/…/o (default second)","a":"200 · 2 items, no next page","r":"c","k":"answer"},{"t":"firebase default first","q":"GET /v0/b/…/o (default first)","a":"200 · 1000 items, next page token objects/1000.json","r":"c","k":"answer"},{"t":"firebase default second","q":"GET /v0/b/…/o (default second)","a":"200 · 2 items, no next page","r":"c","k":"answer"},{"t":"gcs small first","q":"GET /storage/v1/b/…/o (small first)","a":"200 · 2 items, next page token objects/0002.json","r":"c","k":"answer"},{"t":"gcs small second","q":"GET /storage/v1/b/…/o (small second)","a":"200 · 2 items, next page token objects/0004.json","r":"c","k":"answer"},{"t":"firebase small first","q":"GET /v0/b/…/o (small first)","a":"200 · 2 items, next page token objects/0002.json","r":"c","k":"answer"},{"t":"firebase small second","q":"GET /v0/b/…/o (small second)","a":"200 · 2 items, next page token objects/0004.json","r":"c","k":"answer"},{"t":"gcs unknown token","q":"GET /storage/v1/b/…/o (unknown token)","a":"200 · 2 items, next page token objects/0002.json","r":"c","k":"answer"},{"t":"firebase metadata","q":"GET /v0/b/synthetic-objects.example.test/o/samples%2Fmissing%2Fpicture.png","a":"404 · text/plain; charset=utf-8 \"Not Found\"","r":"c","k":"answer"},{"t":"firebase media","q":"GET /v0/b/synthetic-objects.example.test/o/samples%2Fmissing%2Fpicture.png?alt=media","a":"404 · text/plain; charset=utf-8 \"Not Found\"","r":"c","k":"answer"},{"t":"gcs metadata","q":"GET /storage/v1/b/synthetic-objects.example.test/o/samples%2Fmissing%2Fpicture.png","a":"404 · application/json; charset=utf-8 \"No such object: synthetic-objects.example.test/samples/missing/picture.png\"","r":"c","k":"answer"},{"t":"gcs media","q":"GET /download/storage/v1/b/synthetic-objects.example.test/o/samples%2Fmissing%2Fpicture.png?alt=media","a":"404 · text/html; charset=utf-8 \"No such object: synthetic-objects.example.test/samples/missing/picture.png\"","r":"c","k":"answer"},{"t":"readiness","q":"GET /v0/","a":"200 {emulator}","r":"u"},{"t":"firebase v0 media upload","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=users%2Falice%2F%E7%81%AB%F0%9F%94%A5.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"u"},{"t":"default bucket public read denied","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/users%2Falice%2F%E7%81%AB%F0%9F%94%A5.txt?alt=media","a":"403 Permission denied. No READ permission.","r":"u"},{"t":"download token bypasses rules","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/users%2Falice%2F%E7%81%AB%F0%9F%94%A5.txt?alt=media","a":"200 {byteLength, sha256, utf8}","r":"u"},{"t":"firebase v0 get metadata","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/users%2Falice%2F%E7%81%AB%F0%9F%94%A5.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"u"},{"t":"firebase v0 list prefix","q":"GET /v0/b/demo-synthetic-app.appspot.com/o?prefix=users%2Falice%2F&delimiter=%2F&maxResults=100","a":"200 {prefixes, items}","r":"u"},{"t":"firebase v0 update metadata","q":"PATCH /v0/b/demo-synthetic-app.appspot.com/o/users%2Falice%2F%E7%81%AB%F0%9F%94%A5.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"u"},{"t":"firebase v0 create download token","q":"POST /v0/b/demo-synthetic-app.appspot.com/o/users%2Falice%2F%E7%81%AB%F0%9F%94%A5.txt?create_token=true","a":"200 {name, bucket, generation, metageneration, …}","r":"u"},{"t":"firebase v0 delete download token","q":"POST /v0/b/demo-synthetic-app.appspot.com/o/users%2Falice%2F%E7%81%AB%F0%9F%94%A5.txt?delete_token=","a":"200 {name, bucket, generation, metageneration, …}","r":"u"},{"t":"gcs json media upload","q":"POST /upload/storage/v1/b/synthetic-objects.example.test/o?uploadType=media&name=admin%2Fgcs-media-%E7%81%AB.txt","a":"200 storage#object","r":"u"},{"t":"gcs resumable start","q":"POST /upload/storage/v1/b/synthetic-objects.example.test/o?uploadType=resumable&name=admin%2Fresumable-%F0%9F%94%A5.bin","a":"200 OK","r":"u"},{"t":"gcs resumable upload and finalize","q":"PUT /upload/storage/v1/b/synthetic-objects.example.test/o?name=admin%2Fresumable-%F0%9F%94%A5.bin&uploadType=resumable&upload_id=","a":"200 storage#object","r":"u"},{"t":"gcs resumable duplicate finalize","q":"PUT /upload/storage/v1/b/synthetic-objects.example.test/o?name=admin%2Fresumable-%F0%9F%94%A5.bin&uploadType=resumable&upload_id=","a":"400 Bad Request","r":"u"},{"t":"gcs list objects","q":"GET /storage/v1/b/synthetic-objects.example.test/o?prefix=admin%2F&maxResults=100","a":"200 storage#objects","r":"u"},{"t":"gcs download resumable object","q":"GET /download/storage/v1/b/synthetic-objects.example.test/o/admin%2Fresumable-%F0%9F%94%A5.bin?alt=media","a":"200 {byteLength, sha256, utf8}","r":"u"},{"t":"gcs canonical copy path not implemented","q":"POST /storage/v1/b/synthetic-objects.example.test/o/admin%2Fgcs-media-%E7%81%AB.txt/copyTo/b/synthetic-objects.example.test/o/admin%2Fcopie…","a":"501 Not Implemented","r":"u"},{"t":"gcs emulator copy alias","q":"POST /b/synthetic-objects.example.test/o/admin%2Fgcs-media-%E7%81%AB.txt/copyTo/b/synthetic-objects.example.test/o/admin%2Fcopied-%E7%81%AB…","a":"200 storage#object","r":"u"},{"t":"gcs delimiter","q":"GET /storage/v1/b/…/o (delimiter)","a":"200 · 2 items, next page token objects/0002.json","r":"u"},{"t":"SDK autopagination","q":"@google-cloud/storage 7.22.0 getFiles() with autopagination","a":"1002 objects, objects/0000.json to objects/1001.json","r":"u"},{"t":"browser load","q":"a cross-origin of the missing object","a":"browser response 404 Not Found, then the element's error event","r":"u"},{"t":"default bucket owner upload","q":"POST /v0/b/demo-synthetic-app.appspot.com/o?name=users%2Falice%2Fprivate.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"u"},{"t":"default bucket owner read","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/users%2Falice%2Fprivate.txt?alt=media","a":"200 {byteLength, sha256, utf8}","r":"u"},{"t":"default bucket other user denied","q":"GET /v0/b/demo-synthetic-app.appspot.com/o/users%2Falice%2Fprivate.txt?alt=media","a":"403 Permission denied. No READ permission.","r":"u"},{"t":"assets bucket admin upload","q":"POST /v0/b/synthetic-objects.example.test/o?name=catalog%2Fpublic-%E7%81%AB.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"u"},{"t":"assets bucket public read","q":"GET /v0/b/synthetic-objects.example.test/o/catalog%2Fpublic-%E7%81%AB.txt?alt=media","a":"200 {byteLength, sha256, utf8}","r":"u"},{"t":"internal export","q":"POST /internal/export","a":"200 OK","r":"u"},{"t":"internal reset","q":"POST /internal/reset","a":"200 OK","r":"u"},{"t":"reimported default object byte check","q":"GET /download/storage/v1/b/demo-synthetic-app.appspot.com/o/users%2Falice%2Fprivate.txt?alt=media","a":"200 {byteLength, sha256, utf8}","r":"u"},{"t":"reimported assets object byte check","q":"GET /download/storage/v1/b/synthetic-objects.example.test/o/catalog%2Fpublic-%E7%81%AB.txt?alt=media","a":"200 {byteLength, sha256, utf8}","r":"u"},{"t":"start","q":"firebase emulators:start --only storage for demo-media (targets media)","a":"started · Detected demo project ID \"demo-media\", using a default (open) rules configuration. Storage targets in firebase.json will be ignor…","r":"c","k":"answer"},{"t":"upload to demo media images","q":"POST /v0/b/demo-media-images/o (signed out)","a":"200","r":"c","k":"status"},{"t":"upload to demo-media.appspot.com","q":"POST /v0/b/demo-media.appspot.com/o (signed out)","a":"200","r":"c","k":"status"},{"t":"upload to anything else","q":"POST /v0/b/anything-else/o (signed out)","a":"200","r":"c","k":"status"},{"t":"start","q":"firebase emulators:start --only storage for demo-media (targets media, other)","a":"started · Detected demo project ID \"demo-media\", using a default (open) rules configuration. Storage targets in firebase.json will be ignor…","r":"c","k":"answer"},{"t":"upload to demo media images","q":"POST /v0/b/demo-media-images/o (signed out)","a":"200","r":"c","k":"status"},{"t":"upload to demo-media.appspot.com","q":"POST /v0/b/demo-media.appspot.com/o (signed out)","a":"200","r":"c","k":"status"},{"t":"upload to anything else","q":"POST /v0/b/anything-else/o (signed out)","a":"200","r":"c","k":"status"},{"t":"start","q":"firebase emulators:start --only storage for demo-media (targets other, media)","a":"started · Detected demo project ID \"demo-media\", using a default (open) rules configuration. Storage targets in firebase.json will be ignor…","r":"c","k":"answer"},{"t":"upload to demo media images","q":"POST /v0/b/demo-media-images/o (signed out)","a":"200","r":"c","k":"status"},{"t":"upload to demo-media.appspot.com","q":"POST /v0/b/demo-media.appspot.com/o (signed out)","a":"200","r":"c","k":"status"},{"t":"upload to anything else","q":"POST /v0/b/anything-else/o (signed out)","a":"200","r":"c","k":"status"},{"t":"start","q":"firebase emulators:start --only storage for demo-media (targets media)","a":"started","r":"c","k":"answer"},{"t":"upload to demo media images","q":"POST /v0/b/demo-media-images/o (signed out)","a":"403","r":"c","k":"status"},{"t":"upload to demo-media.appspot.com","q":"POST /v0/b/demo-media.appspot.com/o (signed out)","a":"403","r":"c","k":"status"},{"t":"upload to anything else","q":"POST /v0/b/anything-else/o (signed out)","a":"403","r":"c","k":"status"},{"t":"start","q":"firebase emulators:start --only storage for real-media-project (targets media)","a":"did not start, exit 1: Error: Deploy target media not configured for project real-media-project. Configure with: firebase target:apply stor…","r":"d","k":"error","w":"the official requireTarget error, naming this CLI's command (firenook target:apply) and adding its --storage-bucket flag"},{"t":"ios start","q":"upload ios start","a":"200 · upload active · chunk granularity 10000","r":"c","k":"answer"},{"t":"ios query","q":"upload ios query","a":"200 · upload active · 0 bytes received","r":"c","k":"answer"},{"t":"ios put upload","q":"upload ios put upload","a":"200 · upload active","r":"c","k":"answer"},{"t":"ios query after upload","q":"upload ios query after upload","a":"200 · upload active · 3 bytes received","r":"c","k":"answer"},{"t":"ios put finalize","q":"upload ios put finalize","a":"200 · upload final · object open/hello.txt","r":"c","k":"answer"},{"t":"ios denied start","q":"upload ios denied start","a":"200 · upload active · chunk granularity 10000","r":"c","k":"answer"},{"t":"ios denied finalize","q":"upload ios denied finalize","a":"403 · upload final · Permission denied. No WRITE permission.","r":"c","k":"answer"},{"t":"ios denied finalize again","q":"upload ios denied finalize again","a":"403 · upload final","r":"c","k":"answer"},{"t":"ios own finalize","q":"upload ios own finalize","a":"200 · upload final · object users/someone/a.txt","r":"c","k":"answer"},{"t":"path beats query start","q":"upload path beats query start","a":"200 · upload active · chunk granularity 10000","r":"c","k":"answer"},{"t":"path beats query finalize","q":"upload path beats query finalize","a":"200 · upload final · object open/path.txt","r":"c","k":"answer"},{"t":"ios cancel","q":"upload ios cancel","a":"200","r":"c","k":"answer"},{"t":"ios after cancel","q":"upload ios after cancel","a":"400","r":"c","k":"answer"},{"t":"android start no body","q":"upload android start no body","a":"200 · upload active · chunk granularity 10000","r":"c","k":"answer"},{"t":"android chunk","q":"upload android chunk","a":"200 · upload active","r":"c","k":"answer"},{"t":"android empty finalize","q":"upload android empty finalize","a":"200 · upload final · object open/android.bin","r":"c","k":"answer"},{"t":"android typed finalize","q":"upload android typed finalize","a":"200 · upload final · object open/typed.png","r":"c","k":"answer"},{"t":"android untyped finalize","q":"upload android untyped finalize","a":"200 · upload final · object open/untyped.png","r":"c","k":"answer"},{"t":"start names the host asked for","q":"upload start names the host asked for","a":"200","r":"c","k":"answer"},{"t":"web finalize","q":"upload web finalize","a":"200 · upload final · object open/web.txt","r":"c","k":"answer"},{"t":"object path media","q":"upload object path media","a":"200 · object open/media.txt","r":"c","k":"answer"},{"t":"object path media put","q":"upload object path media put","a":"200 · object open/media-put.txt","r":"c","k":"answer"},{"t":"bucket path media put","q":"upload bucket path media put","a":"200 · object open/bucket-put.txt","r":"c","k":"answer"},{"t":"object path multipart","q":"upload object path multipart","a":"200 · object open/multi.txt","r":"c","k":"answer"},{"t":"object path denied media","q":"upload object path denied media","a":"403 · upload final · Permission denied. No WRITE permission.","r":"c","k":"answer"},{"t":"start without a name","q":"upload start without a name","a":"400","r":"c","k":"status"},{"t":"command without an id","q":"upload command without an id","a":"400","r":"c","k":"status"},{"t":"protocol without a command","q":"upload protocol without a command","a":"400","r":"c","k":"answer"},{"t":"put as patch","q":"upload put as patch","a":"200 · object open/hello.txt","r":"c","k":"answer"},{"t":"ios read","q":"download ios read","a":"200","r":"c","k":"answer"},{"t":"android read","q":"download android read","a":"200","r":"c","k":"answer"},{"t":"create token signed out","q":"token create token signed out","a":"403 · Missing admin credentials.","r":"c","k":"answer"},{"t":"delete token signed out","q":"token delete token signed out","a":"403 · Missing admin credentials.","r":"c","k":"answer"},{"t":"create token owner","q":"token create token owner","a":"200 · object open/hello.txt","r":"c","k":"answer"},{"t":"create token not true","q":"token create token not true","a":"400","r":"c","k":"status"},{"t":"preflight","q":"OPTIONS preflight with every upload header","a":"allowed · methods delete, get, head, patch, post, put","r":"c","k":"answer"},{"t":"private network","q":"OPTIONS preflight asking for private network access","a":"access-control-allow-private-network: true","r":"c","k":"answer"},{"t":"exposed headers","q":"response headers a browser may read","a":"exposes content-type, x-firebase-storage-version, x-goog-upload-chunk-granularity, x-goog-upload-command, x-goog-upload-control-url, x-goog…","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /open/{name} { allow list: if true; }","a":"403","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /open/{name} { allow list: if true; }","a":"200 · 11 items, 1 prefix","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /open/{name} { allow list: if true; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /open/{name} { allow list: if true; }","a":"403","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /open/{name} { allow list: if true; }","a":"403","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /open/{name} { allow read: if true; }","a":"403","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /open/{name} { allow read: if true; }","a":"200 · 11 items, 1 prefix","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /open/{name} { allow read: if true; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /open/{name} { allow read: if true; }","a":"403","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /open/{name} { allow read: if true; }","a":"403","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /open/{name} { allow get: if true; }","a":"403","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /open/{name} { allow get: if true; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /open/{name} { allow get: if true; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /open/{name} { allow get: if true; }","a":"403","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /open/{name} { allow get: if true; }","a":"403","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /open/{allPaths=**} { allow list: if true; }","a":"403","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /open/{allPaths=**} { allow list: if true; }","a":"200 · 11 items, 1 prefix","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /open/{allPaths=**} { allow list: if true; }","a":"200 · 1 item, 1 prefix","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /open/{allPaths=**} { allow list: if true; }","a":"200 · 1 item, 0 prefixes","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /open/{allPaths=**} { allow list: if true; }","a":"403","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /{name} { allow list: if true; }","a":"200 · 1 item, 3 prefixes","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /{name} { allow list: if true; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /{name} { allow list: if true; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /{name} { allow list: if true; }","a":"403","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /{name} { allow list: if true; }","a":"403","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /{allPaths=**} { allow list: if true; }","a":"200 · 1 item, 3 prefixes","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /{allPaths=**} { allow list: if true; }","a":"200 · 11 items, 1 prefix","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /{allPaths=**} { allow list: if true; }","a":"200 · 1 item, 1 prefix","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /{allPaths=**} { allow list: if true; }","a":"200 · 1 item, 0 prefixes","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /{allPaths=**} { allow list: if true; }","a":"200 · 1 item, 0 prefixes","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /open { allow list: if true; }","a":"403","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /open { allow list: if true; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /open { allow list: if true; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /open { allow list: if true; }","a":"403","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /open { allow list: if true; }","a":"403","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /open/sub/{name} { allow list: if true; }","a":"403","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /open/sub/{name} { allow list: if true; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /open/sub/{name} { allow list: if true; }","a":"200 · 1 item, 1 prefix","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /open/sub/{name} { allow list: if true; }","a":"403","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /open/sub/{name} { allow list: if true; }","a":"403","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /{a}/{b} { allow list: if true; }","a":"403","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /{a}/{b} { allow list: if true; }","a":"200 · 11 items, 1 prefix","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /{a}/{b} { allow list: if true; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /{a}/{b} { allow list: if true; }","a":"403","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /{a}/{b} { allow list: if true; }","a":"200 · 1 item, 0 prefixes","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /{a}/{b}/{c} { allow list: if true; }","a":"403","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /{a}/{b}/{c} { allow list: if true; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /{a}/{b}/{c} { allow list: if true; }","a":"200 · 1 item, 1 prefix","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /{a}/{b}/{c} { allow list: if true; }","a":"403","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /{a}/{b}/{c} { allow list: if true; }","a":"403","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /open { match /{name} { allow list: if true; } }","a":"403","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /open { match /{name} { allow list: if true; } }","a":"200 · 11 items, 1 prefix","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /open { match /{name} { allow list: if true; } }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /open { match /{name} { allow list: if true; } }","a":"403","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /open { match /{name} { allow list: if true; } }","a":"403","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /{folder}/sub/{name} { allow list: if true; }","a":"403","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /{folder}/sub/{name} { allow list: if true; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /{folder}/sub/{name} { allow list: if true; }","a":"200 · 1 item, 1 prefix","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /{folder}/sub/{name} { allow list: if true; }","a":"403","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /{folder}/sub/{name} { allow list: if true; }","a":"403","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /{folder}/{name} { allow list: if folder == 'open'; }","a":"403","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /{folder}/{name} { allow list: if folder == 'open'; }","a":"200 · 11 items, 1 prefix","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /{folder}/{name} { allow list: if folder == 'open'; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /{folder}/{name} { allow list: if folder == 'open'; }","a":"403","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /{folder}/{name} { allow list: if folder == 'open'; }","a":"403","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /open/{name} { allow list: if name == ''; }","a":"403","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /open/{name} { allow list: if name == ''; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /open/{name} { allow list: if name == ''; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /open/{name} { allow list: if name == ''; }","a":"403","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /open/{name} { allow list: if name == ''; }","a":"403","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /open/{name} { allow list: if name is string; }","a":"403","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /open/{name} { allow list: if name is string; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /open/{name} { allow list: if name is string; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /open/{name} { allow list: if name is string; }","a":"403","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /open/{name} { allow list: if name is string; }","a":"403","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /open/{name} { allow list: if name == 'x'; }","a":"403","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /open/{name} { allow list: if name == 'x'; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /open/{name} { allow list: if name == 'x'; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /open/{name} { allow list: if name == 'x'; }","a":"403","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /open/{name} { allow list: if name == 'x'; }","a":"403","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /open/{name} { allow list: if name != 'x'; }","a":"403","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /open/{name} { allow list: if name != 'x'; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /open/{name} { allow list: if name != 'x'; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /open/{name} { allow list: if name != 'x'; }","a":"403","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /open/{name} { allow list: if name != 'x'; }","a":"403","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /open/{name} { allow list: if !(name == 'x'); }","a":"403","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /open/{name} { allow list: if !(name == 'x'); }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /open/{name} { allow list: if !(name == 'x'); }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /open/{name} { allow list: if !(name == 'x'); }","a":"403","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /open/{name} { allow list: if !(name == 'x'); }","a":"403","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /open/{name} { allow list: if name == 'x' || true; }","a":"403","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /open/{name} { allow list: if name == 'x' || true; }","a":"200 · 11 items, 1 prefix","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /open/{name} { allow list: if name == 'x' || true; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /open/{name} { allow list: if name == 'x' || true; }","a":"403","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /open/{name} { allow list: if name == 'x' || true; }","a":"403","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /open/{name} { allow list: if true && name == 'x'; }","a":"403","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /open/{name} { allow list: if true && name == 'x'; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /open/{name} { allow list: if true && name == 'x'; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /open/{name} { allow list: if true && name == 'x'; }","a":"403","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /open/{name} { allow list: if true && name == 'x'; }","a":"403","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /open/{allPaths=**} { allow list: if allPaths is path; }","a":"403","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /open/{allPaths=**} { allow list: if allPaths is path; }","a":"200 · 11 items, 1 prefix","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /open/{allPaths=**} { allow list: if allPaths is path; }","a":"200 · 1 item, 1 prefix","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /open/{allPaths=**} { allow list: if allPaths is path; }","a":"200 · 1 item, 0 prefixes","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /open/{allPaths=**} { allow list: if allPaths is path; }","a":"403","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /open/{allPaths=**} { allow list: if !(allPaths == path('x')); }","a":"403","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /open/{allPaths=**} { allow list: if !(allPaths == path('x')); }","a":"200 · 11 items, 1 prefix","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /open/{allPaths=**} { allow list: if !(allPaths == path('x')); }","a":"200 · 1 item, 1 prefix","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /open/{allPaths=**} { allow list: if !(allPaths == path('x')); }","a":"200 · 1 item, 0 prefixes","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /open/{allPaths=**} { allow list: if !(allPaths == path('x')); }","a":"403","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /open/{allPaths=**} { allow list: if string(allPaths) == ''; }","a":"403","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /open/{allPaths=**} { allow list: if string(allPaths) == ''; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /open/{allPaths=**} { allow list: if string(allPaths) == ''; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /open/{allPaths=**} { allow list: if string(allPaths) == ''; }","a":"403","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /open/{allPaths=**} { allow list: if string(allPaths) == ''; }","a":"403","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /open/{allPaths=**} { allow list: if string(allPaths) == '/'; }","a":"403","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /open/{allPaths=**} { allow list: if string(allPaths) == '/'; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /open/{allPaths=**} { allow list: if string(allPaths) == '/'; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /open/{allPaths=**} { allow list: if string(allPaths) == '/'; }","a":"403","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /open/{allPaths=**} { allow list: if string(allPaths) == '/'; }","a":"403","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /open/{allPaths=**} { allow list: if string(allPaths) == 'sub'; }","a":"403","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /open/{allPaths=**} { allow list: if string(allPaths) == 'sub'; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /open/{allPaths=**} { allow list: if string(allPaths) == 'sub'; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /open/{allPaths=**} { allow list: if string(allPaths) == 'sub'; }","a":"403","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /open/{allPaths=**} { allow list: if string(allPaths) == 'sub'; }","a":"403","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /open/{allPaths=**} { allow list: if string(allPaths) == '/sub'; }","a":"403","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /open/{allPaths=**} { allow list: if string(allPaths) == '/sub'; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /open/{allPaths=**} { allow list: if string(allPaths) == '/sub'; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /open/{allPaths=**} { allow list: if string(allPaths) == '/sub'; }","a":"403","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /open/{allPaths=**} { allow list: if string(allPaths) == '/sub'; }","a":"403","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /open/{allPaths=**} { allow list: if string(allPaths) == 'sub/deep'; }","a":"403","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /open/{allPaths=**} { allow list: if string(allPaths) == 'sub/deep'; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /open/{allPaths=**} { allow list: if string(allPaths) == 'sub/deep'; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /open/{allPaths=**} { allow list: if string(allPaths) == 'sub/deep'; }","a":"403","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /open/{allPaths=**} { allow list: if string(allPaths) == 'sub/deep'; }","a":"403","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /open/{allPaths=**} { allow list: if allPaths is string; }","a":"403","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /open/{allPaths=**} { allow list: if allPaths is string; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /open/{allPaths=**} { allow list: if allPaths is string; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /open/{allPaths=**} { allow list: if allPaths is string; }","a":"403","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /open/{allPaths=**} { allow list: if allPaths is string; }","a":"403","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /{rest=**}/{name} { allow list: if true; }","a":"200 · 1 item, 3 prefixes","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /{rest=**}/{name} { allow list: if true; }","a":"200 · 11 items, 1 prefix","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /{rest=**}/{name} { allow list: if true; }","a":"200 · 1 item, 1 prefix","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /{rest=**}/{name} { allow list: if true; }","a":"200 · 1 item, 0 prefixes","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /{rest=**}/{name} { allow list: if true; }","a":"200 · 1 item, 0 prefixes","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /open/{allPaths=**} { allow list: if allPaths == path('sub'); }","a":"403","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /open/{allPaths=**} { allow list: if allPaths == path('sub'); }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /open/{allPaths=**} { allow list: if allPaths == path('sub'); }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /open/{allPaths=**} { allow list: if allPaths == path('sub'); }","a":"403","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /open/{allPaths=**} { allow list: if allPaths == path('sub'); }","a":"403","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /open/{allPaths=**} { allow list: if allPaths == /sub; }","a":"403","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /open/{allPaths=**} { allow list: if allPaths == /sub; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /open/{allPaths=**} { allow list: if allPaths == /sub; }","a":"403","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /open/{allPaths=**} { allow list: if allPaths == /sub; }","a":"403","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /open/{allPaths=**} { allow list: if allPaths == /sub; }","a":"403","r":"c","k":"answer"},{"t":"list (root)","q":"GET /v0/b/…/o?prefix= under match /open/{name} { allow list: if request.path == /b/demo-firenook-native-clients.appspot.com/o/open; }","a":"403","r":"c","k":"answer"},{"t":"list open/","q":"GET /v0/b/…/o?prefix=open%2F under match /open/{name} { allow list: if request.path == /b/demo-firenook-native-clients.appspot.com/o/open; }","a":"200 · 11 items, 1 prefix","r":"c","k":"answer"},{"t":"list open/sub/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2F under match /open/{name} { allow list: if request.path == /b/demo-firenook-native-clients.appspot.com/o/…","a":"403","r":"c","k":"answer"},{"t":"list open/sub/deep/","q":"GET /v0/b/…/o?prefix=open%2Fsub%2Fdeep%2F under match /open/{name} { allow list: if request.path == /b/demo-firenook-native-clients.appspot…","a":"403","r":"c","k":"answer"},{"t":"list other/","q":"GET /v0/b/…/o?prefix=other%2F under match /open/{name} { allow list: if request.path == /b/demo-firenook-native-clients.appspot.com/o/open;…","a":"403","r":"c","k":"answer"}]} \ No newline at end of file diff --git a/public/conformance/suite.json b/public/conformance/suite.json new file mode 100644 index 0000000..4cfe8e1 --- /dev/null +++ b/public/conformance/suite.json @@ -0,0 +1 @@ +{"runs":[[0,1,0,"Functions emulator shutdown after one HTTP invocation"],[1,1,0,"Functions emulator shutdown after one HTTP invocation"],[2,3,1,"Rules coverage and requests over HTTP"],[5,11,1,"Requests websocket: history and live evaluations"],[16,1,1,"Emulator UI pages driving each emulator"],[17,8,1,"Rules coverage and requests over HTTP"],[25,1,1,"Requests websocket: history and live evaluations"],[26,21,1,"Emulator UI pages driving each emulator"],[47,5,2,"Hub locator, emulator map, export and the origin guard"],[52,5,2,"Suite startup, shutdown and restart on the same ports"],[57,5,2,"UI config, index page and the logging websocket"]],"cases":[{"t":"one HTTP invocation","q":"GET /{project}/us-central1/ping","a":"200 {synthetic}","r":"c","k":"answer"},{"t":"SIGINT","q":"SIGINT to firebase emulators:start","a":"stopped in 34 ms, exit code 0","r":"u"},{"t":"write visible","q":"PATCH /v1/projects/{project}/databases/(default)/documents/notes/visible","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"status"},{"t":"write denied","q":"PATCH /v1/projects/{project}/databases/(default)/documents/notes/denied","a":"403 PERMISSION_DENIED: false for 'create' @ L6, false for 'update' @ L6","r":"c","k":"status"},{"t":"write hidden","q":"PATCH /v1/projects/{project}/databases/(default)/documents/notes/hidden (owner)","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"status"},{"t":"initial history","q":"connect to the requests websocket","a":"empty history","r":"c","k":"answer"},{"t":"evaluation request 1","q":"rules evaluation event 1","a":"allow create /databases/(default)/documents/notes/visible","r":"c","k":"verdict"},{"t":"evaluation request 2","q":"rules evaluation event 2","a":"allow update /databases/(default)/documents/notes/visible","r":"c","k":"verdict"},{"t":"evaluation request 3","q":"rules evaluation event 3","a":"deny create /databases/(default)/documents/notes/denied","r":"c","k":"verdict"},{"t":"evaluation request 4","q":"rules evaluation event 4","a":"deny update /databases/(default)/documents/notes/denied","r":"c","k":"verdict"},{"t":"evaluation request 5","q":"rules evaluation event 5","a":"error get /databases/(default)/documents/notes/visible","r":"c","k":"verdict"},{"t":"evaluation request 6","q":"rules evaluation event 6","a":"allow get /databases/(default)/documents/notes/visible","r":"c","k":"verdict"},{"t":"evaluation request 7","q":"rules evaluation event 7","a":"error get /databases/(default)/documents/notes/hidden","r":"c","k":"verdict"},{"t":"evaluation request 8","q":"rules evaluation event 8","a":"deny get /databases/(default)/documents/notes/hidden","r":"c","k":"verdict"},{"t":"evaluation request 9","q":"rules evaluation event 9","a":"error get /databases/(default)/documents/notes/missing","r":"c","k":"verdict"},{"t":"evaluation request 10","q":"rules evaluation event 10","a":"error get /databases/(default)/documents/notes/missing","r":"c","k":"verdict"},{"t":"auth GET","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/tenants","a":"200 {tenants}","r":"c","k":"answer"},{"t":"coverage before","q":"GET /emulator/v1/projects/{project}:ruleCoverage","a":"200 {rules, report}","r":"u"},{"t":"read visible","q":"GET /v1/projects/{project}/databases/(default)/documents/notes/visible","a":"200 {name, fields, createTime, updateTime}","r":"u"},{"t":"read hidden","q":"GET /v1/projects/{project}/databases/(default)/documents/notes/hidden","a":"403 PERMISSION_DENIED: evaluation error at L5:19 for 'get' @ L5, false for 'get' @ L5","r":"u"},{"t":"read missing","q":"GET /v1/projects/{project}/databases/(default)/documents/notes/missing","a":"403 PERMISSION_DENIED: evaluation error at L5:19 for 'get' @ L5, Null value error. for 'get' @ L5","r":"u"},{"t":"read hidden admin","q":"GET /v1/projects/{project}/databases/(default)/documents/notes/hidden (owner)","a":"200 {name, fields, createTime, updateTime}","r":"u"},{"t":"list documents admin","q":"GET /v1/projects/{project}/databases/(default)/documents/notes?pageSize=1000 (owner)","a":"200 {documents}","r":"u"},{"t":"coverage after","q":"GET /emulator/v1/projects/{project}:ruleCoverage","a":"200 {rules, report}","r":"u"},{"t":"coverage html","q":"GET /emulator/v1/projects/{project}:ruleCoverage.html","a":"200 {byteLength, sha256, title, embeddedCoverage}","r":"u"},{"t":"after reconnecting","q":"reconnect to the requests websocket","a":"history replay of 10 evaluations","r":"u"},{"t":"firestore GET","q":"GET /emulator/v1/projects/{project}:ruleCoverage.html","a":"200","r":"u"},{"t":"firestore DELETE","q":"DELETE /emulator/v1/projects/{project}/databases/(default)/documents","a":"200 {}","r":"u"},{"t":"auth POST","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:query","a":"200 {recordsCount, userInfo}","r":"u"},{"t":"auth GET","q":"GET /emulator/v1/projects/{project}/config","a":"200 {signIn, emailPrivacyConfig}","r":"u"},{"t":"auth POST","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts","a":"200 identitytoolkit#SignupNewUserResponse","r":"u"},{"t":"auth POST","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"u"},{"t":"auth POST","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:query","a":"200 {recordsCount, userInfo}","r":"u"},{"t":"auth DELETE","q":"DELETE /emulator/v1/projects/{project}/accounts","a":"200 {}","r":"u"},{"t":"storage GET","q":"GET /v0/b/{project}/o (query: delimiter, prefix)","a":"200 {prefixes, items}","r":"u"},{"t":"storage GET","q":"GET /v0/b/{project}/o (query: delimiter, prefix)","a":"200 {prefixes, items}","r":"u"},{"t":"storage POST","q":"POST /v0/b/{project}/o (query: name)","a":"200 {name, bucket, generation, metageneration, …}","r":"u"},{"t":"storage GET","q":"GET /v0/b/{project}/o (query: delimiter, prefix)","a":"200 {prefixes, items}","r":"u"},{"t":"storage GET","q":"GET /v0/b/{project}/o/synthetic.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"u"},{"t":"storage GET","q":"GET /v0/b/{project}/o (query: delimiter, prefix)","a":"200 {prefixes, items}","r":"u"},{"t":"storage GET","q":"GET /v0/b/{project}/o/synthetic.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"u"},{"t":"storage GET","q":"GET /v0/b/{project}/o (query: delimiter, prefix)","a":"200 {prefixes, items}","r":"u"},{"t":"storage DELETE","q":"DELETE /v0/b/{project}/o/%252f","a":"404 (empty body)","r":"u"},{"t":"storage DELETE","q":"DELETE /v0/b/{project}/o/synthetic.txt","a":"204","r":"u"},{"t":"storage GET","q":"GET /v0/b/{project}/o (query: delimiter, prefix)","a":"200 {prefixes, items}","r":"u"},{"t":"storage GET","q":"GET /v0/b/{project}/o (query: delimiter, prefix)","a":"200 {prefixes, items}","r":"u"},{"t":"UI config","q":"GET /api/config","a":"200 · project {project}, 6 services listed","r":"u"},{"t":"hub locator","q":"GET /","a":"200 {version, origins, pid, host, …}","r":"u"},{"t":"hub emulator map","q":"GET /emulators","a":"200 {hub, ui, logging, auth, …}","r":"u"},{"t":"create export user","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts","a":"200 identitytoolkit#SignupNewUserResponse","r":"u"},{"t":"hub auth export","q":"POST /_admin/export","a":"200 {message}","r":"u"},{"t":"hub export origin blocked","q":"POST /_admin/export","a":"403 {message}","r":"u"},{"t":"first start","q":"firebase emulators:start (auth, functions, pubsub)","a":"ready after 18 s · hub 200, functions 200, auth 200, pubsub 200, ui 200","r":"u"},{"t":"first stop","q":"stop the suite (origin-guarded run)","a":"not clean, exit 2 · locator deleted, ports closed","r":"u"},{"t":"restart","q":"start the suite again on the same ports","a":"ready after 18 s · hub 200, functions 200, auth 200, pubsub 200, ui 200","r":"u"},{"t":"restart hub readiness","q":"GET / on the hub","a":"200 {version, origins, pid, host, …}","r":"u"},{"t":"second stop","q":"stop the suite (control run)","a":"clean, exit 0 · locator deleted, ports closed","r":"u"},{"t":"ui api config","q":"GET /api/config","a":"200 {projectId, experiments, hub, ui, …}","r":"u"},{"t":"ui index html","q":"GET /","a":"200 {byteLength, sha256, containsRootElement}","r":"u"},{"t":"logging websocket message 1","q":"connect to the logging websocket","a":"info: Watching \"/functions\" for Cloud Functions...","r":"u"},{"t":"logging websocket message 2","q":"connect to the logging websocket","a":"warn: ⚠ functions: package.json indicates an outdated version of firebase-functions. Please upgrade using npm install --save firebase-funct…","r":"u"},{"t":"logging websocket message 3","q":"connect to the logging websocket","a":"info: ✔ functions: Using node@24 from host.","r":"u"}]} \ No newline at end of file diff --git a/public/conformance/tasks.json b/public/conformance/tasks.json new file mode 100644 index 0000000..de709d8 --- /dev/null +++ b/public/conformance/tasks.json @@ -0,0 +1 @@ +{"runs":[[0,17,0,"Every onTaskDispatched export is discovered with its taskQueueTrigger and registered as a queue; a caller can register queues directly with the official defaults, an invalid queue id and an over-limit concurrency are rejected."],[17,11,0,"Enqueue over the wire: a named task and an auto-named task reach the default-config handler with the X-CloudTasks headers; duplicate names, unknown queues and caller headers overriding the emulator's are recorded."],[28,5,0,"Retry semantics: a 500 keeps the execution count, a 400 increments it, exhausting maxAttempts runs maxAttempts+1 times, and the previous response reaches the handler."],[33,6,0,"A dispatch deadline aborts the emulator's request while the handler completes (a retry follows); maxConcurrentDispatches 1 serialises a queue; maxDispatchesPerSecond 1 paces one."],[39,9,0,"Deleting a pending task, an unknown task, a task on an unknown queue, and a task already dispatched; the Admin SDK's delete swallows 404."],[48,11,0,"The Admin SDK path handlers use: getFunctions().taskQueue().enqueue() with data, id, scheduleDelaySeconds, dispatchDeadlineSeconds, headers and uri, a duplicate id, an unknown queue, an explicit region; delete() of a pending, an unknown and an auto-named task."],[59,1,0,"The Admin SDK path handlers use: getFunctions().taskQueue().enqueue() with data, id, scheduleDelaySeconds, dispatchDeadlineSeconds, headers and uri, a duplicate id, an unknown queue, an explicit region; delete() of a pending, an unknown and an auto-named task."]],"cases":[{"t":"backends","q":"GET /backends","a":"200 {backends}","r":"c","k":"answer"},{"t":"startup logs","q":"emulator log lines matching \"queue\"","a":"0 log lines matched","r":"c","k":"behaviour"},{"t":"stats initial","q":"GET /queueStats","a":"200 {queue:{project}, queue:{project}, queue:{project}, queue:{project}, …}","r":"c","k":"answer"},{"t":"register defaults","q":"POST /projects/{project}/locations/us-central1/queues/manual-defaults","a":"200 {taskQueueConfig}","r":"c","k":"answer"},{"t":"register explicit","q":"POST /projects/{project}/locations/us-central1/queues/manual-explicit","a":"200 {taskQueueConfig}","r":"c","k":"answer"},{"t":"register null fields","q":"POST /projects/{project}/locations/us-central1/queues/manual-nulls","a":"200 {taskQueueConfig}","r":"c","k":"answer"},{"t":"register empty body","q":"POST /projects/{project}/locations/us-central1/queues/manual-empty","a":"200 {taskQueueConfig}","r":"c","k":"answer"},{"t":"register over limit","q":"POST /projects/{project}/locations/us-central1/queues/manual-over","a":"400 cannot set maxConcurrentDispatches to a value over 5000","r":"c","k":"answer"},{"t":"register invalid id underscore","q":"POST /projects/{project}/locations/us-central1/queues/bad_name","a":"400 Queue ID must start with a letter followed by up to 62 letters, numbers, hyphens, or underscores and must end with a letter or a number","r":"c","k":"answer"},{"t":"register invalid id long","q":"POST /projects/{project}/locations/us-central1/queues/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa…","a":"400 Queue ID must start with a letter followed by up to 62 letters, numbers, hyphens, or underscores and must end with a letter or a number","r":"c","k":"answer"},{"t":"register invalid id dot","q":"POST /projects/{project}/locations/us-central1/queues/bad.name","a":"400 Queue ID must start with a letter followed by up to 62 letters, numbers, hyphens, or underscores and must end with a letter or a number","r":"c","k":"answer"},{"t":"register foreign project","q":"POST /projects/{project}/locations/us-central1/queues/foreign","a":"200 {taskQueueConfig}","r":"c","k":"answer"},{"t":"register replaces","q":"POST /projects/{project}/locations/us-central1/queues/manual-explicit","a":"200 {taskQueueConfig}","r":"c","k":"answer"},{"t":"stats after register","q":"GET /queueStats","a":"200 {queue:{project}, queue:{project}, queue:{project}, queue:{project}, …}","r":"c","k":"answer"},{"t":"unknown route get","q":"GET /v2/projects/{project}/locations/us-central1/queues","a":"404 Cannot GET /v2/projects/{project}/locations/us-central1/queues","r":"c","k":"answer"},{"t":"unknown route post","q":"POST /unknown","a":"404 Cannot POST /unknown","r":"c","k":"answer"},{"t":"queue get not a route","q":"GET /projects/{project}/locations/us-central1/queues/manual-defaults","a":"404 Cannot GET /projects/{project}/locations/us-central1/queues/manual-defaults","r":"c","k":"answer"},{"t":"enqueue named","q":"POST /projects/{project}/locations/us-central1/queues/taskDefault/tasks","a":"200 {task} · handler saw 1 event","r":"c","k":"answer"},{"t":"enqueue auto named","q":"POST /projects/{project}/locations/us-central1/queues/taskDefault/tasks","a":"200 {task} · handler saw 1 event","r":"c","k":"answer"},{"t":"enqueue duplicate name","q":"POST /projects/{project}/locations/us-central1/queues/taskDefault/tasks","a":"409 A task with the same name already exists","r":"c","k":"answer"},{"t":"enqueue unknown queue","q":"POST /projects/{project}/locations/us-central1/queues/noSuchQueue/tasks","a":"404 Tried to queue a task from a non-existent queue","r":"c","k":"answer"},{"t":"enqueue with schedule time","q":"POST /projects/{project}/locations/us-central1/queues/taskDefault/tasks","a":"200 {task} · handler saw 1 event","r":"c","k":"answer"},{"t":"enqueue caller headers","q":"POST /projects/{project}/locations/us-central1/queues/taskDefault/tasks","a":"200 {task} · handler saw 1 event","r":"c","k":"answer"},{"t":"enqueue explicit url","q":"POST /projects/{project}/locations/us-central1/queues/taskDefault/tasks","a":"200 {task} · handler saw 1 event","r":"c","k":"answer"},{"t":"enqueue alt region","q":"POST /projects/{project}/locations/europe-west1/queues/taskAlt/tasks","a":"200 {task} · handler saw 1 event","r":"c","k":"answer"},{"t":"enqueue wrong region","q":"POST /projects/{project}/locations/us-central1/queues/taskAlt/tasks","a":"404 Tried to queue a task from a non-existent queue","r":"c","k":"answer"},{"t":"enqueue manual queue unreachable","q":"POST /projects/{project}/locations/us-central1/queues/manual-defaults/tasks","a":"200 {task}","r":"c","k":"answer"},{"t":"stats after dispatch","q":"GET /queueStats","a":"200 {queue:{project}, queue:{project}, queue:{project}, queue:{project}, …}","r":"c","k":"answer"},{"t":"retry once 500","q":"POST /projects/{project}/locations/us-central1/queues/taskRetry/tasks","a":"200 {task} · handler saw 2 events","r":"c","k":"answer"},{"t":"retry once 400","q":"POST /projects/{project}/locations/us-central1/queues/taskRetry/tasks","a":"200 {task} · handler saw 2 events","r":"c","k":"answer"},{"t":"retry exhausted","q":"POST /projects/{project}/locations/us-central1/queues/taskRetry/tasks","a":"200 {task} · handler saw 4 events","r":"c","k":"answer"},{"t":"retry then succeed twice","q":"POST /projects/{project}/locations/us-central1/queues/taskRetry/tasks","a":"200 {task} · handler saw 3 events","r":"c","k":"answer"},{"t":"stats after retries","q":"GET /queueStats","a":"200 {queue:{project}, queue:{project}, queue:{project}, queue:{project}, …}","r":"c","k":"answer"},{"t":"slow deadline","q":"POST /projects/{project}/locations/us-central1/queues/taskSlow/tasks","a":"200 {task} · handler saw 2 events","r":"c","k":"answer"},{"t":"serial a","q":"POST /projects/{project}/locations/us-central1/queues/taskSerial/tasks","a":"200 {task}","r":"c","k":"answer"},{"t":"serial b","q":"POST /projects/{project}/locations/us-central1/queues/taskSerial/tasks","a":"200 {task}","r":"c","k":"answer"},{"t":"serial c","q":"POST /projects/{project}/locations/us-central1/queues/taskSerial/tasks","a":"200 {task} · handler saw 3 events","r":"c","k":"answer"},{"t":"rate abc","q":"3 parallel tasks POST /projects/{project}/locations/us-central1/queues/taskRate/tasks","a":"statuses 200, 200, 200 · handler saw 3 events","r":"c","k":"answer"},{"t":"stats after limits","q":"GET /queueStats","a":"200 {queue:{project}, queue:{project}, queue:{project}, queue:{project}, …}","r":"c","k":"answer"},{"t":"enqueue pending a","q":"POST /projects/{project}/locations/us-central1/queues/manual-defaults/tasks","a":"200 {task}","r":"c","k":"answer"},{"t":"enqueue pending b","q":"POST /projects/{project}/locations/us-central1/queues/manual-defaults/tasks","a":"200 {task}","r":"c","k":"answer"},{"t":"stats pending","q":"GET /queueStats","a":"200 {queue:{project}, queue:{project}, queue:{project}, queue:{project}, …}","r":"c","k":"answer"},{"t":"delete unknown queue","q":"DELETE /projects/{project}/locations/us-central1/queues/noSuchQueue/tasks/pending-a","a":"404 Tried to remove a task from a non-existent queue","r":"c","k":"answer"},{"t":"delete unknown task","q":"DELETE /projects/{project}/locations/us-central1/queues/manual-defaults/tasks/no-such-task","a":"404 Tried to remove a task that doesn't exist","r":"c","k":"answer"},{"t":"delete dispatched","q":"DELETE /projects/{project}/locations/us-central1/queues/taskDefault/tasks/job-named-1","a":"200 {res}","r":"c","k":"answer"},{"t":"delete again","q":"DELETE /projects/{project}/locations/us-central1/queues/taskDefault/tasks/job-named-1","a":"404 Tried to remove a task that doesn't exist","r":"c","k":"answer"},{"t":"reuse deleted name","q":"POST /projects/{project}/locations/us-central1/queues/taskDefault/tasks","a":"409 A task with the same name already exists","r":"c","k":"answer"},{"t":"stats after delete","q":"GET /queueStats","a":"200 {queue:{project}, queue:{project}, queue:{project}, queue:{project}, …}","r":"c","k":"answer"},{"t":"admin enqueue plain","q":"POST /{project}/us-central1/enqueueViaAdmin","a":"200 {ok} · handler saw 2 events","r":"c","k":"answer"},{"t":"admin enqueue options","q":"POST /{project}/us-central1/enqueueViaAdmin","a":"200 {ok} · handler saw 2 events","r":"c","k":"answer"},{"t":"admin enqueue duplicate","q":"POST /{project}/us-central1/enqueueViaAdmin","a":"500 {ok, code, message} · handler saw 1 event","r":"c","k":"answer"},{"t":"admin enqueue uri","q":"POST /{project}/us-central1/enqueueViaAdmin","a":"200 {ok} · handler saw 2 events","r":"c","k":"answer"},{"t":"admin enqueue unknown queue","q":"POST /{project}/us-central1/enqueueViaAdmin","a":"500 {ok, code, message} · handler saw 1 event","r":"c","k":"answer"},{"t":"admin enqueue alt region","q":"POST /{project}/us-central1/enqueueViaAdmin","a":"200 {ok} · handler saw 2 events","r":"c","k":"answer"},{"t":"admin enqueue pending","q":"POST /{project}/us-central1/enqueueViaAdmin","a":"200 {ok} · handler saw 1 event","r":"c","k":"answer"},{"t":"admin delete pending","q":"POST /{project}/us-central1/deleteViaAdmin","a":"200 {ok} · handler saw 1 event","r":"c","k":"answer"},{"t":"admin delete unknown","q":"POST /{project}/us-central1/deleteViaAdmin","a":"200 {ok} · handler saw 1 event","r":"c","k":"answer"},{"t":"admin delete unknown queue","q":"POST /{project}/us-central1/deleteViaAdmin","a":"200 {ok} · handler saw 1 event","r":"c","k":"answer"},{"t":"stats final","q":"GET /queueStats","a":"200 {queue:{project}, queue:{project}, queue:{project}, queue:{project}, …}","r":"c","k":"answer"},{"t":"tasks logs","q":"emulator log lines matching \"task\"","a":"15 log lines matched","r":"u"}]} \ No newline at end of file diff --git a/scripts/conformance/import.mjs b/scripts/conformance/import.mjs new file mode 100644 index 0000000..d6785bf --- /dev/null +++ b/scripts/conformance/import.mjs @@ -0,0 +1,218 @@ +// Brings the engine's record of recorded answers into the site. +// +// node scripts/conformance/import.mjs [--release 0.2.3] +// +// is what the engine's conformance/src/report/cases.mjs writes +// for a release: every answer recorded from the official emulator or from +// production, and the set it belongs to. This writes +// +// src/data/conformance/summary.json what the page is built from: per +// service, its sets in wall order +// public/conformance/.json its scenarios as runs of blocks, and +// each block's request and answer, +// fetched only when someone points at +// a block +// +// The wall's order: services in the order below, and inside a service the +// answers recorded from production first, then the official emulator's, +// each set's in its own order, so a scenario is one run of blocks. + +import { mkdirSync, readFileSync, writeFileSync } from 'node:fs'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const root = join(dirname(fileURLToPath(import.meta.url)), '..', '..'); +const [source, ...rest] = process.argv.slice(2); +if (!source) { + console.error('usage: node scripts/conformance/import.mjs --verify [--release ]'); + process.exit(2); +} +const option = (name) => { + const at = rest.indexOf(name); + return at >= 0 ? (rest[at + 1] ?? null) : null; +}; +const release = option('--release'); +// What the replays proved, case by case (the engine's +// conformance/src/report/verify.mjs over the ledger a test run wrote). A case +// it does not name was not replayed: the page never claims more than this. +const verified = new Map(); +const verifyPath = option('--verify'); +if (verifyPath) { + const verify = JSON.parse(readFileSync(verifyPath, 'utf8')); + for (const item of verify.cases) verified.set(`${item.set}\u0000${item.id}`, item); +} +const STATES = { checked: 'c', differs: 'd', unreplayed: 'u' }; +const ORDER = { c: 0, d: 1, u: 2 }; + +/** The wall's rows, top to bottom: the engine's service ids, the site's names and icons. */ +const SERVICES = [ + { id: 'firestore', name: 'Firestore', art: 'firestore', anchor: 'firestore' }, + { id: 'firestore-rules', name: 'Firestore rules', art: 'rules', anchor: 'firestore-rules' }, + { id: 'auth', name: 'Authentication', art: 'auth', anchor: 'auth' }, + { id: 'storage', name: 'Cloud Storage', art: 'storage', anchor: 'storage' }, + { id: 'storage-rules', name: 'Storage rules', art: 'rules', anchor: 'storage-rules' }, + { id: 'functions', name: 'Cloud Functions', art: 'functions', anchor: 'functions' }, + { id: 'pubsub', name: 'Pub/Sub', art: 'pubsub', anchor: 'pubsub' }, + { id: 'tasks', name: 'Cloud Tasks', art: 'tasks', anchor: 'tasks' }, + { id: 'suite', name: 'Hub and console', art: 'console', anchor: 'console' }, +]; + +const record = JSON.parse(readFileSync(source, 'utf8')); +if (record.schemaVersion !== 1) throw new Error(`unknown schemaVersion ${record.schemaVersion}`); + +const known = new Set(SERVICES.map((service) => service.id)); +for (const set of record.sets) + if (!known.has(set.service)) throw new Error(`set ${set.id} names service ${set.service}, which the wall has no row for`); + +const casesBySet = new Map(); +for (const item of record.cases) { + if (!casesBySet.has(item.set)) casesBySet.set(item.set, []); + casesBySet.get(item.set).push(item); +} + +const clean = (text) => String(text ?? '').replace(/\s+/g, ' ').trim(); +// A recording names its own throwaway project; on the page it is just the project. +// (The engine's case list already names the recordings' own projects and +// buckets as {project}.) +const shown = (text) => clean(text).replace(/projects\/[a-z0-9-]+/g, 'projects/{project}'); +// An id written as a slug reads as words: "request-auth-shapes" → "request auth shapes". +const words = (text) => { + const value = clean(text).replace(/^Expression corpus: /, 'Rules expressions: '); + const slug = /^(.*?)([a-z0-9]+(?:[-_][a-z0-9]+)+)$/.exec(value); + return slug ? `${slug[1]}${slug[2].replace(/[-_]/g, ' ')}` : value; +}; +// Where an answer came from, in one phrase: the version goes where a reader +// looks for it ("Auth emulator (firebase-tools 15.22.0)"). +// "firebase-tools" never breaks at its hyphen. +const keepHyphen = (text) => text.replace(/firebase-tools/g, 'firebase\u2011tools'); +const referenceLabel = (name, version) => keepHyphen(label(name, version)); +const label = (name, version) => { + if (!version || name.includes(version)) return name; + if (/ with /.test(name)) return name.replace(/ with /, ` ${version} with `); + if (name.endsWith(' (Java)')) return `${name.slice(0, -' (Java)'.length)} ${version}`; + if (/\(([^)]+)\)$/.test(name)) return name.replace(/\(([^)]+)\)$/, `($1 ${version})`); + return `${name} ${version}`; +}; + +const services = []; +mkdirSync(join(root, 'public', 'conformance'), { recursive: true }); +for (const service of SERVICES) { + const sets = record.sets + .filter((set) => set.service === service.id) + // Production first, then the official emulator; inside each, the engine's order. + .sort((a, b) => (a.reference.kind === b.reference.kind ? 0 : a.reference.kind === 'production' ? -1 : 1)); + // The page lists a service's sets by what they cover, so the same calls + // recorded from production and from the official emulator sit together; + // the wall keeps production first. + const listed = (sets) => + [...sets].sort((a, b) => a.area.localeCompare(b.area) || (a.kind === b.kind ? 0 : a.kind === 'production' ? -1 : 1)); + const details = []; + const runs = []; + const summarySets = []; + for (const set of sets) { + const items = casesBySet.get(set.id) ?? []; + if (items.length !== set.answers) + throw new Error(`set ${set.id} declares ${set.answers} answers but lists ${items.length}`); + const first = details.length; + // Inside a set, what is proved first, then the deliberate differences, + // then what is not replayed yet, each in the recording's order: a state + // is one run of blocks on the wall. + const proved = items + .map((item, index) => { + const result = verified.get(`${item.set}\u0000${item.id}`); + return { item, index, state: STATES[result?.result] ?? 'u', result }; + }) + .sort((a, b) => ORDER[a.state] - ORDER[b.state] || a.index - b.index); + const counts = { c: 0, d: 0, u: 0 }; + let scenario = null; + for (const { item, state, result } of proved) { + counts[state] += 1; + const title = shown(words(item.scenario)) || shown(words(item.title)); + if (!scenario || scenario.title !== title || scenario.state !== state) { + scenario = { start: details.length, length: 0, set: summarySets.length, title, state }; + runs.push(scenario); + } + scenario.length += 1; + // Short keys: these files are fetched on a hover. + details.push({ + t: shown(words(item.title)), + q: shown(item.request), + a: shown(item.answer), + r: state, + ...(result?.compared ? { k: result.compared } : {}), + ...(state === 'd' && result?.reason ? { w: clean(result.reason) } : {}), + }); + } + summarySets.push({ + id: set.id, + area: clean(set.area), + kind: set.reference.kind, + reference: clean(set.reference.name), + version: set.reference.version ?? null, + label: referenceLabel(clean(set.reference.name), set.reference.version ?? null), + recordedAt: set.recordedAt ?? null, + scenarios: set.scenarios, + answers: set.answers, + checked: counts.c, + differs: counts.d, + unreplayed: counts.u, + start: first, + }); + } + // The wall's runs: one per set, reference and state, in wall order. + const spans = summarySets.flatMap((set) => { + const out = []; + let at = set.start; + for (const [state, length] of [['c', set.checked], ['d', set.differs], ['u', set.unreplayed]]) { + if (length > 0) out.push([at, length, set.kind, state]); + at += length; + } + return out; + }); + const production = summarySets.filter((set) => set.kind === 'production').reduce((sum, set) => sum + set.answers, 0); + services.push({ + ...service, + answers: details.length, + production, + official: details.length - production, + scenarios: summarySets.reduce((sum, set) => sum + set.scenarios, 0), + checked: summarySets.reduce((sum, set) => sum + set.checked, 0), + differs: summarySets.reduce((sum, set) => sum + set.differs, 0), + unreplayed: summarySets.reduce((sum, set) => sum + set.unreplayed, 0), + checkedProduction: summarySets.filter((set) => set.kind === 'production').reduce((sum, set) => sum + set.checked, 0), + sets: summarySets, + spans, + listed: listed(summarySets).map((set) => summarySets.indexOf(set)), + }); + // The scenarios as runs of blocks, [first, length, set, title], and each + // block's request and answer: what a hover shows. + writeFileSync( + join(root, 'public', 'conformance', `${service.id}.json`), + JSON.stringify({ runs: runs.map((run) => [run.start, run.length, run.set, run.title]), cases: details }), + ); +} + +const total = services.reduce((sum, service) => sum + service.answers, 0); +const production = services.reduce((sum, service) => sum + service.production, 0); +const summary = { + release, + importedAt: new Date().toISOString().slice(0, 10), + total, + production, + official: total - production, + scenarios: services.reduce((sum, service) => sum + service.scenarios, 0), + checked: services.reduce((sum, service) => sum + service.checked, 0), + differs: services.reduce((sum, service) => sum + service.differs, 0), + unreplayed: services.reduce((sum, service) => sum + service.unreplayed, 0), + checkedProduction: services.reduce((sum, service) => sum + service.checkedProduction, 0), + services, +}; +mkdirSync(join(root, 'src', 'data', 'conformance'), { recursive: true }); +writeFileSync(join(root, 'src', 'data', 'conformance', 'summary.json'), `${JSON.stringify(summary, null, 2)}\n`); +console.log( + `${total} answers (${production} from production) in ${services.length} services: ` + + `${summary.checked} checked, ${summary.differs} differ on purpose, ${summary.unreplayed} not replayed yet` + + (verifyPath ? '' : ' (no --verify: nothing counts as checked)'), +); +for (const service of services) + console.log(` ${service.name.padEnd(16)} ${String(service.answers).padStart(5)} production ${String(service.production).padStart(5)} sets ${service.sets.length} scenarios ${service.scenarios}`); diff --git a/scripts/terminal/README.md b/scripts/terminal/README.md index d3762b7..f02fd0d 100644 --- a/scripts/terminal/README.md +++ b/scripts/terminal/README.md @@ -56,7 +56,7 @@ each release, with the Node the screen should show first on `PATH`: --command "npx firebase emulators:start" --swap firebase=firenook --append " --keep-data" # init needs a folder that does not exist yet; shop becomes the project demo-shop. -.venv/bin/python3 record-init.py 108 39 ~/shop 0.2.1 /tmp/init.json +.venv/bin/python3 record-init.py 108 39 ~/shop 0.2.3 /tmp/init.json .venv/bin/python3 build.py /tmp/init.json /tmp/init-frames.json 2 .venv/bin/python3 gif.py /tmp/init-frames.json /tmp/init.gif --title "~/shop" \ --command "npx firenook init" --longest-wait 2.5 diff --git a/src/components/CaseWall.astro b/src/components/CaseWall.astro new file mode 100644 index 0000000..be94876 --- /dev/null +++ b/src/components/CaseWall.astro @@ -0,0 +1,765 @@ +--- +// Every answer recorded from Firebase, one block each, a row of them per +// service (src/lib/conformance.ts). A lit block is an answer Firenook gives +// the same way on every change: flame for an answer recorded from production, +// amber for one recorded from the official emulator. Pointing at a block +// shows what was asked and what was answered; the buttons above, which are +// also the key to the two colours, light one reference's answers only. +// +// The blocks are not elements: each row is an SVG whose lit runs are a few +// boxes under a mask of cells, so ~6,500 blocks cost a few dozen rects. A +// desktop row is 124 blocks wide and a phone's 64. +import Pixels from './Pixels.astro'; +import type { ArtName } from '../lib/pixels'; +import { COLUMNS, boxes, formatCount, record, rows, spans } from '../lib/conformance'; + +const services = record.services.filter((service) => service.answers > 0); +const variants = ['wide', 'narrow'] as const; +// What the script needs to explain a block: each set's reference and date. +const data = services.map((service) => ({ + id: service.id, + name: service.name, + answers: service.answers, + sets: service.sets.map((set) => ({ + kind: set.kind, + label: set.label, + recordedAt: set.recordedAt, + })), +})); +const label = (service: (typeof services)[number]) => + `${service.name}: ${formatCount(service.answers)} recorded answers${ + service.production ? `, ${formatCount(service.production)} of them from production` : '' + }; ${formatCount(service.checked)} checked against Firenook on every change${ + service.differs ? `, ${formatCount(service.differs)} answered differently on purpose` : '' + }`; +--- + +
+
+ + + +
+ + + +
    + { + services.map((service) => ( +
  1. + + + {service.name} + + {formatCount(service.answers)} + + + {variants.map((variant) => { + const columns = COLUMNS[variant]; + const height = rows(service.answers, columns); + return ( + + + {spans(service) + .filter((span) => span.state !== 'd') + .map((span) => + boxes(span.start, span.length, columns).map((box) => ( + + )), + )} + + + {/* A deliberate difference is an outlined block, drawn one by one: there are few. */} + {spans(service) + .filter((span) => span.state === 'd') + .flatMap((span) => Array.from({ length: span.length }, (_, offset) => span.start + offset)) + .map((index) => ( + index >= set.start && index < set.start + set.answers)?.kind ?? 'official'}`]} + x={(index % columns) + 0.16} + y={Math.floor(index / columns) + 0.16} + width="0.68" + height="0.68" + /> + ))} + + + ); + })} +
  2. + )) + } +
+ + +

+ + + diff --git a/src/components/Growth.astro b/src/components/Growth.astro new file mode 100644 index 0000000..a430b1c --- /dev/null +++ b/src/components/Growth.astro @@ -0,0 +1,191 @@ +--- +// How many answers had been recorded from Firebase at each release, from the +// recordings in the engine repository at that release's tag +// (src/data/conformance/history.json). A measured bar of whole blocks on one +// scale, as the benchmarks draw theirs: production's part in flame, the +// official emulator's in amber. A preview that recorded fewer than ten new +// answers is left out, so every bar is a step. Upright on a desktop; on a phone each release +// is a row, so nothing scrolls sideways. +import history from '../data/conformance/history.json'; +import { formatCount } from '../lib/conformance'; + +/** What one block of a bar stands for: the same upright and lying down. */ +const UNIT = 250; +const releases = history + .filter((release, index) => { + const stable = !release.release.includes('-'); + return index === 0 || stable || release.total - history[index - 1].total >= 10; + }) + .map((release) => { + const [version, preview] = release.release.split('-'); + // Both parts on the one scale, so production's 1,602 is the same + // length in every bar. + const production = release.production > 0 ? Math.max(1, Math.round(release.production / UNIT)) : 0; + const blocks = Math.max(production + 1, Math.round(release.total / UNIT)); + return { + ...release, + version, + preview: preview ?? null, + style: `--blocks: ${blocks}; --production-blocks: ${production}`, + }; + }); +--- + +
+
    + { + releases.map((release) => ( +
  1. + {formatCount(release.total)} +
  2. + )) + } +
+
+ Answers recorded at each release, counted from the recordings in the repository at its tag, each bar drawn to one + scale and production’s part in flame. Previews that added fewer than ten are left out. +
+
+ + diff --git a/src/components/Nav.astro b/src/components/Nav.astro index 1076091..78d5003 100644 --- a/src/components/Nav.astro +++ b/src/components/Nav.astro @@ -10,7 +10,7 @@ const top = [ ]; const tools = [ { href: '/console', label: 'The console', text: 'Every service, live, on the Emulator UI’s port' }, - { href: '/mcp', label: 'MCP for agents', text: '54 tools over the running emulators' }, + { href: '/mcp', label: 'MCP for agents', text: '55 tools over the running emulators' }, { href: '/benchmarks', label: 'Benchmarks', text: 'Measured on a real application' }, { href: '/compatibility', label: 'Compatibility', text: 'What each service covers, and what it does not' }, { href: '/vs/firebase-emulator-suite', label: 'Compared with the official suite', text: 'Side by side, with the sources' }, diff --git a/src/content/docs/docs/contribute/build.md b/src/content/docs/docs/contribute/build.md index 63be7a1..9befc86 100644 --- a/src/content/docs/docs/contribute/build.md +++ b/src/content/docs/docs/contribute/build.md @@ -11,7 +11,7 @@ project, and which tests a change must pass. ## What you need - **Rust**, the toolchain `rust-toolchain.toml` names: the stable channel with - `clippy` and `rustfmt`. The workspace needs Rust 1.98 or later, and 0.2.1 + `clippy` and `rustfmt`. The workspace needs Rust 1.98 or later, and 0.2.3 was built with 1.98.0, the toolchain the release records. - **Node 24.20.0 and npm 12.0.2**, the versions `CONTRIBUTING.md` names and the repository's checks pin: `console/` and `conformance/` declare @@ -86,7 +86,7 @@ what they lack. To run a change in your own app through the npm launcher, build a local candidate. It is a pair of private tarballs, the launcher and your machine's engine, with a version of their own that names the commit, such as -`0.2.1-local.g1a2b3c4d5e6f`. Nothing is published. +`0.2.3-local.g1a2b3c4d5e6f`. Nothing is published. 1. Commit your change. The build refuses uncommitted tracked changes, so every candidate names the exact source it came from. diff --git a/src/content/docs/docs/data/keep-data.mdx b/src/content/docs/docs/data/keep-data.mdx index 5427677..c01504c 100644 --- a/src/content/docs/docs/data/keep-data.mdx +++ b/src/content/docs/docs/data/keep-data.mdx @@ -19,7 +19,7 @@ npx firenook emulators:start --keep-data The first start begins empty and says where the data goes: ```text -firenook 0.2.1 +firenook 0.2.3 demo-shop · a fresh start Node 24.20.0 · data in .firenook/state ``` @@ -34,7 +34,7 @@ Every later start picks the data up, says when it was saved, and counts what it holds: ```text -firenook 0.2.1 +firenook 0.2.3 demo-shop · picking up the data saved just now Node 24.20.0 · data in .firenook/state @@ -52,7 +52,7 @@ Each start gets a new, empty working directory, `.firenook/runs/session-/state`, and says so: ```text -firenook 0.2.1 +firenook 0.2.3 demo-shop · a fresh start Node 24.20.0 · data in .firenook/runs/session-VLd3PD, for this run ``` diff --git a/src/content/docs/docs/data/seeds.mdx b/src/content/docs/docs/data/seeds.mdx index 23aa4f5..b645589 100644 --- a/src/content/docs/docs/data/seeds.mdx +++ b/src/content/docs/docs/data/seeds.mdx @@ -59,7 +59,7 @@ npx firenook emulators:start --import ./data --keep-data The first start imports it into `.firenook/state`: ```text -firenook 0.2.1 +firenook 0.2.3 demo-shop · first start, importing the seed "data" Node 24.20.0 · data in .firenook/state diff --git a/src/content/docs/docs/functions/debugging.mdx b/src/content/docs/docs/functions/debugging.mdx index 9af02ec..d3c9e03 100644 --- a/src/content/docs/docs/functions/debugging.mdx +++ b/src/content/docs/docs/functions/debugging.mdx @@ -46,7 +46,7 @@ codebase points it out. ### If a save seems to change nothing -In 0.2.1, a save that stops a codebase loading, such as code that throws +In 0.2.3, a save that stops a codebase loading, such as code that throws while it loads or a param with no default and no value, is reported only on the terminal screen. The plain output (`--plain`, pipes and CI) and the `--debug` log print nothing about it, and the version loaded before keeps diff --git a/src/content/docs/docs/functions/scheduled.mdx b/src/content/docs/docs/functions/scheduled.mdx index 3491add..d50be36 100644 --- a/src/content/docs/docs/functions/scheduled.mdx +++ b/src/content/docs/docs/functions/scheduled.mdx @@ -112,7 +112,7 @@ Firenook: schedule event pubsub for nightlyReport (us-central1, gcfv2) via trigg 200 OK http://127.0.0.1:5001/functions/projects/demo-shop/triggers/us-central1-nightlyReport-0 ``` -A schedule takes no data, so `--event-data '{}'` is enough. In 0.2.1 it is +A schedule takes no data, so `--event-data '{}'` is enough. In 0.2.3 it is also needed: without it, `functions:invoke` sends a plain HTTPS request, which a scheduled function does not answer, and the command exits with 1: diff --git a/src/content/docs/docs/get-started/ci.md b/src/content/docs/docs/get-started/ci.md index e519319..68ca742 100644 --- a/src/content/docs/docs/get-started/ci.md +++ b/src/content/docs/docs/get-started/ci.md @@ -70,7 +70,7 @@ looks like this, trimmed: ```text Firenook: running the script through the shell as the official CLI does; use -- for an argv command without shell interpretation -Firenook 0.2.1; engine 6556f79b2fda6ccc53c4700aff5fffc029939cde; disk/WAL state /.firenook/runs/session-Syhid2/state +Firenook 0.2.3; engine 2294132253f03395b0d9bafe391d35075e928112; disk/WAL state /.firenook/runs/session-Syhid2/state Services: firestore, auth, storage, functions, pubsub; Emulator UI on; host localhost Demo project demo-shop: no cloud service is contacted, but user Functions can still reach external providers; this CLI is not a network sandbox. Working data and launch receipt are preserved in /.firenook/runs/session-Syhid2. No automatic deletion. diff --git a/src/content/docs/docs/get-started/docker.md b/src/content/docs/docs/get-started/docker.md index 5a23208..50b5716 100644 --- a/src/content/docs/docs/get-started/docker.md +++ b/src/content/docs/docs/get-started/docker.md @@ -1,17 +1,73 @@ --- title: Docker -description: Run Firenook in a container. Pick a glibc Node image such as node:24-slim, listen on all interfaces, publish the ports, and keep the data in a volume. +description: Run Firenook in a container, from the release image ghcr.io/firenook-dev/firenook or your own on node:24-slim, listening on all interfaces, with the data kept. --- -Firenook runs in a Linux container as it runs on your machine. Four things -matter: an image with Node 22, 24 or 26 and glibc 2.28 or later, the -emulators listening on all interfaces, the ports published, and a volume for -the data you want to keep. +Firenook runs in a Linux container as it runs on your machine. Each release +is also an image, ready to start with your project mounted. Or build an image +of your own, with Firenook in your project's `package.json`. Either way, four +things matter: Node 22, 24 or 26 with glibc 2.28 or later, the emulators +listening on all interfaces, the ports published, and somewhere to keep the +data you want to keep. -## Pick the image +## Use the release image -Use `node:24-slim`. Firenook's Linux engine needs glibc 2.28 or later, and -the official Node images built on Debian have it: +`ghcr.io/firenook-dev/firenook:0.2.3` holds Node 24 and the `firenook` npm +package of that version, nothing else, for linux/amd64 and linux/arm64. +`latest` is the newest release. Mount the project, with its `firebase.json`, +rules and functions, at `/project`, publish the ports you use, and start the +emulators on every address in the container: + +```sh +docker run --rm -v "$PWD:/project" \ + -p 4000:4000 -p 8080:8080 -p 9099:9099 -p 9199:9199 \ + ghcr.io/firenook-dev/firenook:0.2.3 \ + emulators:start --project demo-shop --host 0.0.0.0 +``` + +The arguments after the image are Firenook's, as after `npx firenook`: +`emulators:exec`, `--only`, `--import` and the rest work the same way. The +console is at `http://localhost:4000/console`, and another container reaches +the emulators by the container's name. + +The image runs as its `node` user (uid 1000). On Linux, give it a project +folder it can write, or run it as yourself with +`--user "$(id -u):$(id -g)"`. `--keep-data` keeps the data in +`.firenook/state` inside the mounted folder, so it outlives the container. + +In Compose, or as a CI service container: + +```yaml title="compose.yaml" +services: + firebase: + image: ghcr.io/firenook-dev/firenook:0.2.3 + command: emulators:start --project demo-shop --host 0.0.0.0 + volumes: + - ./:/project + ports: + - "4000:4000" + - "8080:8080" + - "9099:9099" + - "9199:9199" + app: + build: . + environment: + FIRESTORE_EMULATOR_HOST: firebase:8080 + FIREBASE_AUTH_EMULATOR_HOST: firebase:9099 + FIREBASE_STORAGE_EMULATOR_HOST: firebase:9199 +``` + +Your functions run on the image's Node, from the mounted source, so their +`node_modules` must be installed for Linux: a module with native code +installed on macOS or Windows does not load in the container. Install them in +a Linux container or CI job first, or build your own image, as below. + +## Build your own image + +An image of your own installs Firenook and your functions' dependencies from +your lockfiles, on Linux. Start it from `node:24-slim`. Firenook's Linux +engine needs glibc 2.28 or later, and the official Node images built on Debian +have it: - `node:24-slim` (Debian 12, glibc 2.36) works, and is the image Firenook's own release checks start the engine in. `node:24` is the same system with diff --git a/src/content/docs/docs/get-started/install.mdx b/src/content/docs/docs/get-started/install.mdx index 4e7ddb5..06b0640 100644 --- a/src/content/docs/docs/get-started/install.mdx +++ b/src/content/docs/docs/get-started/install.mdx @@ -115,7 +115,7 @@ stops: ```console $ npx firenook binary-path -Firenook: Missing @firenook/cli-darwin-arm64@0.2.1. Install with optional dependencies enabled. No postinstall script is needed. +Firenook: Missing @firenook/cli-darwin-arm64@0.2.3. Install with optional dependencies enabled. No postinstall script is needed. ``` :::note @@ -150,7 +150,7 @@ published with, and prints where it is: ```console $ npx firenook --version -0.2.1 (engine source 6556f79b2fda6ccc53c4700aff5fffc029939cde) +0.2.3 (engine source 2294132253f03395b0d9bafe391d35075e928112) $ npx firenook binary-path ~/demo-shop/node_modules/@firenook/cli-darwin-arm64/bin/firenook ``` @@ -186,8 +186,8 @@ $ npx firenook doctor }, "warnings": [], "problems": [], - "version": "0.2.1", - "engineRevision": "6556f79b2fda6ccc53c4700aff5fffc029939cde" + "version": "0.2.3", + "engineRevision": "2294132253f03395b0d9bafe391d35075e928112" } ``` diff --git a/src/content/docs/docs/get-started/new-project.mdx b/src/content/docs/docs/get-started/new-project.mdx index f4c7c86..07f74f5 100644 --- a/src/content/docs/docs/get-started/new-project.mdx +++ b/src/content/docs/docs/get-started/new-project.mdx @@ -62,7 +62,7 @@ Enter takes them all: ╭──────────────────────────────────────────────────────────────────────────╮ │ │ │ ▄█ │ - │ ▄███▀ ▄ firenook 0.2.1 │ + │ ▄███▀ ▄ firenook 0.2.3 │ │ ▄███▀ ███▄ a new project in ~/my-app │ │ ▀██▀ ███▀ Node 24.20.0 · Claude Code found │ │ █▀▀ │ @@ -113,7 +113,7 @@ once. Each step gets a line with its time: │ │ │ Files ✓ 4 ms firebase.json, .firebaserc, rules, functions/, … │ │ Agents ✓ 0 ms .mcp.json for Claude Code │ - │ Firenook ✓ 517 ms 0.2.1 in package.json │ + │ Firenook ✓ 517 ms 0.2.3 in package.json │ │ Packages ✓ 14.1 s npm install in functions/, 241 packages │ │ Build ✓ 1.1 s tsc, into functions/lib │ │ │ @@ -211,7 +211,7 @@ The scripts, as `init` writes them for TypeScript: "emulators": "firenook emulators:start --keep-data --build" }, "devDependencies": { - "firenook": "0.2.1" + "firenook": "0.2.3" } } ``` @@ -292,7 +292,7 @@ Firenook init: project demo-my-app in ~/my-app wrote ~/my-app/functions/.gitignore wrote ~/my-app/.gitignore done Agents: .mcp.json for Claude Code (0.0 s) - done Firenook: 0.2.1 in package.json (0.4 s) + done Firenook: 0.2.3 in package.json (0.4 s) done Packages: npm install in functions/, 241 packages (2.3 s) done Build: tsc, into functions/lib (0.8 s) Next steps: diff --git a/src/content/docs/docs/get-started/tests.md b/src/content/docs/docs/get-started/tests.md index 4ff331b..ab6a937 100644 --- a/src/content/docs/docs/get-started/tests.md +++ b/src/content/docs/docs/get-started/tests.md @@ -149,7 +149,7 @@ builds the functions and starts the emulators around it. Trimmed: ```console $ npm run test:integration Firenook: running the script through the shell as the official CLI does; use -- for an argv command without shell interpretation -Firenook 0.2.1; engine 6556f79b2fda6ccc53c4700aff5fffc029939cde; disk/WAL state ~/demo-shop/.firenook/runs/session-Syhid2/state +Firenook 0.2.3; engine 2294132253f03395b0d9bafe391d35075e928112; disk/WAL state ~/demo-shop/.firenook/runs/session-Syhid2/state Services: firestore, auth, storage, functions, pubsub; Emulator UI on; host localhost Build: functions runs its build script before the emulators start firenook functions: Loaded functions definitions from source: helloWorld, orderTotal. diff --git a/src/content/docs/docs/help/former-name.md b/src/content/docs/docs/help/former-name.md index 6ec45a5..1c41a75 100644 --- a/src/content/docs/docs/help/former-name.md +++ b/src/content/docs/docs/help/former-name.md @@ -71,7 +71,7 @@ where Fireside left it. Start with the same `--state-dir`, and the same ```console $ npx firenook emulators:start --keep-data --state-dir ./local-state --import ./seed -Firenook 0.2.1; engine 6556f79b2fda6ccc53c4700aff5fffc029939cde; disk/WAL state ~/demo-shop/local-state +Firenook 0.2.3; engine 2294132253f03395b0d9bafe391d35075e928112; disk/WAL state ~/demo-shop/local-state firenook resuming validated native state (seed import skipped) firenook: indexed the top-level fields of 5 Firestore documents in 0.0 s All emulators ready diff --git a/src/content/docs/docs/help/report.md b/src/content/docs/docs/help/report.md index 7654032..ec701dc 100644 --- a/src/content/docs/docs/help/report.md +++ b/src/content/docs/docs/help/report.md @@ -17,7 +17,7 @@ Search the open and closed issues first: someone may have reported it, and ```console $ npx firenook --version -0.2.1 (engine source 6556f79b2fda6ccc53c4700aff5fffc029939cde) +0.2.3 (engine source 2294132253f03395b0d9bafe391d35075e928112) ``` Include the whole line: the engine revision says exactly which engine you @@ -51,7 +51,7 @@ log to the run's folder and prints where: ```console $ npx firenook emulators:start --plain --debug --only firestore -Firenook 0.2.1; engine 6556f79b2fda6ccc53c4700aff5fffc029939cde; disk/WAL state ~/demo-shop/.firenook/runs/session-12IyTo/state +Firenook 0.2.3; engine 2294132253f03395b0d9bafe391d35075e928112; disk/WAL state ~/demo-shop/.firenook/runs/session-12IyTo/state Services: firestore; Emulator UI on; host localhost Demo project demo-shop: no cloud service is contacted, but user Functions can still reach external providers; this CLI is not a network sandbox. Debug log: ~/demo-shop/.firenook/runs/session-12IyTo/firenook-debug.log diff --git a/src/content/docs/docs/help/troubleshooting.md b/src/content/docs/docs/help/troubleshooting.md index 5520297..0cb841e 100644 --- a/src/content/docs/docs/help/troubleshooting.md +++ b/src/content/docs/docs/help/troubleshooting.md @@ -82,7 +82,7 @@ it where your app connects too. Every emulator needs its own port; see ```console $ npx firenook emulators:start -Firenook: Missing @firenook/cli-darwin-arm64@0.2.1. Install with optional dependencies enabled. No postinstall script is needed. +Firenook: Missing @firenook/cli-darwin-arm64@0.2.3. Install with optional dependencies enabled. No postinstall script is needed. ``` The native engine for your machine comes in an optional dependency, one diff --git a/src/content/docs/docs/help/versions.md b/src/content/docs/docs/help/versions.md index 11bbf77..e70772c 100644 --- a/src/content/docs/docs/help/versions.md +++ b/src/content/docs/docs/help/versions.md @@ -8,7 +8,7 @@ install one on purpose, and how to check the package and the engine you have. ## Releases -The current release is `0.2.1`. The first for public use was `0.2.0`, and +The current release is `0.2.3`. The first for public use was `0.2.0`, and before it came the previews, `0.2.0-next.1` to `0.2.0-next.8`. Each release is listed, with what it changed and what it passed, on the [releases page](https://github.com/firenook-dev/firenook/releases) and in the @@ -20,7 +20,7 @@ only held the name before the first release and contains no emulator. ## Channels -npm has two tags for Firenook. `latest` is the release to install, `0.2.1` +npm has two tags for Firenook. `latest` is the release to install, `0.2.3` today; `npm install firenook` and a bare `npx firenook` get it on any Node from 20 up. `next` carries previews, which keep their own `-next` versions. `npm view firenook dist-tags` shows where each tag points. @@ -34,9 +34,9 @@ and every CI run gets the same release until you upgrade: npm install --save-dev firenook ``` -npm records it as `^0.2.1`: an update can take a later `0.2` release, never +npm records it as `^0.2.3`: an update can take a later `0.2` release, never `0.3` or a preview. To install one release in particular, name it, as in -`npm install --save-dev firenook@0.2.1`. +`npm install --save-dev firenook@0.2.3`. Firenook never upgrades itself. In a terminal, it asks the npm registry for the version tags at most once a day, in the background, and the next start @@ -51,8 +51,9 @@ say whether it changes how data is stored. ## Data between releases -Data kept with `--keep-data` moves between `0.2.1` and `0.2.0` as it is. It -also moves between `0.2.0` and the last preview, in both directions: +Data kept with `--keep-data` moves between `0.2.3`, `0.2.2`, `0.2.1` and +`0.2.0` as it is. It also moves between `0.2.0` and the last preview, in +both directions: - The first `0.2.0` start of data an earlier release saved builds the ordered field index once, with one read of every document: 7.4 s for @@ -77,14 +78,14 @@ both: ```console $ npx firenook --version -0.2.1 (engine source 6556f79b2fda6ccc53c4700aff5fffc029939cde) +0.2.3 (engine source 2294132253f03395b0d9bafe391d35075e928112) ``` The launcher records the engine it expects in `release.json`: ```json title="node_modules/firenook/release.json" { - "engineRevision": "6556f79b2fda6ccc53c4700aff5fffc029939cde", + "engineRevision": "2294132253f03395b0d9bafe391d35075e928112", "rustToolchain": "1.98.0", "platforms": { "darwin-arm64": "aarch64-apple-darwin", @@ -101,10 +102,10 @@ cut short: ```json title="node_modules/@firenook/cli-darwin-arm64/receipt.json" { - "version": "0.2.1", + "version": "0.2.3", "platform": "darwin-arm64", "target": "aarch64-apple-darwin", - "engineRevision": "6556f79b2fda6ccc53c4700aff5fffc029939cde", + "engineRevision": "2294132253f03395b0d9bafe391d35075e928112", "sha256": "…" } ``` @@ -152,7 +153,7 @@ They do not replace npm's provenance or your lockfile. ## What a release has passed -Each release on GitHub, tagged `npm-v0.2.1` and so on, names its +Each release on GitHub, tagged `npm-v0.2.3` and so on, names its engine revision and the CI runs it passed, and carries: - the published tarballs, the launcher's and each platform's; @@ -165,8 +166,8 @@ You can compare what npm serves with the manifest. `npm pack` downloads the tarball, and its SHA-256 must match the manifest's: ```sh -npm pack firenook@0.2.1 -shasum -a 256 firenook-0.2.1.tgz +npm pack firenook@0.2.3 +shasum -a 256 firenook-0.2.3.tgz ``` A platform is supported for a release only when that release's run passed on diff --git a/src/content/docs/docs/index.mdx b/src/content/docs/docs/index.mdx index fad9635..13b42bc 100644 --- a/src/content/docs/docs/index.mdx +++ b/src/content/docs/docs/index.mdx @@ -59,7 +59,7 @@ Java and nothing else to download. ## Status -These docs describe Firenook `0.2.1`. It +These docs describe Firenook `0.2.3`. It runs on Node 22, 24 or 26, on macOS (Apple silicon and Intel), Linux x64 and arm64 with glibc 2.28 or newer, and Windows x64. Every release passes conformance replays against the official emulator and packed installs on all diff --git a/src/content/docs/docs/reference/cli.md b/src/content/docs/docs/reference/cli.md index a9599a1..0bc8e7a 100644 --- a/src/content/docs/docs/reference/cli.md +++ b/src/content/docs/docs/reference/cli.md @@ -1,6 +1,6 @@ --- title: CLI commands -description: Every firenook command and flag in 0.2.1, grouped as firenook --help groups them, with what each does and its default. +description: Every firenook command and flag in 0.2.3, grouped as firenook --help groups them, with what each does and its default. --- Every command the `firenook` executable takes, grouped as `firenook --help` @@ -9,7 +9,7 @@ groups them. Run them through your package manager (`npx firenook ...`, ```console $ npx firenook --version -0.2.1 (engine source 6556f79b2fda6ccc53c4700aff5fffc029939cde) +0.2.3 (engine source 2294132253f03395b0d9bafe391d35075e928112) ``` `firenook --help`, `-h` or `help` prints one help text for every command, @@ -292,8 +292,8 @@ $ npx firenook doctor ... "warnings": [], "problems": [], - "version": "0.2.1", - "engineRevision": "6556f79b2fda6ccc53c4700aff5fffc029939cde" + "version": "0.2.3", + "engineRevision": "2294132253f03395b0d9bafe391d35075e928112" } ``` @@ -628,6 +628,7 @@ Every command above takes these, where they apply. | `--inspect-functions[=PORT]` | Starts the Functions workers with the Node inspector. See [Debugging](/docs/functions/debugging). | Port 9229, counting up per codebase | | `--offline` | Never contacts the Extensions registry: every Extension must be vendored or cached. | | | `--no-diagnostics` | Stops recording Firestore requests with their rule evaluations, and rules coverage. | Recorded | +| `--strict-indexes` | Refuses a Firestore query whose composite index `firestore.indexes.json` does not declare, with `FAILED_PRECONDITION`, as production does. Without it the query is answered and the index is warned of once. See [Queries and indexes](/docs/services/firestore#queries-and-indexes). | Answered and warned of | | `--plain` | Prints plain lines instead of the [terminal screen](/docs/tools/terminal#plain-output). | The screen, in a terminal | | `--hub-port N` | The hub's port. | `emulators.hub.port`, else 4400 | | `--logging-port N` | The logging listener's port. | `emulators.logging.port`, else 4500 | diff --git a/src/content/docs/docs/reference/mcp-tools.mdx b/src/content/docs/docs/reference/mcp-tools.mdx index ef5b2c6..bbb42c5 100644 --- a/src/content/docs/docs/reference/mcp-tools.mdx +++ b/src/content/docs/docs/reference/mcp-tools.mdx @@ -1,12 +1,12 @@ --- title: MCP tools -description: All 54 tools firenook mcp gives a coding agent, by group, with what each does and the parameters it takes. +description: All 55 tools firenook mcp gives a coding agent, by group, with what each does and the parameters it takes. --- import McpTools from '../../../../components/docs/McpTools.astro'; -`firenook mcp` serves these 54 tools to a coding agent, in this order. The -list is what the server answers to `tools/list` in 0.2.1. To connect +`firenook mcp` serves these 55 tools to a coding agent, in this order. The +list is what the server answers to `tools/list` in 0.2.3. To connect an agent, see [Connect your coding agent](/docs/tools/mcp). Two marks recur below: diff --git a/src/content/docs/docs/reference/ports.md b/src/content/docs/docs/reference/ports.md index a21e0d2..5f38766 100644 --- a/src/content/docs/docs/reference/ports.md +++ b/src/content/docs/docs/reference/ports.md @@ -169,14 +169,6 @@ $ npx firenook firestore:delete orders -r -f --json --project demo-shop --hub-po {"path":"orders","mode":"recursive","deleted":2} ``` -:::caution -Auth sends its user events to the Functions port in `firebase.json` -(`127.0.0.1:5001` by default) even when Functions does not run, as with -`--only firestore,auth`. If another suite's Functions emulator listens on -that port, it receives them. When two suites run at once, give each its own -`emulators.functions.port`, or run Functions with Auth. -::: - ## Next [Configuration](/docs/reference/configuration) covers the rest of diff --git a/src/content/docs/docs/services/firestore.mdx b/src/content/docs/docs/services/firestore.mdx index 61dc6c5..f4450eb 100644 --- a/src/content/docs/docs/services/firestore.mdx +++ b/src/content/docs/docs/services/firestore.mdx @@ -107,24 +107,64 @@ value is rounded down before rules see the write. `9 FAILED_PRECONDITION: Pipeline Operations are only available for Firestore databases in Enterprise edition.` - **Index enforcement.** Like the official emulator, Firenook answers a query - whether or not production would need a composite index for it. The next - section shows how it tells you. + whether or not production would need a composite index for it, and tells + you when it would. `--strict-indexes` refuses it, as production does. The + next section shows both. ## Queries and indexes -Firenook reads the `indexes` file that `firebase.json` names when it starts. -Like the official emulator, it never uses the file to refuse a query, and a -file it cannot read does not stop the start; it says so and goes on: +Firenook reads the `indexes` file that `firebase.json` names and watches it, +as it watches the rules file: a save is in force for the next query, with no +restart. A file it cannot read leaves the indexes in force and says why. At +start it is a warning, not a refusal, unless you start with `--strict-indexes`: ```text firenook: the Firestore indexes in ~/demo-shop/firestore.indexes.json were not read (invalid index JSON: invalid type: string "oops", expected a sequence at line 2 column 19); the console explains the queries of database "(default)" as if it declared none ``` -The console's query plan, on the Firestore page, uses the file: for the query -you are looking at, it shows how the engine answers it, the composite index -production would need, whether your `firestore.indexes.json` already declares -it, and the entry to copy into the file. So a query that works here and would -fail after a deploy shows up before you deploy. +A query that needs a composite index the file does not declare is answered, +as the official emulator answers it, and warned of once, with the entry to +add: + +```text +firenook: production would refuse a query answered here; --strict-indexes refuses it here too. The query requires a composite index on "orders" that firestore.indexes.json does not declare. Add to its "indexes": +{ + "collectionGroup": "orders", + "fields": [ + { + "fieldPath": "status", + "order": "ASCENDING" + }, + { + "fieldPath": "total", + "order": "DESCENDING" + } + ], + "queryScope": "COLLECTION" +} +``` + +A collection group query on one field gets the field override to add to +`"fieldOverrides"` instead. + +Start with `--strict-indexes` and the query is refused instead, with +`FAILED_PRECONDITION`, as production refuses it, until the file declares the +index. The console's own queries are never warned of or refused. + +The console's **Firestore → Indexes** page lists every index the app's +queries needed that the file does not declare, with the query (its fields +and operators, never its values) and how many queries needed it. **Add** +writes the entry into `firestore.indexes.json`, beside the entries already +there, and it is in force for the next query; **Remove** takes one out. The +rest of the file is left as it was, and an edit never overwrites a change +you saved in your editor since the page read the file. For a coding agent, +the `firestore_missing_indexes` [MCP tool](/docs/reference/mcp-tools) answers +the same list. + +The query plan, on the Firestore page, shows for the query you are looking at +how the engine answers it, the composite index production would need, and +whether your file declares it. So a query that works here and would fail +after a deploy shows up before you deploy. ### The field index diff --git a/src/content/docs/docs/services/functions.mdx b/src/content/docs/docs/services/functions.mdx index 531385d..987e413 100644 --- a/src/content/docs/docs/services/functions.mdx +++ b/src/content/docs/docs/services/functions.mdx @@ -167,7 +167,7 @@ answering, and the next save loads them again; [if a save seems to change nothing](/docs/functions/debugging#if-a-save-seems-to-change-nothing), read the terminal screen or the console. In a terminal, `r` reloads by hand. -In 0.2.1, a function you remove, rename or move to another region (a +In 0.2.3, a function you remove, rename or move to another region (a `region` param changed in `.env`, for one) keeps its old route until the emulators restart. A call to the old route answers `500`, and the log says: diff --git a/src/content/docs/docs/tools/mcp.mdx b/src/content/docs/docs/tools/mcp.mdx index 7905366..3bdda6f 100644 --- a/src/content/docs/docs/tools/mcp.mdx +++ b/src/content/docs/docs/tools/mcp.mdx @@ -163,7 +163,7 @@ agent starts it in, and takes the project id from there. Its first line, on stderr, says what it found: ```text -firenook mcp 0.2.1: 54 tools over stdio for project demo-shop (from ~/demo-shop/firebase.json); local emulators only +firenook mcp 0.2.3: 55 tools over stdio for project demo-shop (from ~/demo-shop/firebase.json); local emulators only ``` `--project ` picks the project, and `--config ` reads a @@ -250,5 +250,5 @@ carries only protocol messages; everything else goes to stderr. ## Next -[MCP tools](/docs/reference/mcp-tools) lists all 54 tools with their +[MCP tools](/docs/reference/mcp-tools) lists all 55 tools with their parameters, and [the MCP page](/mcp) shows an agent working with them. diff --git a/src/content/docs/docs/tools/terminal.md b/src/content/docs/docs/tools/terminal.md index 19f34e8..b7e0126 100644 --- a/src/content/docs/docs/tools/terminal.md +++ b/src/content/docs/docs/tools/terminal.md @@ -19,7 +19,7 @@ of `?`. The empty rows above the footer are left out. ╭──────────────────────────────────────────────────────────────────────╮ │ │ │ ▄█ │ - │ ▄███▀ ▄ firenook 0.2.1 │ + │ ▄███▀ ▄ firenook 0.2.3 │ │ ▄███▀ ███▄ demo-shop · picking up the data saved 1 minute ago │ │ ▀██▀ ███▀ Node 24.20.0 · data in .firenook/state │ │ █▀▀ │ @@ -340,7 +340,7 @@ Firenook prints plain lines, with no screen, when: The plain lines look like this (trimmed): ```text -Firenook 0.2.1; engine 6556f79b2fda6ccc53c4700aff5fffc029939cde; disk/WAL state ~/demo-shop/.firenook/state +Firenook 0.2.3; engine 2294132253f03395b0d9bafe391d35075e928112; disk/WAL state ~/demo-shop/.firenook/state Services: firestore, auth, storage, functions, pubsub; Emulator UI on; host localhost firenook: Starting emulators: auth, functions, firestore, pubsub, storage firenook functions: Loaded functions definitions from source: checkout, sendReceipt, stripeWebhook, nightlyReport. @@ -387,7 +387,7 @@ splits into two lines, and below 64 columns the banner drops the flame: ```text +------------------------------------------------------+ | | - | firenook 0.2.1 | + | firenook 0.2.3 | | demo-shop - a fresh start | | Node 24.20.0 - data in .firenook/... | | | @@ -423,7 +423,7 @@ folder that already has a `firebase.json`, the card shows what Once a day at most, in the background, Firenook asks the npm registry for its latest version tags. The answer shows on the next start, as the Update row of the ready summary, so the check never slows a start down. It follows -the channel of the version you have: `latest` for a release such as 0.2.1, +the channel of the version you have: `latest` for a release such as 0.2.3, and `next` for a preview, which also hears of a later release on `latest`. It gives the install command for your package manager, from your lockfile. It never runs in plain output, in CI, or with diff --git a/src/data/conformance/history.json b/src/data/conformance/history.json new file mode 100644 index 0000000..8841672 --- /dev/null +++ b/src/data/conformance/history.json @@ -0,0 +1,128 @@ +[ + { + "release": "0.1.0-next.3", + "date": "2026-09-09", + "total": 2462, + "production": 1296, + "official": 1166 + }, + { + "release": "0.1.0-next.4", + "date": "2026-09-11", + "total": 2702, + "production": 1296, + "official": 1406 + }, + { + "release": "0.1.0-next.5", + "date": "2026-09-12", + "total": 2703, + "production": 1296, + "official": 1407 + }, + { + "release": "0.1.0-next.6", + "date": "2026-09-17", + "total": 2703, + "production": 1296, + "official": 1407 + }, + { + "release": "0.1.0-next.7", + "date": "2026-09-18", + "total": 3619, + "production": 1602, + "official": 2017 + }, + { + "release": "0.1.0-next.8", + "date": "2026-09-19", + "total": 5587, + "production": 1602, + "official": 3985 + }, + { + "release": "0.1.0-next.9", + "date": "2026-09-19", + "total": 5647, + "production": 1602, + "official": 4045 + }, + { + "release": "0.2.0-next.1", + "date": "2026-09-19", + "total": 5647, + "production": 1602, + "official": 4045 + }, + { + "release": "0.2.0-next.2", + "date": "2026-10-03", + "total": 5647, + "production": 1602, + "official": 4045 + }, + { + "release": "0.2.0-next.3", + "date": "2026-10-17", + "total": 5665, + "production": 1602, + "official": 4063 + }, + { + "release": "0.2.0-next.4", + "date": "2026-10-17", + "total": 5665, + "production": 1602, + "official": 4063 + }, + { + "release": "0.2.0-next.5", + "date": "2026-10-18", + "total": 5665, + "production": 1602, + "official": 4063 + }, + { + "release": "0.2.0-next.6", + "date": "2026-10-18", + "total": 5665, + "production": 1602, + "official": 4063 + }, + { + "release": "0.2.0-next.7", + "date": "2026-10-21", + "total": 5665, + "production": 1602, + "official": 4063 + }, + { + "release": "0.2.0-next.8", + "date": "2026-10-21", + "total": 5665, + "production": 1602, + "official": 4063 + }, + { + "release": "0.2.0", + "date": "2026-10-22", + "total": 6042, + "production": 1602, + "official": 4440 + }, + { + "release": "0.2.1", + "date": "2026-11-05", + "total": 6050, + "production": 1602, + "official": 4448 + }, + { + "release": "0.2.2", + "date": "2026-11-11", + "total": 6563, + "production": 1602, + "official": 4961 + } +] diff --git a/src/data/conformance/summary.json b/src/data/conformance/summary.json new file mode 100644 index 0000000..e69159d --- /dev/null +++ b/src/data/conformance/summary.json @@ -0,0 +1,1280 @@ +{ + "release": "0.2.3", + "importedAt": "2026-11-12", + "total": 6592, + "production": 1602, + "official": 4990, + "scenarios": 574, + "checked": 5874, + "differs": 202, + "unreplayed": 516, + "checkedProduction": 1427, + "services": [ + { + "id": "firestore", + "name": "Firestore", + "art": "firestore", + "anchor": "firestore", + "answers": 650, + "production": 188, + "official": 462, + "scenarios": 88, + "checked": 338, + "differs": 10, + "unreplayed": 302, + "checkedProduction": 42, + "sets": [ + { + "id": "rest-v1/production-cloud-firestore", + "area": "Browser REST calls: aggregation, transactions, CORS", + "kind": "production", + "reference": "Cloud Firestore (production)", + "version": null, + "label": "Cloud Firestore (production)", + "recordedAt": "2026-08-31", + "scenarios": 5, + "answers": 22, + "checked": 1, + "differs": 0, + "unreplayed": 21, + "start": 0 + }, + { + "id": "webchannel-v8/production-cloud-firestore", + "area": "Browser WebChannel: Listen and Write streams, framing, errors", + "kind": "production", + "reference": "Cloud Firestore (production)", + "version": null, + "label": "Cloud Firestore (production)", + "recordedAt": "2026-08-31", + "scenarios": 14, + "answers": 166, + "checked": 41, + "differs": 0, + "unreplayed": 125, + "start": 22 + }, + { + "id": "developer-tools-listing-v1", + "area": "Firestore REST listing: collection ids, documents, masks, page tokens", + "kind": "official", + "reference": "Firestore emulator (Java)", + "version": "1.22.0", + "label": "Firestore emulator 1.22.0", + "recordedAt": "2026-09-10", + "scenarios": 1, + "answers": 22, + "checked": 21, + "differs": 1, + "unreplayed": 0, + "start": 188 + }, + { + "id": "document-map-serialization", + "area": "Repeated reads return the same document-map serialization", + "kind": "official", + "reference": "Firestore emulator (Java)", + "version": "1.22.0", + "label": "Firestore emulator 1.22.0", + "recordedAt": "2026-09-09", + "scenarios": 28, + "answers": 28, + "checked": 28, + "differs": 0, + "unreplayed": 0, + "start": 210 + }, + { + "id": "firebase-suite-v1/firestore-export", + "area": "Importing a multi-shard export", + "kind": "official", + "reference": "Firestore emulator (Java)", + "version": "1.22.0", + "label": "Firestore emulator 1.22.0", + "recordedAt": "2026-09-08", + "scenarios": 1, + "answers": 1, + "checked": 0, + "differs": 0, + "unreplayed": 1, + "start": 238 + }, + { + "id": "firestore-bloom-nonmember-false-positive", + "area": "Bloom filter false positives in the official client", + "kind": "official", + "reference": "Firestore JS SDK (firebase)", + "version": "12.18.0", + "label": "Firestore JS SDK (firebase 12.18.0)", + "recordedAt": "2026-09-05", + "scenarios": 0, + "answers": 0, + "checked": 0, + "differs": 0, + "unreplayed": 0, + "start": 239 + }, + { + "id": "kindless-query-v1", + "area": "Kindless (all-descendants) queries and recursiveDelete", + "kind": "official", + "reference": "Firestore emulator (Java)", + "version": "1.22.0", + "label": "Firestore emulator 1.22.0", + "recordedAt": "2026-11-05", + "scenarios": 14, + "answers": 168, + "checked": 166, + "differs": 2, + "unreplayed": 0, + "start": 239 + }, + { + "id": "listen-resume-v1", + "area": "A listener resuming with a resume token or read time", + "kind": "official", + "reference": "Firestore emulator (Java)", + "version": "1.22.0", + "label": "Firestore emulator 1.22.0", + "recordedAt": "2026-11-06", + "scenarios": 1, + "answers": 12, + "checked": 11, + "differs": 1, + "unreplayed": 0, + "start": 407 + }, + { + "id": "official-export-v1.22.0", + "area": "An official Firestore export on disk", + "kind": "official", + "reference": "Firestore emulator (Java)", + "version": "1.22.0", + "label": "Firestore emulator 1.22.0", + "recordedAt": "2026-08-27", + "scenarios": 1, + "answers": 1, + "checked": 0, + "differs": 0, + "unreplayed": 1, + "start": 419 + }, + { + "id": "rest-read-options-v1", + "area": "REST read projection and consistency selectors", + "kind": "official", + "reference": "Firestore emulator (Java)", + "version": "1.22.0", + "label": "Firestore emulator 1.22.0", + "recordedAt": "2026-09-10", + "scenarios": 2, + "answers": 25, + "checked": 16, + "differs": 6, + "unreplayed": 3, + "start": 420 + }, + { + "id": "rest-v1/java-v1.22.0", + "area": "Browser REST calls: aggregation, transactions, CORS", + "kind": "official", + "reference": "Firestore emulator (Java)", + "version": "1.22.0", + "label": "Firestore emulator 1.22.0", + "recordedAt": "2026-08-31", + "scenarios": 6, + "answers": 26, + "checked": 9, + "differs": 0, + "unreplayed": 17, + "start": 445 + }, + { + "id": "webchannel-v8/java-v1.22.0", + "area": "Browser WebChannel: Listen and Write streams, framing, errors", + "kind": "official", + "reference": "Firestore emulator (Java)", + "version": "1.22.0", + "label": "Firestore emulator 1.22.0", + "recordedAt": "2026-09-04", + "scenarios": 15, + "answers": 179, + "checked": 45, + "differs": 0, + "unreplayed": 134, + "start": 471 + } + ], + "spans": [ + [ + 0, + 1, + "production", + "c" + ], + [ + 1, + 21, + "production", + "u" + ], + [ + 22, + 41, + "production", + "c" + ], + [ + 63, + 125, + "production", + "u" + ], + [ + 188, + 21, + "official", + "c" + ], + [ + 209, + 1, + "official", + "d" + ], + [ + 210, + 28, + "official", + "c" + ], + [ + 238, + 1, + "official", + "u" + ], + [ + 239, + 166, + "official", + "c" + ], + [ + 405, + 2, + "official", + "d" + ], + [ + 407, + 11, + "official", + "c" + ], + [ + 418, + 1, + "official", + "d" + ], + [ + 419, + 1, + "official", + "u" + ], + [ + 420, + 16, + "official", + "c" + ], + [ + 436, + 6, + "official", + "d" + ], + [ + 442, + 3, + "official", + "u" + ], + [ + 445, + 9, + "official", + "c" + ], + [ + 454, + 17, + "official", + "u" + ], + [ + 471, + 45, + "official", + "c" + ], + [ + 516, + 134, + "official", + "u" + ] + ], + "listed": [ + 7, + 8, + 5, + 0, + 10, + 1, + 11, + 2, + 4, + 6, + 3, + 9 + ] + }, + { + "id": "firestore-rules", + "name": "Firestore rules", + "art": "rules", + "anchor": "firestore-rules", + "answers": 2485, + "production": 1108, + "official": 1377, + "scenarios": 220, + "checked": 2212, + "differs": 171, + "unreplayed": 102, + "checkedProduction": 1082, + "sets": [ + { + "id": "rules-v2/production-rules-api", + "area": "Firestore Security Rules expressions, language surface, compiler and limits", + "kind": "production", + "reference": "Firebase Rules API (production)", + "version": null, + "label": "Firebase Rules API (production)", + "recordedAt": "2026-09-01", + "scenarios": 35, + "answers": 1108, + "checked": 1082, + "differs": 3, + "unreplayed": 23, + "start": 0 + }, + { + "id": "developer-tools-coverage-v1", + "area": "Rules expression coverage reports", + "kind": "official", + "reference": "Firestore emulator (Java)", + "version": "1.22.0", + "label": "Firestore emulator 1.22.0", + "recordedAt": "2026-09-10", + "scenarios": 3, + "answers": 31, + "checked": 14, + "differs": 0, + "unreplayed": 17, + "start": 1108 + }, + { + "id": "developer-tools-request-metadata-v1", + "area": "Rules evaluation context of queries, writes and transactions", + "kind": "official", + "reference": "Firestore emulator (Java)", + "version": "1.22.0", + "label": "Firestore emulator 1.22.0", + "recordedAt": "2026-09-10", + "scenarios": 2, + "answers": 49, + "checked": 0, + "differs": 0, + "unreplayed": 49, + "start": 1139 + }, + { + "id": "developer-tools-request-values-v1", + "area": "Rules evaluation context of typed request values", + "kind": "official", + "reference": "Firestore emulator (Java)", + "version": "1.22.0", + "label": "Firestore emulator 1.22.0", + "recordedAt": "2026-09-10", + "scenarios": 2, + "answers": 14, + "checked": 1, + "differs": 0, + "unreplayed": 13, + "start": 1188 + }, + { + "id": "request-identity-v1", + "area": "Who a Firestore request is from: tokens, owner, claims and denials", + "kind": "official", + "reference": "Firestore emulator (Java)", + "version": "1.22.0", + "label": "Firestore emulator 1.22.0", + "recordedAt": "2026-10-21", + "scenarios": 48, + "answers": 360, + "checked": 193, + "differs": 167, + "unreplayed": 0, + "start": 1202 + }, + { + "id": "rule-bindings-v1", + "area": "Which identifiers rules accept as parameters, variables and wildcards", + "kind": "official", + "reference": "Firestore emulator (Java)", + "version": "1.22.0", + "label": "Firestore emulator 1.22.0", + "recordedAt": "2026-09-10", + "scenarios": 8, + "answers": 40, + "checked": 40, + "differs": 0, + "unreplayed": 0, + "start": 1562 + }, + { + "id": "rules-document-paths-v1", + "area": "Paths and document names in Security Rules", + "kind": "official", + "reference": "Firestore emulator (Java)", + "version": "1.22.0", + "label": "Firestore emulator 1.22.0", + "recordedAt": "2026-11-06", + "scenarios": 3, + "answers": 135, + "checked": 135, + "differs": 0, + "unreplayed": 0, + "start": 1602 + }, + { + "id": "rules-unit-testing-v1", + "area": "@firebase/rules-unit-testing against the emulators", + "kind": "official", + "reference": "Firestore and Storage emulators (firebase-tools)", + "version": "15.34.0", + "label": "Firestore and Storage emulators (firebase‑tools 15.34.0)", + "recordedAt": null, + "scenarios": 0, + "answers": 0, + "checked": 0, + "differs": 0, + "unreplayed": 0, + "start": 1737 + }, + { + "id": "rules-v2/contributed-rooms", + "area": "Firestore Security Rules: a ruleset contributed by a user, with its allowed and denied requests", + "kind": "official", + "reference": "Firestore emulator (Java)", + "version": "1.22.0", + "label": "Firestore emulator 1.22.0", + "recordedAt": "2026-11-11", + "scenarios": 13, + "answers": 29, + "checked": 28, + "differs": 1, + "unreplayed": 0, + "start": 1737 + }, + { + "id": "rules-v2/official-emulator", + "area": "Firestore Security Rules: access limits, getAfter, runtime errors, a large ruleset and query authorization", + "kind": "official", + "reference": "Firestore emulator (Java)", + "version": "1.22.0", + "label": "Firestore emulator 1.22.0", + "recordedAt": "2026-09-08", + "scenarios": 106, + "answers": 719, + "checked": 719, + "differs": 0, + "unreplayed": 0, + "start": 1766 + } + ], + "spans": [ + [ + 0, + 1082, + "production", + "c" + ], + [ + 1082, + 3, + "production", + "d" + ], + [ + 1085, + 23, + "production", + "u" + ], + [ + 1108, + 14, + "official", + "c" + ], + [ + 1122, + 17, + "official", + "u" + ], + [ + 1139, + 49, + "official", + "u" + ], + [ + 1188, + 1, + "official", + "c" + ], + [ + 1189, + 13, + "official", + "u" + ], + [ + 1202, + 193, + "official", + "c" + ], + [ + 1395, + 167, + "official", + "d" + ], + [ + 1562, + 40, + "official", + "c" + ], + [ + 1602, + 135, + "official", + "c" + ], + [ + 1737, + 28, + "official", + "c" + ], + [ + 1765, + 1, + "official", + "d" + ], + [ + 1766, + 719, + "official", + "c" + ] + ], + "listed": [ + 7, + 0, + 8, + 9, + 6, + 2, + 3, + 1, + 5, + 4 + ] + }, + { + "id": "auth", + "name": "Authentication", + "art": "auth", + "anchor": "auth", + "answers": 1160, + "production": 0, + "official": 1160, + "scenarios": 73, + "checked": 1149, + "differs": 9, + "unreplayed": 2, + "checkedProduction": 0, + "sets": [ + { + "id": "auth-claims-length-v1", + "area": "Custom claims length measured in UTF-16 code units", + "kind": "official", + "reference": "Auth emulator (firebase-tools)", + "version": "15.22.0", + "label": "Auth emulator (firebase‑tools 15.22.0)", + "recordedAt": "2026-10-11", + "scenarios": 1, + "answers": 18, + "checked": 18, + "differs": 0, + "unreplayed": 0, + "start": 0 + }, + { + "id": "auth-v1", + "area": "Every Auth operation over raw HTTP", + "kind": "official", + "reference": "Auth emulator (firebase-tools)", + "version": "15.22.0", + "label": "Auth emulator (firebase‑tools 15.22.0)", + "recordedAt": "2026-09-18", + "scenarios": 61, + "answers": 1068, + "checked": 1059, + "differs": 9, + "unreplayed": 0, + "start": 18 + }, + { + "id": "firebase-suite-v1/auth", + "area": "Auth through the emulator suite: browser flows, popups, refresh and import/export", + "kind": "official", + "reference": "Auth emulator (firebase-tools)", + "version": "15.22.0", + "label": "Auth emulator (firebase‑tools 15.22.0)", + "recordedAt": "2026-11-03", + "scenarios": 11, + "answers": 74, + "checked": 72, + "differs": 0, + "unreplayed": 2, + "start": 1086 + } + ], + "spans": [ + [ + 0, + 18, + "official", + "c" + ], + [ + 18, + 1059, + "official", + "c" + ], + [ + 1077, + 9, + "official", + "d" + ], + [ + 1086, + 72, + "official", + "c" + ], + [ + 1158, + 2, + "official", + "u" + ] + ], + "listed": [ + 2, + 0, + 1 + ] + }, + { + "id": "storage", + "name": "Cloud Storage", + "art": "storage", + "anchor": "storage", + "answers": 326, + "production": 0, + "official": 326, + "scenarios": 52, + "checked": 295, + "differs": 1, + "unreplayed": 30, + "checkedProduction": 0, + "sets": [ + { + "id": "developer-tools-buckets-v1", + "area": "Default bucket discovery by the Emulator UI", + "kind": "official", + "reference": "Storage emulator (firebase-tools)", + "version": "15.22.0", + "label": "Storage emulator (firebase‑tools 15.22.0)", + "recordedAt": "2026-09-10", + "scenarios": 1, + "answers": 2, + "checked": 1, + "differs": 0, + "unreplayed": 1, + "start": 0 + }, + { + "id": "firebase-suite-v1/storage", + "area": "Storage through the emulator suite: v0 and GCS routes, encodings, pagination", + "kind": "official", + "reference": "Storage emulator (firebase-tools)", + "version": "15.22.0", + "label": "Storage emulator (firebase‑tools 15.22.0)", + "recordedAt": "2026-09-08", + "scenarios": 10, + "answers": 109, + "checked": 80, + "differs": 0, + "unreplayed": 29, + "start": 2 + }, + { + "id": "storage-demo-targets-v1", + "area": "Storage targets that map to no bucket", + "kind": "official", + "reference": "Storage emulator (firebase-tools)", + "version": "15.34.0", + "label": "Storage emulator (firebase‑tools 15.34.0)", + "recordedAt": "2026-10-21", + "scenarios": 5, + "answers": 17, + "checked": 16, + "differs": 1, + "unreplayed": 0, + "start": 111 + }, + { + "id": "storage-native-clients-v1", + "area": "Storage as the iOS, Android and web SDKs call it", + "kind": "official", + "reference": "Storage emulator (firebase-tools)", + "version": "15.34.0", + "label": "Storage emulator (firebase‑tools 15.34.0)", + "recordedAt": "2026-11-05", + "scenarios": 36, + "answers": 198, + "checked": 198, + "differs": 0, + "unreplayed": 0, + "start": 128 + } + ], + "spans": [ + [ + 0, + 1, + "official", + "c" + ], + [ + 1, + 1, + "official", + "u" + ], + [ + 2, + 80, + "official", + "c" + ], + [ + 82, + 29, + "official", + "u" + ], + [ + 111, + 16, + "official", + "c" + ], + [ + 127, + 1, + "official", + "d" + ], + [ + 128, + 198, + "official", + "c" + ] + ], + "listed": [ + 0, + 3, + 2, + 1 + ] + }, + { + "id": "storage-rules", + "name": "Storage rules", + "art": "rules", + "anchor": "storage-rules", + "answers": 640, + "production": 306, + "official": 334, + "scenarios": 36, + "checked": 631, + "differs": 9, + "unreplayed": 0, + "checkedProduction": 303, + "sets": [ + { + "id": "storage-rules-v1/production-rules-api", + "area": "Storage Security Rules expressions over the Storage value surface", + "kind": "production", + "reference": "Firebase Rules API (production)", + "version": null, + "label": "Firebase Rules API (production)", + "recordedAt": "2026-09-17", + "scenarios": 10, + "answers": 306, + "checked": 303, + "differs": 3, + "unreplayed": 0, + "start": 0 + }, + { + "id": "storage-rules-v1/official-emulator", + "area": "Storage Security Rules request model, step by step on the Storage emulator", + "kind": "official", + "reference": "Storage emulator (firebase-tools)", + "version": "15.22.0", + "label": "Storage emulator (firebase‑tools 15.22.0)", + "recordedAt": "2026-09-17", + "scenarios": 26, + "answers": 334, + "checked": 328, + "differs": 6, + "unreplayed": 0, + "start": 306 + } + ], + "spans": [ + [ + 0, + 303, + "production", + "c" + ], + [ + 303, + 3, + "production", + "d" + ], + [ + 306, + 328, + "official", + "c" + ], + [ + 634, + 6, + "official", + "d" + ] + ], + "listed": [ + 0, + 1 + ] + }, + { + "id": "functions", + "name": "Cloud Functions", + "art": "functions", + "anchor": "functions", + "answers": 301, + "production": 0, + "official": 301, + "scenarios": 49, + "checked": 270, + "differs": 2, + "unreplayed": 29, + "checkedProduction": 0, + "sets": [ + { + "id": "firebase-suite-v1/firestore-triggers", + "area": "Firestore trigger registration and v1/v2 dispatch to Functions", + "kind": "official", + "reference": "Firestore emulator (Java)", + "version": "1.22.0", + "label": "Firestore emulator 1.22.0", + "recordedAt": "2026-09-01", + "scenarios": 1, + "answers": 5, + "checked": 4, + "differs": 0, + "unreplayed": 1, + "start": 0 + }, + { + "id": "firebase-suite-v1/functions", + "area": "Functions through the emulator suite: callable and HTTP contract, discovery", + "kind": "official", + "reference": "Functions emulator (firebase-tools)", + "version": "15.22.0", + "label": "Functions emulator (firebase‑tools 15.22.0)", + "recordedAt": "2026-09-07", + "scenarios": 2, + "answers": 9, + "checked": 0, + "differs": 0, + "unreplayed": 9, + "start": 5 + }, + { + "id": "functions-readiness-v1", + "area": "Functions startup: inventory, failed codebases and auxiliary registration", + "kind": "official", + "reference": "Functions emulator (firebase-tools)", + "version": "15.22.0", + "label": "Functions emulator (firebase‑tools 15.22.0)", + "recordedAt": "2026-09-11", + "scenarios": 2, + "answers": 8, + "checked": 0, + "differs": 0, + "unreplayed": 8, + "start": 14 + }, + { + "id": "functions-runtime-v1", + "area": "Functions and Extensions runtime: routes, callables, events, environment", + "kind": "official", + "reference": "Functions emulator (firebase-tools)", + "version": "15.22.0", + "label": "Functions emulator (firebase‑tools 15.22.0)", + "recordedAt": "2026-09-17", + "scenarios": 43, + "answers": 276, + "checked": 263, + "differs": 2, + "unreplayed": 11, + "start": 22 + }, + { + "id": "functions-topic-reload-v1", + "area": "Pub/Sub triggers follow a Functions source reload", + "kind": "official", + "reference": "Functions and Pub/Sub emulators (firebase-tools)", + "version": "15.22.0", + "label": "Functions and Pub/Sub emulators (firebase‑tools 15.22.0)", + "recordedAt": "2026-09-10", + "scenarios": 1, + "answers": 3, + "checked": 3, + "differs": 0, + "unreplayed": 0, + "start": 298 + } + ], + "spans": [ + [ + 0, + 4, + "official", + "c" + ], + [ + 4, + 1, + "official", + "u" + ], + [ + 5, + 9, + "official", + "u" + ], + [ + 14, + 8, + "official", + "u" + ], + [ + 22, + 263, + "official", + "c" + ], + [ + 285, + 2, + "official", + "d" + ], + [ + 287, + 11, + "official", + "u" + ], + [ + 298, + 3, + "official", + "c" + ] + ], + "listed": [ + 0, + 3, + 2, + 1, + 4 + ] + }, + { + "id": "pubsub", + "name": "Pub/Sub", + "art": "pubsub", + "anchor": "pubsub", + "answers": 908, + "production": 0, + "official": 908, + "scenarios": 43, + "checked": 904, + "differs": 0, + "unreplayed": 4, + "checkedProduction": 0, + "sets": [ + { + "id": "firebase-suite-v1/pubsub", + "area": "Pub/Sub topics, schedules and function dispatch in the suite", + "kind": "official", + "reference": "Pub/Sub emulator with Functions (firebase-tools 15.22.0)", + "version": "0.8.33", + "label": "Pub/Sub emulator 0.8.33 with Functions (firebase‑tools 15.22.0)", + "recordedAt": "2026-09-01", + "scenarios": 1, + "answers": 8, + "checked": 4, + "differs": 0, + "unreplayed": 4, + "start": 0 + }, + { + "id": "pubsub-v1", + "area": "Every Pub/Sub RPC over gRPC and HTTP/JSON, streaming pull and push", + "kind": "official", + "reference": "Pub/Sub emulator", + "version": "0.8.33", + "label": "Pub/Sub emulator 0.8.33", + "recordedAt": "2026-09-18", + "scenarios": 42, + "answers": 900, + "checked": 900, + "differs": 0, + "unreplayed": 0, + "start": 8 + } + ], + "spans": [ + [ + 0, + 4, + "official", + "c" + ], + [ + 4, + 4, + "official", + "u" + ], + [ + 8, + 900, + "official", + "c" + ] + ], + "listed": [ + 1, + 0 + ] + }, + { + "id": "tasks", + "name": "Cloud Tasks", + "art": "tasks", + "anchor": "tasks", + "answers": 60, + "production": 0, + "official": 60, + "scenarios": 6, + "checked": 59, + "differs": 0, + "unreplayed": 1, + "checkedProduction": 0, + "sets": [ + { + "id": "tasks-v1", + "area": "Task queue functions: registration, dispatch, delete and the Admin SDK", + "kind": "official", + "reference": "Functions and Cloud Tasks emulators (firebase-tools)", + "version": "15.22.0", + "label": "Functions and Cloud Tasks emulators (firebase‑tools 15.22.0)", + "recordedAt": "2026-09-19", + "scenarios": 6, + "answers": 60, + "checked": 59, + "differs": 0, + "unreplayed": 1, + "start": 0 + } + ], + "spans": [ + [ + 0, + 59, + "official", + "c" + ], + [ + 59, + 1, + "official", + "u" + ] + ], + "listed": [ + 0 + ] + }, + { + "id": "suite", + "name": "Hub and console", + "art": "console", + "anchor": "console", + "answers": 62, + "production": 0, + "official": 62, + "scenarios": 7, + "checked": 16, + "differs": 0, + "unreplayed": 46, + "checkedProduction": 0, + "sets": [ + { + "id": "developer-tools-functions-lifecycle-v1", + "area": "The CLI drains and exits after one Functions invocation", + "kind": "official", + "reference": "Functions emulator (firebase-tools)", + "version": "15.22.0", + "label": "Functions emulator (firebase‑tools 15.22.0)", + "recordedAt": "2026-09-11", + "scenarios": 1, + "answers": 2, + "checked": 1, + "differs": 0, + "unreplayed": 1, + "start": 0 + }, + { + "id": "developer-tools-v1", + "area": "The Emulator UI: overview, requests, coverage, data, auth and storage pages", + "kind": "official", + "reference": "Emulator suite and UI (firebase-tools)", + "version": "15.22.0", + "label": "Emulator suite and UI (firebase‑tools 15.22.0)", + "recordedAt": "2026-09-10", + "scenarios": 3, + "answers": 45, + "checked": 15, + "differs": 0, + "unreplayed": 30, + "start": 2 + }, + { + "id": "firebase-suite-v1/suite", + "area": "Hub, UI config, logging, startup, shutdown and restart", + "kind": "official", + "reference": "Emulator suite and UI (firebase-tools)", + "version": "15.22.0", + "label": "Emulator suite and UI (firebase‑tools 15.22.0)", + "recordedAt": "2026-09-01", + "scenarios": 3, + "answers": 15, + "checked": 0, + "differs": 0, + "unreplayed": 15, + "start": 47 + } + ], + "spans": [ + [ + 0, + 1, + "official", + "c" + ], + [ + 1, + 1, + "official", + "u" + ], + [ + 2, + 15, + "official", + "c" + ], + [ + 17, + 30, + "official", + "u" + ], + [ + 47, + 15, + "official", + "u" + ] + ], + "listed": [ + 2, + 0, + 1 + ] + } + ] +} diff --git a/src/data/engine/CHANGELOG.md b/src/data/engine/CHANGELOG.md index 42f4200..ca3ec20 100644 --- a/src/data/engine/CHANGELOG.md +++ b/src/data/engine/CHANGELOG.md @@ -1,3 +1,134 @@ +# 0.2.3 — the Indexes page, three reported bugs fixed, and a container image + +- Pin the engine to `2294132253f03395b0d9bafe391d35075e928112`, main after + every 0.2.3 pull request merged (the merge of + [PR #182](https://github.com/firenook-dev/firenook/pull/182)). CI + ([run 43084842804](https://github.com/firenook-dev/firenook/actions/runs/43084842804)), + the five-platform packed-install matrix + ([run 43084869443](https://github.com/firenook-dev/firenook/actions/runs/43084869443)) + and the real SDK clients on Android, iOS and the web + ([run 43084875694](https://github.com/firenook-dev/firenook/actions/runs/43084875694)) + passed on it. +- **Thank you.** @ponkster found a lost update in Firestore transactions + (#169), @danielparks Admin SDK uploads with no download URL (#174), + @10eputzen blocking functions missing from Auth's project config (#175), + asked for a published conformance record (#156) and contributed a ruleset + with 29 cases recorded from the official emulator (#183), and @Chaz6 asked + for a container image (#145). Each bug was checked against the official + emulator before it was fixed. +- **Firestore → Indexes.** A page of its own beside Data and Rules: every + index the app's queries needed that `firestore.indexes.json` does not + declare, with the query that needed it, **Add** and **Add all**; the + composite indexes and single-field overrides the file declares, with + **Remove**. An edit writes the entry into the file itself, leaving every + other byte as it was, and is in force for the next query; it never + overwrites a change made in an editor. The index file is watched like the + rules file, so a save is in force with no restart. `--strict-indexes` on + `emulators:start` and `emulators:exec` works through `npx firenook` (#173). + `firestore_missing_indexes` answers the same list over MCP. +- **Firestore.** A transaction that reads a missing document with a + single-document get is checked for a conflict at commit, as `batchGet`'s + read already was, so two transactions that both read it can no longer + both write it: the second commit is aborted (#169). +- **Storage.** An object saved through the Cloud Storage API, as the Admin + SDK saves it, gets a download token on its first Firebase API read, as on + the official emulator, so `getDownloadURL` works; the Cloud Storage API's + answers carry the tokens in `metadata.firebaseStorageDownloadTokens`, so + the Admin SDK reads them back (#174). +- **Authentication.** The project config lists the blocking functions the + Functions emulator registered, and a `PATCH` of `blockingFunctions` turns + them off, puts them back or replaces them, as on the official emulator; + the next load of the functions registers them again (#175). +- **A container image.** `ghcr.io/firenook-dev/firenook:0.2.3`, for + linux/amd64 and linux/arm64: Node 24 and this release's npm package. The + release builds it from the version it published and starts it as a test + suite would before pushing it; a pull request that changes the image + builds and tries it the same way (#145, `docs/container.md`). +- **The conformance record.** Every answer recorded from the official + emulator or from production is listed with what the replays check: + compared exactly, compared and different on purpose, or not replayed yet. + CI keeps the record on every change, each release attaches it + (`conformance-cases.json` and `conformance-verify.json`), and + firenook.dev/compatibility shows it, service by service (#156). The + contributed ruleset's cases are replayed with the rest, and + `conformance/README.md` says how to add a recording. +- Dependencies: `zip` 9.4.2 (four security fixes upstream; Firenook reads + Extension sources and writes Storage downloads as ZIP), firebase-tools + 15.35.0 and Playwright in the conformance tools, `actions/setup-java` + 6.2.0. +- No port or data format changed: 0.2.3 opens what 0.2.2 saved as it is, + and 0.2.2 opens what 0.2.3 saves. On saved data the one answer that + changes is #174's: the Cloud Storage API now lists the download tokens an + object already holds. +- Published straight to `latest`, as 0.2.2 was. + +# 0.2.2 — real SDK clients, Security Rules from the community, and missing-index warnings + +- Pin the engine to `070297f1c1fb75b328556c3481af26cf7b5dcacc`, main after + every 0.2.2 pull request merged (the merge of + [PR #168](https://github.com/firenook-dev/firenook/pull/168)). CI + ([run 42623788558](https://github.com/firenook-dev/firenook/actions/runs/42623788558)), + the five-platform packed-install matrix + ([run 42623942308](https://github.com/firenook-dev/firenook/actions/runs/42623942308)) + and the real SDK clients on Android, iOS and the web + ([run 42624224278](https://github.com/firenook-dev/firenook/actions/runs/42624224278)) + passed on it. +- **Thank you.** @harshmandan reported seven Security Rules and Firestore + differences (#138 to #144) and fixed five of them (#146 to #150); + @staticshock fixed three more (#152 to #154); @10eputzen reported + `recursiveDelete` (#155) and the REST null spelling (#158); @jmsarn + reported the Storage delimiter (#157). Every one was checked against the + official emulator before it was merged. +- **Real clients, on every platform.** The same FlutterFire app now runs + against Firenook and firebase-tools on Android, iOS and the web, also on a + device cache kept from one to the other, and 47 of 47 checks agree. What + it found is fixed: + - Android: every Firestore listener and server read failed, because the + SDK's empty resume token was refused. A token this store did not issue + now starts the target over, as on firebase-tools. + - A write landing while a listener attached could leave + `hasPendingWrites` stuck and the change unseen. + - Native iOS uploads, browser `uploadBytesResumable` over 256 KB, + `listAll` under a one-segment rule, and Android's `10.0.2.2` address + for resumable uploads now work. +- **Firestore.** + - The Admin SDK's `recursiveDelete` works (#155). + - REST accepts `"nullValue": null` on every method and lists null, NaN + and the infinities as a single read does (#158). An empty map or array + is written `{}`. + - A raw filter's equality with null or NaN is never true, as officially; + `IS_NULL`, `IS_NAN` and the SDKs' null filters are unchanged. + - Admin SDK writes skip the rules work they never needed. +- **Security Rules.** + - The conditional operator `c ? a : b`, a `return` without `;`, + functions declared outside the service block, string indexing and + slices by UTF-16 code unit, `size()`, `upper()` and `lower()` as the + official emulator counts and cases them. + - List rules: `resource.data.get()`, `resource != null`, + `'f' in resource.data` and in a map inside it, a query that names its + documents by id decided on those documents (#143), and any filter but + `IS_NULL` taken as proof that its field holds a value, so + `where('status', '!=', 'archived')` passes + `allow list: if resource.data.status != null`. + - Writes: the rules decide before a missing document's `NOT_FOUND` or an + existing one's `ALREADY_EXISTS` (#144). + - Paths have real segments: `path()`, `.bind()` and `resource.id`. +- **Missing-index warnings.** A query that needs a composite index your + `firestore.indexes.json` does not declare is still answered, as on the + official emulator, and is warned of once, with the entry to copy. + `emulators:start --strict-indexes` refuses it as production does. + Declared indexes are matched as Firestore documents it: equality fields + in any order and direction, merged indexes, the implicit order of + inequality fields. +- **Storage.** An empty `delimiter=` lists every object under the prefix + (#157). +- **Emulator suite.** Auth and Storage send no lifecycle events when + Functions is not running. +- **MCP Registry.** Firenook is listed as `io.github.firenook-dev/firenook`. +- No port or data format changed: 0.2.2 opens what 0.2.1 saved as it is, + and 0.2.1 opens what 0.2.2 saves. +- Published straight to `latest`, as 0.2.1 was. + # 0.2.1 — sign-in from any address, and a sign-in page in the console's look - Pin the engine to `6556f79b2fda6ccc53c4700aff5fffc029939cde`, the merge of diff --git a/src/data/engine/README.md b/src/data/engine/README.md index e40bf2c..3e571a5 100644 --- a/src/data/engine/README.md +++ b/src/data/engine/README.md @@ -1,7 +1,7 @@ # From the engine repository Copied from github.com/firenook-dev/firenook at the release the site -describes (tag `npm-v0.2.1`). Copy them again for a new release. +describes (tag `npm-v0.2.3`). Copy them again for a new release. - `CHANGELOG.md`: `packaging/CHANGELOG.md`, which /changelog and its feed are drawn from. Links into the former repository (archived, no longer diff --git a/src/data/mcp-tools.json b/src/data/mcp-tools.json index aabaaa7..5878216 100644 --- a/src/data/mcp-tools.json +++ b/src/data/mcp-tools.json @@ -1,5 +1,5 @@ { - "version": "0.2.0", + "version": "0.2.3", "tools": [ { "name": "firenook_status", @@ -283,6 +283,25 @@ "additionalProperties": false } }, + { + "name": "firestore_missing_indexes", + "description": "The indexes production would refuse the app's queries for: each one a query needed that its database's index file (firestore.indexes.json) does not declare, with the entry to add under indexes or fieldOverrides, the first query that needed it (fields and operators, no values), how many did and when; saving the file puts it in force at once.", + "input": { + "type": "object", + "properties": { + "database": { + "type": "string", + "description": "Firestore database id; default (default)" + }, + "includeDeclared": { + "type": "boolean", + "description": "Also list the indexes a saved file declares now; default only the missing ones" + } + }, + "required": [], + "additionalProperties": false + } + }, { "name": "auth_list_users", "description": "List Auth emulator accounts (accounts:batchGet) with uid, email, phone, display name, claims and provider data.", diff --git a/src/lib/changelog.ts b/src/lib/changelog.ts index 35df04f..2e422da 100644 --- a/src/lib/changelog.ts +++ b/src/lib/changelog.ts @@ -8,6 +8,8 @@ import type { Panel } from './panels'; /** When each version reached npm (`npm view firenook time`; the 0.1 line was @fireside-dev/cli). */ const published: Record = { + '0.2.3': '2026-11-12T06:01:06Z', + '0.2.2': '2026-11-11T00:27:36Z', '0.2.1': '2026-11-04T21:35:11Z', '0.2.0': '2026-10-23T11:10:45Z', '0.2.0-next.8': '2026-10-21T13:20:31Z', diff --git a/src/lib/compatibility.ts b/src/lib/compatibility.ts index 1566dbd..9557a22 100644 --- a/src/lib/compatibility.ts +++ b/src/lib/compatibility.ts @@ -15,7 +15,7 @@ export interface Surface { differs?: string[]; } -export const record = 'https://github.com/firenook-dev/firenook/blob/npm-v0.2.1/COMPATIBILITY.md'; +export const record = 'https://github.com/firenook-dev/firenook/blob/npm-v0.2.3/COMPATIBILITY.md'; export const surfaces: Surface[] = [ { @@ -28,9 +28,11 @@ export const surfaces: Surface[] = [ 'Realtime listeners, queries, transactions and batched writes', 'Security Rules, per database, reloaded a second after you save the file, with each denial naming the rule line that decided it', 'Who a request is from, read as the official emulator reads it on gRPC, REST and WebChannel, so signed-out clients meet the rules and @firebase/rules-unit-testing works', - 'Named databases: every database the app names, exported together; a database firebase.json does not list follows the default database’s rules', + 'Named databases: every database the app names, exported together; a database that firebase.json does not list follows the default database’s rules', 'Every REST v1 method the official emulator answers, createDocument included', 'orderBy, range filters and cursors served from an ordered index', + 'Queries that name no collection, as the Admin SDK’s recursiveDelete() sends them', + 'A query whose composite index firestore.indexes.json does not declare: answered and warned of once with the entry to add, listed on the console’s Indexes page, which adds it to the file, or refused with --strict-indexes', 'Import and export in the official format, both ways', 'Data on disk with a write-ahead log; acknowledged writes durable within a second', 'Timestamps stored to the microsecond, as production stores them', @@ -47,14 +49,14 @@ export const surfaces: Surface[] = [ id: 'auth', name: 'Authentication', port: '9099', - summary: 'Every operation the official Auth emulator implements, 61 of them, replayed from a 1,068-step record of its answers.', + summary: 'Every operation the official Auth emulator implements, 61 of them, each checked against its recorded answers.', covers: [ 'Password, anonymous, custom token, email link and phone sign-in', 'Test sign-in with Google, Apple, SAML and OIDC-shaped credentials, through the local popup and redirect pages', 'Account updates and deletes, codes and links, session cookies, and custom claims held to the 1,000-character limit', 'Tenants, SMS multi-factor and passkeys', 'The Admin SDK’s batch create, get, delete and query', - 'Blocking functions and lifecycle triggers', + 'Blocking functions, listed in the project config and turned off or replaced through it, and lifecycle triggers', 'Import and export in the official format', ], notClaimed: [ @@ -70,6 +72,8 @@ export const surfaces: Surface[] = [ summary: 'The Firebase and Cloud Storage paths, with Security Rules evaluated natively, with no Java.', covers: [ 'Uploads, downloads, metadata, gzip and pagination on the Firebase and Cloud Storage APIs', + 'Uploads as the native iOS and Android SDKs and browsers send them, checked with the real clients', + 'A download token for an object the Admin SDK saved, made on its first Firebase read as the official emulator makes it, so getDownloadURL() works', 'Several buckets through storage targets, each target’s rules applied to every bucket it maps to', 'Security Rules with production’s request model, including firestore.get() and exists()', 'Rules files reloaded when you save them, with or without Firestore running', @@ -119,7 +123,7 @@ export const surfaces: Surface[] = [ id: 'pubsub', name: 'Pub/Sub', port: '8085', - summary: 'Every RPC of the official emulator over gRPC and HTTP/JSON on one port, replayed from a 916-step record of its answers.', + summary: 'Every RPC of the official emulator over gRPC and HTTP/JSON on one port, each checked against its recorded answers.', covers: [ 'Topics, publishing, subscriptions, pull, streaming pull and push delivery with retries', 'Ack deadlines, redelivery, dead-letter and retry policies, ordering keys and filters', @@ -142,7 +146,7 @@ export const surfaces: Surface[] = [ id: 'tasks', name: 'Cloud Tasks', port: '9499', - summary: 'The official emulator’s four routes and its dispatcher, replayed from a 61-step record of its answers.', + summary: 'The official emulator’s four routes and its dispatcher, checked against its recorded answers.', covers: [ 'A queue for each onTaskDispatched function', 'Rate limits, dispatch slots, the X-CloudTasks-* headers, the retry ladder and its backoff, and dispatchDeadline', @@ -170,7 +174,7 @@ export const surfaces: Surface[] = [ { id: 'console', name: 'Hub and console', - port: '4400, 4000', + port: '4400 and 4000', summary: 'The hub’s discovery and control paths, and Firenook’s own console at /console on the Emulator UI’s port.', covers: [ 'The hub’s discovery, control and logging paths, and /api/config', @@ -230,14 +234,9 @@ export const platforms = { export const knownIssues: { area: string; text: string; href: string }[] = [ { area: 'init', - text: 'The emulators script init writes starts with --keep-data, which needs Firestore, Auth and Storage together, so a project made without Auth or Storage does not start with it.', + text: 'The emulators script that init writes starts with `--keep-data`, which needs Firestore, Auth and Storage together, so a project made without Auth or Storage does not start with it.', href: '/docs/get-started/new-project', }, - { - area: 'Authentication', - text: 'With Functions not running, Auth still sends its user events to the Functions port, so another suite’s Functions emulator on that port receives them.', - href: '/docs/reference/ports', - }, { area: 'Cloud Functions', text: 'A save that stops a codebase loading is shown on the terminal screen only: plain output and the log say nothing, and the code loaded before keeps answering.', @@ -250,7 +249,117 @@ export const knownIssues: { area: string; text: string; href: string }[] = [ }, { area: 'functions:invoke', - text: 'A scheduled function answers 404 unless you pass --event-data \'{}\'.', + text: 'A scheduled function answers 404 unless you pass `--event-data \'{}\'`.', href: '/docs/functions/scheduled', }, ]; + +/** + * Where the official emulator and production disagree, what Firenook does, + * from COMPATIBILITY.md in the engine repository. `follows` says whose answer + * Firenook gives, so the page can mark it. + */ +export interface Choice { + area: string; + behaviour: string; + official: string; + production: string; + firenook: string; + follows: 'production' | 'yours'; +} + +export const choices: Choice[] = [ + { + area: 'Firestore', + behaviour: 'A query whose composite index the index file does not declare', + official: 'Answers it, so the test passes', + production: 'Refuses it with `FAILED_PRECONDITION`', + firenook: 'Answers it and lists the index to add, which the console’s Indexes page writes into the file; --strict-indexes refuses it as production does', + follows: 'yours', + }, + { + area: 'Firestore', + behaviour: 'More than one database', + official: 'Refuses the second database, then loads no rules at all', + production: 'Serves each named database with its rules', + firenook: 'Serves every database the app names, each with its own rules', + follows: 'production', + }, + { + area: 'Firestore', + behaviour: 'Two transactions that touch the same document', + official: 'Holds a lock and aborts the other write', + production: 'Optimistic in the web and mobile SDKs; server libraries take locks', + firenook: 'Optimistic: the other write lands and the transaction is aborted to retry', + follows: 'production', + }, + { + area: 'Firestore REST', + behaviour: '`partitionQuery`', + official: '`UNIMPLEMENTED`', + production: 'Answers it', + firenook: 'Answers it', + follows: 'production', + }, + { + area: 'Firestore REST', + behaviour: 'A `readTime` or `transaction` given to get and list', + official: 'Refuses `readTime` and never answers a `transaction`', + production: 'Reads at that time, or in that transaction', + firenook: 'Reads at that time, or in that transaction', + follows: 'production', + }, + { + area: 'Cloud Storage', + behaviour: 'A resumable upload left unfinished', + official: 'Keeps it for ever', + production: 'Expires the session after a week', + firenook: 'Removes it and its bytes after seven idle days', + follows: 'production', + }, +]; + +/** + * Differences people found and the release that fixed them, from the engine + * repository's issues. Every fix landed with a test; `recorded` marks the + * ones that also added answers recorded from the official emulator. + */ +export interface Found { + number: number; + /** An issue, or a pull request that found and fixed one itself. */ + kind: 'issue' | 'pull'; + area: string; + text: string; + recorded: boolean; +} + +export const found: { release: string; date: string | null; items: Found[] }[] = [ + { + release: '0.2.3', + date: '2026-11-12', + items: [ + { number: 169, kind: 'issue', area: 'Firestore', text: 'A transaction that reads a missing document with a single-document get was not checked for a conflict at commit, so two could both write it.', recorded: false }, + { number: 174, kind: 'issue', area: 'Cloud Storage', text: 'A file the Admin SDK saved had no download token, so the web SDK’s `getDownloadURL` failed.', recorded: false }, + { number: 175, kind: 'issue', area: 'Authentication', text: 'The project config listed no blocking functions, and a `PATCH` that turns them off was ignored.', recorded: false }, + ], + }, + { + release: '0.2.2', + date: '2026-11-11', + items: [ + { number: 138, kind: 'issue', area: 'Firestore rules', text: 'The conditional operator `c ? a : b` was refused as an unexpected character.', recorded: true }, + { number: 153, kind: 'pull', area: 'Firestore rules', text: 'A function declared outside the service block was refused.', recorded: true }, + { number: 154, kind: 'pull', area: 'Firestore rules', text: 'In a list rule, `\'f\' in resource.data` was decided differently from the official emulator.', recorded: true }, + { number: 143, kind: 'issue', area: 'Firestore rules', text: 'A query pinned to a missing document by its ID was allowed where the official emulator denies it.', recorded: true }, + { number: 168, kind: 'pull', area: 'Firestore rules', text: 'A query filter other than “is null” did not count as proof that its field holds a value.', recorded: true }, + { number: 139, kind: 'issue', area: 'Firestore rules', text: 'A function’s return without a trailing semicolon failed to compile.', recorded: false }, + { number: 140, kind: 'issue', area: 'Firestore rules', text: '`resource.data.get()` in a list rule failed with “method get is not available”.', recorded: false }, + { number: 141, kind: 'issue', area: 'Firestore rules', text: 'Indexing a string, `s[0]`, failed with “value cannot be indexed”.', recorded: false }, + { number: 142, kind: 'issue', area: 'Firestore rules', text: '`resource != null` in a list rule “did not evaluate to a boolean”.', recorded: false }, + { number: 144, kind: 'issue', area: 'Firestore', text: 'Updating a missing document answered `NOT_FOUND` even when the rules deny the update.', recorded: false }, + { number: 155, kind: 'issue', area: 'Firestore', text: 'The Admin SDK’s `recursiveDelete()` failed with `UNAVAILABLE`.', recorded: true }, + { number: 158, kind: 'issue', area: 'Firestore REST', text: '`nullValue: null` was refused on a write, and the list endpoint answered `"NULL_VALUE"`.', recorded: false }, + { number: 157, kind: 'issue', area: 'Cloud Storage', text: 'Listing with an empty `delimiter=` returned no items.', recorded: false }, + ], + }, +]; diff --git a/src/lib/conformance.ts b/src/lib/conformance.ts new file mode 100644 index 0000000..a495dd6 --- /dev/null +++ b/src/lib/conformance.ts @@ -0,0 +1,116 @@ +// The record behind /compatibility: every answer recorded from the official +// emulator or from production Firebase, which Firenook's replays check on +// every change. scripts/conformance/import.mjs writes the summary from the +// engine's record for a release; each block's own request and answer stay in +// public/conformance/.json, fetched when someone points at it. + +import summary from '../data/conformance/summary.json'; + +export type Kind = 'production' | 'official'; + +export interface RecordedSet { + id: string; + area: string; + kind: Kind; + reference: string; + version: string | null; + /** The reference and its version as one phrase. */ + label: string; + recordedAt: string | null; + scenarios: number; + answers: number; + /** What the replays proved: the same answer, a deliberate difference, not replayed yet. */ + checked: number; + differs: number; + unreplayed: number; + /** The set's first block in its service's row. */ + start: number; +} + +/** A block's state: checked (lit), a deliberate difference (outlined), not replayed yet (cold). */ +export type State = 'c' | 'd' | 'u'; + +export interface ServiceRecord { + id: string; + name: string; + art: string | null; + anchor: string; + answers: number; + production: number; + official: number; + scenarios: number; + checked: number; + differs: number; + unreplayed: number; + checkedProduction: number; + sets: RecordedSet[]; + /** The wall's runs, [first block, length, reference, state], in wall order. */ + spans: [number, number, Kind, State][]; + /** The sets' indexes in the order the page lists them: by what they cover. */ + listed: number[]; +} + +export interface ConformanceRecord { + release: string | null; + importedAt: string; + total: number; + production: number; + official: number; + scenarios: number; + checked: number; + differs: number; + unreplayed: number; + checkedProduction: number; + services: ServiceRecord[]; +} + +export const record = summary as ConformanceRecord; + +/** The wall's columns: a desktop row, and a phone's. */ +export const COLUMNS = { wide: 124, narrow: 64 } as const; + +export interface Box { + x: number; + y: number; + w: number; + h: number; +} + +/** + * The blocks start..start+length on a wall `columns` wide, as at most three + * boxes in block units: the rest of the first row, the whole rows, and the + * start of the last. + */ +export function boxes(start: number, length: number, columns: number): Box[] { + if (length <= 0) return []; + const end = start + length; + const first = Math.floor(start / columns); + const last = Math.floor((end - 1) / columns); + const from = start % columns; + const to = ((end - 1) % columns) + 1; + if (first === last) return [{ x: from, y: first, w: to - from, h: 1 }]; + const out: Box[] = [{ x: from, y: first, w: columns - from, h: 1 }]; + if (last - first > 1) out.push({ x: 0, y: first + 1, w: columns, h: last - first - 1 }); + out.push({ x: 0, y: last, w: to, h: 1 }); + return out; +} + +/** How many rows a service's blocks take on a wall `columns` wide. */ +export const rows = (answers: number, columns: number) => Math.max(1, Math.ceil(answers / columns)); + +/** The wall's runs of one service: its sets' blocks by reference and state, in wall order. */ +export function spans(service: ServiceRecord): { kind: Kind; state: State; start: number; length: number }[] { + return service.spans.map(([start, length, kind, state]) => ({ kind, state, start, length })); +} + +export const formatCount = (n: number) => n.toLocaleString('en-US'); + +/** "18 September 2026", for a recording's date. */ +export function formatDay(day: string | null): string | null { + if (!day) return null; + const date = new Date(`${day}T00:00:00Z`); + return date.toLocaleDateString('en-GB', { day: 'numeric', month: 'long', year: 'numeric', timeZone: 'UTC' }); +} + +/** Where an answer came from, in words: "Auth emulator (firebase-tools 15.22.0)". */ +export const referenceLabel = (set: RecordedSet) => set.label; diff --git a/src/lib/mcp.ts b/src/lib/mcp.ts index 6ed98e3..8a7b068 100644 --- a/src/lib/mcp.ts +++ b/src/lib/mcp.ts @@ -24,7 +24,7 @@ const groups: Omit[] = [ }, { name: 'Firestore', - text: 'Read, query, count, write and delete documents, and list collections, in any database of the project.', + text: 'Read, query, count, write and delete documents, list collections, and list the indexes the app’s queries needed that the index file does not declare, in any database of the project.', prefixes: ['firestore'], }, { diff --git a/src/lib/pages.ts b/src/lib/pages.ts index 92525e8..78bdbf6 100644 --- a/src/lib/pages.ts +++ b/src/lib/pages.ts @@ -17,7 +17,7 @@ export const pages = { '/mcp': { title: 'Firebase MCP for your local emulators · Firenook', description: - 'firenook mcp gives Claude Code, Cursor and other coding agents 54 tools over the Firebase emulators on your machine: logs, function calls, rules and data.', + 'firenook mcp gives Claude Code, Cursor and other coding agents 55 tools over the Firebase emulators on your machine: logs, function calls, rules and data.', card: { title: 'Firebase MCP for your local emulators', subtitle: 'Give your coding agent the emulator, not production: logs, function calls, Security Rules and your data.' }, crumb: 'MCP', }, @@ -52,7 +52,7 @@ export const pages = { '/compatibility': { title: 'Compatibility: what each emulator covers · Firenook', description: - 'What Firenook’s Firestore, Auth, Storage, Functions, Extensions, Pub/Sub, Cloud Tasks and Eventarc emulators cover in 0.2.1, and what they do not.', + 'What Firenook’s Firestore, Auth, Storage, Functions, Extensions, Pub/Sub, Cloud Tasks and Eventarc emulators cover in 0.2.3, and what they do not.', card: { title: 'What each emulator covers', subtitle: 'Service by service, what Firenook does in this release, what it does not, and where it differs from the official emulator.' }, crumb: 'Compatibility', }, diff --git a/src/lib/pixels.ts b/src/lib/pixels.ts index efa8089..6801471 100644 --- a/src/lib/pixels.ts +++ b/src/lib/pixels.ts @@ -20,6 +20,58 @@ export const art = { '....aaa...', '....a.....', ], + // A shield with its check lit: the Security Rules that decide. + rules: [ + '##########', + '##########', + '##******##', + '##*****###', + '##*##*####', + '##**#####.', + '.##*####..', + '..######..', + '...####...', + '....##....', + ], + // A terminal's prompt, its cursor lit: the CLI. + cli: [ + '##########', + '#........#', + '#.#......#', + '#..#.....#', + '#...#....#', + '#..#.....#', + '#.#..***.#', + '#........#', + '#........#', + '##########', + ], + // A file with its braces lit: firebase.json. + config: [ + '.######...', + '.#....##..', + '.#.....##.', + '.#.*..*.#.', + '.#*....*#.', + '.#.*..*.#.', + '.#......#.', + '.#.####.#.', + '.#......#.', + '.########.', + ], + // A window with its three lights: the hub and the console it serves. + console: [ + '##########', + '#.*.*.*..#', + '##########', + '#........#', + '#.####...#', + '#........#', + '#.######.#', + '#........#', + '#.###....#', + '##########', + ], // A page of a database. firestore: [ '.#####....', diff --git a/src/lib/site.ts b/src/lib/site.ts index 40e2280..52ed36e 100644 --- a/src/lib/site.ts +++ b/src/lib/site.ts @@ -13,12 +13,12 @@ export const site = { npm: 'https://www.npmjs.com/package/firenook', license: 'https://github.com/firenook-dev/firenook/blob/main/LICENSE', /** The release the site describes. The recordings name the release they are from. */ - version: '0.2.1', + version: '0.2.3', install: 'npm install --save-dev firenook', /** The release the site describes, as its changelog names it. */ release: { title: 'Sign-in from any address, and a sign-in page in the console’s look', - url: '/changelog/0.2.1', + url: '/changelog/0.2.3', }, requirements: 'Node 22, 24 or 26 on macOS, Linux with glibc 2.28 or newer, or Windows x64', } as const; diff --git a/src/pages/compatibility.astro b/src/pages/compatibility.astro index efc2ae5..ca91a02 100644 --- a/src/pages/compatibility.astro +++ b/src/pages/compatibility.astro @@ -3,14 +3,20 @@ import Base from '../layouts/Base.astro'; import PageHead from '../components/PageHead.astro'; import Pixels from '../components/Pixels.astro'; import Closing from '../components/Closing.astro'; +import CaseWall from '../components/CaseWall.astro'; +import Growth from '../components/Growth.astro'; +import history from '../data/conformance/history.json'; import { page } from '../lib/pages'; import { site, services } from '../lib/site'; -import { surfaces, notEmulated, platforms, record, knownIssues } from '../lib/compatibility'; +import { surfaces, notEmulated, platforms, record as compatibilityRecord, knownIssues, choices, found } from '../lib/compatibility'; +import { record, formatCount, formatDay, referenceLabel, type RecordedSet } from '../lib/conformance'; +import type { ArtName } from '../lib/pixels'; import { graph, organization, website, breadcrumbs } from '../lib/schema'; const meta = page('/compatibility'); -// The block icon of each emulator, where it has one. -const art = (id: string) => services.find((service) => service.id === id)?.art; +// The block icon of each emulator, where it has one; the hub's is the console's window. +const own: Record = { console: 'console', cli: 'cli', configuration: 'config' }; +const art = (id: string) => (own[id] ?? services.find((service) => service.id === id)?.art) as ArtName | undefined; const schema = graph( organization, @@ -20,58 +26,278 @@ const schema = graph( { name: meta.crumb, path: '/compatibility' }, ]), ); + +// Which recorded services each section of the page shows. +const recordedFor: Record = { + firestore: ['firestore', 'firestore-rules'], + auth: ['auth'], + storage: ['storage', 'storage-rules'], + functions: ['functions'], + pubsub: ['pubsub'], + tasks: ['tasks'], + console: ['suite'], +}; +const byService = new Map(record.services.map((service) => [service.id, service])); +// A deliberate difference was replayed too: replayed is checked or differs. +const productionReplayed = record.services + .flatMap((service) => service.sets) + .filter((set) => set.kind === 'production') + .reduce((sum, set) => sum + set.checked + set.differs, 0); +const replayed = (set: { checked: number; differs: number }) => set.checked + set.differs; +const first = history[0]; +const latest = history[history.length - 1]; +const fromLabel = (set: RecordedSet) => (set.kind === 'production' ? `${set.reference}` : referenceLabel(set)); +// A section's recorded groups: named for what they cover when there are two, +// so a title never repeats the section's own name. +const groupTitle: Record = { + firestore: 'Data, queries and listeners', + 'firestore-rules': 'Security Rules', + storage: 'Files and metadata', + 'storage-rules': 'Security Rules', +}; +// What a section with nothing recorded of its own says instead. +const unrecorded: Record = { + extensions: 'Recorded with Cloud Functions: the Functions runtime’s recordings include Extensions.', + cli: 'Its start, stop and restart are recorded with the hub, under Hub and console.', +}; +// Code in a sentence, written between backticks in the data or as a flag, is +// set as code, so it reads as code and never breaks after its dashes. +const withCode = (text: string) => + text + .split(/(`[^`]+`|--[a-z][a-z-]*)/g) + .filter(Boolean) + .map((part) => ({ code: part.startsWith('`') || part.startsWith('--'), text: part.replace(/^`|`$/g, '') })); +const fixedTotal = found.reduce((sum, release) => sum + release.items.length, 0); +const fixingCount = fixedTotal - found.reduce((sum, release) => sum + (release.date ? release.items.length : 0), 0); +const fixedCount = found.reduce((sum, release) => sum + (release.date ? release.items.length : 0), 0); --- - + - Service by service, what Firenook {site.version} does, what it does not claim, and where it chooses production’s - behaviour over the official emulator’s. Most surfaces are replayed against a record of the official emulator’s answers - on every release. + Each block in the wall below is a request recorded from the official emulator or from production Firebase, with + the answer it gave. A lit block is one Firenook’s tests replay on every change and answer the same way, an + outlined one is replayed and answered differently on purpose, and a grey one is waiting for its replay. +
+
+

The record

+
    +
  • + {formatCount(record.total)} + answers recorded from Firebase +
  • +
  • + {formatCount(record.checked + record.differs)} + replayed against Firenook on every change +
  • +
  • + {formatCount(productionReplayed)} + of the {formatCount(record.production)} from production +
  • +
  • + +{formatCount(latest.total - first.total)} + since the first public preview +
  • +
+ +

+ Point at or tap a block to see what was asked, what Firebase answered and what the replay compares. Production’s + answers come from Cloud Firestore and the Firebase Rules API, in projects that hold only made-up data.{' '} + The recordings on GitHub +

+
+
+ +
+
+
+

More of Firebase recorded, release by release

+

+ From {formatCount(first.total)} answers at the first public preview to {formatCount(latest.total)} in {latest.release}. + Each release adds what the one before did not check yet. +

+
+ +
+
+ { - surfaces.map((surface, index) => ( -
-
-
- {art(surface.id) && } -
-

{surface.name}

-

- {surface.summary} - {surface.port && Port {surface.port}.} -

-
-
-
-
-

Covered

-
    {surface.covers.map((line) =>
  • {line}
  • )}
-
-
-

Not claimed

-
    {surface.notClaimed.map((line) =>
  • {line}
  • )}
+ surfaces.map((surface, index) => { + const recorded = (recordedFor[surface.id] ?? []).map((id) => byService.get(id)).filter((service) => service && service.answers > 0); + return ( +
+
+
+ {art(surface.id) && } +
+

{surface.name}

+

+ {surface.summary} + {surface.port && {surface.port.includes(' and ') ? 'Ports' : 'Port'} {surface.port}.} +

+
- {surface.differs && ( -
-

Different on purpose

-
    {surface.differs.map((line) =>
  • {line}
  • )}
+ {recorded.length > 0 ? ( +
+ {recorded.map((service) => ( +
+

+ {groupTitle[service!.id] ?? 'Recorded answers'} + + {formatCount(replayed(service!))} of {formatCount(service!.answers)} replayed + {service!.production > 0 && <>, {formatCount(service!.production)} recorded from production} + +

+
    + {service!.listed + .map((index) => service!.sets[index]) + .filter((set) => set.answers > 0) + .map((set, index, sets) => ( +
  • + {index > 0 && sets[index - 1].area === set.area ? '' : set.area} + + + + {replayed(set) === set.answers ? formatCount(set.answers) : `${formatCount(replayed(set))} of ${formatCount(set.answers)}`} + +
  • + ))} +
+
+ ))}
+ ) : ( +

+

)} +
+ What it covers, and what it does not +
+
+

Covered

+
    {surface.covers.map((line) =>
  • {line}
  • )}
+
+
+

Not claimed

+
    {surface.notClaimed.map((line) =>
  • {line}
  • )}
+
+ {surface.differs && ( +
+

Different on purpose

+
    {surface.differs.map((line) =>
  • {line}
  • )}
+
+ )} +
+
-
-
- )) +
+ ); + }) } +
+
+
+

Where Firenook takes a side

+

+ Where the official emulator and production answer differently, a test that passes locally should pass in + production too. So Firenook gives production’s answer, or lets you choose. The answer it gives is in white. +

+
+
+ + + + + + + + + + + { + choices.map((choice, index) => ( + + + + + + + )) + } + +
WhenThe official emulatorProductionFirenook
+ {(index === 0 || choices[index - 1].area !== choice.area) && ( + {choice.area} + )} + {withCode(choice.behaviour).map((part) => (part.code ? {part.text} : part.text))} + + {withCode(choice.official).map((part) => (part.code ? {part.text} : part.text))} + + {withCode(choice.production).map((part) => (part.code ? {part.text} : part.text))} + + {withCode(choice.firenook).map((part) => (part.code ? {part.text} : part.text))} +
+
+
+
+ +
+
+
+

Every difference found becomes a test

+

+ People running Firenook against their own projects found {fixedTotal} answers it gave differently + {fixingCount ? `: ${fixedCount} are fixed and ${fixingCount} are being fixed now.` : ', and every one is fixed.'}{' '} + Each fix lands with a test that runs on every change, and where a + recording settles it, the recording joins the wall. +

+
+
    + { + found.map((release) => ( +
  1. +
    +
    +
      + {release.items.map((item, index) => ( +
    • + {index > 0 && release.items[index - 1].area === item.area ? '' : item.area} +

      + {withCode(item.text).map((part) => (part.code ? {part.text} : part.text))} + {item.recorded && Now recorded from the official emulator.}{' '} + #{item.number} +

      +
    • + ))} +
    +
  2. + )) + } +
+

+ Found something else? Open an issue with what the official emulator answers and what Firenook + answers. +

+
+
+
@@ -99,19 +325,17 @@ const schema = graph(
    { - knownIssues.map((issue) => ( + knownIssues.map((issue, index) => (
  • - {issue.area} + {index > 0 && knownIssues[index - 1].area === issue.area ? '' : issue.area}

    - {issue.text} The way around it + {withCode(issue.text).map((part) => (part.code ? {part.text} : part.text))}{' '} + The way around it

  • )) }
-

- Found something else? Open an issue. -

@@ -122,7 +346,7 @@ const schema = graph( @@ -149,6 +373,53 @@ const schema = graph( color: var(--ink); } + .block { + margin-top: 2rem; + } + + .note { + max-width: 46rem; + margin-top: 1.25rem; + color: var(--ash); + font-size: var(--text-xs); + } + + /* The record: four lit numbers, then the wall, right under the header. */ + .record { + padding-top: clamp(2.25rem, 4vw, 3rem); + } + + .measures { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 1.5rem; + margin: 0 0 2.25rem; + padding: 0; + list-style: none; + } + + .measures li { + display: grid; + align-content: start; + gap: 0.2rem; + padding-top: 0.85rem; + border-top: 1px solid var(--line-strong); + } + + .measure { + font-size: var(--text-num); + font-weight: 780; + font-variant-numeric: tabular-nums; + letter-spacing: -0.035em; + line-height: 1.1; + } + + .measure-label { + color: var(--smoke); + font-size: var(--text-sm); + } + + /* Each section: its sets as bars of blocks, then what it covers. */ .surface-head { display: flex; align-items: start; @@ -164,6 +435,147 @@ const schema = graph( color: var(--ash); } + .recorded { + display: grid; + gap: 2rem; + } + + .recorded-group { + scroll-margin-top: 6rem; + } + + .recorded-title { + display: flex; + flex-wrap: wrap; + align-items: baseline; + gap: 0.35rem 0.75rem; + padding-bottom: 0.7rem; + border-bottom: 1px solid var(--line-strong); + color: var(--ink); + font-size: var(--text-md); + font-weight: 650; + letter-spacing: -0.01em; + } + + .recorded-total { + color: var(--smoke); + font-size: var(--text-sm); + font-weight: 500; + font-variant-numeric: tabular-nums; + letter-spacing: 0; + } + + .sets { + display: grid; + margin: 0; + padding: 0; + list-style: none; + } + + .set { + display: grid; + grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr) 7rem; + gap: 0.4rem 1.5rem; + align-items: start; + padding-block: 0.65rem; + border-bottom: 1px solid var(--line); + font-size: var(--text-sm); + } + + .set-area { + color: var(--ink); + } + + .set-from { + display: flex; + gap: 0.6rem; + color: var(--smoke); + } + + /* The block of the wall's colour for the reference it was recorded from. */ + .set-kind { + flex: none; + width: 8px; + height: 8px; + margin-top: 0.45em; + } + + .set-production { + background: #f4421a; + } + + .set-official { + background: #ff9d1c; + } + + .set-date { + display: block; + color: var(--ash); + font-size: var(--text-xs); + } + + .set-count { + color: var(--ink); + font-variant-numeric: tabular-nums; + font-weight: 600; + text-align: right; + white-space: nowrap; + } + + /* Not every answer replayed yet: the count says how many are. */ + .set-count.partial { + color: var(--smoke); + font-weight: 500; + } + + .unrecorded { + display: flex; + align-items: center; + gap: 0.7rem; + color: var(--smoke); + font-size: var(--text-sm); + } + + .cold-block { + flex: none; + width: 8px; + height: 8px; + background: var(--cold); + } + + .covers summary { + display: inline-flex; + align-items: center; + gap: 0.55rem; + color: var(--link); + font-size: var(--text-sm); + font-weight: 600; + cursor: pointer; + list-style: none; + } + + .covers summary::-webkit-details-marker { + display: none; + } + + .covers summary::before { + content: ''; + width: 0.45rem; + height: 0.45rem; + border-right: 1.5px solid currentColor; + border-bottom: 1.5px solid currentColor; + transform: rotate(-45deg); + transition: transform 120ms ease; + } + + .covers[open] summary::before { + transform: rotate(45deg); + } + + .covers .columns { + margin-top: 1.5rem; + } + .columns { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); @@ -221,13 +633,101 @@ const schema = graph( box-shadow: inset 0 0 0 1.5px var(--smoke); } - .issues { + /* Where it takes a side: Firenook's answer in ink, and production's where + that is the one it gives. */ + .choices th[scope='row'] { + min-width: 14rem; + } + + .choice-area { + display: block; + margin-bottom: 0.15rem; + color: var(--ash); + font-size: var(--text-xs); + font-weight: 500; + } + + .choices td.win, + .choices td.firenook { + color: var(--ink); + } + + + /* Found and fixed: one rail of releases. */ + .releases { + display: grid; + gap: 2.25rem; + margin-bottom: 0; + padding: 0; + list-style: none; + } + + .release-head { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 0.4rem 0.75rem; + padding-bottom: 0.7rem; + border-bottom: 1px solid var(--line-strong); + } + + .release-block { + width: 10px; + height: 10px; + background: var(--fire); + box-shadow: 0 0 7px rgb(242 56 24 / 0.55); + } + + .upcoming .release-block { + background: none; + box-shadow: inset 0 0 0 1.5px var(--smoke); + } + + .release-name { + color: var(--ink); + font-size: var(--text-md); + font-weight: 650; + letter-spacing: -0.01em; + } + + .release-date { + color: var(--ash); + font-size: var(--text-sm); + } + + .found-list { display: grid; margin: 0; padding: 0; list-style: none; } + .found-list li { + display: grid; + grid-template-columns: 11rem minmax(0, 1fr); + gap: 0.25rem 1.5rem; + padding-block: 0.75rem; + border-bottom: 1px solid var(--line); + color: var(--smoke); + font-size: var(--text-sm); + } + + .found-area { + color: var(--ink); + font-weight: 600; + } + + .found-recorded { + color: var(--ash); + } + + .issues { + display: grid; + margin: 2rem 0 0; + padding: 0; + list-style: none; + } + .issues li { display: grid; grid-template-columns: 11rem minmax(0, 1fr); @@ -243,23 +743,89 @@ const schema = graph( font-weight: 600; } - @media (max-width: 700px) { - .issues li { - grid-template-columns: minmax(0, 1fr); - } - } - .columns-2 { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 2.5rem clamp(2rem, 6vw, 5rem); + align-items: start; + } + + .columns-2 > .head { + align-content: start; } @media (max-width: 900px) { + .measures { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + .columns, .columns.three, .columns-2 { grid-template-columns: minmax(0, 1fr); } + + .set { + grid-template-columns: minmax(0, 1fr) 6.5rem; + } + + .set-from { + grid-column: 1; + } + + .set-count { + grid-row: 1; + grid-column: 2; + } + + /* One row of links on a phone, scrolled within itself. */ + .jump { + flex-wrap: nowrap; + overflow-x: auto; + margin-inline: calc(-1 * var(--gutter)); + padding-inline: var(--gutter); + scrollbar-width: none; + } + + .jump a { + flex: none; + } + } + + @media (max-width: 700px) { + .found-list li, + .issues li { + grid-template-columns: minmax(0, 1fr); + } + + /* A table reads row by row on a phone, each value under its column's name. */ + .choices thead { + display: none; + } + + .choices tr, + .choices th, + .choices td { + display: block; + } + + .choices tr { + padding: 0.4rem 0; + border-bottom: 1px solid var(--line); + } + + .choices th, + .choices td { + border: 0; + padding-block: 0.35rem; + } + + .choices td::before { + content: attr(data-label); + display: block; + color: var(--ash); + font-size: var(--text-xs); + } + } diff --git a/src/skills/firenook/SKILL.md b/src/skills/firenook/SKILL.md index ba467c1..a375c1e 100644 --- a/src/skills/firenook/SKILL.md +++ b/src/skills/firenook/SKILL.md @@ -87,7 +87,7 @@ when the emulators could not start. `npx firenook mcp add` writes Firenook's MCP server into the project files of Claude Code (`.mcp.json`), Cursor (`.cursor/mcp.json`) and VS Code -(`.vscode/mcp.json`); other agents run `npx firenook mcp`. Its 54 tools read +(`.vscode/mcp.json`); other agents run `npx firenook mcp`. Its 55 tools read the log and each function call with its error, ask the Security Rules why a request is denied, and work with Firestore, Auth and Storage data on the local emulators only.