{ "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 the GGov registry", "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": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggMzIgMTAwMDAwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICIiICJFUlI6UFMiICJIIiAiY29tbWl0dGVlT3JhY2xlQXBwIiAiQyIgIlAiICJFUlI6QUhfTlgiICJoIiAiYSIgImxhc3RBY2NvdW50SWQiICJ2b3RlU3VibWl0VGhyZXNob2xkIiAiYWJzZW50ZWVNb2RlIiAweDAwMGUwMDAwICJFUlI6QV9OViIgIkVSUjpDX05YIiAiRVJSOlNUIiAweDAwMDAgIkVSUjpBVVRIIiAiRVJSOlBfTlgiICJFUlI6RUFSIiAiRVJSOkxBVCIgIlZPVEUiICJFUlI6QUgiIGJhc2U2NChDNEVCUXc9PSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2FjY291bnQtaWQuYWxnby50czoxMQogICAgLy8gbGFzdEFjY291bnRJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSkKICAgIGJ5dGVjIDEwIC8vICJsYXN0QWNjb3VudElkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjc5CiAgICAvLyB2b3RlU3VibWl0VGhyZXNob2xkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMzYwMCAqIDMgfSkKICAgIGJ5dGVjIDExIC8vICJ2b3RlU3VibWl0VGhyZXNob2xkIgogICAgcHVzaGludCAxMDgwMCAvLyAxMDgwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6ODEKICAgIC8vIGFic2VudGVlTW9kZSA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBpbml0aWFsVmFsdWU6ICdzdHJpY3QnIH0pCiAgICBieXRlYyAxMiAvLyAiYWJzZW50ZWVNb2RlIgogICAgcHVzaGJ5dGVzICJzdHJpY3QiCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjc1CiAgICAvLyBleHBvcnQgY2xhc3MgRGVsZWdhdG9yIGV4dGVuZHMgQWNjb3VudElkQ29udHJhY3QgewogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlQDI0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDllYjA2NzllIDB4MDkxNmE1ODcgMHhhZDY3ZjE0MyAweGNlNzRhODBlIDB4MjcwYjliMzIgMHg5NjljZTAyNCAweGIxNTNhOThlIDB4MTNjOWJiNDEgMHgxNDJmMjhiMCAweGM2NzExZjJmIDB4OTQ0Y2I5YTggMHgyODVmOWM1MyAweDZkOTgzZjEwIDB4OWJiNzgxNDUgMHg0MTE4ZWNiZiAvLyBtZXRob2QgInNldENvbW1pdHRlZU9yYWNsZUFwcCh1aW50NjQpdm9pZCIsIG1ldGhvZCAic2V0Vm90ZVN1Ym1pdFRocmVzaG9sZCh1aW50NjQpdm9pZCIsIG1ldGhvZCAic2V0QWJzZW50ZWVNb2RlKHN0cmluZyl2b2lkIiwgbWV0aG9kICJzeW5jQ29tbWl0dGVlTWV0YWRhdGEoYnl0ZVszMl0sYWRkcmVzc1tdKSh1aW50MzIsdWludDMyLHVpbnQzMiwodWludDMyLHVpbnQzMilbXSkiLCBtZXRob2QgInN5bmNQcm9wb3NhbE1ldGFkYXRhKHVpbnQ2NCkoc3RyaW5nLGJ5dGVbMzJdLHVpbnQzMix1aW50MzIsdWludDMyLCh1aW50MzIsdWludDMyKVtdLCh1aW50MzIsdWludDMyKVtdLHVpbnQzMix1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInZvdGVJbnRlcm5hbCh1aW50NjQsYWRkcmVzcywodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSl2b2lkIiwgbWV0aG9kICJ2b3RlRXh0ZXJuYWwodWludDY0LGFkZHJlc3NbXSl2b2lkIiwgbWV0aG9kICJhZGRBY2NvdW50QWxnb0hvdXJzKHVpbnQ2NCwoYWRkcmVzcyx1aW50NjQpW10pdm9pZCIsIG1ldGhvZCAicmVtb3ZlQWNjb3VudEFsZ29Ib3Vycyh1aW50NjQsKGFkZHJlc3MsdWludDY0KVtdKXZvaWQiLCBtZXRob2QgInVwZGF0ZUFsZ29Ib3VyUGVyaW9kRmluYWxpdHkodWludDY0LHVpbnQ2NCxib29sKXZvaWQiLCBtZXRob2QgImdldEFsZ29Ib3VyUGVyaW9kVG90YWxzKHVpbnQ2NCkodWludDY0LGJvb2wpIiwgbWV0aG9kICJnZXRBY2NvdW50QWxnb0hvdXJzKHVpbnQ2NCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAibG9nQ29tbWl0dGVlTWV0YWRhdGEoYnl0ZVszMl1bXSl2b2lkIiwgbWV0aG9kICJsb2dQcm9wb3NhbE1ldGFkYXRhKHVpbnQ2NFtdKXZvaWQiLCBtZXRob2QgImluY3JlYXNlQnVkZ2V0KHVpbnQ2NCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggc2V0Q29tbWl0dGVlT3JhY2xlQXBwIHNldFZvdGVTdWJtaXRUaHJlc2hvbGQgc2V0QWJzZW50ZWVNb2RlIHN5bmNDb21taXR0ZWVNZXRhZGF0YSBzeW5jUHJvcG9zYWxNZXRhZGF0YSB2b3RlSW50ZXJuYWwgdm90ZUV4dGVybmFsIGFkZEFjY291bnRBbGdvSG91cnMgcmVtb3ZlQWNjb3VudEFsZ29Ib3VycyB1cGRhdGVBbGdvSG91clBlcmlvZEZpbmFsaXR5IGdldEFsZ29Ib3VyUGVyaW9kVG90YWxzIGdldEFjY291bnRBbGdvSG91cnMgbG9nQ29tbWl0dGVlTWV0YWRhdGEgbG9nUHJvcG9zYWxNZXRhZGF0YSBpbmNyZWFzZUJ1ZGdldAogICAgZXJyCgptYWluX19fYWxnb3RzX18uZGVmYXVsdENyZWF0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NzUKICAgIC8vIGV4cG9ydCBjbGFzcyBEZWxlZ2F0b3IgZXh0ZW5kcyBBY2NvdW50SWRDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6OnUzMih2OiB1aW50NjQpIC0+IGJ5dGVzOgp1MzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjgKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiB1MzIodjogdWludDY0KSB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6OQogICAgLy8gcmV0dXJuIG5ldyBVaW50MzIodikKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMyAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA0IDQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6OkRlbGVnYXRvci5zZXRDb21taXR0ZWVPcmFjbGVBcHBbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRDb21taXR0ZWVPcmFjbGVBcHA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjk3CiAgICAvLyBwdWJsaWMgc2V0Q29tbWl0dGVlT3JhY2xlQXBwKGFwcElkOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo5OAogICAgLy8gdGhpcy5lbnN1cmVDYWxsZXJJc0FkbWluKCkKICAgIGNhbGxzdWIgZW5zdXJlQ2FsbGVySXNBZG1pbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo3NwogICAgLy8gY29tbWl0dGVlT3JhY2xlQXBwID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KCkKICAgIGJ5dGVjIDQgLy8gImNvbW1pdHRlZU9yYWNsZUFwcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6OTkKICAgIC8vIHRoaXMuY29tbWl0dGVlT3JhY2xlQXBwLnZhbHVlID0gYXBwSWQKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjk3CiAgICAvLyBwdWJsaWMgc2V0Q29tbWl0dGVlT3JhY2xlQXBwKGFwcElkOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6OkRlbGVnYXRvci5zZXRWb3RlU3VibWl0VGhyZXNob2xkW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0Vm90ZVN1Ym1pdFRocmVzaG9sZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTA2CiAgICAvLyBwdWJsaWMgc2V0Vm90ZVN1Ym1pdFRocmVzaG9sZCh0aHJlc2hvbGQ6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxMDcKICAgIC8vIHRoaXMuZW5zdXJlQ2FsbGVySXNBZG1pbigpCiAgICBjYWxsc3ViIGVuc3VyZUNhbGxlcklzQWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NzkKICAgIC8vIHZvdGVTdWJtaXRUaHJlc2hvbGQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAzNjAwICogMyB9KQogICAgYnl0ZWMgMTEgLy8gInZvdGVTdWJtaXRUaHJlc2hvbGQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjEwOAogICAgLy8gdGhpcy52b3RlU3VibWl0VGhyZXNob2xkLnZhbHVlID0gdGhyZXNob2xkCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxMDYKICAgIC8vIHB1YmxpYyBzZXRWb3RlU3VibWl0VGhyZXNob2xkKHRocmVzaG9sZDogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo6RGVsZWdhdG9yLnNldEFic2VudGVlTW9kZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldEFic2VudGVlTW9kZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTE1CiAgICAvLyBwdWJsaWMgc2V0QWJzZW50ZWVNb2RlKG1vZGU6IEFic2VudGVlTW9kZSk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTE2CiAgICAvLyB0aGlzLmVuc3VyZUNhbGxlcklzQWRtaW4oKQogICAgY2FsbHN1YiBlbnN1cmVDYWxsZXJJc0FkbWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjgxCiAgICAvLyBhYnNlbnRlZU1vZGUgPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsgaW5pdGlhbFZhbHVlOiAnc3RyaWN0JyB9KQogICAgYnl0ZWMgMTIgLy8gImFic2VudGVlTW9kZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTE3CiAgICAvLyB0aGlzLmFic2VudGVlTW9kZS52YWx1ZSA9IG1vZGUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjExNQogICAgLy8gcHVibGljIHNldEFic2VudGVlTW9kZShtb2RlOiBBYnNlbnRlZU1vZGUpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjpEZWxlZ2F0b3Iuc3luY0NvbW1pdHRlZU1ldGFkYXRhW3JvdXRpbmddKCkgLT4gdm9pZDoKc3luY0NvbW1pdHRlZU1ldGFkYXRhOgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMwogICAgYnl0ZWNfMSAvLyAiIgogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjEyNQogICAgLy8gcHVibGljIHN5bmNDb21taXR0ZWVNZXRhZGF0YShjb21taXR0ZWVJZDogQ29tbWl0dGVlSWQsIGRlbGVnYXRlZEFjY291bnRzOiBBY2NvdW50W10pIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGludGNfMyAvLyAzMgogICAgKgogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFjY291bnQ+CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjEyNgogICAgLy8gdGhpcy5lbnN1cmVDYWxsZXJJc0FkbWluKCkKICAgIGNhbGxzdWIgZW5zdXJlQ2FsbGVySXNBZG1pbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo4MwogICAgLy8gY29tbWl0dGVlcyA9IEJveE1hcDxDb21taXR0ZWVJZCwgRGVsZWdhdG9yQ29tbWl0dGVlPih7IGtleVByZWZpeDogJ0MnIH0pCiAgICBieXRlYyA1IC8vICJDIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTI4CiAgICAvLyBlbnN1cmUoIWNvbW1pdHRlZUJveC5leGlzdHMsIGVyckNvbW1pdHRlZUV4aXN0cykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBieiBzeW5jQ29tbWl0dGVlTWV0YWRhdGFfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxMjgKICAgIC8vIGVuc3VyZSghY29tbWl0dGVlQm94LmV4aXN0cywgZXJyQ29tbWl0dGVlRXhpc3RzKQogICAgcHVzaGJ5dGVzICJFUlI6Q19FWCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgpzeW5jQ29tbWl0dGVlTWV0YWRhdGFfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTMxLTEzNAogICAgLy8gY29uc3QgcmVtb3RlQ29tbWl0dGVlID0gb3JhY2xlQXBwLmNhbGwuZ2V0Q29tbWl0dGVlTWV0YWRhdGEoewogICAgLy8gICBhcHBJZDogdGhpcy5jb21taXR0ZWVPcmFjbGVBcHAudmFsdWUsCiAgICAvLyAgIGFyZ3M6IFtjb21taXR0ZWVJZCwgdHJ1ZV0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxMzIKICAgIC8vIGFwcElkOiB0aGlzLmNvbW1pdHRlZU9yYWNsZUFwcC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjc3CiAgICAvLyBjb21taXR0ZWVPcmFjbGVBcHAgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKQogICAgYnl0ZWMgNCAvLyAiY29tbWl0dGVlT3JhY2xlQXBwIgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxMzIKICAgIC8vIGFwcElkOiB0aGlzLmNvbW1pdHRlZU9yYWNsZUFwcC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjEzMS0xMzQKICAgIC8vIGNvbnN0IHJlbW90ZUNvbW1pdHRlZSA9IG9yYWNsZUFwcC5jYWxsLmdldENvbW1pdHRlZU1ldGFkYXRhKHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuY29tbWl0dGVlT3JhY2xlQXBwLnZhbHVlLAogICAgLy8gICBhcmdzOiBbY29tbWl0dGVlSWQsIHRydWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIHB1c2hieXRlcyAweDM3OGIyYjUxIC8vIG1ldGhvZCAiZ2V0Q29tbWl0dGVlTWV0YWRhdGEoYnl0ZVszMl0sYm9vbCkodWludDE2LHVpbnQzMix1aW50MzIsdWludDMyLHVpbnQzMix1aW50NjQsdWludDMyKSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTMzCiAgICAvLyBhcmdzOiBbY29tbWl0dGVlSWQsIHRydWVdLAogICAgcHVzaGJ5dGVzIDB4ODAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjEzMS0xMzQKICAgIC8vIGNvbnN0IHJlbW90ZUNvbW1pdHRlZSA9IG9yYWNsZUFwcC5jYWxsLmdldENvbW1pdHRlZU1ldGFkYXRhKHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuY29tbWl0dGVlT3JhY2xlQXBwLnZhbHVlLAogICAgLy8gICBhcmdzOiBbY29tbWl0dGVlSWQsIHRydWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBsZW4KICAgIHB1c2hpbnQgMzAgLy8gMzAKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIENvbW1pdHRlZU1ldGFkYXRhCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjEzNwogICAgLy8gcGVyaW9kU3RhcnQ6IHJlbW90ZUNvbW1pdHRlZS5wZXJpb2RTdGFydCwKICAgIGR1cAogICAgZXh0cmFjdCA2IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTM4CiAgICAvLyBwZXJpb2RFbmQ6IHJlbW90ZUNvbW1pdHRlZS5wZXJpb2RFbmQsCiAgICBzd2FwCiAgICBleHRyYWN0IDEwIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTM5CiAgICAvLyBleHREZWxlZ2F0ZWRWb3RlczogdTMyKDApLAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgdTMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjEzNi0xNDEKICAgIC8vIGNvbnN0IGNvbW1pdHRlZTogRGVsZWdhdG9yQ29tbWl0dGVlID0gewogICAgLy8gICBwZXJpb2RTdGFydDogcmVtb3RlQ29tbWl0dGVlLnBlcmlvZFN0YXJ0LAogICAgLy8gICBwZXJpb2RFbmQ6IHJlbW90ZUNvbW1pdHRlZS5wZXJpb2RFbmQsCiAgICAvLyAgIGV4dERlbGVnYXRlZFZvdGVzOiB1MzIoMCksCiAgICAvLyAgIGV4dERlbGVnYXRlZEFjY291bnRWb3RlczogW10gYXMgQWNjb3VudElkV2l0aFZvdGVzW10sCiAgICAvLyB9CiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTMgLy8gMHgwMDBlMDAwMAogICAgY29uY2F0CiAgICBidXJ5IDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE0MwogICAgLy8gbGV0IGV4dERlbGVnYXRlZFZvdGVzOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA3CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA2CgpzeW5jQ29tbWl0dGVlTWV0YWRhdGFfZm9yX2hlYWRlckAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxNDQKICAgIC8vIGZvciAoY29uc3QgYWNjb3VudCBvZiBkZWxlZ2F0ZWRBY2NvdW50cykgewogICAgZGlnIDUKICAgIGRpZyAyCiAgICA8CiAgICBieiBzeW5jQ29tbWl0dGVlTWV0YWRhdGFfYWZ0ZXJfZm9yQDcKICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDYKICAgIGludGNfMyAvLyAzMgogICAgKgogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgYnVyeSA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE0NQogICAgLy8gY29uc3QgbG9jYWxBY2NvdW50SWQgPSB0aGlzLmdldE9yQ3JlYXRlQWNjb3VudElkKGFjY291bnQpCiAgICBkdXAKICAgIGNhbGxzdWIgZ2V0T3JDcmVhdGVBY2NvdW50SWQKICAgIGJ1cnkgMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTQ2LTE0OQogICAgLy8gY29uc3QgcmVtb3RlVm90ZXMgPSBvcmFjbGVBcHAuY2FsbC5nZXRYR292Vm90aW5nUG93ZXIoewogICAgLy8gICBhcHBJZDogdGhpcy5jb21taXR0ZWVPcmFjbGVBcHAudmFsdWUsCiAgICAvLyAgIGFyZ3M6IFtjb21taXR0ZWVJZCwgYWNjb3VudF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxNDcKICAgIC8vIGFwcElkOiB0aGlzLmNvbW1pdHRlZU9yYWNsZUFwcC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjc3CiAgICAvLyBjb21taXR0ZWVPcmFjbGVBcHAgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKQogICAgYnl0ZWMgNCAvLyAiY29tbWl0dGVlT3JhY2xlQXBwIgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxNDcKICAgIC8vIGFwcElkOiB0aGlzLmNvbW1pdHRlZU9yYWNsZUFwcC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE0Ni0xNDkKICAgIC8vIGNvbnN0IHJlbW90ZVZvdGVzID0gb3JhY2xlQXBwLmNhbGwuZ2V0WEdvdlZvdGluZ1Bvd2VyKHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuY29tbWl0dGVlT3JhY2xlQXBwLnZhbHVlLAogICAgLy8gICBhcmdzOiBbY29tbWl0dGVlSWQsIGFjY291bnRdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIHB1c2hieXRlcyAweGNhMjg0OTAzIC8vIG1ldGhvZCAiZ2V0WEdvdlZvdGluZ1Bvd2VyKGJ5dGVbMzJdLGFkZHJlc3MpdWludDMyIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTEKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxNTAKICAgIC8vIGVuc3VyZUV4dHJhKHJlbW90ZVZvdGVzLmFzVWludDY0KCkgPiAwLCBlcnJOb1ZvdGluZ1Bvd2VyLCBhY2NvdW50LmJ5dGVzKQogICAgYnRvaQogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6NDAKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IHN5bmNDb21taXR0ZWVNZXRhZGF0YV9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjQxCiAgICAvLyBsb2coZXh0cmEpCiAgICBkaWcgNwogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE1MAogICAgLy8gZW5zdXJlRXh0cmEocmVtb3RlVm90ZXMuYXNVaW50NjQoKSA+IDAsIGVyck5vVm90aW5nUG93ZXIsIGFjY291bnQuYnl0ZXMpCiAgICBieXRlYyAxNCAvLyAiRVJSOkFfTlYiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjQyCiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czo0MwogICAgLy8gZXJyKCkKICAgIGVycgoKc3luY0NvbW1pdHRlZU1ldGFkYXRhX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE1MgogICAgLy8gZXh0RGVsZWdhdGVkVm90ZXMgKz0gcmVtb3RlVm90ZXMuYXNVaW50NjQoKQogICAgZGlnIDYKICAgIGRpZyA1CiAgICArCiAgICBidXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTUzCiAgICAvLyBjb21taXR0ZWUuZXh0RGVsZWdhdGVkQWNjb3VudFZvdGVzLnB1c2goeyBhY2NvdW50SWQ6IGxvY2FsQWNjb3VudElkLCB2b3RlczogcmVtb3RlVm90ZXMgfSkKICAgIGRpZyAxMAogICAgZHVwCiAgICBwdXNoaW50IDEyIC8vIDEyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgZGlnIDIKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGRpZyAxMgogICAgZGlnIDEyCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIGV4dHJhY3QzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ1cnkgMTEKICAgIGRpZyA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA2CiAgICBiIHN5bmNDb21taXR0ZWVNZXRhZGF0YV9mb3JfaGVhZGVyQDMKCnN5bmNDb21taXR0ZWVNZXRhZGF0YV9hZnRlcl9mb3JANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTU1CiAgICAvLyBjb21taXR0ZWUuZXh0RGVsZWdhdGVkVm90ZXMgPSB1MzIoZXh0RGVsZWdhdGVkVm90ZXMpCiAgICBkaWcgNgogICAgY2FsbHN1YiB1MzIKICAgIGRpZyAxMQogICAgc3dhcAogICAgcmVwbGFjZTIgOAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxNTYKICAgIC8vIGNvbW1pdHRlZUJveC52YWx1ZSA9IGNsb25lKGNvbW1pdHRlZSkKICAgIGRpZyAxCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDEKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTI1CiAgICAvLyBwdWJsaWMgc3luY0NvbW1pdHRlZU1ldGFkYXRhKGNvbW1pdHRlZUlkOiBDb21taXR0ZWVJZCwgZGVsZWdhdGVkQWNjb3VudHM6IEFjY291bnRbXSkgewogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6OkRlbGVnYXRvci5zeW5jUHJvcG9zYWxNZXRhZGF0YVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnN5bmNQcm9wb3NhbE1ldGFkYXRhOgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gNgogICAgYnl0ZWNfMSAvLyAiIgogICAgZHVwbiA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE2MQogICAgLy8gcHVibGljIHN5bmNQcm9wb3NhbE1ldGFkYXRhKHByb3Bvc2FsSWQ6IEFwcGxpY2F0aW9uKTogRGVsZWdhdG9yUHJvcG9zYWwgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE2MwogICAgLy8gY29uc3QgcHJvcG9zYWxCb3ggPSB0aGlzLnByb3Bvc2Fscyhwcm9wb3NhbElkKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo4NQogICAgLy8gcHJvcG9zYWxzID0gQm94TWFwPEFwcGxpY2F0aW9uLCBEZWxlZ2F0b3JQcm9wb3NhbD4oeyBrZXlQcmVmaXg6ICdQJyB9KQogICAgYnl0ZWMgNiAvLyAiUCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE2NAogICAgLy8gZW5zdXJlKCFwcm9wb3NhbEJveC5leGlzdHMsIGVyclByb3Bvc2FsRXhpc3RzKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJ6IHN5bmNQcm9wb3NhbE1ldGFkYXRhX2FmdGVyX2lmX2Vsc2VAMjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTY0CiAgICAvLyBlbnN1cmUoIXByb3Bvc2FsQm94LmV4aXN0cywgZXJyUHJvcG9zYWxFeGlzdHMpCiAgICBwdXNoYnl0ZXMgIkVSUjpQX0VYIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnN5bmNQcm9wb3NhbE1ldGFkYXRhX2FmdGVyX2lmX2Vsc2VAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE2OQogICAgLy8gdGhpcy5jb21taXR0ZWVPcmFjbGVBcHAudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo3NwogICAgLy8gY29tbWl0dGVlT3JhY2xlQXBwID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KCkKICAgIGJ5dGVjIDQgLy8gImNvbW1pdHRlZU9yYWNsZUFwcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTY5CiAgICAvLyB0aGlzLmNvbW1pdHRlZU9yYWNsZUFwcC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE3MAogICAgLy8gZ2dvdlJlZ2lzdHJ5WEdvdktleSwKICAgIHB1c2hieXRlcyAieEdvdlJlZ2lzdHJ5QXBwIgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxNjgtMTcxCiAgICAvLyBjb25zdCBbcmVnaXN0cnlBcHBJZCwgcmVnaXN0cnlBcHBFeGlzdHNdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KAogICAgLy8gICB0aGlzLmNvbW1pdHRlZU9yYWNsZUFwcC52YWx1ZSwKICAgIC8vICAgZ2dvdlJlZ2lzdHJ5WEdvdktleSwKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IHN5bmNQcm9wb3NhbE1ldGFkYXRhX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTcyCiAgICAvLyBlbnN1cmUocmVnaXN0cnlBcHBFeGlzdHMsIGVyclhHb3ZSZWdpc3RyeU1pc3NpbmcpCiAgICBwdXNoYnl0ZXMgIkVSUjpYR1JNIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnN5bmNQcm9wb3NhbE1ldGFkYXRhX2FmdGVyX2lmX2Vsc2VAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE3MwogICAgLy8gY29uc3QgcHJvcG9zYWxDcmVhdG9yID0gcHJvcG9zYWxJZC5jcmVhdG9yCiAgICBkaWcgMQogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxNzQKICAgIC8vIGNvbnN0IHJlZ2lzdHJ5RXNjcm93ID0gQXBwbGljYXRpb24ocmVnaXN0cnlBcHBJZCkuYWRkcmVzcwogICAgZGlnIDcKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTc1CiAgICAvLyBlbnN1cmUocHJvcG9zYWxDcmVhdG9yID09PSByZWdpc3RyeUVzY3JvdywgZXJyWEdvdlByb3Bvc2FsSW52YWxpZENyZWF0b3IpCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogc3luY1Byb3Bvc2FsTWV0YWRhdGFfYWZ0ZXJfaWZfZWxzZUAzNgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxNzUKICAgIC8vIGVuc3VyZShwcm9wb3NhbENyZWF0b3IgPT09IHJlZ2lzdHJ5RXNjcm93LCBlcnJYR292UHJvcG9zYWxJbnZhbGlkQ3JlYXRvcikKICAgIHB1c2hieXRlcyAiRVJSOlhHUEMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKc3luY1Byb3Bvc2FsTWV0YWRhdGFfYWZ0ZXJfaWZfZWxzZUAzNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTc5CiAgICAvLyBjb25zdCBbX2NvbW1pdHRlZUlkLCBjb21taXR0ZWVJZEV4aXN0c10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhwcm9wb3NhbElkLCB4R292UHJvcG9zYWxDb21taXR0ZWVJZEtleSkKICAgIGRpZyAxCiAgICBwdXNoYnl0ZXMgImNvbW1pdHRlZV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiBzeW5jUHJvcG9zYWxNZXRhZGF0YV9hZnRlcl9pZl9lbHNlQDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE4MAogICAgLy8gZW5zdXJlKGNvbW1pdHRlZUlkRXhpc3RzLCBlcnJYR292UHJvcG9zYWxDb21taXR0ZWVNaXNzaW5nKQogICAgcHVzaGJ5dGVzICJFUlI6WEdQTSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgpzeW5jUHJvcG9zYWxNZXRhZGF0YV9hZnRlcl9pZl9lbHNlQDQwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxODEKICAgIC8vIGNvbnN0IGNvbW1pdHRlZUlkID0gbmV3IFN0YXRpY0J5dGVzPDMyPihfY29tbWl0dGVlSWQpCiAgICBkaWcgMTQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBzaXplCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjgzCiAgICAvLyBjb21taXR0ZWVzID0gQm94TWFwPENvbW1pdHRlZUlkLCBEZWxlZ2F0b3JDb21taXR0ZWU+KHsga2V5UHJlZml4OiAnQycgfSkKICAgIGJ5dGVjIDUgLy8gIkMiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxODMKICAgIC8vIGVuc3VyZShjb21taXR0ZWVCb3guZXhpc3RzLCBlcnJDb21taXR0ZWVOb3RFeGlzdHMpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IHN5bmNQcm9wb3NhbE1ldGFkYXRhX2FmdGVyX2lmX2Vsc2VANDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTgzCiAgICAvLyBlbnN1cmUoY29tbWl0dGVlQm94LmV4aXN0cywgZXJyQ29tbWl0dGVlTm90RXhpc3RzKQogICAgYnl0ZWMgMTUgLy8gIkVSUjpDX05YIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnN5bmNQcm9wb3NhbE1ldGFkYXRhX2FmdGVyX2lmX2Vsc2VANDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE4NAogICAgLy8gY29uc3QgY29tbWl0dGVlTWV0YWRhdGEgPSBjb21taXR0ZWVCb3gudmFsdWUgYXMgUmVhZG9ubHk8RGVsZWdhdG9yQ29tbWl0dGVlPgogICAgZGlnIDEzCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBib3hfZXh0cmFjdAogICAgZGlnIDIKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBkdXAKICAgIGJveF9leHRyYWN0CiAgICBidXJ5IDE0CiAgICB1bmNvdmVyIDIKICAgIGludGNfMiAvLyA4CiAgICBwdXNoaW50IDQgLy8gNAogICAgYm94X2V4dHJhY3QKICAgIGJ1cnkgMTQKICAgIGRpZyAxCiAgICBwdXNoaW50IDEyIC8vIDEyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBidXJ5IDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE4NgogICAgLy8gbGV0IHRvdGFsQWxnb0hvdXJzOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE5MAogICAgLy8gbGV0IHBlcmlvZDogdWludDY0ID0gY29tbWl0dGVlTWV0YWRhdGEucGVyaW9kU3RhcnQuYXNVaW50NjQoKTsKICAgIGJ0b2kKICAgIGJ1cnkgOAoKc3luY1Byb3Bvc2FsTWV0YWRhdGFfd2hpbGVfdG9wQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE5MQogICAgLy8gcGVyaW9kIDwgY29tbWl0dGVlTWV0YWRhdGEucGVyaW9kRW5kLmFzVWludDY0KCk7CiAgICBkaWcgMTAKICAgIGJ0b2kKICAgIGRpZyA4CiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE4OS0xOTMKICAgIC8vIGZvciAoCiAgICAvLyAgIGxldCBwZXJpb2Q6IHVpbnQ2NCA9IGNvbW1pdHRlZU1ldGFkYXRhLnBlcmlvZFN0YXJ0LmFzVWludDY0KCk7CiAgICAvLyAgIHBlcmlvZCA8IGNvbW1pdHRlZU1ldGFkYXRhLnBlcmlvZEVuZC5hc1VpbnQ2NCgpOwogICAgLy8gICBwZXJpb2QgKz0gcGVyaW9kTGVuZ3RoCiAgICAvLyApIHsKICAgIGJ6IHN5bmNQcm9wb3NhbE1ldGFkYXRhX2FmdGVyX3doaWxlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTk0CiAgICAvLyBjb25zdCBwZXJpb2RUb3RhbHNCb3ggPSB0aGlzLmFsZ29ob3VyUGVyaW9kVG90YWxzKHBlcmlvZCkKICAgIGRpZyA3CiAgICBpdG9iCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6ODcKICAgIC8vIGFsZ29ob3VyUGVyaW9kVG90YWxzID0gQm94TWFwPHVpbnQ2NCwgQWxnb2hvdXJQZXJpb2RUb3RhbHM+KHsga2V5UHJlZml4OiAnSCcgfSkKICAgIGJ5dGVjXzMgLy8gIkgiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxOTUKICAgIC8vIGVuc3VyZUV4dHJhKHBlcmlvZFRvdGFsc0JveC5leGlzdHMsIGVyckFsZ29Ib3Vyc05vdEV4aXN0LCBvcC5pdG9iKHBlcmlvZCkpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6NDAKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IHN5bmNQcm9wb3NhbE1ldGFkYXRhX2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6NDEKICAgIC8vIGxvZyhleHRyYSkKICAgIGRpZyA5CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTk1CiAgICAvLyBlbnN1cmVFeHRyYShwZXJpb2RUb3RhbHNCb3guZXhpc3RzLCBlcnJBbGdvSG91cnNOb3RFeGlzdCwgb3AuaXRvYihwZXJpb2QpKQogICAgYnl0ZWMgNyAvLyAiRVJSOkFIX05YIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czo0MgogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6NDMKICAgIC8vIGVycigpCiAgICBlcnIKCnN5bmNQcm9wb3NhbE1ldGFkYXRhX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjE5NgogICAgLy8gZW5zdXJlRXh0cmEocGVyaW9kVG90YWxzQm94LnZhbHVlLmZpbmFsLCBlcnJBbGdvSG91cnNOb3RGaW5hbCwgb3AuaXRvYihwZXJpb2QpKQogICAgZGlnIDgKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICBnZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6NDAKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IHN5bmNQcm9wb3NhbE1ldGFkYXRhX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6NDEKICAgIC8vIGxvZyhleHRyYSkKICAgIGRpZyA5CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTk2CiAgICAvLyBlbnN1cmVFeHRyYShwZXJpb2RUb3RhbHNCb3gudmFsdWUuZmluYWwsIGVyckFsZ29Ib3Vyc05vdEZpbmFsLCBvcC5pdG9iKHBlcmlvZCkpCiAgICBwdXNoYnl0ZXMgIkVSUjpBSF9ORiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6NDIKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjQzCiAgICAvLyBlcnIoKQogICAgZXJyCgpzeW5jUHJvcG9zYWxNZXRhZGF0YV9hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoxOTgKICAgIC8vIHRvdGFsQWxnb0hvdXJzICs9IHBlcmlvZFRvdGFsc0JveC52YWx1ZS50b3RhbEFsZ29ob3VycwogICAgZGlnIDgKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA1CiAgICArCiAgICBidXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTkyCiAgICAvLyBwZXJpb2QgKz0gcGVyaW9kTGVuZ3RoCiAgICBkaWcgNwogICAgaW50YyA0IC8vIDEwMDAwMDAKICAgICsKICAgIGJ1cnkgOAogICAgYiBzeW5jUHJvcG9zYWxNZXRhZGF0YV93aGlsZV90b3BAMgoKc3luY1Byb3Bvc2FsTWV0YWRhdGFfYWZ0ZXJfd2hpbGVANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjAyCiAgICAvLyBjb25zdCBbc3RhdHVzLCBzdGF0dXNFeGlzdHNdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHByb3Bvc2FsSWQsIHhHb3ZQcm9wb3NhbFN0YXR1c0tleSkKICAgIGRpZyAxCiAgICBkdXAKICAgIHB1c2hieXRlcyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGNvdmVyIDIKICAgIGJ1cnkgOAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyMDMKICAgIC8vIGNvbnN0IFt2b3RlT3BlblRzLCBfdm90ZU9wZW5Uc0V4aXN0c10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQocHJvcG9zYWxJZCwgeEdvdlByb3Bvc2FsVm90ZU9wZW5Uc0tleSkKICAgIGR1cAogICAgcHVzaGJ5dGVzICJ2b3RlX29wZW5fdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICBidXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjA0CiAgICAvLyBjb25zdCBbdm90aW5nRHVyYXRpb24sIF92b3RpbmdEdXJhdGlvbkV4aXN0c10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQocHJvcG9zYWxJZCwgeEdvdlByb3Bvc2FsVm90aW5nRHVyYXRpb25LZXkpCiAgICBwdXNoYnl0ZXMgInZvdGluZ19kdXJhdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIGJ1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogc3luY1Byb3Bvc2FsTWV0YWRhdGFfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyMDUKICAgIC8vIGVuc3VyZShzdGF0dXNFeGlzdHMsIGVyclhHb3ZQcm9wb3NhbFN0YXR1c01pc3NpbmcpCiAgICBwdXNoYnl0ZXMgIkVSUjpYR1NNIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnN5bmNQcm9wb3NhbE1ldGFkYXRhX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjIwOQogICAgLy8gZW5zdXJlKHN0YXR1cyA9PT0gU1RBVFVTX1ZPVElORyB8fCAoc3RhdHVzID09PSBTVEFUVVNfU1VCTUlUVEVEICYmIHZvdGVPcGVuVHMgPD0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCksIGVyclN0YXRlKQogICAgZGlnIDUKICAgIHB1c2hpbnQgMjUgLy8gMjUKICAgID09CiAgICBibnogc3luY1Byb3Bvc2FsTWV0YWRhdGFfYm9vbF90cnVlQDcKICAgIGRpZyA1CiAgICBwdXNoaW50IDIwIC8vIDIwCiAgICA9PQogICAgYnogc3luY1Byb3Bvc2FsTWV0YWRhdGFfYm9vbF9mYWxzZUA4CiAgICBkaWcgMwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGJ6IHN5bmNQcm9wb3NhbE1ldGFkYXRhX2Jvb2xfZmFsc2VAOAoKc3luY1Byb3Bvc2FsTWV0YWRhdGFfYm9vbF90cnVlQDc6CiAgICBpbnRjXzEgLy8gMQoKc3luY1Byb3Bvc2FsTWV0YWRhdGFfYm9vbF9tZXJnZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogc3luY1Byb3Bvc2FsTWV0YWRhdGFfYWZ0ZXJfaWZfZWxzZUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyMDkKICAgIC8vIGVuc3VyZShzdGF0dXMgPT09IFNUQVRVU19WT1RJTkcgfHwgKHN0YXR1cyA9PT0gU1RBVFVTX1NVQk1JVFRFRCAmJiB2b3RlT3BlblRzIDw9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXApLCBlcnJTdGF0ZSkKICAgIGJ5dGVjIDE2IC8vICJFUlI6U1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKc3luY1Byb3Bvc2FsTWV0YWRhdGFfYWZ0ZXJfaWZfZWxzZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjEwCiAgICAvLyBjb25zdCB2b3RlRW5kVHM6IHVpbnQ2NCA9IHZvdGVPcGVuVHMgKyB2b3RpbmdEdXJhdGlvbgogICAgZGlnIDMKICAgIGR1cAogICAgZGlnIDQKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjE1CiAgICAvLyBleHRWb3RlU3RhcnRUaW1lOiB1MzIodm90ZU9wZW5UcyksCiAgICBzd2FwCiAgICBjYWxsc3ViIHUzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyMTYKICAgIC8vIGV4dFZvdGVFbmRUaW1lOiB1MzIodm90ZUVuZFRzKSwKICAgIGRpZyAxCiAgICBjYWxsc3ViIHUzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyMTkKICAgIC8vIGV4dEFjY291bnRzVm90ZWQ6IFtdIGFzIEFjY291bnRJZFdpdGhWb3Rlc1tdLAogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjIwCiAgICAvLyBpbnRWb3RlRW5kVGltZTogdTMyKHZvdGVFbmRUcyAtIHRoaXMudm90ZVN1Ym1pdFRocmVzaG9sZC52YWx1ZSksIC8vIHNldCBpbnRlcm5hbCB2b3RlIGVuZCB0aW1lIGVhcmxpZXIgdGhhbiBleHRlcm5hbCB0byBhbGxvdyBmb3Igdm90ZSBzdWJtaXNzaW9uIGJlZm9yZSB4R292IHByb3Bvc2FsIHZvdGluZyBlbmRzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo3OQogICAgLy8gdm90ZVN1Ym1pdFRocmVzaG9sZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDM2MDAgKiAzIH0pCiAgICBieXRlYyAxMSAvLyAidm90ZVN1Ym1pdFRocmVzaG9sZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjIwCiAgICAvLyBpbnRWb3RlRW5kVGltZTogdTMyKHZvdGVFbmRUcyAtIHRoaXMudm90ZVN1Ym1pdFRocmVzaG9sZC52YWx1ZSksIC8vIHNldCBpbnRlcm5hbCB2b3RlIGVuZCB0aW1lIGVhcmxpZXIgdGhhbiBleHRlcm5hbCB0byBhbGxvdyBmb3Igdm90ZSBzdWJtaXNzaW9uIGJlZm9yZSB4R292IHByb3Bvc2FsIHZvdGluZyBlbmRzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgdW5jb3ZlciA0CiAgICBzd2FwCiAgICAtCiAgICBjYWxsc3ViIHUzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyMTItMjI3CiAgICAvLyBjb25zdCBwcm9wb3NhbE1ldGFkYXRhOiBEZWxlZ2F0b3JQcm9wb3NhbCA9IHsKICAgIC8vICAgc3RhdHVzOiAnV0FJVCcsCiAgICAvLyAgIGNvbW1pdHRlZUlkOiBjb21taXR0ZWVJZCwKICAgIC8vICAgZXh0Vm90ZVN0YXJ0VGltZTogdTMyKHZvdGVPcGVuVHMpLAogICAgLy8gICBleHRWb3RlRW5kVGltZTogdTMyKHZvdGVFbmRUcyksCiAgICAvLyAgIGV4dFRvdGFsVm90aW5nUG93ZXI6IGNvbW1pdHRlZU1ldGFkYXRhLmV4dERlbGVnYXRlZFZvdGVzLAogICAgLy8gICBleHRBY2NvdW50c1BlbmRpbmdWb3RlczogY2xvbmUoY29tbWl0dGVlTWV0YWRhdGEuZXh0RGVsZWdhdGVkQWNjb3VudFZvdGVzKSwKICAgIC8vICAgZXh0QWNjb3VudHNWb3RlZDogW10gYXMgQWNjb3VudElkV2l0aFZvdGVzW10sCiAgICAvLyAgIGludFZvdGVFbmRUaW1lOiB1MzIodm90ZUVuZFRzIC0gdGhpcy52b3RlU3VibWl0VGhyZXNob2xkLnZhbHVlKSwgLy8gc2V0IGludGVybmFsIHZvdGUgZW5kIHRpbWUgZWFybGllciB0aGFuIGV4dGVybmFsIHRvIGFsbG93IGZvciB2b3RlIHN1Ym1pc3Npb24gYmVmb3JlIHhHb3YgcHJvcG9zYWwgdm90aW5nIGVuZHMKICAgIC8vICAgaW50VG90YWxBbGdvaG91cnM6IHRvdGFsQWxnb0hvdXJzLAogICAgLy8gICBpbnRWb3RlZEFsZ29ob3VyczogMCwKICAgIC8vICAgaW50Vm90ZXNZZXNBbGdvaG91cnM6IDAsCiAgICAvLyAgIGludFZvdGVzTm9BbGdvaG91cnM6IDAsCiAgICAvLyAgIGludFZvdGVzQWJzdGFpbkFsZ29ob3VyczogMCwKICAgIC8vICAgaW50Vm90ZXNCb3ljb3R0QWxnb2hvdXJzOiAwLAogICAgLy8gfQogICAgcHVzaGJ5dGVzIDB4MDA2NgogICAgZGlnIDE5CiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgZGlnIDE0CiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwNmMKICAgIGNvbmNhdAogICAgZGlnIDE1CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgcHVzaGludCAxMDggLy8gMTA4CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDA0NTc0MTQ5NTQKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjIxOQogICAgLy8gZXh0QWNjb3VudHNWb3RlZDogW10gYXMgQWNjb3VudElkV2l0aFZvdGVzW10sCiAgICBieXRlYyAxNyAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjEyLTIyNwogICAgLy8gY29uc3QgcHJvcG9zYWxNZXRhZGF0YTogRGVsZWdhdG9yUHJvcG9zYWwgPSB7CiAgICAvLyAgIHN0YXR1czogJ1dBSVQnLAogICAgLy8gICBjb21taXR0ZWVJZDogY29tbWl0dGVlSWQsCiAgICAvLyAgIGV4dFZvdGVTdGFydFRpbWU6IHUzMih2b3RlT3BlblRzKSwKICAgIC8vICAgZXh0Vm90ZUVuZFRpbWU6IHUzMih2b3RlRW5kVHMpLAogICAgLy8gICBleHRUb3RhbFZvdGluZ1Bvd2VyOiBjb21taXR0ZWVNZXRhZGF0YS5leHREZWxlZ2F0ZWRWb3RlcywKICAgIC8vICAgZXh0QWNjb3VudHNQZW5kaW5nVm90ZXM6IGNsb25lKGNvbW1pdHRlZU1ldGFkYXRhLmV4dERlbGVnYXRlZEFjY291bnRWb3RlcyksCiAgICAvLyAgIGV4dEFjY291bnRzVm90ZWQ6IFtdIGFzIEFjY291bnRJZFdpdGhWb3Rlc1tdLAogICAgLy8gICBpbnRWb3RlRW5kVGltZTogdTMyKHZvdGVFbmRUcyAtIHRoaXMudm90ZVN1Ym1pdFRocmVzaG9sZC52YWx1ZSksIC8vIHNldCBpbnRlcm5hbCB2b3RlIGVuZCB0aW1lIGVhcmxpZXIgdGhhbiBleHRlcm5hbCB0byBhbGxvdyBmb3Igdm90ZSBzdWJtaXNzaW9uIGJlZm9yZSB4R292IHByb3Bvc2FsIHZvdGluZyBlbmRzCiAgICAvLyAgIGludFRvdGFsQWxnb2hvdXJzOiB0b3RhbEFsZ29Ib3VycywKICAgIC8vICAgaW50Vm90ZWRBbGdvaG91cnM6IDAsCiAgICAvLyAgIGludFZvdGVzWWVzQWxnb2hvdXJzOiAwLAogICAgLy8gICBpbnRWb3Rlc05vQWxnb2hvdXJzOiAwLAogICAgLy8gICBpbnRWb3Rlc0Fic3RhaW5BbGdvaG91cnM6IDAsCiAgICAvLyAgIGludFZvdGVzQm95Y290dEFsZ29ob3VyczogMCwKICAgIC8vIH0KICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyMjgKICAgIC8vIHByb3Bvc2FsQm94LnZhbHVlID0gY2xvbmUocHJvcG9zYWxNZXRhZGF0YSkKICAgIGRpZyAxCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDEKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MTYxCiAgICAvLyBwdWJsaWMgc3luY1Byb3Bvc2FsTWV0YWRhdGEocHJvcG9zYWxJZDogQXBwbGljYXRpb24pOiBEZWxlZ2F0b3JQcm9wb3NhbCB7CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpzeW5jUHJvcG9zYWxNZXRhZGF0YV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBzeW5jUHJvcG9zYWxNZXRhZGF0YV9ib29sX21lcmdlQDkKCgovLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjpEZWxlZ2F0b3Iudm90ZUludGVybmFsW3JvdXRpbmddKCkgLT4gdm9pZDoKdm90ZUludGVybmFsOgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gOAogICAgYnl0ZWNfMSAvLyAiIgogICAgZHVwbiAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyMzgKICAgIC8vIHB1YmxpYyB2b3RlSW50ZXJuYWwocHJvcG9zYWxJZDogQXBwbGljYXRpb24sIHZvdGVyQWNjb3VudDogQWNjb3VudCwgdm90ZTogRGVsZWdhdG9yVm90ZSk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMvYmFzZS90eXBlcy5hbGdvLnRzOjpEZWxlZ2F0b3JWb3RlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjI0MAogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT09IHZvdGVyQWNjb3VudCwgZXJyVW5hdXRob3JpemVkKQogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IHZvdGVJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDI2CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjI0MAogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT09IHZvdGVyQWNjb3VudCwgZXJyVW5hdXRob3JpemVkKQogICAgYnl0ZWMgMTggLy8gIkVSUjpBVVRIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnZvdGVJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyNDIKICAgIC8vIGNvbnN0IHByb3Bvc2FsQm94ID0gdGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkKICAgIGRpZyAyCiAgICBpdG9iCiAgICBkdXAKICAgIGJ1cnkgMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6ODUKICAgIC8vIHByb3Bvc2FscyA9IEJveE1hcDxBcHBsaWNhdGlvbiwgRGVsZWdhdG9yUHJvcG9zYWw+KHsga2V5UHJlZml4OiAnUCcgfSkKICAgIGJ5dGVjIDYgLy8gIlAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSAxOAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyNDMKICAgIC8vIGVuc3VyZShwcm9wb3NhbEJveC5leGlzdHMsIGVyclByb3Bvc2FsTm90RXhpc3RzKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiB2b3RlSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAzMAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyNDMKICAgIC8vIGVuc3VyZShwcm9wb3NhbEJveC5leGlzdHMsIGVyclByb3Bvc2FsTm90RXhpc3RzKQogICAgYnl0ZWMgMTkgLy8gIkVSUjpQX05YIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnZvdGVJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDMwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyNDQKICAgIC8vIGNvbnN0IHByb3Bvc2FsID0gY2xvbmUocHJvcG9zYWxCb3gudmFsdWUpCiAgICBkaWcgMTYKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAyMAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjQ1CiAgICAvLyBlbnN1cmUocHJvcG9zYWwuc3RhdHVzICE9PSAnQ0FOQycsIGVyclByb3Bvc2FsQ2FuY2VsbGVkKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBwdXNoaW50IDQ2IC8vIDQ2CiAgICBleHRyYWN0X3VpbnQxNgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHB1c2hieXRlcyAiQ0FOQyIKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiB2b3RlSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAzNAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyNDUKICAgIC8vIGVuc3VyZShwcm9wb3NhbC5zdGF0dXMgIT09ICdDQU5DJywgZXJyUHJvcG9zYWxDYW5jZWxsZWQpCiAgICBwdXNoYnl0ZXMgIkVSUjpQX0MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKdm90ZUludGVybmFsX2FmdGVyX2lmX2Vsc2VAMzQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjI0NwogICAgLy8gY29uc3QgY29tbWl0dGVlQm94ID0gdGhpcy5jb21taXR0ZWVzKHByb3Bvc2FsLmNvbW1pdHRlZUlkKQogICAgZGlnIDE2CiAgICBwdXNoaW50IDIgLy8gMgogICAgaW50Y18zIC8vIDMyCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo4MwogICAgLy8gY29tbWl0dGVlcyA9IEJveE1hcDxDb21taXR0ZWVJZCwgRGVsZWdhdG9yQ29tbWl0dGVlPih7IGtleVByZWZpeDogJ0MnIH0pCiAgICBieXRlYyA1IC8vICJDIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMjEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjQ4CiAgICAvLyBlbnN1cmUoY29tbWl0dGVlQm94LmV4aXN0cywgZXJyQ29tbWl0dGVlTm90RXhpc3RzKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiB2b3RlSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAzOAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyNDgKICAgIC8vIGVuc3VyZShjb21taXR0ZWVCb3guZXhpc3RzLCBlcnJDb21taXR0ZWVOb3RFeGlzdHMpCiAgICBieXRlYyAxNSAvLyAiRVJSOkNfTlgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKdm90ZUludGVybmFsX2FmdGVyX2lmX2Vsc2VAMzg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjI0OQogICAgLy8gY29uc3QgY29tbWl0dGVlID0gY29tbWl0dGVlQm94LnZhbHVlIGFzIFJlYWRvbmx5PERlbGVnYXRvckNvbW1pdHRlZT4KICAgIGRpZyAxOQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGludCA0IC8vIDQKICAgIGJveF9leHRyYWN0CiAgICBidXJ5IDIyCiAgICBwdXNoaW50IDQgLy8gNAogICAgZHVwCiAgICBib3hfZXh0cmFjdAogICAgYnVyeSAyMgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyNTEKICAgIC8vIGVuc3VyZShwcm9wb3NhbC5leHRWb3RlU3RhcnRUaW1lLmFzVWludDY0KCkgPD0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwgZXJyRWFybHkpCiAgICBkaWcgMTYKICAgIHB1c2hpbnRzIDM0IDQgLy8gMzQsIDQKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogdm90ZUludGVybmFsX2FmdGVyX2lmX2Vsc2VANDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjUxCiAgICAvLyBlbnN1cmUocHJvcG9zYWwuZXh0Vm90ZVN0YXJ0VGltZS5hc1VpbnQ2NCgpIDw9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsIGVyckVhcmx5KQogICAgYnl0ZWMgMjAgLy8gIkVSUjpFQVIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKdm90ZUludGVybmFsX2FmdGVyX2lmX2Vsc2VANDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjI1MgogICAgLy8gZW5zdXJlKEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPCBwcm9wb3NhbC5pbnRWb3RlRW5kVGltZS5hc1VpbnQ2NCgpLCBlcnJMYXRlKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZGlnIDE3CiAgICBwdXNoaW50cyA1MCA0IC8vIDUwLCA0CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgPAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogdm90ZUludGVybmFsX2FmdGVyX2lmX2Vsc2VANDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjUyCiAgICAvLyBlbnN1cmUoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA8IHByb3Bvc2FsLmludFZvdGVFbmRUaW1lLmFzVWludDY0KCksIGVyckxhdGUpCiAgICBieXRlYyAyMSAvLyAiRVJSOkxBVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgp2b3RlSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA0NjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjU1CiAgICAvLyBjb21taXR0ZWUucGVyaW9kU3RhcnQuYXNVaW50NjQoKSwKICAgIGRpZyAyMAogICAgYnRvaQogICAgZHVwCiAgICBidXJ5IDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjI1NgogICAgLy8gY29tbWl0dGVlLnBlcmlvZEVuZC5hc1VpbnQ2NCgpLAogICAgZGlnIDIyCiAgICBidG9pCiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDI3CiAgICAvLyBlbnN1cmUocGVyaW9kRW5kID4gcGVyaW9kU3RhcnQsIGVyclBlcmlvZEVuZExlc3NUaGFuU3RhcnQpCiAgICA8CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiB2b3RlSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0MjcKICAgIC8vIGVuc3VyZShwZXJpb2RFbmQgPiBwZXJpb2RTdGFydCwgZXJyUGVyaW9kRW5kTGVzc1RoYW5TdGFydCkKICAgIHB1c2hieXRlcyAiRVJSOlBFX0xUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnZvdGVJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0MjgKICAgIC8vIGVuc3VyZShwZXJpb2RTdGFydCAlIHBlcmlvZExlbmd0aCA9PT0gMCwgZXJyUGVyaW9kU3RhcnRJbnZhbGlkKQogICAgZGlnIDkKICAgIGludGMgNCAvLyAxMDAwMDAwCiAgICAlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJ6IHZvdGVJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDU0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQyOAogICAgLy8gZW5zdXJlKHBlcmlvZFN0YXJ0ICUgcGVyaW9kTGVuZ3RoID09PSAwLCBlcnJQZXJpb2RTdGFydEludmFsaWQpCiAgICBieXRlY18yIC8vICJFUlI6UFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKdm90ZUludGVybmFsX2FmdGVyX2lmX2Vsc2VANTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQyOQogICAgLy8gZW5zdXJlKHBlcmlvZEVuZCAlIHBlcmlvZExlbmd0aCA9PT0gMCwgZXJyUGVyaW9kRW5kSW52YWxpZCkKICAgIGRpZyAxMAogICAgaW50YyA0IC8vIDEwMDAwMDAKICAgICUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYnogdm90ZUludGVybmFsX2FmdGVyX2lmX2Vsc2VANTgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDI5CiAgICAvLyBlbnN1cmUocGVyaW9kRW5kICUgcGVyaW9kTGVuZ3RoID09PSAwLCBlcnJQZXJpb2RFbmRJbnZhbGlkKQogICAgcHVzaGJ5dGVzICJFUlI6UEUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKdm90ZUludGVybmFsX2FmdGVyX2lmX2Vsc2VANTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQzMAogICAgLy8gY29uc3QgYWNjb3VudElkID0gdGhpcy5nZXRBY2NvdW50SWRJZkV4aXN0cyhhY2NvdW50KQogICAgZGlnIDEKICAgIGNhbGxzdWIgZ2V0QWNjb3VudElkSWZFeGlzdHMKICAgIGR1cAogICAgYnVyeSAyNQogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0MzEKICAgIC8vIGlmIChhY2NvdW50SWQuYXNVaW50NjQoKSA9PT0gMCkgewogICAgYnRvaQogICAgYm56IHZvdGVJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDMyCiAgICAvLyByZXR1cm4gMAogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNAoKdm90ZUludGVybmFsX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo6RGVsZWdhdG9yLmdldEFnZ3JlZ2F0ZWRBY2NvdW50QWxnb0hvdXJzQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBkaWcgMwogICAgYm56IHZvdGVJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE4CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjI1OQogICAgLy8gZW5zdXJlKHZvdGluZ1Bvd2VyID4gMCwgZXJyTm9Wb3RpbmdQb3dlcikKICAgIGJ5dGVjIDE0IC8vICJFUlI6QV9OViIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgp2b3RlSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjYwCiAgICAvLyBjb25zdCB0b3RhbFZvdGVzQ2FzdDogdWludDY0ID0gdm90ZS55ZXNWb3RlcyArIHZvdGUubm9Wb3RlcyArIHZvdGUuYm95Y290dFZvdGVzICsgdm90ZS5hYnN0YWluVm90ZXMKICAgIGR1cG4gMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTAKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgMTAKICAgIHVuY292ZXIgMgogICAgKwogICAgZGlnIDEKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgOQogICAgKwogICAgc3dhcAogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA3CiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjYxCiAgICAvLyBlbnN1cmUodG90YWxWb3Rlc0Nhc3QgPT09IHZvdGluZ1Bvd2VyLCBlcnJJbmNvcnJlY3RWb3RlcykKICAgIGRpZyA0CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogdm90ZUludGVybmFsX2FmdGVyX2lmX2Vsc2VAMjIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjYxCiAgICAvLyBlbnN1cmUodG90YWxWb3Rlc0Nhc3QgPT09IHZvdGluZ1Bvd2VyLCBlcnJJbmNvcnJlY3RWb3RlcykKICAgIHB1c2hieXRlcyAiRVJSOklWIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnZvdGVJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyNjMKICAgIC8vIGNvbnN0IHZvdGVyQWNjb3VudElkID0gdGhpcy5tdXN0R2V0QWNjb3VudElkKHZvdGVyQWNjb3VudCkKICAgIGRpZyAxCiAgICBjYWxsc3ViIG11c3RHZXRBY2NvdW50SWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjY0CiAgICAvLyBjb25zdCB2b3RlQm94S2V5OiBWb3RlS2V5ID0gW3Byb3Bvc2FsSWQsIHZvdGVyQWNjb3VudElkXQogICAgZGlnIDE5CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6OTEKICAgIC8vIHZvdGVzID0gQm94TWFwPFZvdGVLZXksIERlbGVnYXRvclZvdGU+KHsga2V5UHJlZml4OiAnVicgfSkKICAgIHB1c2hieXRlcyAiViIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDE3CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjI2NwogICAgLy8gaWYgKHZvdGVCb3guZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IHZvdGVJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjY5CiAgICAvLyBjb25zdCBwcmV2aW91c1ZvdGUgPSB2b3RlQm94LnZhbHVlIGFzIFJlYWRvbmx5PERlbGVnYXRvclZvdGU+CiAgICBkaWcgMTUKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICB1bmNvdmVyIDMKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjI3MQogICAgLy8gcHJvcG9zYWwuaW50Vm90ZWRBbGdvaG91cnMgLT0gdG90YWxWb3Rlc0Nhc3QKICAgIGRpZyAyMAogICAgcHVzaGludCA2MiAvLyA2MgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMTMKICAgIC0KICAgIGl0b2IKICAgIGRpZyAyMgogICAgc3dhcAogICAgcmVwbGFjZTIgNjIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjcyCiAgICAvLyBwcm9wb3NhbC5pbnRWb3Rlc1llc0FsZ29ob3VycyAtPSBwcmV2aW91c1ZvdGUueWVzVm90ZXMKICAgIGR1cAogICAgcHVzaGludCA3MCAvLyA3MAogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgNQogICAgLQogICAgaXRvYgogICAgcmVwbGFjZTIgNzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjczCiAgICAvLyBwcm9wb3NhbC5pbnRWb3Rlc05vQWxnb2hvdXJzIC09IHByZXZpb3VzVm90ZS5ub1ZvdGVzCiAgICBkdXAKICAgIHB1c2hpbnQgNzggLy8gNzgKICAgIGV4dHJhY3RfdWludDY0CiAgICB1bmNvdmVyIDQKICAgIC0KICAgIGl0b2IKICAgIHJlcGxhY2UyIDc4CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjI3NAogICAgLy8gcHJvcG9zYWwuaW50Vm90ZXNCb3ljb3R0QWxnb2hvdXJzIC09IHByZXZpb3VzVm90ZS5ib3ljb3R0Vm90ZXMKICAgIGR1cAogICAgcHVzaGludCA5NCAvLyA5NAogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgLQogICAgaXRvYgogICAgcmVwbGFjZTIgOTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6Mjc1CiAgICAvLyBwcm9wb3NhbC5pbnRWb3Rlc0Fic3RhaW5BbGdvaG91cnMgLT0gcHJldmlvdXNWb3RlLmFic3RhaW5Wb3RlcwogICAgZHVwCiAgICBwdXNoaW50IDg2IC8vIDg2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAyCiAgICAtCiAgICBpdG9iCiAgICByZXBsYWNlMiA4NgogICAgYnVyeSAxOAoKdm90ZUludGVybmFsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6Mjc4CiAgICAvLyBpZiAocHJvcG9zYWwuc3RhdHVzICE9PSAnVk9URScpIHsKICAgIGRpZyAxNwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxNwogICAgZHVwCiAgICBwdXNoaW50IDQ2IC8vIDQ2CiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBidXJ5IDE3CiAgICBzd2FwCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgMjIgLy8gIlZPVEUiCiAgICAhPQogICAgYnogdm90ZUludGVybmFsX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyNzkKICAgIC8vIHByb3Bvc2FsLnN0YXR1cyA9ICdWT1RFJwogICAgZGlnIDE3CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBkaWcgMTcKICAgIGR1cAogICAgY292ZXIgNAogICAgZXh0cmFjdDMKICAgIHB1c2hieXRlcyAweDAwMDQ1NjRmNTQ0NQogICAgY29uY2F0CiAgICBkaWcgMQogICAgbGVuCiAgICBkaWcgMgogICAgZGlnIDE4CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICB1bmNvdmVyIDQKICAgIC0KICAgIHVuY292ZXIgMgogICAgcHVzaGludCA2IC8vIDYKICAgICsKICAgIGRpZyAxCiAgICAtCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICByZXBsYWNlMiA0NgogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDQ4IC8vIDQ4CiAgICBleHRyYWN0X3VpbnQxNgogICAgcHVzaGludCA2IC8vIDYKICAgICsKICAgIHVuY292ZXIgMgogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDQ4CiAgICBidXJ5IDE4Cgp2b3RlSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyODEKICAgIC8vIHByb3Bvc2FsLmludFZvdGVkQWxnb2hvdXJzICs9IHRvdGFsVm90ZXNDYXN0CiAgICBkaWcgMTcKICAgIGR1cAogICAgcHVzaGludCA2MiAvLyA2MgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxMAogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgNjIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjgyCiAgICAvLyBwcm9wb3NhbC5pbnRWb3Rlc1llc0FsZ29ob3VycyArPSB2b3RlLnllc1ZvdGVzCiAgICBkdXAKICAgIHB1c2hpbnQgNzAgLy8gNzAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgOQogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgNzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjgzCiAgICAvLyBwcm9wb3NhbC5pbnRWb3Rlc05vQWxnb2hvdXJzICs9IHZvdGUubm9Wb3RlcwogICAgZHVwCiAgICBwdXNoaW50IDc4IC8vIDc4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDgKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDc4CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjI4NAogICAgLy8gcHJvcG9zYWwuaW50Vm90ZXNCb3ljb3R0QWxnb2hvdXJzICs9IHZvdGUuYm95Y290dFZvdGVzCiAgICBkdXAKICAgIHB1c2hpbnQgOTQgLy8gOTQKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgNwogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgOTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6Mjg1CiAgICAvLyBwcm9wb3NhbC5pbnRWb3Rlc0Fic3RhaW5BbGdvaG91cnMgKz0gdm90ZS5hYnN0YWluVm90ZXMKICAgIGR1cAogICAgcHVzaGludCA4NiAvLyA4NgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA2CiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiA4NgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyODYKICAgIC8vIHZvdGVCb3gudmFsdWUgPSBjbG9uZSh2b3RlKQogICAgZGlnIDE2CiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czoyODcKICAgIC8vIHByb3Bvc2FsQm94LnZhbHVlID0gY2xvbmUocHJvcG9zYWwpCiAgICBkaWcgMTcKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjIzOAogICAgLy8gcHVibGljIHZvdGVJbnRlcm5hbChwcm9wb3NhbElkOiBBcHBsaWNhdGlvbiwgdm90ZXJBY2NvdW50OiBBY2NvdW50LCB2b3RlOiBEZWxlZ2F0b3JWb3RlKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgp2b3RlSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0MzQKICAgIC8vIGxldCBhbGdvaG91cnM6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCiAgICBkaWcgOQogICAgYnVyeSAxMgoKdm90ZUludGVybmFsX3doaWxlX3RvcEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0MzUKICAgIC8vIGZvciAobGV0IHBlcmlvZCA9IHBlcmlvZFN0YXJ0OyBwZXJpb2QgPCBwZXJpb2RFbmQ7IHBlcmlvZCArPSBwZXJpb2RMZW5ndGgpIHsKICAgIGRpZyAxMQogICAgZGlnIDExCiAgICA8CiAgICBieiB2b3RlSW50ZXJuYWxfYWZ0ZXJfd2hpbGVAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDM2CiAgICAvLyBjb25zdCBrZXk6IEFsZ29ob3VyQWNjb3VudEtleSA9IFtwZXJpb2QsIGFjY291bnRJZF0KICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDI0CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6ODkKICAgIC8vIGFsZ29ob3VyQWNjb3VudHMgPSBCb3hNYXA8QWxnb2hvdXJBY2NvdW50S2V5LCB1aW50NjQ+KHsga2V5UHJlZml4OiAnaCcgfSkKICAgIGJ5dGVjIDggLy8gImgiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0MzgKICAgIC8vIGFsZ29ob3VycyArPSBib3guZXhpc3RzID8gYm94LnZhbHVlIDogMAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiB2b3RlSW50ZXJuYWxfdGVybmFyeV9mYWxzZUAxMgogICAgZGlnIDIyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgYnRvaQoKdm90ZUludGVybmFsX3Rlcm5hcnlfbWVyZ2VAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQzOAogICAgLy8gYWxnb2hvdXJzICs9IGJveC5leGlzdHMgPyBib3gudmFsdWUgOiAwCiAgICBkaWcgMTMKICAgICsKICAgIGJ1cnkgMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDM1CiAgICAvLyBmb3IgKGxldCBwZXJpb2QgPSBwZXJpb2RTdGFydDsgcGVyaW9kIDwgcGVyaW9kRW5kOyBwZXJpb2QgKz0gcGVyaW9kTGVuZ3RoKSB7CiAgICBkaWcgMTEKICAgIGludGMgNCAvLyAxMDAwMDAwCiAgICArCiAgICBidXJ5IDEyCiAgICBiIHZvdGVJbnRlcm5hbF93aGlsZV90b3BAOQoKdm90ZUludGVybmFsX3Rlcm5hcnlfZmFsc2VAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQzOAogICAgLy8gYWxnb2hvdXJzICs9IGJveC5leGlzdHMgPyBib3gudmFsdWUgOiAwCiAgICBpbnRjXzAgLy8gMAogICAgYiB2b3RlSW50ZXJuYWxfdGVybmFyeV9tZXJnZUAxMwoKdm90ZUludGVybmFsX2FmdGVyX3doaWxlQDE0OgogICAgZGlnIDEyCiAgICBidXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MjU0LTI1OAogICAgLy8gY29uc3Qgdm90aW5nUG93ZXIgPSB0aGlzLmdldEFnZ3JlZ2F0ZWRBY2NvdW50QWxnb0hvdXJzKAogICAgLy8gICBjb21taXR0ZWUucGVyaW9kU3RhcnQuYXNVaW50NjQoKSwKICAgIC8vICAgY29tbWl0dGVlLnBlcmlvZEVuZC5hc1VpbnQ2NCgpLAogICAgLy8gICB2b3RlckFjY291bnQsCiAgICAvLyApCiAgICBiIHZvdGVJbnRlcm5hbF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6OkRlbGVnYXRvci5nZXRBZ2dyZWdhdGVkQWNjb3VudEFsZ29Ib3Vyc0AxNQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6OkRlbGVnYXRvci52b3RlRXh0ZXJuYWxbcm91dGluZ10oKSAtPiB2b2lkOgp2b3RlRXh0ZXJuYWw6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18xIC8vICIiCiAgICBkdXBuIDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzAxCiAgICAvLyBwdWJsaWMgdm90ZUV4dGVybmFsKHByb3Bvc2FsSWQ6IEFwcGxpY2F0aW9uLCBleHRBY2NvdW50czogQWNjb3VudFtdKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjXzMgLy8gMzIKICAgICoKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhY2NvdW50PgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozMDIKICAgIC8vIGNvbnN0IHByb3Bvc2FsQm94ID0gdGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6ODUKICAgIC8vIHByb3Bvc2FscyA9IEJveE1hcDxBcHBsaWNhdGlvbiwgRGVsZWdhdG9yUHJvcG9zYWw+KHsga2V5UHJlZml4OiAnUCcgfSkKICAgIGJ5dGVjIDYgLy8gIlAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozMDMKICAgIC8vIGVuc3VyZShwcm9wb3NhbEJveC5leGlzdHMsIGVyclByb3Bvc2FsTm90RXhpc3RzKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiB2b3RlRXh0ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozMDMKICAgIC8vIGVuc3VyZShwcm9wb3NhbEJveC5leGlzdHMsIGVyclByb3Bvc2FsTm90RXhpc3RzKQogICAgYnl0ZWMgMTkgLy8gIkVSUjpQX05YIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnZvdGVFeHRlcm5hbF9hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozMDQKICAgIC8vIGNvbnN0IHByb3Bvc2FsID0gY2xvbmUocHJvcG9zYWxCb3gudmFsdWUpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxNQogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzA2CiAgICAvLyBlbnN1cmUocHJvcG9zYWwuc3RhdHVzID09PSAnVk9URScsIGVyclN0YXRlKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBwdXNoaW50IDQ2IC8vIDQ2CiAgICBleHRyYWN0X3VpbnQxNgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDIyIC8vICJWT1RFIgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IHZvdGVFeHRlcm5hbF9hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjMwNgogICAgLy8gZW5zdXJlKHByb3Bvc2FsLnN0YXR1cyA9PT0gJ1ZPVEUnLCBlcnJTdGF0ZSkKICAgIGJ5dGVjIDE2IC8vICJFUlI6U1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKdm90ZUV4dGVybmFsX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjMwOAogICAgLy8gZW5zdXJlKHByb3Bvc2FsLmV4dFZvdGVTdGFydFRpbWUuYXNVaW50NjQoKSA8PSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wLCBlcnJFYXJseSkKICAgIGR1cAogICAgcHVzaGludHMgMzQgNCAvLyAzNCwgNAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiB2b3RlRXh0ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAyOAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozMDgKICAgIC8vIGVuc3VyZShwcm9wb3NhbC5leHRWb3RlU3RhcnRUaW1lLmFzVWludDY0KCkgPD0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwgZXJyRWFybHkpCiAgICBieXRlYyAyMCAvLyAiRVJSOkVBUiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgp2b3RlRXh0ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzA5CiAgICAvLyBlbnN1cmUoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA8IHByb3Bvc2FsLmV4dFZvdGVFbmRUaW1lLmFzVWludDY0KCksIGVyckxhdGUpCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkaWcgMQogICAgcHVzaGludHMgMzggNCAvLyAzOCwgNAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIDwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IHZvdGVFeHRlcm5hbF9hZnRlcl9pZl9lbHNlQDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjMwOQogICAgLy8gZW5zdXJlKEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPCBwcm9wb3NhbC5leHRWb3RlRW5kVGltZS5hc1VpbnQ2NCgpLCBlcnJMYXRlKQogICAgYnl0ZWMgMjEgLy8gIkVSUjpMQVQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKdm90ZUV4dGVybmFsX2FmdGVyX2lmX2Vsc2VAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjMxMAogICAgLy8gZW5zdXJlKHByb3Bvc2FsLmludFZvdGVkQWxnb2hvdXJzID4gMCwgZXJyTm9Wb3RlcykKICAgIGR1cAogICAgcHVzaGludCA2MiAvLyA2MgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkdXAKICAgIGJ1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogdm90ZUV4dGVybmFsX2FmdGVyX2lmX2Vsc2VAMzYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzEwCiAgICAvLyBlbnN1cmUocHJvcG9zYWwuaW50Vm90ZWRBbGdvaG91cnMgPiAwLCBlcnJOb1ZvdGVzKQogICAgcHVzaGJ5dGVzICJFUlI6TlYiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKdm90ZUV4dGVybmFsX2FmdGVyX2lmX2Vsc2VAMzY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjMxMQogICAgLy8gZW5zdXJlKGV4dEFjY291bnRzLmxlbmd0aCA9PT0gcHJvcG9zYWwuZXh0QWNjb3VudHNQZW5kaW5nVm90ZXMubGVuZ3RoLCBlcnJBY2NvdW50TnVtTWlzbWF0Y2gpCiAgICBkdXBuIDIKICAgIHB1c2hpbnRzIDQ2IDIgLy8gNDYsIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBwdXNoaW50IDIgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogdm90ZUV4dGVybmFsX2FmdGVyX2lmX2Vsc2VANDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzExCiAgICAvLyBlbnN1cmUoZXh0QWNjb3VudHMubGVuZ3RoID09PSBwcm9wb3NhbC5leHRBY2NvdW50c1BlbmRpbmdWb3Rlcy5sZW5ndGgsIGVyckFjY291bnROdW1NaXNtYXRjaCkKICAgIHB1c2hieXRlcyAiRVJSOkFOTSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgp2b3RlRXh0ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA0MDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzEzCiAgICAvLyBsZXQgdG90YWxBcHByb3ZhbHM6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzE0CiAgICAvLyBsZXQgdG90YWxSZWplY3Rpb25zOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjMxNQogICAgLy8gY29uc3QgaXNCb3ljb3R0ID0gcHJvcG9zYWwuaW50Vm90ZXNCb3ljb3R0QWxnb2hvdXJzICogMiA+PSBwcm9wb3NhbC5pbnRUb3RhbEFsZ29ob3VycwogICAgZHVwbiAyCiAgICBwdXNoaW50IDk0IC8vIDk0CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAqCiAgICBzd2FwCiAgICBwdXNoaW50IDU0IC8vIDU0CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGR1cAogICAgYnVyeSA3CiAgICA+PQogICAgZHVwCiAgICBidXJ5IDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjMxNgogICAgLy8gaWYgKCFpc0JveWNvdHQpIHsKICAgIGJueiB2b3RlRXh0ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjMxNwogICAgLy8gY29uc3QgZGVub21pbmF0b3IgPSB0aGlzLmFic2VudGVlTW9kZS52YWx1ZSA9PT0gJ3NjYWxlZCcgPyBwcm9wb3NhbC5pbnRWb3RlZEFsZ29ob3VycyA6IHByb3Bvc2FsLmludFRvdGFsQWxnb2hvdXJzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo4MQogICAgLy8gYWJzZW50ZWVNb2RlID0gR2xvYmFsU3RhdGU8c3RyaW5nPih7IGluaXRpYWxWYWx1ZTogJ3N0cmljdCcgfSkKICAgIGJ5dGVjIDEyIC8vICJhYnNlbnRlZU1vZGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjMxNwogICAgLy8gY29uc3QgZGVub21pbmF0b3IgPSB0aGlzLmFic2VudGVlTW9kZS52YWx1ZSA9PT0gJ3NjYWxlZCcgPyBwcm9wb3NhbC5pbnRWb3RlZEFsZ29ob3VycyA6IHByb3Bvc2FsLmludFRvdGFsQWxnb2hvdXJzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgcHVzaGJ5dGVzICJzY2FsZWQiCiAgICA9PQogICAgYnogdm90ZUV4dGVybmFsX3Rlcm5hcnlfZmFsc2VANAogICAgZGlnIDUKCnZvdGVFeHRlcm5hbF90ZXJuYXJ5X21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjMxOAogICAgLy8gdG90YWxBcHByb3ZhbHMgPSAocHJvcG9zYWwuaW50Vm90ZXNZZXNBbGdvaG91cnMgKiBwcm9wb3NhbC5leHRUb3RhbFZvdGluZ1Bvd2VyLmFzVWludDY0KCkpIC8gZGVub21pbmF0b3IKICAgIGRpZyAxCiAgICBkdXAKICAgIHB1c2hpbnQgNzAgLy8gNzAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDEKICAgIHB1c2hpbnRzIDQyIDQgLy8gNDIsIDQKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBzd2FwCiAgICBkaWcgMQogICAgKgogICAgZGlnIDMKICAgIC8KICAgIGJ1cnkgMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzE5CiAgICAvLyB0b3RhbFJlamVjdGlvbnMgPSAocHJvcG9zYWwuaW50Vm90ZXNOb0FsZ29ob3VycyAqIHByb3Bvc2FsLmV4dFRvdGFsVm90aW5nUG93ZXIuYXNVaW50NjQoKSkgLyBkZW5vbWluYXRvcgogICAgc3dhcAogICAgcHVzaGludCA3OCAvLyA3OAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAqCiAgICBzd2FwCiAgICAvCiAgICBidXJ5IDcKCnZvdGVFeHRlcm5hbF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjMyNAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGV4dEFjY291bnRzLmxlbmd0aDsgaSsrKSB7CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMAoKdm90ZUV4dGVybmFsX3doaWxlX3RvcEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozMjQKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBleHRBY2NvdW50cy5sZW5ndGg7IGkrKykgewogICAgZGlnIDkKICAgIGRpZyAyCiAgICA8CiAgICBieiB2b3RlRXh0ZXJuYWxfYWZ0ZXJfd2hpbGVAMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzI1CiAgICAvLyBjb25zdCBleHRBY2NvdW50ID0gZXh0QWNjb3VudHNbaV0KICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyAzMgogICAgKgogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgYnVyeSAxOAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYWNjb3VudC1pZC5hbGdvLnRzOjEyCiAgICAvLyBhY2NvdW50SWRzID0gQm94TWFwPEFjY291bnQsIFVpbnQzMj4oeyBrZXlQcmVmaXg6ICdhJyB9KQogICAgYnl0ZWMgOSAvLyAiYSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozMjYKICAgIC8vIGNvbnN0IGV4dEFjY291bnRJZCA9IHRoaXMuYWNjb3VudElkcyhleHRBY2NvdW50KS52YWx1ZQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzI3CiAgICAvLyBjb25zdCBleHRBY2NvdW50c1BlbmRpbmdWb3RlID0gY2xvbmUocHJvcG9zYWwuZXh0QWNjb3VudHNQZW5kaW5nVm90ZXNbaV0pCiAgICBkaWcgMTQKICAgIGR1cAogICAgcHVzaGludCA0NiAvLyA0NgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBwdXNoaW50IDQ4IC8vIDQ4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBidXJ5IDE3CiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGJ1cnkgMTgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzI3LTMyOAogICAgLy8gY29uc3QgZXh0QWNjb3VudHNQZW5kaW5nVm90ZSA9IGNsb25lKHByb3Bvc2FsLmV4dEFjY291bnRzUGVuZGluZ1ZvdGVzW2ldKQogICAgLy8gZW5zdXJlRXh0cmEoZXh0QWNjb3VudElkID09PSBleHRBY2NvdW50c1BlbmRpbmdWb3RlLmFjY291bnRJZCwgZXJyQWNjb3VudElkTWlzbWF0Y2gsIG9wLml0b2IoaSkpCiAgICBleHRyYWN0IDAgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozMjgKICAgIC8vIGVuc3VyZUV4dHJhKGV4dEFjY291bnRJZCA9PT0gZXh0QWNjb3VudHNQZW5kaW5nVm90ZS5hY2NvdW50SWQsIGVyckFjY291bnRJZE1pc21hdGNoLCBvcC5pdG9iKGkpKQogICAgPT0KICAgIHN3YXAKICAgIGl0b2IKICAgIGJ1cnkgMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6NDAKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IHZvdGVFeHRlcm5hbF9hZnRlcl9pZl9lbHNlQDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjQxCiAgICAvLyBsb2coZXh0cmEpCiAgICBkaWcgMTMKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozMjgKICAgIC8vIGVuc3VyZUV4dHJhKGV4dEFjY291bnRJZCA9PT0gZXh0QWNjb3VudHNQZW5kaW5nVm90ZS5hY2NvdW50SWQsIGVyckFjY291bnRJZE1pc21hdGNoLCBvcC5pdG9iKGkpKQogICAgcHVzaGJ5dGVzICJFUlI6SUQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjQyCiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czo0MwogICAgLy8gZXJyKCkKICAgIGVycgoKdm90ZUV4dGVybmFsX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjMzMgogICAgLy8gaWYgKGlzQm95Y290dCkgewogICAgZGlnIDgKICAgIGJ6IHZvdGVFeHRlcm5hbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzMzCiAgICAvLyBhcHByb3ZhbHMgPSBleHRBY2NvdW50c1BlbmRpbmdWb3RlLnZvdGVzLmFzVWludDY0KCkKICAgIGRpZyAxNAogICAgcHVzaGludCA0IC8vIDQKICAgIGV4dHJhY3RfdWludDMyCiAgICBkdXAKICAgIGJ1cnkgMTIKCnZvdGVFeHRlcm5hbF9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozNDItMzQ1CiAgICAvLyBjb21waWxlQXJjNChYR292UHJvcG9zYWxNb2NrKS5jYWxsLnZvdGUoewogICAgLy8gICBhcHBJZDogcHJvcG9zYWxJZCwKICAgIC8vICAgYXJnczogW2V4dEFjY291bnQsIGFwcHJvdmFscywgcmVqZWN0aW9uc10sCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozNDQKICAgIC8vIGFyZ3M6IFtleHRBY2NvdW50LCBhcHByb3ZhbHMsIHJlamVjdGlvbnNdLAogICAgZGlnIDExCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjM0Mi0zNDUKICAgIC8vIGNvbXBpbGVBcmM0KFhHb3ZQcm9wb3NhbE1vY2spLmNhbGwudm90ZSh7CiAgICAvLyAgIGFwcElkOiBwcm9wb3NhbElkLAogICAgLy8gICBhcmdzOiBbZXh0QWNjb3VudCwgYXBwcm92YWxzLCByZWplY3Rpb25zXSwKICAgIC8vIH0pCiAgICBwdXNoYnl0ZXMgMHgxODQxYTBkMiAvLyBtZXRob2QgInZvdGUoYWRkcmVzcyx1aW50NjQsdWludDY0KXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgMTcKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgZGlnIDMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzQ2CiAgICAvLyBwcm9wb3NhbC5leHRBY2NvdW50c1ZvdGVkLnB1c2goZXh0QWNjb3VudHNQZW5kaW5nVm90ZSkKICAgIGRpZyAxMgogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBkaWcgMTQKICAgIGR1cAogICAgY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGRpZyAxOAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgZXh0cmFjdDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnVyeSAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozMjQKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBleHRBY2NvdW50cy5sZW5ndGg7IGkrKykgewogICAgZGlnIDkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEwCiAgICBiIHZvdGVFeHRlcm5hbF93aGlsZV90b3BANwoKdm90ZUV4dGVybmFsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzM3CiAgICAvLyBhcHByb3ZhbHMgPSAodG90YWxBcHByb3ZhbHMgKiBleHRBY2NvdW50c1BlbmRpbmdWb3RlLnZvdGVzLmFzVWludDY0KCkpIC8gcHJvcG9zYWwuZXh0VG90YWxWb3RpbmdQb3dlci5hc1VpbnQ2NCgpCiAgICBkaWcgMTQKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBleHRyYWN0X3VpbnQzMgogICAgZGlnIDgKICAgIGRpZyAxCiAgICAqCiAgICBkaWcgMTQKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgIGV4dHJhY3RfdWludDMyCiAgICBzd2FwCiAgICBkaWcgMQogICAgLwogICAgYnVyeSAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozMzkKICAgIC8vICh0b3RhbFJlamVjdGlvbnMgKiBleHRBY2NvdW50c1BlbmRpbmdWb3RlLnZvdGVzLmFzVWludDY0KCkpIC8gcHJvcG9zYWwuZXh0VG90YWxWb3RpbmdQb3dlci5hc1VpbnQ2NCgpCiAgICBkaWcgOAogICAgdW5jb3ZlciAyCiAgICAqCiAgICBzd2FwCiAgICAvCiAgICBiIHZvdGVFeHRlcm5hbF9hZnRlcl9pZl9lbHNlQDExCgp2b3RlRXh0ZXJuYWxfYWZ0ZXJfd2hpbGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjM0OAogICAgLy8gcHJvcG9zYWwuZXh0QWNjb3VudHNQZW5kaW5nVm90ZXMgPSBbXQogICAgZGlnIDEyCiAgICBkdXAKICAgIHB1c2hpbnQgNDYgLy8gNDYKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGRpZyAyCiAgICBleHRyYWN0MwogICAgYnl0ZWMgMTcgLy8gMHgwMDAwCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBwdXNoaW50IDQ4IC8vIDQ4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciA0CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIHVuY292ZXIgMwogICAgLQogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgc3dhcAogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDQ4CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjM0OQogICAgLy8gcHJvcG9zYWwuc3RhdHVzID0gJ1ZPVEQnCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBkaWcgMgogICAgZXh0cmFjdDMKICAgIHB1c2hieXRlcyAweDAwMDQ1NjRmNTQ0NAogICAgY29uY2F0CiAgICBkaWcgMgogICAgcHVzaGludCA0NiAvLyA0NgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA0CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIHVuY292ZXIgMwogICAgLQogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDYgLy8gNgogICAgKwogICAgZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIHJlcGxhY2UyIDQ2CiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgNDggLy8gNDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDYgLy8gNgogICAgKwogICAgdW5jb3ZlciAyCiAgICAtCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgNDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzUwCiAgICAvLyBwcm9wb3NhbEJveC52YWx1ZSA9IGNsb25lKHByb3Bvc2FsKQogICAgZGlnIDEKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjMwMQogICAgLy8gcHVibGljIHZvdGVFeHRlcm5hbChwcm9wb3NhbElkOiBBcHBsaWNhdGlvbiwgZXh0QWNjb3VudHM6IEFjY291bnRbXSk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKdm90ZUV4dGVybmFsX3Rlcm5hcnlfZmFsc2VANDoKICAgIGRpZyA0CiAgICBiIHZvdGVFeHRlcm5hbF90ZXJuYXJ5X21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjpEZWxlZ2F0b3IuYWRkQWNjb3VudEFsZ29Ib3Vyc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFkZEFjY291bnRBbGdvSG91cnM6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18xIC8vICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzU4CiAgICAvLyBwdWJsaWMgYWRkQWNjb3VudEFsZ29Ib3VycyhwZXJpb2RTdGFydDogdWludDY0LCBhY2NvdW50QWxnb2hvdXJJbnB1dHM6IEFjY291bnRBbGdvaG91cklucHV0W10pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgICoKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMvYmFzZS90eXBlcy5hbGdvLnRzOjpBY2NvdW50QWxnb2hvdXJJbnB1dD4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzU5CiAgICAvLyB0aGlzLmVuc3VyZUNhbGxlcklzQWRtaW4oKQogICAgY2FsbHN1YiBlbnN1cmVDYWxsZXJJc0FkbWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjM2MAogICAgLy8gZW5zdXJlKHBlcmlvZFN0YXJ0ICUgcGVyaW9kTGVuZ3RoID09PSAwLCBlcnJQZXJpb2RTdGFydEludmFsaWQpCiAgICBpbnRjIDQgLy8gMTAwMDAwMAogICAgJQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBieiBhZGRBY2NvdW50QWxnb0hvdXJzX2FmdGVyX2lmX2Vsc2VAMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzYwCiAgICAvLyBlbnN1cmUocGVyaW9kU3RhcnQgJSBwZXJpb2RMZW5ndGggPT09IDAsIGVyclBlcmlvZFN0YXJ0SW52YWxpZCkKICAgIGJ5dGVjXzIgLy8gIkVSUjpQUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgphZGRBY2NvdW50QWxnb0hvdXJzX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA0CgphZGRBY2NvdW50QWxnb0hvdXJzX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzYyCiAgICAvLyBmb3IgKGNvbnN0IHsgYWNjb3VudCwgaG91cnMgfSBvZiBjbG9uZShhY2NvdW50QWxnb2hvdXJJbnB1dHMpKSB7CiAgICBkaWcgMwogICAgZGlnIDEKICAgIDwKICAgIGJ6IGFkZEFjY291bnRBbGdvSG91cnNfYWZ0ZXJfZm9yQDgKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDQKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgICoKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxMQogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjM2MwogICAgLy8gY29uc3QgYWNjb3VudElkID0gdGhpcy5nZXRPckNyZWF0ZUFjY291bnRJZChhY2NvdW50KQogICAgY2FsbHN1YiBnZXRPckNyZWF0ZUFjY291bnRJZAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozNjQKICAgIC8vIGNvbnN0IGtleTogQWxnb2hvdXJBY2NvdW50S2V5ID0gW3BlcmlvZFN0YXJ0LCBhY2NvdW50SWRdCiAgICBkaWcgMwogICAgaXRvYgogICAgZHVwCiAgICBidXJ5IDEwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6ODkKICAgIC8vIGFsZ29ob3VyQWNjb3VudHMgPSBCb3hNYXA8QWxnb2hvdXJBY2NvdW50S2V5LCB1aW50NjQ+KHsga2V5UHJlZml4OiAnaCcgfSkKICAgIGJ5dGVjIDggLy8gImgiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjM2NgogICAgLy8gZW5zdXJlRXh0cmEoIWJveC5leGlzdHMsIGVyckFsZ29Ib3Vyc0V4aXN0LCBhY2NvdW50LmJ5dGVzKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjQwCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJ6IGFkZEFjY291bnRBbGdvSG91cnNfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czo0MQogICAgLy8gbG9nKGV4dHJhKQogICAgZGlnIDgKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozNjYKICAgIC8vIGVuc3VyZUV4dHJhKCFib3guZXhpc3RzLCBlcnJBbGdvSG91cnNFeGlzdCwgYWNjb3VudC5ieXRlcykKICAgIHB1c2hieXRlcyAiRVJSOkFIX0VYIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czo0MgogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6NDMKICAgIC8vIGVycigpCiAgICBlcnIKCmFkZEFjY291bnRBbGdvSG91cnNfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzY3CiAgICAvLyBib3gudmFsdWUgPSBob3VycwogICAgZGlnIDQKICAgIGl0b2IKICAgIGR1cAogICAgYnVyeSA3CiAgICBkaWcgNwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo4NwogICAgLy8gYWxnb2hvdXJQZXJpb2RUb3RhbHMgPSBCb3hNYXA8dWludDY0LCBBbGdvaG91clBlcmlvZFRvdGFscz4oeyBrZXlQcmVmaXg6ICdIJyB9KQogICAgYnl0ZWNfMyAvLyAiSCIKICAgIGRpZyA4CiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozNzAKICAgIC8vIGlmICh0b3RhbEJveC5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYWRkQWNjb3VudEFsZ29Ib3Vyc19lbHNlX2JvZHlANQogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozNzEKICAgIC8vIHRvdGFsQm94LnZhbHVlLnRvdGFsQWxnb2hvdXJzICs9IGhvdXJzCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA2CiAgICArCiAgICBpdG9iCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKCmFkZEFjY291bnRBbGdvSG91cnNfYWZ0ZXJfaWZfZWxzZUA2OgogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDQKICAgIGIgYWRkQWNjb3VudEFsZ29Ib3Vyc19mb3JfaGVhZGVyQDIKCmFkZEFjY291bnRBbGdvSG91cnNfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjM3MwogICAgLy8gdG90YWxCb3gudmFsdWUgPSB7IHRvdGFsQWxnb2hvdXJzOiBob3VycywgZmluYWw6IGZhbHNlIH0KICAgIGRpZyA2CiAgICBwdXNoYnl0ZXMgMHgwMAogICAgY29uY2F0CiAgICBib3hfcHV0CiAgICBiIGFkZEFjY291bnRBbGdvSG91cnNfYWZ0ZXJfaWZfZWxzZUA2CgphZGRBY2NvdW50QWxnb0hvdXJzX2FmdGVyX2ZvckA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozNTgKICAgIC8vIHB1YmxpYyBhZGRBY2NvdW50QWxnb0hvdXJzKHBlcmlvZFN0YXJ0OiB1aW50NjQsIGFjY291bnRBbGdvaG91cklucHV0czogQWNjb3VudEFsZ29ob3VySW5wdXRbXSk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6OkRlbGVnYXRvci5yZW1vdmVBY2NvdW50QWxnb0hvdXJzW3JvdXRpbmddKCkgLT4gdm9pZDoKcmVtb3ZlQWNjb3VudEFsZ29Ib3VyczoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDMKICAgIGJ5dGVjXzEgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozODMKICAgIC8vIHB1YmxpYyByZW1vdmVBY2NvdW50QWxnb0hvdXJzKHBlcmlvZFN0YXJ0OiB1aW50NjQsIGFjY291bnRBbGdvaG91cklucHV0czogQWNjb3VudEFsZ29ob3VySW5wdXRbXSk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgcHVzaGludCA0MCAvLyA0MAogICAgKgogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3R5cGVzLmFsZ28udHM6OkFjY291bnRBbGdvaG91cklucHV0PgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozODQKICAgIC8vIHRoaXMuZW5zdXJlQ2FsbGVySXNBZG1pbigpCiAgICBjYWxsc3ViIGVuc3VyZUNhbGxlcklzQWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6Mzg1CiAgICAvLyBlbnN1cmUocGVyaW9kU3RhcnQgJSBwZXJpb2RMZW5ndGggPT09IDAsIGVyclBlcmlvZFN0YXJ0SW52YWxpZCkKICAgIGludGMgNCAvLyAxMDAwMDAwCiAgICAlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJ6IHJlbW92ZUFjY291bnRBbGdvSG91cnNfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozODUKICAgIC8vIGVuc3VyZShwZXJpb2RTdGFydCAlIHBlcmlvZExlbmd0aCA9PT0gMCwgZXJyUGVyaW9kU3RhcnRJbnZhbGlkKQogICAgYnl0ZWNfMiAvLyAiRVJSOlBTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnJlbW92ZUFjY291bnRBbGdvSG91cnNfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDQKCnJlbW92ZUFjY291bnRBbGdvSG91cnNfZm9yX2hlYWRlckAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozODcKICAgIC8vIGZvciAoY29uc3QgeyBhY2NvdW50LCBob3VycyB9IG9mIGNsb25lKGFjY291bnRBbGdvaG91cklucHV0cykpIHsKICAgIGRpZyAzCiAgICBkaWcgMQogICAgPAogICAgYnogcmVtb3ZlQWNjb3VudEFsZ29Ib3Vyc19hZnRlcl9mb3JANQogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgNAogICAgcHVzaGludCA0MCAvLyA0MAogICAgKgogICAgcHVzaGludCA0MCAvLyA0MAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDExCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6Mzg4CiAgICAvLyBjb25zdCBhY2NvdW50SWQgPSB0aGlzLm11c3RHZXRBY2NvdW50SWQoYWNjb3VudCkKICAgIGNhbGxzdWIgbXVzdEdldEFjY291bnRJZAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozODkKICAgIC8vIGNvbnN0IGtleTogQWxnb2hvdXJBY2NvdW50S2V5ID0gW3BlcmlvZFN0YXJ0LCBhY2NvdW50SWRdCiAgICBkaWcgMwogICAgaXRvYgogICAgZHVwCiAgICBidXJ5IDEwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6ODkKICAgIC8vIGFsZ29ob3VyQWNjb3VudHMgPSBCb3hNYXA8QWxnb2hvdXJBY2NvdW50S2V5LCB1aW50NjQ+KHsga2V5UHJlZml4OiAnaCcgfSkKICAgIGJ5dGVjIDggLy8gImgiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjM5MQogICAgLy8gZW5zdXJlRXh0cmEoYm94LmV4aXN0cywgZXJyQWxnb0hvdXJzTm90RXhpc3QsIGFjY291bnQuYnl0ZXMpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6NDAKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IHJlbW92ZUFjY291bnRBbGdvSG91cnNfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjQxCiAgICAvLyBsb2coZXh0cmEpCiAgICBkaWcgOAogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjM5MQogICAgLy8gZW5zdXJlRXh0cmEoYm94LmV4aXN0cywgZXJyQWxnb0hvdXJzTm90RXhpc3QsIGFjY291bnQuYnl0ZXMpCiAgICBieXRlYyA3IC8vICJFUlI6QUhfTlgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjQyCiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czo0MwogICAgLy8gZXJyKCkKICAgIGVycgoKcmVtb3ZlQWNjb3VudEFsZ29Ib3Vyc19hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjM5MgogICAgLy8gZW5zdXJlRXh0cmEoYm94LnZhbHVlID09PSBob3VycywgZXJyQWxnb0hvdXJzTWlzbWF0Y2gsIGFjY291bnQuYnl0ZXMpIC8vIGVuc3VyZSBob3VycyB0byByZW1vdmUgbWF0Y2hlcyBleGlzdGluZyBob3VycyB0byBwcmV2ZW50IGFjY2lkZW50YWwgZG91YmxlIHJlbW92YWwKICAgIGRpZyA2CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgYnRvaQogICAgZGlnIDUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjQwCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiByZW1vdmVBY2NvdW50QWxnb0hvdXJzX2FmdGVyX2lmX2Vsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6NDEKICAgIC8vIGxvZyhleHRyYSkKICAgIGRpZyA4CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzkyCiAgICAvLyBlbnN1cmVFeHRyYShib3gudmFsdWUgPT09IGhvdXJzLCBlcnJBbGdvSG91cnNNaXNtYXRjaCwgYWNjb3VudC5ieXRlcykgLy8gZW5zdXJlIGhvdXJzIHRvIHJlbW92ZSBtYXRjaGVzIGV4aXN0aW5nIGhvdXJzIHRvIHByZXZlbnQgYWNjaWRlbnRhbCBkb3VibGUgcmVtb3ZhbAogICAgYnl0ZWMgMjMgLy8gIkVSUjpBSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6NDIKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjQzCiAgICAvLyBlcnIoKQogICAgZXJyCgpyZW1vdmVBY2NvdW50QWxnb0hvdXJzX2FmdGVyX2lmX2Vsc2VAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjM5MwogICAgLy8gYm94LmRlbGV0ZSgpCiAgICBkaWcgNgogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjg3CiAgICAvLyBhbGdvaG91clBlcmlvZFRvdGFscyA9IEJveE1hcDx1aW50NjQsIEFsZ29ob3VyUGVyaW9kVG90YWxzPih7IGtleVByZWZpeDogJ0gnIH0pCiAgICBieXRlY18zIC8vICJIIgogICAgZGlnIDgKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6Mzk2CiAgICAvLyBlbnN1cmUodG90YWxCb3guZXhpc3RzLCBlcnJBbGdvSG91cnNOb3RFeGlzdCkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogcmVtb3ZlQWNjb3VudEFsZ29Ib3Vyc19hZnRlcl9pZl9lbHNlQDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjM5NgogICAgLy8gZW5zdXJlKHRvdGFsQm94LmV4aXN0cywgZXJyQWxnb0hvdXJzTm90RXhpc3QpCiAgICBieXRlYyA3IC8vICJFUlI6QUhfTlgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKcmVtb3ZlQWNjb3VudEFsZ29Ib3Vyc19hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czozOTcKICAgIC8vIHRvdGFsQm94LnZhbHVlLnRvdGFsQWxnb2hvdXJzIC09IGhvdXJzCiAgICBkaWcgNQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgNgogICAgLQogICAgaXRvYgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICBkaWcgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNAogICAgYiByZW1vdmVBY2NvdW50QWxnb0hvdXJzX2Zvcl9oZWFkZXJAMgoKcmVtb3ZlQWNjb3VudEFsZ29Ib3Vyc19hZnRlcl9mb3JANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6MzgzCiAgICAvLyBwdWJsaWMgcmVtb3ZlQWNjb3VudEFsZ29Ib3VycyhwZXJpb2RTdGFydDogdWludDY0LCBhY2NvdW50QWxnb2hvdXJJbnB1dHM6IEFjY291bnRBbGdvaG91cklucHV0W10pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjpEZWxlZ2F0b3IudXBkYXRlQWxnb0hvdXJQZXJpb2RGaW5hbGl0eVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnVwZGF0ZUFsZ29Ib3VyUGVyaW9kRmluYWxpdHk6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0MDYKICAgIC8vIHB1YmxpYyB1cGRhdGVBbGdvSG91clBlcmlvZEZpbmFsaXR5KHBlcmlvZFN0YXJ0OiB1aW50NjQsIHRvdGFsQWxnb2hvdXJzOiB1aW50NjQsIGZpbmFsOiBib29sZWFuKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQwNwogICAgLy8gdGhpcy5lbnN1cmVDYWxsZXJJc0FkbWluKCkKICAgIGNhbGxzdWIgZW5zdXJlQ2FsbGVySXNBZG1pbgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0MDgKICAgIC8vIGVuc3VyZShwZXJpb2RTdGFydCAlIHBlcmlvZExlbmd0aCA9PT0gMCwgZXJyUGVyaW9kU3RhcnRJbnZhbGlkKQogICAgaW50YyA0IC8vIDEwMDAwMDAKICAgICUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYnogdXBkYXRlQWxnb0hvdXJQZXJpb2RGaW5hbGl0eV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDA4CiAgICAvLyBlbnN1cmUocGVyaW9kU3RhcnQgJSBwZXJpb2RMZW5ndGggPT09IDAsIGVyclBlcmlvZFN0YXJ0SW52YWxpZCkKICAgIGJ5dGVjXzIgLy8gIkVSUjpQUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgp1cGRhdGVBbGdvSG91clBlcmlvZEZpbmFsaXR5X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDA5CiAgICAvLyBjb25zdCBib3ggPSB0aGlzLmFsZ29ob3VyUGVyaW9kVG90YWxzKHBlcmlvZFN0YXJ0KQogICAgZGlnIDIKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6ODcKICAgIC8vIGFsZ29ob3VyUGVyaW9kVG90YWxzID0gQm94TWFwPHVpbnQ2NCwgQWxnb2hvdXJQZXJpb2RUb3RhbHM+KHsga2V5UHJlZml4OiAnSCcgfSkKICAgIGJ5dGVjXzMgLy8gIkgiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQxMAogICAgLy8gZW5zdXJlKGJveC5leGlzdHMsIGVyckFsZ29Ib3Vyc05vdEV4aXN0KQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiB1cGRhdGVBbGdvSG91clBlcmlvZEZpbmFsaXR5X2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0MTAKICAgIC8vIGVuc3VyZShib3guZXhpc3RzLCBlcnJBbGdvSG91cnNOb3RFeGlzdCkKICAgIGJ5dGVjIDcgLy8gIkVSUjpBSF9OWCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgp1cGRhdGVBbGdvSG91clBlcmlvZEZpbmFsaXR5X2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDExCiAgICAvLyBlbnN1cmUoYm94LnZhbHVlLnRvdGFsQWxnb2hvdXJzID09PSB0b3RhbEFsZ29ob3VycywgZXJyQWxnb0hvdXJzTWlzbWF0Y2gpCiAgICBkaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiB1cGRhdGVBbGdvSG91clBlcmlvZEZpbmFsaXR5X2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDExCiAgICAvLyBlbnN1cmUoYm94LnZhbHVlLnRvdGFsQWxnb2hvdXJzID09PSB0b3RhbEFsZ29ob3VycywgZXJyQWxnb0hvdXJzTWlzbWF0Y2gpCiAgICBieXRlYyAyMyAvLyAiRVJSOkFIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnVwZGF0ZUFsZ29Ib3VyUGVyaW9kRmluYWxpdHlfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDEyCiAgICAvLyBib3gudmFsdWUuZmluYWwgPSBmaW5hbAogICAgZGlnIDMKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIGRpZyAzCiAgICBzZXRiaXQKICAgIGludGNfMiAvLyA4CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0MDYKICAgIC8vIHB1YmxpYyB1cGRhdGVBbGdvSG91clBlcmlvZEZpbmFsaXR5KHBlcmlvZFN0YXJ0OiB1aW50NjQsIHRvdGFsQWxnb2hvdXJzOiB1aW50NjQsIGZpbmFsOiBib29sZWFuKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo6RGVsZWdhdG9yLmdldEFsZ29Ib3VyUGVyaW9kVG90YWxzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0QWxnb0hvdXJQZXJpb2RUb3RhbHM6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0NDgKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQ1MAogICAgLy8gZW5zdXJlKHBlcmlvZFN0YXJ0ICUgcGVyaW9kTGVuZ3RoID09PSAwLCBlcnJQZXJpb2RTdGFydEludmFsaWQpCiAgICBpbnRjIDQgLy8gMTAwMDAwMAogICAgJQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBieiBnZXRBbGdvSG91clBlcmlvZFRvdGFsc19hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDUwCiAgICAvLyBlbnN1cmUocGVyaW9kU3RhcnQgJSBwZXJpb2RMZW5ndGggPT09IDAsIGVyclBlcmlvZFN0YXJ0SW52YWxpZCkKICAgIGJ5dGVjXzIgLy8gIkVSUjpQUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgpnZXRBbGdvSG91clBlcmlvZFRvdGFsc19hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQ1MQogICAgLy8gY29uc3QgYm94ID0gdGhpcy5hbGdvaG91clBlcmlvZFRvdGFscyhwZXJpb2RTdGFydCkKICAgIGR1cAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo4NwogICAgLy8gYWxnb2hvdXJQZXJpb2RUb3RhbHMgPSBCb3hNYXA8dWludDY0LCBBbGdvaG91clBlcmlvZFRvdGFscz4oeyBrZXlQcmVmaXg6ICdIJyB9KQogICAgYnl0ZWNfMyAvLyAiSCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDUyCiAgICAvLyByZXR1cm4gYm94LmV4aXN0cyA/IGJveC52YWx1ZSA6IHsgdG90YWxBbGdvaG91cnM6IDAsIGZpbmFsOiBmYWxzZSB9CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldEFsZ29Ib3VyUGVyaW9kVG90YWxzX3Rlcm5hcnlfZmFsc2VAMwogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCgpnZXRBbGdvSG91clBlcmlvZFRvdGFsc190ZXJuYXJ5X21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQ0OAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpnZXRBbGdvSG91clBlcmlvZFRvdGFsc190ZXJuYXJ5X2ZhbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQ1MgogICAgLy8gcmV0dXJuIGJveC5leGlzdHMgPyBib3gudmFsdWUgOiB7IHRvdGFsQWxnb2hvdXJzOiAwLCBmaW5hbDogZmFsc2UgfQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwCiAgICBiIGdldEFsZ29Ib3VyUGVyaW9kVG90YWxzX3Rlcm5hcnlfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6OkRlbGVnYXRvci5nZXRBY2NvdW50QWxnb0hvdXJzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0QWNjb3VudEFsZ29Ib3VyczoKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDYxCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQ2MwogICAgLy8gZW5zdXJlKHBlcmlvZFN0YXJ0ICUgcGVyaW9kTGVuZ3RoID09PSAwLCBlcnJQZXJpb2RTdGFydEludmFsaWQpCiAgICBpbnRjIDQgLy8gMTAwMDAwMAogICAgJQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBieiBnZXRBY2NvdW50QWxnb0hvdXJzX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDYzCiAgICAvLyBlbnN1cmUocGVyaW9kU3RhcnQgJSBwZXJpb2RMZW5ndGggPT09IDAsIGVyclBlcmlvZFN0YXJ0SW52YWxpZCkKICAgIGJ5dGVjXzIgLy8gIkVSUjpQUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgpnZXRBY2NvdW50QWxnb0hvdXJzX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQ2NAogICAgLy8gY29uc3QgYWNjb3VudElkID0gdGhpcy5nZXRBY2NvdW50SWRJZkV4aXN0cyhhY2NvdW50KQogICAgZHVwCiAgICBjYWxsc3ViIGdldEFjY291bnRJZElmRXhpc3RzCiAgICBkdXAKICAgIGJ1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0NjUKICAgIC8vIGlmIChhY2NvdW50SWQuYXNVaW50NjQoKSA9PT0gMCkgewogICAgYnRvaQogICAgYm56IGdldEFjY291bnRBbGdvSG91cnNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQ2NgogICAgLy8gcmV0dXJuIDAKICAgIGludGNfMCAvLyAwCgpnZXRBY2NvdW50QWxnb0hvdXJzX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo6RGVsZWdhdG9yLmdldEFjY291bnRBbGdvSG91cnNANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDYxCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmdldEFjY291bnRBbGdvSG91cnNfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0NjgKICAgIC8vIGNvbnN0IGtleTogQWxnb2hvdXJBY2NvdW50S2V5ID0gW3BlcmlvZFN0YXJ0LCBhY2NvdW50SWRdCiAgICBkaWcgMQogICAgaXRvYgogICAgZGlnIDQKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo4OQogICAgLy8gYWxnb2hvdXJBY2NvdW50cyA9IEJveE1hcDxBbGdvaG91ckFjY291bnRLZXksIHVpbnQ2ND4oeyBrZXlQcmVmaXg6ICdoJyB9KQogICAgYnl0ZWMgOCAvLyAiaCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDcwCiAgICAvLyByZXR1cm4gYm94LmV4aXN0cyA/IGJveC52YWx1ZSA6IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogZ2V0QWNjb3VudEFsZ29Ib3Vyc190ZXJuYXJ5X2ZhbHNlQDUKICAgIGRpZyAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0NjEKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYiBnZXRBY2NvdW50QWxnb0hvdXJzX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo6RGVsZWdhdG9yLmdldEFjY291bnRBbGdvSG91cnNANwoKZ2V0QWNjb3VudEFsZ29Ib3Vyc190ZXJuYXJ5X2ZhbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQ3MAogICAgLy8gcmV0dXJuIGJveC5leGlzdHMgPyBib3gudmFsdWUgOiAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0NjEKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYiBnZXRBY2NvdW50QWxnb0hvdXJzX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo6RGVsZWdhdG9yLmdldEFjY291bnRBbGdvSG91cnNANwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6OkRlbGVnYXRvci5sb2dDb21taXR0ZWVNZXRhZGF0YVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmxvZ0NvbW1pdHRlZU1ldGFkYXRhOgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDc3CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDMyCiAgICAqCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+PgogICAgaW50Y18wIC8vIDAKCmxvZ0NvbW1pdHRlZU1ldGFkYXRhX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDc5CiAgICAvLyBmb3IgKGNvbnN0IGNvbW1pdHRlZUlkIG9mIGNvbW1pdHRlZUlkcykgewogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogbG9nQ29tbWl0dGVlTWV0YWRhdGFfYWZ0ZXJfZm9yQDgKICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludGNfMyAvLyAzMgogICAgKgogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6ODMKICAgIC8vIGNvbW1pdHRlZXMgPSBCb3hNYXA8Q29tbWl0dGVlSWQsIERlbGVnYXRvckNvbW1pdHRlZT4oeyBrZXlQcmVmaXg6ICdDJyB9KQogICAgYnl0ZWMgNSAvLyAiQyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDgxCiAgICAvLyBpZiAobWV0YWRhdGEuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGxvZ0NvbW1pdHRlZU1ldGFkYXRhX2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQ4MgogICAgLy8gbG9nKGVuY29kZUFyYzQobWV0YWRhdGEudmFsdWUpKQogICAgZGlnIDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBsb2cKCmxvZ0NvbW1pdHRlZU1ldGFkYXRhX2FmdGVyX2lmX2Vsc2VANjoKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBsb2dDb21taXR0ZWVNZXRhZGF0YV9mb3JfaGVhZGVyQDIKCmxvZ0NvbW1pdHRlZU1ldGFkYXRhX2Vsc2VfYm9keUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdHlwZXMuYWxnby50czo4NQogICAgLy8gcGVyaW9kU3RhcnQ6IHUzMigwKSwKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIHUzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdHlwZXMuYWxnby50czo4NgogICAgLy8gcGVyaW9kRW5kOiB1MzIoMCksCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiB1MzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3R5cGVzLmFsZ28udHM6ODcKICAgIC8vIGV4dERlbGVnYXRlZFZvdGVzOiB1MzIoMCksCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiB1MzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3R5cGVzLmFsZ28udHM6ODQtODkKICAgIC8vIHJldHVybiB7CiAgICAvLyAgIHBlcmlvZFN0YXJ0OiB1MzIoMCksCiAgICAvLyAgIHBlcmlvZEVuZDogdTMyKDApLAogICAgLy8gICBleHREZWxlZ2F0ZWRWb3RlczogdTMyKDApLAogICAgLy8gICBleHREZWxlZ2F0ZWRBY2NvdW50Vm90ZXM6IFtdIGFzIEFjY291bnRJZFdpdGhWb3Rlc1tdLAogICAgLy8gfQogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDEzIC8vIDB4MDAwZTAwMDAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0ODQKICAgIC8vIGxvZyhlbmNvZGVBcmM0KGdldEVtcHR5RGVsZWdhdG9yQ29tbWl0dGVlKCkpKQogICAgbG9nCiAgICBiIGxvZ0NvbW1pdHRlZU1ldGFkYXRhX2FmdGVyX2lmX2Vsc2VANgoKbG9nQ29tbWl0dGVlTWV0YWRhdGFfYWZ0ZXJfZm9yQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjQ3NwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo6RGVsZWdhdG9yLmxvZ1Byb3Bvc2FsTWV0YWRhdGFbcm91dGluZ10oKSAtPiB2b2lkOgpsb2dQcm9wb3NhbE1ldGFkYXRhOgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDkzCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDgKICAgICoKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcHBsaWNhdGlvbj4KICAgIGludGNfMCAvLyAwCgpsb2dQcm9wb3NhbE1ldGFkYXRhX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NDk1CiAgICAvLyBmb3IgKGNvbnN0IHByb3Bvc2FsSWQgb2YgcHJvcG9zYWxJZHMpIHsKICAgIGR1cAogICAgZGlnIDIKICAgIDwKICAgIGJ6IGxvZ1Byb3Bvc2FsTWV0YWRhdGFfYWZ0ZXJfZm9yQDgKICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZGVsZWdhdG9yL2RlbGVnYXRvci5hbGdvLnRzOjg1CiAgICAvLyBwcm9wb3NhbHMgPSBCb3hNYXA8QXBwbGljYXRpb24sIERlbGVnYXRvclByb3Bvc2FsPih7IGtleVByZWZpeDogJ1AnIH0pCiAgICBieXRlYyA2IC8vICJQIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0OTcKICAgIC8vIGlmIChtZXRhZGF0YS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogbG9nUHJvcG9zYWxNZXRhZGF0YV9lbHNlX2JvZHlANQogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0OTgKICAgIC8vIGxvZyhlbmNvZGVBcmM0KG1ldGFkYXRhLnZhbHVlKSkKICAgIGRpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgbG9nCgpsb2dQcm9wb3NhbE1ldGFkYXRhX2FmdGVyX2lmX2Vsc2VANjoKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBsb2dQcm9wb3NhbE1ldGFkYXRhX2Zvcl9oZWFkZXJAMgoKbG9nUHJvcG9zYWxNZXRhZGF0YV9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3R5cGVzLmFsZ28udHM6MTIwCiAgICAvLyBleHRWb3RlU3RhcnRUaW1lOiB1MzIoMCksCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiB1MzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3R5cGVzLmFsZ28udHM6MTIxCiAgICAvLyBleHRWb3RlRW5kVGltZTogdTMyKDApLAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgdTMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS90eXBlcy5hbGdvLnRzOjEyMgogICAgLy8gZXh0VG90YWxWb3RpbmdQb3dlcjogdTMyKDApLAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgdTMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS90eXBlcy5hbGdvLnRzOjEyMwogICAgLy8gZXh0QWNjb3VudHNQZW5kaW5nVm90ZXM6IFtdIGFzIEFjY291bnRJZFdpdGhWb3Rlc1tdLAogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3R5cGVzLmFsZ28udHM6MTI1CiAgICAvLyBpbnRWb3RlRW5kVGltZTogdTMyKDApLAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgdTMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS90eXBlcy5hbGdvLnRzOjExNy0xMzIKICAgIC8vIHJldHVybiB7CiAgICAvLyAgIHN0YXR1czogJycgYXMgRGVsZWdhdG9yUHJvcG9zYWxTdGF0dXMsCiAgICAvLyAgIGNvbW1pdHRlZUlkOiBuZXcgU3RhdGljQnl0ZXM8MzI+KCksCiAgICAvLyAgIGV4dFZvdGVTdGFydFRpbWU6IHUzMigwKSwKICAgIC8vICAgZXh0Vm90ZUVuZFRpbWU6IHUzMigwKSwKICAgIC8vICAgZXh0VG90YWxWb3RpbmdQb3dlcjogdTMyKDApLAogICAgLy8gICBleHRBY2NvdW50c1BlbmRpbmdWb3RlczogW10gYXMgQWNjb3VudElkV2l0aFZvdGVzW10sCiAgICAvLyAgIGV4dEFjY291bnRzVm90ZWQ6IFtdIGFzIEFjY291bnRJZFdpdGhWb3Rlc1tdLAogICAgLy8gICBpbnRWb3RlRW5kVGltZTogdTMyKDApLAogICAgLy8gICBpbnRUb3RhbEFsZ29ob3VyczogMCwKICAgIC8vICAgaW50Vm90ZWRBbGdvaG91cnM6IDAsCiAgICAvLyAgIGludFZvdGVzWWVzQWxnb2hvdXJzOiAwLAogICAgLy8gICBpbnRWb3Rlc05vQWxnb2hvdXJzOiAwLAogICAgLy8gICBpbnRWb3Rlc0Fic3RhaW5BbGdvaG91cnM6IDAsCiAgICAvLyAgIGludFZvdGVzQm95Y290dEFsZ29ob3VyczogMCwKICAgIC8vIH0KICAgIHB1c2hieXRlcyAweDAwNjYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDY4MDA2YQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kZWxlZ2F0b3IvZGVsZWdhdG9yLmFsZ28udHM6NTAwCiAgICAvLyBsb2coZW5jb2RlQXJjNChnZXRFbXB0eURlbGVnYXRvclByb3Bvc2FsKCkpKQogICAgbG9nCiAgICBiIGxvZ1Byb3Bvc2FsTWV0YWRhdGFfYWZ0ZXJfaWZfZWxzZUA2Cgpsb2dQcm9wb3NhbE1ldGFkYXRhX2FmdGVyX2ZvckA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2RlbGVnYXRvci9kZWxlZ2F0b3IuYWxnby50czo0OTMKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2Jhc2UuYWxnby50czo6QmFzZUNvbnRyYWN0LmluY3JlYXNlQnVkZ2V0W3JvdXRpbmddKCkgLT4gdm9pZDoKaW5jcmVhc2VCdWRnZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9iYXNlLmFsZ28udHM6MjEKICAgIC8vIEBhYmltZXRob2QoeyB2YWxpZGF0ZUVuY29kaW5nOiAndW5zYWZlLWRpc2FibGVkJyB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYmFzZS5hbGdvLnRzOjI0CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgaXR4bnM7IGkrKykgewogICAgaW50Y18wIC8vIDAKCmluY3JlYXNlQnVkZ2V0X3doaWxlX3RvcEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYmFzZS5hbGdvLnRzOjI0CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgaXR4bnM7IGkrKykgewogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogaW5jcmVhc2VCdWRnZXRfYWZ0ZXJfd2hpbGVANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYmFzZS5hbGdvLnRzOjI1LTMxCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hcHBsaWNhdGlvbkNhbGwoewogICAgLy8gICAgIGFwcHJvdmFsUHJvZ3JhbTogZW1wdHkuY2xlYXJTdGF0ZVByb2dyYW0sIC8vIGludGVudGlvbmFsbHkgdXNpbmcgY2xlYXIgc3RhdGUgcHJvZ3JhbSBmb3IgInJldHVybiB0cnVlIgogICAgLy8gICAgIGNsZWFyU3RhdGVQcm9ncmFtOiBlbXB0eS5jbGVhclN0YXRlUHJvZ3JhbSwKICAgIC8vICAgICBvbkNvbXBsZXRpb246IE9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYmFzZS5hbGdvLnRzOjI5CiAgICAvLyBvbkNvbXBsZXRpb246IE9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICBwdXNoaW50IDUgLy8gNQogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2Jhc2UuYWxnby50czoyMwogICAgLy8gY29uc3QgZW1wdHkgPSBjb21waWxlKEVtcHR5Q29udHJhY3QpCiAgICBieXRlYyAyNCAvLyBiYXNlNjQoQzRFQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGJ5dGVjIDI0IC8vIGJhc2U2NChDNEVCUXc9PSkKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2Jhc2UuYWxnby50czoyNS0zMAogICAgLy8gaXR4bgogICAgLy8gICAuYXBwbGljYXRpb25DYWxsKHsKICAgIC8vICAgICBhcHByb3ZhbFByb2dyYW06IGVtcHR5LmNsZWFyU3RhdGVQcm9ncmFtLCAvLyBpbnRlbnRpb25hbGx5IHVzaW5nIGNsZWFyIHN0YXRlIHByb2dyYW0gZm9yICJyZXR1cm4gdHJ1ZSIKICAgIC8vICAgICBjbGVhclN0YXRlUHJvZ3JhbTogZW1wdHkuY2xlYXJTdGF0ZVByb2dyYW0sCiAgICAvLyAgICAgb25Db21wbGV0aW9uOiBPbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gICB9KQogICAgcHVzaGludCA2IC8vIDYKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYmFzZS5hbGdvLnRzOjI1LTMxCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hcHBsaWNhdGlvbkNhbGwoewogICAgLy8gICAgIGFwcHJvdmFsUHJvZ3JhbTogZW1wdHkuY2xlYXJTdGF0ZVByb2dyYW0sIC8vIGludGVudGlvbmFsbHkgdXNpbmcgY2xlYXIgc3RhdGUgcHJvZ3JhbSBmb3IgInJldHVybiB0cnVlIgogICAgLy8gICAgIGNsZWFyU3RhdGVQcm9ncmFtOiBlbXB0eS5jbGVhclN0YXRlUHJvZ3JhbSwKICAgIC8vICAgICBvbkNvbXBsZXRpb246IE9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2Jhc2UuYWxnby50czoyNAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGl0eG5zOyBpKyspIHsKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBpbmNyZWFzZUJ1ZGdldF93aGlsZV90b3BAMgoKaW5jcmVhc2VCdWRnZXRfYWZ0ZXJfd2hpbGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2Jhc2UuYWxnby50czoyMQogICAgLy8gQGFiaW1ldGhvZCh7IHZhbGlkYXRlRW5jb2Rpbmc6ICd1bnNhZmUtZGlzYWJsZWQnIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYWNjb3VudC1pZC5hbGdvLnRzOjpBY2NvdW50SWRDb250cmFjdC5nZXRBY2NvdW50SWRJZkV4aXN0cyhhY2NvdW50OiBieXRlcykgLT4gYnl0ZXM6CmdldEFjY291bnRJZElmRXhpc3RzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYWNjb3VudC1pZC5hbGdvLnRzOjM0CiAgICAvLyBwcm90ZWN0ZWQgZ2V0QWNjb3VudElkSWZFeGlzdHMoYWNjb3VudDogQWNjb3VudCk6IFVpbnQzMiB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2FjY291bnQtaWQuYWxnby50czoxMgogICAgLy8gYWNjb3VudElkcyA9IEJveE1hcDxBY2NvdW50LCBVaW50MzI+KHsga2V5UHJlZml4OiAnYScgfSkKICAgIGJ5dGVjIDkgLy8gImEiCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9hY2NvdW50LWlkLmFsZ28udHM6MzYKICAgIC8vIGlmIChib3guZXhpc3RzKSByZXR1cm4gYm94LnZhbHVlCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldEFjY291bnRJZElmRXhpc3RzX2Vsc2VfYm9keUAyCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIHN3YXAKICAgIHJldHN1YgoKZ2V0QWNjb3VudElkSWZFeGlzdHNfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9hY2NvdW50LWlkLmFsZ28udHM6MzcKICAgIC8vIGVsc2UgcmV0dXJuIHUzMigwKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgdTMyCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYmFzZS9hY2NvdW50LWlkLmFsZ28udHM6OkFjY291bnRJZENvbnRyYWN0Lm11c3RHZXRBY2NvdW50SWQoYWNjb3VudDogYnl0ZXMpIC0+IGJ5dGVzOgptdXN0R2V0QWNjb3VudElkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYWNjb3VudC1pZC5hbGdvLnRzOjQ2CiAgICAvLyBwcm90ZWN0ZWQgbXVzdEdldEFjY291bnRJZChhY2NvdW50OiBBY2NvdW50KTogVWludDMyIHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYWNjb3VudC1pZC5hbGdvLnRzOjEyCiAgICAvLyBhY2NvdW50SWRzID0gQm94TWFwPEFjY291bnQsIFVpbnQzMj4oeyBrZXlQcmVmaXg6ICdhJyB9KQogICAgYnl0ZWMgOSAvLyAiYSIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2FjY291bnQtaWQuYWxnby50czo0OAogICAgLy8gZW5zdXJlKGFjY291bnRJZEJveC5leGlzdHMsIGVyckFjY291bnROb3RFeGlzdHMpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IG11c3RHZXRBY2NvdW50SWRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9hY2NvdW50LWlkLmFsZ28udHM6NDgKICAgIC8vIGVuc3VyZShhY2NvdW50SWRCb3guZXhpc3RzLCBlcnJBY2NvdW50Tm90RXhpc3RzKQogICAgcHVzaGJ5dGVzICJFUlI6QV9OWCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgptdXN0R2V0QWNjb3VudElkX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2FjY291bnQtaWQuYWxnby50czo0OQogICAgLy8gcmV0dXJuIGFjY291bnRJZEJveC52YWx1ZQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYmFzZS9hY2NvdW50LWlkLmFsZ28udHM6OkFjY291bnRJZENvbnRyYWN0LmdldE9yQ3JlYXRlQWNjb3VudElkKGFjY291bnQ6IGJ5dGVzKSAtPiBieXRlczoKZ2V0T3JDcmVhdGVBY2NvdW50SWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9hY2NvdW50LWlkLmFsZ28udHM6NTcKICAgIC8vIHByb3RlY3RlZCBnZXRPckNyZWF0ZUFjY291bnRJZChhY2NvdW50OiBBY2NvdW50KTogVWludDMyIHsKICAgIHByb3RvIDEgMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2FjY291bnQtaWQuYWxnby50czo1OAogICAgLy8gY29uc3QgYWNjb3VudElkID0gdGhpcy5nZXRBY2NvdW50SWRJZkV4aXN0cyhhY2NvdW50KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldEFjY291bnRJZElmRXhpc3RzCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2FjY291bnQtaWQuYWxnby50czo1OQogICAgLy8gaWYgKGFjY291bnRJZC5hc1VpbnQ2NCgpID09PSAwKSB7CiAgICBidG9pCiAgICBibnogZ2V0T3JDcmVhdGVBY2NvdW50SWRfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2FjY291bnQtaWQuYWxnby50czoxMgogICAgLy8gYWNjb3VudElkcyA9IEJveE1hcDxBY2NvdW50LCBVaW50MzI+KHsga2V5UHJlZml4OiAnYScgfSkKICAgIGJ5dGVjIDkgLy8gImEiCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2FjY291bnQtaWQuYWxnby50czoyMgogICAgLy8gZW5zdXJlKCFib3guZXhpc3RzLCBlcnJBY2NvdW50RXhpc3RzKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJ6IGdldE9yQ3JlYXRlQWNjb3VudElkX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYWNjb3VudC1pZC5hbGdvLnRzOjIyCiAgICAvLyBlbnN1cmUoIWJveC5leGlzdHMsIGVyckFjY291bnRFeGlzdHMpCiAgICBwdXNoYnl0ZXMgIkVSUjpBX0VYIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCmdldE9yQ3JlYXRlQWNjb3VudElkX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2FjY291bnQtaWQuYWxnby50czoyMwogICAgLy8gdGhpcy5sYXN0QWNjb3VudElkLnZhbHVlKysKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9hY2NvdW50LWlkLmFsZ28udHM6MTEKICAgIC8vIGxhc3RBY2NvdW50SWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pCiAgICBieXRlYyAxMCAvLyAibGFzdEFjY291bnRJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2FjY291bnQtaWQuYWxnby50czoyMwogICAgLy8gdGhpcy5sYXN0QWNjb3VudElkLnZhbHVlKysKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYWNjb3VudC1pZC5hbGdvLnRzOjExCiAgICAvLyBsYXN0QWNjb3VudElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KQogICAgYnl0ZWMgMTAgLy8gImxhc3RBY2NvdW50SWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9hY2NvdW50LWlkLmFsZ28udHM6MjMKICAgIC8vIHRoaXMubGFzdEFjY291bnRJZC52YWx1ZSsrCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2FjY291bnQtaWQuYWxnby50czoyNAogICAgLy8gY29uc3QgYWNjb3VudElkID0gdTMyKHRoaXMubGFzdEFjY291bnRJZC52YWx1ZSkKICAgIGNhbGxzdWIgdTMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9hY2NvdW50LWlkLmFsZ28udHM6MjUKICAgIC8vIGJveC52YWx1ZSA9IGFjY291bnRJZAogICAgZnJhbWVfZGlnIDAKICAgIGRpZyAxCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9hY2NvdW50LWlkLmFsZ28udHM6NjAKICAgIC8vIHJldHVybiB0aGlzLmNyZWF0ZUFjY291bnRJZChhY2NvdW50KQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldE9yQ3JlYXRlQWNjb3VudElkX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYWNjb3VudC1pZC5hbGdvLnRzOjYyCiAgICAvLyByZXR1cm4gYWNjb3VudElkCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYmFzZS9iYXNlLmFsZ28udHM6OkJhc2VDb250cmFjdC5lbnN1cmVDYWxsZXJJc0FkbWluKCkgLT4gdm9pZDoKZW5zdXJlQ2FsbGVySXNBZG1pbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2Jhc2UuYWxnby50czoxNAogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT09IEdsb2JhbC5jcmVhdG9yQWRkcmVzcywgZXJyVW5hdXRob3JpemVkKQogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogZW5zdXJlQ2FsbGVySXNBZG1pbl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2Jhc2UuYWxnby50czoxNAogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT09IEdsb2JhbC5jcmVhdG9yQWRkcmVzcywgZXJyVW5hdXRob3JpemVkKQogICAgYnl0ZWMgMTggLy8gIkVSUjpBVVRIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCmVuc3VyZUNhbGxlcklzQWRtaW5fYWZ0ZXJfaWZfZWxzZUAzOgogICAgcmV0c3ViCg==", "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": {} }