{ "name": "PlonkZKVerifierContract", "structs": { "VerifiedConsentRecord": [ { "name": "circuit_type", "type": "uint8" }, { "name": "commitment", "type": "uint8[32]" }, { "name": "verified_round", "type": "uint64" }, { "name": "consent_app_id", "type": "uint64" } ] }, "methods": [ { "name": "set_consent_ledger_app", "args": [ { "type": "uint64", "name": "app_id" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Link to the ConsentLedger contract. Creator-only.", "events": [], "recommendations": {} }, { "name": "set_verifier_apps", "args": [ { "type": "uint64", "name": "age_range_app" }, { "type": "uint64", "name": "consent_commit_app" }, { "type": "uint64", "name": "nullifier_app" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Register the AlgoPlonk verifier app IDs. Creator-only.", "events": [], "recommendations": {} }, { "name": "submit_zk_consent", "args": [ { "type": "byte[]", "name": "proof" }, { "type": "byte[]", "name": "public_inputs" }, { "type": "uint8", "name": "circuit_type" }, { "type": "uint8[32]", "name": "commitment" }, { "type": "uint64", "name": "consent_app_id" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Record a ZK-verified consent on-chain.\nIMPORTANT: `proof` and `public_inputs` MUST be the first two parameters so the AlgoPlonk-generated logicsig finds them at app_args[1] and app_args[2]. The logicsig verifies the PLONK proof before approving this transaction. If we reach this line, the proof was cryptographically valid \u2014 no trusted oracle.\nDuplicate submissions are rejected via the box key.", "events": [], "recommendations": {} }, { "name": "submit_zk_nullifier", "args": [ { "type": "byte[]", "name": "proof" }, { "type": "byte[]", "name": "public_inputs" }, { "type": "uint8[32]", "name": "nullifier" }, { "type": "uint8[32]", "name": "consent_hash" }, { "type": "uint64", "name": "consent_app_id" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Record a ZK-verified nullifier to prevent consent replay attacks.\nCalled via AlgoPlonk nullifier logicsig transaction group. The nullifier = MiMC(IdentitySecret, ConsentID) is stored on-chain; subsequent attempts with the same nullifier will revert.", "events": [], "recommendations": {} }, { "name": "is_consent_zk_verified", "args": [ { "type": "address", "name": "user" }, { "type": "uint8[32]", "name": "commitment" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Returns True if the user has a ZK-verified consent with this commitment.", "events": [], "recommendations": {} }, { "name": "is_nullifier_used", "args": [ { "type": "uint8[32]", "name": "nullifier" }, { "type": "uint8[32]", "name": "consent_hash" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Returns True if this nullifier has already been used (replay protection).", "events": [], "recommendations": {} }, { "name": "get_verified_round", "args": [ { "type": "address", "name": "user" }, { "type": "uint8[32]", "name": "commitment" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Returns the round at which the consent was ZK-verified (0 if not verified).", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "desc": "\n Trustless PLONK ZK verifier for ConsentLedger.\n\n This contract does NOT perform the proof verification itself \u2014 the AVM\n cannot afford the ~145k opcode budget inline. Instead:\n\n 1. The AlgoPlonk-generated LOGICSIG verifier (a separate .teal file) runs as\n the transaction signer for calls to this contract.\n 2. If the PLONK proof is valid, the logicsig approves \u2192 this method executes.\n 3. This method records the verified consent commitment on-chain.\n 4. ConsentLedger reads is_consent_zk_verified() before granting access.\n\n The security guarantee: this method can ONLY be called if the logicsig\n approved the transaction, which requires a valid PLONK proof as input.\n No backend can forge this \u2014 it's enforced by the AVM itself.\n\n Box key = sha256(user_address(32) || commitment(32)) \u2014 32 bytes, AVM-safe.\n ", "networks": {}, "state": { "schema": { "global": { "ints": 4, "bytes": 0 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "consent_ledger_app": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Y29uc2VudF9sZWRnZXJfYXBw" }, "age_range_verifier_app": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YWdlX3JhbmdlX3ZlcmlmaWVyX2FwcA==" }, "consent_commit_verifier_app": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Y29uc2VudF9jb21taXRfdmVyaWZpZXJfYXBw" }, "nullifier_verifier_app": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bnVsbGlmaWVyX3ZlcmlmaWVyX2FwcA==" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "verified_consents": { "keyType": "AVMBytes", "valueType": "VerifiedConsentRecord", "prefix": "ems6" } } } }, "bareActions": { "create": [ "NoOp" ], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 340 ], "errorMessage": "Consent already recorded" }, { "pc": [ 421 ], "errorMessage": "Nullifier already used (replay attack)" }, { "pc": [ 220, 256 ], "errorMessage": "Only creator" }, { "pc": [ 569 ], "errorMessage": "check self.verified_consents entry exists" }, { "pc": [ 281, 294, 362, 375 ], "errorMessage": "invalid array length header" }, { "pc": [ 288, 301, 369, 382 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 317, 390, 398, 446, 454, 488, 496, 530, 538 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 214, 234, 242, 250, 325, 406 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 309 ], "errorMessage": "invalid number of bytes for arc4.uint8" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAzMiAwIDEgOAogICAgYnl0ZWNibG9jayAweDdhNmIzYSAweDE1MWY3Yzc1ICJjb25zZW50X2xlZGdlcl9hcHAiICJhZ2VfcmFuZ2VfdmVyaWZpZXJfYXBwIiAiY29uc2VudF9jb21taXRfdmVyaWZpZXJfYXBwIiAibnVsbGlmaWVyX3ZlcmlmaWVyX2FwcCIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wbG9ua192ZXJpZmllci9jb250cmFjdC5weTo4MS04MgogICAgLy8gIyBMaW5rZWQgQ29uc2VudExlZGdlciBhcHAuIFNldCBwb3N0LWRlcGxveSB2aWEgc2V0X2NvbnNlbnRfbGVkZ2VyX2FwcCgpLgogICAgLy8gc2VsZi5jb25zZW50X2xlZGdlcl9hcHAgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzIgLy8gImNvbnNlbnRfbGVkZ2VyX2FwcCIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3Bsb25rX3ZlcmlmaWVyL2NvbnRyYWN0LnB5Ojg3LTkwCiAgICAvLyAjIFBlci1jaXJjdWl0IGxvZ2ljc2lnIHZlcmlmaWVyIGFwcCBJRHMuCiAgICAvLyAjIFRoZXNlIGFyZSB0aGUgQWxnb1Bsb25rLWdlbmVyYXRlZCBsb2dpY3NpZyBhcHBzIGRlcGxveWVkIHRvIHRoZSBuZXR3b3JrLgogICAgLy8gIyBTZXQgYnkgdGhlIGNyZWF0b3IgYWZ0ZXIgZGVwbG95aW5nIGVhY2ggdmVyaWZpZXIuCiAgICAvLyBzZWxmLmFnZV9yYW5nZV92ZXJpZmllcl9hcHAgICAgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzMgLy8gImFnZV9yYW5nZV92ZXJpZmllcl9hcHAiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wbG9ua192ZXJpZmllci9jb250cmFjdC5weTo5MQogICAgLy8gc2VsZi5jb25zZW50X2NvbW1pdF92ZXJpZmllcl9hcHAgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDQgLy8gImNvbnNlbnRfY29tbWl0X3ZlcmlmaWVyX2FwcCIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3Bsb25rX3ZlcmlmaWVyL2NvbnRyYWN0LnB5OjkyCiAgICAvLyBzZWxmLm51bGxpZmllcl92ZXJpZmllcl9hcHAgICAgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDUgLy8gIm51bGxpZmllcl92ZXJpZmllcl9hcHAiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Bsb25rX3ZlcmlmaWVyL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBjbGFzcyBQbG9ua1pLVmVyaWZpZXJDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTYKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDliODIyMGJkIDB4ZTRjZjQ0NmYgMHgwMDcxMTEzOSAweGE2NjkzYThmIDB4YzRmZTI2MTQgMHg4OGRlNWZiYiAweDQxODAzOTA2IC8vIG1ldGhvZCAic2V0X2NvbnNlbnRfbGVkZ2VyX2FwcCh1aW50NjQpdm9pZCIsIG1ldGhvZCAic2V0X3ZlcmlmaWVyX2FwcHModWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAic3VibWl0X3prX2NvbnNlbnQoYnl0ZVtdLGJ5dGVbXSx1aW50OCx1aW50OFszMl0sdWludDY0KXZvaWQiLCBtZXRob2QgInN1Ym1pdF96a19udWxsaWZpZXIoYnl0ZVtdLGJ5dGVbXSx1aW50OFszMl0sdWludDhbMzJdLHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJpc19jb25zZW50X3prX3ZlcmlmaWVkKGFkZHJlc3MsdWludDhbMzJdKWJvb2wiLCBtZXRob2QgImlzX251bGxpZmllcl91c2VkKHVpbnQ4WzMyXSx1aW50OFszMl0pYm9vbCIsIG1ldGhvZCAiZ2V0X3ZlcmlmaWVkX3JvdW5kKGFkZHJlc3MsdWludDhbMzJdKXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHNldF9jb25zZW50X2xlZGdlcl9hcHAgc2V0X3ZlcmlmaWVyX2FwcHMgc3VibWl0X3prX2NvbnNlbnQgc3VibWl0X3prX251bGxpZmllciBpc19jb25zZW50X3prX3ZlcmlmaWVkIGlzX251bGxpZmllcl91c2VkIGdldF92ZXJpZmllZF9yb3VuZAogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDE2OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMucGxvbmtfdmVyaWZpZXIuY29udHJhY3QuUGxvbmtaS1ZlcmlmaWVyQ29udHJhY3Quc2V0X2NvbnNlbnRfbGVkZ2VyX2FwcFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9jb25zZW50X2xlZGdlcl9hcHA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGxvbmtfdmVyaWZpZXIvY29udHJhY3QucHk6OTYKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3Bsb25rX3ZlcmlmaWVyL2NvbnRyYWN0LnB5Ojk5CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBHbG9iYWwuY3JlYXRvcl9hZGRyZXNzLCAiT25seSBjcmVhdG9yIgogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgY3JlYXRvcgogICAgLy8gc21hcnRfY29udHJhY3RzL3Bsb25rX3ZlcmlmaWVyL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gc2VsZi5jb25zZW50X2xlZGdlcl9hcHAgPSBhcHBfaWQubmF0aXZlCiAgICBidG9pCiAgICBieXRlY18yIC8vICJjb25zZW50X2xlZGdlcl9hcHAiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3Bsb25rX3ZlcmlmaWVyL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMucGxvbmtfdmVyaWZpZXIuY29udHJhY3QuUGxvbmtaS1ZlcmlmaWVyQ29udHJhY3Quc2V0X3ZlcmlmaWVyX2FwcHNbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfdmVyaWZpZXJfYXBwczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wbG9ua192ZXJpZmllci9jb250cmFjdC5weToxMDIKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3Bsb25rX3ZlcmlmaWVyL2NvbnRyYWN0LnB5OjExMAogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgIk9ubHkgY3JlYXRvciIKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IGNyZWF0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wbG9ua192ZXJpZmllci9jb250cmFjdC5weToxMTEKICAgIC8vIHNlbGYuYWdlX3JhbmdlX3ZlcmlmaWVyX2FwcCAgICAgPSBhZ2VfcmFuZ2VfYXBwLm5hdGl2ZQogICAgdW5jb3ZlciAyCiAgICBidG9pCiAgICBieXRlY18zIC8vICJhZ2VfcmFuZ2VfdmVyaWZpZXJfYXBwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wbG9ua192ZXJpZmllci9jb250cmFjdC5weToxMTIKICAgIC8vIHNlbGYuY29uc2VudF9jb21taXRfdmVyaWZpZXJfYXBwID0gY29uc2VudF9jb21taXRfYXBwLm5hdGl2ZQogICAgc3dhcAogICAgYnRvaQogICAgYnl0ZWMgNCAvLyAiY29uc2VudF9jb21taXRfdmVyaWZpZXJfYXBwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wbG9ua192ZXJpZmllci9jb250cmFjdC5weToxMTMKICAgIC8vIHNlbGYubnVsbGlmaWVyX3ZlcmlmaWVyX2FwcCAgICAgPSBudWxsaWZpZXJfYXBwLm5hdGl2ZQogICAgYnRvaQogICAgYnl0ZWMgNSAvLyAibnVsbGlmaWVyX3ZlcmlmaWVyX2FwcCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGxvbmtfdmVyaWZpZXIvY29udHJhY3QucHk6MTAyCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMucGxvbmtfdmVyaWZpZXIuY29udHJhY3QuUGxvbmtaS1ZlcmlmaWVyQ29udHJhY3Quc3VibWl0X3prX2NvbnNlbnRbcm91dGluZ10oKSAtPiB2b2lkOgpzdWJtaXRfemtfY29uc2VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wbG9ua192ZXJpZmllci9jb250cmFjdC5weToxMTcKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wbG9ua192ZXJpZmllci9jb250cmFjdC5weToxNDAKICAgIC8vIGtleSA9IG9wLnNoYTI1NihUeG4uc2VuZGVyLmJ5dGVzICsgY29tbWl0bWVudC5ieXRlcykKICAgIHR4biBTZW5kZXIKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIHNoYTI1NgogICAgLy8gc21hcnRfY29udHJhY3RzL3Bsb25rX3ZlcmlmaWVyL2NvbnRyYWN0LnB5OjE0MQogICAgLy8gYXNzZXJ0IGtleSBub3QgaW4gc2VsZi52ZXJpZmllZF9jb25zZW50cywgIkNvbnNlbnQgYWxyZWFkeSByZWNvcmRlZCIKICAgIGJ5dGVjXzAgLy8gMHg3YTZiM2EKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBDb25zZW50IGFscmVhZHkgcmVjb3JkZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wbG9ua192ZXJpZmllci9jb250cmFjdC5weToxNDYKICAgIC8vIHZlcmlmaWVkX3JvdW5kPWFyYzQuVUludDY0KEdsb2JhbC5yb3VuZCksCiAgICBnbG9iYWwgUm91bmQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wbG9ua192ZXJpZmllci9jb250cmFjdC5weToxNDMtMTQ4CiAgICAvLyByZWNvcmQgPSBWZXJpZmllZENvbnNlbnRSZWNvcmQoCiAgICAvLyAgICAgY2lyY3VpdF90eXBlPWNpcmN1aXRfdHlwZSwKICAgIC8vICAgICBjb21taXRtZW50PWNvbW1pdG1lbnQuY29weSgpLAogICAgLy8gICAgIHZlcmlmaWVkX3JvdW5kPWFyYzQuVUludDY0KEdsb2JhbC5yb3VuZCksCiAgICAvLyAgICAgY29uc2VudF9hcHBfaWQ9Y29uc2VudF9hcHBfaWQsCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGxvbmtfdmVyaWZpZXIvY29udHJhY3QucHk6MTQ5CiAgICAvLyBzZWxmLnZlcmlmaWVkX2NvbnNlbnRzW2tleV0gPSByZWNvcmQuY29weSgpCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGxvbmtfdmVyaWZpZXIvY29udHJhY3QucHk6MTE3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMucGxvbmtfdmVyaWZpZXIuY29udHJhY3QuUGxvbmtaS1ZlcmlmaWVyQ29udHJhY3Quc3VibWl0X3prX251bGxpZmllcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnN1Ym1pdF96a19udWxsaWZpZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGxvbmtfdmVyaWZpZXIvY29udHJhY3QucHk6MTUzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGxvbmtfdmVyaWZpZXIvY29udHJhY3QucHk6MTcxLTE3MgogICAgLy8gIyBOdWxsaWZpZXIga2V5OiBzaGEyNTYobnVsbGlmaWVyKDMyKSB8fCBjb25zZW50X2hhc2goMzIpKQogICAgLy8ga2V5ID0gb3Auc2hhMjU2KG51bGxpZmllci5ieXRlcyArIGNvbnNlbnRfaGFzaC5ieXRlcykKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc2hhMjU2CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGxvbmtfdmVyaWZpZXIvY29udHJhY3QucHk6MTczCiAgICAvLyBhc3NlcnQga2V5IG5vdCBpbiBzZWxmLnZlcmlmaWVkX2NvbnNlbnRzLCAiTnVsbGlmaWVyIGFscmVhZHkgdXNlZCAocmVwbGF5IGF0dGFjaykiCiAgICBieXRlY18wIC8vIDB4N2E2YjNhCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gTnVsbGlmaWVyIGFscmVhZHkgdXNlZCAocmVwbGF5IGF0dGFjaykKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wbG9ua192ZXJpZmllci9jb250cmFjdC5weToxNzgKICAgIC8vIHZlcmlmaWVkX3JvdW5kPWFyYzQuVUludDY0KEdsb2JhbC5yb3VuZCksCiAgICBnbG9iYWwgUm91bmQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wbG9ua192ZXJpZmllci9jb250cmFjdC5weToxNzYKICAgIC8vIGNpcmN1aXRfdHlwZT1hcmM0LlVJbnQ4KDIpLCAgIyBudWxsaWZpZXIgY2lyY3VpdAogICAgcHVzaGJ5dGVzIDB4MDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wbG9ua192ZXJpZmllci9jb250cmFjdC5weToxNzUtMTgwCiAgICAvLyByZWNvcmQgPSBWZXJpZmllZENvbnNlbnRSZWNvcmQoCiAgICAvLyAgICAgY2lyY3VpdF90eXBlPWFyYzQuVUludDgoMiksICAjIG51bGxpZmllciBjaXJjdWl0CiAgICAvLyAgICAgY29tbWl0bWVudD1udWxsaWZpZXIuY29weSgpLAogICAgLy8gICAgIHZlcmlmaWVkX3JvdW5kPWFyYzQuVUludDY0KEdsb2JhbC5yb3VuZCksCiAgICAvLyAgICAgY29uc2VudF9hcHBfaWQ9Y29uc2VudF9hcHBfaWQsCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3Bsb25rX3ZlcmlmaWVyL2NvbnRyYWN0LnB5OjE4MQogICAgLy8gc2VsZi52ZXJpZmllZF9jb25zZW50c1trZXldID0gcmVjb3JkLmNvcHkoKQogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3Bsb25rX3ZlcmlmaWVyL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLnBsb25rX3ZlcmlmaWVyLmNvbnRyYWN0LlBsb25rWktWZXJpZmllckNvbnRyYWN0LmlzX2NvbnNlbnRfemtfdmVyaWZpZWRbcm91dGluZ10oKSAtPiB2b2lkOgppc19jb25zZW50X3prX3ZlcmlmaWVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Bsb25rX3ZlcmlmaWVyL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wbG9ua192ZXJpZmllci9jb250cmFjdC5weToxOTIKICAgIC8vIGtleSA9IG9wLnNoYTI1Nih1c2VyLmJ5dGVzICsgY29tbWl0bWVudC5ieXRlcykKICAgIGNvbmNhdAogICAgc2hhMjU2CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGxvbmtfdmVyaWZpZXIvY29udHJhY3QucHk6MTkzCiAgICAvLyBpZiBrZXkgbm90IGluIHNlbGYudmVyaWZpZWRfY29uc2VudHM6CiAgICBieXRlY18wIC8vIDB4N2E2YjNhCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGlzX2NvbnNlbnRfemtfdmVyaWZpZWRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGxvbmtfdmVyaWZpZXIvY29udHJhY3QucHk6MTk0CiAgICAvLyByZXR1cm4gYXJjNC5Cb29sKEZhbHNlKQogICAgcHVzaGJ5dGVzIDB4MDAKCmlzX2NvbnNlbnRfemtfdmVyaWZpZWRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMucGxvbmtfdmVyaWZpZXIuY29udHJhY3QuUGxvbmtaS1ZlcmlmaWVyQ29udHJhY3QuaXNfY29uc2VudF96a192ZXJpZmllZEA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Bsb25rX3ZlcmlmaWVyL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKaXNfY29uc2VudF96a192ZXJpZmllZF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGxvbmtfdmVyaWZpZXIvY29udHJhY3QucHk6MTk1CiAgICAvLyByZXR1cm4gYXJjNC5Cb29sKFRydWUpCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgLy8gc21hcnRfY29udHJhY3RzL3Bsb25rX3ZlcmlmaWVyL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiBpc19jb25zZW50X3prX3ZlcmlmaWVkX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLnBsb25rX3ZlcmlmaWVyLmNvbnRyYWN0LlBsb25rWktWZXJpZmllckNvbnRyYWN0LmlzX2NvbnNlbnRfemtfdmVyaWZpZWRANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wbG9ua192ZXJpZmllci5jb250cmFjdC5QbG9ua1pLVmVyaWZpZXJDb250cmFjdC5pc19udWxsaWZpZXJfdXNlZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmlzX251bGxpZmllcl91c2VkOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Bsb25rX3ZlcmlmaWVyL2NvbnRyYWN0LnB5OjE5NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wbG9ua192ZXJpZmllci9jb250cmFjdC5weToyMDQKICAgIC8vIGtleSA9IG9wLnNoYTI1NihudWxsaWZpZXIuYnl0ZXMgKyBjb25zZW50X2hhc2guYnl0ZXMpCiAgICBjb25jYXQKICAgIHNoYTI1NgogICAgLy8gc21hcnRfY29udHJhY3RzL3Bsb25rX3ZlcmlmaWVyL2NvbnRyYWN0LnB5OjIwNQogICAgLy8gaWYga2V5IG5vdCBpbiBzZWxmLnZlcmlmaWVkX2NvbnNlbnRzOgogICAgYnl0ZWNfMCAvLyAweDdhNmIzYQogICAgc3dhcAogICAgY29uY2F0CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBpc19udWxsaWZpZXJfdXNlZF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wbG9ua192ZXJpZmllci9jb250cmFjdC5weToyMDYKICAgIC8vIHJldHVybiBhcmM0LkJvb2woRmFsc2UpCiAgICBwdXNoYnl0ZXMgMHgwMAoKaXNfbnVsbGlmaWVyX3VzZWRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMucGxvbmtfdmVyaWZpZXIuY29udHJhY3QuUGxvbmtaS1ZlcmlmaWVyQ29udHJhY3QuaXNfbnVsbGlmaWVyX3VzZWRANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wbG9ua192ZXJpZmllci9jb250cmFjdC5weToxOTcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCmlzX251bGxpZmllcl91c2VkX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wbG9ua192ZXJpZmllci9jb250cmFjdC5weToyMDcKICAgIC8vIHJldHVybiBhcmM0LkJvb2woVHJ1ZSkKICAgIHB1c2hieXRlcyAweDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGxvbmtfdmVyaWZpZXIvY29udHJhY3QucHk6MTk3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIGlzX251bGxpZmllcl91c2VkX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLnBsb25rX3ZlcmlmaWVyLmNvbnRyYWN0LlBsb25rWktWZXJpZmllckNvbnRyYWN0LmlzX251bGxpZmllcl91c2VkQDQKCgovLyBzbWFydF9jb250cmFjdHMucGxvbmtfdmVyaWZpZXIuY29udHJhY3QuUGxvbmtaS1ZlcmlmaWVyQ29udHJhY3QuZ2V0X3ZlcmlmaWVkX3JvdW5kW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X3ZlcmlmaWVkX3JvdW5kOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Bsb25rX3ZlcmlmaWVyL2NvbnRyYWN0LnB5OjIwOQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wbG9ua192ZXJpZmllci9jb250cmFjdC5weToyMTYKICAgIC8vIGtleSA9IG9wLnNoYTI1Nih1c2VyLmJ5dGVzICsgY29tbWl0bWVudC5ieXRlcykKICAgIGNvbmNhdAogICAgc2hhMjU2CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGxvbmtfdmVyaWZpZXIvY29udHJhY3QucHk6MjE3CiAgICAvLyBpZiBrZXkgbm90IGluIHNlbGYudmVyaWZpZWRfY29uc2VudHM6CiAgICBieXRlY18wIC8vIDB4N2E2YjNhCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZ2V0X3ZlcmlmaWVkX3JvdW5kX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL3Bsb25rX3ZlcmlmaWVyL2NvbnRyYWN0LnB5OjIxOAogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KDApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwCgpnZXRfdmVyaWZpZWRfcm91bmRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMucGxvbmtfdmVyaWZpZXIuY29udHJhY3QuUGxvbmtaS1ZlcmlmaWVyQ29udHJhY3QuZ2V0X3ZlcmlmaWVkX3JvdW5kQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGxvbmtfdmVyaWZpZXIvY29udHJhY3QucHk6MjA5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgpnZXRfdmVyaWZpZWRfcm91bmRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Bsb25rX3ZlcmlmaWVyL2NvbnRyYWN0LnB5OjIxOQogICAgLy8gcmV0dXJuIHNlbGYudmVyaWZpZWRfY29uc2VudHNba2V5XS52ZXJpZmllZF9yb3VuZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi52ZXJpZmllZF9jb25zZW50cyBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gc21hcnRfY29udHJhY3RzL3Bsb25rX3ZlcmlmaWVyL2NvbnRyYWN0LnB5OjIwOQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiBnZXRfdmVyaWZpZWRfcm91bmRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMucGxvbmtfdmVyaWZpZXIuY29udHJhY3QuUGxvbmtaS1ZlcmlmaWVyQ29udHJhY3QuZ2V0X3ZlcmlmaWVkX3JvdW5kQDQK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAEIAABCCYGA3prOgQVH3x1EmNvbnNlbnRfbGVkZ2VyX2FwcBZhZ2VfcmFuZ2VfdmVyaWZpZXJfYXBwG2NvbnNlbnRfY29tbWl0X3ZlcmlmaWVyX2FwcBZudWxsaWZpZXJfdmVyaWZpZXJfYXBwMRhAAA4qI2crI2cnBCNnJwUjZzEbQQBAMRkURDEYRIIHBJuCIL0E5M9EbwQAcRE5BKZpOo8ExP4mFASI3l+7BEGAOQY2GgCOBwAJAB0ATgCfAPEBGwFFADEZFDEYFBBDNhoBSRUlEkQxADIJEkQXKkxnJEM2GgFJFSUSRDYaAkkVJRJENhoDSRUlEkQxADIJEkRPAhcrTGdMFycETGcXJwVMZyRDNhoBSSNZgQIITBUSRDYaAkkjWYECCEwVEkQ2GgNJFSQSRDYaBEkVIhJENhoFSRUlEkQxAEsCUAEoTFBJvUUBFEQyBhZPBE8EUExQTwJQvyRDNhoBSSNZgQIITBUSRDYaAkkjWYECCEwVEkQ2GgNJFSISRDYaBEkVIhJENhoFSRUlEkRLAk8CUAEoTFBJvUUBFEQyBhaAAQJPBFBMUE8CUL8kQzYaAUkVIhJENhoCSRUiEkRQAShMUL1FAUAACYABAClMULAkQ4ABgEL/9DYaAUkVIhJENhoCSRUiEkRQAShMUL1FAUAACYABAClMULAkQ4ABgEL/9DYaAUkVIhJENhoCSRUiEkRQAShMUEm9RQFAABCACAAAAAAAAAAAKUxQsCRDSb5EVyEIQv/x", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 8, "patch": 0 } }, "events": [], "templateVariables": {} }