{ "name": "GGovPeriod", "structs": { "GGovPeriod": [ { "name": "committeeId", "type": "byte[32]" }, { "name": "votingStart", "type": "uint32" }, { "name": "votingEnd", "type": "uint32" }, { "name": "topics", "type": "(string[],uint32[])[]" } ], "GGovVoteRecord": [ { "name": "isDelegated", "type": "bool" }, { "name": "topicVotes", "type": "uint32[][]" } ] }, "methods": [ { "name": "init", "args": [ { "type": "uint64", "name": "registryApp" }, { "type": "uint32", "name": "periodId" }, { "type": "byte[32]", "name": "committeeId" }, { "type": "uint32", "name": "votingStart" }, { "type": "uint32", "name": "votingEnd" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Initialise the period. Called as an inner ARC-4 call from the registry's createPeriod.\nCan only be called once (registryApp must still be 0); creator (the registry app account)\nis the only allowed sender.", "events": [], "recommendations": {} }, { "name": "editPeriod", "args": [ { "type": "byte[32]", "name": "committeeId" }, { "type": "uint64", "name": "votingStart" }, { "type": "uint64", "name": "votingEnd" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "addTopic", "args": [ { "type": "string[]", "name": "options" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "editTopic", "args": [ { "type": "uint64", "name": "topicIndex" }, { "type": "string[]", "name": "options" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "removeTopic", "args": [ { "type": "uint64", "name": "topicIndex" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Remove the topic at $topicIndex. Operator only; only allowed while editable.", "events": [], "recommendations": {} }, { "name": "setReady", "args": [ { "type": "bool", "name": "ready" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Set the ready flag. Once ready=true, edits are blocked and voting becomes possible. Operator only.", "events": [], "recommendations": {} }, { "name": "uploadPeriodBodyPartial", "args": [ { "type": "uint64", "name": "startOffset" }, { "type": "byte[]", "name": "data" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "uploadTopicBodyPartial", "args": [ { "type": "uint64", "name": "topicIndex" }, { "type": "uint64", "name": "startOffset" }, { "type": "byte[]", "name": "data" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "deleteTopicBodies", "args": [ { "type": "uint64[]", "name": "topicIndexes" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Delete the topic-body boxes ('T'+index) for the given topic indexes. Admin only and only while\nnot ready (same gates as deletePeriodApp). Used by the SDK to clear per-topic body boxes \u2014 paged\n\u22648 per txn because of the 8-box-reference limit \u2014 before deletion, so their min-balance is\nreclaimed rather than permanently locked. op.Box.delete is a no-op for an absent box, so\nunknown/stale indexes are harmless. Each referenced box must be in the txn's box-reference array.", "events": [], "recommendations": {} }, { "name": "vote", "args": [ { "type": "address", "name": "voterAccount", "desc": "Account with voting power" }, { "type": "uint32[][]", "name": "topicVotes", "desc": "Votes per topic, parallel to the period's topics/options. Each topic's votes are an array of Uint32, parallel to that topic's options, with the count of votes for each option. The sum of every topic's votes must equal the voter's total voting power (enforced in code, not ABI)." } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Public voting method. Period must be ready=true and within the voting window.\nSender can be the voter (not delegated) or the delegatee (delegated). Delegation is verified via an inner-call to the registry.\nVotes are tallied into global topic vote counts, and the voter's individual vote record is updated.\nRe-votes are allowed and will overwrite the previous vote; if re-voting via delegation, the delegation override guard applies (a delegatee cannot override a direct vote by the delegator).", "events": [ { "name": "GGovVoteCast", "args": [ { "type": "address", "name": "voter" }, { "type": "address", "name": "sender" }, { "type": "bool", "name": "updateVote" }, { "type": "uint64", "name": "votingPower" }, { "type": "uint32[][]", "name": "topicVotes" } ] } ], "recommendations": {} }, { "name": "canVote", "args": [ { "type": "address", "name": "voterAccount" }, { "type": "address", "name": "senderAccount" } ], "returns": { "type": "(bool,uint64)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Whether an account can vote and the resulting voting power. Returns [false, 0] in any rejection case.", "events": [], "recommendations": {} }, { "name": "getPeriod", "args": [], "returns": { "type": "(byte[32],uint32,uint32,(string[],uint32[])[])", "struct": "GGovPeriod" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "logPeriod", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Log the full period across many log lines instead of one ARC-4 return value.\ngetPeriod() returns the whole period as a single logged value, which overflows the\n1024-byte per-call ABI return limit once the topics get large (~22 Yes/No/Abstain topics).\nlogPeriod logs the header (GGovPeriodMeta) first, then one GGovTopic per line, so a\nreader simulating with allowMoreLogging can reconstruct an arbitrarily large period.", "events": [], "recommendations": {} }, { "name": "getVotingRecord", "args": [ { "type": "address", "name": "account" } ], "returns": { "type": "(bool,uint32[][])", "struct": "GGovVoteRecord" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "logVotingRecord", "args": [ { "type": "address", "name": "account" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Log a full vote record across many log lines instead of one ARC-4 return value.\ngetVotingRecord() returns the whole record as a single logged value, which overflows the\n1024-byte per-call ABI return limit once topicVotes gets large (same failure mode as\ngetPeriod/logPeriod). logVotingRecord logs the header (GGovVoteRecordMeta) first, then one\ntopic's votes (GGovTopicVotes) per line, so a reader simulating with allowMoreLogging can\nreconstruct an arbitrarily large record. No logs at all means no record exists.", "events": [], "recommendations": {} }, { "name": "withdrawALGO", "args": [ { "type": "address", "name": "receiver" }, { "type": "uint64", "name": "amount" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Withdraw $amount microALGO from this period app account to $receiver. Registry admin\nonly (verified via inner call to registry.verifyAdmin). The AVM rejects the inner\npayment if it would drop the app account below its min balance.", "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": 7, "bytes": 1 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "registryApp": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cmVnaXN0cnlBcHA=", "desc": "Registry app ID. 0 sentinel = uninitialised" }, "periodId": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cGVyaW9kSWQ=", "desc": "This period's ID on the registry" }, "votingStart": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dm90aW5nU3RhcnQ=", "desc": "Voting window start (unix seconds)" }, "votingEnd": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dm90aW5nRW5k", "desc": "Voting window end exclusive (unix seconds)" }, "ready": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cmVhZHk=", "desc": "Operator-set ready flag. Period must be ready=true to accept votes; cannot be edited while ready." }, "committeeId": { "keyType": "AVMString", "valueType": "byte[32]", "key": "Y29tbWl0dGVlSWQ=", "desc": "Committee ID this period votes against (lives in registry)" }, "firstVotingRound": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Zmlyc3RWb3RpbmdSb3VuZA==", "desc": "First actual voting round. Used for efficient indexer lookups. 0 until the first vote is cast." }, "lastVotingRound": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bGFzdFZvdGluZ1JvdW5k", "desc": "Last actual voting round. Used for efficient indexer lookups. 0 until the first vote is cast." } }, "local": {}, "box": { "topicOptionsArr": { "keyType": "AVMString", "valueType": "(string[])[]", "key": "bw==", "desc": "Per-topic option labels. Mutated only while editable. Parallel to topicVotesArr (same length & order)." }, "topicVotesArr": { "keyType": "AVMString", "valueType": "(uint32[])[]", "key": "dA==", "desc": "Per-topic vote tallies. Mutated on every vote(). Parallel to topicOptionsArr (same length & order)." }, "periodBody": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "UA==", "desc": "Period body JSON (chunked)" } } }, "maps": { "global": {}, "local": {}, "box": { "topicBodies": { "keyType": "uint32", "valueType": "AVMBytes", "desc": "Topic body JSON by topicIndex", "prefix": "VA==" }, "voteRecords": { "keyType": "address", "valueType": "GGovVoteRecord", "desc": "Per-voter vote record, keyed by voter Account", "prefix": "dg==" } } } }, "bareActions": { "create": [ "NoOp" ], "call": [ "DeleteApplication", "UpdateApplication" ] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 1072, 1075, 1254, 1260, 1408, 1414, 2414, 3387, 3393, 3609, 3615, 3816, 3862 ], "errorMessage": "Box must have value" }, { "pc": [ 2290, 2404, 3171, 3281, 4097, 4164 ], "errorMessage": "Bytes has valid prefix" }, { "pc": [ 220 ], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [ 462 ], "errorMessage": "can only call when creating" }, { "pc": [ 370, 453 ], "errorMessage": "can only call when not creating" }, { "pc": [ 399, 404, 788, 2175, 2198, 2222, 2255, 2354, 2359, 3003, 3076, 3095, 3111, 3132, 3235, 3240, 3317, 3561, 3566, 3574, 3600, 3620, 3625, 3633, 4058, 4125, 4184, 4189, 4197, 4205, 4221, 4271 ], "errorMessage": "check GlobalState exists" }, { "pc": [ 1339, 1361, 1485, 1552, 2562, 2686, 2720, 2787, 2938, 3442, 3492, 3700, 3750, 3924 ], "errorMessage": "index access is out of bounds" }, { "pc": [ 1788, 2509, 2614, 2631 ], "errorMessage": "index out of bounds" }, { "pc": [ 973, 1199, 2134 ], "errorMessage": "invalid array encoding" }, { "pc": [ 943, 987, 1169, 1213, 1332, 1357, 1466, 1543, 1851, 1944, 2023, 2104, 2148, 2544, 2679, 2752, 2766, 2814, 3420, 3483, 3678, 3741, 3917 ], "errorMessage": "invalid array length header" }, { "pc": [ 1627, 4102, 4169 ], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [ 2170 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array>" }, { "pc": [ 1858, 1951 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 1007, 1233 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 2035 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 768, 867, 2097, 2296, 3062, 3071, 3177, 3802, 3844, 3969 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 759, 776, 784, 2408, 3286 ], "errorMessage": "invalid number of bytes for arc4.uint32" }, { "pc": [ 750, 876, 887, 1161, 1394, 1843, 1924, 1934, 3978 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 2142 ], "errorMessage": "invalid tail pointer for (len+(len+uint32[])[])" }, { "pc": [ 981, 1207 ], "errorMessage": "invalid tail pointer for (len+(len+utf8[])[])" }, { "pc": [ 1047, 1300, 2649, 2877 ], "errorMessage": "max array length exceeded" }, { "pc": [ 737 ], "errorMessage": "overflow" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAyIDEgNAogICAgYnl0ZWNibG9jayAidCIgIm8iICJyZWdpc3RyeUFwcCIgIiIgMHgxNTFmN2M3NSAweDAwMDAgMHgwMDAyICJQIiAidm90aW5nU3RhcnQiICJ2b3RpbmdFbmQiIDB4MDAwMDAwMDAwMDAwMDAwMDAwICJyZWFkeSIgImNvbW1pdHRlZUlkIiAidiIgMHgwMCAiZmlyc3RWb3RpbmdSb3VuZCIgInBlcmlvZElkIiAiRVJSOkFVVEgiICJsYXN0Vm90aW5nUm91bmQiICJFUlI6R1RfTk8iIDB4MDAwMjAwMDIgIkVSUjpHVF9PQiIgMHhjOGQ0NjFhYiAiRVJSOkdWX01NIiAweDAwMDQgYmFzZTY0KEM0RUJRdz09KQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo2MwogICAgLy8gcmVnaXN0cnlBcHAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pCiAgICBieXRlY18yIC8vICJyZWdpc3RyeUFwcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo3MQogICAgLy8gcmVhZHkgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogZmFsc2UgfSkKICAgIGJ5dGVjIDExIC8vICJyZWFkeSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo3NQogICAgLy8gZmlyc3RWb3RpbmdSb3VuZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSkKICAgIGJ5dGVjIDE1IC8vICJmaXJzdFZvdGluZ1JvdW5kIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjc3CiAgICAvLyBsYXN0Vm90aW5nUm91bmQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pCiAgICBieXRlYyAxOCAvLyAibGFzdFZvdGluZ1JvdW5kIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NjAtNjEKICAgIC8vIEBjb250cmFjdCh7IG5hbWU6ICdHR292UGVyaW9kJyB9KQogICAgLy8gZXhwb3J0IGNsYXNzIEdHb3ZQZXJpb2RDb250cmFjdCBleHRlbmRzIEJhc2VDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMjYKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4ZjU3OWNhYzIgMHhmYjU1NDVmNiAweGI0NzI5NmRhIDB4YjdlZWQ5MjQgMHhiOGM3MGEwMCAweDYyZDI4NTg5IDB4Mzg1ZTM0YzcgMHgwYjMwN2VlNyAweDA0ZmFmZjA4IDB4NmIzODU3MTMgMHgyODlhYzgxMiAweDZjZmQzNmMzIDB4MDQ1YzI1MDkgMHg4NmExMjllNyAweDgyMjY0ZTk1IDB4OTI4ZGRjNWUgMHg0MTE4ZWNiZiAvLyBtZXRob2QgImluaXQodWludDY0LHVpbnQzMixieXRlWzMyXSx1aW50MzIsdWludDMyKXZvaWQiLCBtZXRob2QgImVkaXRQZXJpb2QoYnl0ZVszMl0sdWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJhZGRUb3BpYyhzdHJpbmdbXSl1aW50NjQiLCBtZXRob2QgImVkaXRUb3BpYyh1aW50NjQsc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAicmVtb3ZlVG9waWModWludDY0KXZvaWQiLCBtZXRob2QgInNldFJlYWR5KGJvb2wpdm9pZCIsIG1ldGhvZCAidXBsb2FkUGVyaW9kQm9keVBhcnRpYWwodWludDY0LGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJ1cGxvYWRUb3BpY0JvZHlQYXJ0aWFsKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKXZvaWQiLCBtZXRob2QgImRlbGV0ZVRvcGljQm9kaWVzKHVpbnQ2NFtdKXZvaWQiLCBtZXRob2QgInZvdGUoYWRkcmVzcyx1aW50MzJbXVtdKXZvaWQiLCBtZXRob2QgImNhblZvdGUoYWRkcmVzcyxhZGRyZXNzKShib29sLHVpbnQ2NCkiLCBtZXRob2QgImdldFBlcmlvZCgpKGJ5dGVbMzJdLHVpbnQzMix1aW50MzIsKHN0cmluZ1tdLHVpbnQzMltdKVtdKSIsIG1ldGhvZCAibG9nUGVyaW9kKCl2b2lkIiwgbWV0aG9kICJnZXRWb3RpbmdSZWNvcmQoYWRkcmVzcykoYm9vbCx1aW50MzJbXVtdKSIsIG1ldGhvZCAibG9nVm90aW5nUmVjb3JkKGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAid2l0aGRyYXdBTEdPKGFkZHJlc3MsdWludDY0KXZvaWQiLCBtZXRob2QgImluY3JlYXNlQnVkZ2V0KHVpbnQ2NCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggaW5pdCBlZGl0UGVyaW9kIGFkZFRvcGljIGVkaXRUb3BpYyByZW1vdmVUb3BpYyBzZXRSZWFkeSB1cGxvYWRQZXJpb2RCb2R5UGFydGlhbCB1cGxvYWRUb3BpY0JvZHlQYXJ0aWFsIGRlbGV0ZVRvcGljQm9kaWVzIHZvdGUgY2FuVm90ZSBnZXRQZXJpb2QgbG9nUGVyaW9kIGdldFZvdGluZ1JlY29yZCBsb2dWb3RpbmdSZWNvcmQgd2l0aGRyYXdBTEdPIGluY3JlYXNlQnVkZ2V0CgptYWluX2FmdGVyX2lmX2Vsc2VAMzE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjYwLTYxCiAgICAvLyBAY29udHJhY3QoeyBuYW1lOiAnR0dvdlBlcmlvZCcgfSkKICAgIC8vIGV4cG9ydCBjbGFzcyBHR292UGVyaW9kQ29udHJhY3QgZXh0ZW5kcyBCYXNlQ29udHJhY3QgewogICAgZXJyCgptYWluX2JhcmVfcm91dGluZ0AyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NjAtNjEKICAgIC8vIEBjb250cmFjdCh7IG5hbWU6ICdHR292UGVyaW9kJyB9KQogICAgLy8gZXhwb3J0IGNsYXNzIEdHb3ZQZXJpb2RDb250cmFjdCBleHRlbmRzIEJhc2VDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBzd2l0Y2ggbWFpbl9fX2FsZ290c19fLmRlZmF1bHRDcmVhdGVAMjcgbWFpbl9hZnRlcl9pZl9lbHNlQDMxIG1haW5fYWZ0ZXJfaWZfZWxzZUAzMSBtYWluX2FmdGVyX2lmX2Vsc2VAMzEgbWFpbl91cGRhdGVBcHBsaWNhdGlvbkAyOCBtYWluX2RlbGV0ZUFwcGxpY2F0aW9uQDI5CiAgICBlcnIKCm1haW5fZGVsZXRlQXBwbGljYXRpb25AMjk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjU0NgogICAgLy8gQGJhcmVtZXRob2QoeyBhbGxvd0FjdGlvbnM6IFsnRGVsZXRlQXBwbGljYXRpb24nXSB9KQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjU0OAogICAgLy8gdGhpcy5jaGVja0FkbWluQ2FsbGVyKCkKICAgIGNhbGxzdWIgY2hlY2tBZG1pbkNhbGxlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo1NDkKICAgIC8vIHRoaXMuZW5zdXJlRWRpdGFibGUoKQogICAgY2FsbHN1YiBlbnN1cmVFZGl0YWJsZQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo4MAogICAgLy8gdG9waWNPcHRpb25zQXJyID0gQm94PEdHb3ZUb3BpY09wdGlvbnNbXT4oeyBrZXk6ICdvJyB9KQogICAgYnl0ZWNfMSAvLyAibyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NTUzCiAgICAvLyB0aGlzLnRvcGljT3B0aW9uc0Fyci5kZWxldGUoKQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjgyCiAgICAvLyB0b3BpY1ZvdGVzQXJyID0gQm94PEdHb3ZUb3BpY1ZvdGVzW10+KHsga2V5OiAndCcgfSkKICAgIGJ5dGVjXzAgLy8gInQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjU1NAogICAgLy8gdGhpcy50b3BpY1ZvdGVzQXJyLmRlbGV0ZSgpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6ODQKICAgIC8vIHBlcmlvZEJvZHkgPSBCb3g8Ynl0ZXM+KHsga2V5OiAnUCcgfSkKICAgIGJ5dGVjIDcgLy8gIlAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjU1NQogICAgLy8gaWYgKHRoaXMucGVyaW9kQm9keS5leGlzdHMpIHRoaXMucGVyaW9kQm9keS5kZWxldGUoKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBtYWluX2FmdGVyX2lmX2Vsc2VAMzQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6ODQKICAgIC8vIHBlcmlvZEJvZHkgPSBCb3g8Ynl0ZXM+KHsga2V5OiAnUCcgfSkKICAgIGJ5dGVjIDcgLy8gIlAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjU1NQogICAgLy8gaWYgKHRoaXMucGVyaW9kQm9keS5leGlzdHMpIHRoaXMucGVyaW9kQm9keS5kZWxldGUoKQogICAgYm94X2RlbAogICAgcG9wCgptYWluX2FmdGVyX2lmX2Vsc2VAMzQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjU1OC01NjEKICAgIC8vIGNvbXBpbGVBcmM0KEdHb3ZSZWdpc3RyeUNvbnRyYWN0KS5jYWxsLnJlbW92ZVBlcmlvZFN1bW1hcnkoewogICAgLy8gICBhcHBJZDogQXBwbGljYXRpb24odGhpcy5yZWdpc3RyeUFwcC52YWx1ZSksCiAgICAvLyAgIGFyZ3M6IFt1MzIodGhpcy5wZXJpb2RJZC52YWx1ZSldLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NTU5CiAgICAvLyBhcHBJZDogQXBwbGljYXRpb24odGhpcy5yZWdpc3RyeUFwcC52YWx1ZSksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo2MwogICAgLy8gcmVnaXN0cnlBcHAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pCiAgICBieXRlY18yIC8vICJyZWdpc3RyeUFwcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NTU5CiAgICAvLyBhcHBJZDogQXBwbGljYXRpb24odGhpcy5yZWdpc3RyeUFwcC52YWx1ZSksCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo1NjAKICAgIC8vIGFyZ3M6IFt1MzIodGhpcy5wZXJpb2RJZC52YWx1ZSldLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NjUKICAgIC8vIHBlcmlvZElkID0gR2xvYmFsU3RhdGU8dWludDY0PigpCiAgICBieXRlYyAxNiAvLyAicGVyaW9kSWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjU2MAogICAgLy8gYXJnczogW3UzMih0aGlzLnBlcmlvZElkLnZhbHVlKV0sCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgY2FsbHN1YiB1MzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NTU4LTU2MQogICAgLy8gY29tcGlsZUFyYzQoR0dvdlJlZ2lzdHJ5Q29udHJhY3QpLmNhbGwucmVtb3ZlUGVyaW9kU3VtbWFyeSh7CiAgICAvLyAgIGFwcElkOiBBcHBsaWNhdGlvbih0aGlzLnJlZ2lzdHJ5QXBwLnZhbHVlKSwKICAgIC8vICAgYXJnczogW3UzMih0aGlzLnBlcmlvZElkLnZhbHVlKV0sCiAgICAvLyB9KQogICAgcHVzaGJ5dGVzIDB4OTkyOTZiMjUgLy8gbWV0aG9kICJyZW1vdmVQZXJpb2RTdW1tYXJ5KHVpbnQzMil2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NTYzCiAgICAvLyBpdHhuLnBheW1lbnQoeyByZWNlaXZlcjogVHhuLnNlbmRlciwgYW1vdW50OiAwLCBjbG9zZVJlbWFpbmRlclRvOiBUeG4uc2VuZGVyIH0pLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICB0eG4gU2VuZGVyCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQ2xvc2VSZW1haW5kZXJUbwogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpbnRjXzIgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo1NDYKICAgIC8vIEBiYXJlbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbJ0RlbGV0ZUFwcGxpY2F0aW9uJ10gfSkKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCm1haW5fdXBkYXRlQXBwbGljYXRpb25AMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjUzNQogICAgLy8gQGJhcmVtZXRob2QoeyBhbGxvd0FjdGlvbnM6IFsnVXBkYXRlQXBwbGljYXRpb24nXSB9KQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjUzNwogICAgLy8gdGhpcy5jaGVja0FkbWluQ2FsbGVyKCkKICAgIGNhbGxzdWIgY2hlY2tBZG1pbkNhbGxlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo1MzUKICAgIC8vIEBiYXJlbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbJ1VwZGF0ZUFwcGxpY2F0aW9uJ10gfSkKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCm1haW5fX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlQDI3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo2MC02MQogICAgLy8gQGNvbnRyYWN0KHsgbmFtZTogJ0dHb3ZQZXJpb2QnIH0pCiAgICAvLyBleHBvcnQgY2xhc3MgR0dvdlBlcmlvZENvbnRyYWN0IGV4dGVuZHMgQmFzZUNvbnRyYWN0IHsKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50KGFycmF5X2l0ZW1zX2NvdW50OiB1aW50NjQsIGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgbmV3X2hlYWRfYW5kX3RhaWw6IGJ5dGVzKSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBieXRlY18zIC8vICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18xIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18xIC8vIDIKICAgICoKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudChzb3VyY2U6IGJ5dGVzLCBuZXdfaXRlbTogYnl0ZXMsIGluZGV4OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIHN1YnN0cmluZyAwIDIKICAgIGR1cAogICAgYnRvaQogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAxCiAgICArCiAgICBpbnRjXzEgLy8gMgogICAgKgogICAgZGlnIDIKICAgIGRpZyAxCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDUKICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgaW50Y18yIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkdXAKICAgIGRpZyA0CiAgICAtCiAgICBjb3ZlciA2CiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgY292ZXIgNgogICAgZGlnIDQKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDUKICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciAzCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGNvdmVyIDIKICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICAqCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgY292ZXIgMwogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBmcmFtZV9kaWcgMQogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGRpZyAyCiAgICBzd2FwCiAgICByZXBsYWNlMwogICAgZnJhbWVfYnVyeSAzCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA1CiAgICBiIGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAzCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czo6dTMyKHY6IHVpbnQ2NCkgLT4gYnl0ZXM6CnUzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6OAogICAgLy8gZXhwb3J0IGZ1bmN0aW9uIHUzMih2OiB1aW50NjQpIHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czo5CiAgICAvLyByZXR1cm4gbmV3IFVpbnQzMih2KQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA0IDQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6OkdHb3ZQZXJpb2RDb250cmFjdC5pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKaW5pdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6OTcKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQzMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQzMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoxMDUKICAgIC8vIGVuc3VyZSh0aGlzLnJlZ2lzdHJ5QXBwLnZhbHVlID09PSAwLCBlcnJBbHJlYWR5SW5pdCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjYzCiAgICAvLyByZWdpc3RyeUFwcCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSkKICAgIGJ5dGVjXzIgLy8gInJlZ2lzdHJ5QXBwIgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoxMDUKICAgIC8vIGVuc3VyZSh0aGlzLnJlZ2lzdHJ5QXBwLnZhbHVlID09PSAwLCBlcnJBbHJlYWR5SW5pdCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJ6IGluaXRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjEwNQogICAgLy8gZW5zdXJlKHRoaXMucmVnaXN0cnlBcHAudmFsdWUgPT09IDAsIGVyckFscmVhZHlJbml0KQogICAgcHVzaGJ5dGVzICJFUlI6QUkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKaW5pdF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjEwNgogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT09IEdsb2JhbC5jcmVhdG9yQWRkcmVzcywgZXJyVW5hdXRob3JpemVkKQogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogaW5pdF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MTA2CiAgICAvLyBlbnN1cmUoVHhuLnNlbmRlciA9PT0gR2xvYmFsLmNyZWF0b3JBZGRyZXNzLCBlcnJVbmF1dGhvcml6ZWQpCiAgICBieXRlYyAxNyAvLyAiRVJSOkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKaW5pdF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjYzCiAgICAvLyByZWdpc3RyeUFwcCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSkKICAgIGJ5dGVjXzIgLy8gInJlZ2lzdHJ5QXBwIgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoxMDcKICAgIC8vIHRoaXMucmVnaXN0cnlBcHAudmFsdWUgPSByZWdpc3RyeUFwcC5pZAogICAgZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjEwOAogICAgLy8gdGhpcy5wZXJpb2RJZC52YWx1ZSA9IHBlcmlvZElkLmFzVWludDY0KCkKICAgIGRpZyAzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjY1CiAgICAvLyBwZXJpb2RJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKQogICAgYnl0ZWMgMTYgLy8gInBlcmlvZElkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoxMDgKICAgIC8vIHRoaXMucGVyaW9kSWQudmFsdWUgPSBwZXJpb2RJZC5hc1VpbnQ2NCgpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo3MwogICAgLy8gY29tbWl0dGVlSWQgPSBHbG9iYWxTdGF0ZTxDb21taXR0ZWVJZD4oKQogICAgYnl0ZWMgMTIgLy8gImNvbW1pdHRlZUlkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoxMDkKICAgIC8vIHRoaXMuY29tbWl0dGVlSWQudmFsdWUgPSBjb21taXR0ZWVJZAogICAgZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjExMAogICAgLy8gdGhpcy52b3RpbmdTdGFydC52YWx1ZSA9IHZvdGluZ1N0YXJ0LmFzVWludDY0KCkKICAgIGRpZyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjY3CiAgICAvLyB2b3RpbmdTdGFydCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKQogICAgYnl0ZWMgOCAvLyAidm90aW5nU3RhcnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjExMAogICAgLy8gdGhpcy52b3RpbmdTdGFydC52YWx1ZSA9IHZvdGluZ1N0YXJ0LmFzVWludDY0KCkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjExMQogICAgLy8gdGhpcy52b3RpbmdFbmQudmFsdWUgPSB2b3RpbmdFbmQuYXNVaW50NjQoKQogICAgZHVwCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjY5CiAgICAvLyB2b3RpbmdFbmQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCkKICAgIGJ5dGVjIDkgLy8gInZvdGluZ0VuZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MTExCiAgICAvLyB0aGlzLnZvdGluZ0VuZC52YWx1ZSA9IHZvdGluZ0VuZC5hc1VpbnQ2NCgpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo4MAogICAgLy8gdG9waWNPcHRpb25zQXJyID0gQm94PEdHb3ZUb3BpY09wdGlvbnNbXT4oeyBrZXk6ICdvJyB9KQogICAgYnl0ZWNfMSAvLyAibyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MTEyCiAgICAvLyB0aGlzLnRvcGljT3B0aW9uc0Fyci52YWx1ZSA9IFtdIGFzIEdHb3ZUb3BpY09wdGlvbnNbXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjgwCiAgICAvLyB0b3BpY09wdGlvbnNBcnIgPSBCb3g8R0dvdlRvcGljT3B0aW9uc1tdPih7IGtleTogJ28nIH0pCiAgICBieXRlY18xIC8vICJvIgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoxMTIKICAgIC8vIHRoaXMudG9waWNPcHRpb25zQXJyLnZhbHVlID0gW10gYXMgR0dvdlRvcGljT3B0aW9uc1tdCiAgICBieXRlYyA1IC8vIDB4MDAwMAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo4MgogICAgLy8gdG9waWNWb3Rlc0FyciA9IEJveDxHR292VG9waWNWb3Rlc1tdPih7IGtleTogJ3QnIH0pCiAgICBieXRlY18wIC8vICJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoxMTMKICAgIC8vIHRoaXMudG9waWNWb3Rlc0Fyci52YWx1ZSA9IFtdIGFzIEdHb3ZUb3BpY1ZvdGVzW10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo4MgogICAgLy8gdG9waWNWb3Rlc0FyciA9IEJveDxHR292VG9waWNWb3Rlc1tdPih7IGtleTogJ3QnIH0pCiAgICBieXRlY18wIC8vICJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoxMTMKICAgIC8vIHRoaXMudG9waWNWb3Rlc0Fyci52YWx1ZSA9IFtdIGFzIEdHb3ZUb3BpY1ZvdGVzW10KICAgIGJ5dGVjIDUgLy8gMHgwMDAwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjk3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjpHR292UGVyaW9kQ29udHJhY3QuZWRpdFBlcmlvZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmVkaXRQZXJpb2Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjE2MgogICAgLy8gcHVibGljIGVkaXRQZXJpb2QoY29tbWl0dGVlSWQ6IENvbW1pdHRlZUlkLCB2b3RpbmdTdGFydDogdWludDY0LCB2b3RpbmdFbmQ6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA4IC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MTYzCiAgICAvLyB0aGlzLmVuc3VyZUNhbGxlcklzT3BlcmF0b3IoKQogICAgY2FsbHN1YiBlbnN1cmVDYWxsZXJJc09wZXJhdG9yCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjE2NAogICAgLy8gdGhpcy5lbnN1cmVFZGl0YWJsZSgpCiAgICBjYWxsc3ViIGVuc3VyZUVkaXRhYmxlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjE2NQogICAgLy8gZW5zdXJlKHZvdGluZ0VuZCA+IHZvdGluZ1N0YXJ0LCBlcnJQZXJpb2RFbmRMZXNzVGhhblN0YXJ0KQogICAgPAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogZWRpdFBlcmlvZF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MTY1CiAgICAvLyBlbnN1cmUodm90aW5nRW5kID4gdm90aW5nU3RhcnQsIGVyclBlcmlvZEVuZExlc3NUaGFuU3RhcnQpCiAgICBwdXNoYnl0ZXMgIkVSUjpQRV9MVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgplZGl0UGVyaW9kX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NzMKICAgIC8vIGNvbW1pdHRlZUlkID0gR2xvYmFsU3RhdGU8Q29tbWl0dGVlSWQ+KCkKICAgIGJ5dGVjIDEyIC8vICJjb21taXR0ZWVJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MTY2CiAgICAvLyB0aGlzLmNvbW1pdHRlZUlkLnZhbHVlID0gY29tbWl0dGVlSWQKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo2NwogICAgLy8gdm90aW5nU3RhcnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCkKICAgIGJ5dGVjIDggLy8gInZvdGluZ1N0YXJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoxNjcKICAgIC8vIHRoaXMudm90aW5nU3RhcnQudmFsdWUgPSB2b3RpbmdTdGFydAogICAgZGlnIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjY5CiAgICAvLyB2b3RpbmdFbmQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCkKICAgIGJ5dGVjIDkgLy8gInZvdGluZ0VuZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MTY4CiAgICAvLyB0aGlzLnZvdGluZ0VuZC52YWx1ZSA9IHZvdGluZ0VuZAogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjE2OQogICAgLy8gdGhpcy5zeW5jU3VtbWFyeVRvUmVnaXN0cnkoKQogICAgY2FsbHN1YiBzeW5jU3VtbWFyeVRvUmVnaXN0cnkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MTYyCiAgICAvLyBwdWJsaWMgZWRpdFBlcmlvZChjb21taXR0ZWVJZDogQ29tbWl0dGVlSWQsIHZvdGluZ1N0YXJ0OiB1aW50NjQsIHZvdGluZ0VuZDogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo6R0dvdlBlcmlvZENvbnRyYWN0LmFkZFRvcGljW3JvdXRpbmddKCkgLT4gdm9pZDoKYWRkVG9waWM6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoxNzIKICAgIC8vIHB1YmxpYyBhZGRUb3BpYyhvcHRpb25zOiBzdHJpbmdbXSk6IHVpbnQ2NCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAyCiAgICAqCiAgICBzd2FwCiAgICBkdXAKICAgIGxlbgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMCAvLyAwCgphZGRUb3BpY19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjE3MgogICAgLy8gcHVibGljIGFkZFRvcGljKG9wdGlvbnM6IHN0cmluZ1tdKTogdWludDY0IHsKICAgIGR1cAogICAgZGlnIDUKICAgIDwKICAgIGJ6IGFkZFRvcGljX2FmdGVyX2ZvckA0CiAgICBkdXBuIDIKICAgIGludGNfMSAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGVuY29kaW5nCiAgICBkdXAKICAgIGRpZyA3CiAgICBkdXAKICAgIGNvdmVyIDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgZm9yIChsZW4rKGxlbit1dGY4W10pW10pCiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18xIC8vIDIKICAgICsKICAgICsKICAgIGJ1cnkgNQogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBhZGRUb3BpY19mb3JfaGVhZGVyQDEKCmFkZFRvcGljX2FmdGVyX2ZvckA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoxNzIKICAgIC8vIHB1YmxpYyBhZGRUb3BpYyhvcHRpb25zOiBzdHJpbmdbXSk6IHVpbnQ2NCB7CiAgICBkaWcgMwogICAgaW50Y18xIC8vIDIKICAgICsKICAgIGRpZyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c3RyaW5nPgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoxNzMKICAgIC8vIHRoaXMuZW5zdXJlQ2FsbGVySXNPcGVyYXRvcigpCiAgICBjYWxsc3ViIGVuc3VyZUNhbGxlcklzT3BlcmF0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MTc0CiAgICAvLyB0aGlzLmVuc3VyZUVkaXRhYmxlKCkKICAgIGNhbGxzdWIgZW5zdXJlRWRpdGFibGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgZGlnIDQKICAgIGJueiBhZGRUb3BpY19hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjE3NQogICAgLy8gZW5zdXJlKG9wdGlvbnMubGVuZ3RoID4gMCwgZXJyR0dvdk5vT3B0aW9ucykKICAgIGJ5dGVjIDE5IC8vICJFUlI6R1RfTk8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKYWRkVG9waWNfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MTc3CiAgICAvLyBjb25zdCB2b3RlczogVWludDMyW10gPSBbXQogICAgYnl0ZWMgNSAvLyAweDAwMDAKICAgIGJ1cnkgOAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoxNzgKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBvcHRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA3CgphZGRUb3BpY193aGlsZV90b3BANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MTc4CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgb3B0aW9ucy5sZW5ndGg7IGkrKykgewogICAgZGlnIDYKICAgIGRpZyA1CiAgICA8CiAgICBieiBhZGRUb3BpY19hZnRlcl93aGlsZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjE3OQogICAgLy8gdm90ZXMucHVzaCh1MzIoMCkpCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiB1MzIKICAgIGRpZyA4CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjE3OAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IG9wdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgIGRpZyA2CiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgYnVyeSA3CiAgICBiIGFkZFRvcGljX3doaWxlX3RvcEA2CgphZGRUb3BpY19hZnRlcl93aGlsZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo4MAogICAgLy8gdG9waWNPcHRpb25zQXJyID0gQm94PEdHb3ZUb3BpY09wdGlvbnNbXT4oeyBrZXk6ICdvJyB9KQogICAgYnl0ZWNfMSAvLyAibyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MTgzCiAgICAvLyBjb25zdCBvcHRpb25zQXJyID0gY2xvbmUodGhpcy50b3BpY09wdGlvbnNBcnIudmFsdWUpCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo4MgogICAgLy8gdG9waWNWb3Rlc0FyciA9IEJveDxHR292VG9waWNWb3Rlc1tdPih7IGtleTogJ3QnIH0pCiAgICBieXRlY18wIC8vICJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoxODQKICAgIC8vIGNvbnN0IHZvdGVzQXJyID0gY2xvbmUodGhpcy50b3BpY1ZvdGVzQXJyLnZhbHVlKQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6ODAKICAgIC8vIHRvcGljT3B0aW9uc0FyciA9IEJveDxHR292VG9waWNPcHRpb25zW10+KHsga2V5OiAnbycgfSkKICAgIGJ5dGVjXzEgLy8gIm8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjE4NQogICAgLy8gY29uc3QgdG9waWNJbmRleDogdWludDY0ID0gb3B0aW9uc0Fyci5sZW5ndGgKICAgIGludGNfMCAvLyAwCiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MTg2CiAgICAvLyBvcHRpb25zQXJyLnB1c2goY2xvbmUobmV3T3B0aW9ucykpCiAgICBkaWcgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDMKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlYyAyMCAvLyAweDAwMDIwMDAyCiAgICBkaWcgMTAKICAgIGNvbmNhdAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MTg3CiAgICAvLyB2b3Rlc0Fyci5wdXNoKGNsb25lKG5ld1ZvdGVzKSkKICAgIGRpZyAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMwogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDIwIC8vIDB4MDAwMjAwMDIKICAgIGRpZyAxMgogICAgY29uY2F0CiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo4MAogICAgLy8gdG9waWNPcHRpb25zQXJyID0gQm94PEdHb3ZUb3BpY09wdGlvbnNbXT4oeyBrZXk6ICdvJyB9KQogICAgYnl0ZWNfMSAvLyAibyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MTg4CiAgICAvLyB0aGlzLnRvcGljT3B0aW9uc0Fyci52YWx1ZSA9IGNsb25lKG9wdGlvbnNBcnIpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6ODAKICAgIC8vIHRvcGljT3B0aW9uc0FyciA9IEJveDxHR292VG9waWNPcHRpb25zW10+KHsga2V5OiAnbycgfSkKICAgIGJ5dGVjXzEgLy8gIm8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjE4OAogICAgLy8gdGhpcy50b3BpY09wdGlvbnNBcnIudmFsdWUgPSBjbG9uZShvcHRpb25zQXJyKQogICAgdW5jb3ZlciAyCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjgyCiAgICAvLyB0b3BpY1ZvdGVzQXJyID0gQm94PEdHb3ZUb3BpY1ZvdGVzW10+KHsga2V5OiAndCcgfSkKICAgIGJ5dGVjXzAgLy8gInQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjE4OQogICAgLy8gdGhpcy50b3BpY1ZvdGVzQXJyLnZhbHVlID0gY2xvbmUodm90ZXNBcnIpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6ODIKICAgIC8vIHRvcGljVm90ZXNBcnIgPSBCb3g8R0dvdlRvcGljVm90ZXNbXT4oeyBrZXk6ICd0JyB9KQogICAgYnl0ZWNfMCAvLyAidCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MTg5CiAgICAvLyB0aGlzLnRvcGljVm90ZXNBcnIudmFsdWUgPSBjbG9uZSh2b3Rlc0FycikKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MTkwCiAgICAvLyB0aGlzLnN5bmNTdW1tYXJ5VG9SZWdpc3RyeSgpCiAgICBjYWxsc3ViIHN5bmNTdW1tYXJ5VG9SZWdpc3RyeQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoxNzIKICAgIC8vIHB1YmxpYyBhZGRUb3BpYyhvcHRpb25zOiBzdHJpbmdbXSk6IHVpbnQ2NCB7CiAgICBpdG9iCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo6R0dvdlBlcmlvZENvbnRyYWN0LmVkaXRUb3BpY1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmVkaXRUb3BpYzoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDIKICAgIGJ5dGVjXzMgLy8gIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MTk0CiAgICAvLyBwdWJsaWMgZWRpdFRvcGljKHRvcGljSW5kZXg6IHVpbnQ2NCwgb3B0aW9uczogc3RyaW5nW10pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDggLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDIKICAgICoKICAgIHN3YXAKICAgIGR1cAogICAgbGVuCiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDAKCmVkaXRUb3BpY19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjE5NAogICAgLy8gcHVibGljIGVkaXRUb3BpYyh0b3BpY0luZGV4OiB1aW50NjQsIG9wdGlvbnM6IHN0cmluZ1tdKTogdm9pZCB7CiAgICBkdXAKICAgIGRpZyA1CiAgICA8CiAgICBieiBlZGl0VG9waWNfYWZ0ZXJfZm9yQDQKICAgIGR1cG4gMgogICAgaW50Y18xIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgZW5jb2RpbmcKICAgIGR1cAogICAgZGlnIDcKICAgIGR1cAogICAgY292ZXIgNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBmb3IgKGxlbisobGVuK3V0ZjhbXSlbXSkKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgKwogICAgYnVyeSA1CiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGVkaXRUb3BpY19mb3JfaGVhZGVyQDEKCmVkaXRUb3BpY19hZnRlcl9mb3JANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MTk0CiAgICAvLyBwdWJsaWMgZWRpdFRvcGljKHRvcGljSW5kZXg6IHVpbnQ2NCwgb3B0aW9uczogc3RyaW5nW10pOiB2b2lkIHsKICAgIGRpZyAzCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgZGlnIDMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzdHJpbmc+CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjE5NQogICAgLy8gdGhpcy5lbnN1cmVDYWxsZXJJc09wZXJhdG9yKCkKICAgIGNhbGxzdWIgZW5zdXJlQ2FsbGVySXNPcGVyYXRvcgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoxOTYKICAgIC8vIHRoaXMuZW5zdXJlRWRpdGFibGUoKQogICAgY2FsbHN1YiBlbnN1cmVFZGl0YWJsZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBkaWcgNAogICAgYm56IGVkaXRUb3BpY19hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjE5NwogICAgLy8gZW5zdXJlKG9wdGlvbnMubGVuZ3RoID4gMCwgZXJyR0dvdk5vT3B0aW9ucykKICAgIGJ5dGVjIDE5IC8vICJFUlI6R1RfTk8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKZWRpdFRvcGljX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjgwCiAgICAvLyB0b3BpY09wdGlvbnNBcnIgPSBCb3g8R0dvdlRvcGljT3B0aW9uc1tdPih7IGtleTogJ28nIH0pCiAgICBieXRlY18xIC8vICJvIgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoxOTgKICAgIC8vIGNvbnN0IG9wdGlvbnNBcnIgPSBjbG9uZSh0aGlzLnRvcGljT3B0aW9uc0Fyci52YWx1ZSkKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ1cnkgMTIKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjgyCiAgICAvLyB0b3BpY1ZvdGVzQXJyID0gQm94PEdHb3ZUb3BpY1ZvdGVzW10+KHsga2V5OiAndCcgfSkKICAgIGJ5dGVjXzAgLy8gInQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjE5OQogICAgLy8gY29uc3Qgdm90ZXNBcnIgPSBjbG9uZSh0aGlzLnRvcGljVm90ZXNBcnIudmFsdWUpCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo4MAogICAgLy8gdG9waWNPcHRpb25zQXJyID0gQm94PEdHb3ZUb3BpY09wdGlvbnNbXT4oeyBrZXk6ICdvJyB9KQogICAgYnl0ZWNfMSAvLyAibyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MjAwCiAgICAvLyBlbnN1cmUodG9waWNJbmRleCA8IG9wdGlvbnNBcnIubGVuZ3RoLCBlcnJHR292VG9waWNJbmRleE9PQikKICAgIGludGNfMCAvLyAwCiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyA3CiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiBlZGl0VG9waWNfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyMDAKICAgIC8vIGVuc3VyZSh0b3BpY0luZGV4IDwgb3B0aW9uc0Fyci5sZW5ndGgsIGVyckdHb3ZUb3BpY0luZGV4T09CKQogICAgYnl0ZWMgMjEgLy8gIkVSUjpHVF9PQiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgplZGl0VG9waWNfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MjAyCiAgICAvLyBjb25zdCB2b3RlczogVWludDMyW10gPSBbXQogICAgYnl0ZWMgNSAvLyAweDAwMDAKICAgIGJ1cnkgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MjAzCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgb3B0aW9ucy5sZW5ndGg7IGkrKykgewogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAoKZWRpdFRvcGljX3doaWxlX3RvcEA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyMDMKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBvcHRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICBkaWcgNwogICAgZGlnIDUKICAgIDwKICAgIGJ6IGVkaXRUb3BpY19hZnRlcl93aGlsZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjIwNAogICAgLy8gdm90ZXMucHVzaCh1MzIoMCkpCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiB1MzIKICAgIGRpZyAxMAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MjAzCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgb3B0aW9ucy5sZW5ndGg7IGkrKykgewogICAgZGlnIDcKICAgIGludGNfMiAvLyAxCiAgICArCiAgICBidXJ5IDgKICAgIGIgZWRpdFRvcGljX3doaWxlX3RvcEA2CgplZGl0VG9waWNfYWZ0ZXJfd2hpbGVAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MjA2CiAgICAvLyBvcHRpb25zQXJyW3RvcGljSW5kZXhdID0geyBvcHRpb25zOiBjbG9uZShvcHRpb25zKSB9CiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgZGlnIDYKICAgIGNvbmNhdAogICAgZGlnIDExCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkaWcgOQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjIwNwogICAgLy8gdm90ZXNBcnJbdG9waWNJbmRleF0gPSB7IHZvdGVzOiBjbG9uZSh2b3RlcykgfQogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIGRpZyAxMgogICAgY29uY2F0CiAgICBkaWcgMTEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGRpZyA0CiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjgwCiAgICAvLyB0b3BpY09wdGlvbnNBcnIgPSBCb3g8R0dvdlRvcGljT3B0aW9uc1tdPih7IGtleTogJ28nIH0pCiAgICBieXRlY18xIC8vICJvIgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyMDgKICAgIC8vIHRoaXMudG9waWNPcHRpb25zQXJyLnZhbHVlID0gY2xvbmUob3B0aW9uc0FycikKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo4MAogICAgLy8gdG9waWNPcHRpb25zQXJyID0gQm94PEdHb3ZUb3BpY09wdGlvbnNbXT4oeyBrZXk6ICdvJyB9KQogICAgYnl0ZWNfMSAvLyAibyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MjA4CiAgICAvLyB0aGlzLnRvcGljT3B0aW9uc0Fyci52YWx1ZSA9IGNsb25lKG9wdGlvbnNBcnIpCiAgICB1bmNvdmVyIDIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6ODIKICAgIC8vIHRvcGljVm90ZXNBcnIgPSBCb3g8R0dvdlRvcGljVm90ZXNbXT4oeyBrZXk6ICd0JyB9KQogICAgYnl0ZWNfMCAvLyAidCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MjA5CiAgICAvLyB0aGlzLnRvcGljVm90ZXNBcnIudmFsdWUgPSBjbG9uZSh2b3Rlc0FycikKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo4MgogICAgLy8gdG9waWNWb3Rlc0FyciA9IEJveDxHR292VG9waWNWb3Rlc1tdPih7IGtleTogJ3QnIH0pCiAgICBieXRlY18wIC8vICJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyMDkKICAgIC8vIHRoaXMudG9waWNWb3Rlc0Fyci52YWx1ZSA9IGNsb25lKHZvdGVzQXJyKQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoxOTQKICAgIC8vIHB1YmxpYyBlZGl0VG9waWModG9waWNJbmRleDogdWludDY0LCBvcHRpb25zOiBzdHJpbmdbXSk6IHZvaWQgewogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6OkdHb3ZQZXJpb2RDb250cmFjdC5yZW1vdmVUb3BpY1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlbW92ZVRvcGljOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMyAvLyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyMTMKICAgIC8vIHB1YmxpYyByZW1vdmVUb3BpYyh0b3BpY0luZGV4OiB1aW50NjQpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDggLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyMTQKICAgIC8vIHRoaXMuZW5zdXJlQ2FsbGVySXNPcGVyYXRvcigpCiAgICBjYWxsc3ViIGVuc3VyZUNhbGxlcklzT3BlcmF0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MjE1CiAgICAvLyB0aGlzLmVuc3VyZUVkaXRhYmxlKCkKICAgIGNhbGxzdWIgZW5zdXJlRWRpdGFibGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6ODAKICAgIC8vIHRvcGljT3B0aW9uc0FyciA9IEJveDxHR292VG9waWNPcHRpb25zW10+KHsga2V5OiAnbycgfSkKICAgIGJ5dGVjXzEgLy8gIm8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjIxNgogICAgLy8gY29uc3Qgb3B0aW9uc0FyciA9IGNsb25lKHRoaXMudG9waWNPcHRpb25zQXJyLnZhbHVlKQogICAgYm94X2dldAogICAgc3dhcAogICAgY292ZXIgMgogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6ODIKICAgIC8vIHRvcGljVm90ZXNBcnIgPSBCb3g8R0dvdlRvcGljVm90ZXNbXT4oeyBrZXk6ICd0JyB9KQogICAgYnl0ZWNfMCAvLyAidCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MjE3CiAgICAvLyBjb25zdCB2b3Rlc0FyciA9IGNsb25lKHRoaXMudG9waWNWb3Rlc0Fyci52YWx1ZSkKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjgwCiAgICAvLyB0b3BpY09wdGlvbnNBcnIgPSBCb3g8R0dvdlRvcGljT3B0aW9uc1tdPih7IGtleTogJ28nIH0pCiAgICBieXRlY18xIC8vICJvIgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyMTgKICAgIC8vIGVuc3VyZSh0b3BpY0luZGV4IDwgb3B0aW9uc0Fyci5sZW5ndGgsIGVyckdHb3ZUb3BpY0luZGV4T09CKQogICAgaW50Y18wIC8vIDAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgPAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogcmVtb3ZlVG9waWNfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjIxOAogICAgLy8gZW5zdXJlKHRvcGljSW5kZXggPCBvcHRpb25zQXJyLmxlbmd0aCwgZXJyR0dvdlRvcGljSW5kZXhPT0IpCiAgICBieXRlYyAyMSAvLyAiRVJSOkdUX09CIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnJlbW92ZVRvcGljX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MjE5CiAgICAvLyBjb25zdCBuZXh0T3B0aW9uczogR0dvdlRvcGljT3B0aW9uc1tdID0gW10KICAgIGJ5dGVjIDUgLy8gMHgwMDAwCiAgICBidXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MjIwCiAgICAvLyBjb25zdCBuZXh0Vm90ZXM6IEdHb3ZUb3BpY1ZvdGVzW10gPSBbXQogICAgYnl0ZWMgNSAvLyAweDAwMDAKICAgIGJ1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyMjEKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBvcHRpb25zQXJyLmxlbmd0aDsgaSsrKSB7CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA0CgpyZW1vdmVUb3BpY193aGlsZV90b3BAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6ODAKICAgIC8vIHRvcGljT3B0aW9uc0FyciA9IEJveDxHR292VG9waWNPcHRpb25zW10+KHsga2V5OiAnbycgfSkKICAgIGJ5dGVjXzEgLy8gIm8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjIyMQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IG9wdGlvbnNBcnIubGVuZ3RoOyBpKyspIHsKICAgIGludGNfMCAvLyAwCiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyA0CiAgICA+CiAgICBieiByZW1vdmVUb3BpY19hZnRlcl93aGlsZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjIyMgogICAgLy8gaWYgKGkgIT09IHRvcGljSW5kZXgpIHsKICAgIGRpZyAzCiAgICBkaWcgMwogICAgIT0KICAgIGJ6IHJlbW92ZVRvcGljX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyMjMKICAgIC8vIG5leHRPcHRpb25zLnB1c2goY2xvbmUob3B0aW9uc0FycltpXSkpCiAgICBkaWcgMQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMSAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGludGNfMiAvLyAxCiAgICArCiAgICB1bmNvdmVyIDMKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDQKICAgIGxlbgogICAgZGlnIDIKICAgIGludGNfMSAvLyAyCiAgICAqCiAgICBkaWcgNgogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIHVuY292ZXIgMwogICAgc2VsZWN0CiAgICB1bmNvdmVyIDUKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkaWcgOQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MjI0CiAgICAvLyBuZXh0Vm90ZXMucHVzaChjbG9uZSh2b3Rlc0FycltpXSkpCiAgICBkaWcgMwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGRpZyAxCiAgICB1bmNvdmVyIDUKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICB1bmNvdmVyIDQKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMgogICAgbGVuCiAgICBkaWcgMwogICAgdW5jb3ZlciA1CiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDYgLy8gMHgwMDAyCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgNQoKcmVtb3ZlVG9waWNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyMjEKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBvcHRpb25zQXJyLmxlbmd0aDsgaSsrKSB7CiAgICBkaWcgMwogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGJ1cnkgNAogICAgYiByZW1vdmVUb3BpY193aGlsZV90b3BAMgoKcmVtb3ZlVG9waWNfYWZ0ZXJfd2hpbGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6ODAKICAgIC8vIHRvcGljT3B0aW9uc0FyciA9IEJveDxHR292VG9waWNPcHRpb25zW10+KHsga2V5OiAnbycgfSkKICAgIGJ5dGVjXzEgLy8gIm8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjIyNwogICAgLy8gdGhpcy50b3BpY09wdGlvbnNBcnIudmFsdWUgPSBjbG9uZShuZXh0T3B0aW9ucykKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo4MAogICAgLy8gdG9waWNPcHRpb25zQXJyID0gQm94PEdHb3ZUb3BpY09wdGlvbnNbXT4oeyBrZXk6ICdvJyB9KQogICAgYnl0ZWNfMSAvLyAibyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MjI3CiAgICAvLyB0aGlzLnRvcGljT3B0aW9uc0Fyci52YWx1ZSA9IGNsb25lKG5leHRPcHRpb25zKQogICAgZGlnIDYKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6ODIKICAgIC8vIHRvcGljVm90ZXNBcnIgPSBCb3g8R0dvdlRvcGljVm90ZXNbXT4oeyBrZXk6ICd0JyB9KQogICAgYnl0ZWNfMCAvLyAidCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MjI4CiAgICAvLyB0aGlzLnRvcGljVm90ZXNBcnIudmFsdWUgPSBjbG9uZShuZXh0Vm90ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6ODIKICAgIC8vIHRvcGljVm90ZXNBcnIgPSBCb3g8R0dvdlRvcGljVm90ZXNbXT4oeyBrZXk6ICd0JyB9KQogICAgYnl0ZWNfMCAvLyAidCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MjI4CiAgICAvLyB0aGlzLnRvcGljVm90ZXNBcnIudmFsdWUgPSBjbG9uZShuZXh0Vm90ZXMpCiAgICBkaWcgNQogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyMjkKICAgIC8vIHRoaXMuc3luY1N1bW1hcnlUb1JlZ2lzdHJ5KCkKICAgIGNhbGxzdWIgc3luY1N1bW1hcnlUb1JlZ2lzdHJ5CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjIxMwogICAgLy8gcHVibGljIHJlbW92ZVRvcGljKHRvcGljSW5kZXg6IHVpbnQ2NCk6IHZvaWQgewogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6OkdHb3ZQZXJpb2RDb250cmFjdC5zZXRSZWFkeVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldFJlYWR5OgogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwbiA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjIzMwogICAgLy8gcHVibGljIHNldFJlYWR5KHJlYWR5OiBib29sZWFuKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjIzNAogICAgLy8gdGhpcy5lbnN1cmVDYWxsZXJJc09wZXJhdG9yKCkKICAgIGNhbGxzdWIgZW5zdXJlQ2FsbGVySXNPcGVyYXRvcgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyMzYKICAgIC8vIGlmIChyZWFkeSkgewogICAgYnogc2V0UmVhZHlfZWxzZV9ib2R5QDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MjQ1CiAgICAvLyBsZXQgbG9nU2l6ZTogdWludDY0ID0gODEKICAgIHB1c2hpbnQgODEgLy8gODEKICAgIGJ1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyNDYKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB2b3Rlc0Fyci5sZW5ndGg7IGkrKykgewogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQoKc2V0UmVhZHlfd2hpbGVfdG9wQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjgyCiAgICAvLyB0b3BpY1ZvdGVzQXJyID0gQm94PEdHb3ZUb3BpY1ZvdGVzW10+KHsga2V5OiAndCcgfSkKICAgIGJ5dGVjXzAgLy8gInQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjI0NgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHZvdGVzQXJyLmxlbmd0aDsgaSsrKSB7CiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNQogICAgPgogICAgYnogc2V0UmVhZHlfYWZ0ZXJfd2hpbGVANQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyNDcKICAgIC8vIGxvZ1NpemUgKz0gNCArIDQgKiB2b3Rlc0FycltpXS52b3Rlcy5sZW5ndGgKICAgIGludGNfMSAvLyAyCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAqCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo4MgogICAgLy8gdG9waWNWb3Rlc0FyciA9IEJveDxHR292VG9waWNWb3Rlc1tdPih7IGtleTogJ3QnIH0pCiAgICBieXRlY18wIC8vICJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyNDcKICAgIC8vIGxvZ1NpemUgKz0gNCArIDQgKiB2b3Rlc0FycltpXS52b3Rlcy5sZW5ndGgKICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50Y18zIC8vIDQKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6ODIKICAgIC8vIHRvcGljVm90ZXNBcnIgPSBCb3g8R0dvdlRvcGljVm90ZXNbXT4oeyBrZXk6ICd0JyB9KQogICAgYnl0ZWNfMCAvLyAidCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MjQ3CiAgICAvLyBsb2dTaXplICs9IDQgKyA0ICogdm90ZXNBcnJbaV0udm90ZXMubGVuZ3RoCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGNfMyAvLyA0CiAgICAqCiAgICBpbnRjXzMgLy8gNAogICAgKwogICAgZGlnIDMKICAgICsKICAgIGJ1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyNDYKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB2b3Rlc0Fyci5sZW5ndGg7IGkrKykgewogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiBzZXRSZWFkeV93aGlsZV90b3BAMwoKc2V0UmVhZHlfYWZ0ZXJfd2hpbGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MjQ5CiAgICAvLyBlbnN1cmUobG9nU2l6ZSA8PSAxMDI0LCBlcnJHR292VW52b3RhYmxlKQogICAgZGlnIDEKICAgIHB1c2hpbnQgMTAyNCAvLyAxMDI0CiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogc2V0UmVhZHlfYWZ0ZXJfaWZfZWxzZUAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyNDkKICAgIC8vIGVuc3VyZShsb2dTaXplIDw9IDEwMjQsIGVyckdHb3ZVbnZvdGFibGUpCiAgICBwdXNoYnl0ZXMgIkVSUjpHUF9VViIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgpzZXRSZWFkeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo3MQogICAgLy8gcmVhZHkgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogZmFsc2UgfSkKICAgIGJ5dGVjIDExIC8vICJyZWFkeSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MjU5CiAgICAvLyB0aGlzLnJlYWR5LnZhbHVlID0gcmVhZHkKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyNjAKICAgIC8vIHRoaXMuc3luY1N1bW1hcnlUb1JlZ2lzdHJ5KCkKICAgIGNhbGxzdWIgc3luY1N1bW1hcnlUb1JlZ2lzdHJ5CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjIzMwogICAgLy8gcHVibGljIHNldFJlYWR5KHJlYWR5OiBib29sZWFuKTogdm9pZCB7CiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgpzZXRSZWFkeV9lbHNlX2JvZHlANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MjUyCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgdm90ZXNBcnIubGVuZ3RoOyBpKyspIHsKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDQKCnNldFJlYWR5X3doaWxlX3RvcEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo4MgogICAgLy8gdG9waWNWb3Rlc0FyciA9IEJveDxHR292VG9waWNWb3Rlc1tdPih7IGtleTogJ3QnIH0pCiAgICBieXRlY18wIC8vICJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyNTIKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB2b3Rlc0Fyci5sZW5ndGg7IGkrKykgewogICAgaW50Y18wIC8vIDAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDQKICAgID4KICAgIGJ6IHNldFJlYWR5X2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MjU0CiAgICAvLyBmb3IgKGxldCBqOiB1aW50NjQgPSAwOyBqIDwgdGFsbGllcy5sZW5ndGg7IGorKykgewogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMwoKc2V0UmVhZHlfd2hpbGVfdG9wQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjI1My0yNTQKICAgIC8vIGNvbnN0IHRhbGxpZXMgPSBjbG9uZSh2b3Rlc0FycltpXS52b3RlcykKICAgIC8vIGZvciAobGV0IGo6IHVpbnQ2NCA9IDA7IGogPCB0YWxsaWVzLmxlbmd0aDsgaisrKSB7CiAgICBpbnRjXzEgLy8gMgogICAgZGlnIDQKICAgICoKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkdXAKICAgIGJ1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo4MgogICAgLy8gdG9waWNWb3Rlc0FyciA9IEJveDxHR292VG9waWNWb3Rlc1tdPih7IGtleTogJ3QnIH0pCiAgICBieXRlY18wIC8vICJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyNTMtMjU0CiAgICAvLyBjb25zdCB0YWxsaWVzID0gY2xvbmUodm90ZXNBcnJbaV0udm90ZXMpCiAgICAvLyBmb3IgKGxldCBqOiB1aW50NjQgPSAwOyBqIDwgdGFsbGllcy5sZW5ndGg7IGorKykgewogICAgc3dhcAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpbnRjXzMgLy8gNAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo4MgogICAgLy8gdG9waWNWb3Rlc0FyciA9IEJveDxHR292VG9waWNWb3Rlc1tdPih7IGtleTogJ3QnIH0pCiAgICBieXRlY18wIC8vICJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyNTMtMjU0CiAgICAvLyBjb25zdCB0YWxsaWVzID0gY2xvbmUodm90ZXNBcnJbaV0udm90ZXMpCiAgICAvLyBmb3IgKGxldCBqOiB1aW50NjQgPSAwOyBqIDwgdGFsbGllcy5sZW5ndGg7IGorKykgewogICAgc3dhcAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjI1NAogICAgLy8gZm9yIChsZXQgajogdWludDY0ID0gMDsgaiA8IHRhbGxpZXMubGVuZ3RoOyBqKyspIHsKICAgIGRpZyAzCiAgICA+CiAgICBieiBzZXRSZWFkeV9hZnRlcl93aGlsZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo4MgogICAgLy8gdG9waWNWb3Rlc0FyciA9IEJveDxHR292VG9waWNWb3Rlc1tdPih7IGtleTogJ3QnIH0pCiAgICBieXRlY18wIC8vICJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyNTUKICAgIC8vIGVuc3VyZSh0YWxsaWVzW2pdLmFzVWludDY0KCkgPT09IDAsIGVyckdHb3ZIYXNWb3RlcykKICAgIGRpZyA2CiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGNfMyAvLyA0CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjgyCiAgICAvLyB0b3BpY1ZvdGVzQXJyID0gQm94PEdHb3ZUb3BpY1ZvdGVzW10+KHsga2V5OiAndCcgfSkKICAgIGJ5dGVjXzAgLy8gInQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjI1NQogICAgLy8gZW5zdXJlKHRhbGxpZXNbal0uYXNVaW50NjQoKSA9PT0gMCwgZXJyR0dvdkhhc1ZvdGVzKQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDQKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICA8CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgaW50Y18xIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGludGNfMyAvLyA0CiAgICAqCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjgyCiAgICAvLyB0b3BpY1ZvdGVzQXJyID0gQm94PEdHb3ZUb3BpY1ZvdGVzW10+KHsga2V5OiAndCcgfSkKICAgIGJ5dGVjXzAgLy8gInQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjI1NQogICAgLy8gZW5zdXJlKHRhbGxpZXNbal0uYXNVaW50NjQoKSA9PT0gMCwgZXJyR0dvdkhhc1ZvdGVzKQogICAgc3dhcAogICAgaW50Y18zIC8vIDQKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJ6IHNldFJlYWR5X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MjU1CiAgICAvLyBlbnN1cmUodGFsbGllc1tqXS5hc1VpbnQ2NCgpID09PSAwLCBlcnJHR292SGFzVm90ZXMpCiAgICBwdXNoYnl0ZXMgIkVSUjpHUF9WRSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgpzZXRSZWFkeV9hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyNTQKICAgIC8vIGZvciAobGV0IGo6IHVpbnQ2NCA9IDA7IGogPCB0YWxsaWVzLmxlbmd0aDsgaisrKSB7CiAgICBkaWcgMgogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGJ1cnkgMwogICAgYiBzZXRSZWFkeV93aGlsZV90b3BAOQoKc2V0UmVhZHlfYWZ0ZXJfd2hpbGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjI1MgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHZvdGVzQXJyLmxlbmd0aDsgaSsrKSB7CiAgICBkaWcgMwogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGJ1cnkgNAogICAgYiBzZXRSZWFkeV93aGlsZV90b3BANwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6OkdHb3ZQZXJpb2RDb250cmFjdC51cGxvYWRQZXJpb2RCb2R5UGFydGlhbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnVwbG9hZFBlcmlvZEJvZHlQYXJ0aWFsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyNjUKICAgIC8vIHB1YmxpYyB1cGxvYWRQZXJpb2RCb2R5UGFydGlhbChzdGFydE9mZnNldDogdWludDY0LCBkYXRhOiBieXRlcyk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjI2NgogICAgLy8gdGhpcy5lbnN1cmVDYWxsZXJJc09wZXJhdG9yKCkKICAgIGNhbGxzdWIgZW5zdXJlQ2FsbGVySXNPcGVyYXRvcgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyNjcKICAgIC8vIHRoaXMuZW5zdXJlRWRpdGFibGUoKQogICAgY2FsbHN1YiBlbnN1cmVFZGl0YWJsZQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyNjkKICAgIC8vIGNvbnN0IHdyaXRlRW5kOiB1aW50NjQgPSBzdGFydE9mZnNldCArIGRhdGEubGVuZ3RoCiAgICBsZW4KICAgIGRpZyAxCiAgICArCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjI3MAogICAgLy8gaWYgKHN0YXJ0T2Zmc2V0ID09PSAwKSB7CiAgICBibnogdXBsb2FkUGVyaW9kQm9keVBhcnRpYWxfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MjcxCiAgICAvLyBvcC5Cb3guZGVsZXRlKGJveEtleSkKICAgIGJ5dGVjIDcgLy8gIlAiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MjcyCiAgICAvLyBvcC5Cb3guY3JlYXRlKGJveEtleSwgd3JpdGVFbmQpCiAgICBieXRlYyA3IC8vICJQIgogICAgZGlnIDEKICAgIGJveF9jcmVhdGUKICAgIHBvcAoKdXBsb2FkUGVyaW9kQm9keVBhcnRpYWxfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyNzkKICAgIC8vIG9wLkJveC5yZXBsYWNlKGJveEtleSwgc3RhcnRPZmZzZXQsIGRhdGEpCiAgICBieXRlYyA3IC8vICJQIgogICAgZGlnIDMKICAgIGRpZyAzCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyNjUKICAgIC8vIHB1YmxpYyB1cGxvYWRQZXJpb2RCb2R5UGFydGlhbChzdGFydE9mZnNldDogdWludDY0LCBkYXRhOiBieXRlcyk6IHZvaWQgewogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKdXBsb2FkUGVyaW9kQm9keVBhcnRpYWxfZWxzZV9ib2R5QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjI3NAogICAgLy8gY29uc3QgW2JveExlbl0gPSBvcC5Cb3gubGVuZ3RoKGJveEtleSkKICAgIGJ5dGVjIDcgLy8gIlAiCiAgICBib3hfbGVuCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6Mjc1CiAgICAvLyBpZiAod3JpdGVFbmQgPiBib3hMZW4pIHsKICAgIGRpZyAxCiAgICA8CiAgICBieiB1cGxvYWRQZXJpb2RCb2R5UGFydGlhbF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6Mjc2CiAgICAvLyBvcC5Cb3gucmVzaXplKGJveEtleSwgd3JpdGVFbmQpCiAgICBieXRlYyA3IC8vICJQIgogICAgZGlnIDEKICAgIGJveF9yZXNpemUKICAgIGIgdXBsb2FkUGVyaW9kQm9keVBhcnRpYWxfYWZ0ZXJfaWZfZWxzZUA2CgoKLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo6R0dvdlBlcmlvZENvbnRyYWN0LnVwbG9hZFRvcGljQm9keVBhcnRpYWxbcm91dGluZ10oKSAtPiB2b2lkOgp1cGxvYWRUb3BpY0JvZHlQYXJ0aWFsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyODIKICAgIC8vIHB1YmxpYyB1cGxvYWRUb3BpY0JvZHlQYXJ0aWFsKHRvcGljSW5kZXg6IHVpbnQ2NCwgc3RhcnRPZmZzZXQ6IHVpbnQ2NCwgZGF0YTogYnl0ZXMpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDggLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDggLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18xIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgY292ZXIgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyODYKICAgIC8vIHRoaXMuZW5zdXJlQ2FsbGVySXNPcGVyYXRvcigpCiAgICBjYWxsc3ViIGVuc3VyZUNhbGxlcklzT3BlcmF0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6Mjg3CiAgICAvLyB0aGlzLmVuc3VyZUVkaXRhYmxlKCkKICAgIGNhbGxzdWIgZW5zdXJlRWRpdGFibGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MTU3CiAgICAvLyByZXR1cm4gVE9QSUNfQk9EWV9CT1hfUFJFRklYLmNvbmNhdChlbmNvZGVBcmM0KHUzMih0b3BpY0luZGV4KSkpCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgdTMyCiAgICBwdXNoYnl0ZXMgIlQiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6Mjg5CiAgICAvLyBjb25zdCB3cml0ZUVuZDogdWludDY0ID0gc3RhcnRPZmZzZXQgKyBkYXRhLmxlbmd0aAogICAgbGVuCiAgICBkaWcgMQogICAgKwogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyOTAKICAgIC8vIGlmIChzdGFydE9mZnNldCA9PT0gMCkgewogICAgYm56IHVwbG9hZFRvcGljQm9keVBhcnRpYWxfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MjkxCiAgICAvLyBvcC5Cb3guZGVsZXRlKGJveEtleSkKICAgIGRpZyAxCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyOTIKICAgIC8vIG9wLkJveC5jcmVhdGUoYm94S2V5LCB3cml0ZUVuZCkKICAgIGRpZyAxCiAgICBib3hfY3JlYXRlCiAgICBwb3AKCnVwbG9hZFRvcGljQm9keVBhcnRpYWxfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyOTkKICAgIC8vIG9wLkJveC5yZXBsYWNlKGJveEtleSwgc3RhcnRPZmZzZXQsIGRhdGEpCiAgICBkaWcgMQogICAgZGlnIDQKICAgIGRpZyA0CiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyODIKICAgIC8vIHB1YmxpYyB1cGxvYWRUb3BpY0JvZHlQYXJ0aWFsKHRvcGljSW5kZXg6IHVpbnQ2NCwgc3RhcnRPZmZzZXQ6IHVpbnQ2NCwgZGF0YTogYnl0ZXMpOiB2b2lkIHsKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCnVwbG9hZFRvcGljQm9keVBhcnRpYWxfZWxzZV9ib2R5QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjI5NAogICAgLy8gY29uc3QgW2JveExlbl0gPSBvcC5Cb3gubGVuZ3RoKGJveEtleSkKICAgIGRpZyAxCiAgICBib3hfbGVuCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6Mjk1CiAgICAvLyBpZiAod3JpdGVFbmQgPiBib3hMZW4pIHsKICAgIGRpZyAxCiAgICA8CiAgICBieiB1cGxvYWRUb3BpY0JvZHlQYXJ0aWFsX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoyOTYKICAgIC8vIG9wLkJveC5yZXNpemUoYm94S2V5LCB3cml0ZUVuZCkKICAgIGR1cDIKICAgIGJveF9yZXNpemUKICAgIGIgdXBsb2FkVG9waWNCb2R5UGFydGlhbF9hZnRlcl9pZl9lbHNlQDYKCgovLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjpHR292UGVyaW9kQ29udHJhY3QuZGVsZXRlVG9waWNCb2RpZXNbcm91dGluZ10oKSAtPiB2b2lkOgpkZWxldGVUb3BpY0JvZGllczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MzA5CiAgICAvLyBwdWJsaWMgZGVsZXRlVG9waWNCb2RpZXModG9waWNJbmRleGVzOiB1aW50NjRbXSk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDggLy8gOAogICAgKgogICAgaW50Y18xIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHVpbnQ2ND4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MzEwCiAgICAvLyB0aGlzLmNoZWNrQWRtaW5DYWxsZXIoKQogICAgY2FsbHN1YiBjaGVja0FkbWluQ2FsbGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjMxMQogICAgLy8gdGhpcy5lbnN1cmVFZGl0YWJsZSgpCiAgICBjYWxsc3ViIGVuc3VyZUVkaXRhYmxlCiAgICBpbnRjXzAgLy8gMAoKZGVsZXRlVG9waWNCb2RpZXNfZm9yX2hlYWRlckAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czozMTIKICAgIC8vIGZvciAoY29uc3QgaWR4IG9mIGNsb25lKHRvcGljSW5kZXhlcykpIHsKICAgIGR1cAogICAgZGlnIDIKICAgIDwKICAgIGJ6IGRlbGV0ZVRvcGljQm9kaWVzX2FmdGVyX2ZvckA1CiAgICBkaWcgMgogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgOCAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoxNTcKICAgIC8vIHJldHVybiBUT1BJQ19CT0RZX0JPWF9QUkVGSVguY29uY2F0KGVuY29kZUFyYzQodTMyKHRvcGljSW5kZXgpKSkKICAgIGNhbGxzdWIgdTMyCiAgICBwdXNoYnl0ZXMgIlQiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MzEzCiAgICAvLyBvcC5Cb3guZGVsZXRlKHRoaXMudG9waWNCb2R5Qm94S2V5KGlkeCkpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGludGNfMiAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgZGVsZXRlVG9waWNCb2RpZXNfZm9yX2hlYWRlckAyCgpkZWxldGVUb3BpY0JvZGllc19hZnRlcl9mb3JANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MzA5CiAgICAvLyBwdWJsaWMgZGVsZXRlVG9waWNCb2RpZXModG9waWNJbmRleGVzOiB1aW50NjRbXSk6IHZvaWQgewogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6OkdHb3ZQZXJpb2RDb250cmFjdC52b3RlW3JvdXRpbmddKCkgLT4gdm9pZDoKdm90ZToKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDYKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cG4gMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MzI2CiAgICAvLyBwdWJsaWMgdm90ZSh2b3RlckFjY291bnQ6IEFjY291bnQsIHRvcGljVm90ZXM6IFVpbnQzMltdW10pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDIKICAgICoKICAgIHN3YXAKICAgIGR1cAogICAgbGVuCiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDAKCnZvdGVfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czozMjYKICAgIC8vIHB1YmxpYyB2b3RlKHZvdGVyQWNjb3VudDogQWNjb3VudCwgdG9waWNWb3RlczogVWludDMyW11bXSk6IHZvaWQgewogICAgZHVwCiAgICBkaWcgNQogICAgPAogICAgYnogdm90ZV9hZnRlcl9mb3JANAogICAgZHVwbiAyCiAgICBpbnRjXzEgLy8gMgogICAgKgogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBlbmNvZGluZwogICAgZHVwCiAgICBkaWcgNwogICAgZHVwCiAgICBjb3ZlciA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGZvciAobGVuKyhsZW4rdWludDMyW10pW10pCiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDQKICAgICoKICAgIGludGNfMSAvLyAyCiAgICArCiAgICArCiAgICBidXJ5IDUKICAgIGludGNfMiAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdm90ZV9mb3JfaGVhZGVyQDEKCnZvdGVfYWZ0ZXJfZm9yQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjMyNgogICAgLy8gcHVibGljIHZvdGUodm90ZXJBY2NvdW50OiBBY2NvdW50LCB0b3BpY1ZvdGVzOiBVaW50MzJbXVtdKTogdm9pZCB7CiAgICBkaWcgMwogICAgaW50Y18xIC8vIDIKICAgICsKICAgIGRpZyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDMyPj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MzI3CiAgICAvLyBlbnN1cmUodGhpcy5yZWFkeS52YWx1ZSwgZXJyR0dvdk5vdFJlYWR5KQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NzEKICAgIC8vIHJlYWR5ID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBpbml0aWFsVmFsdWU6IGZhbHNlIH0pCiAgICBieXRlYyAxMSAvLyAicmVhZHkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjMyNwogICAgLy8gZW5zdXJlKHRoaXMucmVhZHkudmFsdWUsIGVyckdHb3ZOb3RSZWFkeSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiB2b3RlX2FmdGVyX2lmX2Vsc2VANTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MzI3CiAgICAvLyBlbnN1cmUodGhpcy5yZWFkeS52YWx1ZSwgZXJyR0dvdk5vdFJlYWR5KQogICAgcHVzaGJ5dGVzICJFUlI6R1BfTlIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKdm90ZV9hZnRlcl9pZl9lbHNlQDU1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czozMjgKICAgIC8vIGVuc3VyZShHbG9iYWwubGF0ZXN0VGltZXN0YW1wID49IHRoaXMudm90aW5nU3RhcnQudmFsdWUsIGVyckdHb3ZWb3RpbmdOb3RTdGFydGVkKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NjcKICAgIC8vIHZvdGluZ1N0YXJ0ID0gR2xvYmFsU3RhdGU8dWludDY0PigpCiAgICBieXRlYyA4IC8vICJ2b3RpbmdTdGFydCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MzI4CiAgICAvLyBlbnN1cmUoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA+PSB0aGlzLnZvdGluZ1N0YXJ0LnZhbHVlLCBlcnJHR292Vm90aW5nTm90U3RhcnRlZCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogdm90ZV9hZnRlcl9pZl9lbHNlQDU5CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjMyOAogICAgLy8gZW5zdXJlKEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPj0gdGhpcy52b3RpbmdTdGFydC52YWx1ZSwgZXJyR0dvdlZvdGluZ05vdFN0YXJ0ZWQpCiAgICBwdXNoYnl0ZXMgIkVSUjpHUF9OUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgp2b3RlX2FmdGVyX2lmX2Vsc2VANTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjMyOQogICAgLy8gZW5zdXJlKEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPCB0aGlzLnZvdGluZ0VuZC52YWx1ZSwgZXJyR0dvdlZvdGluZ0VuZGVkKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NjkKICAgIC8vIHZvdGluZ0VuZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKQogICAgYnl0ZWMgOSAvLyAidm90aW5nRW5kIgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czozMjkKICAgIC8vIGVuc3VyZShHbG9iYWwubGF0ZXN0VGltZXN0YW1wIDwgdGhpcy52b3RpbmdFbmQudmFsdWUsIGVyckdHb3ZWb3RpbmdFbmRlZCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA8CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiB2b3RlX2FmdGVyX2lmX2Vsc2VANjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MzI5CiAgICAvLyBlbnN1cmUoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA8IHRoaXMudm90aW5nRW5kLnZhbHVlLCBlcnJHR292Vm90aW5nRW5kZWQpCiAgICBwdXNoYnl0ZXMgIkVSUjpHUF9FTiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgp2b3RlX2FmdGVyX2lmX2Vsc2VANjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjMzNAogICAgLy8gbGV0IGlzRGVsZWdhdGVkID0gZmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjMzNQogICAgLy8gaWYgKFR4bi5zZW5kZXIgIT09IHZvdGVyQWNjb3VudCkgewogICAgdHhuIFNlbmRlcgogICAgZGlnIDcKICAgICE9CiAgICBieiB2b3RlX2FmdGVyX2lmX2Vsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MzM2LTMzOQogICAgLy8gY29uc3QgZXhwZWN0ZWREZWxlZ2F0ZWUgPSBjb21waWxlQXJjNChHR292UmVnaXN0cnlDb250cmFjdCkuY2FsbC5nZXREZWxlZ2F0ZSh7CiAgICAvLyAgIGFwcElkOiBBcHBsaWNhdGlvbih0aGlzLnJlZ2lzdHJ5QXBwLnZhbHVlKSwKICAgIC8vICAgYXJnczogW3ZvdGVyQWNjb3VudF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czozMzcKICAgIC8vIGFwcElkOiBBcHBsaWNhdGlvbih0aGlzLnJlZ2lzdHJ5QXBwLnZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjYzCiAgICAvLyByZWdpc3RyeUFwcCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSkKICAgIGJ5dGVjXzIgLy8gInJlZ2lzdHJ5QXBwIgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czozMzcKICAgIC8vIGFwcElkOiBBcHBsaWNhdGlvbih0aGlzLnJlZ2lzdHJ5QXBwLnZhbHVlKSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjMzNi0zMzkKICAgIC8vIGNvbnN0IGV4cGVjdGVkRGVsZWdhdGVlID0gY29tcGlsZUFyYzQoR0dvdlJlZ2lzdHJ5Q29udHJhY3QpLmNhbGwuZ2V0RGVsZWdhdGUoewogICAgLy8gICBhcHBJZDogQXBwbGljYXRpb24odGhpcy5yZWdpc3RyeUFwcC52YWx1ZSksCiAgICAvLyAgIGFyZ3M6IFt2b3RlckFjY291bnRdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGJ5dGVjIDIyIC8vIG1ldGhvZCAiZ2V0RGVsZWdhdGUoYWRkcmVzcylhZGRyZXNzIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA3CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czozNDAKICAgIC8vIGVuc3VyZShleHBlY3RlZERlbGVnYXRlZSA9PT0gVHhuLnNlbmRlciwgZXJyR0dvdk5vRGVsZWdhdGlvbikKICAgIHR4biBTZW5kZXIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiB2b3RlX2FmdGVyX2lmX2Vsc2VANTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MzQwCiAgICAvLyBlbnN1cmUoZXhwZWN0ZWREZWxlZ2F0ZWUgPT09IFR4bi5zZW5kZXIsIGVyckdHb3ZOb0RlbGVnYXRpb24pCiAgICBwdXNoYnl0ZXMgIkVSUjpHRF9OWCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgp2b3RlX2FmdGVyX2lmX2Vsc2VANTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjM0NAogICAgLy8gZW5zdXJlKFR4bi5udW1BY2NvdW50cyA+IDAgJiYgVHhuLmFjY291bnRzKDEpID09PSB2b3RlckFjY291bnQsIGVyckdHb3ZEZWxlZ2F0aW9uTm9BY2N0UmVmKQogICAgdHhuIE51bUFjY291bnRzCiAgICBieiB2b3RlX2Jvb2xfZmFsc2VAMTAKICAgIGludGNfMiAvLyAxCiAgICB0eG5hcyBBY2NvdW50cwogICAgZGlnIDcKICAgID09CiAgICBieiB2b3RlX2Jvb2xfZmFsc2VAMTAKICAgIGludGNfMiAvLyAxCgp2b3RlX2Jvb2xfbWVyZ2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiB2b3RlX2FmdGVyX2lmX2Vsc2VANDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MzQ0CiAgICAvLyBlbnN1cmUoVHhuLm51bUFjY291bnRzID4gMCAmJiBUeG4uYWNjb3VudHMoMSkgPT09IHZvdGVyQWNjb3VudCwgZXJyR0dvdkRlbGVnYXRpb25Ob0FjY3RSZWYpCiAgICBwdXNoYnl0ZXMgIkVSUjpHRF9OUiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgp2b3RlX2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjM0NQogICAgLy8gaXNEZWxlZ2F0ZWQgPSB0cnVlCiAgICBpbnRjXzIgLy8gMQogICAgYnVyeSAxNAoKdm90ZV9hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czozNDktMzUyCiAgICAvLyBjb25zdCB2b3RpbmdQb3dlciA9IGNvbXBpbGVBcmM0KEdHb3ZSZWdpc3RyeUNvbnRyYWN0KS5jYWxsLmdldFhHb3ZWb3RpbmdQb3dlcih7CiAgICAvLyAgIGFwcElkOiBBcHBsaWNhdGlvbih0aGlzLnJlZ2lzdHJ5QXBwLnZhbHVlKSwKICAgIC8vICAgYXJnczogW3RoaXMuY29tbWl0dGVlSWQudmFsdWUsIHZvdGVyQWNjb3VudF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czozNTAKICAgIC8vIGFwcElkOiBBcHBsaWNhdGlvbih0aGlzLnJlZ2lzdHJ5QXBwLnZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjYzCiAgICAvLyByZWdpc3RyeUFwcCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSkKICAgIGJ5dGVjXzIgLy8gInJlZ2lzdHJ5QXBwIgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czozNTAKICAgIC8vIGFwcElkOiBBcHBsaWNhdGlvbih0aGlzLnJlZ2lzdHJ5QXBwLnZhbHVlKSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjM1MQogICAgLy8gYXJnczogW3RoaXMuY29tbWl0dGVlSWQudmFsdWUsIHZvdGVyQWNjb3VudF0sCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo3MwogICAgLy8gY29tbWl0dGVlSWQgPSBHbG9iYWxTdGF0ZTxDb21taXR0ZWVJZD4oKQogICAgYnl0ZWMgMTIgLy8gImNvbW1pdHRlZUlkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czozNTEKICAgIC8vIGFyZ3M6IFt0aGlzLmNvbW1pdHRlZUlkLnZhbHVlLCB2b3RlckFjY291bnRdLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MzQ5LTM1MgogICAgLy8gY29uc3Qgdm90aW5nUG93ZXIgPSBjb21waWxlQXJjNChHR292UmVnaXN0cnlDb250cmFjdCkuY2FsbC5nZXRYR292Vm90aW5nUG93ZXIoewogICAgLy8gICBhcHBJZDogQXBwbGljYXRpb24odGhpcy5yZWdpc3RyeUFwcC52YWx1ZSksCiAgICAvLyAgIGFyZ3M6IFt0aGlzLmNvbW1pdHRlZUlkLnZhbHVlLCB2b3RlckFjY291bnRdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIHB1c2hieXRlcyAweGNhMjg0OTAzIC8vIG1ldGhvZCAiZ2V0WEdvdlZvdGluZ1Bvd2VyKGJ5dGVbMzJdLGFkZHJlc3MpdWludDMyIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMjEKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgbGVuCiAgICBpbnRjXzMgLy8gNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50MzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6ODIKICAgIC8vIHRvcGljVm90ZXNBcnIgPSBCb3g8R0dvdlRvcGljVm90ZXNbXT4oeyBrZXk6ICd0JyB9KQogICAgYnl0ZWNfMCAvLyAidCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MzU1CiAgICAvLyBjb25zdCBnbG9iYWxWb3Rlc0FyciA9IGNsb25lKHRoaXMudG9waWNWb3Rlc0Fyci52YWx1ZSkKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ1cnkgMjUKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjgyCiAgICAvLyB0b3BpY1ZvdGVzQXJyID0gQm94PEdHb3ZUb3BpY1ZvdGVzW10+KHsga2V5OiAndCcgfSkKICAgIGJ5dGVjXzAgLy8gInQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjM1NS0zNTYKICAgIC8vIGNvbnN0IGdsb2JhbFZvdGVzQXJyID0gY2xvbmUodGhpcy50b3BpY1ZvdGVzQXJyLnZhbHVlKQogICAgLy8gZW5zdXJlKG5ld1RvcGljVm90ZXMubGVuZ3RoID09PSBnbG9iYWxWb3Rlc0Fyci5sZW5ndGgsIGVyckdHb3ZWb3RlTWlzbWF0Y2gpCiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjM1NgogICAgLy8gZW5zdXJlKG5ld1RvcGljVm90ZXMubGVuZ3RoID09PSBnbG9iYWxWb3Rlc0Fyci5sZW5ndGgsIGVyckdHb3ZWb3RlTWlzbWF0Y2gpCiAgICBkaWcgNQogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IHZvdGVfYWZ0ZXJfaWZfZWxzZUA0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czozNTYKICAgIC8vIGVuc3VyZShuZXdUb3BpY1ZvdGVzLmxlbmd0aCA9PT0gZ2xvYmFsVm90ZXNBcnIubGVuZ3RoLCBlcnJHR292Vm90ZU1pc21hdGNoKQogICAgYnl0ZWMgMjMgLy8gIkVSUjpHVl9NTSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgp2b3RlX2FmdGVyX2lmX2Vsc2VANDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjg4CiAgICAvLyB2b3RlUmVjb3JkcyA9IEJveE1hcDxBY2NvdW50LCBHR292Vm90ZVJlY29yZD4oeyBrZXlQcmVmaXg6ICd2JyB9KQogICAgYnl0ZWMgMTMgLy8gInYiCiAgICBkaWcgNwogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMjEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MzYxCiAgICAvLyBpZiAodm90ZVJlY29yZEJveC5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogdm90ZV9hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjM2MwogICAgLy8gaWYgKGlzRGVsZWdhdGVkICYmICFleGlzdGluZ1JlY29yZC5pc0RlbGVnYXRlZCkgewogICAgZGlnIDEzCiAgICBieiB2b3RlX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MzYyLTM2MwogICAgLy8gY29uc3QgZXhpc3RpbmdSZWNvcmQgPSBjbG9uZSh2b3RlUmVjb3JkQm94LnZhbHVlKQogICAgLy8gaWYgKGlzRGVsZWdhdGVkICYmICFleGlzdGluZ1JlY29yZC5pc0RlbGVnYXRlZCkgewogICAgZGlnIDE5CiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18yIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjM2MwogICAgLy8gaWYgKGlzRGVsZWdhdGVkICYmICFleGlzdGluZ1JlY29yZC5pc0RlbGVnYXRlZCkgewogICAgYm56IHZvdGVfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czozNjQKICAgIC8vIGxvZyhlcnJHR292Q2Fubm90T3ZlcnJpZGUpCiAgICBwdXNoYnl0ZXMgIkVSUjpHVl9PRCIKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czozNjUKICAgIC8vIGVycigpCiAgICBlcnIKCnZvdGVfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MzY3CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgZXhpc3RpbmdSZWNvcmQudG9waWNWb3Rlcy5sZW5ndGg7IGkrKykgewogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTUKCnZvdGVfd2hpbGVfdG9wQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czozNjcKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBleGlzdGluZ1JlY29yZC50b3BpY1ZvdGVzLmxlbmd0aDsgaSsrKSB7CiAgICBkaWcgMTkKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAxNQogICAgPgogICAgYnogdm90ZV9hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjM3MAogICAgLy8gY29uc3Qgc3VidHJhY3RlZFZvdGVzOiBVaW50MzJbXSA9IFtdCiAgICBieXRlYyA1IC8vIDB4MDAwMAogICAgYnVyeSAyMgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czozNzEKICAgIC8vIGZvciAobGV0IGo6IHVpbnQ2NCA9IDA7IGogPCBvbGRUb3BpY1ZvdGVzLmxlbmd0aDsgaisrKSB7CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMQoKdm90ZV93aGlsZV90b3BAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjM3MQogICAgLy8gZm9yIChsZXQgajogdWludDY0ID0gMDsgaiA8IG9sZFRvcGljVm90ZXMubGVuZ3RoOyBqKyspIHsKICAgIGRpZyAxOQogICAgZHVwCiAgICBwdXNoaW50IDMgLy8gMwogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMTYKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICA8CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18xIC8vIDIKICAgICoKICAgIHB1c2hpbnQgNSAvLyA1CiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTgKICAgIGRpZyAxCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIHB1c2hpbnQgNSAvLyA1CiAgICArCiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAxMQogICAgPgogICAgYnogdm90ZV9hZnRlcl93aGlsZUAyMgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czozNzIKICAgIC8vIHN1YnRyYWN0ZWRWb3Rlcy5wdXNoKHUzMihjdXJyZW50Vm90ZXNbal0uYXNVaW50NjQoKSAtIG9sZFRvcGljVm90ZXNbal0uYXNVaW50NjQoKSkpCiAgICBkaWcgMjMKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkaWcgMTYKICAgIGR1cAogICAgaW50Y18xIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMiAvLyAxCiAgICArCiAgICB1bmNvdmVyIDMKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDQKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzEgLy8gMgogICAgKgogICAgZGlnIDUKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gNAogICAgKgogICAgc3dhcAogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDMyCiAgICBkaWcgMjMKICAgIGR1cAogICAgcHVzaGludCAzIC8vIDMKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgdW5jb3ZlciA1CiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBkaWcgMjAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgcHVzaGludCA1IC8vIDUKICAgICsKICAgIGR1cDIKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDUKICAgID4KICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgdW5jb3ZlciAzCiAgICArCiAgICBpbnRjXzMgLy8gNAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC0KICAgIGNhbGxzdWIgdTMyCiAgICBkaWcgMjMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjM3MQogICAgLy8gZm9yIChsZXQgajogdWludDY0ID0gMDsgaiA8IG9sZFRvcGljVm90ZXMubGVuZ3RoOyBqKyspIHsKICAgIGludGNfMiAvLyAxCiAgICArCiAgICBidXJ5IDExCiAgICBiIHZvdGVfd2hpbGVfdG9wQDIwCgp2b3RlX2FmdGVyX3doaWxlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czozNzQKICAgIC8vIGdsb2JhbFZvdGVzQXJyW2ldID0geyB2b3RlczogY2xvbmUoc3VidHJhY3RlZFZvdGVzKSB9CiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgZGlnIDIyCiAgICBjb25jYXQKICAgIGRpZyAyNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDE3CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgMjUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MzY3CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgZXhpc3RpbmdSZWNvcmQudG9waWNWb3Rlcy5sZW5ndGg7IGkrKykgewogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGJ1cnkgMTUKICAgIGIgdm90ZV93aGlsZV90b3BAMTgKCnZvdGVfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6Mzc5CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgbmV3VG9waWNWb3Rlcy5sZW5ndGg7IGkrKykgewogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTMKCnZvdGVfd2hpbGVfdG9wQDI1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czozNzkKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBuZXdUb3BpY1ZvdGVzLmxlbmd0aDsgaSsrKSB7CiAgICBkaWcgMTIKICAgIGRpZyA1CiAgICA8CiAgICBkdXAKICAgIGJ1cnkgMTAKICAgIGJ6IHZvdGVfYWZ0ZXJfd2hpbGVAMzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MzgwCiAgICAvLyBjb25zdCB0b3BpY1ZvdGUgPSBjbG9uZShuZXdUb3BpY1ZvdGVzW2ldKQogICAgZGlnIDgKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDEyCiAgICBkdXAKICAgIGludGNfMSAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBkaWcgMQogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMyAvLyA0CiAgICAqCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBidXJ5IDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjM4MQogICAgLy8gZW5zdXJlKHRvcGljVm90ZS5sZW5ndGggPT09IGdsb2JhbFZvdGVzQXJyW2ldLnZvdGVzLmxlbmd0aCwgZXJyR0dvdlZvdGVNaXNtYXRjaCkKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJ1cnkgMjEKICAgIGRpZyAyNgogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAyMgogICAgZHVwCiAgICB1bmNvdmVyIDMKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDMKICAgIGludGNfMiAvLyAxCiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTcKICAgIHVuY292ZXIgMwogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgIGludGNfMSAvLyAyCiAgICAqCiAgICBkaWcgNAogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBidXJ5IDI3CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IHZvdGVfYWZ0ZXJfaWZfZWxzZUAzOQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czozODEKICAgIC8vIGVuc3VyZSh0b3BpY1ZvdGUubGVuZ3RoID09PSBnbG9iYWxWb3Rlc0FycltpXS52b3Rlcy5sZW5ndGgsIGVyckdHb3ZWb3RlTWlzbWF0Y2gpCiAgICBieXRlYyAyMyAvLyAiRVJSOkdWX01NIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnZvdGVfYWZ0ZXJfaWZfZWxzZUAzOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MzgyCiAgICAvLyBsZXQgdm90ZVN1bTogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czozODQKICAgIC8vIGNvbnN0IG5leHRHbG9iYWxWb3RlczogVWludDMyW10gPSBbXQogICAgYnl0ZWMgNSAvLyAweDAwMDAKICAgIGJ1cnkgMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6Mzg1CiAgICAvLyBmb3IgKGxldCBqOiB1aW50NjQgPSAwOyBqIDwgdG9waWNWb3RlLmxlbmd0aDsgaisrKSB7CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMAoKdm90ZV93aGlsZV90b3BAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjM4NQogICAgLy8gZm9yIChsZXQgajogdWludDY0ID0gMDsgaiA8IHRvcGljVm90ZS5sZW5ndGg7IGorKykgewogICAgZGlnIDkKICAgIGRpZyAxOAogICAgPAogICAgYnogdm90ZV9hZnRlcl93aGlsZUAyOQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czozODYKICAgIC8vIG5leHRHbG9iYWxWb3Rlcy5wdXNoKHUzMihjdXJyZW50R2xvYmFsVm90ZXNbal0uYXNVaW50NjQoKSArIHRvcGljVm90ZVtqXS5hc1VpbnQ2NCgpKSkKICAgIGRpZyAyNAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gNAogICAgKgogICAgc3dhcAogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDMyCiAgICBkaWcgMjMKICAgIGV4dHJhY3QgMiAwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3RfdWludDMyCiAgICBzd2FwCiAgICBkaWcgMQogICAgKwogICAgY2FsbHN1YiB1MzIKICAgIGRpZyAyNQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMjUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6Mzg3CiAgICAvLyB2b3RlU3VtICs9IHRvcGljVm90ZVtqXS5hc1VpbnQ2NCgpCiAgICBkaWcgOQogICAgKwogICAgYnVyeSA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjM4NQogICAgLy8gZm9yIChsZXQgajogdWludDY0ID0gMDsgaiA8IHRvcGljVm90ZS5sZW5ndGg7IGorKykgewogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGJ1cnkgMTAKICAgIGIgdm90ZV93aGlsZV90b3BAMjcKCnZvdGVfYWZ0ZXJfd2hpbGVAMjk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjM4OQogICAgLy8gZW5zdXJlKHZvdGVTdW0gPT09IHZvdGluZ1Bvd2VyLmFzVWludDY0KCksIGVyckdHb3ZWb3RlUG93ZXJNaXNtYXRjaCkKICAgIGRpZyAxOAogICAgYnRvaQogICAgZGlnIDgKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiB2b3RlX2FmdGVyX2lmX2Vsc2VAMzUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6Mzg5CiAgICAvLyBlbnN1cmUodm90ZVN1bSA9PT0gdm90aW5nUG93ZXIuYXNVaW50NjQoKSwgZXJyR0dvdlZvdGVQb3dlck1pc21hdGNoKQogICAgcHVzaGJ5dGVzICJFUlI6R1ZfVlAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKdm90ZV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czozOTAKICAgIC8vIGdsb2JhbFZvdGVzQXJyW2ldID0geyB2b3RlczogY2xvbmUobmV4dEdsb2JhbFZvdGVzKSB9CiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgZGlnIDIzCiAgICBjb25jYXQKICAgIGRpZyAxMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMTkKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDI1CiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgYnVyeSAyNAogICAgZGlnIDExCiAgICBidXJ5IDEzCiAgICBiIHZvdGVfd2hpbGVfdG9wQDI1Cgp2b3RlX2FmdGVyX3doaWxlQDMwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czozOTYKICAgIC8vIHNlbmRlcjogVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6Mzk3CiAgICAvLyB1cGRhdGVWb3RlOiB2b3RlUmVjb3JkQm94LmV4aXN0cywKICAgIGRpZyAyMAogICAgYm94X2xlbgogICAgY292ZXIgMgogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjM5OAogICAgLy8gdm90aW5nUG93ZXI6IHZvdGluZ1Bvd2VyLmFzVWludDY0KCksCiAgICBkaWcgMjAKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6Mzk0LTQwMAogICAgLy8gZW1pdDxHR292Vm90ZUNhc3Q+KHsKICAgIC8vICAgdm90ZXI6IHZvdGVyQWNjb3VudCwKICAgIC8vICAgc2VuZGVyOiBUeG4uc2VuZGVyLAogICAgLy8gICB1cGRhdGVWb3RlOiB2b3RlUmVjb3JkQm94LmV4aXN0cywKICAgIC8vICAgdm90aW5nUG93ZXI6IHZvdGluZ1Bvd2VyLmFzVWludDY0KCksCiAgICAvLyAgIHRvcGljVm90ZXM6IGNsb25lKG5ld1RvcGljVm90ZXMpLAogICAgLy8gfSkKICAgIGRpZyA5CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgYnl0ZWMgMTQgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDA0YgogICAgY29uY2F0CiAgICBkaWcgNgogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHg1OGQxOGJjOCAvLyBtZXRob2QgIkdHb3ZWb3RlQ2FzdChhZGRyZXNzLGFkZHJlc3MsYm9vbCx1aW50NjQsdWludDMyW11bXSkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo0MDMKICAgIC8vIGlmICh0aGlzLmZpcnN0Vm90aW5nUm91bmQudmFsdWUgPT09IDApIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjc1CiAgICAvLyBmaXJzdFZvdGluZ1JvdW5kID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KQogICAgYnl0ZWMgMTUgLy8gImZpcnN0Vm90aW5nUm91bmQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjQwMwogICAgLy8gaWYgKHRoaXMuZmlyc3RWb3RpbmdSb3VuZC52YWx1ZSA9PT0gMCkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJueiB2b3RlX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NzUKICAgIC8vIGZpcnN0Vm90aW5nUm91bmQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pCiAgICBieXRlYyAxNSAvLyAiZmlyc3RWb3RpbmdSb3VuZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDA0CiAgICAvLyB0aGlzLmZpcnN0Vm90aW5nUm91bmQudmFsdWUgPSBHbG9iYWwucm91bmQKICAgIGdsb2JhbCBSb3VuZAogICAgYXBwX2dsb2JhbF9wdXQKCnZvdGVfYWZ0ZXJfaWZfZWxzZUAzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NzcKICAgIC8vIGxhc3RWb3RpbmdSb3VuZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSkKICAgIGJ5dGVjIDE4IC8vICJsYXN0Vm90aW5nUm91bmQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjQwNgogICAgLy8gdGhpcy5sYXN0Vm90aW5nUm91bmQudmFsdWUgPSBHbG9iYWwucm91bmQKICAgIGdsb2JhbCBSb3VuZAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6ODIKICAgIC8vIHRvcGljVm90ZXNBcnIgPSBCb3g8R0dvdlRvcGljVm90ZXNbXT4oeyBrZXk6ICd0JyB9KQogICAgYnl0ZWNfMCAvLyAidCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDA4CiAgICAvLyB0aGlzLnRvcGljVm90ZXNBcnIudmFsdWUgPSBjbG9uZShnbG9iYWxWb3Rlc0FycikKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo4MgogICAgLy8gdG9waWNWb3Rlc0FyciA9IEJveDxHR292VG9waWNWb3Rlc1tdPih7IGtleTogJ3QnIH0pCiAgICBieXRlY18wIC8vICJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo0MDgKICAgIC8vIHRoaXMudG9waWNWb3Rlc0Fyci52YWx1ZSA9IGNsb25lKGdsb2JhbFZvdGVzQXJyKQogICAgZGlnIDI0CiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjQwOS00MTIKICAgIC8vIHZvdGVSZWNvcmRCb3gudmFsdWUgPSB7CiAgICAvLyAgIGlzRGVsZWdhdGVkOiBpc0RlbGVnYXRlZCwKICAgIC8vICAgdG9waWNWb3RlczogY2xvbmUobmV3VG9waWNWb3RlcyksCiAgICAvLyB9CiAgICBieXRlYyAxNCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgZGlnIDE1CiAgICBzZXRiaXQKICAgIHB1c2hieXRlcyAweDAwMDMKICAgIGNvbmNhdAogICAgZGlnIDYKICAgIGNvbmNhdAogICAgZGlnIDIwCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czozMjYKICAgIC8vIHB1YmxpYyB2b3RlKHZvdGVyQWNjb3VudDogQWNjb3VudCwgdG9waWNWb3RlczogVWludDMyW11bXSk6IHZvaWQgewogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKdm90ZV9ib29sX2ZhbHNlQDEwOgogICAgaW50Y18wIC8vIDAKICAgIGIgdm90ZV9ib29sX21lcmdlQDExCgoKLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo6R0dvdlBlcmlvZENvbnRyYWN0LmNhblZvdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjYW5Wb3RlOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMyAvLyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo0MTYKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo0MTgKICAgIC8vIGlmICghdGhpcy5yZWFkeS52YWx1ZSkgcmV0dXJuIFtmYWxzZSwgMF0KICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjcxCiAgICAvLyByZWFkeSA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiBmYWxzZSB9KQogICAgYnl0ZWMgMTEgLy8gInJlYWR5IgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo0MTgKICAgIC8vIGlmICghdGhpcy5yZWFkeS52YWx1ZSkgcmV0dXJuIFtmYWxzZSwgMF0KICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBibnogY2FuVm90ZV9hZnRlcl9pZl9lbHNlQDMKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwCgpjYW5Wb3RlX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo6R0dvdlBlcmlvZENvbnRyYWN0LmNhblZvdGVAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjQxNgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgpjYW5Wb3RlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDE5CiAgICAvLyBpZiAoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA8IHRoaXMudm90aW5nU3RhcnQudmFsdWUpIHJldHVybiBbZmFsc2UsIDBdCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo2NwogICAgLy8gdm90aW5nU3RhcnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCkKICAgIGJ5dGVjIDggLy8gInZvdGluZ1N0YXJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo0MTkKICAgIC8vIGlmIChHbG9iYWwubGF0ZXN0VGltZXN0YW1wIDwgdGhpcy52b3RpbmdTdGFydC52YWx1ZSkgcmV0dXJuIFtmYWxzZSwgMF0KICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA8CiAgICBieiBjYW5Wb3RlX2FmdGVyX2lmX2Vsc2VANQogICAgYnl0ZWMgMTAgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDE2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGIgY2FuVm90ZV9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6OkdHb3ZQZXJpb2RDb250cmFjdC5jYW5Wb3RlQDIxCgpjYW5Wb3RlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDIwCiAgICAvLyBpZiAoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA+PSB0aGlzLnZvdGluZ0VuZC52YWx1ZSkgcmV0dXJuIFtmYWxzZSwgMF0KICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjY5CiAgICAvLyB2b3RpbmdFbmQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCkKICAgIGJ5dGVjIDkgLy8gInZvdGluZ0VuZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDIwCiAgICAvLyBpZiAoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA+PSB0aGlzLnZvdGluZ0VuZC52YWx1ZSkgcmV0dXJuIFtmYWxzZSwgMF0KICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA+PQogICAgYnogY2FuVm90ZV9hZnRlcl9pZl9lbHNlQDcKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjQxNgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBiIGNhblZvdGVfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjpHR292UGVyaW9kQ29udHJhY3QuY2FuVm90ZUAyMQoKY2FuVm90ZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjQyMgogICAgLy8gaWYgKHNlbmRlckFjY291bnQgIT09IHZvdGVyQWNjb3VudCkgewogICAgZHVwCiAgICBkaWcgMgogICAgIT0KICAgIGJ6IGNhblZvdGVfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo0MjMtNDI2CiAgICAvLyBjb25zdCBkZWxlZ2F0ZSA9IGNvbXBpbGVBcmM0KEdHb3ZSZWdpc3RyeUNvbnRyYWN0KS5jYWxsLmdldERlbGVnYXRlKHsKICAgIC8vICAgYXBwSWQ6IEFwcGxpY2F0aW9uKHRoaXMucmVnaXN0cnlBcHAudmFsdWUpLAogICAgLy8gICBhcmdzOiBbdm90ZXJBY2NvdW50XSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjQyNAogICAgLy8gYXBwSWQ6IEFwcGxpY2F0aW9uKHRoaXMucmVnaXN0cnlBcHAudmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NjMKICAgIC8vIHJlZ2lzdHJ5QXBwID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KQogICAgYnl0ZWNfMiAvLyAicmVnaXN0cnlBcHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjQyNAogICAgLy8gYXBwSWQ6IEFwcGxpY2F0aW9uKHRoaXMucmVnaXN0cnlBcHAudmFsdWUpLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDIzLTQyNgogICAgLy8gY29uc3QgZGVsZWdhdGUgPSBjb21waWxlQXJjNChHR292UmVnaXN0cnlDb250cmFjdCkuY2FsbC5nZXREZWxlZ2F0ZSh7CiAgICAvLyAgIGFwcElkOiBBcHBsaWNhdGlvbih0aGlzLnJlZ2lzdHJ5QXBwLnZhbHVlKSwKICAgIC8vICAgYXJnczogW3ZvdGVyQWNjb3VudF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgYnl0ZWMgMjIgLy8gbWV0aG9kICJnZXREZWxlZ2F0ZShhZGRyZXNzKWFkZHJlc3MiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDcKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo0MjcKICAgIC8vIGlmIChkZWxlZ2F0ZSA9PT0gR2xvYmFsLnplcm9BZGRyZXNzKSByZXR1cm4gW2ZhbHNlLCAwXQogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYnogY2FuVm90ZV9hZnRlcl9pZl9lbHNlQDExCiAgICBieXRlYyAxMCAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo0MTYKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYiBjYW5Wb3RlX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo6R0dvdlBlcmlvZENvbnRyYWN0LmNhblZvdGVAMjEKCmNhblZvdGVfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDI4CiAgICAvLyBpZiAoZGVsZWdhdGUgIT09IHNlbmRlckFjY291bnQpIHJldHVybiBbZmFsc2UsIDBdCiAgICBkaWcgNAogICAgZGlnIDEKICAgICE9CiAgICBieiBjYW5Wb3RlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjQxNgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBiIGNhblZvdGVfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjpHR292UGVyaW9kQ29udHJhY3QuY2FuVm90ZUAyMQoKY2FuVm90ZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo4OAogICAgLy8gdm90ZVJlY29yZHMgPSBCb3hNYXA8QWNjb3VudCwgR0dvdlZvdGVSZWNvcmQ+KHsga2V5UHJlZml4OiAndicgfSkKICAgIGJ5dGVjIDEzIC8vICJ2IgogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDMzCiAgICAvLyBpZiAocmVjb3JkQm94LmV4aXN0cyAmJiAhcmVjb3JkQm94LnZhbHVlLmlzRGVsZWdhdGVkKSByZXR1cm4gW2ZhbHNlLCAwXQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBjYW5Wb3RlX2FmdGVyX2lmX2Vsc2VAMTcKICAgIGRpZyAzCiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18yIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBibnogY2FuVm90ZV9hZnRlcl9pZl9lbHNlQDE3CiAgICBieXRlYyAxMCAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo0MTYKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYiBjYW5Wb3RlX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo6R0dvdlBlcmlvZENvbnRyYWN0LmNhblZvdGVAMjEKCmNhblZvdGVfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDM2LTQzOQogICAgLy8gY29uc3QgcG93ZXIgPSBjb21waWxlQXJjNChHR292UmVnaXN0cnlDb250cmFjdCkuY2FsbC50cnlHZXRYR292Vm90aW5nUG93ZXIoewogICAgLy8gICBhcHBJZDogQXBwbGljYXRpb24odGhpcy5yZWdpc3RyeUFwcC52YWx1ZSksCiAgICAvLyAgIGFyZ3M6IFt0aGlzLmNvbW1pdHRlZUlkLnZhbHVlLCB2b3RlckFjY291bnRdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDM3CiAgICAvLyBhcHBJZDogQXBwbGljYXRpb24odGhpcy5yZWdpc3RyeUFwcC52YWx1ZSksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo2MwogICAgLy8gcmVnaXN0cnlBcHAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pCiAgICBieXRlY18yIC8vICJyZWdpc3RyeUFwcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDM3CiAgICAvLyBhcHBJZDogQXBwbGljYXRpb24odGhpcy5yZWdpc3RyeUFwcC52YWx1ZSksCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo0MzgKICAgIC8vIGFyZ3M6IFt0aGlzLmNvbW1pdHRlZUlkLnZhbHVlLCB2b3RlckFjY291bnRdLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NzMKICAgIC8vIGNvbW1pdHRlZUlkID0gR2xvYmFsU3RhdGU8Q29tbWl0dGVlSWQ+KCkKICAgIGJ5dGVjIDEyIC8vICJjb21taXR0ZWVJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDM4CiAgICAvLyBhcmdzOiBbdGhpcy5jb21taXR0ZWVJZC52YWx1ZSwgdm90ZXJBY2NvdW50XSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjQzNi00MzkKICAgIC8vIGNvbnN0IHBvd2VyID0gY29tcGlsZUFyYzQoR0dvdlJlZ2lzdHJ5Q29udHJhY3QpLmNhbGwudHJ5R2V0WEdvdlZvdGluZ1Bvd2VyKHsKICAgIC8vICAgYXBwSWQ6IEFwcGxpY2F0aW9uKHRoaXMucmVnaXN0cnlBcHAudmFsdWUpLAogICAgLy8gICBhcmdzOiBbdGhpcy5jb21taXR0ZWVJZC52YWx1ZSwgdm90ZXJBY2NvdW50XSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBwdXNoYnl0ZXMgMHg2ZjMxOTY3YSAvLyBtZXRob2QgInRyeUdldFhHb3ZWb3RpbmdQb3dlcihieXRlWzMyXSxhZGRyZXNzKXVpbnQzMiIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjQ0MAogICAgLy8gaWYgKHBvd2VyLmFzVWludDY0KCkgPT09IDApIHJldHVybiBbZmFsc2UsIDBdCiAgICBidG9pCiAgICBkdXAKICAgIGJ1cnkgNAogICAgYm56IGNhblZvdGVfYWZ0ZXJfaWZfZWxzZUAyMAogICAgYnl0ZWMgMTAgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDE2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGIgY2FuVm90ZV9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6OkdHb3ZQZXJpb2RDb250cmFjdC5jYW5Wb3RlQDIxCgpjYW5Wb3RlX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjQ0MQogICAgLy8gcmV0dXJuIFt0cnVlLCBwb3dlci5hc1VpbnQ2NCgpXQogICAgZGlnIDIKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDgwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDE2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGIgY2FuVm90ZV9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6OkdHb3ZQZXJpb2RDb250cmFjdC5jYW5Wb3RlQDIxCgoKLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo6R0dvdlBlcmlvZENvbnRyYWN0LmdldFBlcmlvZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldFBlcmlvZDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDIKICAgIGJ5dGVjXzMgLy8gIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDQ4CiAgICAvLyBpZiAodGhpcy5yZWdpc3RyeUFwcC52YWx1ZSA9PT0gMCkgcmV0dXJuIGdldEVtcHR5R0dvdlBlcmlvZCgpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo2MwogICAgLy8gcmVnaXN0cnlBcHAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pCiAgICBieXRlY18yIC8vICJyZWdpc3RyeUFwcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDQ4CiAgICAvLyBpZiAodGhpcy5yZWdpc3RyeUFwcC52YWx1ZSA9PT0gMCkgcmV0dXJuIGdldEVtcHR5R0dvdlBlcmlvZCgpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYm56IGdldFBlcmlvZF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3R5cGVzLmFsZ28udHM6MjIwCiAgICAvLyB2b3RpbmdTdGFydDogdTMyKDApLAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgdTMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS90eXBlcy5hbGdvLnRzOjIyMQogICAgLy8gdm90aW5nRW5kOiB1MzIoMCksCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiB1MzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3R5cGVzLmFsZ28udHM6MjE5CiAgICAvLyBjb21taXR0ZWVJZDogbmV3IFN0YXRpY0J5dGVzPDMyPigpLAogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdHlwZXMuYWxnby50czoyMTgtMjIzCiAgICAvLyByZXR1cm4gewogICAgLy8gICBjb21taXR0ZWVJZDogbmV3IFN0YXRpY0J5dGVzPDMyPigpLAogICAgLy8gICB2b3RpbmdTdGFydDogdTMyKDApLAogICAgLy8gICB2b3RpbmdFbmQ6IHUzMigwKSwKICAgIC8vICAgdG9waWNzOiBbXSBhcyBHR292VG9waWNbXSwKICAgIC8vIH0KICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMmEwMDAwCiAgICBjb25jYXQKCmdldFBlcmlvZF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6OkdHb3ZQZXJpb2RDb250cmFjdC5nZXRQZXJpb2RANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDQ2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCmdldFBlcmlvZF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjgwCiAgICAvLyB0b3BpY09wdGlvbnNBcnIgPSBCb3g8R0dvdlRvcGljT3B0aW9uc1tdPih7IGtleTogJ28nIH0pCiAgICBieXRlY18xIC8vICJvIgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo0NDkKICAgIC8vIGNvbnN0IG9wdGlvbnNBcnIgPSBjbG9uZSh0aGlzLnRvcGljT3B0aW9uc0Fyci52YWx1ZSkKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ1cnkgNQogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6ODIKICAgIC8vIHRvcGljVm90ZXNBcnIgPSBCb3g8R0dvdlRvcGljVm90ZXNbXT4oeyBrZXk6ICd0JyB9KQogICAgYnl0ZWNfMCAvLyAidCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDUwCiAgICAvLyBjb25zdCB2b3Rlc0FyciA9IGNsb25lKHRoaXMudG9waWNWb3Rlc0Fyci52YWx1ZSkKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ1cnkgMwogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDUxCiAgICAvLyBjb25zdCB0b3BpY3M6IEdHb3ZUb3BpY1tdID0gW10KICAgIGJ5dGVjIDUgLy8gMHgwMDAwCiAgICBidXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDUyCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgb3B0aW9uc0Fyci5sZW5ndGg7IGkrKykgewogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMQoKZ2V0UGVyaW9kX3doaWxlX3RvcEA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo4MAogICAgLy8gdG9waWNPcHRpb25zQXJyID0gQm94PEdHb3ZUb3BpY09wdGlvbnNbXT4oeyBrZXk6ICdvJyB9KQogICAgYnl0ZWNfMSAvLyAibyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDUyCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgb3B0aW9uc0Fyci5sZW5ndGg7IGkrKykgewogICAgaW50Y18wIC8vIDAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDEKICAgID4KICAgIGJ6IGdldFBlcmlvZF9hZnRlcl93aGlsZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjQ1MwogICAgLy8gdG9waWNzLnB1c2goeyBvcHRpb25zOiBjbG9uZShvcHRpb25zQXJyW2ldLm9wdGlvbnMpLCB2b3RlczogY2xvbmUodm90ZXNBcnJbaV0udm90ZXMpIH0pCiAgICBkaWcgMwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGRpZyAyCiAgICBkdXAKICAgIGludGNfMSAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGludGNfMiAvLyAxCiAgICArCiAgICBkdXAKICAgIGJ1cnkgNgogICAgdW5jb3ZlciAzCiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyA0CiAgICBsZW4KICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMgogICAgKgogICAgZGlnIDYKICAgIGRpZyAxCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICB1bmNvdmVyIDMKICAgIHNlbGVjdAogICAgdW5jb3ZlciA1CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGRpZyA1CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDEKICAgIHVuY292ZXIgNgogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIHVuY292ZXIgNQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAyCiAgICBsZW4KICAgIGRpZyAzCiAgICB1bmNvdmVyIDYKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWMgMjQgLy8gMHgwMDA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDYgLy8gMHgwMDAyCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgMwogICAgYiBnZXRQZXJpb2Rfd2hpbGVfdG9wQDQKCmdldFBlcmlvZF9hZnRlcl93aGlsZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo0NTYKICAgIC8vIGNvbW1pdHRlZUlkOiB0aGlzLmNvbW1pdHRlZUlkLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NzMKICAgIC8vIGNvbW1pdHRlZUlkID0gR2xvYmFsU3RhdGU8Q29tbWl0dGVlSWQ+KCkKICAgIGJ5dGVjIDEyIC8vICJjb21taXR0ZWVJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDU2CiAgICAvLyBjb21taXR0ZWVJZDogdGhpcy5jb21taXR0ZWVJZC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjQ1NwogICAgLy8gdm90aW5nU3RhcnQ6IHUzMih0aGlzLnZvdGluZ1N0YXJ0LnZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjY3CiAgICAvLyB2b3RpbmdTdGFydCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKQogICAgYnl0ZWMgOCAvLyAidm90aW5nU3RhcnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjQ1NwogICAgLy8gdm90aW5nU3RhcnQ6IHUzMih0aGlzLnZvdGluZ1N0YXJ0LnZhbHVlKSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBjYWxsc3ViIHUzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo0NTgKICAgIC8vIHZvdGluZ0VuZDogdTMyKHRoaXMudm90aW5nRW5kLnZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjY5CiAgICAvLyB2b3RpbmdFbmQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCkKICAgIGJ5dGVjIDkgLy8gInZvdGluZ0VuZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDU4CiAgICAvLyB2b3RpbmdFbmQ6IHUzMih0aGlzLnZvdGluZ0VuZC52YWx1ZSksCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgY2FsbHN1YiB1MzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDU1LTQ2MAogICAgLy8gcmV0dXJuIHsKICAgIC8vICAgY29tbWl0dGVlSWQ6IHRoaXMuY29tbWl0dGVlSWQudmFsdWUsCiAgICAvLyAgIHZvdGluZ1N0YXJ0OiB1MzIodGhpcy52b3RpbmdTdGFydC52YWx1ZSksCiAgICAvLyAgIHZvdGluZ0VuZDogdTMyKHRoaXMudm90aW5nRW5kLnZhbHVlKSwKICAgIC8vICAgdG9waWNzOiBjbG9uZSh0b3BpY3MpLAogICAgLy8gfQogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMmEKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo0NDYKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYiBnZXRQZXJpb2RfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjpHR292UGVyaW9kQ29udHJhY3QuZ2V0UGVyaW9kQDcKCgovLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjpHR292UGVyaW9kQ29udHJhY3QubG9nUGVyaW9kW3JvdXRpbmddKCkgLT4gdm9pZDoKbG9nUGVyaW9kOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMyAvLyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo0NzIKICAgIC8vIGlmICh0aGlzLnJlZ2lzdHJ5QXBwLnZhbHVlID09PSAwKSByZXR1cm4KICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjYzCiAgICAvLyByZWdpc3RyeUFwcCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSkKICAgIGJ5dGVjXzIgLy8gInJlZ2lzdHJ5QXBwIgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo0NzIKICAgIC8vIGlmICh0aGlzLnJlZ2lzdHJ5QXBwLnZhbHVlID09PSAwKSByZXR1cm4KICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieiBsb2dQZXJpb2RfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjpHR292UGVyaW9kQ29udHJhY3QubG9nUGVyaW9kQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6ODAKICAgIC8vIHRvcGljT3B0aW9uc0FyciA9IEJveDxHR292VG9waWNPcHRpb25zW10+KHsga2V5OiAnbycgfSkKICAgIGJ5dGVjXzEgLy8gIm8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjQ3MwogICAgLy8gY29uc3Qgb3B0aW9uc0FyciA9IGNsb25lKHRoaXMudG9waWNPcHRpb25zQXJyLnZhbHVlKQogICAgYm94X2dldAogICAgc3dhcAogICAgYnVyeSA0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo4MgogICAgLy8gdG9waWNWb3Rlc0FyciA9IEJveDxHR292VG9waWNWb3Rlc1tdPih7IGtleTogJ3QnIH0pCiAgICBieXRlY18wIC8vICJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo0NzQKICAgIC8vIGNvbnN0IHZvdGVzQXJyID0gY2xvbmUodGhpcy50b3BpY1ZvdGVzQXJyLnZhbHVlKQogICAgYm94X2dldAogICAgc3dhcAogICAgYnVyeSAzCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo0NzYKICAgIC8vIGNvbW1pdHRlZUlkOiB0aGlzLmNvbW1pdHRlZUlkLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NzMKICAgIC8vIGNvbW1pdHRlZUlkID0gR2xvYmFsU3RhdGU8Q29tbWl0dGVlSWQ+KCkKICAgIGJ5dGVjIDEyIC8vICJjb21taXR0ZWVJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDc2CiAgICAvLyBjb21taXR0ZWVJZDogdGhpcy5jb21taXR0ZWVJZC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjQ3NwogICAgLy8gdm90aW5nU3RhcnQ6IHUzMih0aGlzLnZvdGluZ1N0YXJ0LnZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjY3CiAgICAvLyB2b3RpbmdTdGFydCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKQogICAgYnl0ZWMgOCAvLyAidm90aW5nU3RhcnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjQ3NwogICAgLy8gdm90aW5nU3RhcnQ6IHUzMih0aGlzLnZvdGluZ1N0YXJ0LnZhbHVlKSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBjYWxsc3ViIHUzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo0NzgKICAgIC8vIHZvdGluZ0VuZDogdTMyKHRoaXMudm90aW5nRW5kLnZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjY5CiAgICAvLyB2b3RpbmdFbmQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCkKICAgIGJ5dGVjIDkgLy8gInZvdGluZ0VuZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDc4CiAgICAvLyB2b3RpbmdFbmQ6IHUzMih0aGlzLnZvdGluZ0VuZC52YWx1ZSksCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgY2FsbHN1YiB1MzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6ODAKICAgIC8vIHRvcGljT3B0aW9uc0FyciA9IEJveDxHR292VG9waWNPcHRpb25zW10+KHsga2V5OiAnbycgfSkKICAgIGJ5dGVjXzEgLy8gIm8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjQ3OQogICAgLy8gbnVtVG9waWNzOiB1MzIob3B0aW9uc0Fyci5sZW5ndGgpLAogICAgaW50Y18wIC8vIDAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgY2FsbHN1YiB1MzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDc1LTQ4MAogICAgLy8gY29uc3QgbWV0YTogR0dvdlBlcmlvZE1ldGEgPSB7CiAgICAvLyAgIGNvbW1pdHRlZUlkOiB0aGlzLmNvbW1pdHRlZUlkLnZhbHVlLAogICAgLy8gICB2b3RpbmdTdGFydDogdTMyKHRoaXMudm90aW5nU3RhcnQudmFsdWUpLAogICAgLy8gICB2b3RpbmdFbmQ6IHUzMih0aGlzLnZvdGluZ0VuZC52YWx1ZSksCiAgICAvLyAgIG51bVRvcGljczogdTMyKG9wdGlvbnNBcnIubGVuZ3RoKSwKICAgIC8vIH0KICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDgxCiAgICAvLyBsb2coZW5jb2RlQXJjNChtZXRhKSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo0ODIKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBvcHRpb25zQXJyLmxlbmd0aDsgaSsrKSB7CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxCgpsb2dQZXJpb2Rfd2hpbGVfdG9wQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjgwCiAgICAvLyB0b3BpY09wdGlvbnNBcnIgPSBCb3g8R0dvdlRvcGljT3B0aW9uc1tdPih7IGtleTogJ28nIH0pCiAgICBieXRlY18xIC8vICJvIgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo0ODIKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBvcHRpb25zQXJyLmxlbmd0aDsgaSsrKSB7CiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMQogICAgPgogICAgYnogbG9nUGVyaW9kX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo6R0dvdlBlcmlvZENvbnRyYWN0LmxvZ1BlcmlvZEA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjQ4MwogICAgLy8gY29uc3QgdG9waWM6IEdHb3ZUb3BpYyA9IHsgb3B0aW9uczogY2xvbmUob3B0aW9uc0FycltpXS5vcHRpb25zKSwgdm90ZXM6IGNsb25lKHZvdGVzQXJyW2ldLnZvdGVzKSB9CiAgICBkaWcgMgogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGRpZyAyCiAgICBkdXAKICAgIGludGNfMSAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGludGNfMiAvLyAxCiAgICArCiAgICBkdXAKICAgIGJ1cnkgNgogICAgdW5jb3ZlciAzCiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyA0CiAgICBsZW4KICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMgogICAgKgogICAgZGlnIDYKICAgIGRpZyAxCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICB1bmNvdmVyIDMKICAgIHNlbGVjdAogICAgdW5jb3ZlciA1CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGRpZyA1CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDEKICAgIHVuY292ZXIgNgogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIHVuY292ZXIgNQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAyCiAgICBsZW4KICAgIGRpZyAzCiAgICB1bmNvdmVyIDYKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWMgMjQgLy8gMHgwMDA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDg0CiAgICAvLyBsb2coZW5jb2RlQXJjNCh0b3BpYykpCiAgICBsb2cKICAgIGIgbG9nUGVyaW9kX3doaWxlX3RvcEA0Cgpsb2dQZXJpb2RfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjpHR292UGVyaW9kQ29udHJhY3QubG9nUGVyaW9kQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjQ3MAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo6R0dvdlBlcmlvZENvbnRyYWN0LmdldFZvdGluZ1JlY29yZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldFZvdGluZ1JlY29yZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NDg4CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6ODgKICAgIC8vIHZvdGVSZWNvcmRzID0gQm94TWFwPEFjY291bnQsIEdHb3ZWb3RlUmVjb3JkPih7IGtleVByZWZpeDogJ3YnIH0pCiAgICBieXRlYyAxMyAvLyAidiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjQ5MQogICAgLy8gaWYgKGJveC5leGlzdHMpIHJldHVybiBib3gudmFsdWUKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogZ2V0Vm90aW5nUmVjb3JkX2FmdGVyX2lmX2Vsc2VAMwogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQoKZ2V0Vm90aW5nUmVjb3JkX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo6R0dvdlBlcmlvZENvbnRyYWN0LmdldFZvdGluZ1JlY29yZEA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo0ODgKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKZ2V0Vm90aW5nUmVjb3JkX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3R5cGVzLmFsZ28udHM6MjI3LTIzMAogICAgLy8gcmV0dXJuIHsKICAgIC8vICAgaXNEZWxlZ2F0ZWQ6IGZhbHNlLAogICAgLy8gICB0b3BpY1ZvdGVzOiBbXSBhcyBVaW50MzJbXVtdLAogICAgLy8gfQogICAgcHVzaGJ5dGVzIDB4MDAwMDAzMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo0ODgKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYiBnZXRWb3RpbmdSZWNvcmRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjpHR292UGVyaW9kQ29udHJhY3QuZ2V0Vm90aW5nUmVjb3JkQDQKCgovLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjpHR292UGVyaW9kQ29udHJhY3QubG9nVm90aW5nUmVjb3JkW3JvdXRpbmddKCkgLT4gdm9pZDoKbG9nVm90aW5nUmVjb3JkOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NTAzCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6ODgKICAgIC8vIHZvdGVSZWNvcmRzID0gQm94TWFwPEFjY291bnQsIEdHb3ZWb3RlUmVjb3JkPih7IGtleVByZWZpeDogJ3YnIH0pCiAgICBieXRlYyAxMyAvLyAidiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjUwNgogICAgLy8gaWYgKCFib3guZXhpc3RzKSByZXR1cm4KICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogbG9nVm90aW5nUmVjb3JkX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo6R0dvdlBlcmlvZENvbnRyYWN0LmxvZ1ZvdGluZ1JlY29yZEA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjUwNwogICAgLy8gY29uc3QgcmVjb3JkID0gY2xvbmUoYm94LnZhbHVlKQogICAgZHVwbiAyCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDUKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjUwOQogICAgLy8gaXNEZWxlZ2F0ZWQ6IHJlY29yZC5pc0RlbGVnYXRlZCwKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGludGNfMiAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo1MTAKICAgIC8vIG51bVRvcGljczogdTMyKHJlY29yZC50b3BpY1ZvdGVzLmxlbmd0aCksCiAgICBzd2FwCiAgICBwdXNoaW50IDMgLy8gMwogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBjYWxsc3ViIHUzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo1MDgtNTExCiAgICAvLyBjb25zdCBtZXRhOiBHR292Vm90ZVJlY29yZE1ldGEgPSB7CiAgICAvLyAgIGlzRGVsZWdhdGVkOiByZWNvcmQuaXNEZWxlZ2F0ZWQsCiAgICAvLyAgIG51bVRvcGljczogdTMyKHJlY29yZC50b3BpY1ZvdGVzLmxlbmd0aCksCiAgICAvLyB9CiAgICBieXRlYyAxNCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo1MTIKICAgIC8vIGxvZyhlbmNvZGVBcmM0KG1ldGEpKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjUxMwogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHJlY29yZC50b3BpY1ZvdGVzLmxlbmd0aDsgaSsrKSB7CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAyCgpsb2dWb3RpbmdSZWNvcmRfd2hpbGVfdG9wQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjUxMwogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHJlY29yZC50b3BpY1ZvdGVzLmxlbmd0aDsgaSsrKSB7CiAgICBkdXAKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAyCiAgICA+CiAgICBieiBsb2dWb3RpbmdSZWNvcmRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjpHR292UGVyaW9kQ29udHJhY3QubG9nVm90aW5nUmVjb3JkQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NTE0CiAgICAvLyBjb25zdCB0b3BpY1ZvdGVzOiBHR292VG9waWNWb3RlcyA9IHsgdm90ZXM6IGNsb25lKHJlY29yZC50b3BpY1ZvdGVzW2ldKSB9CiAgICBkaWcgMgogICAgZHVwCiAgICBpbnRjXzIgLy8gMQogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzEgLy8gMgogICAgKgogICAgZGlnIDIKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzMgLy8gNAogICAgKgogICAgaW50Y18xIC8vIDIKICAgICsKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgZXh0cmFjdDMKICAgIGJ5dGVjIDYgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NTE1CiAgICAvLyBsb2coZW5jb2RlQXJjNCh0b3BpY1ZvdGVzKSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo1MTMKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCByZWNvcmQudG9waWNWb3Rlcy5sZW5ndGg7IGkrKykgewogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGJ1cnkgMgogICAgYiBsb2dWb3RpbmdSZWNvcmRfd2hpbGVfdG9wQDQKCmxvZ1ZvdGluZ1JlY29yZF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6OkdHb3ZQZXJpb2RDb250cmFjdC5sb2dWb3RpbmdSZWNvcmRANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NTAzCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjpHR292UGVyaW9kQ29udHJhY3Qud2l0aGRyYXdBTEdPW3JvdXRpbmddKCkgLT4gdm9pZDoKd2l0aGRyYXdBTEdPOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo1MjYKICAgIC8vIHB1YmxpYyB3aXRoZHJhd0FMR08ocmVjZWl2ZXI6IEFjY291bnQsIGFtb3VudDogdWludDY0KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA4IC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjUyNwogICAgLy8gdGhpcy5jaGVja0FkbWluQ2FsbGVyKCkKICAgIGNhbGxzdWIgY2hlY2tBZG1pbkNhbGxlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo1MjgKICAgIC8vIGVuc3VyZShyZWNlaXZlciAhPT0gR2xvYmFsLnplcm9BZGRyZXNzLCBlcnJVbmF1dGhvcml6ZWQpCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiB3aXRoZHJhd0FMR09fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjUyOAogICAgLy8gZW5zdXJlKHJlY2VpdmVyICE9PSBHbG9iYWwuemVyb0FkZHJlc3MsIGVyclVuYXV0aG9yaXplZCkKICAgIGJ5dGVjIDE3IC8vICJFUlI6QVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgp3aXRoZHJhd0FMR09fYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo1MjkKICAgIC8vIGl0eG4ucGF5bWVudCh7IHJlY2VpdmVyLCBhbW91bnQgfSkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpbnRjXzIgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo1MjYKICAgIC8vIHB1YmxpYyB3aXRoZHJhd0FMR08ocmVjZWl2ZXI6IEFjY291bnQsIGFtb3VudDogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYmFzZS5hbGdvLnRzOjpCYXNlQ29udHJhY3QuaW5jcmVhc2VCdWRnZXRbcm91dGluZ10oKSAtPiB2b2lkOgppbmNyZWFzZUJ1ZGdldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2Jhc2UuYWxnby50czoyMQogICAgLy8gQGFiaW1ldGhvZCh7IHZhbGlkYXRlRW5jb2Rpbmc6ICd1bnNhZmUtZGlzYWJsZWQnIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9iYXNlLmFsZ28udHM6MjQKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBpdHhuczsgaSsrKSB7CiAgICBpbnRjXzAgLy8gMAoKaW5jcmVhc2VCdWRnZXRfd2hpbGVfdG9wQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9iYXNlLmFsZ28udHM6MjQKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBpdHhuczsgaSsrKSB7CiAgICBkdXAKICAgIGRpZyAyCiAgICA8CiAgICBieiBpbmNyZWFzZUJ1ZGdldF9hZnRlcl93aGlsZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9iYXNlLmFsZ28udHM6MjUtMzEKICAgIC8vIGl0eG4KICAgIC8vICAgLmFwcGxpY2F0aW9uQ2FsbCh7CiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBlbXB0eS5jbGVhclN0YXRlUHJvZ3JhbSwgLy8gaW50ZW50aW9uYWxseSB1c2luZyBjbGVhciBzdGF0ZSBwcm9ncmFtIGZvciAicmV0dXJuIHRydWUiCiAgICAvLyAgICAgY2xlYXJTdGF0ZVByb2dyYW06IGVtcHR5LmNsZWFyU3RhdGVQcm9ncmFtLAogICAgLy8gICAgIG9uQ29tcGxldGlvbjogT25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9iYXNlLmFsZ28udHM6MjkKICAgIC8vIG9uQ29tcGxldGlvbjogT25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIHB1c2hpbnQgNSAvLyA1CiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYmFzZS5hbGdvLnRzOjIzCiAgICAvLyBjb25zdCBlbXB0eSA9IGNvbXBpbGUoRW1wdHlDb250cmFjdCkKICAgIGJ5dGVjIDI1IC8vIGJhc2U2NChDNEVCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgYnl0ZWMgMjUgLy8gYmFzZTY0KEM0RUJRdz09KQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYmFzZS5hbGdvLnRzOjI1LTMwCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hcHBsaWNhdGlvbkNhbGwoewogICAgLy8gICAgIGFwcHJvdmFsUHJvZ3JhbTogZW1wdHkuY2xlYXJTdGF0ZVByb2dyYW0sIC8vIGludGVudGlvbmFsbHkgdXNpbmcgY2xlYXIgc3RhdGUgcHJvZ3JhbSBmb3IgInJldHVybiB0cnVlIgogICAgLy8gICAgIGNsZWFyU3RhdGVQcm9ncmFtOiBlbXB0eS5jbGVhclN0YXRlUHJvZ3JhbSwKICAgIC8vICAgICBvbkNvbXBsZXRpb246IE9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICAvLyAgIH0pCiAgICBwdXNoaW50IDYgLy8gNgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9iYXNlLmFsZ28udHM6MjUtMzEKICAgIC8vIGl0eG4KICAgIC8vICAgLmFwcGxpY2F0aW9uQ2FsbCh7CiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBlbXB0eS5jbGVhclN0YXRlUHJvZ3JhbSwgLy8gaW50ZW50aW9uYWxseSB1c2luZyBjbGVhciBzdGF0ZSBwcm9ncmFtIGZvciAicmV0dXJuIHRydWUiCiAgICAvLyAgICAgY2xlYXJTdGF0ZVByb2dyYW06IGVtcHR5LmNsZWFyU3RhdGVQcm9ncmFtLAogICAgLy8gICAgIG9uQ29tcGxldGlvbjogT25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYmFzZS5hbGdvLnRzOjI0CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgaXR4bnM7IGkrKykgewogICAgZHVwCiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGluY3JlYXNlQnVkZ2V0X3doaWxlX3RvcEAyCgppbmNyZWFzZUJ1ZGdldF9hZnRlcl93aGlsZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYmFzZS5hbGdvLnRzOjIxCiAgICAvLyBAYWJpbWV0aG9kKHsgdmFsaWRhdGVFbmNvZGluZzogJ3Vuc2FmZS1kaXNhYmxlZCcgfSkKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjpHR292UGVyaW9kQ29udHJhY3QuZW5zdXJlQ2FsbGVySXNPcGVyYXRvcigpIC0+IHZvaWQ6CmVuc3VyZUNhbGxlcklzT3BlcmF0b3I6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjEyMC0xMjMKICAgIC8vIGNvbnN0IG9rID0gY29tcGlsZUFyYzQoR0dvdlJlZ2lzdHJ5Q29udHJhY3QpLmNhbGwudmVyaWZ5T3BlcmF0b3IoewogICAgLy8gICBhcHBJZDogQXBwbGljYXRpb24odGhpcy5yZWdpc3RyeUFwcC52YWx1ZSksCiAgICAvLyAgIGFyZ3M6IFtUeG4uc2VuZGVyXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjEyMQogICAgLy8gYXBwSWQ6IEFwcGxpY2F0aW9uKHRoaXMucmVnaXN0cnlBcHAudmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NjMKICAgIC8vIHJlZ2lzdHJ5QXBwID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KQogICAgYnl0ZWNfMiAvLyAicmVnaXN0cnlBcHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjEyMQogICAgLy8gYXBwSWQ6IEFwcGxpY2F0aW9uKHRoaXMucmVnaXN0cnlBcHAudmFsdWUpLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MTIyCiAgICAvLyBhcmdzOiBbVHhuLnNlbmRlcl0sCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjEyMC0xMjMKICAgIC8vIGNvbnN0IG9rID0gY29tcGlsZUFyYzQoR0dvdlJlZ2lzdHJ5Q29udHJhY3QpLmNhbGwudmVyaWZ5T3BlcmF0b3IoewogICAgLy8gICBhcHBJZDogQXBwbGljYXRpb24odGhpcy5yZWdpc3RyeUFwcC52YWx1ZSksCiAgICAvLyAgIGFyZ3M6IFtUeG4uc2VuZGVyXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBwdXNoYnl0ZXMgMHg0ZDVhNzVkNyAvLyBtZXRob2QgInZlcmlmeU9wZXJhdG9yKGFkZHJlc3MpYm9vbCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IGVuc3VyZUNhbGxlcklzT3BlcmF0b3JfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjEyNAogICAgLy8gZW5zdXJlKG9rLCBlcnJOb3RPcGVyYXRvcikKICAgIHB1c2hieXRlcyAiRVJSOkdfT1AiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKZW5zdXJlQ2FsbGVySXNPcGVyYXRvcl9hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjpHR292UGVyaW9kQ29udHJhY3QuY2hlY2tBZG1pbkNhbGxlcigpIC0+IHZvaWQ6CmNoZWNrQWRtaW5DYWxsZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjEyOS0xMzIKICAgIC8vIGNvbnN0IG9rID0gY29tcGlsZUFyYzQoR0dvdlJlZ2lzdHJ5Q29udHJhY3QpLmNhbGwudmVyaWZ5QWRtaW4oewogICAgLy8gICBhcHBJZDogQXBwbGljYXRpb24odGhpcy5yZWdpc3RyeUFwcC52YWx1ZSksCiAgICAvLyAgIGFyZ3M6IFtUeG4uc2VuZGVyXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjEzMAogICAgLy8gYXBwSWQ6IEFwcGxpY2F0aW9uKHRoaXMucmVnaXN0cnlBcHAudmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NjMKICAgIC8vIHJlZ2lzdHJ5QXBwID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KQogICAgYnl0ZWNfMiAvLyAicmVnaXN0cnlBcHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjEzMAogICAgLy8gYXBwSWQ6IEFwcGxpY2F0aW9uKHRoaXMucmVnaXN0cnlBcHAudmFsdWUpLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MTMxCiAgICAvLyBhcmdzOiBbVHhuLnNlbmRlcl0sCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjEyOS0xMzIKICAgIC8vIGNvbnN0IG9rID0gY29tcGlsZUFyYzQoR0dvdlJlZ2lzdHJ5Q29udHJhY3QpLmNhbGwudmVyaWZ5QWRtaW4oewogICAgLy8gICBhcHBJZDogQXBwbGljYXRpb24odGhpcy5yZWdpc3RyeUFwcC52YWx1ZSksCiAgICAvLyAgIGFyZ3M6IFtUeG4uc2VuZGVyXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBwdXNoYnl0ZXMgMHgzZWIzYWYyMSAvLyBtZXRob2QgInZlcmlmeUFkbWluKGFkZHJlc3MpYm9vbCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IGNoZWNrQWRtaW5DYWxsZXJfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjEzMwogICAgLy8gZW5zdXJlKG9rLCBlcnJVbmF1dGhvcml6ZWQpCiAgICBieXRlYyAxNyAvLyAiRVJSOkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKY2hlY2tBZG1pbkNhbGxlcl9hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjpHR292UGVyaW9kQ29udHJhY3Quc3luY1N1bW1hcnlUb1JlZ2lzdHJ5KCkgLT4gdm9pZDoKc3luY1N1bW1hcnlUb1JlZ2lzdHJ5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoxMzgtMTQ3CiAgICAvLyBjb21waWxlQXJjNChHR292UmVnaXN0cnlDb250cmFjdCkuY2FsbC51cGRhdGVQZXJpb2RTdW1tYXJ5KHsKICAgIC8vICAgYXBwSWQ6IEFwcGxpY2F0aW9uKHRoaXMucmVnaXN0cnlBcHAudmFsdWUpLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgdTMyKHRoaXMucGVyaW9kSWQudmFsdWUpLAogICAgLy8gICAgIHUzMih0aGlzLnZvdGluZ1N0YXJ0LnZhbHVlKSwKICAgIC8vICAgICB1MzIodGhpcy52b3RpbmdFbmQudmFsdWUpLAogICAgLy8gICAgIHUzMih0aGlzLnRvcGljT3B0aW9uc0Fyci52YWx1ZS5sZW5ndGgpLAogICAgLy8gICAgIHRoaXMucmVhZHkudmFsdWUsCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoxMzkKICAgIC8vIGFwcElkOiBBcHBsaWNhdGlvbih0aGlzLnJlZ2lzdHJ5QXBwLnZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjYzCiAgICAvLyByZWdpc3RyeUFwcCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSkKICAgIGJ5dGVjXzIgLy8gInJlZ2lzdHJ5QXBwIgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoxMzkKICAgIC8vIGFwcElkOiBBcHBsaWNhdGlvbih0aGlzLnJlZ2lzdHJ5QXBwLnZhbHVlKSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjE0MQogICAgLy8gdTMyKHRoaXMucGVyaW9kSWQudmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NjUKICAgIC8vIHBlcmlvZElkID0gR2xvYmFsU3RhdGU8dWludDY0PigpCiAgICBieXRlYyAxNiAvLyAicGVyaW9kSWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjE0MQogICAgLy8gdTMyKHRoaXMucGVyaW9kSWQudmFsdWUpLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGNhbGxzdWIgdTMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjE0MgogICAgLy8gdTMyKHRoaXMudm90aW5nU3RhcnQudmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NjcKICAgIC8vIHZvdGluZ1N0YXJ0ID0gR2xvYmFsU3RhdGU8dWludDY0PigpCiAgICBieXRlYyA4IC8vICJ2b3RpbmdTdGFydCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MTQyCiAgICAvLyB1MzIodGhpcy52b3RpbmdTdGFydC52YWx1ZSksCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgY2FsbHN1YiB1MzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MTQzCiAgICAvLyB1MzIodGhpcy52b3RpbmdFbmQudmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NjkKICAgIC8vIHZvdGluZ0VuZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKQogICAgYnl0ZWMgOSAvLyAidm90aW5nRW5kIgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoxNDMKICAgIC8vIHUzMih0aGlzLnZvdGluZ0VuZC52YWx1ZSksCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgY2FsbHN1YiB1MzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6ODAKICAgIC8vIHRvcGljT3B0aW9uc0FyciA9IEJveDxHR292VG9waWNPcHRpb25zW10+KHsga2V5OiAnbycgfSkKICAgIGJ5dGVjXzEgLy8gIm8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjE0NAogICAgLy8gdTMyKHRoaXMudG9waWNPcHRpb25zQXJyLnZhbHVlLmxlbmd0aCksCiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBjYWxsc3ViIHUzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoxNDUKICAgIC8vIHRoaXMucmVhZHkudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czo3MQogICAgLy8gcmVhZHkgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogZmFsc2UgfSkKICAgIGJ5dGVjIDExIC8vICJyZWFkeSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MTQ1CiAgICAvLyB0aGlzLnJlYWR5LnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ5dGVjIDE0IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoxMzgtMTQ3CiAgICAvLyBjb21waWxlQXJjNChHR292UmVnaXN0cnlDb250cmFjdCkuY2FsbC51cGRhdGVQZXJpb2RTdW1tYXJ5KHsKICAgIC8vICAgYXBwSWQ6IEFwcGxpY2F0aW9uKHRoaXMucmVnaXN0cnlBcHAudmFsdWUpLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgdTMyKHRoaXMucGVyaW9kSWQudmFsdWUpLAogICAgLy8gICAgIHUzMih0aGlzLnZvdGluZ1N0YXJ0LnZhbHVlKSwKICAgIC8vICAgICB1MzIodGhpcy52b3RpbmdFbmQudmFsdWUpLAogICAgLy8gICAgIHUzMih0aGlzLnRvcGljT3B0aW9uc0Fyci52YWx1ZS5sZW5ndGgpLAogICAgLy8gICAgIHRoaXMucmVhZHkudmFsdWUsCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgcHVzaGJ5dGVzIDB4ZWNiNzBjMGUgLy8gbWV0aG9kICJ1cGRhdGVQZXJpb2RTdW1tYXJ5KHVpbnQzMix1aW50MzIsdWludDMyLHVpbnQzMixib29sKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciA0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6OkdHb3ZQZXJpb2RDb250cmFjdC5lbnN1cmVFZGl0YWJsZSgpIC0+IHZvaWQ6CmVuc3VyZUVkaXRhYmxlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcGVyaW9kL2dnb3ZQZXJpb2QuYWxnby50czoxNTIKICAgIC8vIGVuc3VyZSghdGhpcy5yZWFkeS52YWx1ZSwgZXJyR0dvdlJlYWR5KQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6NzEKICAgIC8vIHJlYWR5ID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBpbml0aWFsVmFsdWU6IGZhbHNlIH0pCiAgICBieXRlYyAxMSAvLyAicmVhZHkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1wZXJpb2QvZ2dvdlBlcmlvZC5hbGdvLnRzOjE1MgogICAgLy8gZW5zdXJlKCF0aGlzLnJlYWR5LnZhbHVlLCBlcnJHR292UmVhZHkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBieiBlbnN1cmVFZGl0YWJsZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXBlcmlvZC9nZ292UGVyaW9kLmFsZ28udHM6MTUyCiAgICAvLyBlbnN1cmUoIXRoaXMucmVhZHkudmFsdWUsIGVyckdHb3ZSZWFkeSkKICAgIHB1c2hieXRlcyAiRVJSOkdQX1JEIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCmVuc3VyZUVkaXRhYmxlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAEAAIBBCYaAXQBbwtyZWdpc3RyeUFwcAAEFR98dQIAAAIAAgFQC3ZvdGluZ1N0YXJ0CXZvdGluZ0VuZAkAAAAAAAAAAAAFcmVhZHkLY29tbWl0dGVlSWQBdgEAEGZpcnN0Vm90aW5nUm91bmQIcGVyaW9kSWQIRVJSOkFVVEgPbGFzdFZvdGluZ1JvdW5kCUVSUjpHVF9OTwQAAgACCUVSUjpHVF9PQgTI1GGrCUVSUjpHVl9NTQIABAQLgQFDMRhAAA8qImcnCyJnJw8iZycSImcxG0EAhjEZFEQxGESCEQT1ecrCBPtVRfYEtHKW2gS37tkkBLjHCgAEYtKFiQQ4XjTHBAswfucEBPr/CARrOFcTBCiayBIEbP02wwQEXCUJBIahKecEgiZOlQSSjdxeBEEY7L82GgCOEQGIAf0CSQMfBAkE8wXNBh4GgwbFCo0LkAysDXQNnA4aDk0AMRmNBgBc/+//7//vAFQAAQAxGESIDqOIDzIpvEgovEgnB71FAUEABCcHvEixIiplRCInEGVEiAE+gASZKWslshqyGiKyGbIYgQayECKyAbOxMQBJsgkisgiyBySyECKyAbMkQzEYRIgOUCRDMRgURCRDigQBK0mL/iMLi/wjCyKLBIsDDEEAHIv9iwRJTgJZiwIIFlcGAosBTFCMASMIjARC/9yL/RWMACKMBIsEiwIMQQAci/+LBElOAlmLAAgWVwYCiwFMUIwBIwiMBEL/3Iv8i/4IFlcGAosBUIv9iwOLAFJQi/8Vi/+LAk8CUlCMAImKAwGL/VEAAkkXi/1XAgCL/yMLSwFMWYv/JAgjC0sCSwFZSwMVSwWL/wkkCUsBTwNPAk1JSwQJTgaL/hVOBksEIk8FUov+UE8ETwJPA1JQTgJMIwtMiwWLBAxBACCLA0mLBUlOA1mLAgiLAQkWVwYCSwJMXYwDIwiMBUL/2IsAiwNQjACJigEBi/8WSZOBIA5EVwQEiTYaAUkVgQgSRBc2GgJJFSUSRDYaA0kVgSASRDYaBEkVJRJENhoFSRUlEkQiKmVEQQAKgAZFUlI6QUmwADEAMgkSQAAEJxGwACpLBWdLAxcnEExnJwxLA2dLARcnCExnSRcnCUxnKbxIKScFvyi8SCgnBb8kQzYaAUkVgSASRDYaAkkVgQgSRBdJNhoDSRWBCBJEF0lOAogMV4gNKQxAAA2ACUVSUjpQRV9MVLAAJwxLA2cnCEsCZycJSwFniAyvJEMiKzYaAUcCIllJTgIjC0xJFUxXAgAiSUsFDEEAJEcCIwtLA0lPAllJSwdJTgQSREsBFVIiWSMICEUFJAhFAUL/1UsDIwhLAxJEiAvjiAy1SwRAAAQnE7AAJwVFCCJFB0sGSwUMQQAgIoj+xEsISU8CUEwiWSQIFlcGAlwARQhLBiQIRQdC/9gpvkQovkQpIiO6F0sCIllPA1cCACcUSwpQTgIkTwOI/YJLAiJZTwNXAgAnFEsMUE4CJE8DiP1sKbxIKU8Cvyi8SChMv4gL3xYnBExQsCRDIkcCKzYaAUkVgQgSRBc2GgJHAiJZSU4CIwtMSRVMVwIAIklLBQxBACRHAiMLSwNJTwJZSUsHSU4EEkRLARVSIlkjCAhFBSQIRQFC/9VLAyMISwMSRIgLAYgL00sEQAAEJxOwACm+TEUMRCi+TEUKRCkiI7oXSwcNQAAEJxWwACcFRQoiRQhLB0sFDEEAICKI/cdLCklPAlBMIlkkCBZXBgJcAEUKSwckCEUIQv/YJwZLBlBLC0kiWUsJSU8CDERMTwJLAoj9DScGSwxQSwtJIllLBA1ETE8DiPz5KbxIKU8Cvyi8SChMvyRDIkkrNhoBSRWBCBJEF0mICl6ICzApvkxOAkQovkxOAkQpIiO6FwxAAAQnFbAAJwVFBicFRQUiRQQpIiO6F0sEDUEAlEsDSwMTQQCDSwFJVwIATCJZSwVJIwtLA0sBWU8CJAhPA0sBCUsEFUsCIwtLBksBWU8CTE8DTU8FTwRPAlJLCUkiWUxXAgAnBk8DUE4CJE8DiPvURQlLA0lXAgBMIllLAU8FWUxPBAlLAhVLA08FWU8CTVJLBUkiWUxXAgAnBk8DUE4CJE8DiPueRQVLAyQIRQRC/2EpvEgpSwa/KLxIKEsFv4gKBSRDK0cENhoBSRUkEkQiU0mICXRBAFeBUUUCIkUFKCIjuhdLBQ1BACUjSwVJTgILIwgoTCO6FyUIKEwjuhclCyUISwMIRQMkCEUFQv/QSwGBgAgOQAANgAlFUlI6R1BfVVawACcLSwFniAmaJEMiRQQoIiO6F0sEDUH/6CJFAyNLBAsjCElFByhMI7oXJQgoTCO6F0sDDUEAOihLBiO6FyUIKEsBI7oXSwRJTwIMREwjCEwlCwgoTCW6F0EADYAJRVJSOkdQX1ZFsABLAiQIRQNC/6tLAyQIRQRC/5Q2GgFJFYEIEkQXSTYaAkkiWSMISwEVEkRXAgBJTgKICIqICVwVSwEITEAAEycHvEgnB0sBuUgnB0sDSwO7JEMnB71ISwEMQf/tJwdLAdNC/+U2GgFJFYEIEkQXNhoCSRWBCBJEF0lOAjYaA0kiWSMISwEVEkRXAgBJTgOICC2ICP9PAoj7JYABVExQTgIVSwEITEAAEksBSbxISwG5SEsBSwRLBLskQ0sBvUhLAQxB/+1K00L/6DYaAUcCIllJTgKBCAsjCEwVEkSICCKICLEiSUsCDEEAH0sCVwIASwFJTgKBCAtbiPrDgAFUTFC8SCQIRQFC/9okQyJHBitHCjYaAUkVgSASRDYaAkcCIllJTgIjC0xJFUxXAgAiSUsFDEEAJkcCIwtLA0lPAllJSwdJTgQSREsBFVIiWSULIwgIRQUkCEUBQv/TSwMjCEsDEkQiJwtlREAADYAJRVJSOkdQX05SsAAyByInCGVED0AADYAJRVJSOkdQX05TsAAyByInCWVEDEAADYAJRVJSOkdQX0VOsAAiRQ4xAEsHE0EAY7EiKmVEJxayGksHshoishmyGIEGshAisgGztD5JVwQATFcABCcEEkRJFYEgEkQxABJAAA2ACUVSUjpHRF9OWLAAMR1BAtYkwBxLBxJBAs0kQAANgAlFUlI6R0RfTlKwACRFDrEiKmVEIicMZUSABMooSQOyGrIaSweyGiKyGbIYgQayECKyAbO0PklXBABJTgJFFVcABCcEEkQVJRJEKL5MRRlEKCIjuhdLBRJAAAQnF7AAJw1LB1BJRRW9RQFBAQRLDUEAF0sTIiS6IlNAAA2ACUVSUjpHVl9PRLAAIkUPSxOBAyO6F0sPDUEA2CcFRRYiRQtLE0mBAyO6F0sQSU8CDEQjC4EFCElFEksBTCO6F4EFCCO6F0sLDUEAhksXSVcCAEwiWUsQSSMLSwNMWUsBJAhPA0sBCUsEFU8CIwtLBUxZTwJNTwNOAlJJIllLARVSVwIASwxJTgIlC0xLAVpLF0mBAyO6F08FDURJSxQjuheBBQhKI7oXSwUNRCMITwMIJboXCYj4gksXSU8CUEwiWSQIFlcGAlwARRckCEULQv9RJwZLFlBLGEkiWUsRSU8CDERMTwJLAoj3ykUZJAhFD0L/GyJFDUsMSwUMSUUKQQDuSwhESwxJIwtLA0lOAksBWUsCSwFZJQsjCE8DTgJYSUUYIllJTgNFFUsaSVcCAEwiWUlOAkUWSU8DWU8DJAhJRRFPA0sBCUsDFU8CIwtLBExZTwJNUkkiWUsBFVJJRRsiWRJAAAQnF7AAIkUIJwVFFyJFCksJSxIMQQA+SxhXAgBLCklOAiULTEsBWksXVwIATwJaTEsBCIj3nksZSU8CUEwiWSQIFlcGAlwARRlLCQhFCSQIRQpC/7pLEhdLCBJAAA2ACUVSUjpHVl9WULAAJwZLF1BLDUlOAksTDERLGUxPAoj2zkUYSwtFDUL/BzEASxS9TgJISxQXSwlPAlAnDiJPBFRQTBZQgAIAS1BLBlCABFjRi8hMULAiJw9lREAABScPMgZnJxIyBmcovEgoSxi/Jw4iSw9UgAIAA1BLBlBLFEm8SEy/JEMiQv0wIkkrNhoBSRWBIBJENhoCSRWBIBJEIicLZURAAAknCicETFCwJEMyByInCGVEDEEABScKQv/pMgciJwllRA9BAAUnCkL/2UlLAhNBAGexIiplRCcWshpLArIaIrIZshiBBrIQIrIBs7Q+SVcEAElOAkUHVwAEJwQSREkVgSASRDIDEkEABScKQv+VSwRLARNBAAUnCkL/iCcNSwJQSUUFvUUBQQAPSwMiJLoiU0AABScKQv9rsSIqZUQiJwxlRIAEbzGWerIashpLArIaIrIZshiBBrIQIrIBs7Q+SVcEAExXAAQnBBJESRUlEkQXSUUEQAAFJwpC/ydLAhaAAYBMUEL/HCJHAisiKmVEQAA9Ioj12SKI9dWAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATwJQTFCABAAqAABQJwRMULAkQym+TEUFRCi+TEUDRCcFRQMiRQEpIiO6F0sBDUEAkUsDSVcCAEwiWUsCSSMLSwNLAVlPAiQISUUGTwNLAQlLBBVLAiMLSwZLAVlPAkxPA01PBU8ETwJSSSJZSwEVUksFSVcCAEwiWUsBTwZZTE8FCUsCFUsDTwZZTwJNUkkiWUsBFVJLARUlCBZXBgInGExQTwJQTFBLA0kiWUxXAgAnBk8DUE4CJE8DiPPxRQNC/2QiJwxlRCInCGVEiPTkIicJZUSI9NxOAlBMUIACACpQSwNQQv8lIkkrIiplREEAvCm+TEUERCi+TEUDRCInDGVEIicIZUSI9KkiJwllRIj0oSkiI7oXiPSZTwNPA1BPAlBMULAiRQEpIiO6F0sBDUEAeksCSVcCAEwiWUsCSSMLSwNLAVlPAiQISUUGTwNLAQlLBBVLAiMLSwZLAVlPAkxPA01PBU8ETwJSSSJZSwEVUksFSVcCAEwiWUsBTwZZTE8FCUsCFUsDTwZZTwJNUkkiWUsBFVJLARUlCBZXBgInGExQTwJQTFCwQv97JEM2GgFJFYEgEkQnDUxQSb1FAUEACkm+RCcETFCwJEOABQAAAwAAQv/vIis2GgFJFYEgEkQnDUxQSb1FAUEAZkcCvkxFBURJIiS6IlNMgQMjuheI87AnDiJPA1RMULAiRQJJgQMjuhdLAg1BADhLAkkkWUsBFVJJVwIATCJZSwNJTwIMREkjC0sCTFlLAksBWSULIwhPA04CWCcGTFCwJAhFAkL/vCRDNhoBRwIVgSASRDYaAkkVgQgSRBdMiACJMgMTQAAEJxGwALFJsghLAbIHJLIQIrIBsyRDNhoBFyJJSwIMQQAdsYEFshknGbJCJxmyQIEGshAisgGzSSQIRQFC/9wkQ7EiKmVEMQCABE1addeyGrIaIrIZshiBBrIQIrIBs7Q+SVcEAExXAAQnBBJESRUkEkQiU0AADIAIRVJSOkdfT1CwAImxIiplRDEAgAQ+s68hshqyGiKyGbIYgQayECKyAbO0PklXBABMVwAEJwQSREkVJBJEIlNAAAQnEbAAibEiKmVEIicQZUSI8nUiJwhlRIjybSInCWVEiPJlKSIjuheI8l0iJwtlRCcOIk8CVIAE7LcMDrIaTwSyGk8DshpPArIaTLIashoishmyGIEGshAisgGziSInC2VEQQANgAlFUlI6R1BfUkSwAIk=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 3, "patch": 2 } }, "events": [ { "name": "GGovVoteCast", "args": [ { "type": "address", "name": "voter" }, { "type": "address", "name": "sender" }, { "type": "bool", "name": "updateVote" }, { "type": "uint64", "name": "votingPower" }, { "type": "uint32[][]", "name": "topicVotes" } ] } ], "templateVariables": {} }