{ "name": "Delegator", "structs": { "AlgohourPeriodTotals": [ { "name": "totalAlgohours", "type": "uint64" }, { "name": "final", "type": "bool" } ], "DelegatorCommittee": [ { "name": "periodStart", "type": "uint32" }, { "name": "periodEnd", "type": "uint32" }, { "name": "extDelegatedVotes", "type": "uint32" }, { "name": "extDelegatedAccountVotes", "type": "(uint32,uint32)[]" } ], "DelegatorProposal": [ { "name": "status", "type": "string" }, { "name": "committeeId", "type": "byte[32]" }, { "name": "extVoteStartTime", "type": "uint32" }, { "name": "extVoteEndTime", "type": "uint32" }, { "name": "extTotalVotingPower", "type": "uint32" }, { "name": "extAccountsPendingVotes", "type": "(uint32,uint32)[]" }, { "name": "extAccountsVoted", "type": "(uint32,uint32)[]" }, { "name": "intVoteEndTime", "type": "uint32" }, { "name": "intTotalAlgohours", "type": "uint64" }, { "name": "intVotedAlgohours", "type": "uint64" }, { "name": "intVotesYesAlgohours", "type": "uint64" }, { "name": "intVotesNoAlgohours", "type": "uint64" }, { "name": "intVotesAbstainAlgohours", "type": "uint64" }, { "name": "intVotesBoycottAlgohours", "type": "uint64" } ], "DelegatorVote": [ { "name": "yesVotes", "type": "uint64" }, { "name": "noVotes", "type": "uint64" }, { "name": "abstainVotes", "type": "uint64" }, { "name": "boycottVotes", "type": "uint64" } ] }, "methods": [ { "name": "setCommitteeOracleApp", "args": [ { "type": "uint64", "name": "appId", "desc": "Application ID of Committee Oracle" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Set the Committee Oracle Application ID", "events": [], "recommendations": {} }, { "name": "setVoteSubmitThreshold", "args": [ { "type": "uint64", "name": "threshold", "desc": "Time in seconds" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Set the vote submit threshold (time in seconds before external vote end)", "events": [], "recommendations": {} }, { "name": "setAbsenteeMode", "args": [ { "type": "string", "name": "mode", "desc": "'strict' or 'scaled'" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Set the absentee mode", "events": [], "recommendations": {} }, { "name": "syncCommitteeMetadata", "args": [ { "type": "byte[32]", "name": "committeeId", "desc": "Committee ID to sync" }, { "type": "address[]", "name": "delegatedAccounts", "desc": "Accounts delegated to this contract" } ], "returns": { "type": "(uint32,uint32,uint32,(uint32,uint32)[])", "struct": "DelegatorCommittee" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Sync committee metadata and delegated accounts from CommitteeOracle", "events": [], "recommendations": {} }, { "name": "syncProposalMetadata", "args": [ { "type": "uint64", "name": "proposalId" } ], "returns": { "type": "(string,byte[32],uint32,uint32,uint32,(uint32,uint32)[],(uint32,uint32)[],uint32,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "DelegatorProposal" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "voteInternal", "args": [ { "type": "uint64", "name": "proposalId", "desc": "xGov proposal Application ID" }, { "type": "address", "name": "voterAccount", "desc": "Account of the voter. Must be the same as Txn.sender for now" }, { "type": "(uint64,uint64,uint64,uint64)", "struct": "DelegatorVote", "name": "vote", "desc": "Voting record for this vote, including yes, no, abstain, and boycott votes. The contract will verify that the total votes matches the voting power of the account." } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Cast internal vote for proposal. This will update the proposal metadata and voting records, but will NOT submit votes to the xGov proposal contract.", "events": [], "recommendations": {} }, { "name": "voteExternal", "args": [ { "type": "uint64", "name": "proposalId", "desc": "xGov proposal Application ID" }, { "type": "address[]", "name": "extAccounts", "desc": "external accounts to submit votes for. MUST match the ext. accounts pending votes in proposal metadata in the same ORDER." } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Submit a vote to the xGov proposal contract for each external account, with approvals and rejections calculated based on the internal vote and absentee mode", "events": [], "recommendations": {} }, { "name": "addAccountAlgoHours", "args": [ { "type": "uint64", "name": "periodStart", "desc": "period start. Aligned to 1M" }, { "type": "(address,uint64)[]", "name": "accountAlgohourInputs", "desc": "" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Add account algohours and update total algohours for period", "events": [], "recommendations": {} }, { "name": "removeAccountAlgoHours", "args": [ { "type": "uint64", "name": "periodStart", "desc": "period start. Aligned to 1M" }, { "type": "(address,uint64)[]", "name": "accountAlgohourInputs", "desc": "" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Remove account algohours and update total algohours for period", "events": [], "recommendations": {} }, { "name": "updateAlgoHourPeriodFinality", "args": [ { "type": "uint64", "name": "periodStart", "desc": "period start" }, { "type": "uint64", "name": "totalAlgohours" }, { "type": "bool", "name": "final" } ], "returns": { "type": "void", "desc": "total algohours for period" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Update period algohour finality - indicates account algohour records are complete for this period", "events": [], "recommendations": {} }, { "name": "getAlgoHourPeriodTotals", "args": [ { "type": "uint64", "name": "periodStart", "desc": "period start" } ], "returns": { "type": "(uint64,bool)", "struct": "AlgohourPeriodTotals", "desc": "total algohours for period" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get total algohours for period", "events": [], "recommendations": {} }, { "name": "getAccountAlgoHours", "args": [ { "type": "uint64", "name": "periodStart", "desc": "period start" }, { "type": "address", "name": "account", "desc": "" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get account algohours for period", "events": [], "recommendations": {} }, { "name": "logCommitteeMetadata", "args": [ { "type": "byte[32][]", "name": "committeeIds", "desc": "Committee IDs to log" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Log committee metadata for multiple committees", "events": [], "recommendations": {} }, { "name": "logProposalMetadata", "args": [ { "type": "uint64[]", "name": "proposalIds", "desc": "Proposal Application IDs to log" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Log proposal metadata for multiple proposals", "events": [], "recommendations": {} }, { "name": "increaseBudget", "args": [ { "type": "uint64", "name": "itxns", "desc": "Number of no-op itxns to perform" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Utility to increase opcode budget by performing $itxns no-op itxns", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "networks": {}, "state": { "schema": { "global": { "ints": 3, "bytes": 1 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "committeeOracleApp": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Y29tbWl0dGVlT3JhY2xlQXBw", "desc": "Committee Oracle Application ID" }, "voteSubmitThreshold": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dm90ZVN1Ym1pdFRocmVzaG9sZA==", "desc": "Time in seconds before external vote end to submit votes" }, "absenteeMode": { "keyType": "AVMString", "valueType": "AVMString", "key": "YWJzZW50ZWVNb2Rl", "desc": "Absentee mode: strict or scaled" }, "lastAccountId": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bGFzdEFjY291bnRJZA==" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "committees": { "keyType": "byte[32]", "valueType": "DelegatorCommittee", "desc": "Synced committee details w/ own delegated totals", "prefix": "Qw==" }, "proposals": { "keyType": "uint64", "valueType": "DelegatorProposal", "desc": "Proposal metadata", "prefix": "UA==" }, "algohourPeriodTotals": { "keyType": "uint64", "valueType": "AlgohourPeriodTotals", "desc": "Total algohours for each period", "prefix": "SA==" }, "algohourAccounts": { "keyType": "(uint64,uint32)", "valueType": "uint64", "desc": "Algohours for each account for each period", "prefix": "aA==" }, "votes": { "keyType": "(uint64,uint32)", "valueType": "DelegatorVote", "desc": "Voting records", "prefix": "Vg==" }, "accountIds": { "keyType": "address", "valueType": "uint32", "prefix": "YQ==" } } } }, "bareActions": { "create": [ "NoOp" ], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 933, 1014, 1040, 1354, 1624, 1910, 1999, 2228, 2723, 2874, 2914, 3001, 3066, 3159, 3223, 3314, 3489, 3528 ], "errorMessage": "Box must have value" }, { "pc": [ 544, 656, 2343 ], "errorMessage": "Bytes has valid prefix" }, { "pc": [ 229 ], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [ 353 ], "errorMessage": "OnCompletion must be NoOp && can only call when creating" }, { "pc": [ 848, 853 ], "errorMessage": "application exists" }, { "pc": [ 500, 611, 807, 1182, 2144, 3575 ], "errorMessage": "check GlobalState exists" }, { "pc": [ 596, 2219, 2252, 2646, 2826, 3206, 3297 ], "errorMessage": "index access is out of bounds" }, { "pc": [ 412, 456, 1962, 2346, 2597, 2777, 3175, 3266 ], "errorMessage": "invalid array length header" }, { "pc": [ 549 ], "errorMessage": "invalid number of bytes for CommitteeMetadata" }, { "pc": [ 2963 ], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [ 468, 1974 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 3278 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 3187 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array>" }, { "pc": [ 420, 2353 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 2610, 2790 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 447, 1301, 3108 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 662 ], "errorMessage": "invalid number of bytes for arc4.uint32" }, { "pc": [ 378, 396, 776, 1291, 1951, 2586, 2766, 2943, 2953, 3037, 3096 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 1311 ], "errorMessage": "invalid number of bytes for smart_contracts/base/types.algo.ts::DelegatorVote" }, { "pc": [ 911 ], "errorMessage": "invalid size" }, { "pc": [ 708, 2371 ], "errorMessage": "max array length exceeded" }, { "pc": [ 366 ], "errorMessage": "overflow" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggMzIgMTAwMDAwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICIiICJFUlI6UFMiICJIIiAiY29tbWl0dGVlT3JhY2xlQXBwIiAiQyIgIlAiICJFUlI6QUhfTlgiICJoIiAiYSIgImxhc3RBY2NvdW50SWQiICJ2b3RlU3VibWl0VGhyZXNob2xkIiAiYWJzZW50ZWVNb2RlIiAweDAwMGUwMDAwICJFUlI6QV9OViIgIkVSUjpDX05YIiAiRVJSOlNUIiAweDAwMDAgIkVSUjpBVVRIIiAiRVJSOlBfTlgiICJFUlI6RUFSIiAiRVJSOkxBVCIgIlZPVEUiICJFUlI6QUgiIGJhc2U2NChDNEVCUXc9PSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2FjY291bnQtaWQuYWxnby50czo4CiAgICAvLyBsYXN0QWNjb3VudElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KQogICAgYnl0ZWMgMTAgLy8gImxhc3RBY2NvdW50SWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NzkKICAgIC8vIHZvdGVTdWJtaXRUaHJlc2hvbGQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAzNjAwICogMyB9KQogICAgYnl0ZWMgMTEgLy8gInZvdGVTdWJtaXRUaHJlc2hvbGQiCiAgICBwdXNoaW50IDEwODAwIC8vIDEwODAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo4MQogICAgLy8gYWJzZW50ZWVNb2RlID0gR2xvYmFsU3RhdGU8c3RyaW5nPih7IGluaXRpYWxWYWx1ZTogJ3N0cmljdCcgfSkKICAgIGJ5dGVjIDEyIC8vICJhYnNlbnRlZU1vZGUiCiAgICBwdXNoYnl0ZXMgInN0cmljdCIKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NzUKICAgIC8vIGV4cG9ydCBjbGFzcyBEZWxlZ2F0b3IgZXh0ZW5kcyBBY2NvdW50SWRDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ290c19fLmRlZmF1bHRDcmVhdGVAMjQKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4OWViMDY3OWUgMHgwOTE2YTU4NyAweGFkNjdmMTQzIDB4Y2U3NGE4MGUgMHgyNzBiOWIzMiAweDk2OWNlMDI0IDB4YjE1M2E5OGUgMHgxM2M5YmI0MSAweDE0MmYyOGIwIDB4YzY3MTFmMmYgMHg5NDRjYjlhOCAweDI4NWY5YzUzIDB4NmQ5ODNmMTAgMHg5YmI3ODE0NSAweDQxMThlY2JmIC8vIG1ldGhvZCAic2V0Q29tbWl0dGVlT3JhY2xlQXBwKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJzZXRWb3RlU3VibWl0VGhyZXNob2xkKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJzZXRBYnNlbnRlZU1vZGUoc3RyaW5nKXZvaWQiLCBtZXRob2QgInN5bmNDb21taXR0ZWVNZXRhZGF0YShieXRlWzMyXSxhZGRyZXNzW10pKHVpbnQzMix1aW50MzIsdWludDMyLCh1aW50MzIsdWludDMyKVtdKSIsIG1ldGhvZCAic3luY1Byb3Bvc2FsTWV0YWRhdGEodWludDY0KShzdHJpbmcsYnl0ZVszMl0sdWludDMyLHVpbnQzMix1aW50MzIsKHVpbnQzMix1aW50MzIpW10sKHVpbnQzMix1aW50MzIpW10sdWludDMyLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAidm90ZUludGVybmFsKHVpbnQ2NCxhZGRyZXNzLCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXZvaWQiLCBtZXRob2QgInZvdGVFeHRlcm5hbCh1aW50NjQsYWRkcmVzc1tdKXZvaWQiLCBtZXRob2QgImFkZEFjY291bnRBbGdvSG91cnModWludDY0LChhZGRyZXNzLHVpbnQ2NClbXSl2b2lkIiwgbWV0aG9kICJyZW1vdmVBY2NvdW50QWxnb0hvdXJzKHVpbnQ2NCwoYWRkcmVzcyx1aW50NjQpW10pdm9pZCIsIG1ldGhvZCAidXBkYXRlQWxnb0hvdXJQZXJpb2RGaW5hbGl0eSh1aW50NjQsdWludDY0LGJvb2wpdm9pZCIsIG1ldGhvZCAiZ2V0QWxnb0hvdXJQZXJpb2RUb3RhbHModWludDY0KSh1aW50NjQsYm9vbCkiLCBtZXRob2QgImdldEFjY291bnRBbGdvSG91cnModWludDY0LGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJsb2dDb21taXR0ZWVNZXRhZGF0YShieXRlWzMyXVtdKXZvaWQiLCBtZXRob2QgImxvZ1Byb3Bvc2FsTWV0YWRhdGEodWludDY0W10pdm9pZCIsIG1ldGhvZCAiaW5jcmVhc2VCdWRnZXQodWludDY0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBzZXRDb21taXR0ZWVPcmFjbGVBcHAgc2V0Vm90ZVN1Ym1pdFRocmVzaG9sZCBzZXRBYnNlbnRlZU1vZGUgc3luY0NvbW1pdHRlZU1ldGFkYXRhIHN5bmNQcm9wb3NhbE1ldGFkYXRhIHZvdGVJbnRlcm5hbCB2b3RlRXh0ZXJuYWwgYWRkQWNjb3VudEFsZ29Ib3VycyByZW1vdmVBY2NvdW50QWxnb0hvdXJzIHVwZGF0ZUFsZ29Ib3VyUGVyaW9kRmluYWxpdHkgZ2V0QWxnb0hvdXJQZXJpb2RUb3RhbHMgZ2V0QWNjb3VudEFsZ29Ib3VycyBsb2dDb21taXR0ZWVNZXRhZGF0YSBsb2dQcm9wb3NhbE1ldGFkYXRhIGluY3JlYXNlQnVkZ2V0CiAgICBlcnIKCm1haW5fX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo3NQogICAgLy8gZXhwb3J0IGNsYXNzIERlbGVnYXRvciBleHRlbmRzIEFjY291bnRJZENvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czo6dTMyKHY6IHVpbnQ2NCkgLT4gYnl0ZXM6CnUzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6OAogICAgLy8gZXhwb3J0IGZ1bmN0aW9uIHUzMih2OiB1aW50NjQpIHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czo5CiAgICAvLyByZXR1cm4gbmV3IFVpbnQzMih2KQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDQgNAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo6RGVsZWdhdG9yLnNldENvbW1pdHRlZU9yYWNsZUFwcFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldENvbW1pdHRlZU9yYWNsZUFwcDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6OTcKICAgIC8vIHB1YmxpYyBzZXRDb21taXR0ZWVPcmFjbGVBcHAoYXBwSWQ6IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjk4CiAgICAvLyB0aGlzLmVuc3VyZUNhbGxlcklzQWRtaW4oKQogICAgY2FsbHN1YiBlbnN1cmVDYWxsZXJJc0FkbWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjc3CiAgICAvLyBjb21taXR0ZWVPcmFjbGVBcHAgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKQogICAgYnl0ZWMgNCAvLyAiY29tbWl0dGVlT3JhY2xlQXBwIgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo5OQogICAgLy8gdGhpcy5jb21taXR0ZWVPcmFjbGVBcHAudmFsdWUgPSBhcHBJZAogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6OTcKICAgIC8vIHB1YmxpYyBzZXRDb21taXR0ZWVPcmFjbGVBcHAoYXBwSWQ6IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo6RGVsZWdhdG9yLnNldFZvdGVTdWJtaXRUaHJlc2hvbGRbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRWb3RlU3VibWl0VGhyZXNob2xkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxMDYKICAgIC8vIHB1YmxpYyBzZXRWb3RlU3VibWl0VGhyZXNob2xkKHRocmVzaG9sZDogdWludDY0KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjEwNwogICAgLy8gdGhpcy5lbnN1cmVDYWxsZXJJc0FkbWluKCkKICAgIGNhbGxzdWIgZW5zdXJlQ2FsbGVySXNBZG1pbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo3OQogICAgLy8gdm90ZVN1Ym1pdFRocmVzaG9sZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDM2MDAgKiAzIH0pCiAgICBieXRlYyAxMSAvLyAidm90ZVN1Ym1pdFRocmVzaG9sZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTA4CiAgICAvLyB0aGlzLnZvdGVTdWJtaXRUaHJlc2hvbGQudmFsdWUgPSB0aHJlc2hvbGQKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjEwNgogICAgLy8gcHVibGljIHNldFZvdGVTdWJtaXRUaHJlc2hvbGQodGhyZXNob2xkOiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjpEZWxlZ2F0b3Iuc2V0QWJzZW50ZWVNb2RlW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0QWJzZW50ZWVNb2RlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxMTUKICAgIC8vIHB1YmxpYyBzZXRBYnNlbnRlZU1vZGUobW9kZTogQWJzZW50ZWVNb2RlKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxMTYKICAgIC8vIHRoaXMuZW5zdXJlQ2FsbGVySXNBZG1pbigpCiAgICBjYWxsc3ViIGVuc3VyZUNhbGxlcklzQWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6ODEKICAgIC8vIGFic2VudGVlTW9kZSA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBpbml0aWFsVmFsdWU6ICdzdHJpY3QnIH0pCiAgICBieXRlYyAxMiAvLyAiYWJzZW50ZWVNb2RlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxMTcKICAgIC8vIHRoaXMuYWJzZW50ZWVNb2RlLnZhbHVlID0gbW9kZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTE1CiAgICAvLyBwdWJsaWMgc2V0QWJzZW50ZWVNb2RlKG1vZGU6IEFic2VudGVlTW9kZSk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6OkRlbGVnYXRvci5zeW5jQ29tbWl0dGVlTWV0YWRhdGFbcm91dGluZ10oKSAtPiB2b2lkOgpzeW5jQ29tbWl0dGVlTWV0YWRhdGE6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18xIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTI1CiAgICAvLyBwdWJsaWMgc3luY0NvbW1pdHRlZU1ldGFkYXRhKGNvbW1pdHRlZUlkOiBDb21taXR0ZWVJZCwgZGVsZWdhdGVkQWNjb3VudHM6IEFjY291bnRbXSkgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50Y18zIC8vIDMyCiAgICAqCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YWNjb3VudD4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTI2CiAgICAvLyB0aGlzLmVuc3VyZUNhbGxlcklzQWRtaW4oKQogICAgY2FsbHN1YiBlbnN1cmVDYWxsZXJJc0FkbWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjgzCiAgICAvLyBjb21taXR0ZWVzID0gQm94TWFwPENvbW1pdHRlZUlkLCBEZWxlZ2F0b3JDb21taXR0ZWU+KHsga2V5UHJlZml4OiAnQycgfSkKICAgIGJ5dGVjIDUgLy8gIkMiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxMjgKICAgIC8vIGVuc3VyZSghY29tbWl0dGVlQm94LmV4aXN0cywgZXJyQ29tbWl0dGVlRXhpc3RzKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJ6IHN5bmNDb21taXR0ZWVNZXRhZGF0YV9hZnRlcl9pZl9lbHNlQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjEyOAogICAgLy8gZW5zdXJlKCFjb21taXR0ZWVCb3guZXhpc3RzLCBlcnJDb21taXR0ZWVFeGlzdHMpCiAgICBwdXNoYnl0ZXMgIkVSUjpDX0VYIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnN5bmNDb21taXR0ZWVNZXRhZGF0YV9hZnRlcl9pZl9lbHNlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxMzEtMTM0CiAgICAvLyBjb25zdCByZW1vdGVDb21taXR0ZWUgPSBvcmFjbGVBcHAuY2FsbC5nZXRDb21taXR0ZWVNZXRhZGF0YSh7CiAgICAvLyAgIGFwcElkOiB0aGlzLmNvbW1pdHRlZU9yYWNsZUFwcC52YWx1ZSwKICAgIC8vICAgYXJnczogW2NvbW1pdHRlZUlkLCB0cnVlXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjEzMgogICAgLy8gYXBwSWQ6IHRoaXMuY29tbWl0dGVlT3JhY2xlQXBwLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NzcKICAgIC8vIGNvbW1pdHRlZU9yYWNsZUFwcCA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPigpCiAgICBieXRlYyA0IC8vICJjb21taXR0ZWVPcmFjbGVBcHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjEzMgogICAgLy8gYXBwSWQ6IHRoaXMuY29tbWl0dGVlT3JhY2xlQXBwLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTMxLTEzNAogICAgLy8gY29uc3QgcmVtb3RlQ29tbWl0dGVlID0gb3JhY2xlQXBwLmNhbGwuZ2V0Q29tbWl0dGVlTWV0YWRhdGEoewogICAgLy8gICBhcHBJZDogdGhpcy5jb21taXR0ZWVPcmFjbGVBcHAudmFsdWUsCiAgICAvLyAgIGFyZ3M6IFtjb21taXR0ZWVJZCwgdHJ1ZV0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgcHVzaGJ5dGVzIDB4Mzc4YjJiNTEgLy8gbWV0aG9kICJnZXRDb21taXR0ZWVNZXRhZGF0YShieXRlWzMyXSxib29sKSh1aW50MTYsdWludDMyLHVpbnQzMix1aW50MzIsdWludDMyLHVpbnQ2NCx1aW50MzIpIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxMzMKICAgIC8vIGFyZ3M6IFtjb21taXR0ZWVJZCwgdHJ1ZV0sCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTMxLTEzNAogICAgLy8gY29uc3QgcmVtb3RlQ29tbWl0dGVlID0gb3JhY2xlQXBwLmNhbGwuZ2V0Q29tbWl0dGVlTWV0YWRhdGEoewogICAgLy8gICBhcHBJZDogdGhpcy5jb21taXR0ZWVPcmFjbGVBcHAudmFsdWUsCiAgICAvLyAgIGFyZ3M6IFtjb21taXR0ZWVJZCwgdHJ1ZV0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGxlbgogICAgcHVzaGludCAzMCAvLyAzMAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgQ29tbWl0dGVlTWV0YWRhdGEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTM3CiAgICAvLyBwZXJpb2RTdGFydDogcmVtb3RlQ29tbWl0dGVlLnBlcmlvZFN0YXJ0LAogICAgZHVwCiAgICBleHRyYWN0IDYgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxMzgKICAgIC8vIHBlcmlvZEVuZDogcmVtb3RlQ29tbWl0dGVlLnBlcmlvZEVuZCwKICAgIHN3YXAKICAgIGV4dHJhY3QgMTAgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxMzkKICAgIC8vIGV4dERlbGVnYXRlZFZvdGVzOiB1MzIoMCksCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiB1MzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTM2LTE0MQogICAgLy8gY29uc3QgY29tbWl0dGVlOiBEZWxlZ2F0b3JDb21taXR0ZWUgPSB7CiAgICAvLyAgIHBlcmlvZFN0YXJ0OiByZW1vdGVDb21taXR0ZWUucGVyaW9kU3RhcnQsCiAgICAvLyAgIHBlcmlvZEVuZDogcmVtb3RlQ29tbWl0dGVlLnBlcmlvZEVuZCwKICAgIC8vICAgZXh0RGVsZWdhdGVkVm90ZXM6IHUzMigwKSwKICAgIC8vICAgZXh0RGVsZWdhdGVkQWNjb3VudFZvdGVzOiBbXSBhcyBBY2NvdW50SWRXaXRoVm90ZXNbXSwKICAgIC8vIH0KICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAxMyAvLyAweDAwMGUwMDAwCiAgICBjb25jYXQKICAgIGJ1cnkgMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTQzCiAgICAvLyBsZXQgZXh0RGVsZWdhdGVkVm90ZXM6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDcKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKCnN5bmNDb21taXR0ZWVNZXRhZGF0YV9mb3JfaGVhZGVyQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE0NAogICAgLy8gZm9yIChjb25zdCBhY2NvdW50IG9mIGRlbGVnYXRlZEFjY291bnRzKSB7CiAgICBkaWcgNQogICAgZGlnIDIKICAgIDwKICAgIGJ6IHN5bmNDb21taXR0ZWVNZXRhZGF0YV9hZnRlcl9mb3JANwogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgNgogICAgaW50Y18zIC8vIDMyCiAgICAqCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBidXJ5IDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTQ1CiAgICAvLyBjb25zdCBsb2NhbEFjY291bnRJZCA9IHRoaXMuZ2V0T3JDcmVhdGVBY2NvdW50SWQoYWNjb3VudCkKICAgIGR1cAogICAgY2FsbHN1YiBnZXRPckNyZWF0ZUFjY291bnRJZAogICAgYnVyeSAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxNDYtMTQ5CiAgICAvLyBjb25zdCByZW1vdGVWb3RlcyA9IG9yYWNsZUFwcC5jYWxsLmdldFhHb3ZWb3RpbmdQb3dlcih7CiAgICAvLyAgIGFwcElkOiB0aGlzLmNvbW1pdHRlZU9yYWNsZUFwcC52YWx1ZSwKICAgIC8vICAgYXJnczogW2NvbW1pdHRlZUlkLCBhY2NvdW50XSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE0NwogICAgLy8gYXBwSWQ6IHRoaXMuY29tbWl0dGVlT3JhY2xlQXBwLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NzcKICAgIC8vIGNvbW1pdHRlZU9yYWNsZUFwcCA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPigpCiAgICBieXRlYyA0IC8vICJjb21taXR0ZWVPcmFjbGVBcHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE0NwogICAgLy8gYXBwSWQ6IHRoaXMuY29tbWl0dGVlT3JhY2xlQXBwLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTQ2LTE0OQogICAgLy8gY29uc3QgcmVtb3RlVm90ZXMgPSBvcmFjbGVBcHAuY2FsbC5nZXRYR292Vm90aW5nUG93ZXIoewogICAgLy8gICBhcHBJZDogdGhpcy5jb21taXR0ZWVPcmFjbGVBcHAudmFsdWUsCiAgICAvLyAgIGFyZ3M6IFtjb21taXR0ZWVJZCwgYWNjb3VudF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgcHVzaGJ5dGVzIDB4Y2EyODQ5MDMgLy8gbWV0aG9kICJnZXRYR292Vm90aW5nUG93ZXIoYnl0ZVszMl0sYWRkcmVzcyl1aW50MzIiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDUKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxMQogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE1MAogICAgLy8gZW5zdXJlRXh0cmEocmVtb3RlVm90ZXMuYXNVaW50NjQoKSA+IDAsIGVyck5vVm90aW5nUG93ZXIsIGFjY291bnQuYnl0ZXMpCiAgICBidG9pCiAgICBkdXAKICAgIGJ1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czo0MAogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogc3luY0NvbW1pdHRlZU1ldGFkYXRhX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6NDEKICAgIC8vIGxvZyhleHRyYSkKICAgIGRpZyA3CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTUwCiAgICAvLyBlbnN1cmVFeHRyYShyZW1vdGVWb3Rlcy5hc1VpbnQ2NCgpID4gMCwgZXJyTm9Wb3RpbmdQb3dlciwgYWNjb3VudC5ieXRlcykKICAgIGJ5dGVjIDE0IC8vICJFUlI6QV9OViIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6NDIKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjQzCiAgICAvLyBlcnIoKQogICAgZXJyCgpzeW5jQ29tbWl0dGVlTWV0YWRhdGFfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTUyCiAgICAvLyBleHREZWxlZ2F0ZWRWb3RlcyArPSByZW1vdGVWb3Rlcy5hc1VpbnQ2NCgpCiAgICBkaWcgNgogICAgZGlnIDUKICAgICsKICAgIGJ1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxNTMKICAgIC8vIGNvbW1pdHRlZS5leHREZWxlZ2F0ZWRBY2NvdW50Vm90ZXMucHVzaCh7IGFjY291bnRJZDogbG9jYWxBY2NvdW50SWQsIHZvdGVzOiByZW1vdGVWb3RlcyB9KQogICAgZGlnIDEwCiAgICBkdXAKICAgIHB1c2hpbnQgMTIgLy8gMTIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBkaWcgMgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZGlnIDEyCiAgICBkaWcgMTIKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIHVuY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgZXh0cmFjdDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnVyeSAxMQogICAgZGlnIDUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDYKICAgIGIgc3luY0NvbW1pdHRlZU1ldGFkYXRhX2Zvcl9oZWFkZXJAMwoKc3luY0NvbW1pdHRlZU1ldGFkYXRhX2FmdGVyX2ZvckA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxNTUKICAgIC8vIGNvbW1pdHRlZS5leHREZWxlZ2F0ZWRWb3RlcyA9IHUzMihleHREZWxlZ2F0ZWRWb3RlcykKICAgIGRpZyA2CiAgICBjYWxsc3ViIHUzMgogICAgZGlnIDExCiAgICBzd2FwCiAgICByZXBsYWNlMiA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE1NgogICAgLy8gY29tbWl0dGVlQm94LnZhbHVlID0gY2xvbmUoY29tbWl0dGVlKQogICAgZGlnIDEKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkaWcgMQogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxMjUKICAgIC8vIHB1YmxpYyBzeW5jQ29tbWl0dGVlTWV0YWRhdGEoY29tbWl0dGVlSWQ6IENvbW1pdHRlZUlkLCBkZWxlZ2F0ZWRBY2NvdW50czogQWNjb3VudFtdKSB7CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo6RGVsZWdhdG9yLnN5bmNQcm9wb3NhbE1ldGFkYXRhW3JvdXRpbmddKCkgLT4gdm9pZDoKc3luY1Byb3Bvc2FsTWV0YWRhdGE6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiA2CiAgICBieXRlY18xIC8vICIiCiAgICBkdXBuIDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTYxCiAgICAvLyBwdWJsaWMgc3luY1Byb3Bvc2FsTWV0YWRhdGEocHJvcG9zYWxJZDogQXBwbGljYXRpb24pOiBEZWxlZ2F0b3JQcm9wb3NhbCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTYzCiAgICAvLyBjb25zdCBwcm9wb3NhbEJveCA9IHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjg1CiAgICAvLyBwcm9wb3NhbHMgPSBCb3hNYXA8QXBwbGljYXRpb24sIERlbGVnYXRvclByb3Bvc2FsPih7IGtleVByZWZpeDogJ1AnIH0pCiAgICBieXRlYyA2IC8vICJQIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTY0CiAgICAvLyBlbnN1cmUoIXByb3Bvc2FsQm94LmV4aXN0cywgZXJyUHJvcG9zYWxFeGlzdHMpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYnogc3luY1Byb3Bvc2FsTWV0YWRhdGFfYWZ0ZXJfaWZfZWxzZUAyOAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxNjQKICAgIC8vIGVuc3VyZSghcHJvcG9zYWxCb3guZXhpc3RzLCBlcnJQcm9wb3NhbEV4aXN0cykKICAgIHB1c2hieXRlcyAiRVJSOlBfRVgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKc3luY1Byb3Bvc2FsTWV0YWRhdGFfYWZ0ZXJfaWZfZWxzZUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTY5CiAgICAvLyB0aGlzLmNvbW1pdHRlZU9yYWNsZUFwcC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjc3CiAgICAvLyBjb21taXR0ZWVPcmFjbGVBcHAgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKQogICAgYnl0ZWMgNCAvLyAiY29tbWl0dGVlT3JhY2xlQXBwIgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxNjkKICAgIC8vIHRoaXMuY29tbWl0dGVlT3JhY2xlQXBwLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTcwCiAgICAvLyBvcmFjbGVYR292UmVnaXN0cnlBcHBLZXksCiAgICBwdXNoYnl0ZXMgInhHb3ZSZWdpc3RyeUFwcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTY4LTE3MQogICAgLy8gY29uc3QgW3JlZ2lzdHJ5QXBwSWQsIHJlZ2lzdHJ5QXBwRXhpc3RzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCgKICAgIC8vICAgdGhpcy5jb21taXR0ZWVPcmFjbGVBcHAudmFsdWUsCiAgICAvLyAgIG9yYWNsZVhHb3ZSZWdpc3RyeUFwcEtleSwKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IHN5bmNQcm9wb3NhbE1ldGFkYXRhX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTcyCiAgICAvLyBlbnN1cmUocmVnaXN0cnlBcHBFeGlzdHMsIGVyclhHb3ZSZWdpc3RyeU1pc3NpbmcpCiAgICBwdXNoYnl0ZXMgIkVSUjpYR1JNIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnN5bmNQcm9wb3NhbE1ldGFkYXRhX2FmdGVyX2lmX2Vsc2VAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE3MwogICAgLy8gY29uc3QgcHJvcG9zYWxDcmVhdG9yID0gcHJvcG9zYWxJZC5jcmVhdG9yCiAgICBkaWcgMQogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxNzQKICAgIC8vIGNvbnN0IHJlZ2lzdHJ5RXNjcm93ID0gQXBwbGljYXRpb24ocmVnaXN0cnlBcHBJZCkuYWRkcmVzcwogICAgZGlnIDcKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTc1CiAgICAvLyBlbnN1cmUocHJvcG9zYWxDcmVhdG9yID09PSByZWdpc3RyeUVzY3JvdywgZXJyWEdvdlByb3Bvc2FsSW52YWxpZENyZWF0b3IpCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogc3luY1Byb3Bvc2FsTWV0YWRhdGFfYWZ0ZXJfaWZfZWxzZUAzNgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxNzUKICAgIC8vIGVuc3VyZShwcm9wb3NhbENyZWF0b3IgPT09IHJlZ2lzdHJ5RXNjcm93LCBlcnJYR292UHJvcG9zYWxJbnZhbGlkQ3JlYXRvcikKICAgIHB1c2hieXRlcyAiRVJSOlhHUEMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKc3luY1Byb3Bvc2FsTWV0YWRhdGFfYWZ0ZXJfaWZfZWxzZUAzNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTc5CiAgICAvLyBjb25zdCBbX2NvbW1pdHRlZUlkLCBjb21taXR0ZWVJZEV4aXN0c10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhwcm9wb3NhbElkLCB4R292UHJvcG9zYWxDb21taXR0ZWVJZEtleSkKICAgIGRpZyAxCiAgICBwdXNoYnl0ZXMgImNvbW1pdHRlZV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiBzeW5jUHJvcG9zYWxNZXRhZGF0YV9hZnRlcl9pZl9lbHNlQDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE4MAogICAgLy8gZW5zdXJlKGNvbW1pdHRlZUlkRXhpc3RzLCBlcnJYR292UHJvcG9zYWxDb21taXR0ZWVNaXNzaW5nKQogICAgcHVzaGJ5dGVzICJFUlI6WEdQTSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgpzeW5jUHJvcG9zYWxNZXRhZGF0YV9hZnRlcl9pZl9lbHNlQDQwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxODEKICAgIC8vIGNvbnN0IGNvbW1pdHRlZUlkID0gbmV3IFN0YXRpY0J5dGVzPDMyPihfY29tbWl0dGVlSWQpCiAgICBkaWcgMTQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBzaXplCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjgzCiAgICAvLyBjb21taXR0ZWVzID0gQm94TWFwPENvbW1pdHRlZUlkLCBEZWxlZ2F0b3JDb21taXR0ZWU+KHsga2V5UHJlZml4OiAnQycgfSkKICAgIGJ5dGVjIDUgLy8gIkMiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxODMKICAgIC8vIGVuc3VyZShjb21taXR0ZWVCb3guZXhpc3RzLCBlcnJDb21taXR0ZWVOb3RFeGlzdHMpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IHN5bmNQcm9wb3NhbE1ldGFkYXRhX2FmdGVyX2lmX2Vsc2VANDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTgzCiAgICAvLyBlbnN1cmUoY29tbWl0dGVlQm94LmV4aXN0cywgZXJyQ29tbWl0dGVlTm90RXhpc3RzKQogICAgYnl0ZWMgMTUgLy8gIkVSUjpDX05YIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnN5bmNQcm9wb3NhbE1ldGFkYXRhX2FmdGVyX2lmX2Vsc2VANDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE4NAogICAgLy8gY29uc3QgY29tbWl0dGVlTWV0YWRhdGEgPSBjb21taXR0ZWVCb3gudmFsdWUgYXMgUmVhZG9ubHk8RGVsZWdhdG9yQ29tbWl0dGVlPgogICAgZGlnIDEzCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBib3hfZXh0cmFjdAogICAgZGlnIDIKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBkdXAKICAgIGJveF9leHRyYWN0CiAgICBidXJ5IDE0CiAgICB1bmNvdmVyIDIKICAgIGludGNfMiAvLyA4CiAgICBwdXNoaW50IDQgLy8gNAogICAgYm94X2V4dHJhY3QKICAgIGJ1cnkgMTQKICAgIGRpZyAxCiAgICBwdXNoaW50IDEyIC8vIDEyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBidXJ5IDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE4NgogICAgLy8gbGV0IHRvdGFsQWxnb0hvdXJzOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE5MAogICAgLy8gbGV0IHBlcmlvZDogdWludDY0ID0gY29tbWl0dGVlTWV0YWRhdGEucGVyaW9kU3RhcnQuYXNVaW50NjQoKTsKICAgIGJ0b2kKICAgIGJ1cnkgOAoKc3luY1Byb3Bvc2FsTWV0YWRhdGFfd2hpbGVfdG9wQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE5MQogICAgLy8gcGVyaW9kIDwgY29tbWl0dGVlTWV0YWRhdGEucGVyaW9kRW5kLmFzVWludDY0KCk7CiAgICBkaWcgMTAKICAgIGJ0b2kKICAgIGRpZyA4CiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE4OS0xOTMKICAgIC8vIGZvciAoCiAgICAvLyAgIGxldCBwZXJpb2Q6IHVpbnQ2NCA9IGNvbW1pdHRlZU1ldGFkYXRhLnBlcmlvZFN0YXJ0LmFzVWludDY0KCk7CiAgICAvLyAgIHBlcmlvZCA8IGNvbW1pdHRlZU1ldGFkYXRhLnBlcmlvZEVuZC5hc1VpbnQ2NCgpOwogICAgLy8gICBwZXJpb2QgKz0gcGVyaW9kTGVuZ3RoCiAgICAvLyApIHsKICAgIGJ6IHN5bmNQcm9wb3NhbE1ldGFkYXRhX2FmdGVyX3doaWxlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTk0CiAgICAvLyBjb25zdCBwZXJpb2RUb3RhbHNCb3ggPSB0aGlzLmFsZ29ob3VyUGVyaW9kVG90YWxzKHBlcmlvZCkKICAgIGRpZyA3CiAgICBpdG9iCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6ODcKICAgIC8vIGFsZ29ob3VyUGVyaW9kVG90YWxzID0gQm94TWFwPHVpbnQ2NCwgQWxnb2hvdXJQZXJpb2RUb3RhbHM+KHsga2V5UHJlZml4OiAnSCcgfSkKICAgIGJ5dGVjXzMgLy8gIkgiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxOTUKICAgIC8vIGVuc3VyZUV4dHJhKHBlcmlvZFRvdGFsc0JveC5leGlzdHMsIGVyckFsZ29Ib3Vyc05vdEV4aXN0LCBvcC5pdG9iKHBlcmlvZCkpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6NDAKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IHN5bmNQcm9wb3NhbE1ldGFkYXRhX2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6NDEKICAgIC8vIGxvZyhleHRyYSkKICAgIGRpZyA5CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTk1CiAgICAvLyBlbnN1cmVFeHRyYShwZXJpb2RUb3RhbHNCb3guZXhpc3RzLCBlcnJBbGdvSG91cnNOb3RFeGlzdCwgb3AuaXRvYihwZXJpb2QpKQogICAgYnl0ZWMgNyAvLyAiRVJSOkFIX05YIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czo0MgogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6NDMKICAgIC8vIGVycigpCiAgICBlcnIKCnN5bmNQcm9wb3NhbE1ldGFkYXRhX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE5NgogICAgLy8gZW5zdXJlRXh0cmEocGVyaW9kVG90YWxzQm94LnZhbHVlLmZpbmFsLCBlcnJBbGdvSG91cnNOb3RGaW5hbCwgb3AuaXRvYihwZXJpb2QpKQogICAgZGlnIDgKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICBnZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6NDAKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IHN5bmNQcm9wb3NhbE1ldGFkYXRhX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6NDEKICAgIC8vIGxvZyhleHRyYSkKICAgIGRpZyA5CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTk2CiAgICAvLyBlbnN1cmVFeHRyYShwZXJpb2RUb3RhbHNCb3gudmFsdWUuZmluYWwsIGVyckFsZ29Ib3Vyc05vdEZpbmFsLCBvcC5pdG9iKHBlcmlvZCkpCiAgICBwdXNoYnl0ZXMgIkVSUjpBSF9ORiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6NDIKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjQzCiAgICAvLyBlcnIoKQogICAgZXJyCgpzeW5jUHJvcG9zYWxNZXRhZGF0YV9hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxOTgKICAgIC8vIHRvdGFsQWxnb0hvdXJzICs9IHBlcmlvZFRvdGFsc0JveC52YWx1ZS50b3RhbEFsZ29ob3VycwogICAgZGlnIDgKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA1CiAgICArCiAgICBidXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTkyCiAgICAvLyBwZXJpb2QgKz0gcGVyaW9kTGVuZ3RoCiAgICBkaWcgNwogICAgaW50YyA0IC8vIDEwMDAwMDAKICAgICsKICAgIGJ1cnkgOAogICAgYiBzeW5jUHJvcG9zYWxNZXRhZGF0YV93aGlsZV90b3BAMgoKc3luY1Byb3Bvc2FsTWV0YWRhdGFfYWZ0ZXJfd2hpbGVANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjAyCiAgICAvLyBjb25zdCBbc3RhdHVzLCBzdGF0dXNFeGlzdHNdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHByb3Bvc2FsSWQsIHhHb3ZQcm9wb3NhbFN0YXR1c0tleSkKICAgIGRpZyAxCiAgICBkdXAKICAgIHB1c2hieXRlcyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGNvdmVyIDIKICAgIGJ1cnkgOAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyMDMKICAgIC8vIGNvbnN0IFt2b3RlT3BlblRzLCB2b3RlT3BlblRzRXhpc3RzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NChwcm9wb3NhbElkLCB4R292UHJvcG9zYWxWb3RlT3BlblRzS2V5KQogICAgZHVwCiAgICBwdXNoYnl0ZXMgInZvdGVfb3Blbl90cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIGJ1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyMDQKICAgIC8vIGNvbnN0IFt2b3RpbmdEdXJhdGlvbiwgdm90aW5nRHVyYXRpb25FeGlzdHNdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHByb3Bvc2FsSWQsIHhHb3ZQcm9wb3NhbFZvdGluZ0R1cmF0aW9uS2V5KQogICAgcHVzaGJ5dGVzICJ2b3RpbmdfZHVyYXRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICBidXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IHN5bmNQcm9wb3NhbE1ldGFkYXRhX2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjA1CiAgICAvLyBlbnN1cmUoc3RhdHVzRXhpc3RzLCBlcnJYR292UHJvcG9zYWxTdGF0dXNNaXNzaW5nKQogICAgcHVzaGJ5dGVzICJFUlI6WEdTTSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgpzeW5jUHJvcG9zYWxNZXRhZGF0YV9hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyMDkKICAgIC8vIGVuc3VyZShzdGF0dXMgPT09IFNUQVRVU19WT1RJTkcgfHwgKHN0YXR1cyA9PT0gU1RBVFVTX1NVQk1JVFRFRCAmJiB2b3RlT3BlblRzIDw9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXApLCBlcnJTdGF0ZSkKICAgIGRpZyA1CiAgICBwdXNoaW50IDI1IC8vIDI1CiAgICA9PQogICAgYm56IHN5bmNQcm9wb3NhbE1ldGFkYXRhX2Jvb2xfdHJ1ZUA3CiAgICBkaWcgNQogICAgcHVzaGludCAyMCAvLyAyMAogICAgPT0KICAgIGJ6IHN5bmNQcm9wb3NhbE1ldGFkYXRhX2Jvb2xfZmFsc2VAOAogICAgZGlnIDMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBieiBzeW5jUHJvcG9zYWxNZXRhZGF0YV9ib29sX2ZhbHNlQDgKCnN5bmNQcm9wb3NhbE1ldGFkYXRhX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCnN5bmNQcm9wb3NhbE1ldGFkYXRhX2Jvb2xfbWVyZ2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IHN5bmNQcm9wb3NhbE1ldGFkYXRhX2FmdGVyX2lmX2Vsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjA5CiAgICAvLyBlbnN1cmUoc3RhdHVzID09PSBTVEFUVVNfVk9USU5HIHx8IChzdGF0dXMgPT09IFNUQVRVU19TVUJNSVRURUQgJiYgdm90ZU9wZW5UcyA8PSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wKSwgZXJyU3RhdGUpCiAgICBieXRlYyAxNiAvLyAiRVJSOlNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnN5bmNQcm9wb3NhbE1ldGFkYXRhX2FmdGVyX2lmX2Vsc2VAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjIxMAogICAgLy8gY29uc3Qgdm90ZUVuZFRzOiB1aW50NjQgPSB2b3RlT3BlblRzICsgdm90aW5nRHVyYXRpb24KICAgIGRpZyAzCiAgICBkdXAKICAgIGRpZyA0CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjIxNQogICAgLy8gZXh0Vm90ZVN0YXJ0VGltZTogdTMyKHZvdGVPcGVuVHMpLAogICAgc3dhcAogICAgY2FsbHN1YiB1MzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjE2CiAgICAvLyBleHRWb3RlRW5kVGltZTogdTMyKHZvdGVFbmRUcyksCiAgICBkaWcgMQogICAgY2FsbHN1YiB1MzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjE5CiAgICAvLyBleHRBY2NvdW50c1ZvdGVkOiBbXSBhcyBBY2NvdW50SWRXaXRoVm90ZXNbXSwKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjIyMAogICAgLy8gaW50Vm90ZUVuZFRpbWU6IHUzMih2b3RlRW5kVHMgLSB0aGlzLnZvdGVTdWJtaXRUaHJlc2hvbGQudmFsdWUpLCAvLyBzZXQgaW50ZXJuYWwgdm90ZSBlbmQgdGltZSBlYXJsaWVyIHRoYW4gZXh0ZXJuYWwgdG8gYWxsb3cgZm9yIHZvdGUgc3VibWlzc2lvbiBiZWZvcmUgeEdvdiBwcm9wb3NhbCB2b3RpbmcgZW5kcwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NzkKICAgIC8vIHZvdGVTdWJtaXRUaHJlc2hvbGQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAzNjAwICogMyB9KQogICAgYnl0ZWMgMTEgLy8gInZvdGVTdWJtaXRUaHJlc2hvbGQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjIyMAogICAgLy8gaW50Vm90ZUVuZFRpbWU6IHUzMih2b3RlRW5kVHMgLSB0aGlzLnZvdGVTdWJtaXRUaHJlc2hvbGQudmFsdWUpLCAvLyBzZXQgaW50ZXJuYWwgdm90ZSBlbmQgdGltZSBlYXJsaWVyIHRoYW4gZXh0ZXJuYWwgdG8gYWxsb3cgZm9yIHZvdGUgc3VibWlzc2lvbiBiZWZvcmUgeEdvdiBwcm9wb3NhbCB2b3RpbmcgZW5kcwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHVuY292ZXIgNAogICAgc3dhcAogICAgLQogICAgY2FsbHN1YiB1MzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjEyLTIyNwogICAgLy8gY29uc3QgcHJvcG9zYWxNZXRhZGF0YTogRGVsZWdhdG9yUHJvcG9zYWwgPSB7CiAgICAvLyAgIHN0YXR1czogJ1dBSVQnLAogICAgLy8gICBjb21taXR0ZWVJZDogY29tbWl0dGVlSWQsCiAgICAvLyAgIGV4dFZvdGVTdGFydFRpbWU6IHUzMih2b3RlT3BlblRzKSwKICAgIC8vICAgZXh0Vm90ZUVuZFRpbWU6IHUzMih2b3RlRW5kVHMpLAogICAgLy8gICBleHRUb3RhbFZvdGluZ1Bvd2VyOiBjb21taXR0ZWVNZXRhZGF0YS5leHREZWxlZ2F0ZWRWb3RlcywKICAgIC8vICAgZXh0QWNjb3VudHNQZW5kaW5nVm90ZXM6IGNsb25lKGNvbW1pdHRlZU1ldGFkYXRhLmV4dERlbGVnYXRlZEFjY291bnRWb3RlcyksCiAgICAvLyAgIGV4dEFjY291bnRzVm90ZWQ6IFtdIGFzIEFjY291bnRJZFdpdGhWb3Rlc1tdLAogICAgLy8gICBpbnRWb3RlRW5kVGltZTogdTMyKHZvdGVFbmRUcyAtIHRoaXMudm90ZVN1Ym1pdFRocmVzaG9sZC52YWx1ZSksIC8vIHNldCBpbnRlcm5hbCB2b3RlIGVuZCB0aW1lIGVhcmxpZXIgdGhhbiBleHRlcm5hbCB0byBhbGxvdyBmb3Igdm90ZSBzdWJtaXNzaW9uIGJlZm9yZSB4R292IHByb3Bvc2FsIHZvdGluZyBlbmRzCiAgICAvLyAgIGludFRvdGFsQWxnb2hvdXJzOiB0b3RhbEFsZ29Ib3VycywKICAgIC8vICAgaW50Vm90ZWRBbGdvaG91cnM6IDAsCiAgICAvLyAgIGludFZvdGVzWWVzQWxnb2hvdXJzOiAwLAogICAgLy8gICBpbnRWb3Rlc05vQWxnb2hvdXJzOiAwLAogICAgLy8gICBpbnRWb3Rlc0Fic3RhaW5BbGdvaG91cnM6IDAsCiAgICAvLyAgIGludFZvdGVzQm95Y290dEFsZ29ob3VyczogMCwKICAgIC8vIH0KICAgIHB1c2hieXRlcyAweDAwNjYKICAgIGRpZyAxOQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIGRpZyAxNAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDZjCiAgICBjb25jYXQKICAgIGRpZyAxNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHB1c2hpbnQgMTA4IC8vIDEwOAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgNwogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAwNDU3NDE0OTU0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyMTkKICAgIC8vIGV4dEFjY291bnRzVm90ZWQ6IFtdIGFzIEFjY291bnRJZFdpdGhWb3Rlc1tdLAogICAgYnl0ZWMgMTcgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjIxMi0yMjcKICAgIC8vIGNvbnN0IHByb3Bvc2FsTWV0YWRhdGE6IERlbGVnYXRvclByb3Bvc2FsID0gewogICAgLy8gICBzdGF0dXM6ICdXQUlUJywKICAgIC8vICAgY29tbWl0dGVlSWQ6IGNvbW1pdHRlZUlkLAogICAgLy8gICBleHRWb3RlU3RhcnRUaW1lOiB1MzIodm90ZU9wZW5UcyksCiAgICAvLyAgIGV4dFZvdGVFbmRUaW1lOiB1MzIodm90ZUVuZFRzKSwKICAgIC8vICAgZXh0VG90YWxWb3RpbmdQb3dlcjogY29tbWl0dGVlTWV0YWRhdGEuZXh0RGVsZWdhdGVkVm90ZXMsCiAgICAvLyAgIGV4dEFjY291bnRzUGVuZGluZ1ZvdGVzOiBjbG9uZShjb21taXR0ZWVNZXRhZGF0YS5leHREZWxlZ2F0ZWRBY2NvdW50Vm90ZXMpLAogICAgLy8gICBleHRBY2NvdW50c1ZvdGVkOiBbXSBhcyBBY2NvdW50SWRXaXRoVm90ZXNbXSwKICAgIC8vICAgaW50Vm90ZUVuZFRpbWU6IHUzMih2b3RlRW5kVHMgLSB0aGlzLnZvdGVTdWJtaXRUaHJlc2hvbGQudmFsdWUpLCAvLyBzZXQgaW50ZXJuYWwgdm90ZSBlbmQgdGltZSBlYXJsaWVyIHRoYW4gZXh0ZXJuYWwgdG8gYWxsb3cgZm9yIHZvdGUgc3VibWlzc2lvbiBiZWZvcmUgeEdvdiBwcm9wb3NhbCB2b3RpbmcgZW5kcwogICAgLy8gICBpbnRUb3RhbEFsZ29ob3VyczogdG90YWxBbGdvSG91cnMsCiAgICAvLyAgIGludFZvdGVkQWxnb2hvdXJzOiAwLAogICAgLy8gICBpbnRWb3Rlc1llc0FsZ29ob3VyczogMCwKICAgIC8vICAgaW50Vm90ZXNOb0FsZ29ob3VyczogMCwKICAgIC8vICAgaW50Vm90ZXNBYnN0YWluQWxnb2hvdXJzOiAwLAogICAgLy8gICBpbnRWb3Rlc0JveWNvdHRBbGdvaG91cnM6IDAsCiAgICAvLyB9CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjI4CiAgICAvLyBwcm9wb3NhbEJveC52YWx1ZSA9IGNsb25lKHByb3Bvc2FsTWV0YWRhdGEpCiAgICBkaWcgMQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGRpZyAxCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE2MQogICAgLy8gcHVibGljIHN5bmNQcm9wb3NhbE1ldGFkYXRhKHByb3Bvc2FsSWQ6IEFwcGxpY2F0aW9uKTogRGVsZWdhdG9yUHJvcG9zYWwgewogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKc3luY1Byb3Bvc2FsTWV0YWRhdGFfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgc3luY1Byb3Bvc2FsTWV0YWRhdGFfYm9vbF9tZXJnZUA5CgoKLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo6RGVsZWdhdG9yLnZvdGVJbnRlcm5hbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZvdGVJbnRlcm5hbDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDgKICAgIGJ5dGVjXzEgLy8gIiIKICAgIGR1cG4gMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjM4CiAgICAvLyBwdWJsaWMgdm90ZUludGVybmFsKHByb3Bvc2FsSWQ6IEFwcGxpY2F0aW9uLCB2b3RlckFjY291bnQ6IEFjY291bnQsIHZvdGU6IERlbGVnYXRvclZvdGUpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzL2Jhc2UvdHlwZXMuYWxnby50czo6RGVsZWdhdG9yVm90ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyNDAKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09PSB2b3RlckFjY291bnQsIGVyclVuYXV0aG9yaXplZCkKICAgIHR4biBTZW5kZXIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiB2b3RlSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAyNgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyNDAKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09PSB2b3RlckFjY291bnQsIGVyclVuYXV0aG9yaXplZCkKICAgIGJ5dGVjIDE4IC8vICJFUlI6QVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgp2b3RlSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjQyCiAgICAvLyBjb25zdCBwcm9wb3NhbEJveCA9IHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpCiAgICBkaWcgMgogICAgaXRvYgogICAgZHVwCiAgICBidXJ5IDIwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjg1CiAgICAvLyBwcm9wb3NhbHMgPSBCb3hNYXA8QXBwbGljYXRpb24sIERlbGVnYXRvclByb3Bvc2FsPih7IGtleVByZWZpeDogJ1AnIH0pCiAgICBieXRlYyA2IC8vICJQIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMTgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjQzCiAgICAvLyBlbnN1cmUocHJvcG9zYWxCb3guZXhpc3RzLCBlcnJQcm9wb3NhbE5vdEV4aXN0cykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogdm90ZUludGVybmFsX2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjQzCiAgICAvLyBlbnN1cmUocHJvcG9zYWxCb3guZXhpc3RzLCBlcnJQcm9wb3NhbE5vdEV4aXN0cykKICAgIGJ5dGVjIDE5IC8vICJFUlI6UF9OWCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgp2b3RlSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAzMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjQ0CiAgICAvLyBjb25zdCBwcm9wb3NhbCA9IGNsb25lKHByb3Bvc2FsQm94LnZhbHVlKQogICAgZGlnIDE2CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMjAKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjI0NQogICAgLy8gZW5zdXJlKHByb3Bvc2FsLnN0YXR1cyAhPT0gJ0NBTkMnLCBlcnJQcm9wb3NhbENhbmNlbGxlZCkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgcHVzaGludCA0NiAvLyA0NgogICAgZXh0cmFjdF91aW50MTYKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBwdXNoYnl0ZXMgIkNBTkMiCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogdm90ZUludGVybmFsX2FmdGVyX2lmX2Vsc2VAMzQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjQ1CiAgICAvLyBlbnN1cmUocHJvcG9zYWwuc3RhdHVzICE9PSAnQ0FOQycsIGVyclByb3Bvc2FsQ2FuY2VsbGVkKQogICAgcHVzaGJ5dGVzICJFUlI6UF9DIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnZvdGVJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDM0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyNDcKICAgIC8vIGNvbnN0IGNvbW1pdHRlZUJveCA9IHRoaXMuY29tbWl0dGVlcyhwcm9wb3NhbC5jb21taXR0ZWVJZCkKICAgIGRpZyAxNgogICAgcHVzaGludCAyIC8vIDIKICAgIGludGNfMyAvLyAzMgogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6ODMKICAgIC8vIGNvbW1pdHRlZXMgPSBCb3hNYXA8Q29tbWl0dGVlSWQsIERlbGVnYXRvckNvbW1pdHRlZT4oeyBrZXlQcmVmaXg6ICdDJyB9KQogICAgYnl0ZWMgNSAvLyAiQyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDIxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjI0OAogICAgLy8gZW5zdXJlKGNvbW1pdHRlZUJveC5leGlzdHMsIGVyckNvbW1pdHRlZU5vdEV4aXN0cykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogdm90ZUludGVybmFsX2FmdGVyX2lmX2Vsc2VAMzgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjQ4CiAgICAvLyBlbnN1cmUoY29tbWl0dGVlQm94LmV4aXN0cywgZXJyQ29tbWl0dGVlTm90RXhpc3RzKQogICAgYnl0ZWMgMTUgLy8gIkVSUjpDX05YIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnZvdGVJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDM4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyNDkKICAgIC8vIGNvbnN0IGNvbW1pdHRlZSA9IGNvbW1pdHRlZUJveC52YWx1ZSBhcyBSZWFkb25seTxEZWxlZ2F0b3JDb21taXR0ZWU+CiAgICBkaWcgMTkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBib3hfZXh0cmFjdAogICAgYnVyeSAyMgogICAgcHVzaGludCA0IC8vIDQKICAgIGR1cAogICAgYm94X2V4dHJhY3QKICAgIGJ1cnkgMjIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjUxCiAgICAvLyBlbnN1cmUocHJvcG9zYWwuZXh0Vm90ZVN0YXJ0VGltZS5hc1VpbnQ2NCgpIDw9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsIGVyckVhcmx5KQogICAgZGlnIDE2CiAgICBwdXNoaW50cyAzNCA0IC8vIDM0LCA0CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IHZvdGVJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDQyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjI1MQogICAgLy8gZW5zdXJlKHByb3Bvc2FsLmV4dFZvdGVTdGFydFRpbWUuYXNVaW50NjQoKSA8PSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wLCBlcnJFYXJseSkKICAgIGJ5dGVjIDIwIC8vICJFUlI6RUFSIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnZvdGVJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDQyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyNTIKICAgIC8vIGVuc3VyZShHbG9iYWwubGF0ZXN0VGltZXN0YW1wIDwgcHJvcG9zYWwuaW50Vm90ZUVuZFRpbWUuYXNVaW50NjQoKSwgZXJyTGF0ZSkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGRpZyAxNwogICAgcHVzaGludHMgNTAgNCAvLyA1MCwgNAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIDwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IHZvdGVJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDQ2CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjI1MgogICAgLy8gZW5zdXJlKEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPCBwcm9wb3NhbC5pbnRWb3RlRW5kVGltZS5hc1VpbnQ2NCgpLCBlcnJMYXRlKQogICAgYnl0ZWMgMjEgLy8gIkVSUjpMQVQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKdm90ZUludGVybmFsX2FmdGVyX2lmX2Vsc2VANDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjI1NQogICAgLy8gY29tbWl0dGVlLnBlcmlvZFN0YXJ0LmFzVWludDY0KCksCiAgICBkaWcgMjAKICAgIGJ0b2kKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyNTYKICAgIC8vIGNvbW1pdHRlZS5wZXJpb2RFbmQuYXNVaW50NjQoKSwKICAgIGRpZyAyMgogICAgYnRvaQogICAgZHVwCiAgICBidXJ5IDEzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQyNwogICAgLy8gZW5zdXJlKHBlcmlvZEVuZCA+IHBlcmlvZFN0YXJ0LCBlcnJQZXJpb2RFbmRMZXNzVGhhblN0YXJ0KQogICAgPAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogdm90ZUludGVybmFsX2FmdGVyX2lmX2Vsc2VANTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDI3CiAgICAvLyBlbnN1cmUocGVyaW9kRW5kID4gcGVyaW9kU3RhcnQsIGVyclBlcmlvZEVuZExlc3NUaGFuU3RhcnQpCiAgICBwdXNoYnl0ZXMgIkVSUjpQRV9MVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgp2b3RlSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA1MDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDI4CiAgICAvLyBlbnN1cmUocGVyaW9kU3RhcnQgJSBwZXJpb2RMZW5ndGggPT09IDAsIGVyclBlcmlvZFN0YXJ0SW52YWxpZCkKICAgIGRpZyA5CiAgICBpbnRjIDQgLy8gMTAwMDAwMAogICAgJQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBieiB2b3RlSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA1NAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0MjgKICAgIC8vIGVuc3VyZShwZXJpb2RTdGFydCAlIHBlcmlvZExlbmd0aCA9PT0gMCwgZXJyUGVyaW9kU3RhcnRJbnZhbGlkKQogICAgYnl0ZWNfMiAvLyAiRVJSOlBTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnZvdGVJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDU0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0MjkKICAgIC8vIGVuc3VyZShwZXJpb2RFbmQgJSBwZXJpb2RMZW5ndGggPT09IDAsIGVyclBlcmlvZEVuZEludmFsaWQpCiAgICBkaWcgMTAKICAgIGludGMgNCAvLyAxMDAwMDAwCiAgICAlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJ6IHZvdGVJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDU4CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQyOQogICAgLy8gZW5zdXJlKHBlcmlvZEVuZCAlIHBlcmlvZExlbmd0aCA9PT0gMCwgZXJyUGVyaW9kRW5kSW52YWxpZCkKICAgIHB1c2hieXRlcyAiRVJSOlBFIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnZvdGVJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDU4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0MzAKICAgIC8vIGNvbnN0IGFjY291bnRJZCA9IHRoaXMuZ2V0QWNjb3VudElkSWZFeGlzdHMoYWNjb3VudCkKICAgIGRpZyAxCiAgICBjYWxsc3ViIGdldEFjY291bnRJZElmRXhpc3RzCiAgICBkdXAKICAgIGJ1cnkgMjUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDMxCiAgICAvLyBpZiAoYWNjb3VudElkLmFzVWludDY0KCkgPT09IDApIHsKICAgIGJ0b2kKICAgIGJueiB2b3RlSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQzMgogICAgLy8gcmV0dXJuIDAKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDQKCnZvdGVJbnRlcm5hbF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6OkRlbGVnYXRvci5nZXRBZ2dyZWdhdGVkQWNjb3VudEFsZ29Ib3Vyc0AxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgZGlnIDMKICAgIGJueiB2b3RlSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxOAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyNTkKICAgIC8vIGVuc3VyZSh2b3RpbmdQb3dlciA+IDAsIGVyck5vVm90aW5nUG93ZXIpCiAgICBieXRlYyAxNCAvLyAiRVJSOkFfTlYiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKdm90ZUludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjI2MAogICAgLy8gY29uc3QgdG90YWxWb3Rlc0Nhc3Q6IHVpbnQ2NCA9IHZvdGUueWVzVm90ZXMgKyB2b3RlLm5vVm90ZXMgKyB2b3RlLmJveWNvdHRWb3RlcyArIHZvdGUuYWJzdGFpblZvdGVzCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDEwCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGRpZyAxCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDkKICAgICsKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgKwogICAgZHVwCiAgICBidXJ5IDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjI2MQogICAgLy8gZW5zdXJlKHRvdGFsVm90ZXNDYXN0ID09PSB2b3RpbmdQb3dlciwgZXJySW5jb3JyZWN0Vm90ZXMpCiAgICBkaWcgNAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IHZvdGVJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDIyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjI2MQogICAgLy8gZW5zdXJlKHRvdGFsVm90ZXNDYXN0ID09PSB2b3RpbmdQb3dlciwgZXJySW5jb3JyZWN0Vm90ZXMpCiAgICBwdXNoYnl0ZXMgIkVSUjpJViIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgp2b3RlSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjYzCiAgICAvLyBjb25zdCB2b3RlckFjY291bnRJZCA9IHRoaXMubXVzdEdldEFjY291bnRJZCh2b3RlckFjY291bnQpCiAgICBkaWcgMQogICAgY2FsbHN1YiBtdXN0R2V0QWNjb3VudElkCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjI2NAogICAgLy8gY29uc3Qgdm90ZUJveEtleTogVm90ZUtleSA9IFtwcm9wb3NhbElkLCB2b3RlckFjY291bnRJZF0KICAgIGRpZyAxOQogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjkxCiAgICAvLyB2b3RlcyA9IEJveE1hcDxWb3RlS2V5LCBEZWxlZ2F0b3JWb3RlPih7IGtleVByZWZpeDogJ1YnIH0pCiAgICBwdXNoYnl0ZXMgIlYiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSAxNwogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyNjcKICAgIC8vIGlmICh2b3RlQm94LmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiB2b3RlSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjI2OQogICAgLy8gY29uc3QgcHJldmlvdXNWb3RlID0gdm90ZUJveC52YWx1ZSBhcyBSZWFkb25seTxEZWxlZ2F0b3JWb3RlPgogICAgZGlnIDE1CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyNzEKICAgIC8vIHByb3Bvc2FsLmludFZvdGVkQWxnb2hvdXJzIC09IHRvdGFsVm90ZXNDYXN0CiAgICBkaWcgMjAKICAgIHB1c2hpbnQgNjIgLy8gNjIKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDEzCiAgICAtCiAgICBpdG9iCiAgICBkaWcgMjIKICAgIHN3YXAKICAgIHJlcGxhY2UyIDYyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjI3MgogICAgLy8gcHJvcG9zYWwuaW50Vm90ZXNZZXNBbGdvaG91cnMgLT0gcHJldmlvdXNWb3RlLnllc1ZvdGVzCiAgICBkdXAKICAgIHB1c2hpbnQgNzAgLy8gNzAKICAgIGV4dHJhY3RfdWludDY0CiAgICB1bmNvdmVyIDUKICAgIC0KICAgIGl0b2IKICAgIHJlcGxhY2UyIDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjI3MwogICAgLy8gcHJvcG9zYWwuaW50Vm90ZXNOb0FsZ29ob3VycyAtPSBwcmV2aW91c1ZvdGUubm9Wb3RlcwogICAgZHVwCiAgICBwdXNoaW50IDc4IC8vIDc4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciA0CiAgICAtCiAgICBpdG9iCiAgICByZXBsYWNlMiA3OAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyNzQKICAgIC8vIHByb3Bvc2FsLmludFZvdGVzQm95Y290dEFsZ29ob3VycyAtPSBwcmV2aW91c1ZvdGUuYm95Y290dFZvdGVzCiAgICBkdXAKICAgIHB1c2hpbnQgOTQgLy8gOTQKICAgIGV4dHJhY3RfdWludDY0CiAgICB1bmNvdmVyIDIKICAgIC0KICAgIGl0b2IKICAgIHJlcGxhY2UyIDk0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjI3NQogICAgLy8gcHJvcG9zYWwuaW50Vm90ZXNBYnN0YWluQWxnb2hvdXJzIC09IHByZXZpb3VzVm90ZS5hYnN0YWluVm90ZXMKICAgIGR1cAogICAgcHVzaGludCA4NiAvLyA4NgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgLQogICAgaXRvYgogICAgcmVwbGFjZTIgODYKICAgIGJ1cnkgMTgKCnZvdGVJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjI3OAogICAgLy8gaWYgKHByb3Bvc2FsLnN0YXR1cyAhPT0gJ1ZPVEUnKSB7CiAgICBkaWcgMTcKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTcKICAgIGR1cAogICAgcHVzaGludCA0NiAvLyA0NgogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYnVyeSAxNwogICAgc3dhcAogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDIyIC8vICJWT1RFIgogICAgIT0KICAgIGJ6IHZvdGVJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6Mjc5CiAgICAvLyBwcm9wb3NhbC5zdGF0dXMgPSAnVk9URScKICAgIGRpZyAxNwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZGlnIDE3CiAgICBkdXAKICAgIGNvdmVyIDQKICAgIGV4dHJhY3QzCiAgICBwdXNoYnl0ZXMgMHgwMDA0NTY0ZjU0NDUKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGxlbgogICAgZGlnIDIKICAgIGRpZyAxOAogICAgZHVwCiAgICBjb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMQogICAgdW5jb3ZlciA0CiAgICAtCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgNiAvLyA2CiAgICArCiAgICBkaWcgMQogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgcmVwbGFjZTIgNDYKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA0OCAvLyA0OAogICAgZXh0cmFjdF91aW50MTYKICAgIHB1c2hpbnQgNiAvLyA2CiAgICArCiAgICB1bmNvdmVyIDIKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiA0OAogICAgYnVyeSAxOAoKdm90ZUludGVybmFsX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjgxCiAgICAvLyBwcm9wb3NhbC5pbnRWb3RlZEFsZ29ob3VycyArPSB0b3RhbFZvdGVzQ2FzdAogICAgZGlnIDE3CiAgICBkdXAKICAgIHB1c2hpbnQgNjIgLy8gNjIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMTAKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDYyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjI4MgogICAgLy8gcHJvcG9zYWwuaW50Vm90ZXNZZXNBbGdvaG91cnMgKz0gdm90ZS55ZXNWb3RlcwogICAgZHVwCiAgICBwdXNoaW50IDcwIC8vIDcwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDkKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjI4MwogICAgLy8gcHJvcG9zYWwuaW50Vm90ZXNOb0FsZ29ob3VycyArPSB2b3RlLm5vVm90ZXMKICAgIGR1cAogICAgcHVzaGludCA3OCAvLyA3OAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA4CiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiA3OAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyODQKICAgIC8vIHByb3Bvc2FsLmludFZvdGVzQm95Y290dEFsZ29ob3VycyArPSB2b3RlLmJveWNvdHRWb3RlcwogICAgZHVwCiAgICBwdXNoaW50IDk0IC8vIDk0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDcKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDk0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjI4NQogICAgLy8gcHJvcG9zYWwuaW50Vm90ZXNBYnN0YWluQWxnb2hvdXJzICs9IHZvdGUuYWJzdGFpblZvdGVzCiAgICBkdXAKICAgIHB1c2hpbnQgODYgLy8gODYKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgNgogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgODYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6Mjg2CiAgICAvLyB2b3RlQm94LnZhbHVlID0gY2xvbmUodm90ZSkKICAgIGRpZyAxNgogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6Mjg3CiAgICAvLyBwcm9wb3NhbEJveC52YWx1ZSA9IGNsb25lKHByb3Bvc2FsKQogICAgZGlnIDE3CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyMzgKICAgIC8vIHB1YmxpYyB2b3RlSW50ZXJuYWwocHJvcG9zYWxJZDogQXBwbGljYXRpb24sIHZvdGVyQWNjb3VudDogQWNjb3VudCwgdm90ZTogRGVsZWdhdG9yVm90ZSk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKdm90ZUludGVybmFsX2FmdGVyX2lmX2Vsc2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDM0CiAgICAvLyBsZXQgYWxnb2hvdXJzOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMwogICAgZGlnIDkKICAgIGJ1cnkgMTIKCnZvdGVJbnRlcm5hbF93aGlsZV90b3BAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDM1CiAgICAvLyBmb3IgKGxldCBwZXJpb2QgPSBwZXJpb2RTdGFydDsgcGVyaW9kIDwgcGVyaW9kRW5kOyBwZXJpb2QgKz0gcGVyaW9kTGVuZ3RoKSB7CiAgICBkaWcgMTEKICAgIGRpZyAxMQogICAgPAogICAgYnogdm90ZUludGVybmFsX2FmdGVyX3doaWxlQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQzNgogICAgLy8gY29uc3Qga2V5OiBBbGdvaG91ckFjY291bnRLZXkgPSBbcGVyaW9kLCBhY2NvdW50SWRdCiAgICBkaWcgMTEKICAgIGl0b2IKICAgIGRpZyAyNAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjg5CiAgICAvLyBhbGdvaG91ckFjY291bnRzID0gQm94TWFwPEFsZ29ob3VyQWNjb3VudEtleSwgdWludDY0Pih7IGtleVByZWZpeDogJ2gnIH0pCiAgICBieXRlYyA4IC8vICJoIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDM4CiAgICAvLyBhbGdvaG91cnMgKz0gYm94LmV4aXN0cyA/IGJveC52YWx1ZSA6IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogdm90ZUludGVybmFsX3Rlcm5hcnlfZmFsc2VAMTIKICAgIGRpZyAyMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGJ0b2kKCnZvdGVJbnRlcm5hbF90ZXJuYXJ5X21lcmdlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0MzgKICAgIC8vIGFsZ29ob3VycyArPSBib3guZXhpc3RzID8gYm94LnZhbHVlIDogMAogICAgZGlnIDEzCiAgICArCiAgICBidXJ5IDEzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQzNQogICAgLy8gZm9yIChsZXQgcGVyaW9kID0gcGVyaW9kU3RhcnQ7IHBlcmlvZCA8IHBlcmlvZEVuZDsgcGVyaW9kICs9IHBlcmlvZExlbmd0aCkgewogICAgZGlnIDExCiAgICBpbnRjIDQgLy8gMTAwMDAwMAogICAgKwogICAgYnVyeSAxMgogICAgYiB2b3RlSW50ZXJuYWxfd2hpbGVfdG9wQDkKCnZvdGVJbnRlcm5hbF90ZXJuYXJ5X2ZhbHNlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0MzgKICAgIC8vIGFsZ29ob3VycyArPSBib3guZXhpc3RzID8gYm94LnZhbHVlIDogMAogICAgaW50Y18wIC8vIDAKICAgIGIgdm90ZUludGVybmFsX3Rlcm5hcnlfbWVyZ2VAMTMKCnZvdGVJbnRlcm5hbF9hZnRlcl93aGlsZUAxNDoKICAgIGRpZyAxMgogICAgYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjI1NC0yNTgKICAgIC8vIGNvbnN0IHZvdGluZ1Bvd2VyID0gdGhpcy5nZXRBZ2dyZWdhdGVkQWNjb3VudEFsZ29Ib3VycygKICAgIC8vICAgY29tbWl0dGVlLnBlcmlvZFN0YXJ0LmFzVWludDY0KCksCiAgICAvLyAgIGNvbW1pdHRlZS5wZXJpb2RFbmQuYXNVaW50NjQoKSwKICAgIC8vICAgdm90ZXJBY2NvdW50LAogICAgLy8gKQogICAgYiB2b3RlSW50ZXJuYWxfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjpEZWxlZ2F0b3IuZ2V0QWdncmVnYXRlZEFjY291bnRBbGdvSG91cnNAMTUKCgovLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjpEZWxlZ2F0b3Iudm90ZUV4dGVybmFsW3JvdXRpbmddKCkgLT4gdm9pZDoKdm90ZUV4dGVybmFsOgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMwogICAgYnl0ZWNfMSAvLyAiIgogICAgZHVwbiA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjMwMQogICAgLy8gcHVibGljIHZvdGVFeHRlcm5hbChwcm9wb3NhbElkOiBBcHBsaWNhdGlvbiwgZXh0QWNjb3VudHM6IEFjY291bnRbXSk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50Y18zIC8vIDMyCiAgICAqCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YWNjb3VudD4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzAyCiAgICAvLyBjb25zdCBwcm9wb3NhbEJveCA9IHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjg1CiAgICAvLyBwcm9wb3NhbHMgPSBCb3hNYXA8QXBwbGljYXRpb24sIERlbGVnYXRvclByb3Bvc2FsPih7IGtleVByZWZpeDogJ1AnIH0pCiAgICBieXRlYyA2IC8vICJQIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzAzCiAgICAvLyBlbnN1cmUocHJvcG9zYWxCb3guZXhpc3RzLCBlcnJQcm9wb3NhbE5vdEV4aXN0cykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogdm90ZUV4dGVybmFsX2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzAzCiAgICAvLyBlbnN1cmUocHJvcG9zYWxCb3guZXhpc3RzLCBlcnJQcm9wb3NhbE5vdEV4aXN0cykKICAgIGJ5dGVjIDE5IC8vICJFUlI6UF9OWCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgp2b3RlRXh0ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzA0CiAgICAvLyBjb25zdCBwcm9wb3NhbCA9IGNsb25lKHByb3Bvc2FsQm94LnZhbHVlKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTUKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjMwNgogICAgLy8gZW5zdXJlKHByb3Bvc2FsLnN0YXR1cyA9PT0gJ1ZPVEUnLCBlcnJTdGF0ZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgcHVzaGludCA0NiAvLyA0NgogICAgZXh0cmFjdF91aW50MTYKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlYyAyMiAvLyAiVk9URSIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiB2b3RlRXh0ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozMDYKICAgIC8vIGVuc3VyZShwcm9wb3NhbC5zdGF0dXMgPT09ICdWT1RFJywgZXJyU3RhdGUpCiAgICBieXRlYyAxNiAvLyAiRVJSOlNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnZvdGVFeHRlcm5hbF9hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozMDgKICAgIC8vIGVuc3VyZShwcm9wb3NhbC5leHRWb3RlU3RhcnRUaW1lLmFzVWludDY0KCkgPD0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwgZXJyRWFybHkpCiAgICBkdXAKICAgIHB1c2hpbnRzIDM0IDQgLy8gMzQsIDQKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogdm90ZUV4dGVybmFsX2FmdGVyX2lmX2Vsc2VAMjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzA4CiAgICAvLyBlbnN1cmUocHJvcG9zYWwuZXh0Vm90ZVN0YXJ0VGltZS5hc1VpbnQ2NCgpIDw9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsIGVyckVhcmx5KQogICAgYnl0ZWMgMjAgLy8gIkVSUjpFQVIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKdm90ZUV4dGVybmFsX2FmdGVyX2lmX2Vsc2VAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjMwOQogICAgLy8gZW5zdXJlKEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPCBwcm9wb3NhbC5leHRWb3RlRW5kVGltZS5hc1VpbnQ2NCgpLCBlcnJMYXRlKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZGlnIDEKICAgIHB1c2hpbnRzIDM4IDQgLy8gMzgsIDQKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICA8CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiB2b3RlRXh0ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozMDkKICAgIC8vIGVuc3VyZShHbG9iYWwubGF0ZXN0VGltZXN0YW1wIDwgcHJvcG9zYWwuZXh0Vm90ZUVuZFRpbWUuYXNVaW50NjQoKSwgZXJyTGF0ZSkKICAgIGJ5dGVjIDIxIC8vICJFUlI6TEFUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnZvdGVFeHRlcm5hbF9hZnRlcl9pZl9lbHNlQDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozMTAKICAgIC8vIGVuc3VyZShwcm9wb3NhbC5pbnRWb3RlZEFsZ29ob3VycyA+IDAsIGVyck5vVm90ZXMpCiAgICBkdXAKICAgIHB1c2hpbnQgNjIgLy8gNjIKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZHVwCiAgICBidXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IHZvdGVFeHRlcm5hbF9hZnRlcl9pZl9lbHNlQDM2CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjMxMAogICAgLy8gZW5zdXJlKHByb3Bvc2FsLmludFZvdGVkQWxnb2hvdXJzID4gMCwgZXJyTm9Wb3RlcykKICAgIHB1c2hieXRlcyAiRVJSOk5WIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnZvdGVFeHRlcm5hbF9hZnRlcl9pZl9lbHNlQDM2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozMTEKICAgIC8vIGVuc3VyZShleHRBY2NvdW50cy5sZW5ndGggPT09IHByb3Bvc2FsLmV4dEFjY291bnRzUGVuZGluZ1ZvdGVzLmxlbmd0aCwgZXJyQWNjb3VudE51bU1pc21hdGNoKQogICAgZHVwbiAyCiAgICBwdXNoaW50cyA0NiAyIC8vIDQ2LCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgcHVzaGludCAyIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IHZvdGVFeHRlcm5hbF9hZnRlcl9pZl9lbHNlQDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjMxMQogICAgLy8gZW5zdXJlKGV4dEFjY291bnRzLmxlbmd0aCA9PT0gcHJvcG9zYWwuZXh0QWNjb3VudHNQZW5kaW5nVm90ZXMubGVuZ3RoLCBlcnJBY2NvdW50TnVtTWlzbWF0Y2gpCiAgICBwdXNoYnl0ZXMgIkVSUjpBTk0iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKdm90ZUV4dGVybmFsX2FmdGVyX2lmX2Vsc2VANDA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjMxMwogICAgLy8gbGV0IHRvdGFsQXBwcm92YWxzOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjMxNAogICAgLy8gbGV0IHRvdGFsUmVqZWN0aW9uczogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozMTUKICAgIC8vIGNvbnN0IGlzQm95Y290dCA9IHByb3Bvc2FsLmludFZvdGVzQm95Y290dEFsZ29ob3VycyAqIDIgPj0gcHJvcG9zYWwuaW50VG90YWxBbGdvaG91cnMKICAgIGR1cG4gMgogICAgcHVzaGludCA5NCAvLyA5NAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBwdXNoaW50IDIgLy8gMgogICAgKgogICAgc3dhcAogICAgcHVzaGludCA1NCAvLyA1NAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkdXAKICAgIGJ1cnkgNwogICAgPj0KICAgIGR1cAogICAgYnVyeSAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozMTYKICAgIC8vIGlmICghaXNCb3ljb3R0KSB7CiAgICBibnogdm90ZUV4dGVybmFsX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozMTcKICAgIC8vIGNvbnN0IGRlbm9taW5hdG9yID0gdGhpcy5hYnNlbnRlZU1vZGUudmFsdWUgPT09ICdzY2FsZWQnID8gcHJvcG9zYWwuaW50Vm90ZWRBbGdvaG91cnMgOiBwcm9wb3NhbC5pbnRUb3RhbEFsZ29ob3VycwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6ODEKICAgIC8vIGFic2VudGVlTW9kZSA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBpbml0aWFsVmFsdWU6ICdzdHJpY3QnIH0pCiAgICBieXRlYyAxMiAvLyAiYWJzZW50ZWVNb2RlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozMTcKICAgIC8vIGNvbnN0IGRlbm9taW5hdG9yID0gdGhpcy5hYnNlbnRlZU1vZGUudmFsdWUgPT09ICdzY2FsZWQnID8gcHJvcG9zYWwuaW50Vm90ZWRBbGdvaG91cnMgOiBwcm9wb3NhbC5pbnRUb3RhbEFsZ29ob3VycwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHB1c2hieXRlcyAic2NhbGVkIgogICAgPT0KICAgIGJ6IHZvdGVFeHRlcm5hbF90ZXJuYXJ5X2ZhbHNlQDQKICAgIGRpZyA1Cgp2b3RlRXh0ZXJuYWxfdGVybmFyeV9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozMTgKICAgIC8vIHRvdGFsQXBwcm92YWxzID0gKHByb3Bvc2FsLmludFZvdGVzWWVzQWxnb2hvdXJzICogcHJvcG9zYWwuZXh0VG90YWxWb3RpbmdQb3dlci5hc1VpbnQ2NCgpKSAvIGRlbm9taW5hdG9yCiAgICBkaWcgMQogICAgZHVwCiAgICBwdXNoaW50IDcwIC8vIDcwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAxCiAgICBwdXNoaW50cyA0MiA0IC8vIDQyLCA0CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgc3dhcAogICAgZGlnIDEKICAgICoKICAgIGRpZyAzCiAgICAvCiAgICBidXJ5IDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjMxOQogICAgLy8gdG90YWxSZWplY3Rpb25zID0gKHByb3Bvc2FsLmludFZvdGVzTm9BbGdvaG91cnMgKiBwcm9wb3NhbC5leHRUb3RhbFZvdGluZ1Bvd2VyLmFzVWludDY0KCkpIC8gZGVub21pbmF0b3IKICAgIHN3YXAKICAgIHB1c2hpbnQgNzggLy8gNzgKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgKgogICAgc3dhcAogICAgLwogICAgYnVyeSA3Cgp2b3RlRXh0ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozMjQKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBleHRBY2NvdW50cy5sZW5ndGg7IGkrKykgewogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTAKCnZvdGVFeHRlcm5hbF93aGlsZV90b3BANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzI0CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgZXh0QWNjb3VudHMubGVuZ3RoOyBpKyspIHsKICAgIGRpZyA5CiAgICBkaWcgMgogICAgPAogICAgYnogdm90ZUV4dGVybmFsX2FmdGVyX3doaWxlQDEzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjMyNQogICAgLy8gY29uc3QgZXh0QWNjb3VudCA9IGV4dEFjY291bnRzW2ldCiAgICBkaWcgMgogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gMzIKICAgICoKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGJ1cnkgMTgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2FjY291bnQtaWQuYWxnby50czo5CiAgICAvLyBhY2NvdW50SWRzID0gQm94TWFwPEFjY291bnQsIFVpbnQzMj4oeyBrZXlQcmVmaXg6ICdhJyB9KQogICAgYnl0ZWMgOSAvLyAiYSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozMjYKICAgIC8vIGNvbnN0IGV4dEFjY291bnRJZCA9IHRoaXMuYWNjb3VudElkcyhleHRBY2NvdW50KS52YWx1ZQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzI3CiAgICAvLyBjb25zdCBleHRBY2NvdW50c1BlbmRpbmdWb3RlID0gY2xvbmUocHJvcG9zYWwuZXh0QWNjb3VudHNQZW5kaW5nVm90ZXNbaV0pCiAgICBkaWcgMTQKICAgIGR1cAogICAgcHVzaGludCA0NiAvLyA0NgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBwdXNoaW50IDQ4IC8vIDQ4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBidXJ5IDE3CiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGJ1cnkgMTgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzI3LTMyOAogICAgLy8gY29uc3QgZXh0QWNjb3VudHNQZW5kaW5nVm90ZSA9IGNsb25lKHByb3Bvc2FsLmV4dEFjY291bnRzUGVuZGluZ1ZvdGVzW2ldKQogICAgLy8gZW5zdXJlRXh0cmEoZXh0QWNjb3VudElkID09PSBleHRBY2NvdW50c1BlbmRpbmdWb3RlLmFjY291bnRJZCwgZXJyQWNjb3VudElkTWlzbWF0Y2gsIG9wLml0b2IoaSkpCiAgICBleHRyYWN0IDAgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozMjgKICAgIC8vIGVuc3VyZUV4dHJhKGV4dEFjY291bnRJZCA9PT0gZXh0QWNjb3VudHNQZW5kaW5nVm90ZS5hY2NvdW50SWQsIGVyckFjY291bnRJZE1pc21hdGNoLCBvcC5pdG9iKGkpKQogICAgPT0KICAgIHN3YXAKICAgIGl0b2IKICAgIGJ1cnkgMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6NDAKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IHZvdGVFeHRlcm5hbF9hZnRlcl9pZl9lbHNlQDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjQxCiAgICAvLyBsb2coZXh0cmEpCiAgICBkaWcgMTMKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozMjgKICAgIC8vIGVuc3VyZUV4dHJhKGV4dEFjY291bnRJZCA9PT0gZXh0QWNjb3VudHNQZW5kaW5nVm90ZS5hY2NvdW50SWQsIGVyckFjY291bnRJZE1pc21hdGNoLCBvcC5pdG9iKGkpKQogICAgcHVzaGJ5dGVzICJFUlI6SUQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjQyCiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czo0MwogICAgLy8gZXJyKCkKICAgIGVycgoKdm90ZUV4dGVybmFsX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjMzMgogICAgLy8gaWYgKGlzQm95Y290dCkgewogICAgZGlnIDgKICAgIGJ6IHZvdGVFeHRlcm5hbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzMzCiAgICAvLyBhcHByb3ZhbHMgPSBleHRBY2NvdW50c1BlbmRpbmdWb3RlLnZvdGVzLmFzVWludDY0KCkKICAgIGRpZyAxNAogICAgcHVzaGludCA0IC8vIDQKICAgIGV4dHJhY3RfdWludDMyCiAgICBkdXAKICAgIGJ1cnkgMTIKCnZvdGVFeHRlcm5hbF9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozNDItMzQ1CiAgICAvLyBjb21waWxlQXJjNChYR292UHJvcG9zYWxNb2NrKS5jYWxsLnZvdGUoewogICAgLy8gICBhcHBJZDogcHJvcG9zYWxJZCwKICAgIC8vICAgYXJnczogW2V4dEFjY291bnQsIGFwcHJvdmFscywgcmVqZWN0aW9uc10sCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozNDQKICAgIC8vIGFyZ3M6IFtleHRBY2NvdW50LCBhcHByb3ZhbHMsIHJlamVjdGlvbnNdLAogICAgZGlnIDExCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjM0Mi0zNDUKICAgIC8vIGNvbXBpbGVBcmM0KFhHb3ZQcm9wb3NhbE1vY2spLmNhbGwudm90ZSh7CiAgICAvLyAgIGFwcElkOiBwcm9wb3NhbElkLAogICAgLy8gICBhcmdzOiBbZXh0QWNjb3VudCwgYXBwcm92YWxzLCByZWplY3Rpb25zXSwKICAgIC8vIH0pCiAgICBwdXNoYnl0ZXMgMHgxODQxYTBkMiAvLyBtZXRob2QgInZvdGUoYWRkcmVzcyx1aW50NjQsdWludDY0KXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgMTcKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgZGlnIDMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzQ2CiAgICAvLyBwcm9wb3NhbC5leHRBY2NvdW50c1ZvdGVkLnB1c2goZXh0QWNjb3VudHNQZW5kaW5nVm90ZSkKICAgIGRpZyAxMgogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBkaWcgMTQKICAgIGR1cAogICAgY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGRpZyAxOAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgZXh0cmFjdDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnVyeSAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozMjQKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBleHRBY2NvdW50cy5sZW5ndGg7IGkrKykgewogICAgZGlnIDkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEwCiAgICBiIHZvdGVFeHRlcm5hbF93aGlsZV90b3BANwoKdm90ZUV4dGVybmFsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzM3CiAgICAvLyBhcHByb3ZhbHMgPSAodG90YWxBcHByb3ZhbHMgKiBleHRBY2NvdW50c1BlbmRpbmdWb3RlLnZvdGVzLmFzVWludDY0KCkpIC8gcHJvcG9zYWwuZXh0VG90YWxWb3RpbmdQb3dlci5hc1VpbnQ2NCgpCiAgICBkaWcgMTQKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBleHRyYWN0X3VpbnQzMgogICAgZGlnIDgKICAgIGRpZyAxCiAgICAqCiAgICBkaWcgMTQKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgIGV4dHJhY3RfdWludDMyCiAgICBzd2FwCiAgICBkaWcgMQogICAgLwogICAgYnVyeSAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozMzkKICAgIC8vICh0b3RhbFJlamVjdGlvbnMgKiBleHRBY2NvdW50c1BlbmRpbmdWb3RlLnZvdGVzLmFzVWludDY0KCkpIC8gcHJvcG9zYWwuZXh0VG90YWxWb3RpbmdQb3dlci5hc1VpbnQ2NCgpCiAgICBkaWcgOAogICAgdW5jb3ZlciAyCiAgICAqCiAgICBzd2FwCiAgICAvCiAgICBiIHZvdGVFeHRlcm5hbF9hZnRlcl9pZl9lbHNlQDExCgp2b3RlRXh0ZXJuYWxfYWZ0ZXJfd2hpbGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjM0OAogICAgLy8gcHJvcG9zYWwuZXh0QWNjb3VudHNQZW5kaW5nVm90ZXMgPSBbXQogICAgZGlnIDEyCiAgICBkdXAKICAgIHB1c2hpbnQgNDYgLy8gNDYKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGRpZyAyCiAgICBleHRyYWN0MwogICAgYnl0ZWMgMTcgLy8gMHgwMDAwCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBwdXNoaW50IDQ4IC8vIDQ4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciA0CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIHVuY292ZXIgMwogICAgLQogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgc3dhcAogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDQ4CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjM0OQogICAgLy8gcHJvcG9zYWwuc3RhdHVzID0gJ1ZPVEQnCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBkaWcgMgogICAgZXh0cmFjdDMKICAgIHB1c2hieXRlcyAweDAwMDQ1NjRmNTQ0NAogICAgY29uY2F0CiAgICBkaWcgMgogICAgcHVzaGludCA0NiAvLyA0NgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA0CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIHVuY292ZXIgMwogICAgLQogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDYgLy8gNgogICAgKwogICAgZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIHJlcGxhY2UyIDQ2CiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgNDggLy8gNDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDYgLy8gNgogICAgKwogICAgdW5jb3ZlciAyCiAgICAtCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgNDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzUwCiAgICAvLyBwcm9wb3NhbEJveC52YWx1ZSA9IGNsb25lKHByb3Bvc2FsKQogICAgZGlnIDEKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjMwMQogICAgLy8gcHVibGljIHZvdGVFeHRlcm5hbChwcm9wb3NhbElkOiBBcHBsaWNhdGlvbiwgZXh0QWNjb3VudHM6IEFjY291bnRbXSk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKdm90ZUV4dGVybmFsX3Rlcm5hcnlfZmFsc2VANDoKICAgIGRpZyA0CiAgICBiIHZvdGVFeHRlcm5hbF90ZXJuYXJ5X21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjpEZWxlZ2F0b3IuYWRkQWNjb3VudEFsZ29Ib3Vyc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFkZEFjY291bnRBbGdvSG91cnM6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18xIC8vICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzU4CiAgICAvLyBwdWJsaWMgYWRkQWNjb3VudEFsZ29Ib3VycyhwZXJpb2RTdGFydDogdWludDY0LCBhY2NvdW50QWxnb2hvdXJJbnB1dHM6IEFjY291bnRBbGdvaG91cklucHV0W10pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgICoKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMvYmFzZS90eXBlcy5hbGdvLnRzOjpBY2NvdW50QWxnb2hvdXJJbnB1dD4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzU5CiAgICAvLyB0aGlzLmVuc3VyZUNhbGxlcklzQWRtaW4oKQogICAgY2FsbHN1YiBlbnN1cmVDYWxsZXJJc0FkbWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjM2MAogICAgLy8gZW5zdXJlKHBlcmlvZFN0YXJ0ICUgcGVyaW9kTGVuZ3RoID09PSAwLCBlcnJQZXJpb2RTdGFydEludmFsaWQpCiAgICBpbnRjIDQgLy8gMTAwMDAwMAogICAgJQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBieiBhZGRBY2NvdW50QWxnb0hvdXJzX2FmdGVyX2lmX2Vsc2VAMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzYwCiAgICAvLyBlbnN1cmUocGVyaW9kU3RhcnQgJSBwZXJpb2RMZW5ndGggPT09IDAsIGVyclBlcmlvZFN0YXJ0SW52YWxpZCkKICAgIGJ5dGVjXzIgLy8gIkVSUjpQUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgphZGRBY2NvdW50QWxnb0hvdXJzX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA0CgphZGRBY2NvdW50QWxnb0hvdXJzX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzYyCiAgICAvLyBmb3IgKGxldCB7IGFjY291bnQsIGhvdXJzIH0gb2YgY2xvbmUoYWNjb3VudEFsZ29ob3VySW5wdXRzKSkgewogICAgZGlnIDMKICAgIGRpZyAxCiAgICA8CiAgICBieiBhZGRBY2NvdW50QWxnb0hvdXJzX2FmdGVyX2ZvckA4CiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyA0CiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICAqCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTEKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozNjMKICAgIC8vIGNvbnN0IGFjY291bnRJZCA9IHRoaXMuZ2V0T3JDcmVhdGVBY2NvdW50SWQoYWNjb3VudCkKICAgIGNhbGxzdWIgZ2V0T3JDcmVhdGVBY2NvdW50SWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzY0CiAgICAvLyBjb25zdCBrZXk6IEFsZ29ob3VyQWNjb3VudEtleSA9IFtwZXJpb2RTdGFydCwgYWNjb3VudElkXQogICAgZGlnIDMKICAgIGl0b2IKICAgIGR1cAogICAgYnVyeSAxMAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjg5CiAgICAvLyBhbGdvaG91ckFjY291bnRzID0gQm94TWFwPEFsZ29ob3VyQWNjb3VudEtleSwgdWludDY0Pih7IGtleVByZWZpeDogJ2gnIH0pCiAgICBieXRlYyA4IC8vICJoIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozNjYKICAgIC8vIGVuc3VyZUV4dHJhKCFib3guZXhpc3RzLCBlcnJBbGdvSG91cnNFeGlzdCwgYWNjb3VudC5ieXRlcykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czo0MAogICAgLy8gaWYgKCFjb25kKSB7CiAgICBieiBhZGRBY2NvdW50QWxnb0hvdXJzX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6NDEKICAgIC8vIGxvZyhleHRyYSkKICAgIGRpZyA4CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzY2CiAgICAvLyBlbnN1cmVFeHRyYSghYm94LmV4aXN0cywgZXJyQWxnb0hvdXJzRXhpc3QsIGFjY291bnQuYnl0ZXMpCiAgICBwdXNoYnl0ZXMgIkVSUjpBSF9FWCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6NDIKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjQzCiAgICAvLyBlcnIoKQogICAgZXJyCgphZGRBY2NvdW50QWxnb0hvdXJzX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjM2NwogICAgLy8gYm94LnZhbHVlID0gaG91cnMKICAgIGRpZyA0CiAgICBpdG9iCiAgICBkdXAKICAgIGJ1cnkgNwogICAgZGlnIDcKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6ODcKICAgIC8vIGFsZ29ob3VyUGVyaW9kVG90YWxzID0gQm94TWFwPHVpbnQ2NCwgQWxnb2hvdXJQZXJpb2RUb3RhbHM+KHsga2V5UHJlZml4OiAnSCcgfSkKICAgIGJ5dGVjXzMgLy8gIkgiCiAgICBkaWcgOAogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzcwCiAgICAvLyBpZiAodG90YWxCb3guZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZEFjY291bnRBbGdvSG91cnNfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzcxCiAgICAvLyB0b3RhbEJveC52YWx1ZS50b3RhbEFsZ29ob3VycyArPSBob3VycwogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgNgogICAgKwogICAgaXRvYgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCgphZGRBY2NvdW50QWxnb0hvdXJzX2FmdGVyX2lmX2Vsc2VANjoKICAgIGRpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA0CiAgICBiIGFkZEFjY291bnRBbGdvSG91cnNfZm9yX2hlYWRlckAyCgphZGRBY2NvdW50QWxnb0hvdXJzX2Vsc2VfYm9keUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozNzMKICAgIC8vIHRvdGFsQm94LnZhbHVlID0geyB0b3RhbEFsZ29ob3VyczogaG91cnMsIGZpbmFsOiBmYWxzZSB9CiAgICBkaWcgNgogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGNvbmNhdAogICAgYm94X3B1dAogICAgYiBhZGRBY2NvdW50QWxnb0hvdXJzX2FmdGVyX2lmX2Vsc2VANgoKYWRkQWNjb3VudEFsZ29Ib3Vyc19hZnRlcl9mb3JAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzU4CiAgICAvLyBwdWJsaWMgYWRkQWNjb3VudEFsZ29Ib3VycyhwZXJpb2RTdGFydDogdWludDY0LCBhY2NvdW50QWxnb2hvdXJJbnB1dHM6IEFjY291bnRBbGdvaG91cklucHV0W10pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjpEZWxlZ2F0b3IucmVtb3ZlQWNjb3VudEFsZ29Ib3Vyc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlbW92ZUFjY291bnRBbGdvSG91cnM6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18xIC8vICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzgzCiAgICAvLyBwdWJsaWMgcmVtb3ZlQWNjb3VudEFsZ29Ib3VycyhwZXJpb2RTdGFydDogdWludDY0LCBhY2NvdW50QWxnb2hvdXJJbnB1dHM6IEFjY291bnRBbGdvaG91cklucHV0W10pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgICoKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMvYmFzZS90eXBlcy5hbGdvLnRzOjpBY2NvdW50QWxnb2hvdXJJbnB1dD4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6Mzg0CiAgICAvLyB0aGlzLmVuc3VyZUNhbGxlcklzQWRtaW4oKQogICAgY2FsbHN1YiBlbnN1cmVDYWxsZXJJc0FkbWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjM4NQogICAgLy8gZW5zdXJlKHBlcmlvZFN0YXJ0ICUgcGVyaW9kTGVuZ3RoID09PSAwLCBlcnJQZXJpb2RTdGFydEludmFsaWQpCiAgICBpbnRjIDQgLy8gMTAwMDAwMAogICAgJQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBieiByZW1vdmVBY2NvdW50QWxnb0hvdXJzX2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6Mzg1CiAgICAvLyBlbnN1cmUocGVyaW9kU3RhcnQgJSBwZXJpb2RMZW5ndGggPT09IDAsIGVyclBlcmlvZFN0YXJ0SW52YWxpZCkKICAgIGJ5dGVjXzIgLy8gIkVSUjpQUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgpyZW1vdmVBY2NvdW50QWxnb0hvdXJzX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA0CgpyZW1vdmVBY2NvdW50QWxnb0hvdXJzX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6Mzg3CiAgICAvLyBmb3IgKGxldCB7IGFjY291bnQsIGhvdXJzIH0gb2YgY2xvbmUoYWNjb3VudEFsZ29ob3VySW5wdXRzKSkgewogICAgZGlnIDMKICAgIGRpZyAxCiAgICA8CiAgICBieiByZW1vdmVBY2NvdW50QWxnb0hvdXJzX2FmdGVyX2ZvckA1CiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyA0CiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICAqCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTEKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozODgKICAgIC8vIGNvbnN0IGFjY291bnRJZCA9IHRoaXMubXVzdEdldEFjY291bnRJZChhY2NvdW50KQogICAgY2FsbHN1YiBtdXN0R2V0QWNjb3VudElkCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjM4OQogICAgLy8gY29uc3Qga2V5OiBBbGdvaG91ckFjY291bnRLZXkgPSBbcGVyaW9kU3RhcnQsIGFjY291bnRJZF0KICAgIGRpZyAzCiAgICBpdG9iCiAgICBkdXAKICAgIGJ1cnkgMTAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo4OQogICAgLy8gYWxnb2hvdXJBY2NvdW50cyA9IEJveE1hcDxBbGdvaG91ckFjY291bnRLZXksIHVpbnQ2ND4oeyBrZXlQcmVmaXg6ICdoJyB9KQogICAgYnl0ZWMgOCAvLyAiaCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzkxCiAgICAvLyBlbnN1cmVFeHRyYShib3guZXhpc3RzLCBlcnJBbGdvSG91cnNOb3RFeGlzdCwgYWNjb3VudC5ieXRlcykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czo0MAogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogcmVtb3ZlQWNjb3VudEFsZ29Ib3Vyc19hZnRlcl9pZl9lbHNlQDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6NDEKICAgIC8vIGxvZyhleHRyYSkKICAgIGRpZyA4CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzkxCiAgICAvLyBlbnN1cmVFeHRyYShib3guZXhpc3RzLCBlcnJBbGdvSG91cnNOb3RFeGlzdCwgYWNjb3VudC5ieXRlcykKICAgIGJ5dGVjIDcgLy8gIkVSUjpBSF9OWCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6NDIKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjQzCiAgICAvLyBlcnIoKQogICAgZXJyCgpyZW1vdmVBY2NvdW50QWxnb0hvdXJzX2FmdGVyX2lmX2Vsc2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzkyCiAgICAvLyBlbnN1cmVFeHRyYShib3gudmFsdWUgPT09IGhvdXJzLCBlcnJBbGdvSG91cnNNaXNtYXRjaCwgYWNjb3VudC5ieXRlcykgLy8gZW5zdXJlIGhvdXJzIHRvIHJlbW92ZSBtYXRjaGVzIGV4aXN0aW5nIGhvdXJzIHRvIHByZXZlbnQgYWNjaWRlbnRhbCBkb3VibGUgcmVtb3ZhbAogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBidG9pCiAgICBkaWcgNQogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6NDAKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IHJlbW92ZUFjY291bnRBbGdvSG91cnNfYWZ0ZXJfaWZfZWxzZUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czo0MQogICAgLy8gbG9nKGV4dHJhKQogICAgZGlnIDgKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozOTIKICAgIC8vIGVuc3VyZUV4dHJhKGJveC52YWx1ZSA9PT0gaG91cnMsIGVyckFsZ29Ib3Vyc01pc21hdGNoLCBhY2NvdW50LmJ5dGVzKSAvLyBlbnN1cmUgaG91cnMgdG8gcmVtb3ZlIG1hdGNoZXMgZXhpc3RpbmcgaG91cnMgdG8gcHJldmVudCBhY2NpZGVudGFsIGRvdWJsZSByZW1vdmFsCiAgICBieXRlYyAyMyAvLyAiRVJSOkFIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czo0MgogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6NDMKICAgIC8vIGVycigpCiAgICBlcnIKCnJlbW92ZUFjY291bnRBbGdvSG91cnNfYWZ0ZXJfaWZfZWxzZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzkzCiAgICAvLyBib3guZGVsZXRlKCkKICAgIGRpZyA2CiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6ODcKICAgIC8vIGFsZ29ob3VyUGVyaW9kVG90YWxzID0gQm94TWFwPHVpbnQ2NCwgQWxnb2hvdXJQZXJpb2RUb3RhbHM+KHsga2V5UHJlZml4OiAnSCcgfSkKICAgIGJ5dGVjXzMgLy8gIkgiCiAgICBkaWcgOAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozOTYKICAgIC8vIGVuc3VyZSh0b3RhbEJveC5leGlzdHMsIGVyckFsZ29Ib3Vyc05vdEV4aXN0KQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiByZW1vdmVBY2NvdW50QWxnb0hvdXJzX2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6Mzk2CiAgICAvLyBlbnN1cmUodG90YWxCb3guZXhpc3RzLCBlcnJBbGdvSG91cnNOb3RFeGlzdCkKICAgIGJ5dGVjIDcgLy8gIkVSUjpBSF9OWCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgpyZW1vdmVBY2NvdW50QWxnb0hvdXJzX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjM5NwogICAgLy8gdG90YWxCb3gudmFsdWUudG90YWxBbGdvaG91cnMgLT0gaG91cnMKICAgIGRpZyA1CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA2CiAgICAtCiAgICBpdG9iCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIGRpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA0CiAgICBiIHJlbW92ZUFjY291bnRBbGdvSG91cnNfZm9yX2hlYWRlckAyCgpyZW1vdmVBY2NvdW50QWxnb0hvdXJzX2FmdGVyX2ZvckA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozODMKICAgIC8vIHB1YmxpYyByZW1vdmVBY2NvdW50QWxnb0hvdXJzKHBlcmlvZFN0YXJ0OiB1aW50NjQsIGFjY291bnRBbGdvaG91cklucHV0czogQWNjb3VudEFsZ29ob3VySW5wdXRbXSk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6OkRlbGVnYXRvci51cGRhdGVBbGdvSG91clBlcmlvZEZpbmFsaXR5W3JvdXRpbmddKCkgLT4gdm9pZDoKdXBkYXRlQWxnb0hvdXJQZXJpb2RGaW5hbGl0eToKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQwNgogICAgLy8gcHVibGljIHVwZGF0ZUFsZ29Ib3VyUGVyaW9kRmluYWxpdHkocGVyaW9kU3RhcnQ6IHVpbnQ2NCwgdG90YWxBbGdvaG91cnM6IHVpbnQ2NCwgZmluYWw6IGJvb2xlYW4pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgc3dhcAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDA3CiAgICAvLyB0aGlzLmVuc3VyZUNhbGxlcklzQWRtaW4oKQogICAgY2FsbHN1YiBlbnN1cmVDYWxsZXJJc0FkbWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQwOAogICAgLy8gZW5zdXJlKHBlcmlvZFN0YXJ0ICUgcGVyaW9kTGVuZ3RoID09PSAwLCBlcnJQZXJpb2RTdGFydEludmFsaWQpCiAgICBpbnRjIDQgLy8gMTAwMDAwMAogICAgJQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBieiB1cGRhdGVBbGdvSG91clBlcmlvZEZpbmFsaXR5X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0MDgKICAgIC8vIGVuc3VyZShwZXJpb2RTdGFydCAlIHBlcmlvZExlbmd0aCA9PT0gMCwgZXJyUGVyaW9kU3RhcnRJbnZhbGlkKQogICAgYnl0ZWNfMiAvLyAiRVJSOlBTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnVwZGF0ZUFsZ29Ib3VyUGVyaW9kRmluYWxpdHlfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0MDkKICAgIC8vIGNvbnN0IGJveCA9IHRoaXMuYWxnb2hvdXJQZXJpb2RUb3RhbHMocGVyaW9kU3RhcnQpCiAgICBkaWcgMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo4NwogICAgLy8gYWxnb2hvdXJQZXJpb2RUb3RhbHMgPSBCb3hNYXA8dWludDY0LCBBbGdvaG91clBlcmlvZFRvdGFscz4oeyBrZXlQcmVmaXg6ICdIJyB9KQogICAgYnl0ZWNfMyAvLyAiSCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDEwCiAgICAvLyBlbnN1cmUoYm94LmV4aXN0cywgZXJyQWxnb0hvdXJzTm90RXhpc3QpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IHVwZGF0ZUFsZ29Ib3VyUGVyaW9kRmluYWxpdHlfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQxMAogICAgLy8gZW5zdXJlKGJveC5leGlzdHMsIGVyckFsZ29Ib3Vyc05vdEV4aXN0KQogICAgYnl0ZWMgNyAvLyAiRVJSOkFIX05YIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnVwZGF0ZUFsZ29Ib3VyUGVyaW9kRmluYWxpdHlfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0MTEKICAgIC8vIGVuc3VyZShib3gudmFsdWUudG90YWxBbGdvaG91cnMgPT09IHRvdGFsQWxnb2hvdXJzLCBlcnJBbGdvSG91cnNNaXNtYXRjaCkKICAgIGRpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IHVwZGF0ZUFsZ29Ib3VyUGVyaW9kRmluYWxpdHlfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0MTEKICAgIC8vIGVuc3VyZShib3gudmFsdWUudG90YWxBbGdvaG91cnMgPT09IHRvdGFsQWxnb2hvdXJzLCBlcnJBbGdvSG91cnNNaXNtYXRjaCkKICAgIGJ5dGVjIDIzIC8vICJFUlI6QUgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKdXBkYXRlQWxnb0hvdXJQZXJpb2RGaW5hbGl0eV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0MTIKICAgIC8vIGJveC52YWx1ZS5maW5hbCA9IGZpbmFsCiAgICBkaWcgMwogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgZGlnIDMKICAgIHNldGJpdAogICAgaW50Y18yIC8vIDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQwNgogICAgLy8gcHVibGljIHVwZGF0ZUFsZ29Ib3VyUGVyaW9kRmluYWxpdHkocGVyaW9kU3RhcnQ6IHVpbnQ2NCwgdG90YWxBbGdvaG91cnM6IHVpbnQ2NCwgZmluYWw6IGJvb2xlYW4pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjpEZWxlZ2F0b3IuZ2V0QWxnb0hvdXJQZXJpb2RUb3RhbHNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRBbGdvSG91clBlcmlvZFRvdGFsczoKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQ0OAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDUwCiAgICAvLyBlbnN1cmUocGVyaW9kU3RhcnQgJSBwZXJpb2RMZW5ndGggPT09IDAsIGVyclBlcmlvZFN0YXJ0SW52YWxpZCkKICAgIGludGMgNCAvLyAxMDAwMDAwCiAgICAlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJ6IGdldEFsZ29Ib3VyUGVyaW9kVG90YWxzX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0NTAKICAgIC8vIGVuc3VyZShwZXJpb2RTdGFydCAlIHBlcmlvZExlbmd0aCA9PT0gMCwgZXJyUGVyaW9kU3RhcnRJbnZhbGlkKQogICAgYnl0ZWNfMiAvLyAiRVJSOlBTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCmdldEFsZ29Ib3VyUGVyaW9kVG90YWxzX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDUxCiAgICAvLyBjb25zdCBib3ggPSB0aGlzLmFsZ29ob3VyUGVyaW9kVG90YWxzKHBlcmlvZFN0YXJ0KQogICAgZHVwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjg3CiAgICAvLyBhbGdvaG91clBlcmlvZFRvdGFscyA9IEJveE1hcDx1aW50NjQsIEFsZ29ob3VyUGVyaW9kVG90YWxzPih7IGtleVByZWZpeDogJ0gnIH0pCiAgICBieXRlY18zIC8vICJIIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0NTIKICAgIC8vIHJldHVybiBib3guZXhpc3RzID8gYm94LnZhbHVlIDogeyB0b3RhbEFsZ29ob3VyczogMCwgZmluYWw6IGZhbHNlIH0KICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogZ2V0QWxnb0hvdXJQZXJpb2RUb3RhbHNfdGVybmFyeV9mYWxzZUAzCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKCmdldEFsZ29Ib3VyUGVyaW9kVG90YWxzX3Rlcm5hcnlfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDQ4CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmdldEFsZ29Ib3VyUGVyaW9kVG90YWxzX3Rlcm5hcnlfZmFsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDUyCiAgICAvLyByZXR1cm4gYm94LmV4aXN0cyA/IGJveC52YWx1ZSA6IHsgdG90YWxBbGdvaG91cnM6IDAsIGZpbmFsOiBmYWxzZSB9CiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGIgZ2V0QWxnb0hvdXJQZXJpb2RUb3RhbHNfdGVybmFyeV9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo6RGVsZWdhdG9yLmdldEFjY291bnRBbGdvSG91cnNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRBY2NvdW50QWxnb0hvdXJzOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0NjEKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDYzCiAgICAvLyBlbnN1cmUocGVyaW9kU3RhcnQgJSBwZXJpb2RMZW5ndGggPT09IDAsIGVyclBlcmlvZFN0YXJ0SW52YWxpZCkKICAgIGludGMgNCAvLyAxMDAwMDAwCiAgICAlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJ6IGdldEFjY291bnRBbGdvSG91cnNfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0NjMKICAgIC8vIGVuc3VyZShwZXJpb2RTdGFydCAlIHBlcmlvZExlbmd0aCA9PT0gMCwgZXJyUGVyaW9kU3RhcnRJbnZhbGlkKQogICAgYnl0ZWNfMiAvLyAiRVJSOlBTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCmdldEFjY291bnRBbGdvSG91cnNfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDY0CiAgICAvLyBjb25zdCBhY2NvdW50SWQgPSB0aGlzLmdldEFjY291bnRJZElmRXhpc3RzKGFjY291bnQpCiAgICBkdXAKICAgIGNhbGxzdWIgZ2V0QWNjb3VudElkSWZFeGlzdHMKICAgIGR1cAogICAgYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQ2NQogICAgLy8gaWYgKGFjY291bnRJZC5hc1VpbnQ2NCgpID09PSAwKSB7CiAgICBidG9pCiAgICBibnogZ2V0QWNjb3VudEFsZ29Ib3Vyc19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDY2CiAgICAvLyByZXR1cm4gMAogICAgaW50Y18wIC8vIDAKCmdldEFjY291bnRBbGdvSG91cnNfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjpEZWxlZ2F0b3IuZ2V0QWNjb3VudEFsZ29Ib3Vyc0A3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0NjEKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKZ2V0QWNjb3VudEFsZ29Ib3Vyc19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQ2OAogICAgLy8gY29uc3Qga2V5OiBBbGdvaG91ckFjY291bnRLZXkgPSBbcGVyaW9kU3RhcnQsIGFjY291bnRJZF0KICAgIGRpZyAxCiAgICBpdG9iCiAgICBkaWcgNAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjg5CiAgICAvLyBhbGdvaG91ckFjY291bnRzID0gQm94TWFwPEFsZ29ob3VyQWNjb3VudEtleSwgdWludDY0Pih7IGtleVByZWZpeDogJ2gnIH0pCiAgICBieXRlYyA4IC8vICJoIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0NzAKICAgIC8vIHJldHVybiBib3guZXhpc3RzID8gYm94LnZhbHVlIDogMAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRBY2NvdW50QWxnb0hvdXJzX3Rlcm5hcnlfZmFsc2VANQogICAgZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQ2MQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBiIGdldEFjY291bnRBbGdvSG91cnNfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjpEZWxlZ2F0b3IuZ2V0QWNjb3VudEFsZ29Ib3Vyc0A3CgpnZXRBY2NvdW50QWxnb0hvdXJzX3Rlcm5hcnlfZmFsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDcwCiAgICAvLyByZXR1cm4gYm94LmV4aXN0cyA/IGJveC52YWx1ZSA6IDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQ2MQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBiIGdldEFjY291bnRBbGdvSG91cnNfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjpEZWxlZ2F0b3IuZ2V0QWNjb3VudEFsZ29Ib3Vyc0A3CgoKLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo6RGVsZWdhdG9yLmxvZ0NvbW1pdHRlZU1ldGFkYXRhW3JvdXRpbmddKCkgLT4gdm9pZDoKbG9nQ29tbWl0dGVlTWV0YWRhdGE6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0NzcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gMzIKICAgICoKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4+CiAgICBpbnRjXzAgLy8gMAoKbG9nQ29tbWl0dGVlTWV0YWRhdGFfZm9yX2hlYWRlckAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0NzkKICAgIC8vIGZvciAoY29uc3QgY29tbWl0dGVlSWQgb2YgY29tbWl0dGVlSWRzKSB7CiAgICBkdXAKICAgIGRpZyAyCiAgICA8CiAgICBieiBsb2dDb21taXR0ZWVNZXRhZGF0YV9hZnRlcl9mb3JAOAogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDMyCiAgICAqCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo4MwogICAgLy8gY29tbWl0dGVlcyA9IEJveE1hcDxDb21taXR0ZWVJZCwgRGVsZWdhdG9yQ29tbWl0dGVlPih7IGtleVByZWZpeDogJ0MnIH0pCiAgICBieXRlYyA1IC8vICJDIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0ODEKICAgIC8vIGlmIChtZXRhZGF0YS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogbG9nQ29tbWl0dGVlTWV0YWRhdGFfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDgyCiAgICAvLyBsb2coZW5jb2RlQXJjNChtZXRhZGF0YS52YWx1ZSkpCiAgICBkaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGxvZwoKbG9nQ29tbWl0dGVlTWV0YWRhdGFfYWZ0ZXJfaWZfZWxzZUA2OgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGxvZ0NvbW1pdHRlZU1ldGFkYXRhX2Zvcl9oZWFkZXJAMgoKbG9nQ29tbWl0dGVlTWV0YWRhdGFfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS90eXBlcy5hbGdvLnRzOjg1CiAgICAvLyBwZXJpb2RTdGFydDogdTMyKDApLAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgdTMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS90eXBlcy5hbGdvLnRzOjg2CiAgICAvLyBwZXJpb2RFbmQ6IHUzMigwKSwKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIHUzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdHlwZXMuYWxnby50czo4NwogICAgLy8gZXh0RGVsZWdhdGVkVm90ZXM6IHUzMigwKSwKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIHUzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdHlwZXMuYWxnby50czo4NC04OQogICAgLy8gcmV0dXJuIHsKICAgIC8vICAgcGVyaW9kU3RhcnQ6IHUzMigwKSwKICAgIC8vICAgcGVyaW9kRW5kOiB1MzIoMCksCiAgICAvLyAgIGV4dERlbGVnYXRlZFZvdGVzOiB1MzIoMCksCiAgICAvLyAgIGV4dERlbGVnYXRlZEFjY291bnRWb3RlczogW10gYXMgQWNjb3VudElkV2l0aFZvdGVzW10sCiAgICAvLyB9CiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTMgLy8gMHgwMDBlMDAwMAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQ4NAogICAgLy8gbG9nKGVuY29kZUFyYzQoZ2V0RW1wdHlEZWxlZ2F0b3JDb21taXR0ZWUoKSkpCiAgICBsb2cKICAgIGIgbG9nQ29tbWl0dGVlTWV0YWRhdGFfYWZ0ZXJfaWZfZWxzZUA2Cgpsb2dDb21taXR0ZWVNZXRhZGF0YV9hZnRlcl9mb3JAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDc3CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjpEZWxlZ2F0b3IubG9nUHJvcG9zYWxNZXRhZGF0YVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmxvZ1Byb3Bvc2FsTWV0YWRhdGE6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0OTMKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFwcGxpY2F0aW9uPgogICAgaW50Y18wIC8vIDAKCmxvZ1Byb3Bvc2FsTWV0YWRhdGFfZm9yX2hlYWRlckAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0OTUKICAgIC8vIGZvciAoY29uc3QgcHJvcG9zYWxJZCBvZiBwcm9wb3NhbElkcykgewogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogbG9nUHJvcG9zYWxNZXRhZGF0YV9hZnRlcl9mb3JAOAogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6ODUKICAgIC8vIHByb3Bvc2FscyA9IEJveE1hcDxBcHBsaWNhdGlvbiwgRGVsZWdhdG9yUHJvcG9zYWw+KHsga2V5UHJlZml4OiAnUCcgfSkKICAgIGJ5dGVjIDYgLy8gIlAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQ5NwogICAgLy8gaWYgKG1ldGFkYXRhLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBsb2dQcm9wb3NhbE1ldGFkYXRhX2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQ5OAogICAgLy8gbG9nKGVuY29kZUFyYzQobWV0YWRhdGEudmFsdWUpKQogICAgZGlnIDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBsb2cKCmxvZ1Byb3Bvc2FsTWV0YWRhdGFfYWZ0ZXJfaWZfZWxzZUA2OgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGxvZ1Byb3Bvc2FsTWV0YWRhdGFfZm9yX2hlYWRlckAyCgpsb2dQcm9wb3NhbE1ldGFkYXRhX2Vsc2VfYm9keUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdHlwZXMuYWxnby50czoxMjAKICAgIC8vIGV4dFZvdGVTdGFydFRpbWU6IHUzMigwKSwKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIHUzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdHlwZXMuYWxnby50czoxMjEKICAgIC8vIGV4dFZvdGVFbmRUaW1lOiB1MzIoMCksCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiB1MzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3R5cGVzLmFsZ28udHM6MTIyCiAgICAvLyBleHRUb3RhbFZvdGluZ1Bvd2VyOiB1MzIoMCksCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiB1MzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3R5cGVzLmFsZ28udHM6MTIzCiAgICAvLyBleHRBY2NvdW50c1BlbmRpbmdWb3RlczogW10gYXMgQWNjb3VudElkV2l0aFZvdGVzW10sCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdHlwZXMuYWxnby50czoxMjUKICAgIC8vIGludFZvdGVFbmRUaW1lOiB1MzIoMCksCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiB1MzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3R5cGVzLmFsZ28udHM6MTE3LTEzMgogICAgLy8gcmV0dXJuIHsKICAgIC8vICAgc3RhdHVzOiAnJyBhcyBEZWxlZ2F0b3JQcm9wb3NhbFN0YXR1cywKICAgIC8vICAgY29tbWl0dGVlSWQ6IG5ldyBTdGF0aWNCeXRlczwzMj4oKSwKICAgIC8vICAgZXh0Vm90ZVN0YXJ0VGltZTogdTMyKDApLAogICAgLy8gICBleHRWb3RlRW5kVGltZTogdTMyKDApLAogICAgLy8gICBleHRUb3RhbFZvdGluZ1Bvd2VyOiB1MzIoMCksCiAgICAvLyAgIGV4dEFjY291bnRzUGVuZGluZ1ZvdGVzOiBbXSBhcyBBY2NvdW50SWRXaXRoVm90ZXNbXSwKICAgIC8vICAgZXh0QWNjb3VudHNWb3RlZDogW10gYXMgQWNjb3VudElkV2l0aFZvdGVzW10sCiAgICAvLyAgIGludFZvdGVFbmRUaW1lOiB1MzIoMCksCiAgICAvLyAgIGludFRvdGFsQWxnb2hvdXJzOiAwLAogICAgLy8gICBpbnRWb3RlZEFsZ29ob3VyczogMCwKICAgIC8vICAgaW50Vm90ZXNZZXNBbGdvaG91cnM6IDAsCiAgICAvLyAgIGludFZvdGVzTm9BbGdvaG91cnM6IDAsCiAgICAvLyAgIGludFZvdGVzQWJzdGFpbkFsZ29ob3VyczogMCwKICAgIC8vICAgaW50Vm90ZXNCb3ljb3R0QWxnb2hvdXJzOiAwLAogICAgLy8gfQogICAgcHVzaGJ5dGVzIDB4MDA2NjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwNjgwMDZhCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo1MDAKICAgIC8vIGxvZyhlbmNvZGVBcmM0KGdldEVtcHR5RGVsZWdhdG9yUHJvcG9zYWwoKSkpCiAgICBsb2cKICAgIGIgbG9nUHJvcG9zYWxNZXRhZGF0YV9hZnRlcl9pZl9lbHNlQDYKCmxvZ1Byb3Bvc2FsTWV0YWRhdGFfYWZ0ZXJfZm9yQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQ5MwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYmFzZS5hbGdvLnRzOjpCYXNlQ29udHJhY3QuaW5jcmVhc2VCdWRnZXRbcm91dGluZ10oKSAtPiB2b2lkOgppbmNyZWFzZUJ1ZGdldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2Jhc2UuYWxnby50czoyMQogICAgLy8gQGFiaW1ldGhvZCh7IHZhbGlkYXRlRW5jb2Rpbmc6ICd1bnNhZmUtZGlzYWJsZWQnIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9iYXNlLmFsZ28udHM6MjQKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBpdHhuczsgaSsrKSB7CiAgICBpbnRjXzAgLy8gMAoKaW5jcmVhc2VCdWRnZXRfd2hpbGVfdG9wQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9iYXNlLmFsZ28udHM6MjQKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBpdHhuczsgaSsrKSB7CiAgICBkdXAKICAgIGRpZyAyCiAgICA8CiAgICBieiBpbmNyZWFzZUJ1ZGdldF9hZnRlcl93aGlsZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9iYXNlLmFsZ28udHM6MjUtMzEKICAgIC8vIGl0eG4KICAgIC8vICAgLmFwcGxpY2F0aW9uQ2FsbCh7CiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBlbXB0eS5jbGVhclN0YXRlUHJvZ3JhbSwgLy8gaW50ZW50aW9uYWxseSB1c2luZyBjbGVhciBzdGF0ZSBwcm9ncmFtIGZvciAicmV0dXJuIHRydWUiCiAgICAvLyAgICAgY2xlYXJTdGF0ZVByb2dyYW06IGVtcHR5LmNsZWFyU3RhdGVQcm9ncmFtLAogICAgLy8gICAgIG9uQ29tcGxldGlvbjogT25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9iYXNlLmFsZ28udHM6MjkKICAgIC8vIG9uQ29tcGxldGlvbjogT25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIHB1c2hpbnQgNSAvLyA1CiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYmFzZS5hbGdvLnRzOjIzCiAgICAvLyBjb25zdCBlbXB0eSA9IGNvbXBpbGUoRW1wdHlDb250cmFjdCkKICAgIGJ5dGVjIDI0IC8vIGJhc2U2NChDNEVCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgYnl0ZWMgMjQgLy8gYmFzZTY0KEM0RUJRdz09KQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYmFzZS5hbGdvLnRzOjI1LTMwCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hcHBsaWNhdGlvbkNhbGwoewogICAgLy8gICAgIGFwcHJvdmFsUHJvZ3JhbTogZW1wdHkuY2xlYXJTdGF0ZVByb2dyYW0sIC8vIGludGVudGlvbmFsbHkgdXNpbmcgY2xlYXIgc3RhdGUgcHJvZ3JhbSBmb3IgInJldHVybiB0cnVlIgogICAgLy8gICAgIGNsZWFyU3RhdGVQcm9ncmFtOiBlbXB0eS5jbGVhclN0YXRlUHJvZ3JhbSwKICAgIC8vICAgICBvbkNvbXBsZXRpb246IE9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICAvLyAgIH0pCiAgICBwdXNoaW50IDYgLy8gNgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9iYXNlLmFsZ28udHM6MjUtMzEKICAgIC8vIGl0eG4KICAgIC8vICAgLmFwcGxpY2F0aW9uQ2FsbCh7CiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBlbXB0eS5jbGVhclN0YXRlUHJvZ3JhbSwgLy8gaW50ZW50aW9uYWxseSB1c2luZyBjbGVhciBzdGF0ZSBwcm9ncmFtIGZvciAicmV0dXJuIHRydWUiCiAgICAvLyAgICAgY2xlYXJTdGF0ZVByb2dyYW06IGVtcHR5LmNsZWFyU3RhdGVQcm9ncmFtLAogICAgLy8gICAgIG9uQ29tcGxldGlvbjogT25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYmFzZS5hbGdvLnRzOjI0CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgaXR4bnM7IGkrKykgewogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGluY3JlYXNlQnVkZ2V0X3doaWxlX3RvcEAyCgppbmNyZWFzZUJ1ZGdldF9hZnRlcl93aGlsZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYmFzZS5hbGdvLnRzOjIxCiAgICAvLyBAYWJpbWV0aG9kKHsgdmFsaWRhdGVFbmNvZGluZzogJ3Vuc2FmZS1kaXNhYmxlZCcgfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYmFzZS9hY2NvdW50LWlkLmFsZ28udHM6OkFjY291bnRJZENvbnRyYWN0LmdldEFjY291bnRJZElmRXhpc3RzKGFjY291bnQ6IGJ5dGVzKSAtPiBieXRlczoKZ2V0QWNjb3VudElkSWZFeGlzdHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9hY2NvdW50LWlkLmFsZ28udHM6MzEKICAgIC8vIHByb3RlY3RlZCBnZXRBY2NvdW50SWRJZkV4aXN0cyhhY2NvdW50OiBBY2NvdW50KTogVWludDMyIHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYWNjb3VudC1pZC5hbGdvLnRzOjkKICAgIC8vIGFjY291bnRJZHMgPSBCb3hNYXA8QWNjb3VudCwgVWludDMyPih7IGtleVByZWZpeDogJ2EnIH0pCiAgICBieXRlYyA5IC8vICJhIgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYWNjb3VudC1pZC5hbGdvLnRzOjMzCiAgICAvLyBpZiAoYm94LmV4aXN0cykgcmV0dXJuIGJveC52YWx1ZQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRBY2NvdW50SWRJZkV4aXN0c19lbHNlX2JvZHlAMgogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBzd2FwCiAgICByZXRzdWIKCmdldEFjY291bnRJZElmRXhpc3RzX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYWNjb3VudC1pZC5hbGdvLnRzOjM0CiAgICAvLyBlbHNlIHJldHVybiB1MzIoMCkKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIHUzMgogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYWNjb3VudC1pZC5hbGdvLnRzOjpBY2NvdW50SWRDb250cmFjdC5tdXN0R2V0QWNjb3VudElkKGFjY291bnQ6IGJ5dGVzKSAtPiBieXRlczoKbXVzdEdldEFjY291bnRJZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2FjY291bnQtaWQuYWxnby50czo0MwogICAgLy8gcHJvdGVjdGVkIG11c3RHZXRBY2NvdW50SWQoYWNjb3VudDogQWNjb3VudCk6IFVpbnQzMiB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2FjY291bnQtaWQuYWxnby50czo5CiAgICAvLyBhY2NvdW50SWRzID0gQm94TWFwPEFjY291bnQsIFVpbnQzMj4oeyBrZXlQcmVmaXg6ICdhJyB9KQogICAgYnl0ZWMgOSAvLyAiYSIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2FjY291bnQtaWQuYWxnby50czo0NQogICAgLy8gZW5zdXJlKGFjY291bnRJZEJveC5leGlzdHMsIGVyckFjY291bnROb3RFeGlzdHMpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IG11c3RHZXRBY2NvdW50SWRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9hY2NvdW50LWlkLmFsZ28udHM6NDUKICAgIC8vIGVuc3VyZShhY2NvdW50SWRCb3guZXhpc3RzLCBlcnJBY2NvdW50Tm90RXhpc3RzKQogICAgcHVzaGJ5dGVzICJFUlI6QV9OWCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgptdXN0R2V0QWNjb3VudElkX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2FjY291bnQtaWQuYWxnby50czo0NgogICAgLy8gcmV0dXJuIGFjY291bnRJZEJveC52YWx1ZQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYmFzZS9hY2NvdW50LWlkLmFsZ28udHM6OkFjY291bnRJZENvbnRyYWN0LmdldE9yQ3JlYXRlQWNjb3VudElkKGFjY291bnQ6IGJ5dGVzKSAtPiBieXRlczoKZ2V0T3JDcmVhdGVBY2NvdW50SWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9hY2NvdW50LWlkLmFsZ28udHM6NTQKICAgIC8vIHByb3RlY3RlZCBnZXRPckNyZWF0ZUFjY291bnRJZChhY2NvdW50OiBBY2NvdW50KTogVWludDMyIHsKICAgIHByb3RvIDEgMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2FjY291bnQtaWQuYWxnby50czo1NQogICAgLy8gbGV0IGFjY291bnRJZCA9IHRoaXMuZ2V0QWNjb3VudElkSWZFeGlzdHMoYWNjb3VudCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRBY2NvdW50SWRJZkV4aXN0cwogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9hY2NvdW50LWlkLmFsZ28udHM6NTYKICAgIC8vIGlmIChhY2NvdW50SWQuYXNVaW50NjQoKSA9PT0gMCkgewogICAgYnRvaQogICAgYm56IGdldE9yQ3JlYXRlQWNjb3VudElkX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9hY2NvdW50LWlkLmFsZ28udHM6OQogICAgLy8gYWNjb3VudElkcyA9IEJveE1hcDxBY2NvdW50LCBVaW50MzI+KHsga2V5UHJlZml4OiAnYScgfSkKICAgIGJ5dGVjIDkgLy8gImEiCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2FjY291bnQtaWQuYWxnby50czoxOQogICAgLy8gZW5zdXJlKCFib3guZXhpc3RzLCBlcnJBY2NvdW50RXhpc3RzKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJ6IGdldE9yQ3JlYXRlQWNjb3VudElkX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYWNjb3VudC1pZC5hbGdvLnRzOjE5CiAgICAvLyBlbnN1cmUoIWJveC5leGlzdHMsIGVyckFjY291bnRFeGlzdHMpCiAgICBwdXNoYnl0ZXMgIkVSUjpBX0VYIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCmdldE9yQ3JlYXRlQWNjb3VudElkX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2FjY291bnQtaWQuYWxnby50czoyMAogICAgLy8gdGhpcy5sYXN0QWNjb3VudElkLnZhbHVlKysKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9hY2NvdW50LWlkLmFsZ28udHM6OAogICAgLy8gbGFzdEFjY291bnRJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSkKICAgIGJ5dGVjIDEwIC8vICJsYXN0QWNjb3VudElkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYWNjb3VudC1pZC5hbGdvLnRzOjIwCiAgICAvLyB0aGlzLmxhc3RBY2NvdW50SWQudmFsdWUrKwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9hY2NvdW50LWlkLmFsZ28udHM6OAogICAgLy8gbGFzdEFjY291bnRJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSkKICAgIGJ5dGVjIDEwIC8vICJsYXN0QWNjb3VudElkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYWNjb3VudC1pZC5hbGdvLnRzOjIwCiAgICAvLyB0aGlzLmxhc3RBY2NvdW50SWQudmFsdWUrKwogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9hY2NvdW50LWlkLmFsZ28udHM6MjEKICAgIC8vIGNvbnN0IGFjY291bnRJZCA9IHUzMih0aGlzLmxhc3RBY2NvdW50SWQudmFsdWUpCiAgICBjYWxsc3ViIHUzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYWNjb3VudC1pZC5hbGdvLnRzOjIyCiAgICAvLyBib3gudmFsdWUgPSBhY2NvdW50SWQKICAgIGZyYW1lX2RpZyAwCiAgICBkaWcgMQogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYWNjb3VudC1pZC5hbGdvLnRzOjU3CiAgICAvLyByZXR1cm4gdGhpcy5jcmVhdGVBY2NvdW50SWQoYWNjb3VudCkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRPckNyZWF0ZUFjY291bnRJZF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2FjY291bnQtaWQuYWxnby50czo1OQogICAgLy8gcmV0dXJuIGFjY291bnRJZAogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYmFzZS5hbGdvLnRzOjpCYXNlQ29udHJhY3QuZW5zdXJlQ2FsbGVySXNBZG1pbigpIC0+IHZvaWQ6CmVuc3VyZUNhbGxlcklzQWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9iYXNlLmFsZ28udHM6MTQKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09PSBHbG9iYWwuY3JlYXRvckFkZHJlc3MsIGVyclVuYXV0aG9yaXplZCkKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IGVuc3VyZUNhbGxlcklzQWRtaW5fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9iYXNlLmFsZ28udHM6MTQKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09PSBHbG9iYWwuY3JlYXRvckFkZHJlc3MsIGVyclVuYXV0aG9yaXplZCkKICAgIGJ5dGVjIDE4IC8vICJFUlI6QVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgplbnN1cmVDYWxsZXJJc0FkbWluX2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAFAAEIIMCEPSYZBBUffHUABkVSUjpQUwFIEmNvbW1pdHRlZU9yYWNsZUFwcAFDAVAJRVJSOkFIX05YAWgBYQ1sYXN0QWNjb3VudElkE3ZvdGVTdWJtaXRUaHJlc2hvbGQMYWJzZW50ZWVNb2RlBAAOAAAIRVJSOkFfTlYIRVJSOkNfTlgGRVJSOlNUAgAACEVSUjpBVVRICEVSUjpQX05YB0VSUjpFQVIHRVJSOkxBVARWT1RFBkVSUjpBSAQLgQFDMRhAABUnCiJnJwuBsFRnJwyABnN0cmljdGcxG0EAeDEZFEQxGESCDwSesGeeBAkWpYcErWfxQwTOdKgOBCcLmzIElpzgJASxU6mOBBPJu0EEFC8osATGcR8vBJRMuagEKF+cUwRtmD8QBJu3gUUEQRjsvzYaAI4PABoALAA+AFgBogOlBjkItQlpCh4KfAq2CwcLYgwLADEZFDEYFBBEI0OKAQGL/xZJkyUORFcEBIk2GgFJFSQSRBeIDJAnBExnI0M2GgFJFSQSRBeIDH4nC0xnI0M2GgFJIlmBAghLARUSRFcCAIgMZCcMTGcjQyJHAylHAjYaAUcCFSUSRDYaAklOAkkiWUlOAyULgQIITBUSRIgMNycFTFBJvUUBQQAMgAhFUlI6Q19FWLAAsSInBGVEgAQ3iytRshpLBLIagAGAshoishmyGIEGshAisgGztD5JVwQASwFXAAQoEkQVgR4SRElXBgRMVwoEIoj/Mk4CUExQJw1QRQsiRQciRQZLBUsCDEEAmUsCVwIASwYlCyVYSUUJSYgLb0ULsSInBGVEgATKKEkDshpLBbIaTLIaIrIZshiBBrIQIrIBs7Q+SVcEAElOAkULVwAEKBJESRWBBBJEF0lFBkAAB0sHsCcOsABLBksFCEUHSwpJgQxZSwEVSwJLAk8CUksMSwxQSwFMUEwiWSMIFlcGAlwATwIiTwNYTFBFC0sFIwhFBkL/X0sGiP58SwtMXAhLAUm8SEsBvyhMULAjQyJHBilHBTYaAUkVJBJEF0kWJwZMUEm9RQFBAAyACEVSUjpQX0VYsAAiJwRlRIAPeEdvdlJlZ2lzdHJ5QXBwZUxFCEAADIAIRVJSOlhHUk2wAEsBcgdESwdyCEQSQAAMgAhFUlI6WEdQQ7AASwGADGNvbW1pdHRlZV9pZGVMRRBAAAyACEVSUjpYR1BNsABLDkkVJRJEJwVMUElFD71FAUAABCcPsABLDUm+REsBIoEEuksCgQRJukUOTwIkgQS6RQ5LAYEMWUsCFU8DTgJSRQ4iRQYXRQhLChdLCA1BAEhLBxZJRQsrTFBJRQq9RQFAAAdLCbAnB7AASwi+RIFAU0AAEEsJsIAJRVJSOkFIX05GsABLCL5EIltLBQhFBUsHIQQIRQhC/69LAUmABnN0YXR1c2VOAkUISYAMdm90ZV9vcGVuX3RzZUhFBoAPdm90aW5nX2R1cmF0aW9uZUhFBEAADIAIRVJSOlhHU02wAEsFgRkSQAAQSwWBFBJBAIFLAzIHDkEAeSNAAAQnELAASwNJSwQITIj80UsBiPzMIhYiJwtlRE8ETAmI/L6AAgBmSxNQTwRQTwNQSw5QgAIAbFBLD0lOAxWBbAgWVwYCUExQSwcWUEsCUEsCUEsCUEsCUE8CUIAGAARXQUlUUExQJxFQSwFJvEhLAb8oTFCwI0MiQv+EIkcIKUcLNhoBSRUkEkQXNhoCRwIVJRJENhoDSU4CFSUSRDEAEkAABCcSsABLAhZJRRQnBkxQSUUSvUUBQAAEJxOwAEsQvkxJTgJFFERJIllLAYEuWVJXAgCABENBTkMTQAALgAdFUlI6UF9DsABLEIECJbonBUxQSUUVvUUBQAAEJw+wAEsTSSKBBLpFFoEESbpFFksQgwIiBLoXMgcOQAAEJxSwADIHSxGDAjIEuhcMQAAEJxWwAEsUF0lFC0sWF0lFDQxAAA2ACUVSUjpQRV9MVLAASwkhBBhBAAMqsABLCiEEGEEACoAGRVJSOlBFsABLAYgHmklFGRdAAVUiRQRLA0AABCcOsABHAiJbSU4CRQpJJFtJRQpPAghLAYEYW0lFCQhMgRBbSUUHCElFCksEEkAACoAGRVJSOklWsABLAYgHZ0sTTFCAAVZMUElFEb1FAUEAT0sPvkRJIltLASRbSwKBEFtPA4EYW0sUgT4kuhdLDQkWSxZMXD5JgUZbTwUJFlxGSYFOW08ECRZcTkmBXltPAgkWXF5JgVZbTwIJFlxWRRJLEUkiWUlOAkURSYEuWUlFEUxOAlJXAgAnFhNBAE1LEUkiSxFJTgRYgAYABFZPVEVQSwEVSwJLEklOA08CUk8CTFBLAU8ECU8CgQYISwEJFlcGAk8CTFwuTwKBMFmBBghPAgkWVwYCXDBFEksRSYE+W0sKCBZcPkmBRltLCQgWXEZJgU5bSwgIFlxOSYFeW0sHCBZcXkmBVltLBggWXFZLEEsCv0sRSbxITL8jQyJFDUsJRQxLC0sLDEEAK0sLFksYUCcITFBJRRi9RQFBABRLFr5EF0sNCEUNSwshBAhFDEL/0SJC/+1LDEUEQv5tIkcDKUcHNhoBSRUkEkQXSTYaAklOAkkiWUlOAyULgQIITBUSRBYnBkxQSb1FAUAABCcTsABJvkxJTgJFD0RJIllLAYEuWVJXAgAnFhJAAAQnELAASYMCIgS6FzIHDkAABCcUsAAyB0sBgwImBLoXDEAABCcVsABJgT4kuhdJRQdAAAqABkVSUjpOVrAARwKDAi4CuheBAroXSwISQAALgAdFUlI6QU5NsAAiRQgiRQdHAoFeJLoXgQILTIE2JLoXSUUHD0lFCkAANyInDGVEgAZzY2FsZWQSQQGcSwVLAUmBRiS6F0sBgwIqBLoXTEsBC0sDCkULTIFOJLoXC0wKRQciRQpLCUsCDEEA4ksCVwIASwpJTgIlCyVYSUUSJwlMUL5ESw5JgS5ZSwGBMFlJRRFSVwIASwIkCyRYSUUSVwAEEkwWRQ9AAA1LDbCABkVSUjpJRLAASwhBAHRLDoEEWklFDLFLCxZMFoAEGEGg0rIaSxGyGkyyGrIaIrIZSwOyGIEGshAisgGztD5JVwQATFcABCgSREkiWYECCEwVEkRLDEkVSwFLDklOBE8CUklLElBMIlkjCBZXBgJcAEwiTwNYTFBFDUsJIwhFCkL/NUsOgQRaSwhLAQtLDoEqWkxLAQpFDUsITwILTApC/3VLDEmBLllLASJLAlgnEVBLAoEwWUsDFU8ESwJPAlJPAkxQSwFPAwlPAoECCEwJFlcGAlwwSSJZSwEiSwJYgAYABFZPVERQSwKBLllLAxVLBEsCTwJSTwJMUEsBTwMJTwKBBghLAQkWVwYCTwJMXC5PAoEwWYEGCE8CCRZXBgJcMEsBSbxITL8jQ0sEQv5hIkcDKUk2GgFJFSQSRBdJNhoCSU4CSSJZSU4DgSgLgQIITBUSRIgD2SEEGEEAAyqwACJFBEsDSwEMQQB2SwFXAgBLBIEoC4EoWElXACBJTgJFCyVbRQaIA2RLAxZJRQpMUCcITFBJRQi9RQFBABBLCLCACUVSUjpBSF9FWLAASwQWSUUHSwdMvytLCFBJvUUBQQAVSb5EIltLBggWIky7SwMjCEUEQv+MSwaAAQBQv0L/7SNDIkcDKUk2GgFJFSQSRBdJNhoCSU4CSSJZSU4DgSgLgQIITBUSRIgDJSEEGEEAAyqwACJFBEsDSwEMQQB3SwFXAgBLBIEoC4EoWElXACBJTgJFCyVbRQaIAo9LAxZJRQpMUCcITFBJRQi9RQFAAAdLCLAnB7AASwa+RBdLBRJAAAdLCLAnF7AASwa8SCtLCFBJRQe9RQFAAAQnB7AASwVJvkQiW0sGCRYiTLtLAyMIRQRC/4EjQyI2GgFJFSQSRBdJNhoCSRUkEkQXTDYaA0kVIxJEIlNMiAJ1IQQYQQADKrAASwIWK0xQSUUFvUUBQAAEJwewAEsDvkQiW0sCEkAABCcXsABLA0kkI7oiSwNUJEy7I0MiNhoBSRUkEkQXSSEEGEEAAyqwAEkWK0xQSUUDvUUBQQAKSwG+RChMULAjQ4AJAAAAAAAAAAAAQv/sIkk2GgFJFSQSRBdJNhoCSU4CFSUSRCEEGEEAAyqwAEmIAV1JRQUXQAAIIhYoTFCwI0NLARZLBFAnCExQSUUEvUUBQQAISwK+RBdC/94iQv/aIjYaAUcCIllJTgIlC4ECCEwVEkQiSUsCDEEAPUsCVwIASwElCyVYJwVMUElFBb1FAUEADUsDvkSwSSMIRQFC/9QiiPS/Ioj0uyKI9LdOAlBMUCcNULBC/+AjQyI2GgFHAiJZSU4CJAuBAghMFRJEIklLAgxBAItLAlcCAEsBJAskWCcGTFBJRQW9RQFBAA1LA75EsEkjCEUBQv/UIoj0ZCKI9GAiiPRcIhYiiPRWgCIAZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATwVQTwRQTwNQgAQAaABqUExQSwFQSwFQSwFQSwFQSwFQTFCABgAAAAAAAFCwQv+SI0M2GgEXIklLAgxBAB2xgQWyGScYskInGLJAgQayECKyAbNJIwhFAUL/3CNDigEBJwmL/1BJvUUBQQAGiwC+REyJIojzvEyJigEBJwmL/1BJvUUBQAAMgAhFUlI6QV9OWLAAiwC+REyJigEBIov/iP+7SRdAADEnCYv/UEmMAL1FAUEADIAIRVJSOkFfRViwACInCmVEIwgnCksBZ4jzYosASwG/jACJiwGMAIkxADIJEkAABCcSsACJ", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 3, "patch": 2 } }, "events": [], "templateVariables": {} }