{ "name": "EscrowSessionVaultManager", "structs": { "Object43BC5A10": [ { "name": "payer", "type": "address" }, { "name": "payee", "type": "address" }, { "name": "authorizedSigner", "type": "byte[]" }, { "name": "totalDeposit", "type": "uint64" }, { "name": "lastSettled", "type": "uint64" }, { "name": "latestVoucherAmount", "type": "uint64" }, { "name": "startRound", "type": "uint64" }, { "name": "startTimestamp", "type": "uint64" }, { "name": "closeRequestedAt", "type": "uint64" } ], "ObjectAACF8510": [ { "name": "receiver", "type": "address" } ] }, "methods": [ { "name": "open", "args": [ { "type": "address", "name": "payee" }, { "type": "axfer", "name": "deposit" }, { "type": "byte[]", "name": "salt" }, { "type": "byte[]", "name": "authorizedSigner" }, { "type": "byte[]", "name": "authorizedSignerPublicKey" } ], "returns": { "type": "byte[]" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Opens a channel with initial USDC deposit and returns derived channelId.\nCaller becomes payer.\nauthorizedSigner is signer pubkey hash (32 bytes) computed client-side.\nauthorizedSignerPublicKey is optional: if provided, stores full signer pubkey in box.", "events": [], "recommendations": {} }, { "name": "topUp", "args": [ { "type": "byte[]", "name": "channelId" }, { "type": "axfer", "name": "cumulativeAmount" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Adds funds to an existing channel using a grouped USDC asset transfer.", "events": [], "recommendations": {} }, { "name": "setAuthorizedSignerPublicKey", "args": [ { "type": "byte[]", "name": "channelId" }, { "type": "byte[]", "name": "authorizedSignerPublicKey" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Set full authorized signer public key and update channel.authorizedSigner hash.", "events": [], "recommendations": {} }, { "name": "updateVoucher", "args": [ { "type": "byte[]", "name": "channelId" }, { "type": "uint64", "name": "cumulativeAmount" }, { "type": "byte[]", "name": "signature" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Stores latest cumulative voucher amount on-chain.", "events": [], "recommendations": {} }, { "name": "settle", "args": [ { "type": "byte[]", "name": "channelId" }, { "type": "uint64", "name": "cumulativeAmount" }, { "type": "byte[]", "name": "signature" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Payee settles signed voucher funds, with support for partial settlement.\nAlso advances latestVoucherAmount when the submitted signed voucher is newer.", "events": [], "recommendations": {} }, { "name": "settleLatest", "args": [ { "type": "byte[]", "name": "channelId" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Helper for payee: settle all currently unclaimed voucher amount.", "events": [], "recommendations": {} }, { "name": "close", "args": [ { "type": "byte[]", "name": "channelId" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Payee closes channel.\nHonors the latest on-chain voucher before refunding the payer.", "events": [], "recommendations": {} }, { "name": "requestClose", "args": [ { "type": "byte[]", "name": "channelId" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Payer requests channel closure, starting forced-close grace period.", "events": [], "recommendations": {} }, { "name": "withdraw", "args": [ { "type": "byte[]", "name": "channelId" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Payer withdraws remaining funds after grace period expires.\nHonors the latest on-chain voucher before refunding the payer.", "events": [], "recommendations": {} }, { "name": "fundMbrPool", "args": [ { "type": "(address)", "struct": "ObjectAACF8510", "name": "payment" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Funds MBR/fees pool using ALGO.", "events": [], "recommendations": {} }, { "name": "optInUsdc", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Opt app account into configured USDC ASA so it can receive deposits.\nShould be called once by admin/creator.", "events": [], "recommendations": {} }, { "name": "getSessionStaticData", "args": [ { "type": "byte[]", "name": "channelId" } ], "returns": { "type": "(uint64,uint64)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Returns latest session static data tuple:\n[startRound, startTimestamp]", "events": [], "recommendations": {} }, { "name": "getSessionDynamicData", "args": [ { "type": "byte[]", "name": "channelId" } ], "returns": { "type": "(uint64,uint64,uint64)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Returns latest session dynamic data tuple:\n[totalDeposit, lastSettled, latestVoucherAmount]", "events": [], "recommendations": {} }, { "name": "computeChannelId", "args": [ { "type": "address", "name": "payer" }, { "type": "address", "name": "payee" }, { "type": "byte[]", "name": "authorizedSigner" }, { "type": "byte[]", "name": "salt" } ], "returns": { "type": "byte[]" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Backwards-compatible alias for deterministic channelId derivation.\nauthorizedSigner must be signer pubkey hash (32 bytes).", "events": [], "recommendations": {} }, { "name": "settleMessage", "args": [ { "type": "byte[]", "name": "channelId" }, { "type": "uint64", "name": "cumulativeAmount" } ], "returns": { "type": "byte[]" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Read-only helper for clients: exact bytes signed for settle/updateVoucher.", "events": [], "recommendations": {} }, { "name": "verifySettleSignature", "args": [ { "type": "byte[]", "name": "channelId" }, { "type": "uint64", "name": "cumulativeAmount" }, { "type": "byte[]", "name": "signature" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Read-only helper for clients: verifies settle authorization exactly as settle/updateVoucher do.\nUses full authorized signer public key stored in a box for the channel.", "events": [], "recommendations": {} }, { "name": "deriveChannelId", "args": [ { "type": "address", "name": "payer" }, { "type": "address", "name": "payee" }, { "type": "byte[]", "name": "authorizedSigner" }, { "type": "byte[]", "name": "salt" } ], "returns": { "type": "byte[]" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Read-only helper for clients: deterministic channelId derivation.\nauthorizedSigner must be signer pubkey hash (32 bytes).", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "networks": {}, "state": { "schema": { "global": { "ints": 0, "bytes": 0 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": {}, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "channels": { "keyType": "AVMBytes", "valueType": "Object43BC5A10", "desc": "BoxMap for channel data, keyed by channelId bytes.", "prefix": "" }, "authorizedSignerPublicKey": { "keyType": "AVMBytes", "valueType": "AVMBytes", "desc": "Full authorized signer public key storage, keyed by channelId.", "prefix": "cA==" } } } }, "bareActions": { "create": [ "NoOp" ], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 1555 ], "errorMessage": "Asset close not allowed" }, { "pc": [ 370, 1687 ], "errorMessage": "Authorized signer hash mismatch" }, { "pc": [ 507 ], "errorMessage": "Authorized signer pubkey required" }, { "pc": [ 1424 ], "errorMessage": "Authorized signer public key not set yet" }, { "pc": [ 329 ], "errorMessage": "Box must have value" }, { "pc": [ 425, 488, 589, 697, 818, 897, 939, 979, 1084, 1128, 1402 ], "errorMessage": "Channel does not exist" }, { "pc": [ 1547 ], "errorMessage": "Clawback transfer not allowed" }, { "pc": [ 1010 ], "errorMessage": "Close grace period not elapsed" }, { "pc": [ 1001 ], "errorMessage": "Close not requested" }, { "pc": [ 1539 ], "errorMessage": "Deposit must be > 0" }, { "pc": [ 1497 ], "errorMessage": "Invalid Ed25519 signature length" }, { "pc": [ 1505 ], "errorMessage": "Invalid signature" }, { "pc": [ 1478 ], "errorMessage": "Invalid signer pubkey" }, { "pc": [ 729, 849 ], "errorMessage": "Nothing new to settle" }, { "pc": [ 8 ], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [ 146 ], "errorMessage": "OnCompletion must be NoOp && can only call when creating" }, { "pc": [ 1041 ], "errorMessage": "Only creator can opt in USDC" }, { "pc": [ 911 ], "errorMessage": "Only payee can close" }, { "pc": [ 716, 831 ], "errorMessage": "Only payee can settle" }, { "pc": [ 339 ], "errorMessage": "Only payer can reopen channel" }, { "pc": [ 949 ], "errorMessage": "Only payer can request close" }, { "pc": [ 504 ], "errorMessage": "Only payer can set authorized signer" }, { "pc": [ 440 ], "errorMessage": "Only payer can top up" }, { "pc": [ 599 ], "errorMessage": "Only payer can update voucher" }, { "pc": [ 993 ], "errorMessage": "Only payer can withdraw" }, { "pc": [ 349 ], "errorMessage": "Payee mismatch" }, { "pc": [ 1533 ], "errorMessage": "Payment asset must be USDC" }, { "pc": [ 1033, 1525 ], "errorMessage": "Payment must be to contract" }, { "pc": [ 1517 ], "errorMessage": "Payment sender mismatch" }, { "pc": [ 610 ], "errorMessage": "Voucher below settled amount" }, { "pc": [ 632, 740 ], "errorMessage": "Voucher exceeds deposit" }, { "pc": [ 621 ], "errorMessage": "Voucher not increasing" }, { "pc": [ 177, 193, 212, 398, 456, 472, 547, 573, 651, 681, 803, 882, 924, 964, 1069, 1113, 1188, 1204, 1240, 1282, 1307, 1346, 1362 ], "errorMessage": "invalid array length header" }, { "pc": [ 1026 ], "errorMessage": "invalid number of bytes for ObjectAACF8510" }, { "pc": [ 184, 200, 219, 405, 463, 479, 554, 580, 658, 688, 810, 889, 931, 971, 1076, 1120, 1195, 1211, 1247, 1289, 1314, 1353, 1369 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 158, 1173, 1182, 1331, 1340 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 565, 673, 1258, 1300 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 171, 419 ], "errorMessage": "transaction type is axfer" } ], "pcOffsetMethod": "cblocks" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAyIDEgOCBUTVBMX1VTRENfQVNTRVRfSUQKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NTAwMjAgMHgxNTFmN2M3NSAweDAwMjAgIiIgMHgwNjgxMDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6NDQKICAgIC8vIGV4cG9ydCBjbGFzcyBFc2Nyb3dTZXNzaW9uVmF1bHRNYW5hZ2VyIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlQDI0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDQ4ZDUzZTMyIDB4YmRjZmFjNTggMHg0YjFkYmI2NyAweGE5OGQ4MmRhIDB4ZjdkZjhkZTIgMHg2ZTg3Mjc4OSAweGU4NmFlOWU5IDB4MzQ2ODUwNTAgMHg1OTA1ZDRmNCAweGFhMTRjNGY5IDB4N2UzZjRhNjggMHhhODcwNDkwMyAweDFlOWMwMDkwIDB4OGM0Y2ZjZjcgMHg2NzIwZDhmZiAweDI3MDQ5Mjg5IDB4MmJmNjA5ZTAgLy8gbWV0aG9kICJvcGVuKGFkZHJlc3MsYXhmZXIsYnl0ZVtdLGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ0b3BVcChieXRlW10sYXhmZXIpdm9pZCIsIG1ldGhvZCAic2V0QXV0aG9yaXplZFNpZ25lclB1YmxpY0tleShieXRlW10sYnl0ZVtdKXZvaWQiLCBtZXRob2QgInVwZGF0ZVZvdWNoZXIoYnl0ZVtdLHVpbnQ2NCxieXRlW10pdm9pZCIsIG1ldGhvZCAic2V0dGxlKGJ5dGVbXSx1aW50NjQsYnl0ZVtdKXZvaWQiLCBtZXRob2QgInNldHRsZUxhdGVzdChieXRlW10pdm9pZCIsIG1ldGhvZCAiY2xvc2UoYnl0ZVtdKXZvaWQiLCBtZXRob2QgInJlcXVlc3RDbG9zZShieXRlW10pdm9pZCIsIG1ldGhvZCAid2l0aGRyYXcoYnl0ZVtdKXZvaWQiLCBtZXRob2QgImZ1bmRNYnJQb29sKChhZGRyZXNzKSl2b2lkIiwgbWV0aG9kICJvcHRJblVzZGMoKXZvaWQiLCBtZXRob2QgImdldFNlc3Npb25TdGF0aWNEYXRhKGJ5dGVbXSkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImdldFNlc3Npb25EeW5hbWljRGF0YShieXRlW10pKHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29tcHV0ZUNoYW5uZWxJZChhZGRyZXNzLGFkZHJlc3MsYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInNldHRsZU1lc3NhZ2UoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeVNldHRsZVNpZ25hdHVyZShieXRlW10sdWludDY0LGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJkZXJpdmVDaGFubmVsSWQoYWRkcmVzcyxhZGRyZXNzLGJ5dGVbXSxieXRlW10pYnl0ZVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggb3BlbiB0b3BVcCBzZXRBdXRob3JpemVkU2lnbmVyUHVibGljS2V5IHVwZGF0ZVZvdWNoZXIgc2V0dGxlIHNldHRsZUxhdGVzdCBjbG9zZSByZXF1ZXN0Q2xvc2Ugd2l0aGRyYXcgZnVuZE1iclBvb2wgb3B0SW5Vc2RjIGdldFNlc3Npb25TdGF0aWNEYXRhIGdldFNlc3Npb25EeW5hbWljRGF0YSBjb21wdXRlQ2hhbm5lbElkIHNldHRsZU1lc3NhZ2UgdmVyaWZ5U2V0dGxlU2lnbmF0dXJlIGRlcml2ZUNoYW5uZWxJZAogICAgZXJyCgptYWluX19fYWxnb3RzX18uZGVmYXVsdENyZWF0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6NDQKICAgIC8vIGV4cG9ydCBjbGFzcyBFc2Nyb3dTZXNzaW9uVmF1bHRNYW5hZ2VyIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjpFc2Nyb3dTZXNzaW9uVmF1bHRNYW5hZ2VyLm9wZW5bcm91dGluZ10oKSAtPiB2b2lkOgpvcGVuOgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czo2MS02NwogICAgLy8gb3BlbigKICAgIC8vICAgcGF5ZWU6IEFjY291bnQsCiAgICAvLyAgIGRlcG9zaXQ6IGd0eG4uQXNzZXRUcmFuc2ZlclR4biwKICAgIC8vICAgc2FsdDogYnl0ZXMsCiAgICAvLyAgIGF1dGhvcml6ZWRTaWduZXI6IGJ5dGVzLAogICAgLy8gICBhdXRob3JpemVkU2lnbmVyUHVibGljS2V5OiBieXRlcywKICAgIC8vICk6IGJ5dGVzIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzIgLy8gMQogICAgLQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBjb3ZlciA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgY292ZXIgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czo2OQogICAgLy8gY29uc3QgYXV0aG9yaXplZFNpZ25lckhhc2ggPSBzaGE1MTJfMjU2KGF1dGhvcml6ZWRTaWduZXIpCiAgICBkdXAKICAgIHNoYTUxMl8yNTYKICAgIGNvdmVyIDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6NzEKICAgIC8vIGNvbnN0IGNoYW5uZWxJZCA9IHRoaXMuZGVyaXZlQ2hhbm5lbElkKFR4bi5zZW5kZXIsIHBheWVlLCBhdXRob3JpemVkU2lnbmVyLCBzYWx0KQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czozNTUKICAgIC8vIHJldHVybiBvcC5zaGEyNTYocGF5ZXIuYnl0ZXMuY29uY2F0KHBheWVlLmJ5dGVzKS5jb25jYXQob3AuaXRvYihVU0RDX0FTU0VUX0lEKSkuY29uY2F0KHNhbHQpLmNvbmNhdChhdXRob3JpemVkU2lnbmVyKSkKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBpbnRjIDQgLy8gVE1QTF9VU0RDX0FTU0VUX0lECiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHNoYTI1NgogICAgZHVwCiAgICBjb3ZlciAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjc0CiAgICAvLyBpZiAoIWNoYW5uZWwuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBvcGVuX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czo4MgogICAgLy8gc3RhcnRSb3VuZDogb3AuR2xvYmFsLnJvdW5kLAogICAgZ2xvYmFsIFJvdW5kCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjgzCiAgICAvLyBzdGFydFRpbWVzdGFtcDogb3AuR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6NzYKICAgIC8vIHBheWVyOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czo3NS04NQogICAgLy8gY29uc3QgZGF0YTogQ2hhbm5lbEluZm8gPSB7CiAgICAvLyAgIHBheWVyOiBUeG4uc2VuZGVyLAogICAgLy8gICBwYXllZSwKICAgIC8vICAgYXV0aG9yaXplZFNpZ25lcjogYXV0aG9yaXplZFNpZ25lckhhc2gsCiAgICAvLyAgIHRvdGFsRGVwb3NpdDogMCwKICAgIC8vICAgbGFzdFNldHRsZWQ6IDAsCiAgICAvLyAgIGxhdGVzdFZvdWNoZXJBbW91bnQ6IDAsCiAgICAvLyAgIHN0YXJ0Um91bmQ6IG9wLkdsb2JhbC5yb3VuZCwKICAgIC8vICAgc3RhcnRUaW1lc3RhbXA6IG9wLkdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsCiAgICAvLyAgIGNsb3NlUmVxdWVzdGVkQXQ6IDAsCiAgICAvLyB9CiAgICBkaWcgOAogICAgY29uY2F0CiAgICBieXRlY18yIC8vIDB4MDAyMAogICAgZGlnIDcKICAgIGNvbmNhdAogICAgc3dhcAogICAgcHVzaGJ5dGVzIDB4MDA3MgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjc5CiAgICAvLyB0b3RhbERlcG9zaXQ6IDAsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czo3NS04NQogICAgLy8gY29uc3QgZGF0YTogQ2hhbm5lbEluZm8gPSB7CiAgICAvLyAgIHBheWVyOiBUeG4uc2VuZGVyLAogICAgLy8gICBwYXllZSwKICAgIC8vICAgYXV0aG9yaXplZFNpZ25lcjogYXV0aG9yaXplZFNpZ25lckhhc2gsCiAgICAvLyAgIHRvdGFsRGVwb3NpdDogMCwKICAgIC8vICAgbGFzdFNldHRsZWQ6IDAsCiAgICAvLyAgIGxhdGVzdFZvdWNoZXJBbW91bnQ6IDAsCiAgICAvLyAgIHN0YXJ0Um91bmQ6IG9wLkdsb2JhbC5yb3VuZCwKICAgIC8vICAgc3RhcnRUaW1lc3RhbXA6IG9wLkdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsCiAgICAvLyAgIGNsb3NlUmVxdWVzdGVkQXQ6IDAsCiAgICAvLyB9CiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjg2CiAgICAvLyB0aGlzLnNldEF1dGhvcml6ZWRTaWduZXJQdWJsaWNLZXlJZlByb3ZpZGVkKGNoYW5uZWxJZCwgYXV0aG9yaXplZFNpZ25lclB1YmxpY0tleSwgYXV0aG9yaXplZFNpZ25lcikKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHVuY292ZXIgNAogICAgZGlnIDcKICAgIGNhbGxzdWIgc2V0QXV0aG9yaXplZFNpZ25lclB1YmxpY0tleUlmUHJvdmlkZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6ODcKICAgIC8vIHRoaXMuYXBwbHlUb3BVcChkYXRhLCBkZXBvc2l0KQogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGFwcGx5VG9wVXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6ODgKICAgIC8vIGNoYW5uZWwudmFsdWUgPSBjbG9uZShkYXRhKQogICAgZGlnIDEKICAgIGJveF9kZWwKICAgIHBvcAogICAgYm94X3B1dAoKb3Blbl9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6OkVzY3Jvd1Nlc3Npb25WYXVsdE1hbmFnZXIub3BlbkA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czo2MS02NwogICAgLy8gb3BlbigKICAgIC8vICAgcGF5ZWU6IEFjY291bnQsCiAgICAvLyAgIGRlcG9zaXQ6IGd0eG4uQXNzZXRUcmFuc2ZlclR4biwKICAgIC8vICAgc2FsdDogYnl0ZXMsCiAgICAvLyAgIGF1dGhvcml6ZWRTaWduZXI6IGJ5dGVzLAogICAgLy8gICBhdXRob3JpemVkU2lnbmVyUHVibGljS2V5OiBieXRlcywKICAgIC8vICk6IGJ5dGVzIHsKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NTAwMjAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKb3Blbl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjkyCiAgICAvLyBjb25zdCBkYXRhID0gY2xvbmUoY2hhbm5lbC52YWx1ZSkKICAgIGRpZyAyCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjkzCiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gZGF0YS5wYXllciwgJ09ubHkgcGF5ZXIgY2FuIHJlb3BlbiBjaGFubmVsJykKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6OTItOTMKICAgIC8vIGNvbnN0IGRhdGEgPSBjbG9uZShjaGFubmVsLnZhbHVlKQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IGRhdGEucGF5ZXIsICdPbmx5IHBheWVyIGNhbiByZW9wZW4gY2hhbm5lbCcpCiAgICBkaWcgMgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjkzCiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gZGF0YS5wYXllciwgJ09ubHkgcGF5ZXIgY2FuIHJlb3BlbiBjaGFubmVsJykKICAgID09CiAgICBhc3NlcnQgLy8gT25seSBwYXllciBjYW4gcmVvcGVuIGNoYW5uZWwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6OTQKICAgIC8vIGFzc2VydChwYXllZSA9PT0gZGF0YS5wYXllZSwgJ1BheWVlIG1pc21hdGNoJykKICAgIGRpZyAxCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBkdXAKICAgIGJveF9leHRyYWN0CiAgICBkaWcgOAogICAgPT0KICAgIGFzc2VydCAvLyBQYXllZSBtaXNtYXRjaAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czo5NQogICAgLy8gYXNzZXJ0KGF1dGhvcml6ZWRTaWduZXIgPT09IGRhdGEuYXV0aG9yaXplZFNpZ25lciwgJ0F1dGhvcml6ZWQgc2lnbmVyIGhhc2ggbWlzbWF0Y2gnKQogICAgZHVwCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgZGlnIDIKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgNwogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gQXV0aG9yaXplZCBzaWduZXIgaGFzaCBtaXNtYXRjaAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czo5NwogICAgLy8gdGhpcy5zZXRBdXRob3JpemVkU2lnbmVyUHVibGljS2V5SWZQcm92aWRlZChjaGFubmVsSWQsIGF1dGhvcml6ZWRTaWduZXJQdWJsaWNLZXksIGRhdGEuYXV0aG9yaXplZFNpZ25lcikKICAgIGRpZyAyCiAgICB1bmNvdmVyIDUKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBzZXRBdXRob3JpemVkU2lnbmVyUHVibGljS2V5SWZQcm92aWRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czo5OAogICAgLy8gdGhpcy5hcHBseVRvcFVwKGRhdGEsIGRlcG9zaXQpCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgYXBwbHlUb3BVcAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czo5OQogICAgLy8gY2hhbm5lbC52YWx1ZSA9IGNsb25lKGRhdGEpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjYxLTY3CiAgICAvLyBvcGVuKAogICAgLy8gICBwYXllZTogQWNjb3VudCwKICAgIC8vICAgZGVwb3NpdDogZ3R4bi5Bc3NldFRyYW5zZmVyVHhuLAogICAgLy8gICBzYWx0OiBieXRlcywKICAgIC8vICAgYXV0aG9yaXplZFNpZ25lcjogYnl0ZXMsCiAgICAvLyAgIGF1dGhvcml6ZWRTaWduZXJQdWJsaWNLZXk6IGJ5dGVzLAogICAgLy8gKTogYnl0ZXMgewogICAgYiBvcGVuX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czo6RXNjcm93U2Vzc2lvblZhdWx0TWFuYWdlci5vcGVuQDQKCgovLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjpFc2Nyb3dTZXNzaW9uVmF1bHRNYW5hZ2VyLnRvcFVwW3JvdXRpbmddKCkgLT4gdm9pZDoKdG9wVXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjEwNwogICAgLy8gdG9wVXAoY2hhbm5lbElkOiBieXRlcywgY3VtdWxhdGl2ZUFtb3VudDogZ3R4bi5Bc3NldFRyYW5zZmVyVHhuKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMiAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czoxMDkKICAgIC8vIGFzc2VydChjaGFubmVsLmV4aXN0cywgJ0NoYW5uZWwgZG9lcyBub3QgZXhpc3QnKQogICAgZGlnIDEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIENoYW5uZWwgZG9lcyBub3QgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTExCiAgICAvLyBjb25zdCBkYXRhID0gY2xvbmUoY2hhbm5lbC52YWx1ZSkKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTEyCiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gZGF0YS5wYXllciwgJ09ubHkgcGF5ZXIgY2FuIHRvcCB1cCcpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjExMS0xMTIKICAgIC8vIGNvbnN0IGRhdGEgPSBjbG9uZShjaGFubmVsLnZhbHVlKQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IGRhdGEucGF5ZXIsICdPbmx5IHBheWVyIGNhbiB0b3AgdXAnKQogICAgZGlnIDMKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czoxMTIKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSBkYXRhLnBheWVyLCAnT25seSBwYXllciBjYW4gdG9wIHVwJykKICAgID09CiAgICBhc3NlcnQgLy8gT25seSBwYXllciBjYW4gdG9wIHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjExNAogICAgLy8gdGhpcy5hcHBseVRvcFVwKGRhdGEsIGN1bXVsYXRpdmVBbW91bnQpCiAgICBjYWxsc3ViIGFwcGx5VG9wVXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTE1CiAgICAvLyBjaGFubmVsLnZhbHVlID0gY2xvbmUoZGF0YSkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTA3CiAgICAvLyB0b3BVcChjaGFubmVsSWQ6IGJ5dGVzLCBjdW11bGF0aXZlQW1vdW50OiBndHhuLkFzc2V0VHJhbnNmZXJUeG4pOiB2b2lkIHsKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjpFc2Nyb3dTZXNzaW9uVmF1bHRNYW5hZ2VyLnNldEF1dGhvcml6ZWRTaWduZXJQdWJsaWNLZXlbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRBdXRob3JpemVkU2lnbmVyUHVibGljS2V5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czoxMjEKICAgIC8vIHNldEF1dGhvcml6ZWRTaWduZXJQdWJsaWNLZXkoY2hhbm5lbElkOiBieXRlcywgYXV0aG9yaXplZFNpZ25lclB1YmxpY0tleTogYnl0ZXMpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czoxMjMKICAgIC8vIGFzc2VydChjaGFubmVsLmV4aXN0cywgJ0NoYW5uZWwgZG9lcyBub3QgZXhpc3QnKQogICAgZGlnIDEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIENoYW5uZWwgZG9lcyBub3QgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTI1CiAgICAvLyBjb25zdCBkYXRhID0gY2xvbmUoY2hhbm5lbC52YWx1ZSkKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTI2CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gZGF0YS5wYXllciwgJ09ubHkgcGF5ZXIgY2FuIHNldCBhdXRob3JpemVkIHNpZ25lcicpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjEyNS0xMjYKICAgIC8vIGNvbnN0IGRhdGEgPSBjbG9uZShjaGFubmVsLnZhbHVlKQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IGRhdGEucGF5ZXIsICdPbmx5IHBheWVyIGNhbiBzZXQgYXV0aG9yaXplZCBzaWduZXInKQogICAgZGlnIDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czoxMjYKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSBkYXRhLnBheWVyLCAnT25seSBwYXllciBjYW4gc2V0IGF1dGhvcml6ZWQgc2lnbmVyJykKICAgID09CiAgICBhc3NlcnQgLy8gT25seSBwYXllciBjYW4gc2V0IGF1dGhvcml6ZWQgc2lnbmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjEyNwogICAgLy8gYXNzZXJ0KGF1dGhvcml6ZWRTaWduZXJQdWJsaWNLZXkubGVuZ3RoID4gMCwgJ0F1dGhvcml6ZWQgc2lnbmVyIHB1YmtleSByZXF1aXJlZCcpCiAgICBkdXAKICAgIGxlbgogICAgYXNzZXJ0IC8vIEF1dGhvcml6ZWQgc2lnbmVyIHB1YmtleSByZXF1aXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czoxMjkKICAgIC8vIGNvbnN0IGF1dGhvcml6ZWRTaWduZXJIYXNoID0gc2hhNTEyXzI1NihhdXRob3JpemVkU2lnbmVyUHVibGljS2V5KQogICAgZHVwCiAgICBzaGE1MTJfMjU2CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjEzMAogICAgLy8gdGhpcy5zZXRBdXRob3JpemVkU2lnbmVyUHVibGljS2V5SWZQcm92aWRlZChjaGFubmVsSWQsIGF1dGhvcml6ZWRTaWduZXJQdWJsaWNLZXksIGF1dGhvcml6ZWRTaWduZXJIYXNoKQogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIGNhbGxzdWIgc2V0QXV0aG9yaXplZFNpZ25lclB1YmxpY0tleUlmUHJvdmlkZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTMyCiAgICAvLyBkYXRhLmF1dGhvcml6ZWRTaWduZXIgPSBhdXRob3JpemVkU2lnbmVySGFzaAogICAgYnl0ZWNfMiAvLyAweDAwMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDMKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTMzCiAgICAvLyBjaGFubmVsLnZhbHVlID0gY2xvbmUoZGF0YSkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTIxCiAgICAvLyBzZXRBdXRob3JpemVkU2lnbmVyUHVibGljS2V5KGNoYW5uZWxJZDogYnl0ZXMsIGF1dGhvcml6ZWRTaWduZXJQdWJsaWNLZXk6IGJ5dGVzKTogdm9pZCB7CiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czo6RXNjcm93U2Vzc2lvblZhdWx0TWFuYWdlci51cGRhdGVWb3VjaGVyW3JvdXRpbmddKCkgLT4gdm9pZDoKdXBkYXRlVm91Y2hlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTM5CiAgICAvLyB1cGRhdGVWb3VjaGVyKGNoYW5uZWxJZDogYnl0ZXMsIGN1bXVsYXRpdmVBbW91bnQ6IHVpbnQ2NCwgc2lnbmF0dXJlOiBieXRlcyk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18xIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGR1cAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18xIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTQxCiAgICAvLyBhc3NlcnQoY2hhbm5lbC5leGlzdHMsICdDaGFubmVsIGRvZXMgbm90IGV4aXN0JykKICAgIGRpZyAzCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBDaGFubmVsIGRvZXMgbm90IGV4aXN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjE0NQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IGRhdGEucGF5ZXIsICdPbmx5IHBheWVyIGNhbiB1cGRhdGUgdm91Y2hlcicpCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgNAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGJveF9leHRyYWN0CiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgcGF5ZXIgY2FuIHVwZGF0ZSB2b3VjaGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjE0NgogICAgLy8gYXNzZXJ0KGN1bXVsYXRpdmVBbW91bnQgPj0gZGF0YS5sYXN0U2V0dGxlZCwgJ1ZvdWNoZXIgYmVsb3cgc2V0dGxlZCBhbW91bnQnKQogICAgZGlnIDMKICAgIHB1c2hpbnQgNzQgLy8gNzQKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDIKICAgIDw9CiAgICBhc3NlcnQgLy8gVm91Y2hlciBiZWxvdyBzZXR0bGVkIGFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czoxNDcKICAgIC8vIGFzc2VydChjdW11bGF0aXZlQW1vdW50ID4gZGF0YS5sYXRlc3RWb3VjaGVyQW1vdW50LCAnVm91Y2hlciBub3QgaW5jcmVhc2luZycpCiAgICBkaWcgMwogICAgcHVzaGludCA4MiAvLyA4MgogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMgogICAgPAogICAgYXNzZXJ0IC8vIFZvdWNoZXIgbm90IGluY3JlYXNpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTQ4CiAgICAvLyBhc3NlcnQoY3VtdWxhdGl2ZUFtb3VudCA8PSBkYXRhLnRvdGFsRGVwb3NpdCwgJ1ZvdWNoZXIgZXhjZWVkcyBkZXBvc2l0JykKICAgIGRpZyAzCiAgICBwdXNoaW50IDY2IC8vIDY2CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAyCiAgICA+PQogICAgYXNzZXJ0IC8vIFZvdWNoZXIgZXhjZWVkcyBkZXBvc2l0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjE1MAogICAgLy8gdGhpcy52ZXJpZnlTZXR0bGVTaWduYXR1cmUoY2hhbm5lbElkLCBjdW11bGF0aXZlQW1vdW50LCBzaWduYXR1cmUpCiAgICBkaWcgMwogICAgY292ZXIgMgogICAgY2FsbHN1YiBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjpFc2Nyb3dTZXNzaW9uVmF1bHRNYW5hZ2VyLnZlcmlmeVNldHRsZVNpZ25hdHVyZQogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czoxNTItMTUzCiAgICAvLyBkYXRhLmxhdGVzdFZvdWNoZXJBbW91bnQgPSBjdW11bGF0aXZlQW1vdW50CiAgICAvLyBjaGFubmVsLnZhbHVlID0gY2xvbmUoZGF0YSkKICAgIHB1c2hpbnQgODIgLy8gODIKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjEzOQogICAgLy8gdXBkYXRlVm91Y2hlcihjaGFubmVsSWQ6IGJ5dGVzLCBjdW11bGF0aXZlQW1vdW50OiB1aW50NjQsIHNpZ25hdHVyZTogYnl0ZXMpOiB2b2lkIHsKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjpFc2Nyb3dTZXNzaW9uVmF1bHRNYW5hZ2VyLnNldHRsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldHRsZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTYwCiAgICAvLyBzZXR0bGUoY2hhbm5lbElkOiBieXRlcywgY3VtdWxhdGl2ZUFtb3VudDogdWludDY0LCBzaWduYXR1cmU6IGJ5dGVzKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGR1cAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18xIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTYyCiAgICAvLyBhc3NlcnQoY2hhbm5lbC5leGlzdHMsICdDaGFubmVsIGRvZXMgbm90IGV4aXN0JykKICAgIGRpZyAzCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBDaGFubmVsIGRvZXMgbm90IGV4aXN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjE2NAogICAgLy8gY29uc3QgZGF0YSA9IGNsb25lKGNoYW5uZWwudmFsdWUpCiAgICBkaWcgMwogICAgYm94X2dldAogICAgcG9wCiAgICBjb3ZlciAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjE2NgogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IGRhdGEucGF5ZWUsICdPbmx5IHBheWVlIGNhbiBzZXR0bGUnKQogICAgdHhuIFNlbmRlcgogICAgZGlnIDUKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGR1cAogICAgYm94X2V4dHJhY3QKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgcGF5ZWUgY2FuIHNldHRsZQogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czoxNjcKICAgIC8vIGFzc2VydChjdW11bGF0aXZlQW1vdW50ID4gZGF0YS5sYXN0U2V0dGxlZCwgJ05vdGhpbmcgbmV3IHRvIHNldHRsZScpCiAgICBkaWcgNQogICAgcHVzaGludCA3NCAvLyA3NAogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMwogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBOb3RoaW5nIG5ldyB0byBzZXR0bGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTY4CiAgICAvLyBhc3NlcnQoY3VtdWxhdGl2ZUFtb3VudCA8PSBkYXRhLnRvdGFsRGVwb3NpdCwgJ1ZvdWNoZXIgZXhjZWVkcyBkZXBvc2l0JykKICAgIGRpZyA2CiAgICBwdXNoaW50IDY2IC8vIDY2CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyA0CiAgICA+PQogICAgYXNzZXJ0IC8vIFZvdWNoZXIgZXhjZWVkcyBkZXBvc2l0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjE3MAogICAgLy8gdGhpcy52ZXJpZnlTZXR0bGVTaWduYXR1cmUoY2hhbm5lbElkLCBjdW11bGF0aXZlQW1vdW50LCBzaWduYXR1cmUpCiAgICB1bmNvdmVyIDYKICAgIGRpZyA0CiAgICB1bmNvdmVyIDQKICAgIGNhbGxzdWIgc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czo6RXNjcm93U2Vzc2lvblZhdWx0TWFuYWdlci52ZXJpZnlTZXR0bGVTaWduYXR1cmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTcyCiAgICAvLyBjb25zdCBwYXlvdXQ6IHVpbnQ2NCA9IGN1bXVsYXRpdmVBbW91bnQgLSBkYXRhLmxhc3RTZXR0bGVkCiAgICBkaWcgMgogICAgc3dhcAogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czoxNzQtMTc4CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IEFzc2V0KFVTRENfQVNTRVRfSUQpLAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBkYXRhLnBheWVlLAogICAgLy8gICBhc3NldEFtb3VudDogcGF5b3V0LAogICAgLy8gfSkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTc1CiAgICAvLyB4ZmVyQXNzZXQ6IEFzc2V0KFVTRENfQVNTRVRfSUQpLAogICAgaW50YyA0IC8vIFRNUExfVVNEQ19BU1NFVF9JRAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czoxNzQtMTc4CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IEFzc2V0KFVTRENfQVNTRVRfSUQpLAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBkYXRhLnBheWVlLAogICAgLy8gICBhc3NldEFtb3VudDogcGF5b3V0LAogICAgLy8gfSkuc3VibWl0KCkKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjE4MAogICAgLy8gZGF0YS5sYXN0U2V0dGxlZCA9IGN1bXVsYXRpdmVBbW91bnQKICAgIGNvdmVyIDIKICAgIHJlcGxhY2UyIDc0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTgxCiAgICAvLyBpZiAoY3VtdWxhdGl2ZUFtb3VudCA+IGRhdGEubGF0ZXN0Vm91Y2hlckFtb3VudCkgewogICAgcHVzaGludCA4MiAvLyA4MgogICAgZXh0cmFjdF91aW50NjQKICAgID4KICAgIGJ6IHNldHRsZV9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTgyCiAgICAvLyBkYXRhLmxhdGVzdFZvdWNoZXJBbW91bnQgPSBjdW11bGF0aXZlQW1vdW50CiAgICBkaWcgMQogICAgcmVwbGFjZTIgODIKCnNldHRsZV9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjE4NAogICAgLy8gY2hhbm5lbC52YWx1ZSA9IGNsb25lKGRhdGEpCiAgICBkaWcgMgogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTYwCiAgICAvLyBzZXR0bGUoY2hhbm5lbElkOiBieXRlcywgY3VtdWxhdGl2ZUFtb3VudDogdWludDY0LCBzaWduYXR1cmU6IGJ5dGVzKTogdm9pZCB7CiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czo6RXNjcm93U2Vzc2lvblZhdWx0TWFuYWdlci5zZXR0bGVMYXRlc3Rbcm91dGluZ10oKSAtPiB2b2lkOgpzZXR0bGVMYXRlc3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gc2V0dGxlTGF0ZXN0KGNoYW5uZWxJZDogYnl0ZXMpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjE5MgogICAgLy8gYXNzZXJ0KGNoYW5uZWwuZXhpc3RzLCAnQ2hhbm5lbCBkb2VzIG5vdCBleGlzdCcpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIENoYW5uZWwgZG9lcyBub3QgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTk2CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gZGF0YS5wYXllZSwgJ09ubHkgcGF5ZWUgY2FuIHNldHRsZScpCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgcHVzaGludCAzMiAvLyAzMgogICAgZHVwCiAgICBib3hfZXh0cmFjdAogICAgc3dhcAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gT25seSBwYXllZSBjYW4gc2V0dGxlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjE5NwogICAgLy8gYXNzZXJ0KGRhdGEubGF0ZXN0Vm91Y2hlckFtb3VudCA+IGRhdGEubGFzdFNldHRsZWQsICdOb3RoaW5nIG5ldyB0byBzZXR0bGUnKQogICAgZGlnIDEKICAgIHB1c2hpbnQgODIgLy8gODIKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgZHVwCiAgICBidG9pCiAgICBkaWcgMwogICAgcHVzaGludCA3NCAvLyA3NAogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkdXAyCiAgICA+CiAgICBhc3NlcnQgLy8gTm90aGluZyBuZXcgdG8gc2V0dGxlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjE5OQogICAgLy8gY29uc3QgcGF5b3V0OiB1aW50NjQgPSBkYXRhLmxhdGVzdFZvdWNoZXJBbW91bnQgLSBkYXRhLmxhc3RTZXR0bGVkCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjIwMS0yMDUKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHhmZXJBc3NldDogQXNzZXQoVVNEQ19BU1NFVF9JRCksCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IGRhdGEucGF5ZWUsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBwYXlvdXQsCiAgICAvLyB9KS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czoyMDIKICAgIC8vIHhmZXJBc3NldDogQXNzZXQoVVNEQ19BU1NFVF9JRCksCiAgICBpbnRjIDQgLy8gVE1QTF9VU0RDX0FTU0VUX0lECiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MjAxLTIwNQogICAgLy8gaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgeGZlckFzc2V0OiBBc3NldChVU0RDX0FTU0VUX0lEKSwKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogZGF0YS5wYXllZSwKICAgIC8vICAgYXNzZXRBbW91bnQ6IHBheW91dCwKICAgIC8vIH0pLnN1Ym1pdCgpCiAgICBwdXNoaW50IDQgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czoyMDctMjA4CiAgICAvLyBkYXRhLmxhc3RTZXR0bGVkID0gZGF0YS5sYXRlc3RWb3VjaGVyQW1vdW50CiAgICAvLyBjaGFubmVsLnZhbHVlID0gY2xvbmUoZGF0YSkKICAgIHB1c2hpbnQgNzQgLy8gNzQKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gc2V0dGxlTGF0ZXN0KGNoYW5uZWxJZDogYnl0ZXMpOiB2b2lkIHsKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjpFc2Nyb3dTZXNzaW9uVmF1bHRNYW5hZ2VyLmNsb3NlW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xvc2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjIxNQogICAgLy8gY2xvc2UoY2hhbm5lbElkOiBieXRlcyk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18xIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MjE3CiAgICAvLyBhc3NlcnQoY2hhbm5lbC5leGlzdHMsICdDaGFubmVsIGRvZXMgbm90IGV4aXN0JykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQ2hhbm5lbCBkb2VzIG5vdCBleGlzdAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czoyMTkKICAgIC8vIGNvbnN0IGRhdGEgPSBjbG9uZShjaGFubmVsLnZhbHVlKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MjIxCiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gZGF0YS5wYXllZSwgJ09ubHkgcGF5ZWUgY2FuIGNsb3NlJykKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBkdXAKICAgIGJveF9leHRyYWN0CiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgcGF5ZWUgY2FuIGNsb3NlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjIyMwogICAgLy8gdGhpcy5maW5hbGl6ZUNoYW5uZWwoY2hhbm5lbElkLCBkYXRhKQogICAgc3dhcAogICAgY2FsbHN1YiBmaW5hbGl6ZUNoYW5uZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czoyMTUKICAgIC8vIGNsb3NlKGNoYW5uZWxJZDogYnl0ZXMpOiB2b2lkIHsKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjpFc2Nyb3dTZXNzaW9uVmF1bHRNYW5hZ2VyLnJlcXVlc3RDbG9zZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlcXVlc3RDbG9zZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MjI5CiAgICAvLyByZXF1ZXN0Q2xvc2UoY2hhbm5lbElkOiBieXRlcyk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18xIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MjMxCiAgICAvLyBhc3NlcnQoY2hhbm5lbC5leGlzdHMsICdDaGFubmVsIGRvZXMgbm90IGV4aXN0JykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQ2hhbm5lbCBkb2VzIG5vdCBleGlzdAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czoyMzQKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSBkYXRhLnBheWVyLCAnT25seSBwYXllciBjYW4gcmVxdWVzdCBjbG9zZScpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjIzMy0yMzQKICAgIC8vIGNvbnN0IGRhdGEgPSBjbG9uZShjaGFubmVsLnZhbHVlKQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IGRhdGEucGF5ZXIsICdPbmx5IHBheWVyIGNhbiByZXF1ZXN0IGNsb3NlJykKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGludCAzMiAvLyAzMgogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MjM0CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gZGF0YS5wYXllciwgJ09ubHkgcGF5ZXIgY2FuIHJlcXVlc3QgY2xvc2UnKQogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IHBheWVyIGNhbiByZXF1ZXN0IGNsb3NlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjIzNgogICAgLy8gZGF0YS5jbG9zZVJlcXVlc3RlZEF0ID0gb3AuR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czoyMzYtMjM3CiAgICAvLyBkYXRhLmNsb3NlUmVxdWVzdGVkQXQgPSBvcC5HbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICAvLyBjaGFubmVsLnZhbHVlID0gY2xvbmUoZGF0YSkKICAgIHB1c2hpbnQgMTA2IC8vIDEwNgogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MjI5CiAgICAvLyByZXF1ZXN0Q2xvc2UoY2hhbm5lbElkOiBieXRlcyk6IHZvaWQgewogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6OkVzY3Jvd1Nlc3Npb25WYXVsdE1hbmFnZXIud2l0aGRyYXdbcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoZHJhdzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MjQ0CiAgICAvLyB3aXRoZHJhdyhjaGFubmVsSWQ6IGJ5dGVzKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czoyNDYKICAgIC8vIGFzc2VydChjaGFubmVsLmV4aXN0cywgJ0NoYW5uZWwgZG9lcyBub3QgZXhpc3QnKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBDaGFubmVsIGRvZXMgbm90IGV4aXN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjI0OAogICAgLy8gY29uc3QgZGF0YSA9IGNsb25lKGNoYW5uZWwudmFsdWUpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czoyNDkKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSBkYXRhLnBheWVyLCAnT25seSBwYXllciBjYW4gd2l0aGRyYXcnKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czoyNDgtMjQ5CiAgICAvLyBjb25zdCBkYXRhID0gY2xvbmUoY2hhbm5lbC52YWx1ZSkKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSBkYXRhLnBheWVyLCAnT25seSBwYXllciBjYW4gd2l0aGRyYXcnKQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czoyNDkKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSBkYXRhLnBheWVyLCAnT25seSBwYXllciBjYW4gd2l0aGRyYXcnKQogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IHBheWVyIGNhbiB3aXRoZHJhdwogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czoyNTAKICAgIC8vIGFzc2VydChkYXRhLmNsb3NlUmVxdWVzdGVkQXQgPiAwLCAnQ2xvc2Ugbm90IHJlcXVlc3RlZCcpCiAgICBkdXAKICAgIHB1c2hpbnQgMTA2IC8vIDEwNgogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkdXAKICAgIGFzc2VydCAvLyBDbG9zZSBub3QgcmVxdWVzdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjI1MgogICAgLy8gb3AuR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA+PSBkYXRhLmNsb3NlUmVxdWVzdGVkQXQgKyBDTE9TRV9HUkFDRV9QRVJJT0RfU0VDT05EUywKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIHN3YXAKICAgIHB1c2hpbnQgODg4IC8vIDg4OAogICAgKwogICAgPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MjUxLTI1NAogICAgLy8gYXNzZXJ0KAogICAgLy8gICBvcC5HbG9iYWwubGF0ZXN0VGltZXN0YW1wID49IGRhdGEuY2xvc2VSZXF1ZXN0ZWRBdCArIENMT1NFX0dSQUNFX1BFUklPRF9TRUNPTkRTLAogICAgLy8gICAnQ2xvc2UgZ3JhY2UgcGVyaW9kIG5vdCBlbGFwc2VkJywKICAgIC8vICkKICAgIGFzc2VydCAvLyBDbG9zZSBncmFjZSBwZXJpb2Qgbm90IGVsYXBzZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MjU2CiAgICAvLyB0aGlzLmZpbmFsaXplQ2hhbm5lbChjaGFubmVsSWQsIGRhdGEpCiAgICBzd2FwCiAgICBjYWxsc3ViIGZpbmFsaXplQ2hhbm5lbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjI0NAogICAgLy8gd2l0aGRyYXcoY2hhbm5lbElkOiBieXRlcyk6IHZvaWQgewogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6OkVzY3Jvd1Nlc3Npb25WYXVsdE1hbmFnZXIuZnVuZE1iclBvb2xbcm91dGluZ10oKSAtPiB2b2lkOgpmdW5kTWJyUG9vbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MjYyCiAgICAvLyBmdW5kTWJyUG9vbChwYXltZW50OiB7IHJlY2VpdmVyOiBBY2NvdW50IH0pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBPYmplY3RBQUNGODUxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czoyNjMKICAgIC8vIGFzc2VydChwYXltZW50LnJlY2VpdmVyID09PSBvcC5HbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgJ1BheW1lbnQgbXVzdCBiZSB0byBjb250cmFjdCcpCiAgICBleHRyYWN0IDAgMzIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIFBheW1lbnQgbXVzdCBiZSB0byBjb250cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czoyNjIKICAgIC8vIGZ1bmRNYnJQb29sKHBheW1lbnQ6IHsgcmVjZWl2ZXI6IEFjY291bnQgfSk6IHZvaWQgewogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6OkVzY3Jvd1Nlc3Npb25WYXVsdE1hbmFnZXIub3B0SW5Vc2RjW3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0SW5Vc2RjOgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czoyNzEKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSBvcC5HbG9iYWwuY3JlYXRvckFkZHJlc3MsICdPbmx5IGNyZWF0b3IgY2FuIG9wdCBpbiBVU0RDJykKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IGNyZWF0b3IgY2FuIG9wdCBpbiBVU0RDCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjI3My0yNzcKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHhmZXJBc3NldDogQXNzZXQoVVNEQ19BU1NFVF9JRCksCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IG9wLkdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICBhc3NldEFtb3VudDogMCwKICAgIC8vIH0pLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjI3NAogICAgLy8geGZlckFzc2V0OiBBc3NldChVU0RDX0FTU0VUX0lEKSwKICAgIGludGMgNCAvLyBUTVBMX1VTRENfQVNTRVRfSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6Mjc1CiAgICAvLyBhc3NldFJlY2VpdmVyOiBvcC5HbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjI3NgogICAgLy8gYXNzZXRBbW91bnQ6IDAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czoyNzMtMjc3CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IEFzc2V0KFVTRENfQVNTRVRfSUQpLAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBvcC5HbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyB9KS5zdWJtaXQoKQogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MjcwCiAgICAvLyBvcHRJblVzZGMoKTogdm9pZCB7CiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czo6RXNjcm93U2Vzc2lvblZhdWx0TWFuYWdlci5nZXRTZXNzaW9uU3RhdGljRGF0YVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldFNlc3Npb25TdGF0aWNEYXRhOgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czoyODQKICAgIC8vIGdldFNlc3Npb25TdGF0aWNEYXRhKGNoYW5uZWxJZDogYnl0ZXMpOiBbdWludDY0LCB1aW50NjRdIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjI4NgogICAgLy8gYXNzZXJ0KGNoYW5uZWwuZXhpc3RzLCAnQ2hhbm5lbCBkb2VzIG5vdCBleGlzdCcpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIENoYW5uZWwgZG9lcyBub3QgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6Mjg4LTI4OQogICAgLy8gY29uc3QgZGF0YSA9IGNsb25lKGNoYW5uZWwudmFsdWUpCiAgICAvLyByZXR1cm4gW2RhdGEuc3RhcnRSb3VuZCwgZGF0YS5zdGFydFRpbWVzdGFtcF0KICAgIGR1cAogICAgcHVzaGludCA5MCAvLyA5MAogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjI4OQogICAgLy8gcmV0dXJuIFtkYXRhLnN0YXJ0Um91bmQsIGRhdGEuc3RhcnRUaW1lc3RhbXBdCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjI4OC0yODkKICAgIC8vIGNvbnN0IGRhdGEgPSBjbG9uZShjaGFubmVsLnZhbHVlKQogICAgLy8gcmV0dXJuIFtkYXRhLnN0YXJ0Um91bmQsIGRhdGEuc3RhcnRUaW1lc3RhbXBdCiAgICBzd2FwCiAgICBwdXNoaW50IDk4IC8vIDk4CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6Mjg5CiAgICAvLyByZXR1cm4gW2RhdGEuc3RhcnRSb3VuZCwgZGF0YS5zdGFydFRpbWVzdGFtcF0KICAgIGJ0b2kKICAgIHN3YXAKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czoyODQKICAgIC8vIGdldFNlc3Npb25TdGF0aWNEYXRhKGNoYW5uZWxJZDogYnl0ZXMpOiBbdWludDY0LCB1aW50NjRdIHsKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjpFc2Nyb3dTZXNzaW9uVmF1bHRNYW5hZ2VyLmdldFNlc3Npb25EeW5hbWljRGF0YVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldFNlc3Npb25EeW5hbWljRGF0YToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6Mjk2CiAgICAvLyBnZXRTZXNzaW9uRHluYW1pY0RhdGEoY2hhbm5lbElkOiBieXRlcyk6IFt1aW50NjQsIHVpbnQ2NCwgdWludDY0XSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czoyOTgKICAgIC8vIGFzc2VydChjaGFubmVsLmV4aXN0cywgJ0NoYW5uZWwgZG9lcyBub3QgZXhpc3QnKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBDaGFubmVsIGRvZXMgbm90IGV4aXN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjMwMC0zMDEKICAgIC8vIGNvbnN0IGRhdGEgPSBjbG9uZShjaGFubmVsLnZhbHVlKQogICAgLy8gcmV0dXJuIFtkYXRhLnRvdGFsRGVwb3NpdCwgZGF0YS5sYXN0U2V0dGxlZCwgZGF0YS5sYXRlc3RWb3VjaGVyQW1vdW50XQogICAgZHVwCiAgICBwdXNoaW50IDY2IC8vIDY2CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MzAxCiAgICAvLyByZXR1cm4gW2RhdGEudG90YWxEZXBvc2l0LCBkYXRhLmxhc3RTZXR0bGVkLCBkYXRhLmxhdGVzdFZvdWNoZXJBbW91bnRdCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjMwMC0zMDEKICAgIC8vIGNvbnN0IGRhdGEgPSBjbG9uZShjaGFubmVsLnZhbHVlKQogICAgLy8gcmV0dXJuIFtkYXRhLnRvdGFsRGVwb3NpdCwgZGF0YS5sYXN0U2V0dGxlZCwgZGF0YS5sYXRlc3RWb3VjaGVyQW1vdW50XQogICAgZGlnIDEKICAgIHB1c2hpbnQgNzQgLy8gNzQKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czozMDEKICAgIC8vIHJldHVybiBbZGF0YS50b3RhbERlcG9zaXQsIGRhdGEubGFzdFNldHRsZWQsIGRhdGEubGF0ZXN0Vm91Y2hlckFtb3VudF0KICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MzAwLTMwMQogICAgLy8gY29uc3QgZGF0YSA9IGNsb25lKGNoYW5uZWwudmFsdWUpCiAgICAvLyByZXR1cm4gW2RhdGEudG90YWxEZXBvc2l0LCBkYXRhLmxhc3RTZXR0bGVkLCBkYXRhLmxhdGVzdFZvdWNoZXJBbW91bnRdCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgODIgLy8gODIKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czozMDEKICAgIC8vIHJldHVybiBbZGF0YS50b3RhbERlcG9zaXQsIGRhdGEubGFzdFNldHRsZWQsIGRhdGEubGF0ZXN0Vm91Y2hlckFtb3VudF0KICAgIGJ0b2kKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czoyOTYKICAgIC8vIGdldFNlc3Npb25EeW5hbWljRGF0YShjaGFubmVsSWQ6IGJ5dGVzKTogW3VpbnQ2NCwgdWludDY0LCB1aW50NjRdIHsKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjpFc2Nyb3dTZXNzaW9uVmF1bHRNYW5hZ2VyLmNvbXB1dGVDaGFubmVsSWRbcm91dGluZ10oKSAtPiB2b2lkOgpjb21wdXRlQ2hhbm5lbElkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czozMDgKICAgIC8vIGNvbXB1dGVDaGFubmVsSWQocGF5ZXI6IEFjY291bnQsIHBheWVlOiBBY2NvdW50LCBhdXRob3JpemVkU2lnbmVyOiBieXRlcywgc2FsdDogYnl0ZXMpOiBieXRlcyB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18xIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MzU1CiAgICAvLyByZXR1cm4gb3Auc2hhMjU2KHBheWVyLmJ5dGVzLmNvbmNhdChwYXllZS5ieXRlcykuY29uY2F0KG9wLml0b2IoVVNEQ19BU1NFVF9JRCkpLmNvbmNhdChzYWx0KS5jb25jYXQoYXV0aG9yaXplZFNpZ25lcikpCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBpbnRjIDQgLy8gVE1QTF9VU0RDX0FTU0VUX0lECiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzaGEyNTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MzA4CiAgICAvLyBjb21wdXRlQ2hhbm5lbElkKHBheWVyOiBBY2NvdW50LCBwYXllZTogQWNjb3VudCwgYXV0aG9yaXplZFNpZ25lcjogYnl0ZXMsIHNhbHQ6IGJ5dGVzKTogYnl0ZXMgewogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjpFc2Nyb3dTZXNzaW9uVmF1bHRNYW5hZ2VyLnNldHRsZU1lc3NhZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgpzZXR0bGVNZXNzYWdlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czozMTUKICAgIC8vIHNldHRsZU1lc3NhZ2UoY2hhbm5lbElkOiBieXRlcywgY3VtdWxhdGl2ZUFtb3VudDogdWludDY0KTogYnl0ZXMgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18xIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MzE2CiAgICAvLyByZXR1cm4gdGhpcy5nZXRTZXR0bGVNZXNzYWdlKGNoYW5uZWxJZCwgY3VtdWxhdGl2ZUFtb3VudCkKICAgIGNhbGxzdWIgZ2V0U2V0dGxlTWVzc2FnZQogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czozMTUKICAgIC8vIHNldHRsZU1lc3NhZ2UoY2hhbm5lbElkOiBieXRlcywgY3VtdWxhdGl2ZUFtb3VudDogdWludDY0KTogYnl0ZXMgewogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjpFc2Nyb3dTZXNzaW9uVmF1bHRNYW5hZ2VyLnZlcmlmeVNldHRsZVNpZ25hdHVyZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeVNldHRsZVNpZ25hdHVyZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MzIzCiAgICAvLyB2ZXJpZnlTZXR0bGVTaWduYXR1cmUoY2hhbm5lbElkOiBieXRlcywgY3VtdWxhdGl2ZUFtb3VudDogdWludDY0LCBzaWduYXR1cmU6IGJ5dGVzKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18xIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIGNhbGxzdWIgc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czo6RXNjcm93U2Vzc2lvblZhdWx0TWFuYWdlci52ZXJpZnlTZXR0bGVTaWduYXR1cmUKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjpFc2Nyb3dTZXNzaW9uVmF1bHRNYW5hZ2VyLmRlcml2ZUNoYW5uZWxJZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmRlcml2ZUNoYW5uZWxJZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MzUyCiAgICAvLyBkZXJpdmVDaGFubmVsSWQocGF5ZXI6IEFjY291bnQsIHBheWVlOiBBY2NvdW50LCBhdXRob3JpemVkU2lnbmVyOiBieXRlcywgc2FsdDogYnl0ZXMpOiBieXRlcyB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18xIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MzU1CiAgICAvLyByZXR1cm4gb3Auc2hhMjU2KHBheWVyLmJ5dGVzLmNvbmNhdChwYXllZS5ieXRlcykuY29uY2F0KG9wLml0b2IoVVNEQ19BU1NFVF9JRCkpLmNvbmNhdChzYWx0KS5jb25jYXQoYXV0aG9yaXplZFNpZ25lcikpCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBpbnRjIDQgLy8gVE1QTF9VU0RDX0FTU0VUX0lECiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzaGEyNTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MzUyCiAgICAvLyBkZXJpdmVDaGFubmVsSWQocGF5ZXI6IEFjY291bnQsIHBheWVlOiBBY2NvdW50LCBhdXRob3JpemVkU2lnbmVyOiBieXRlcywgc2FsdDogYnl0ZXMpOiBieXRlcyB7CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUwMDIwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6OkVzY3Jvd1Nlc3Npb25WYXVsdE1hbmFnZXIudmVyaWZ5U2V0dGxlU2lnbmF0dXJlKGNoYW5uZWxJZDogYnl0ZXMsIGN1bXVsYXRpdmVBbW91bnQ6IHVpbnQ2NCwgc2lnbmF0dXJlOiBieXRlcykgLT4gdm9pZDoKc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czo6RXNjcm93U2Vzc2lvblZhdWx0TWFuYWdlci52ZXJpZnlTZXR0bGVTaWduYXR1cmU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjMyMwogICAgLy8gdmVyaWZ5U2V0dGxlU2lnbmF0dXJlKGNoYW5uZWxJZDogYnl0ZXMsIGN1bXVsYXRpdmVBbW91bnQ6IHVpbnQ2NCwgc2lnbmF0dXJlOiBieXRlcyk6IHZvaWQgewogICAgcHJvdG8gMyAwCiAgICBieXRlY18zIC8vICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjMyNQogICAgLy8gYXNzZXJ0KGNoYW5uZWwuZXhpc3RzLCAnQ2hhbm5lbCBkb2VzIG5vdCBleGlzdCcpCiAgICBmcmFtZV9kaWcgLTMKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIENoYW5uZWwgZG9lcyBub3QgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MzI3CiAgICAvLyBjb25zdCBkYXRhID0gY2xvbmUoY2hhbm5lbC52YWx1ZSkKICAgIGZyYW1lX2RpZyAtMwogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjMyOAogICAgLy8gY29uc3QgbWVzc2FnZSA9IHRoaXMuZ2V0U2V0dGxlTWVzc2FnZShjaGFubmVsSWQsIGN1bXVsYXRpdmVBbW91bnQpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBnZXRTZXR0bGVNZXNzYWdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjUzCiAgICAvLyBhdXRob3JpemVkU2lnbmVyUHVibGljS2V5ID0gQm94TWFwPGJ5dGVzLCBieXRlcz4oeyBrZXlQcmVmaXg6ICdwJyB9KQogICAgcHVzaGJ5dGVzICJwIgogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MzMxCiAgICAvLyBhc3NlcnQoYXV0aG9yaXplZFNpZ25lclB1YmxpY0tleS5leGlzdHMsICdBdXRob3JpemVkIHNpZ25lciBwdWJsaWMga2V5IG5vdCBzZXQgeWV0JykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQXV0aG9yaXplZCBzaWduZXIgcHVibGljIGtleSBub3Qgc2V0IHlldAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czozMzMKICAgIC8vIGNvbnN0IGF1dGhvcml6ZWRTaWduZXIgPSBhdXRob3JpemVkU2lnbmVyUHVibGljS2V5LnZhbHVlCiAgICBib3hfZ2V0CiAgICBwb3AKCnNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6OkVzY3Jvd1Nlc3Npb25WYXVsdE1hbmFnZXIudmVyaWZ5U2V0dGxlU2lnbmF0dXJlX3doaWxlX3RvcEA0OgogICAgcHVzaGludCAyMTEwIC8vIDIxMTAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6OkVzY3Jvd1Nlc3Npb25WYXVsdE1hbmFnZXIudmVyaWZ5U2V0dGxlU2lnbmF0dXJlX2FmdGVyX3doaWxlQDkKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyA0IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgNCAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6OkVzY3Jvd1Nlc3Npb25WYXVsdE1hbmFnZXIudmVyaWZ5U2V0dGxlU2lnbmF0dXJlX3doaWxlX3RvcEA0CgpzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjpFc2Nyb3dTZXNzaW9uVmF1bHRNYW5hZ2VyLnZlcmlmeVNldHRsZVNpZ25hdHVyZV9hZnRlcl93aGlsZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czozMzYKICAgIC8vIGFzc2VydChzaGE1MTJfMjU2KGF1dGhvcml6ZWRTaWduZXIpID09PSBkYXRhLmF1dGhvcml6ZWRTaWduZXIsICdJbnZhbGlkIHNpZ25lciBwdWJrZXknKQogICAgZnJhbWVfZGlnIDMKICAgIHNoYTUxMl8yNTYKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNpZ25lciBwdWJrZXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MzM4CiAgICAvLyBpZiAoc2lnbmF0dXJlLmxlbmd0aCA+IDY0KSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgID4KICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6OkVzY3Jvd1Nlc3Npb25WYXVsdE1hbmFnZXIudmVyaWZ5U2V0dGxlU2lnbmF0dXJlX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czozNDAKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjpFc2Nyb3dTZXNzaW9uVmF1bHRNYW5hZ2VyLnZlcmlmeVNldHRsZVNpZ25hdHVyZV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjM0MwogICAgLy8gYXNzZXJ0KHNpZ25hdHVyZS5sZW5ndGggPT09IDY0LCAnSW52YWxpZCBFZDI1NTE5IHNpZ25hdHVyZSBsZW5ndGgnKQogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBFZDI1NTE5IHNpZ25hdHVyZSBsZW5ndGgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MzQ0CiAgICAvLyBjb25zdCBzaWduYXR1cmVJc1ZhbGlkID0gb3AuZWQyNTUxOXZlcmlmeUJhcmUobWVzc2FnZSwgc2lnbmF0dXJlLCBhdXRob3JpemVkU2lnbmVyKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDMKICAgIGVkMjU1MTl2ZXJpZnlfYmFyZQogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czozNDUKICAgIC8vIGFzc2VydChzaWduYXR1cmVJc1ZhbGlkLCAnSW52YWxpZCBzaWduYXR1cmUnKQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2lnbmF0dXJlCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjpFc2Nyb3dTZXNzaW9uVmF1bHRNYW5hZ2VyLmFwcGx5VG9wVXAoZGF0YTogYnl0ZXMsIGN1bXVsYXRpdmVBbW91bnQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmFwcGx5VG9wVXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjM2NAogICAgLy8gcHJpdmF0ZSBhcHBseVRvcFVwKGRhdGE6IENoYW5uZWxJbmZvLCBjdW11bGF0aXZlQW1vdW50OiBndHhuLkFzc2V0VHJhbnNmZXJUeG4pOiB2b2lkIHsKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czozNjUKICAgIC8vIGFzc2VydChjdW11bGF0aXZlQW1vdW50LnNlbmRlciA9PT0gVHhuLnNlbmRlciwgJ1BheW1lbnQgc2VuZGVyIG1pc21hdGNoJykKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIFBheW1lbnQgc2VuZGVyIG1pc21hdGNoCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjM2NgogICAgLy8gYXNzZXJ0KGN1bXVsYXRpdmVBbW91bnQuYXNzZXRSZWNlaXZlciA9PT0gb3AuR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsICdQYXltZW50IG11c3QgYmUgdG8gY29udHJhY3QnKQogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBQYXltZW50IG11c3QgYmUgdG8gY29udHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MzY3CiAgICAvLyBhc3NlcnQoY3VtdWxhdGl2ZUFtb3VudC54ZmVyQXNzZXQuaWQgPT09IFVTRENfQVNTRVRfSUQsICdQYXltZW50IGFzc2V0IG11c3QgYmUgVVNEQycpCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIFhmZXJBc3NldAogICAgaW50YyA0IC8vIFRNUExfVVNEQ19BU1NFVF9JRAogICAgPT0KICAgIGFzc2VydCAvLyBQYXltZW50IGFzc2V0IG11c3QgYmUgVVNEQwogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czozNjgKICAgIC8vIGFzc2VydChjdW11bGF0aXZlQW1vdW50LmFzc2V0QW1vdW50ID4gMCwgJ0RlcG9zaXQgbXVzdCBiZSA+IDAnKQogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBc3NldEFtb3VudAogICAgZHVwCiAgICBhc3NlcnQgLy8gRGVwb3NpdCBtdXN0IGJlID4gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czozNjkKICAgIC8vIGFzc2VydChjdW11bGF0aXZlQW1vdW50LmFzc2V0U2VuZGVyID09PSBBY2NvdW50KCksICdDbGF3YmFjayB0cmFuc2ZlciBub3QgYWxsb3dlZCcpCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFzc2V0U2VuZGVyCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gQ2xhd2JhY2sgdHJhbnNmZXIgbm90IGFsbG93ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MzcwCiAgICAvLyBhc3NlcnQoY3VtdWxhdGl2ZUFtb3VudC5hc3NldENsb3NlVG8gPT09IEFjY291bnQoKSwgJ0Fzc2V0IGNsb3NlIG5vdCBhbGxvd2VkJykKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQXNzZXRDbG9zZVRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gQXNzZXQgY2xvc2Ugbm90IGFsbG93ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MzcyCiAgICAvLyBkYXRhLnRvdGFsRGVwb3NpdCArPSBjdW11bGF0aXZlQW1vdW50LmFzc2V0QW1vdW50CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNjYgLy8gNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICArCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIHJlcGxhY2UyIDY2CiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjM3NAogICAgLy8gZGF0YS5jbG9zZVJlcXVlc3RlZEF0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgcmVwbGFjZTIgMTA2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTIKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6OkVzY3Jvd1Nlc3Npb25WYXVsdE1hbmFnZXIuZmluYWxpemVDaGFubmVsKGNoYW5uZWxJZDogYnl0ZXMsIGRhdGE6IGJ5dGVzKSAtPiBieXRlczoKZmluYWxpemVDaGFubmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czozNzcKICAgIC8vIHByaXZhdGUgZmluYWxpemVDaGFubmVsKGNoYW5uZWxJZDogYnl0ZXMsIGRhdGE6IENoYW5uZWxJbmZvKTogdm9pZCB7CiAgICBwcm90byAyIDEKICAgIGJ5dGVjXzMgLy8gIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6Mzc4CiAgICAvLyBjb25zdCBwYXllZVBheW91dDogdWludDY0ID0gZGF0YS5sYXRlc3RWb3VjaGVyQW1vdW50IC0gZGF0YS5sYXN0U2V0dGxlZAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDgyIC8vIDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgNzQgLy8gNzQKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6Mzc5CiAgICAvLyBpZiAocGF5ZWVQYXlvdXQgPiAwKSB7CiAgICBieiBmaW5hbGl6ZUNoYW5uZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjM4MC0zODQKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHhmZXJBc3NldDogQXNzZXQoVVNEQ19BU1NFVF9JRCksCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IGRhdGEucGF5ZWUsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBwYXllZVBheW91dCwKICAgIC8vIH0pLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjM4MQogICAgLy8geGZlckFzc2V0OiBBc3NldChVU0RDX0FTU0VUX0lEKSwKICAgIGludGMgNCAvLyBUTVBMX1VTRENfQVNTRVRfSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MzgyCiAgICAvLyBhc3NldFJlY2VpdmVyOiBkYXRhLnBheWVlLAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDMyIDMyCiAgICBmcmFtZV9kaWcgMgogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czozODAtMzg0CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IEFzc2V0KFVTRENfQVNTRVRfSUQpLAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBkYXRhLnBheWVlLAogICAgLy8gICBhc3NldEFtb3VudDogcGF5ZWVQYXlvdXQsCiAgICAvLyB9KS5zdWJtaXQoKQogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKCmZpbmFsaXplQ2hhbm5lbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjM4NwogICAgLy8gY29uc3QgcGF5ZXJSZWZ1bmQ6IHVpbnQ2NCA9IGRhdGEudG90YWxEZXBvc2l0IC0gZGF0YS5sYXRlc3RWb3VjaGVyQW1vdW50CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgNjYgLy8gNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMQogICAgLQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6Mzg4CiAgICAvLyBpZiAocGF5ZXJSZWZ1bmQgPiAwKSB7CiAgICBieiBmaW5hbGl6ZUNoYW5uZWxfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjM4OS0zOTMKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHhmZXJBc3NldDogQXNzZXQoVVNEQ19BU1NFVF9JRCksCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IGRhdGEucGF5ZXIsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBwYXllclJlZnVuZCwKICAgIC8vIH0pLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjM5MAogICAgLy8geGZlckFzc2V0OiBBc3NldChVU0RDX0FTU0VUX0lEKSwKICAgIGludGMgNCAvLyBUTVBMX1VTRENfQVNTRVRfSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MzkxCiAgICAvLyBhc3NldFJlY2VpdmVyOiBkYXRhLnBheWVyLAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDAgMzIKICAgIGZyYW1lX2RpZyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjM4OS0zOTMKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHhmZXJBc3NldDogQXNzZXQoVVNEQ19BU1NFVF9JRCksCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IGRhdGEucGF5ZXIsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBwYXllclJlZnVuZCwKICAgIC8vIH0pLnN1Ym1pdCgpCiAgICBwdXNoaW50IDQgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAoKZmluYWxpemVDaGFubmVsX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6Mzk2CiAgICAvLyB0aGlzLmNoYW5uZWxzKGNoYW5uZWxJZCkuZGVsZXRlKCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czo6RXNjcm93U2Vzc2lvblZhdWx0TWFuYWdlci5zZXRBdXRob3JpemVkU2lnbmVyUHVibGljS2V5SWZQcm92aWRlZChjaGFubmVsSWQ6IGJ5dGVzLCBhdXRob3JpemVkU2lnbmVyUHVibGljS2V5OiBieXRlcywgZXhwZWN0ZWRBdXRob3JpemVkU2lnbmVySGFzaDogYnl0ZXMpIC0+IHZvaWQ6CnNldEF1dGhvcml6ZWRTaWduZXJQdWJsaWNLZXlJZlByb3ZpZGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czozOTktNDAzCiAgICAvLyBwcml2YXRlIHNldEF1dGhvcml6ZWRTaWduZXJQdWJsaWNLZXlJZlByb3ZpZGVkKAogICAgLy8gICBjaGFubmVsSWQ6IGJ5dGVzLAogICAgLy8gICBhdXRob3JpemVkU2lnbmVyUHVibGljS2V5OiBieXRlcywKICAgIC8vICAgZXhwZWN0ZWRBdXRob3JpemVkU2lnbmVySGFzaDogYnl0ZXMsCiAgICAvLyApOiB2b2lkIHsKICAgIHByb3RvIDMgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czo0MDQKICAgIC8vIGlmIChhdXRob3JpemVkU2lnbmVyUHVibGljS2V5Lmxlbmd0aCA+IDApIHsKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBieiBzZXRBdXRob3JpemVkU2lnbmVyUHVibGljS2V5SWZQcm92aWRlZF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6NDA1CiAgICAvLyBhc3NlcnQoc2hhNTEyXzI1NihhdXRob3JpemVkU2lnbmVyUHVibGljS2V5KSA9PT0gZXhwZWN0ZWRBdXRob3JpemVkU2lnbmVySGFzaCwgJ0F1dGhvcml6ZWQgc2lnbmVyIGhhc2ggbWlzbWF0Y2gnKQogICAgZnJhbWVfZGlnIC0yCiAgICBzaGE1MTJfMjU2CiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBhc3NlcnQgLy8gQXV0aG9yaXplZCBzaWduZXIgaGFzaCBtaXNtYXRjaAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czo1MwogICAgLy8gYXV0aG9yaXplZFNpZ25lclB1YmxpY0tleSA9IEJveE1hcDxieXRlcywgYnl0ZXM+KHsga2V5UHJlZml4OiAncCcgfSkKICAgIHB1c2hieXRlcyAicCIKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjQwNwogICAgLy8gYXV0aG9yaXplZFNpZ25lcktleS52YWx1ZSA9IGF1dGhvcml6ZWRTaWduZXJQdWJsaWNLZXkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9wdXQKCnNldEF1dGhvcml6ZWRTaWduZXJQdWJsaWNLZXlJZlByb3ZpZGVkX2FmdGVyX2lmX2Vsc2VAMjoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6OkVzY3Jvd1Nlc3Npb25WYXVsdE1hbmFnZXIuZ2V0U2V0dGxlTWVzc2FnZShjaGFubmVsSWQ6IGJ5dGVzLCBjdW11bGF0aXZlQW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRTZXR0bGVNZXNzYWdlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czo0MTEKICAgIC8vIHByaXZhdGUgZ2V0U2V0dGxlTWVzc2FnZShjaGFubmVsSWQ6IGJ5dGVzLCBjdW11bGF0aXZlQW1vdW50OiB1aW50NjQpOiBieXRlcyB7CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6NDEzCiAgICAvLyAuaXRvYihvcC5HbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQuaWQpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6NDEyLTQxMwogICAgLy8gcmV0dXJuIG9wCiAgICAvLyAgIC5pdG9iKG9wLkdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZC5pZCkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6NDEyLTQxNAogICAgLy8gcmV0dXJuIG9wCiAgICAvLyAgIC5pdG9iKG9wLkdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZC5pZCkKICAgIC8vICAgLmNvbmNhdChjaGFubmVsSWQpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czo0MTUKICAgIC8vIC5jb25jYXQob3AuaXRvYihjdW11bGF0aXZlQW1vdW50KSkKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X21hbmFnZXIvY29udHJhY3QuYWxnby50czo0MTItNDE1CiAgICAvLyByZXR1cm4gb3AKICAgIC8vICAgLml0b2Iob3AuR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkLmlkKQogICAgLy8gICAuY29uY2F0KGNoYW5uZWxJZCkKICAgIC8vICAgLmNvbmNhdChvcC5pdG9iKGN1bXVsYXRpdmVBbW91bnQpKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjQxNgogICAgLy8gLmNvbmNhdChCeXRlcygnc2V0dGxlJykpCiAgICBwdXNoYnl0ZXMgInNldHRsZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6NDEyLTQxNgogICAgLy8gcmV0dXJuIG9wCiAgICAvLyAgIC5pdG9iKG9wLkdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZC5pZCkKICAgIC8vICAgLmNvbmNhdChjaGFubmVsSWQpCiAgICAvLyAgIC5jb25jYXQob3AuaXRvYihjdW11bGF0aXZlQW1vdW50KSkKICAgIC8vICAgLmNvbmNhdChCeXRlcygnc2V0dGxlJykpCiAgICBjb25jYXQKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAFAAIBCAAmBQYVH3x1ACAEFR98dQIAIAADBoEBMRtBAIYxGRREMRhEghEESNU+MgS9z6xYBEsdu2cEqY2C2gT3343iBG6HJ4kE6Grp6QQ0aFBQBFkF1PQEqhTE+QR+P0poBKhwSQMEHpwAkASMTPz3BGcg2P8EJwSSiQQr9gngNhoAjhEACwD/ATkBlAH8ApQC4wMNAzUDcAOCA54DygQDBEkEcwShADEZFDEYFBBEJEM2GgFHAhWBIBJEMRYkCUlOAjgQgQQSRDYaAkkiWSMISwEVEkRXAgA2GgNJIlkjCEsBFRJEVwIASU4ENhoESSJZIwhLARUSRFcCAE4ESQNOBTEATwNQIQQWUE8CUExQAUlOA71FAUAASDIGMgcxAEsIUCpLB1BMgAIAclAiFkxLAVBLAVBLAVBPBBZQTwMWUExQTFBLA0lOAk8ESweIBVRPAogEqksBvEi/KEsBULAkQ0sCSb5EMQBLAiKBILoSREsBgSBJuksIEkRJgUBZSwEVSwJOAlJXAgBLB0sBEkRLAk8FTwKIBQxPAogEYksBvEi/Qv+1NhoBSSJZIwhLARUSRFcCADEWJAlJOBCBBBJESwG9RQFESwG+SEwxAEsDIoEguhJEiAQnSwG8SL8kQzYaAUkiWSMISwEVEkRXAgA2GgJJIlkjCEsBFRJEVwIASwG9RQFESwG+SE4CMQBLAiKBILoSREkVREkDSwJPAksCiASBKkxQSwKBQFlPAyJPAlhMUEsBvEi/JEM2GgFJIlkjCEsBFRJEVwIANhoCSRUlEkRJFzYaA0kiWSMISwEVEkRXAgBLA71FAUQxAEsEIoEguhJESwOBSiW6F0sCDkRLA4FSJboXSwIMREsDgUIluhdLAg9ESwNOAogC8YFSTLskQzYaAUkiWSMISwEVEkRXAgBJNhoCSU4CSRUlEkRJFzYaA0kiWSMISwEVEkRXAgBLA71FAURLA75ITgMxAEsFgSBJukxLARJESwWBSiW6F0sDSwENREsGgUIluhdLBA9ETwZLBE8EiAKDSwJMCbEhBLIRshKyFIEEshAisgGzTgJcSklOAoFSWw1BAARLAVxSSwJJvEhMvyRDNhoBSSJZIwhLARUSRFcCAEm9RQFEMQBLAYEgSbpMSwESREsBgVIlukkXSwOBSiW6F0oNRAmxIQRMshJPArIUshGBBLIQIrIBs4FKTLskQzYaAUkiWSMISwEVEkRXAgBJvUUBREm+SEwxAEsBgSBJuhJETIgCmUgkQzYaAUkiWSMISwEVEkRXAgBJvUUBRDEASwEigSC6EkQyBxaBaky7JEM2GgFJIlkjCEsBFRJEVwIASb1FAURJvkhMMQBLASKBILoSREmBaiW6F0lEMgdMgfgGCA9ETIgCNkgkQzYaAUkVgSASRFcAIDIKEkQkQzEAMgkSRLEhBDIKIrISshSyEYEEshAisgGzJEM2GgFJIlkjCEsBFRJEVwIASb1FAURJgVoluhdMgWIluhdMFkwWUClMULAkQzYaAUkiWSMISwEVEkRXAgBJvUUBREmBQiW6F0sBgUoluhdPAoFSJboXTwIWTwIWUEwWUClMULAkQzYaAUkVgSASRDYaAkkVgSASRDYaA0kiWSMISwEVEkRXAgA2GgRJIlkjCEsBFRJEVwIATwNPA1AhBBZQTFBMUAEoTFCwJEM2GgFJIlkjCEsBFRJEVwIANhoCSRUlEkQXiAG2SRUWVwYCTFApTFCwJEM2GgFJIlkjCEsBFRJEVwIANhoCSRUlEkQXNhoDSSJZIwhLARUSRFcCAIgASCRDNhoBSRWBIBJENhoCSRWBIBJENhoDSSJZIwhLARUSRFcCADYaBEkiWSMISwEVEkRXAgBPA08DUCEEFlBMUExQAShMULAkQ4oDACuL/b1FAUSL/b5Ii/2L/ogBH4ABcIv9UEm9RQFEvkiBvhAyDA1BABmxgQayEIEFshknBLIeJwSyHzIAsgGzQv/eiwMDiwFJgUBZSwEVUlcCABJEi/8VSYwAgUANQQABiYsAgUASRIsCi/+LA4REiYoCAYv/OAAxABJEi/84FDIKEkSL/zgRIQQSRIv/OBJJRIv/OBMyAxJEi/84FTIDEkSL/oFCWwgWi/5MXEKM/iIWi/5MXGpJjP6JigIBK4v/gVJbSYv/gUpbCUlBABixIQSL/1cgIIsCshKyFLIRgQSyECKyAbOL/4FCW4sBCUmMAEEAGLEhBIv/VwAgiwCyErIUshGBBLIQIrIBs4v+vEiL/4wAiYoDAIv+FUEAE4v+A4v/EkSAAXCL/VBJvEiL/r+JigIBMggWi/5Qi/8WUIAGc2V0dGxlUIk=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 3, "patch": 2 } }, "events": [], "templateVariables": { "USDC_ASSET_ID": { "type": "AVMUint64" } } }