{ "name": "Algochi", "structs": {}, "methods": [ { "name": "bootstrap", "args": [ { "type": "uint64", "name": "beaconAppId" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Bootstraps the contract by creating the reward ASA and setting the beacon app ID.\nMust be called once before any other operations.", "events": [], "recommendations": {} }, { "name": "createPet", "args": [ { "type": "pay", "name": "payment" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "OptIn" ] }, "readonly": false, "desc": "Creates a new pet and mints its corresponding NFT.\nRequires payment transaction and initializes pet state with default values.", "events": [], "recommendations": {} }, { "name": "feed", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Feed the pet to increase hunger and earn health-scaled $TAMA rewards.\nCommits to a future VRF round for the follow-up play() action.", "events": [], "recommendations": {} }, { "name": "play", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Play with the pet to boost happiness using VRF randomness.\nRequires a VRF commitment from a previous feed() call and distributes health-scaled rewards.", "events": [], "recommendations": {} }, { "name": "evolve", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Evolve the pet to the next stage if age requirements are met.\nBurns $TAMA and applies a happiness boost.", "events": [], "recommendations": {} }, { "name": "revive", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Revive a dead pet by burning $TAMA and resetting stats to baseline values.", "events": [], "recommendations": {} }, { "name": "finalizeTraits", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Finalize pet traits using VRF randomness from the beacon or fallback hash.\nCan only be called once per pet after the VRF round delay has passed.", "events": [], "recommendations": {} }, { "name": "vrfTest", "args": [ { "type": "uint64", "name": "committedRound" } ], "returns": { "type": "(byte[],bool)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Test method for VRF beacon functionality.", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "desc": "Algochi - Tamagotchi-style NFT pet on Algorand\n\nA Tamagotchi-inspired digital pet game where players care for their pets,\nearning $TAMA tokens through feeding and playing, with 3-stage evolutions\nand on-chain traits determined by secure VRF.", "networks": {}, "state": { "schema": { "global": { "ints": 21, "bytes": 0 }, "local": { "ints": 13, "bytes": 0 } }, "keys": { "global": { "totalPets": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dG90YWxQZXRz" }, "totalRewardsMined": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dG90YWxSZXdhcmRzTWluZWQ=" }, "totalRewardsBurned": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dG90YWxSZXdhcmRzQnVybmVk" }, "rewardAsaId": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cmV3YXJkQXNhSWQ=" }, "beaconAppId": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YmVhY29uQXBwSWQ=" }, "randomnessGapRounds": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cmFuZG9tbmVzc0dhcFJvdW5kcw==" }, "randomDelay": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cmFuZG9tRGVsYXk=" }, "maxStat": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bWF4U3RhdA==" }, "ageSecondsPerDay": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YWdlU2Vjb25kc1BlckRheQ==" }, "isBootstrapped": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "aXNCb290c3RyYXBwZWQ=" }, "hungerIncrease": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "aHVuZ2VySW5jcmVhc2U=" }, "petHungerCost": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cGV0SHVuZ2VyQ29zdA==" }, "hungerDecayNumerator": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "aHVuZ2VyRGVjYXlOdW1lcmF0b3I=" }, "hungerDecayDenominator": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "aHVuZ2VyRGVjYXlEZW5vbWluYXRvcg==" }, "happinessDecayNumerator": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "aGFwcGluZXNzRGVjYXlOdW1lcmF0b3I=" }, "happinessDecayDenominator": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "aGFwcGluZXNzRGVjYXlEZW5vbWluYXRvcg==" }, "evolveCost": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZXZvbHZlQ29zdA==" }, "reviveCost": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cmV2aXZlQ29zdA==" }, "stageRewardBaby": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "c3RhZ2VSZXdhcmRCYWJ5" }, "stageRewardTeen": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "c3RhZ2VSZXdhcmRUZWVu" }, "stageRewardAdult": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "c3RhZ2VSZXdhcmRBZHVsdA==" } }, "local": { "assetId": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YXNzZXRJZA==" }, "hunger": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "aHVuZ2Vy" }, "happiness": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "aGFwcGluZXNz" }, "ageDays": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YWdlRGF5cw==" }, "stage": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "c3RhZ2U=" }, "lastUpdate": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bGFzdFVwZGF0ZQ==" }, "isDead": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "aXNEZWFk" }, "committedRound": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Y29tbWl0dGVkUm91bmQ=" }, "feedHungerSnapshot": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZmVlZEh1bmdlclNuYXBzaG90" }, "traitColor": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dHJhaXRDb2xvcg==" }, "traitPattern": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dHJhaXRQYXR0ZXJu" }, "traitAccessory": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dHJhaXRBY2Nlc3Nvcnk=" }, "traitsFinalized": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dHJhaXRzRmluYWxpemVk" } }, "box": {} }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": [ "NoOp" ], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 788 ], "errorMessage": "Already bootstrapped" }, { "pc": [ 1556 ], "errorMessage": "Beacon app not configured" }, { "pc": [ 1612, 1984 ], "errorMessage": "Bytes has valid prefix" }, { "pc": [ 2216 ], "errorMessage": "Insufficient $TAMA" }, { "pc": [ 907 ], "errorMessage": "Invalid payment transaction" }, { "pc": [ 1877 ], "errorMessage": "No pending VRF commitment" }, { "pc": [ 1351 ], "errorMessage": "Not ready to evolve" }, { "pc": [ 655 ], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [ 734 ], "errorMessage": "OnCompletion must be NoOp && can only call when creating" }, { "pc": [ 723 ], "errorMessage": "OnCompletion must be OptIn && can only call when not creating" }, { "pc": [ 1669 ], "errorMessage": "Pet is dead" }, { "pc": [ 1418 ], "errorMessage": "Pet is not dead" }, { "pc": [ 1410, 1461, 1661 ], "errorMessage": "Pet not created" }, { "pc": [ 1889 ], "errorMessage": "Randomness not ready - delay not satisfied" }, { "pc": [ 2133, 2198 ], "errorMessage": "Reward ASA not configured" }, { "pc": [ 1469 ], "errorMessage": "Traits already finalized" }, { "pc": [ 786, 912, 1100, 1105, 1206, 1228, 1237, 1356, 1423, 1718, 1729, 1740, 1746, 1809, 1884, 1897, 1937, 2054, 2116, 2127, 2157, 2175, 2183, 2246 ], "errorMessage": "check GlobalState exists" }, { "pc": [ 1095, 1159, 1198, 1223, 1318, 1326, 1344, 1415, 1467, 1478, 1667, 1682, 1761, 1770, 1820, 1842, 1875, 1921, 2024, 2030, 2046, 2108 ], "errorMessage": "check LocalState exists" }, { "pc": [ 780, 1551 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 883 ], "errorMessage": "transaction type is pay" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDEwIDMKICAgIGJ5dGVjYmxvY2sgImh1bmdlciIgImhhcHBpbmVzcyIgImNvbW1pdHRlZFJvdW5kIiAiaXNEZWFkIiAibWF4U3RhdCIgMHgxNTFmN2M3NSAiYXNzZXRJZCIgInN0YWdlIiAibGFzdFVwZGF0ZSIgImJlYWNvbkFwcElkIiAiYWdlRGF5cyIgImZlZWRIdW5nZXJTbmFwc2hvdCIgInRvdGFsUGV0cyIgInRvdGFsUmV3YXJkc01pbmVkIiAidG90YWxSZXdhcmRzQnVybmVkIiAiaXNCb290c3RyYXBwZWQiICJwZXRIdW5nZXJDb3N0IiAicmV3YXJkQXNhSWQiICJ0cmFpdHNGaW5hbGl6ZWQiIDB4MDAwMzAwMDAwMCAicmFuZG9tbmVzc0dhcFJvdW5kcyIgInJhbmRvbURlbGF5IiAiYWdlU2Vjb25kc1BlckRheSIgImh1bmdlckluY3JlYXNlIiAiaHVuZ2VyRGVjYXlOdW1lcmF0b3IiICJodW5nZXJEZWNheURlbm9taW5hdG9yIiAiaGFwcGluZXNzRGVjYXlOdW1lcmF0b3IiICJoYXBwaW5lc3NEZWNheURlbm9taW5hdG9yIiAiZXZvbHZlQ29zdCIgInJldml2ZUNvc3QiICJzdGFnZVJld2FyZEJhYnkiICJzdGFnZVJld2FyZFRlZW4iICJzdGFnZVJld2FyZEFkdWx0IiAweDMwMzEzMjMzMzQzNTM2MzczODM5ICJ0cmFpdENvbG9yIiAidHJhaXRQYXR0ZXJuIiAidHJhaXRBY2Nlc3NvcnkiIDB4MTg5MzkyYzUgMHgwMDAzCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjkyCiAgICAvLyB0b3RhbFBldHMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDEyIC8vICJ0b3RhbFBldHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6OTMKICAgIC8vIHRvdGFsUmV3YXJkc01pbmVkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyAxMyAvLyAidG90YWxSZXdhcmRzTWluZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6OTQKICAgIC8vIHRvdGFsUmV3YXJkc0J1cm5lZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgMTQgLy8gInRvdGFsUmV3YXJkc0J1cm5lZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo5OQogICAgLy8gcmFuZG9tbmVzc0dhcFJvdW5kcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IERFRkFVTFRfUkFORE9NTkVTU19HQVBfUk9VTkRTIH0pCiAgICBieXRlYyAyMCAvLyAicmFuZG9tbmVzc0dhcFJvdW5kcyIKICAgIGludGNfMiAvLyAxMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTAwCiAgICAvLyByYW5kb21EZWxheSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IERFRkFVTFRfUkFORE9NX0RFTEFZIH0pCiAgICBieXRlYyAyMSAvLyAicmFuZG9tRGVsYXkiCiAgICBwdXNoaW50IDExIC8vIDExCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxMDEKICAgIC8vIG1heFN0YXQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBERUZBVUxUX01BWF9TVEFUIH0pCiAgICBieXRlYyA0IC8vICJtYXhTdGF0IgogICAgcHVzaGludCAxMDAgLy8gMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxMDIKICAgIC8vIGFnZVNlY29uZHNQZXJEYXkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBERUZBVUxUX0FHRV9TRUNPTkRTX1BFUl9EQVkgfSkKICAgIGJ5dGVjIDIyIC8vICJhZ2VTZWNvbmRzUGVyRGF5IgogICAgcHVzaGludCA4NjQwMCAvLyA4NjQwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTAzCiAgICAvLyBpc0Jvb3RzdHJhcHBlZCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiBmYWxzZSB9KQogICAgYnl0ZWMgMTUgLy8gImlzQm9vdHN0cmFwcGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEwNgogICAgLy8gaHVuZ2VySW5jcmVhc2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBERUZBVUxUX0hVTkdFUl9JTkNSRUFTRSB9KQogICAgYnl0ZWMgMjMgLy8gImh1bmdlckluY3JlYXNlIgogICAgcHVzaGludCAzMCAvLyAzMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTA3CiAgICAvLyBwZXRIdW5nZXJDb3N0ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogREVGQVVMVF9QRVRfSFVOR0VSX0NPU1QgfSkKICAgIGJ5dGVjIDE2IC8vICJwZXRIdW5nZXJDb3N0IgogICAgcHVzaGludCAxNSAvLyAxNQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTA4CiAgICAvLyBodW5nZXJEZWNheU51bWVyYXRvciA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IERFRkFVTFRfSFVOR0VSX0RFQ0FZX05VTUVSQVRPUiB9KQogICAgYnl0ZWMgMjQgLy8gImh1bmdlckRlY2F5TnVtZXJhdG9yIgogICAgcHVzaGludCAyNSAvLyAyNQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTA5CiAgICAvLyBodW5nZXJEZWNheURlbm9taW5hdG9yID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogREVGQVVMVF9IVU5HRVJfREVDQVlfREVOT01JTkFUT1IgfSkKICAgIGJ5dGVjIDI1IC8vICJodW5nZXJEZWNheURlbm9taW5hdG9yIgogICAgcHVzaGludCAxNDQwMCAvLyAxNDQwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTEwCiAgICAvLyBoYXBwaW5lc3NEZWNheU51bWVyYXRvciA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IERFRkFVTFRfSEFQUElORVNTX0RFQ0FZX05VTUVSQVRPUiB9KQogICAgYnl0ZWMgMjYgLy8gImhhcHBpbmVzc0RlY2F5TnVtZXJhdG9yIgogICAgcHVzaGludCAyMCAvLyAyMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTExCiAgICAvLyBoYXBwaW5lc3NEZWNheURlbm9taW5hdG9yID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogREVGQVVMVF9IQVBQSU5FU1NfREVDQVlfREVOT01JTkFUT1IgfSkKICAgIGJ5dGVjIDI3IC8vICJoYXBwaW5lc3NEZWNheURlbm9taW5hdG9yIgogICAgcHVzaGludCAyMTYwMCAvLyAyMTYwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTE0CiAgICAvLyBldm9sdmVDb3N0ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogREVGQVVMVF9FVk9MVkVfQ09TVCB9KQogICAgYnl0ZWMgMjggLy8gImV2b2x2ZUNvc3QiCiAgICBwdXNoaW50IDI1MDAwMDAwIC8vIDI1MDAwMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxMTUKICAgIC8vIHJldml2ZUNvc3QgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBERUZBVUxUX1JFVklWRV9DT1NUIH0pCiAgICBieXRlYyAyOSAvLyAicmV2aXZlQ29zdCIKICAgIHB1c2hpbnQgNTAwMDAwMDAgLy8gNTAwMDAwMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjExNgogICAgLy8gc3RhZ2VSZXdhcmRCYWJ5ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogREVGQVVMVF9TVEFHRV9SRVdBUkRfQkFCWSB9KQogICAgYnl0ZWMgMzAgLy8gInN0YWdlUmV3YXJkQmFieSIKICAgIHB1c2hpbnQgNTAwMDAwIC8vIDUwMDAwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTE3CiAgICAvLyBzdGFnZVJld2FyZFRlZW4gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBERUZBVUxUX1NUQUdFX1JFV0FSRF9URUVOIH0pCiAgICBieXRlYyAzMSAvLyAic3RhZ2VSZXdhcmRUZWVuIgogICAgcHVzaGludCAxMDAwMDAwIC8vIDEwMDAwMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjExOAogICAgLy8gc3RhZ2VSZXdhcmRBZHVsdCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IERFRkFVTFRfU1RBR0VfUkVXQVJEX0FEVUxUIH0pCiAgICBieXRlYyAzMiAvLyAic3RhZ2VSZXdhcmRBZHVsdCIKICAgIHB1c2hpbnQgMjAwMDAwMCAvLyAyMDAwMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjg2CiAgICAvLyBleHBvcnQgY2xhc3MgQWxnb2NoaSBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3RzX18uZGVmYXVsdENyZWF0ZUAxOAogICAgcHVzaGJ5dGVzIDB4OWI3YWU4OTQgLy8gbWV0aG9kICJjcmVhdGVQZXQocGF5KXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY3JlYXRlUGV0X3JvdXRlQDUKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo4NgogICAgLy8gZXhwb3J0IGNsYXNzIEFsZ29jaGkgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweGI2MWY2MmQ1IDB4Zjc2MWNlOWMgMHhmOTI4ZTk4ZCAweDFkZGUwMDE3IDB4OWU5MzQyMzQgMHg3NjU2MTgwYSAweGNlMTllODNlIC8vIG1ldGhvZCAiYm9vdHN0cmFwKHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImZlZWQoKXZvaWQiLCBtZXRob2QgInBsYXkoKXZvaWQiLCBtZXRob2QgImV2b2x2ZSgpdm9pZCIsIG1ldGhvZCAicmV2aXZlKCl2b2lkIiwgbWV0aG9kICJmaW5hbGl6ZVRyYWl0cygpdm9pZCIsIG1ldGhvZCAidnJmVGVzdCh1aW50NjQpKGJ5dGVbXSxib29sKSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGJvb3RzdHJhcCBmZWVkIHBsYXkgZXZvbHZlIHJldml2ZSBmaW5hbGl6ZVRyYWl0cyB2cmZUZXN0CiAgICBlcnIKCm1haW5fY3JlYXRlUGV0X3JvdXRlQDU6CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjE3NwogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogJ09wdEluJyB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18xIC8vIE9wdEluCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgT3B0SW4gJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYiBjcmVhdGVQZXQKCm1haW5fX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlQDE4OgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo4NgogICAgLy8gZXhwb3J0IGNsYXNzIEFsZ29jaGkgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHB1eWEtdHM6Oml0b2EoaTogdWludDY0KSAtPiBieXRlczoKaXRvYToKICAgIHByb3RvIDEgMQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMTAKICAgIDwKICAgIGJ6IGl0b2FfZWxzZV9ib2R5QDIKICAgIGJ5dGVjIDMzIC8vIDB4MzAzMTMyMzMzNDM1MzYzNzM4MzkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzCiAgICByZXRzdWIKCml0b2FfZWxzZV9ib2R5QDI6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAxMAogICAgLwogICAgY2FsbHN1YiBpdG9hCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAxMAogICAgJQogICAgYnl0ZWMgMzMgLy8gMHgzMDMxMzIzMzM0MzUzNjM3MzgzOQogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNyYy9hbGdvY2hpLmFsZ28udHM6OkFsZ29jaGkuYm9vdHN0cmFwW3JvdXRpbmddKCkgLT4gdm9pZDoKYm9vdHN0cmFwOgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxNTAKICAgIC8vIGJvb3RzdHJhcChiZWFjb25BcHBJZDogdWludDY0KTogdWludDY0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDggLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTUxCiAgICAvLyBhc3NlcnQoIXRoaXMuaXNCb290c3RyYXBwZWQudmFsdWUsICdBbHJlYWR5IGJvb3RzdHJhcHBlZCcpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxMDMKICAgIC8vIGlzQm9vdHN0cmFwcGVkID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBpbml0aWFsVmFsdWU6IGZhbHNlIH0pCiAgICBieXRlYyAxNSAvLyAiaXNCb290c3RyYXBwZWQiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjE1MQogICAgLy8gYXNzZXJ0KCF0aGlzLmlzQm9vdHN0cmFwcGVkLnZhbHVlLCAnQWxyZWFkeSBib290c3RyYXBwZWQnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBBbHJlYWR5IGJvb3RzdHJhcHBlZAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo5OAogICAgLy8gYmVhY29uQXBwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCkKICAgIGJ5dGVjIDkgLy8gImJlYWNvbkFwcElkIgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxNTIKICAgIC8vIHRoaXMuYmVhY29uQXBwSWQudmFsdWUgPSBiZWFjb25BcHBJZAogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTU0LTE2NQogICAgLy8gY29uc3QgcmV3YXJkQXNhID0gaXR4bgogICAgLy8gICAuYXNzZXRDb25maWcoewogICAgLy8gICAgIHRvdGFsOiBSRVdBUkRfQVNBX1RPVEFMLAogICAgLy8gICAgIGRlY2ltYWxzOiBSRVdBUkRfQVNBX0RFQ0lNQUxTLAogICAgLy8gICAgIHVuaXROYW1lOiAnUkVXQVJEUycsCiAgICAvLyAgICAgYXNzZXROYW1lOiAnQUxHT0NISSBSRVdBUkRTJywKICAgIC8vICAgICBtYW5hZ2VyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICByZXNlcnZlOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBmcmVlemU6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGNsYXdiYWNrOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpLmNyZWF0ZWRBc3NldAogICAgaXR4bl9iZWdpbgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxNjAKICAgIC8vIG1hbmFnZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTYxLTE2MwogICAgLy8gcmVzZXJ2ZTogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyBmcmVlemU6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gY2xhd2JhY2s6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZHVwbiAzCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0Q2xhd2JhY2sKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRGcmVlemUKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRSZXNlcnZlCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TWFuYWdlcgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxNTkKICAgIC8vIGFzc2V0TmFtZTogJ0FMR09DSEkgUkVXQVJEUycsCiAgICBwdXNoYnl0ZXMgIkFMR09DSEkgUkVXQVJEUyIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXROYW1lCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjE1OAogICAgLy8gdW5pdE5hbWU6ICdSRVdBUkRTJywKICAgIHB1c2hieXRlcyAiUkVXQVJEUyIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVbml0TmFtZQogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxNTcKICAgIC8vIGRlY2ltYWxzOiBSRVdBUkRfQVNBX0RFQ0lNQUxTLAogICAgcHVzaGludCA2IC8vIDYKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXREZWNpbWFscwogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxNTYKICAgIC8vIHRvdGFsOiBSRVdBUkRfQVNBX1RPVEFMLAogICAgcHVzaGludCAxMDAwMDAwMDAwIC8vIDEwMDAwMDAwMDAKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRUb3RhbAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxNTQtMTY0CiAgICAvLyBjb25zdCByZXdhcmRBc2EgPSBpdHhuCiAgICAvLyAgIC5hc3NldENvbmZpZyh7CiAgICAvLyAgICAgdG90YWw6IFJFV0FSRF9BU0FfVE9UQUwsCiAgICAvLyAgICAgZGVjaW1hbHM6IFJFV0FSRF9BU0FfREVDSU1BTFMsCiAgICAvLyAgICAgdW5pdE5hbWU6ICdSRVdBUkRTJywKICAgIC8vICAgICBhc3NldE5hbWU6ICdBTEdPQ0hJIFJFV0FSRFMnLAogICAgLy8gICAgIG1hbmFnZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIHJlc2VydmU6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGZyZWV6ZTogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgY2xhd2JhY2s6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICB9KQogICAgaW50Y18zIC8vIDMKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxNTQtMTY1CiAgICAvLyBjb25zdCByZXdhcmRBc2EgPSBpdHhuCiAgICAvLyAgIC5hc3NldENvbmZpZyh7CiAgICAvLyAgICAgdG90YWw6IFJFV0FSRF9BU0FfVE9UQUwsCiAgICAvLyAgICAgZGVjaW1hbHM6IFJFV0FSRF9BU0FfREVDSU1BTFMsCiAgICAvLyAgICAgdW5pdE5hbWU6ICdSRVdBUkRTJywKICAgIC8vICAgICBhc3NldE5hbWU6ICdBTEdPQ0hJIFJFV0FSRFMnLAogICAgLy8gICAgIG1hbmFnZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIHJlc2VydmU6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGZyZWV6ZTogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgY2xhd2JhY2s6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkuY3JlYXRlZEFzc2V0CiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBDcmVhdGVkQXNzZXRJRAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo5NwogICAgLy8gcmV3YXJkQXNhSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCkKICAgIGJ5dGVjIDE3IC8vICJyZXdhcmRBc2FJZCIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTY3CiAgICAvLyB0aGlzLnJld2FyZEFzYUlkLnZhbHVlID0gcmV3YXJkQXNhLmlkCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTAzCiAgICAvLyBpc0Jvb3RzdHJhcHBlZCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiBmYWxzZSB9KQogICAgYnl0ZWMgMTUgLy8gImlzQm9vdHN0cmFwcGVkIgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxNjgKICAgIC8vIHRoaXMuaXNCb290c3RyYXBwZWQudmFsdWUgPSB0cnVlCiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTUwCiAgICAvLyBib290c3RyYXAoYmVhY29uQXBwSWQ6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBpdG9iCiAgICBieXRlYyA1IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc3JjL2FsZ29jaGkuYWxnby50czo6QWxnb2NoaS5jcmVhdGVQZXRbcm91dGluZ10oKSAtPiB2b2lkOgpjcmVhdGVQZXQ6CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjE3NwogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogJ09wdEluJyB9KQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjE3OS0xODcKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgYW1vdW50OiB7IGdyZWF0ZXJUaGFuRXE6IE1CUl9QQVlNRU5UX0FNT1VOVCB9LAogICAgLy8gICAgIHNlbmRlcjogVHhuLnNlbmRlciwKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgIH0sCiAgICAvLyAgICdJbnZhbGlkIHBheW1lbnQgdHJhbnNhY3Rpb24nLAogICAgLy8gKQogICAgZHVwCiAgICBndHhucyBBbW91bnQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTgyCiAgICAvLyBhbW91bnQ6IHsgZ3JlYXRlclRoYW5FcTogTUJSX1BBWU1FTlRfQU1PVU5UIH0sCiAgICBwdXNoaW50IDEwMDAwMCAvLyAxMDAwMDAKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTc5LTE4NwogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICBhbW91bnQ6IHsgZ3JlYXRlclRoYW5FcTogTUJSX1BBWU1FTlRfQU1PVU5UIH0sCiAgICAvLyAgICAgc2VuZGVyOiBUeG4uc2VuZGVyLAogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgfSwKICAgIC8vICAgJ0ludmFsaWQgcGF5bWVudCB0cmFuc2FjdGlvbicsCiAgICAvLyApCiAgICA+PQogICAgZGlnIDEKICAgIGd0eG5zIFNlbmRlcgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxODMKICAgIC8vIHNlbmRlcjogVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTc5LTE4NwogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICBhbW91bnQ6IHsgZ3JlYXRlclRoYW5FcTogTUJSX1BBWU1FTlRfQU1PVU5UIH0sCiAgICAvLyAgICAgc2VuZGVyOiBUeG4uc2VuZGVyLAogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgfSwKICAgIC8vICAgJ0ludmFsaWQgcGF5bWVudCB0cmFuc2FjdGlvbicsCiAgICAvLyApCiAgICA9PQogICAgJiYKICAgIHN3YXAKICAgIGd0eG5zIFJlY2VpdmVyCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjE4NAogICAgLy8gcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTc5LTE4NwogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICBhbW91bnQ6IHsgZ3JlYXRlclRoYW5FcTogTUJSX1BBWU1FTlRfQU1PVU5UIH0sCiAgICAvLyAgICAgc2VuZGVyOiBUeG4uc2VuZGVyLAogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgfSwKICAgIC8vICAgJ0ludmFsaWQgcGF5bWVudCB0cmFuc2FjdGlvbicsCiAgICAvLyApCiAgICA9PQogICAgJiYKICAgIGFzc2VydCAvLyBJbnZhbGlkIHBheW1lbnQgdHJhbnNhY3Rpb24KICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTg5CiAgICAvLyBjb25zdCBwZXROdW1iZXI6IHVpbnQ2NCA9IHRoaXMudG90YWxQZXRzLnZhbHVlICsgVWludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo5MgogICAgLy8gdG90YWxQZXRzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyAxMiAvLyAidG90YWxQZXRzIgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxODkKICAgIC8vIGNvbnN0IHBldE51bWJlcjogdWludDY0ID0gdGhpcy50b3RhbFBldHMudmFsdWUgKyBVaW50NjQoMSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo2OTYtNzA5CiAgICAvLyByZXR1cm4gaXR4bgogICAgLy8gICAuYXNzZXRDb25maWcoewogICAgLy8gICAgIHRvdGFsOiBORlRfVE9UQUxfU1VQUExZLAogICAgLy8gICAgIGRlY2ltYWxzOiBORlRfREVDSU1BTFMsCiAgICAvLyAgICAgdW5pdE5hbWU6ICdBTEdPQ0hJJywKICAgIC8vICAgICBhc3NldE5hbWU6IGBBbGdvY2hpICMke3BldE51bWJlcn1gLAogICAgLy8gICAgIG1hbmFnZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIHJlc2VydmU6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGZyZWV6ZTogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgY2xhd2JhY2s6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIHVybDogJ2lwZnM6Ly9wZW5kaW5nJywKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKS5jcmVhdGVkQXNzZXQKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NzAxCiAgICAvLyBhc3NldE5hbWU6IGBBbGdvY2hpICMke3BldE51bWJlcn1gLAogICAgZHVwCiAgICBjYWxsc3ViIGl0b2EKICAgIHB1c2hieXRlcyAiQWxnb2NoaSAjIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjcwMgogICAgLy8gbWFuYWdlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo3MDMtNzA1CiAgICAvLyByZXNlcnZlOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vIGZyZWV6ZTogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyBjbGF3YmFjazogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBkdXBuIDMKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NzA2CiAgICAvLyB1cmw6ICdpcGZzOi8vcGVuZGluZycsCiAgICBwdXNoYnl0ZXMgImlwZnM6Ly9wZW5kaW5nIgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFVSTAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldENsYXdiYWNrCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0RnJlZXplCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0UmVzZXJ2ZQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE1hbmFnZXIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXROYW1lCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjcwMAogICAgLy8gdW5pdE5hbWU6ICdBTEdPQ0hJJywKICAgIHB1c2hieXRlcyAiQUxHT0NISSIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVbml0TmFtZQogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo2OTkKICAgIC8vIGRlY2ltYWxzOiBORlRfREVDSU1BTFMsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldERlY2ltYWxzCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjY5OAogICAgLy8gdG90YWw6IE5GVF9UT1RBTF9TVVBQTFksCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFRvdGFsCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjY5Ni03MDgKICAgIC8vIHJldHVybiBpdHhuCiAgICAvLyAgIC5hc3NldENvbmZpZyh7CiAgICAvLyAgICAgdG90YWw6IE5GVF9UT1RBTF9TVVBQTFksCiAgICAvLyAgICAgZGVjaW1hbHM6IE5GVF9ERUNJTUFMUywKICAgIC8vICAgICB1bml0TmFtZTogJ0FMR09DSEknLAogICAgLy8gICAgIGFzc2V0TmFtZTogYEFsZ29jaGkgIyR7cGV0TnVtYmVyfWAsCiAgICAvLyAgICAgbWFuYWdlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgcmVzZXJ2ZTogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgZnJlZXplOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBjbGF3YmFjazogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgdXJsOiAnaXBmczovL3BlbmRpbmcnLAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIGludGNfMyAvLyAzCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjcwNwogICAgLy8gZmVlOiAwLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjY5Ni03MDkKICAgIC8vIHJldHVybiBpdHhuCiAgICAvLyAgIC5hc3NldENvbmZpZyh7CiAgICAvLyAgICAgdG90YWw6IE5GVF9UT1RBTF9TVVBQTFksCiAgICAvLyAgICAgZGVjaW1hbHM6IE5GVF9ERUNJTUFMUywKICAgIC8vICAgICB1bml0TmFtZTogJ0FMR09DSEknLAogICAgLy8gICAgIGFzc2V0TmFtZTogYEFsZ29jaGkgIyR7cGV0TnVtYmVyfWAsCiAgICAvLyAgICAgbWFuYWdlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgcmVzZXJ2ZTogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgZnJlZXplOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBjbGF3YmFjazogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgdXJsOiAnaXBmczovL3BlbmRpbmcnLAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpLmNyZWF0ZWRBc3NldAogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFzc2V0SUQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTkxCiAgICAvLyB0aGlzLmluaXRpYWxpemVQZXRTdGF0ZShUeG4uc2VuZGVyLCBuZnQuaWQpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjM4MwogICAgLy8gY29uc3QgY29tbWl0dGVkUm91bmQgPSB0aGlzLmNhbGN1bGF0ZUNvbW1pdHRlZFJvdW5kKCkKICAgIGNhbGxzdWIgY2FsY3VsYXRlQ29tbWl0dGVkUm91bmQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6Mzg1CiAgICAvLyB0aGlzLmFzc2V0SWQoYWNjb3VudCkudmFsdWUgPSBuZnRJZAogICAgZGlnIDEKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTI0CiAgICAvLyBhc3NldElkID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCkKICAgIGJ5dGVjIDYgLy8gImFzc2V0SWQiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjM4NQogICAgLy8gdGhpcy5hc3NldElkKGFjY291bnQpLnZhbHVlID0gbmZ0SWQKICAgIGRpZyA0CiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjM4NgogICAgLy8gdGhpcy5odW5nZXIoYWNjb3VudCkudmFsdWUgPSBJTklUSUFMX0hVTkdFUgogICAgZGlnIDEKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTI1CiAgICAvLyBodW5nZXIgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKSAvLyAwLTEwMAogICAgYnl0ZWNfMCAvLyAiaHVuZ2VyIgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czozODYKICAgIC8vIHRoaXMuaHVuZ2VyKGFjY291bnQpLnZhbHVlID0gSU5JVElBTF9IVU5HRVIKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6Mzg3CiAgICAvLyB0aGlzLmhhcHBpbmVzcyhhY2NvdW50KS52YWx1ZSA9IElOSVRJQUxfSEFQUElORVNTCiAgICBkaWcgMQogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxMjYKICAgIC8vIGhhcHBpbmVzcyA9IExvY2FsU3RhdGU8dWludDY0PigpIC8vIDAtMTAwCiAgICBieXRlY18xIC8vICJoYXBwaW5lc3MiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjM4NwogICAgLy8gdGhpcy5oYXBwaW5lc3MoYWNjb3VudCkudmFsdWUgPSBJTklUSUFMX0hBUFBJTkVTUwogICAgcHVzaGludCA4MCAvLyA4MAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czozODgKICAgIC8vIHRoaXMuYWdlRGF5cyhhY2NvdW50KS52YWx1ZSA9IFVpbnQ2NCgwKQogICAgZGlnIDEKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTI3CiAgICAvLyBhZ2VEYXlzID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCkgLy8gMC0yNTUKICAgIGJ5dGVjIDEwIC8vICJhZ2VEYXlzIgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czozODgKICAgIC8vIHRoaXMuYWdlRGF5cyhhY2NvdW50KS52YWx1ZSA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6Mzg5CiAgICAvLyB0aGlzLnN0YWdlKGFjY291bnQpLnZhbHVlID0gU1RBR0VfQkFCWQogICAgZGlnIDEKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTI4CiAgICAvLyBzdGFnZSA9IExvY2FsU3RhdGU8dWludDY0PigpIC8vIDA9YmFieSwgMT10ZWVuLCAyPWFkdWx0CiAgICBieXRlYyA3IC8vICJzdGFnZSIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6Mzg5CiAgICAvLyB0aGlzLnN0YWdlKGFjY291bnQpLnZhbHVlID0gU1RBR0VfQkFCWQogICAgaW50Y18wIC8vIDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MzkwCiAgICAvLyB0aGlzLmxhc3RVcGRhdGUoYWNjb3VudCkudmFsdWUgPSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkaWcgMgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxMjkKICAgIC8vIGxhc3RVcGRhdGUgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKSAvLyBVbml4IHRpbWVzdGFtcAogICAgYnl0ZWMgOCAvLyAibGFzdFVwZGF0ZSIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MzkwCiAgICAvLyB0aGlzLmxhc3RVcGRhdGUoYWNjb3VudCkudmFsdWUgPSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICB1bmNvdmVyIDIKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MzkxCiAgICAvLyB0aGlzLmlzRGVhZChhY2NvdW50KS52YWx1ZSA9IGZhbHNlCiAgICBkaWcgMQogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxMzAKICAgIC8vIGlzRGVhZCA9IExvY2FsU3RhdGU8Ym9vbGVhbj4oKQogICAgYnl0ZWNfMyAvLyAiaXNEZWFkIgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czozOTEKICAgIC8vIHRoaXMuaXNEZWFkKGFjY291bnQpLnZhbHVlID0gZmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjM5MgogICAgLy8gdGhpcy50cmFpdHNGaW5hbGl6ZWQoYWNjb3VudCkudmFsdWUgPSBmYWxzZQogICAgZGlnIDEKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTQwCiAgICAvLyB0cmFpdHNGaW5hbGl6ZWQgPSBMb2NhbFN0YXRlPGJvb2xlYW4+KCkKICAgIGJ5dGVjIDE4IC8vICJ0cmFpdHNGaW5hbGl6ZWQiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjM5MgogICAgLy8gdGhpcy50cmFpdHNGaW5hbGl6ZWQoYWNjb3VudCkudmFsdWUgPSBmYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MzkzCiAgICAvLyB0aGlzLmNvbW1pdHRlZFJvdW5kKGFjY291bnQpLnZhbHVlID0gY29tbWl0dGVkUm91bmQKICAgIGRpZyAxCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEzMwogICAgLy8gY29tbWl0dGVkUm91bmQgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKSAvLyBSb3VuZCBjb21taXR0ZWQgZm9yIFZSRgogICAgYnl0ZWNfMiAvLyAiY29tbWl0dGVkUm91bmQiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjM5MwogICAgLy8gdGhpcy5jb21taXR0ZWRSb3VuZChhY2NvdW50KS52YWx1ZSA9IGNvbW1pdHRlZFJvdW5kCiAgICB1bmNvdmVyIDIKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6Mzk0CiAgICAvLyB0aGlzLmZlZWRIdW5nZXJTbmFwc2hvdChhY2NvdW50KS52YWx1ZSA9IFVpbnQ2NCgwKQogICAgZHVwCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEzNAogICAgLy8gZmVlZEh1bmdlclNuYXBzaG90ID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCkgLy8gSHVuZ2VyIGF0IGZlZWQgdGltZSAoZm9yIHBsYXkgYm9vc3QgY2FsY3VsYXRpb24pCiAgICBieXRlYyAxMSAvLyAiZmVlZEh1bmdlclNuYXBzaG90IgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czozOTQKICAgIC8vIHRoaXMuZmVlZEh1bmdlclNuYXBzaG90KGFjY291bnQpLnZhbHVlID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czozOTUKICAgIC8vIHRoaXMudHJhaXRDb2xvcihhY2NvdW50KS52YWx1ZSA9IFVpbnQ2NCgwKQogICAgZHVwCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEzNwogICAgLy8gdHJhaXRDb2xvciA9IExvY2FsU3RhdGU8dWludDY0PigpIC8vIDAtMTUKICAgIGJ5dGVjIDM0IC8vICJ0cmFpdENvbG9yIgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czozOTUKICAgIC8vIHRoaXMudHJhaXRDb2xvcihhY2NvdW50KS52YWx1ZSA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6Mzk2CiAgICAvLyB0aGlzLnRyYWl0UGF0dGVybihhY2NvdW50KS52YWx1ZSA9IFVpbnQ2NCgwKQogICAgZHVwCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEzOAogICAgLy8gdHJhaXRQYXR0ZXJuID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCkgLy8gMC03CiAgICBieXRlYyAzNSAvLyAidHJhaXRQYXR0ZXJuIgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czozOTYKICAgIC8vIHRoaXMudHJhaXRQYXR0ZXJuKGFjY291bnQpLnZhbHVlID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxMzkKICAgIC8vIHRyYWl0QWNjZXNzb3J5ID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCkgLy8gMC03CiAgICBieXRlYyAzNiAvLyAidHJhaXRBY2Nlc3NvcnkiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjM5NwogICAgLy8gdGhpcy50cmFpdEFjY2Vzc29yeShhY2NvdW50KS52YWx1ZSA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6OTIKICAgIC8vIHRvdGFsUGV0cyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgMTIgLy8gInRvdGFsUGV0cyIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTkyCiAgICAvLyB0aGlzLnRvdGFsUGV0cy52YWx1ZSA9IHBldE51bWJlcgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxNzcKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6ICdPcHRJbicgfSkKICAgIGl0b2IKICAgIGJ5dGVjIDUgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjpBbGdvY2hpLmZlZWRbcm91dGluZ10oKSAtPiB2b2lkOgpmZWVkOgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoyMDIKICAgIC8vIGNvbnN0IHNlbmRlciA9IFR4bi5zZW5kZXIKICAgIHR4biBTZW5kZXIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MjAzCiAgICAvLyB0aGlzLnVwZGF0ZVN0YXRlKHNlbmRlcikKICAgIGR1cAogICAgY2FsbHN1YiB1cGRhdGVTdGF0ZQogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoyMDUKICAgIC8vIGNvbnN0IG5ld0h1bmdlciA9IHRoaXMuaW5jcmVhc2VTdGF0KHRoaXMuaHVuZ2VyKHNlbmRlcikudmFsdWUsIHRoaXMuaHVuZ2VySW5jcmVhc2UudmFsdWUsIHRoaXMubWF4U3RhdC52YWx1ZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTI1CiAgICAvLyBodW5nZXIgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKSAvLyAwLTEwMAogICAgYnl0ZWNfMCAvLyAiaHVuZ2VyIgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoyMDUKICAgIC8vIGNvbnN0IG5ld0h1bmdlciA9IHRoaXMuaW5jcmVhc2VTdGF0KHRoaXMuaHVuZ2VyKHNlbmRlcikudmFsdWUsIHRoaXMuaHVuZ2VySW5jcmVhc2UudmFsdWUsIHRoaXMubWF4U3RhdC52YWx1ZSkKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTA2CiAgICAvLyBodW5nZXJJbmNyZWFzZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IERFRkFVTFRfSFVOR0VSX0lOQ1JFQVNFIH0pCiAgICBieXRlYyAyMyAvLyAiaHVuZ2VySW5jcmVhc2UiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjIwNQogICAgLy8gY29uc3QgbmV3SHVuZ2VyID0gdGhpcy5pbmNyZWFzZVN0YXQodGhpcy5odW5nZXIoc2VuZGVyKS52YWx1ZSwgdGhpcy5odW5nZXJJbmNyZWFzZS52YWx1ZSwgdGhpcy5tYXhTdGF0LnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEwMQogICAgLy8gbWF4U3RhdCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IERFRkFVTFRfTUFYX1NUQVQgfSkKICAgIGJ5dGVjIDQgLy8gIm1heFN0YXQiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjIwNQogICAgLy8gY29uc3QgbmV3SHVuZ2VyID0gdGhpcy5pbmNyZWFzZVN0YXQodGhpcy5odW5nZXIoc2VuZGVyKS52YWx1ZSwgdGhpcy5odW5nZXJJbmNyZWFzZS52YWx1ZSwgdGhpcy5tYXhTdGF0LnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NTM4CiAgICAvLyByZXR1cm4gdGhpcy5jbGFtcChjdXJyZW50VmFsdWUgKyBpbmNyZWFzZSwgVWludDY0KDApLCBtYXhWYWx1ZSkKICAgIGNvdmVyIDIKICAgICsKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgY2xhbXAKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MjA2CiAgICAvLyB0aGlzLmh1bmdlcihzZW5kZXIpLnZhbHVlID0gbmV3SHVuZ2VyCiAgICBkaWcgMQogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxMjUKICAgIC8vIGh1bmdlciA9IExvY2FsU3RhdGU8dWludDY0PigpIC8vIDAtMTAwCiAgICBieXRlY18wIC8vICJodW5nZXIiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjIwNgogICAgLy8gdGhpcy5odW5nZXIoc2VuZGVyKS52YWx1ZSA9IG5ld0h1bmdlcgogICAgZGlnIDIKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NDUzCiAgICAvLyBjb25zdCBjb21taXR0ZWRSb3VuZCA9IHRoaXMuY2FsY3VsYXRlQ29tbWl0dGVkUm91bmQoKQogICAgY2FsbHN1YiBjYWxjdWxhdGVDb21taXR0ZWRSb3VuZAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo0NTQKICAgIC8vIHRoaXMuY29tbWl0dGVkUm91bmQoYWNjb3VudCkudmFsdWUgPSBjb21taXR0ZWRSb3VuZAogICAgZGlnIDIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTMzCiAgICAvLyBjb21taXR0ZWRSb3VuZCA9IExvY2FsU3RhdGU8dWludDY0PigpIC8vIFJvdW5kIGNvbW1pdHRlZCBmb3IgVlJGCiAgICBieXRlY18yIC8vICJjb21taXR0ZWRSb3VuZCIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NDU0CiAgICAvLyB0aGlzLmNvbW1pdHRlZFJvdW5kKGFjY291bnQpLnZhbHVlID0gY29tbWl0dGVkUm91bmQKICAgIHVuY292ZXIgMgogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo0NTUKICAgIC8vIHRoaXMuZmVlZEh1bmdlclNuYXBzaG90KGFjY291bnQpLnZhbHVlID0gaHVuZ2VyU25hcHNob3QKICAgIGRpZyAxCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEzNAogICAgLy8gZmVlZEh1bmdlclNuYXBzaG90ID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCkgLy8gSHVuZ2VyIGF0IGZlZWQgdGltZSAoZm9yIHBsYXkgYm9vc3QgY2FsY3VsYXRpb24pCiAgICBieXRlYyAxMSAvLyAiZmVlZEh1bmdlclNuYXBzaG90IgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo0NTUKICAgIC8vIHRoaXMuZmVlZEh1bmdlclNuYXBzaG90KGFjY291bnQpLnZhbHVlID0gaHVuZ2VyU25hcHNob3QKICAgIHVuY292ZXIgMgogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoyMDkKICAgIC8vIHRoaXMuZGlzcGVuc2VIZWFsdGhTY2FsZWRSZXdhcmQoc2VuZGVyKQogICAgY2FsbHN1YiBkaXNwZW5zZUhlYWx0aFNjYWxlZFJld2FyZAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoyMDEKICAgIC8vIGZlZWQoKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc3JjL2FsZ29jaGkuYWxnby50czo6QWxnb2NoaS5wbGF5W3JvdXRpbmddKCkgLT4gdm9pZDoKcGxheToKICAgIHB1c2hieXRlcyAiIgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoyMTcKICAgIC8vIGNvbnN0IHNlbmRlciA9IFR4bi5zZW5kZXIKICAgIHR4biBTZW5kZXIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MjE3LTIxOAogICAgLy8gY29uc3Qgc2VuZGVyID0gVHhuLnNlbmRlcgogICAgLy8gdGhpcy51cGRhdGVTdGF0ZShzZW5kZXIpCiAgICBkdXBuIDIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MjE4CiAgICAvLyB0aGlzLnVwZGF0ZVN0YXRlKHNlbmRlcikKICAgIGNhbGxzdWIgdXBkYXRlU3RhdGUKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MjIwCiAgICAvLyB0aGlzLmVuc3VyZVZyZlJlYWR5KHNlbmRlcikKICAgIGR1cAogICAgY2FsbHN1YiBlbnN1cmVWcmZSZWFkeQogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoyMjIKICAgIC8vIGNvbnN0IGNvbW1pdHRlZFJvdW5kID0gdGhpcy5jb21taXR0ZWRSb3VuZChzZW5kZXIpLnZhbHVlCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEzMwogICAgLy8gY29tbWl0dGVkUm91bmQgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKSAvLyBSb3VuZCBjb21taXR0ZWQgZm9yIFZSRgogICAgYnl0ZWNfMiAvLyAiY29tbWl0dGVkUm91bmQiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjIyMgogICAgLy8gY29uc3QgY29tbWl0dGVkUm91bmQgPSB0aGlzLmNvbW1pdHRlZFJvdW5kKHNlbmRlcikudmFsdWUKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoyMjMKICAgIC8vIGNvbnN0IFtyYW5kb21uZXNzLCBoYXNSYW5kb21uZXNzXSA9IHRoaXMuZmV0Y2hSYW5kb21uZXNzKHNlbmRlciwgY29tbWl0dGVkUm91bmQsICdwZXQnKQogICAgcHVzaGJ5dGVzICJwZXQiCiAgICBjYWxsc3ViIGZldGNoUmFuZG9tbmVzcwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIGRpZyAyCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCAxNiAvLyAxNgogICAgZ2V0Yml0CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjUwNAogICAgLy8gaWYgKCFoYXNSYW5kb21uZXNzKSB7CiAgICBibnogcGxheV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NTA1CiAgICAvLyByZXR1cm4gVlJGX0JPT1NUX0ZBTExCQUNLCiAgICBwdXNoaW50IDIwIC8vIDIwCgpwbGF5X2FmdGVyX2lubGluZWRfc3JjL2FsZ29jaGkuYWxnby50czo6QWxnb2NoaS5jYWxjdWxhdGVWcmZCb29zdEA0OgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoyMjYKICAgIC8vIGNvbnN0IGh1bmdlclNuYXBzaG90ID0gdGhpcy5mZWVkSHVuZ2VyU25hcHNob3Qoc2VuZGVyKS52YWx1ZQogICAgZGlnIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTM0CiAgICAvLyBmZWVkSHVuZ2VyU25hcHNob3QgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKSAvLyBIdW5nZXIgYXQgZmVlZCB0aW1lIChmb3IgcGxheSBib29zdCBjYWxjdWxhdGlvbikKICAgIGJ5dGVjIDExIC8vICJmZWVkSHVuZ2VyU25hcHNob3QiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjIyNgogICAgLy8gY29uc3QgaHVuZ2VyU25hcHNob3QgPSB0aGlzLmZlZWRIdW5nZXJTbmFwc2hvdChzZW5kZXIpLnZhbHVlCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NTE3CiAgICAvLyByZXR1cm4gKGJhc2VCb29zdCAqIGh1bmdlclNuYXBzaG90KSAvIHRoaXMubWF4U3RhdC52YWx1ZQogICAgdW5jb3ZlciAyCiAgICAqCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxMDEKICAgIC8vIG1heFN0YXQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBERUZBVUxUX01BWF9TVEFUIH0pCiAgICBieXRlYyA0IC8vICJtYXhTdGF0IgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo1MTcKICAgIC8vIHJldHVybiAoYmFzZUJvb3N0ICogaHVuZ2VyU25hcHNob3QpIC8gdGhpcy5tYXhTdGF0LnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLwogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoyMjkKICAgIC8vIHRoaXMuYXBwbHlIYXBwaW5lc3NCb29zdChzZW5kZXIsIGZpbmFsQm9vc3QpCiAgICBkaWcgMQogICAgc3dhcAogICAgY2FsbHN1YiBhcHBseUhhcHBpbmVzc0Jvb3N0CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjU1MwogICAgLy8gY29uc3QgY3VycmVudEh1bmdlciA9IHRoaXMuaHVuZ2VyKGFjY291bnQpLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxMjUKICAgIC8vIGh1bmdlciA9IExvY2FsU3RhdGU8dWludDY0PigpIC8vIDAtMTAwCiAgICBieXRlY18wIC8vICJodW5nZXIiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjU1MwogICAgLy8gY29uc3QgY3VycmVudEh1bmdlciA9IHRoaXMuaHVuZ2VyKGFjY291bnQpLnZhbHVlCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgNQogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjU1NQogICAgLy8gY3VycmVudEh1bmdlciA+IHRoaXMucGV0SHVuZ2VyQ29zdC52YWx1ZSA/IGN1cnJlbnRIdW5nZXIgLSB0aGlzLnBldEh1bmdlckNvc3QudmFsdWUgOiBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEwNwogICAgLy8gcGV0SHVuZ2VyQ29zdCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IERFRkFVTFRfUEVUX0hVTkdFUl9DT1NUIH0pCiAgICBieXRlYyAxNiAvLyAicGV0SHVuZ2VyQ29zdCIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NTU1CiAgICAvLyBjdXJyZW50SHVuZ2VyID4gdGhpcy5wZXRIdW5nZXJDb3N0LnZhbHVlID8gY3VycmVudEh1bmdlciAtIHRoaXMucGV0SHVuZ2VyQ29zdC52YWx1ZSA6IFVpbnQ2NCgwKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID4KICAgIGJ6IHBsYXlfdGVybmFyeV9mYWxzZUA5CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxMDcKICAgIC8vIHBldEh1bmdlckNvc3QgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBERUZBVUxUX1BFVF9IVU5HRVJfQ09TVCB9KQogICAgYnl0ZWMgMTYgLy8gInBldEh1bmdlckNvc3QiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjU1NQogICAgLy8gY3VycmVudEh1bmdlciA+IHRoaXMucGV0SHVuZ2VyQ29zdC52YWx1ZSA/IGN1cnJlbnRIdW5nZXIgLSB0aGlzLnBldEh1bmdlckNvc3QudmFsdWUgOiBVaW50NjQoMCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMwogICAgc3dhcAogICAgLQoKcGxheV90ZXJuYXJ5X21lcmdlQDEwOgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo1NTYKICAgIC8vIHRoaXMuaHVuZ2VyKGFjY291bnQpLnZhbHVlID0gbmV3SHVuZ2VyCiAgICBkaWcgMgogICAgZHVwCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEyNQogICAgLy8gaHVuZ2VyID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCkgLy8gMC0xMDAKICAgIGJ5dGVjXzAgLy8gImh1bmdlciIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NTU2CiAgICAvLyB0aGlzLmh1bmdlcihhY2NvdW50KS52YWx1ZSA9IG5ld0h1bmdlcgogICAgdW5jb3ZlciAzCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjIzMgogICAgLy8gdGhpcy5kaXNwZW5zZUhlYWx0aFNjYWxlZFJld2FyZChzZW5kZXIpCiAgICBkdXAKICAgIGNhbGxzdWIgZGlzcGVuc2VIZWFsdGhTY2FsZWRSZXdhcmQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NDYyCiAgICAvLyB0aGlzLmNvbW1pdHRlZFJvdW5kKGFjY291bnQpLnZhbHVlID0gVWludDY0KDApCiAgICBkdXAKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTMzCiAgICAvLyBjb21taXR0ZWRSb3VuZCA9IExvY2FsU3RhdGU8dWludDY0PigpIC8vIFJvdW5kIGNvbW1pdHRlZCBmb3IgVlJGCiAgICBieXRlY18yIC8vICJjb21taXR0ZWRSb3VuZCIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NDYyCiAgICAvLyB0aGlzLmNvbW1pdHRlZFJvdW5kKGFjY291bnQpLnZhbHVlID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxMzQKICAgIC8vIGZlZWRIdW5nZXJTbmFwc2hvdCA9IExvY2FsU3RhdGU8dWludDY0PigpIC8vIEh1bmdlciBhdCBmZWVkIHRpbWUgKGZvciBwbGF5IGJvb3N0IGNhbGN1bGF0aW9uKQogICAgYnl0ZWMgMTEgLy8gImZlZWRIdW5nZXJTbmFwc2hvdCIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NDYzCiAgICAvLyB0aGlzLmZlZWRIdW5nZXJTbmFwc2hvdChhY2NvdW50KS52YWx1ZSA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MjE2CiAgICAvLyBwbGF5KCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcGxheV90ZXJuYXJ5X2ZhbHNlQDk6CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjU1NQogICAgLy8gY3VycmVudEh1bmdlciA+IHRoaXMucGV0SHVuZ2VyQ29zdC52YWx1ZSA/IGN1cnJlbnRIdW5nZXIgLSB0aGlzLnBldEh1bmdlckNvc3QudmFsdWUgOiBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBiIHBsYXlfdGVybmFyeV9tZXJnZUAxMAoKcGxheV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjUwOAogICAgLy8gY29uc3QgZmlyc3RCeXRlID0gb3AuYnRvaShyYW5kb21uZXNzLnNsaWNlKDAsIDEpKQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMCAvLyAwCiAgICBkaWcgMQogICAgPj0KICAgIGludGNfMCAvLyAwCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGludGNfMSAvLyAxCiAgICBkaWcgMgogICAgPj0KICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBidG9pCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjUwOQogICAgLy8gcmV0dXJuIChmaXJzdEJ5dGUgJSBWUkZfQk9PU1RfTU9EVUxPKSArIFZSRl9CT09TVF9NSU4KICAgIHB1c2hpbnQgMzEgLy8gMzEKICAgICUKICAgIGludGNfMiAvLyAxMAogICAgKwogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoyMjQKICAgIC8vIGNvbnN0IGJhc2VCb29zdCA9IHRoaXMuY2FsY3VsYXRlVnJmQm9vc3QocmFuZG9tbmVzcywgaGFzUmFuZG9tbmVzcykKICAgIGIgcGxheV9hZnRlcl9pbmxpbmVkX3NyYy9hbGdvY2hpLmFsZ28udHM6OkFsZ29jaGkuY2FsY3VsYXRlVnJmQm9vc3RANAoKCi8vIHNyYy9hbGdvY2hpLmFsZ28udHM6OkFsZ29jaGkuZXZvbHZlW3JvdXRpbmddKCkgLT4gdm9pZDoKZXZvbHZlOgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoyNDEKICAgIC8vIGNvbnN0IHNlbmRlciA9IFR4bi5zZW5kZXIKICAgIHR4biBTZW5kZXIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MjQxLTI0MgogICAgLy8gY29uc3Qgc2VuZGVyID0gVHhuLnNlbmRlcgogICAgLy8gdGhpcy51cGRhdGVTdGF0ZShzZW5kZXIpCiAgICBkdXBuIDIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MjQyCiAgICAvLyB0aGlzLnVwZGF0ZVN0YXRlKHNlbmRlcikKICAgIGNhbGxzdWIgdXBkYXRlU3RhdGUKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NjYxCiAgICAvLyBjb25zdCBjdXJyZW50U3RhZ2UgPSB0aGlzLnN0YWdlKGFjY291bnQpLnZhbHVlCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEyOAogICAgLy8gc3RhZ2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKSAvLyAwPWJhYnksIDE9dGVlbiwgMj1hZHVsdAogICAgYnl0ZWMgNyAvLyAic3RhZ2UiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjY2MQogICAgLy8gY29uc3QgY3VycmVudFN0YWdlID0gdGhpcy5zdGFnZShhY2NvdW50KS52YWx1ZQogICAgYXBwX2xvY2FsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NjYyCiAgICAvLyBjb25zdCBhZ2UgPSB0aGlzLmFnZURheXMoYWNjb3VudCkudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEyNwogICAgLy8gYWdlRGF5cyA9IExvY2FsU3RhdGU8dWludDY0PigpIC8vIDAtMjU1CiAgICBieXRlYyAxMCAvLyAiYWdlRGF5cyIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NjYyCiAgICAvLyBjb25zdCBhZ2UgPSB0aGlzLmFnZURheXMoYWNjb3VudCkudmFsdWUKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo2NjQKICAgIC8vIGlmIChjdXJyZW50U3RhZ2UgPT09IFNUQUdFX0JBQlkgJiYgYWdlID49IEFHRV9CQUJZX1RPX1RFRU4pIHsKICAgIGJueiBldm9sdmVfYWZ0ZXJfaWZfZWxzZUA0CiAgICBkdXAKICAgIGludGNfMyAvLyAzCiAgICA+PQogICAgYnogZXZvbHZlX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo2NjUKICAgIC8vIHJldHVybiBTVEFHRV9URUVOCiAgICBpbnRjXzEgLy8gMQoKZXZvbHZlX2FmdGVyX2lubGluZWRfc3JjL2FsZ29jaGkuYWxnby50czo6QWxnb2NoaS5uZXh0U3RhZ2VGb3JFdm9sdXRpb25AODoKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MjQ1CiAgICAvLyBhc3NlcnQobmV4dFN0YWdlID4gdGhpcy5zdGFnZShzZW5kZXIpLnZhbHVlLCAnTm90IHJlYWR5IHRvIGV2b2x2ZScpCiAgICBkaWcgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxMjgKICAgIC8vIHN0YWdlID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCkgLy8gMD1iYWJ5LCAxPXRlZW4sIDI9YWR1bHQKICAgIGJ5dGVjIDcgLy8gInN0YWdlIgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoyNDUKICAgIC8vIGFzc2VydChuZXh0U3RhZ2UgPiB0aGlzLnN0YWdlKHNlbmRlcikudmFsdWUsICdOb3QgcmVhZHkgdG8gZXZvbHZlJykKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgdW5jb3ZlciAyCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPgogICAgYXNzZXJ0IC8vIE5vdCByZWFkeSB0byBldm9sdmUKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MjQ3CiAgICAvLyB0aGlzLmJ1cm5SZXdhcmRzKHNlbmRlciwgdGhpcy5ldm9sdmVDb3N0LnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTE0CiAgICAvLyBldm9sdmVDb3N0ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogREVGQVVMVF9FVk9MVkVfQ09TVCB9KQogICAgYnl0ZWMgMjggLy8gImV2b2x2ZUNvc3QiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjI0NwogICAgLy8gdGhpcy5idXJuUmV3YXJkcyhzZW5kZXIsIHRoaXMuZXZvbHZlQ29zdC52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBidXJuUmV3YXJkcwogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoyNDgKICAgIC8vIHRoaXMuc3RhZ2Uoc2VuZGVyKS52YWx1ZSA9IG5leHRTdGFnZQogICAgZGlnIDEKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTI4CiAgICAvLyBzdGFnZSA9IExvY2FsU3RhdGU8dWludDY0PigpIC8vIDA9YmFieSwgMT10ZWVuLCAyPWFkdWx0CiAgICBieXRlYyA3IC8vICJzdGFnZSIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MjQ4CiAgICAvLyB0aGlzLnN0YWdlKHNlbmRlcikudmFsdWUgPSBuZXh0U3RhZ2UKICAgIHVuY292ZXIgMgogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoyNDkKICAgIC8vIHRoaXMuYXBwbHlIYXBwaW5lc3NCb29zdChzZW5kZXIsIEVWT0xWRV9IQVBQSU5FU1NfQk9PU1QpCiAgICBwdXNoaW50IDMwIC8vIDMwCiAgICBjYWxsc3ViIGFwcGx5SGFwcGluZXNzQm9vc3QKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MjQwCiAgICAvLyBldm9sdmUoKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpldm9sdmVfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo2NjgKICAgIC8vIGlmIChjdXJyZW50U3RhZ2UgPT09IFNUQUdFX1RFRU4gJiYgYWdlID49IEFHRV9URUVOX1RPX0FEVUxUKSB7CiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBldm9sdmVfYWZ0ZXJfaWZfZWxzZUA3CiAgICBkdXAKICAgIHB1c2hpbnQgNyAvLyA3CiAgICA+PQogICAgYnogZXZvbHZlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo2NjkKICAgIC8vIHJldHVybiBTVEFHRV9BRFVMVAogICAgcHVzaGludCAyIC8vIDIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MjQ0CiAgICAvLyBjb25zdCBuZXh0U3RhZ2UgPSB0aGlzLm5leHRTdGFnZUZvckV2b2x1dGlvbihzZW5kZXIpCiAgICBiIGV2b2x2ZV9hZnRlcl9pbmxpbmVkX3NyYy9hbGdvY2hpLmFsZ28udHM6OkFsZ29jaGkubmV4dFN0YWdlRm9yRXZvbHV0aW9uQDgKCmV2b2x2ZV9hZnRlcl9pZl9lbHNlQDc6CiAgICBkaWcgMQogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoyNDQKICAgIC8vIGNvbnN0IG5leHRTdGFnZSA9IHRoaXMubmV4dFN0YWdlRm9yRXZvbHV0aW9uKHNlbmRlcikKICAgIGIgZXZvbHZlX2FmdGVyX2lubGluZWRfc3JjL2FsZ29jaGkuYWxnby50czo6QWxnb2NoaS5uZXh0U3RhZ2VGb3JFdm9sdXRpb25AOAoKCi8vIHNyYy9hbGdvY2hpLmFsZ28udHM6OkFsZ29jaGkucmV2aXZlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmV2aXZlOgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoyNTYKICAgIC8vIGNvbnN0IHNlbmRlciA9IFR4bi5zZW5kZXIKICAgIHR4biBTZW5kZXIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NDE4CiAgICAvLyBhc3NlcnQodGhpcy5hc3NldElkKGFjY291bnQpLmhhc1ZhbHVlLCAnUGV0IG5vdCBjcmVhdGVkJykKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTI0CiAgICAvLyBhc3NldElkID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCkKICAgIGJ5dGVjIDYgLy8gImFzc2V0SWQiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjQxOAogICAgLy8gYXNzZXJ0KHRoaXMuYXNzZXRJZChhY2NvdW50KS5oYXNWYWx1ZSwgJ1BldCBub3QgY3JlYXRlZCcpCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBQZXQgbm90IGNyZWF0ZWQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MjU4CiAgICAvLyBhc3NlcnQodGhpcy5pc0RlYWQoc2VuZGVyKS52YWx1ZSA9PT0gdHJ1ZSwgJ1BldCBpcyBub3QgZGVhZCcpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEzMAogICAgLy8gaXNEZWFkID0gTG9jYWxTdGF0ZTxib29sZWFuPigpCiAgICBieXRlY18zIC8vICJpc0RlYWQiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjI1OAogICAgLy8gYXNzZXJ0KHRoaXMuaXNEZWFkKHNlbmRlcikudmFsdWUgPT09IHRydWUsICdQZXQgaXMgbm90IGRlYWQnKQogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBQZXQgaXMgbm90IGRlYWQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MjYwCiAgICAvLyB0aGlzLmJ1cm5SZXdhcmRzKHNlbmRlciwgdGhpcy5yZXZpdmVDb3N0LnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTE1CiAgICAvLyByZXZpdmVDb3N0ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogREVGQVVMVF9SRVZJVkVfQ09TVCB9KQogICAgYnl0ZWMgMjkgLy8gInJldml2ZUNvc3QiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjI2MAogICAgLy8gdGhpcy5idXJuUmV3YXJkcyhzZW5kZXIsIHRoaXMucmV2aXZlQ29zdC52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMQogICAgc3dhcAogICAgY2FsbHN1YiBidXJuUmV3YXJkcwogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo0MDQKICAgIC8vIHRoaXMuaXNEZWFkKGFjY291bnQpLnZhbHVlID0gZmFsc2UKICAgIGR1cAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxMzAKICAgIC8vIGlzRGVhZCA9IExvY2FsU3RhdGU8Ym9vbGVhbj4oKQogICAgYnl0ZWNfMyAvLyAiaXNEZWFkIgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo0MDQKICAgIC8vIHRoaXMuaXNEZWFkKGFjY291bnQpLnZhbHVlID0gZmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjQwNQogICAgLy8gdGhpcy5odW5nZXIoYWNjb3VudCkudmFsdWUgPSBSRVZJVkVfSFVOR0VSCiAgICBkdXAKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTI1CiAgICAvLyBodW5nZXIgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKSAvLyAwLTEwMAogICAgYnl0ZWNfMCAvLyAiaHVuZ2VyIgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo0MDUKICAgIC8vIHRoaXMuaHVuZ2VyKGFjY291bnQpLnZhbHVlID0gUkVWSVZFX0hVTkdFUgogICAgcHVzaGludCA1MCAvLyA1MAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo0MDYKICAgIC8vIHRoaXMuaGFwcGluZXNzKGFjY291bnQpLnZhbHVlID0gUkVWSVZFX0hBUFBJTkVTUwogICAgZHVwCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEyNgogICAgLy8gaGFwcGluZXNzID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCkgLy8gMC0xMDAKICAgIGJ5dGVjXzEgLy8gImhhcHBpbmVzcyIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NDA2CiAgICAvLyB0aGlzLmhhcHBpbmVzcyhhY2NvdW50KS52YWx1ZSA9IFJFVklWRV9IQVBQSU5FU1MKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTI5CiAgICAvLyBsYXN0VXBkYXRlID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCkgLy8gVW5peCB0aW1lc3RhbXAKICAgIGJ5dGVjIDggLy8gImxhc3RVcGRhdGUiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjQwNwogICAgLy8gdGhpcy5sYXN0VXBkYXRlKGFjY291bnQpLnZhbHVlID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoyNTUKICAgIC8vIHJldml2ZSgpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjpBbGdvY2hpLmZpbmFsaXplVHJhaXRzW3JvdXRpbmddKCkgLT4gdm9pZDoKZmluYWxpemVUcmFpdHM6CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjI2OQogICAgLy8gY29uc3Qgc2VuZGVyID0gVHhuLnNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgZHVwbiAyCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjQxOAogICAgLy8gYXNzZXJ0KHRoaXMuYXNzZXRJZChhY2NvdW50KS5oYXNWYWx1ZSwgJ1BldCBub3QgY3JlYXRlZCcpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxMjQKICAgIC8vIGFzc2V0SWQgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKQogICAgYnl0ZWMgNiAvLyAiYXNzZXRJZCIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NDE4CiAgICAvLyBhc3NlcnQodGhpcy5hc3NldElkKGFjY291bnQpLmhhc1ZhbHVlLCAnUGV0IG5vdCBjcmVhdGVkJykKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIFBldCBub3QgY3JlYXRlZAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoyNzEKICAgIC8vIGFzc2VydCghdGhpcy50cmFpdHNGaW5hbGl6ZWQoc2VuZGVyKS52YWx1ZSwgJ1RyYWl0cyBhbHJlYWR5IGZpbmFsaXplZCcpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjE0MAogICAgLy8gdHJhaXRzRmluYWxpemVkID0gTG9jYWxTdGF0ZTxib29sZWFuPigpCiAgICBieXRlYyAxOCAvLyAidHJhaXRzRmluYWxpemVkIgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoyNzEKICAgIC8vIGFzc2VydCghdGhpcy50cmFpdHNGaW5hbGl6ZWQoc2VuZGVyKS52YWx1ZSwgJ1RyYWl0cyBhbHJlYWR5IGZpbmFsaXplZCcpCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBUcmFpdHMgYWxyZWFkeSBmaW5hbGl6ZWQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MjczCiAgICAvLyB0aGlzLmVuc3VyZVZyZlJlYWR5KHNlbmRlcikKICAgIGR1cAogICAgY2FsbHN1YiBlbnN1cmVWcmZSZWFkeQogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoyNzUKICAgIC8vIGNvbnN0IGNvbW1pdHRlZFJvdW5kID0gdGhpcy5jb21taXR0ZWRSb3VuZChzZW5kZXIpLnZhbHVlCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEzMwogICAgLy8gY29tbWl0dGVkUm91bmQgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKSAvLyBSb3VuZCBjb21taXR0ZWQgZm9yIFZSRgogICAgYnl0ZWNfMiAvLyAiY29tbWl0dGVkUm91bmQiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjI3NQogICAgLy8gY29uc3QgY29tbWl0dGVkUm91bmQgPSB0aGlzLmNvbW1pdHRlZFJvdW5kKHNlbmRlcikudmFsdWUKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoyNzYKICAgIC8vIGNvbnN0IFtyYW5kb21uZXNzLCBoYXNSYW5kb21uZXNzXSA9IHRoaXMuZmV0Y2hSYW5kb21uZXNzKHNlbmRlciwgY29tbWl0dGVkUm91bmQsICd0cmFpdHMnKQogICAgcHVzaGJ5dGVzICJ0cmFpdHMiCiAgICBjYWxsc3ViIGZldGNoUmFuZG9tbmVzcwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIGRpZyAyCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCAxNiAvLyAxNgogICAgZ2V0Yml0CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjI3OAogICAgLy8gaWYgKGhhc1JhbmRvbW5lc3MpIHsKICAgIGJ6IGZpbmFsaXplVHJhaXRzX2Vsc2VfYm9keUAzCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjI3OQogICAgLy8gdGhpcy5hcHBseVRyYWl0Qnl0ZXMoc2VuZGVyLCByYW5kb21uZXNzKQogICAgZHVwMgogICAgY2FsbHN1YiBhcHBseVRyYWl0Qnl0ZXMKCmZpbmFsaXplVHJhaXRzX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6Mjg1CiAgICAvLyB0aGlzLnRyYWl0c0ZpbmFsaXplZChzZW5kZXIpLnZhbHVlID0gdHJ1ZQogICAgZGlnIDEKICAgIGR1cAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxNDAKICAgIC8vIHRyYWl0c0ZpbmFsaXplZCA9IExvY2FsU3RhdGU8Ym9vbGVhbj4oKQogICAgYnl0ZWMgMTggLy8gInRyYWl0c0ZpbmFsaXplZCIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6Mjg1CiAgICAvLyB0aGlzLnRyYWl0c0ZpbmFsaXplZChzZW5kZXIpLnZhbHVlID0gdHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTMzCiAgICAvLyBjb21taXR0ZWRSb3VuZCA9IExvY2FsU3RhdGU8dWludDY0PigpIC8vIFJvdW5kIGNvbW1pdHRlZCBmb3IgVlJGCiAgICBieXRlY18yIC8vICJjb21taXR0ZWRSb3VuZCIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6Mjg2CiAgICAvLyB0aGlzLmNvbW1pdHRlZFJvdW5kKHNlbmRlcikudmFsdWUgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjI2OAogICAgLy8gZmluYWxpemVUcmFpdHMoKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmaW5hbGl6ZVRyYWl0c19lbHNlX2JvZHlAMzoKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MjgxCiAgICAvLyBjb25zdCBmYWxsYmFja0hhc2ggPSBvcC5zaGEyNTYoVHhuLnNlbmRlci5ieXRlcy5jb25jYXQoQnl0ZXMoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCkpKQogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgY29uY2F0CiAgICBzaGEyNTYKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MjgyCiAgICAvLyB0aGlzLmFwcGx5VHJhaXRCeXRlcyhzZW5kZXIsIGZhbGxiYWNrSGFzaCkKICAgIGRpZyAyCiAgICBzd2FwCiAgICBjYWxsc3ViIGFwcGx5VHJhaXRCeXRlcwogICAgYiBmaW5hbGl6ZVRyYWl0c19hZnRlcl9pZl9lbHNlQDQKCgovLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjpBbGdvY2hpLnZyZlRlc3Rbcm91dGluZ10oKSAtPiB2b2lkOgp2cmZUZXN0OgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoyOTIKICAgIC8vIHB1YmxpYyB2cmZUZXN0KGNvbW1pdHRlZFJvdW5kOiB1aW50NjQpOiBbYnl0ZXMsIGJvb2xlYW5dIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDggLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MjkzCiAgICAvLyBhc3NlcnQodGhpcy5iZWFjb25BcHBJZC5oYXNWYWx1ZSwgJ0JlYWNvbiBhcHAgbm90IGNvbmZpZ3VyZWQnKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6OTgKICAgIC8vIGJlYWNvbkFwcElkID0gR2xvYmFsU3RhdGU8dWludDY0PigpCiAgICBieXRlYyA5IC8vICJiZWFjb25BcHBJZCIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MjkzCiAgICAvLyBhc3NlcnQodGhpcy5iZWFjb25BcHBJZC5oYXNWYWx1ZSwgJ0JlYWNvbiBhcHAgbm90IGNvbmZpZ3VyZWQnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBCZWFjb24gYXBwIG5vdCBjb25maWd1cmVkCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjI5Ni0zMDYKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGl0eG4KICAgIC8vICAgLmFwcGxpY2F0aW9uQ2FsbCh7CiAgICAvLyAgICAgYXBwSWQ6IEFwcGxpY2F0aW9uKHRoaXMuYmVhY29uQXBwSWQudmFsdWUpLAogICAgLy8gICAgIGFwcEFyZ3M6IFsKICAgIC8vICAgICAgIGFyYzQubWV0aG9kU2VsZWN0b3IoJ2dldCh1aW50NjQsYnl0ZVtdKWJ5dGVbXScpLAogICAgLy8gICAgICAgbmV3IGFyYzQuVWludDY0KGNvbW1pdHRlZFJvdW5kKSwKICAgIC8vICAgICAgIG5ldyBhcmM0LkR5bmFtaWNCeXRlcyh1c2VyRGF0YSksCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBmZWU6IEdsb2JhbC5taW5UeG5GZWUsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czozMDQKICAgIC8vIGZlZTogR2xvYmFsLm1pblR4bkZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MzAwCiAgICAvLyBhcmM0Lm1ldGhvZFNlbGVjdG9yKCdnZXQodWludDY0LGJ5dGVbXSlieXRlW10nKSwKICAgIGJ5dGVjIDM3IC8vIG1ldGhvZCAiZ2V0KHVpbnQ2NCxieXRlW10pYnl0ZVtdIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MzAyCiAgICAvLyBuZXcgYXJjNC5EeW5hbWljQnl0ZXModXNlckRhdGEpLAogICAgcHVzaGJ5dGVzIDB4MDAwNDc0NjU3Mzc0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjI5Ni0zMDUKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGl0eG4KICAgIC8vICAgLmFwcGxpY2F0aW9uQ2FsbCh7CiAgICAvLyAgICAgYXBwSWQ6IEFwcGxpY2F0aW9uKHRoaXMuYmVhY29uQXBwSWQudmFsdWUpLAogICAgLy8gICAgIGFwcEFyZ3M6IFsKICAgIC8vICAgICAgIGFyYzQubWV0aG9kU2VsZWN0b3IoJ2dldCh1aW50NjQsYnl0ZVtdKWJ5dGVbXScpLAogICAgLy8gICAgICAgbmV3IGFyYzQuVWludDY0KGNvbW1pdHRlZFJvdW5kKSwKICAgIC8vICAgICAgIG5ldyBhcmM0LkR5bmFtaWNCeXRlcyh1c2VyRGF0YSksCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBmZWU6IEdsb2JhbC5taW5UeG5GZWUsCiAgICAvLyAgIH0pCiAgICBwdXNoaW50IDYgLy8gNgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6Mjk2LTMwNgogICAgLy8gY29uc3QgcmVzdWx0ID0gaXR4bgogICAgLy8gICAuYXBwbGljYXRpb25DYWxsKHsKICAgIC8vICAgICBhcHBJZDogQXBwbGljYXRpb24odGhpcy5iZWFjb25BcHBJZC52YWx1ZSksCiAgICAvLyAgICAgYXBwQXJnczogWwogICAgLy8gICAgICAgYXJjNC5tZXRob2RTZWxlY3RvcignZ2V0KHVpbnQ2NCxieXRlW10pYnl0ZVtdJyksCiAgICAvLyAgICAgICBuZXcgYXJjNC5VaW50NjQoY29tbWl0dGVkUm91bmQpLAogICAgLy8gICAgICAgbmV3IGFyYzQuRHluYW1pY0J5dGVzKHVzZXJEYXRhKSwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGZlZTogR2xvYmFsLm1pblR4bkZlZSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBOdW1Mb2dzCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjMwOAogICAgLy8gaWYgKHJlc3VsdC5udW1Mb2dzID09PSBVaW50NjQoMCkpIHsKICAgIGJueiB2cmZUZXN0X2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czozMDkKICAgIC8vIHJldHVybiBbQnl0ZXMoKSwgZmFsc2VdCiAgICBieXRlYyAxOSAvLyAweDAwMDMwMDAwMDAKCnZyZlRlc3RfYWZ0ZXJfaW5saW5lZF9zcmMvYWxnb2NoaS5hbGdvLnRzOjpBbGdvY2hpLnZyZlRlc3RANToKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MjkyCiAgICAvLyBwdWJsaWMgdnJmVGVzdChjb21taXR0ZWRSb3VuZDogdWludDY0KTogW2J5dGVzLCBib29sZWFuXSB7CiAgICBieXRlYyA1IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgp2cmZUZXN0X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MzEyCiAgICAvLyBjb25zdCByYW5kb21CeXRlcyA9IGFyYzQuZGVjb2RlQXJjNDxieXRlcz4ocmVzdWx0LmxvZ3MoVWludDY0KDApKSwgJ2xvZycpCiAgICBpdHhuYSBMb2dzIDAKICAgIGR1cAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjIDUgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBleHRyYWN0IDYgMAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czozMTMKICAgIC8vIHJldHVybiBbcmFuZG9tQnl0ZXMsIHJhbmRvbUJ5dGVzLmxlbmd0aCA9PT0gVWludDY0KDMyKV0KICAgIGR1cAogICAgbGVuCiAgICBkdXAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGJ5dGVjIDM4IC8vIDB4MDAwMwogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MjkyCiAgICAvLyBwdWJsaWMgdnJmVGVzdChjb21taXR0ZWRSb3VuZDogdWludDY0KTogW2J5dGVzLCBib29sZWFuXSB7CiAgICBiIHZyZlRlc3RfYWZ0ZXJfaW5saW5lZF9zcmMvYWxnb2NoaS5hbGdvLnRzOjpBbGdvY2hpLnZyZlRlc3RANQoKCi8vIHNyYy9hbGdvY2hpLmFsZ28udHM6OkFsZ29jaGkudXBkYXRlU3RhdGUoYWNjb3VudDogYnl0ZXMpIC0+IHZvaWQ6CnVwZGF0ZVN0YXRlOgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czozMjQKICAgIC8vIHByaXZhdGUgdXBkYXRlU3RhdGUoYWNjb3VudDogQWNjb3VudCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gNAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo0MjUKICAgIC8vIGFzc2VydCh0aGlzLmFzc2V0SWQoYWNjb3VudCkuaGFzVmFsdWUsICdQZXQgbm90IGNyZWF0ZWQnKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxMjQKICAgIC8vIGFzc2V0SWQgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKQogICAgYnl0ZWMgNiAvLyAiYXNzZXRJZCIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NDI1CiAgICAvLyBhc3NlcnQodGhpcy5hc3NldElkKGFjY291bnQpLmhhc1ZhbHVlLCAnUGV0IG5vdCBjcmVhdGVkJykKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIFBldCBub3QgY3JlYXRlZAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo0MjYKICAgIC8vIGFzc2VydCh0aGlzLmlzRGVhZChhY2NvdW50KS52YWx1ZSA9PT0gZmFsc2UsICdQZXQgaXMgZGVhZCcpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEzMAogICAgLy8gaXNEZWFkID0gTG9jYWxTdGF0ZTxib29sZWFuPigpCiAgICBieXRlY18zIC8vICJpc0RlYWQiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjQyNgogICAgLy8gYXNzZXJ0KHRoaXMuaXNEZWFkKGFjY291bnQpLnZhbHVlID09PSBmYWxzZSwgJ1BldCBpcyBkZWFkJykKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIFBldCBpcyBkZWFkCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjMyNwogICAgLy8gY29uc3Qgbm93ID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czozMjgKICAgIC8vIGNvbnN0IGxhc3RVcGRhdGUgPSB0aGlzLmxhc3RVcGRhdGUoYWNjb3VudCkudmFsdWUKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTI5CiAgICAvLyBsYXN0VXBkYXRlID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCkgLy8gVW5peCB0aW1lc3RhbXAKICAgIGJ5dGVjIDggLy8gImxhc3RVcGRhdGUiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjMyOAogICAgLy8gY29uc3QgbGFzdFVwZGF0ZSA9IHRoaXMubGFzdFVwZGF0ZShhY2NvdW50KS52YWx1ZQogICAgYXBwX2xvY2FsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czozMzEKICAgIC8vIGlmIChsYXN0VXBkYXRlID09PSBVaW50NjQoMCkgfHwgbm93IDw9IGxhc3RVcGRhdGUpIHsKICAgIGJ6IHVwZGF0ZVN0YXRlX2lmX2JvZHlAMgogICAgZnJhbWVfZGlnIDUKICAgIGZyYW1lX2RpZyA2CiAgICA8PQogICAgYnogdXBkYXRlU3RhdGVfYWZ0ZXJfaWZfZWxzZUAzCgp1cGRhdGVTdGF0ZV9pZl9ib2R5QDI6CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjMzMgogICAgLy8gdGhpcy5sYXN0VXBkYXRlKGFjY291bnQpLnZhbHVlID0gbm93CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTI5CiAgICAvLyBsYXN0VXBkYXRlID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCkgLy8gVW5peCB0aW1lc3RhbXAKICAgIGJ5dGVjIDggLy8gImxhc3RVcGRhdGUiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjMzMgogICAgLy8gdGhpcy5sYXN0VXBkYXRlKGFjY291bnQpLnZhbHVlID0gbm93CiAgICBmcmFtZV9kaWcgNQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czozMzMKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgp1cGRhdGVTdGF0ZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjMzNgogICAgLy8gY29uc3QgZWxhcHNlZDogdWludDY0ID0gbm93IC0gbGFzdFVwZGF0ZQogICAgZnJhbWVfZGlnIDUKICAgIGZyYW1lX2RpZyA2CiAgICAtCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czozMzcKICAgIC8vIGlmIChlbGFwc2VkID09PSBVaW50NjQoMCkpIHsKICAgIGJueiB1cGRhdGVTdGF0ZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MzM4CiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKdXBkYXRlU3RhdGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czozNTEKICAgIC8vIGNvbnN0IGh1bmdlckRlY2F5OiB1aW50NjQgPSAoZWxhcHNlZCAqIHRoaXMuaHVuZ2VyRGVjYXlOdW1lcmF0b3IudmFsdWUpIC8gdGhpcy5odW5nZXJEZWNheURlbm9taW5hdG9yLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxMDgKICAgIC8vIGh1bmdlckRlY2F5TnVtZXJhdG9yID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogREVGQVVMVF9IVU5HRVJfREVDQVlfTlVNRVJBVE9SIH0pCiAgICBieXRlYyAyNCAvLyAiaHVuZ2VyRGVjYXlOdW1lcmF0b3IiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjM1MQogICAgLy8gY29uc3QgaHVuZ2VyRGVjYXk6IHVpbnQ2NCA9IChlbGFwc2VkICogdGhpcy5odW5nZXJEZWNheU51bWVyYXRvci52YWx1ZSkgLyB0aGlzLmh1bmdlckRlY2F5RGVub21pbmF0b3IudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgICoKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEwOQogICAgLy8gaHVuZ2VyRGVjYXlEZW5vbWluYXRvciA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IERFRkFVTFRfSFVOR0VSX0RFQ0FZX0RFTk9NSU5BVE9SIH0pCiAgICBieXRlYyAyNSAvLyAiaHVuZ2VyRGVjYXlEZW5vbWluYXRvciIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MzUxCiAgICAvLyBjb25zdCBodW5nZXJEZWNheTogdWludDY0ID0gKGVsYXBzZWQgKiB0aGlzLmh1bmdlckRlY2F5TnVtZXJhdG9yLnZhbHVlKSAvIHRoaXMuaHVuZ2VyRGVjYXlEZW5vbWluYXRvci52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8KICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjM1MgogICAgLy8gY29uc3QgaGFwcGluZXNzRGVjYXk6IHVpbnQ2NCA9IChlbGFwc2VkICogdGhpcy5oYXBwaW5lc3NEZWNheU51bWVyYXRvci52YWx1ZSkgLyB0aGlzLmhhcHBpbmVzc0RlY2F5RGVub21pbmF0b3IudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjExMAogICAgLy8gaGFwcGluZXNzRGVjYXlOdW1lcmF0b3IgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBERUZBVUxUX0hBUFBJTkVTU19ERUNBWV9OVU1FUkFUT1IgfSkKICAgIGJ5dGVjIDI2IC8vICJoYXBwaW5lc3NEZWNheU51bWVyYXRvciIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MzUyCiAgICAvLyBjb25zdCBoYXBwaW5lc3NEZWNheTogdWludDY0ID0gKGVsYXBzZWQgKiB0aGlzLmhhcHBpbmVzc0RlY2F5TnVtZXJhdG9yLnZhbHVlKSAvIHRoaXMuaGFwcGluZXNzRGVjYXlEZW5vbWluYXRvci52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgICoKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjExMQogICAgLy8gaGFwcGluZXNzRGVjYXlEZW5vbWluYXRvciA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IERFRkFVTFRfSEFQUElORVNTX0RFQ0FZX0RFTk9NSU5BVE9SIH0pCiAgICBieXRlYyAyNyAvLyAiaGFwcGluZXNzRGVjYXlEZW5vbWluYXRvciIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MzUyCiAgICAvLyBjb25zdCBoYXBwaW5lc3NEZWNheTogdWludDY0ID0gKGVsYXBzZWQgKiB0aGlzLmhhcHBpbmVzc0RlY2F5TnVtZXJhdG9yLnZhbHVlKSAvIHRoaXMuaGFwcGluZXNzRGVjYXlEZW5vbWluYXRvci52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8KICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czozNTQKICAgIC8vIGNvbnN0IGN1cnJlbnRIdW5nZXIgPSB0aGlzLmh1bmdlcihhY2NvdW50KS52YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxMjUKICAgIC8vIGh1bmdlciA9IExvY2FsU3RhdGU8dWludDY0PigpIC8vIDAtMTAwCiAgICBieXRlY18wIC8vICJodW5nZXIiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjM1NAogICAgLy8gY29uc3QgY3VycmVudEh1bmdlciA9IHRoaXMuaHVuZ2VyKGFjY291bnQpLnZhbHVlCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjM1NQogICAgLy8gY29uc3QgY3VycmVudEhhcHBpbmVzcyA9IHRoaXMuaGFwcGluZXNzKGFjY291bnQpLnZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEyNgogICAgLy8gaGFwcGluZXNzID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCkgLy8gMC0xMDAKICAgIGJ5dGVjXzEgLy8gImhhcHBpbmVzcyIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MzU1CiAgICAvLyBjb25zdCBjdXJyZW50SGFwcGluZXNzID0gdGhpcy5oYXBwaW5lc3MoYWNjb3VudCkudmFsdWUKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjM1NwogICAgLy8gdGhpcy5odW5nZXIoYWNjb3VudCkudmFsdWUgPSBjdXJyZW50SHVuZ2VyID4gaHVuZ2VyRGVjYXkgPyBjdXJyZW50SHVuZ2VyIC0gaHVuZ2VyRGVjYXkgOiBVaW50NjQoMCkKICAgIDwKICAgIGJ6IHVwZGF0ZVN0YXRlX3Rlcm5hcnlfZmFsc2VAOAogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyA0CiAgICAtCgp1cGRhdGVTdGF0ZV90ZXJuYXJ5X21lcmdlQDk6CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjM1NwogICAgLy8gdGhpcy5odW5nZXIoYWNjb3VudCkudmFsdWUgPSBjdXJyZW50SHVuZ2VyID4gaHVuZ2VyRGVjYXkgPyBjdXJyZW50SHVuZ2VyIC0gaHVuZ2VyRGVjYXkgOiBVaW50NjQoMCkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxMjUKICAgIC8vIGh1bmdlciA9IExvY2FsU3RhdGU8dWludDY0PigpIC8vIDAtMTAwCiAgICBieXRlY18wIC8vICJodW5nZXIiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjM1NwogICAgLy8gdGhpcy5odW5nZXIoYWNjb3VudCkudmFsdWUgPSBjdXJyZW50SHVuZ2VyID4gaHVuZ2VyRGVjYXkgPyBjdXJyZW50SHVuZ2VyIC0gaHVuZ2VyRGVjYXkgOiBVaW50NjQoMCkKICAgIHVuY292ZXIgMgogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czozNTgKICAgIC8vIHRoaXMuaGFwcGluZXNzKGFjY291bnQpLnZhbHVlID0gY3VycmVudEhhcHBpbmVzcyA+IGhhcHBpbmVzc0RlY2F5ID8gY3VycmVudEhhcHBpbmVzcyAtIGhhcHBpbmVzc0RlY2F5IDogVWludDY0KDApCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IHVwZGF0ZVN0YXRlX3Rlcm5hcnlfZmFsc2VAMTEKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMwogICAgLQoKdXBkYXRlU3RhdGVfdGVybmFyeV9tZXJnZUAxMjoKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MzU4CiAgICAvLyB0aGlzLmhhcHBpbmVzcyhhY2NvdW50KS52YWx1ZSA9IGN1cnJlbnRIYXBwaW5lc3MgPiBoYXBwaW5lc3NEZWNheSA/IGN1cnJlbnRIYXBwaW5lc3MgLSBoYXBwaW5lc3NEZWNheSA6IFVpbnQ2NCgwKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEyNgogICAgLy8gaGFwcGluZXNzID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCkgLy8gMC0xMDAKICAgIGJ5dGVjXzEgLy8gImhhcHBpbmVzcyIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MzU4CiAgICAvLyB0aGlzLmhhcHBpbmVzcyhhY2NvdW50KS52YWx1ZSA9IGN1cnJlbnRIYXBwaW5lc3MgPiBoYXBwaW5lc3NEZWNheSA/IGN1cnJlbnRIYXBwaW5lc3MgLSBoYXBwaW5lc3NEZWNheSA6IFVpbnQ2NCgwKQogICAgdW5jb3ZlciAyCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjM2NQogICAgLy8gY29uc3QgYWdlSW5jcmVhc2U6IHVpbnQ2NCA9IGVsYXBzZWQgLyB0aGlzLmFnZVNlY29uZHNQZXJEYXkudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEwMgogICAgLy8gYWdlU2Vjb25kc1BlckRheSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IERFRkFVTFRfQUdFX1NFQ09ORFNfUEVSX0RBWSB9KQogICAgYnl0ZWMgMjIgLy8gImFnZVNlY29uZHNQZXJEYXkiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjM2NQogICAgLy8gY29uc3QgYWdlSW5jcmVhc2U6IHVpbnQ2NCA9IGVsYXBzZWQgLyB0aGlzLmFnZVNlY29uZHNQZXJEYXkudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgLwogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czozNjYKICAgIC8vIHRoaXMuYWdlRGF5cyhhY2NvdW50KS52YWx1ZSA9IHRoaXMuYWdlRGF5cyhhY2NvdW50KS52YWx1ZSArIGFnZUluY3JlYXNlCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEyNwogICAgLy8gYWdlRGF5cyA9IExvY2FsU3RhdGU8dWludDY0PigpIC8vIDAtMjU1CiAgICBieXRlYyAxMCAvLyAiYWdlRGF5cyIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MzY2CiAgICAvLyB0aGlzLmFnZURheXMoYWNjb3VudCkudmFsdWUgPSB0aGlzLmFnZURheXMoYWNjb3VudCkudmFsdWUgKyBhZ2VJbmNyZWFzZQogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICArCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTI3CiAgICAvLyBhZ2VEYXlzID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCkgLy8gMC0yNTUKICAgIGJ5dGVjIDEwIC8vICJhZ2VEYXlzIgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czozNjYKICAgIC8vIHRoaXMuYWdlRGF5cyhhY2NvdW50KS52YWx1ZSA9IHRoaXMuYWdlRGF5cyhhY2NvdW50KS52YWx1ZSArIGFnZUluY3JlYXNlCiAgICB1bmNvdmVyIDIKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MzczCiAgICAvLyBjb25zdCBoZWFsdGggPSB0aGlzLmNhbGN1bGF0ZUhlYWx0aChhY2NvdW50KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGNhbGN1bGF0ZUhlYWx0aAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czozNzQKICAgIC8vIGlmIChoZWFsdGggPT09IFVpbnQ2NCgwKSAmJiB0aGlzLmlzRGVhZChhY2NvdW50KS52YWx1ZSA9PT0gZmFsc2UpIHsKICAgIGJueiB1cGRhdGVTdGF0ZV9hZnRlcl9pZl9lbHNlQDE5CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEzMAogICAgLy8gaXNEZWFkID0gTG9jYWxTdGF0ZTxib29sZWFuPigpCiAgICBieXRlY18zIC8vICJpc0RlYWQiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjM3NAogICAgLy8gaWYgKGhlYWx0aCA9PT0gVWludDY0KDApICYmIHRoaXMuaXNEZWFkKGFjY291bnQpLnZhbHVlID09PSBmYWxzZSkgewogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICBibnogdXBkYXRlU3RhdGVfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czozNzUKICAgIC8vIHRoaXMuaXNEZWFkKGFjY291bnQpLnZhbHVlID0gdHJ1ZQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEzMAogICAgLy8gaXNEZWFkID0gTG9jYWxTdGF0ZTxib29sZWFuPigpCiAgICBieXRlY18zIC8vICJpc0RlYWQiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjM3NQogICAgLy8gdGhpcy5pc0RlYWQoYWNjb3VudCkudmFsdWUgPSB0cnVlCiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2xvY2FsX3B1dAoKdXBkYXRlU3RhdGVfYWZ0ZXJfaWZfZWxzZUAxOToKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MzQ0CiAgICAvLyB0aGlzLmxhc3RVcGRhdGUoYWNjb3VudCkudmFsdWUgPSBub3cKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxMjkKICAgIC8vIGxhc3RVcGRhdGUgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKSAvLyBVbml4IHRpbWVzdGFtcAogICAgYnl0ZWMgOCAvLyAibGFzdFVwZGF0ZSIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MzQ0CiAgICAvLyB0aGlzLmxhc3RVcGRhdGUoYWNjb3VudCkudmFsdWUgPSBub3cKICAgIGZyYW1lX2RpZyA1CiAgICBhcHBfbG9jYWxfcHV0CiAgICByZXRzdWIKCnVwZGF0ZVN0YXRlX3Rlcm5hcnlfZmFsc2VAMTE6CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjM1OAogICAgLy8gdGhpcy5oYXBwaW5lc3MoYWNjb3VudCkudmFsdWUgPSBjdXJyZW50SGFwcGluZXNzID4gaGFwcGluZXNzRGVjYXkgPyBjdXJyZW50SGFwcGluZXNzIC0gaGFwcGluZXNzRGVjYXkgOiBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBiIHVwZGF0ZVN0YXRlX3Rlcm5hcnlfbWVyZ2VAMTIKCnVwZGF0ZVN0YXRlX3Rlcm5hcnlfZmFsc2VAODoKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MzU3CiAgICAvLyB0aGlzLmh1bmdlcihhY2NvdW50KS52YWx1ZSA9IGN1cnJlbnRIdW5nZXIgPiBodW5nZXJEZWNheSA/IGN1cnJlbnRIdW5nZXIgLSBodW5nZXJEZWNheSA6IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGIgdXBkYXRlU3RhdGVfdGVybmFyeV9tZXJnZUA5CgoKLy8gc3JjL2FsZ29jaGkuYWxnby50czo6QWxnb2NoaS5lbnN1cmVWcmZSZWFkeShhY2NvdW50OiBieXRlcykgLT4gdm9pZDoKZW5zdXJlVnJmUmVhZHk6CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjQzMgogICAgLy8gcHJpdmF0ZSBlbnN1cmVWcmZSZWFkeShhY2NvdW50OiBBY2NvdW50KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NDMzCiAgICAvLyBjb25zdCBjb21taXR0ZWRSb3VuZCA9IHRoaXMuY29tbWl0dGVkUm91bmQoYWNjb3VudCkudmFsdWUKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTMzCiAgICAvLyBjb21taXR0ZWRSb3VuZCA9IExvY2FsU3RhdGU8dWludDY0PigpIC8vIFJvdW5kIGNvbW1pdHRlZCBmb3IgVlJGCiAgICBieXRlY18yIC8vICJjb21taXR0ZWRSb3VuZCIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NDMzCiAgICAvLyBjb25zdCBjb21taXR0ZWRSb3VuZCA9IHRoaXMuY29tbWl0dGVkUm91bmQoYWNjb3VudCkudmFsdWUKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo0MzQKICAgIC8vIGFzc2VydChjb21taXR0ZWRSb3VuZCA+IFVpbnQ2NCgwKSwgJ05vIHBlbmRpbmcgVlJGIGNvbW1pdG1lbnQnKQogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gcGVuZGluZyBWUkYgY29tbWl0bWVudAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo0MzUKICAgIC8vIGFzc2VydChHbG9iYWwucm91bmQgPiBjb21taXR0ZWRSb3VuZCArIHRoaXMucmFuZG9tRGVsYXkudmFsdWUsICdSYW5kb21uZXNzIG5vdCByZWFkeSAtIGRlbGF5IG5vdCBzYXRpc2ZpZWQnKQogICAgZ2xvYmFsIFJvdW5kCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxMDAKICAgIC8vIHJhbmRvbURlbGF5ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogREVGQVVMVF9SQU5ET01fREVMQVkgfSkKICAgIGJ5dGVjIDIxIC8vICJyYW5kb21EZWxheSIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NDM1CiAgICAvLyBhc3NlcnQoR2xvYmFsLnJvdW5kID4gY29tbWl0dGVkUm91bmQgKyB0aGlzLnJhbmRvbURlbGF5LnZhbHVlLCAnUmFuZG9tbmVzcyBub3QgcmVhZHkgLSBkZWxheSBub3Qgc2F0aXNmaWVkJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgICsKICAgID4KICAgIGFzc2VydCAvLyBSYW5kb21uZXNzIG5vdCByZWFkeSAtIGRlbGF5IG5vdCBzYXRpc2ZpZWQKICAgIHJldHN1YgoKCi8vIHNyYy9hbGdvY2hpLmFsZ28udHM6OkFsZ29jaGkuY2FsY3VsYXRlQ29tbWl0dGVkUm91bmQoKSAtPiB1aW50NjQ6CmNhbGN1bGF0ZUNvbW1pdHRlZFJvdW5kOgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo0NDYKICAgIC8vIHJldHVybiBHbG9iYWwucm91bmQgKyB0aGlzLnJhbmRvbW5lc3NHYXBSb3VuZHMudmFsdWUKICAgIGdsb2JhbCBSb3VuZAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6OTkKICAgIC8vIHJhbmRvbW5lc3NHYXBSb3VuZHMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBERUZBVUxUX1JBTkRPTU5FU1NfR0FQX1JPVU5EUyB9KQogICAgYnl0ZWMgMjAgLy8gInJhbmRvbW5lc3NHYXBSb3VuZHMiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjQ0NgogICAgLy8gcmV0dXJuIEdsb2JhbC5yb3VuZCArIHRoaXMucmFuZG9tbmVzc0dhcFJvdW5kcy52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgICsKICAgIHJldHN1YgoKCi8vIHNyYy9hbGdvY2hpLmFsZ28udHM6OkFsZ29jaGkuZmV0Y2hSYW5kb21uZXNzKGFjY291bnQ6IGJ5dGVzLCBjb21taXR0ZWRSb3VuZDogdWludDY0LCBwdXJwb3NlOiBieXRlcykgLT4gYnl0ZXM6CmZldGNoUmFuZG9tbmVzczoKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NDcwCiAgICAvLyBwcml2YXRlIGZldGNoUmFuZG9tbmVzcyhhY2NvdW50OiBBY2NvdW50LCBjb21taXR0ZWRSb3VuZDogdWludDY0LCBwdXJwb3NlOiBzdHJpbmcpOiBbYnl0ZXMsIGJvb2xlYW5dIHsKICAgIHByb3RvIDMgMQogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo0NzEKICAgIC8vIGlmICghdGhpcy5iZWFjb25BcHBJZC5oYXNWYWx1ZSkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6OTgKICAgIC8vIGJlYWNvbkFwcElkID0gR2xvYmFsU3RhdGU8dWludDY0PigpCiAgICBieXRlYyA5IC8vICJiZWFjb25BcHBJZCIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NDcxCiAgICAvLyBpZiAoIXRoaXMuYmVhY29uQXBwSWQuaGFzVmFsdWUpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBidXJ5IDEKICAgIGJueiBmZXRjaFJhbmRvbW5lc3NfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjQ3MgogICAgLy8gcmV0dXJuIFtCeXRlcygpLCBmYWxzZV0KICAgIGJ5dGVjIDE5IC8vIDB4MDAwMzAwMDAwMAogICAgcmV0c3ViCgpmZXRjaFJhbmRvbW5lc3NfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo0NzUKICAgIC8vIGNvbnN0IGFzc2V0SWRlbnRpZmllciA9IHRoaXMuYXNzZXRJZChhY2NvdW50KS52YWx1ZQogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxMjQKICAgIC8vIGFzc2V0SWQgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKQogICAgYnl0ZWMgNiAvLyAiYXNzZXRJZCIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NDc1CiAgICAvLyBjb25zdCBhc3NldElkZW50aWZpZXIgPSB0aGlzLmFzc2V0SWQoYWNjb3VudCkudmFsdWUKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo0NzYKICAgIC8vIGNvbnN0IHNhbHRlZCA9IG9wLnNoYTI1NihCeXRlcyhhc3NldElkZW50aWZpZXIpLmNvbmNhdChhY2NvdW50LmJ5dGVzKS5jb25jYXQoQnl0ZXMocHVycG9zZSkpKQogICAgaXRvYgogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBzaGEyNTYKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NDc4LTQ4OAogICAgLy8gY29uc3QgcmVzdWx0ID0gaXR4bgogICAgLy8gICAuYXBwbGljYXRpb25DYWxsKHsKICAgIC8vICAgICBhcHBJZDogQXBwbGljYXRpb24odGhpcy5iZWFjb25BcHBJZC52YWx1ZSksCiAgICAvLyAgICAgYXBwQXJnczogWwogICAgLy8gICAgICAgYXJjNC5tZXRob2RTZWxlY3RvcignZ2V0KHVpbnQ2NCxieXRlW10pYnl0ZVtdJyksCiAgICAvLyAgICAgICBuZXcgYXJjNC5VaW50NjQoY29tbWl0dGVkUm91bmQpLAogICAgLy8gICAgICAgbmV3IGFyYzQuRHluYW1pY0J5dGVzKHNhbHRlZCksCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBmZWU6IEdsb2JhbC5taW5UeG5GZWUsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo0ODYKICAgIC8vIGZlZTogR2xvYmFsLm1pblR4bkZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NDgwCiAgICAvLyBhcHBJZDogQXBwbGljYXRpb24odGhpcy5iZWFjb25BcHBJZC52YWx1ZSksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo5OAogICAgLy8gYmVhY29uQXBwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCkKICAgIGJ5dGVjIDkgLy8gImJlYWNvbkFwcElkIgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo0ODAKICAgIC8vIGFwcElkOiBBcHBsaWNhdGlvbih0aGlzLmJlYWNvbkFwcElkLnZhbHVlKSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjQ4MwogICAgLy8gbmV3IGFyYzQuVWludDY0KGNvbW1pdHRlZFJvdW5kKSwKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo0ODQKICAgIC8vIG5ldyBhcmM0LkR5bmFtaWNCeXRlcyhzYWx0ZWQpLAogICAgcHVzaGJ5dGVzIDB4MDAyMAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NDgyCiAgICAvLyBhcmM0Lm1ldGhvZFNlbGVjdG9yKCdnZXQodWludDY0LGJ5dGVbXSlieXRlW10nKSwKICAgIGJ5dGVjIDM3IC8vIG1ldGhvZCAiZ2V0KHVpbnQ2NCxieXRlW10pYnl0ZVtdIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjQ3OC00ODcKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGl0eG4KICAgIC8vICAgLmFwcGxpY2F0aW9uQ2FsbCh7CiAgICAvLyAgICAgYXBwSWQ6IEFwcGxpY2F0aW9uKHRoaXMuYmVhY29uQXBwSWQudmFsdWUpLAogICAgLy8gICAgIGFwcEFyZ3M6IFsKICAgIC8vICAgICAgIGFyYzQubWV0aG9kU2VsZWN0b3IoJ2dldCh1aW50NjQsYnl0ZVtdKWJ5dGVbXScpLAogICAgLy8gICAgICAgbmV3IGFyYzQuVWludDY0KGNvbW1pdHRlZFJvdW5kKSwKICAgIC8vICAgICAgIG5ldyBhcmM0LkR5bmFtaWNCeXRlcyhzYWx0ZWQpLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgZmVlOiBHbG9iYWwubWluVHhuRmVlLAogICAgLy8gICB9KQogICAgcHVzaGludCA2IC8vIDYKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjQ3OC00ODgKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGl0eG4KICAgIC8vICAgLmFwcGxpY2F0aW9uQ2FsbCh7CiAgICAvLyAgICAgYXBwSWQ6IEFwcGxpY2F0aW9uKHRoaXMuYmVhY29uQXBwSWQudmFsdWUpLAogICAgLy8gICAgIGFwcEFyZ3M6IFsKICAgIC8vICAgICAgIGFyYzQubWV0aG9kU2VsZWN0b3IoJ2dldCh1aW50NjQsYnl0ZVtdKWJ5dGVbXScpLAogICAgLy8gICAgICAgbmV3IGFyYzQuVWludDY0KGNvbW1pdHRlZFJvdW5kKSwKICAgIC8vICAgICAgIG5ldyBhcmM0LkR5bmFtaWNCeXRlcyhzYWx0ZWQpLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgZmVlOiBHbG9iYWwubWluVHhuRmVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIE51bUxvZ3MKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NDkwCiAgICAvLyBpZiAocmVzdWx0Lm51bUxvZ3MgPT09IFVpbnQ2NCgwKSkgewogICAgYm56IGZldGNoUmFuZG9tbmVzc19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NDkxCiAgICAvLyByZXR1cm4gW0J5dGVzKCksIGZhbHNlXQogICAgYnl0ZWMgMTkgLy8gMHgwMDAzMDAwMDAwCiAgICByZXRzdWIKCmZldGNoUmFuZG9tbmVzc19hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjQ5NAogICAgLy8gY29uc3QgcmFuZG9tQnl0ZXMgPSBhcmM0LmRlY29kZUFyYzQ8Ynl0ZXM+KHJlc3VsdC5sb2dzKFVpbnQ2NCgwKSksICdsb2cnKQogICAgaXR4bmEgTG9ncyAwCiAgICBkdXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlYyA1IC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZXh0cmFjdCA2IDAKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NDk1CiAgICAvLyByZXR1cm4gW3JhbmRvbUJ5dGVzLCByYW5kb21CeXRlcy5sZW5ndGggPT09IFVpbnQ2NCgzMildCiAgICBkdXAKICAgIGxlbgogICAgZHVwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBieXRlYyAzOCAvLyAweDAwMDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjpBbGdvY2hpLmNhbGN1bGF0ZUhlYWx0aChhY2NvdW50OiBieXRlcykgLT4gdWludDY0OgpjYWxjdWxhdGVIZWFsdGg6CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjUyOAogICAgLy8gcHJpdmF0ZSBjYWxjdWxhdGVIZWFsdGgoYWNjb3VudDogQWNjb3VudCk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NTI5CiAgICAvLyBjb25zdCBodW5nZXIgPSB0aGlzLmh1bmdlcihhY2NvdW50KS52YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxMjUKICAgIC8vIGh1bmdlciA9IExvY2FsU3RhdGU8dWludDY0PigpIC8vIDAtMTAwCiAgICBieXRlY18wIC8vICJodW5nZXIiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjUyOQogICAgLy8gY29uc3QgaHVuZ2VyID0gdGhpcy5odW5nZXIoYWNjb3VudCkudmFsdWUKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo1MzAKICAgIC8vIGNvbnN0IGhhcHBpbmVzcyA9IHRoaXMuaGFwcGluZXNzKGFjY291bnQpLnZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEyNgogICAgLy8gaGFwcGluZXNzID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCkgLy8gMC0xMDAKICAgIGJ5dGVjXzEgLy8gImhhcHBpbmVzcyIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NTMwCiAgICAvLyBjb25zdCBoYXBwaW5lc3MgPSB0aGlzLmhhcHBpbmVzcyhhY2NvdW50KS52YWx1ZQogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjUzMQogICAgLy8gcmV0dXJuIGh1bmdlciA8IGhhcHBpbmVzcyA/IGh1bmdlciA6IGhhcHBpbmVzcwogICAgZHVwMgogICAgPAogICAgc3dhcAogICAgY292ZXIgMgogICAgc2VsZWN0CiAgICByZXRzdWIKCgovLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjpBbGdvY2hpLmFwcGx5SGFwcGluZXNzQm9vc3QoYWNjb3VudDogYnl0ZXMsIGJvb3N0OiB1aW50NjQpIC0+IHZvaWQ6CmFwcGx5SGFwcGluZXNzQm9vc3Q6CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjU0NAogICAgLy8gcHJpdmF0ZSBhcHBseUhhcHBpbmVzc0Jvb3N0KGFjY291bnQ6IEFjY291bnQsIGJvb3N0OiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo1NDUKICAgIC8vIGNvbnN0IG5ld0hhcHBpbmVzcyA9IHRoaXMuY2xhbXAodGhpcy5oYXBwaW5lc3MoYWNjb3VudCkudmFsdWUgKyBib29zdCwgVWludDY0KDApLCB0aGlzLm1heFN0YXQudmFsdWUpCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEyNgogICAgLy8gaGFwcGluZXNzID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCkgLy8gMC0xMDAKICAgIGJ5dGVjXzEgLy8gImhhcHBpbmVzcyIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NTQ1CiAgICAvLyBjb25zdCBuZXdIYXBwaW5lc3MgPSB0aGlzLmNsYW1wKHRoaXMuaGFwcGluZXNzKGFjY291bnQpLnZhbHVlICsgYm9vc3QsIFVpbnQ2NCgwKSwgdGhpcy5tYXhTdGF0LnZhbHVlKQogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEwMQogICAgLy8gbWF4U3RhdCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IERFRkFVTFRfTUFYX1NUQVQgfSkKICAgIGJ5dGVjIDQgLy8gIm1heFN0YXQiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjU0NQogICAgLy8gY29uc3QgbmV3SGFwcGluZXNzID0gdGhpcy5jbGFtcCh0aGlzLmhhcHBpbmVzcyhhY2NvdW50KS52YWx1ZSArIGJvb3N0LCBVaW50NjQoMCksIHRoaXMubWF4U3RhdC52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgY2FsbHN1YiBjbGFtcAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo1NDYKICAgIC8vIHRoaXMuaGFwcGluZXNzKGFjY291bnQpLnZhbHVlID0gbmV3SGFwcGluZXNzCiAgICBmcmFtZV9kaWcgLTIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6MTI2CiAgICAvLyBoYXBwaW5lc3MgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKSAvLyAwLTEwMAogICAgYnl0ZWNfMSAvLyAiaGFwcGluZXNzIgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo1NDYKICAgIC8vIHRoaXMuaGFwcGluZXNzKGFjY291bnQpLnZhbHVlID0gbmV3SGFwcGluZXNzCiAgICB1bmNvdmVyIDIKICAgIGFwcF9sb2NhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNyYy9hbGdvY2hpLmFsZ28udHM6OkFsZ29jaGkuY2xhbXAodmFsdWU6IHVpbnQ2NCwgbWluVmFsdWU6IHVpbnQ2NCwgbWF4VmFsdWU6IHVpbnQ2NCkgLT4gdWludDY0OgpjbGFtcDoKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NTYyCiAgICAvLyBwcml2YXRlIGNsYW1wKHZhbHVlOiB1aW50NjQsIG1pblZhbHVlOiB1aW50NjQsIG1heFZhbHVlOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMyAxCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjU2MwogICAgLy8gaWYgKHZhbHVlIDwgbWluVmFsdWUpIHsKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICA8CiAgICBieiBjbGFtcF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NTY0CiAgICAvLyByZXR1cm4gbWluVmFsdWUKICAgIGZyYW1lX2RpZyAtMgogICAgcmV0c3ViCgpjbGFtcF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjU2NgogICAgLy8gaWYgKHZhbHVlID4gbWF4VmFsdWUpIHsKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0xCiAgICA+CiAgICBieiBjbGFtcF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NTY3CiAgICAvLyByZXR1cm4gbWF4VmFsdWUKICAgIGZyYW1lX2RpZyAtMQogICAgcmV0c3ViCgpjbGFtcF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjU2OQogICAgLy8gcmV0dXJuIHZhbHVlCiAgICBmcmFtZV9kaWcgLTMKICAgIHJldHN1YgoKCi8vIHNyYy9hbGdvY2hpLmFsZ28udHM6OkFsZ29jaGkuZGlzcGVuc2VIZWFsdGhTY2FsZWRSZXdhcmQoYWNjb3VudDogYnl0ZXMpIC0+IHZvaWQ6CmRpc3BlbnNlSGVhbHRoU2NhbGVkUmV3YXJkOgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo1OTEKICAgIC8vIHByaXZhdGUgZGlzcGVuc2VIZWFsdGhTY2FsZWRSZXdhcmQoYWNjb3VudDogQWNjb3VudCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjU4MQogICAgLy8gY29uc3Qgc3RhZ2UgPSB0aGlzLnN0YWdlKGFjY291bnQpLnZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEyOAogICAgLy8gc3RhZ2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKSAvLyAwPWJhYnksIDE9dGVlbiwgMj1hZHVsdAogICAgYnl0ZWMgNyAvLyAic3RhZ2UiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjU4MQogICAgLy8gY29uc3Qgc3RhZ2UgPSB0aGlzLnN0YWdlKGFjY291bnQpLnZhbHVlCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjYwMAogICAgLy8gaWYgKHN0YWdlID09PSBTVEFHRV9CQUJZKSB7CiAgICBibnogZGlzcGVuc2VIZWFsdGhTY2FsZWRSZXdhcmRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjYwMQogICAgLy8gcmV0dXJuIHRoaXMuc3RhZ2VSZXdhcmRCYWJ5LnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czoxMTYKICAgIC8vIHN0YWdlUmV3YXJkQmFieSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IERFRkFVTFRfU1RBR0VfUkVXQVJEX0JBQlkgfSkKICAgIGJ5dGVjIDMwIC8vICJzdGFnZVJld2FyZEJhYnkiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjYwMQogICAgLy8gcmV0dXJuIHRoaXMuc3RhZ2VSZXdhcmRCYWJ5LnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwoKZGlzcGVuc2VIZWFsdGhTY2FsZWRSZXdhcmRfYWZ0ZXJfaW5saW5lZF9zcmMvYWxnb2NoaS5hbGdvLnRzOjpBbGdvY2hpLnN0YWdlUmV3YXJkRm9yU3RhZ2VANjoKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NTgzCiAgICAvLyBjb25zdCBoZWFsdGggPSB0aGlzLmNhbGN1bGF0ZUhlYWx0aChhY2NvdW50KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGNhbGN1bGF0ZUhlYWx0aAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo1ODUKICAgIC8vIHJldHVybiAoYmFzZVJld2FyZCAqIGhlYWx0aCkgLyB0aGlzLm1heFN0YXQudmFsdWUKICAgICoKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEwMQogICAgLy8gbWF4U3RhdCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IERFRkFVTFRfTUFYX1NUQVQgfSkKICAgIGJ5dGVjIDQgLy8gIm1heFN0YXQiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjU4NQogICAgLy8gcmV0dXJuIChiYXNlUmV3YXJkICogaGVhbHRoKSAvIHRoaXMubWF4U3RhdC52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8KICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NjEzCiAgICAvLyBhc3NlcnQodGhpcy5yZXdhcmRBc2FJZC5oYXNWYWx1ZSwgJ1Jld2FyZCBBU0Egbm90IGNvbmZpZ3VyZWQnKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6OTcKICAgIC8vIHJld2FyZEFzYUlkID0gR2xvYmFsU3RhdGU8dWludDY0PigpCiAgICBieXRlYyAxNyAvLyAicmV3YXJkQXNhSWQiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjYxMwogICAgLy8gYXNzZXJ0KHRoaXMucmV3YXJkQXNhSWQuaGFzVmFsdWUsICdSZXdhcmQgQVNBIG5vdCBjb25maWd1cmVkJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gUmV3YXJkIEFTQSBub3QgY29uZmlndXJlZAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo2MTUtNjIyCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucmV3YXJkQXNhSWQudmFsdWUsCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogcmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo2MTUtNjIxCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucmV3YXJkQXNhSWQudmFsdWUsCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogcmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICBwdXNoaW50IDQgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo2MjAKICAgIC8vIGZlZTogMCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo2MTUtNjIyCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucmV3YXJkQXNhSWQudmFsdWUsCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogcmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NjI0CiAgICAvLyB0aGlzLnRvdGFsUmV3YXJkc01pbmVkLnZhbHVlID0gdGhpcy50b3RhbFJld2FyZHNNaW5lZC52YWx1ZSArIGFtb3VudAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6OTMKICAgIC8vIHRvdGFsUmV3YXJkc01pbmVkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyAxMyAvLyAidG90YWxSZXdhcmRzTWluZWQiCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjYyNAogICAgLy8gdGhpcy50b3RhbFJld2FyZHNNaW5lZC52YWx1ZSA9IHRoaXMudG90YWxSZXdhcmRzTWluZWQudmFsdWUgKyBhbW91bnQKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICArCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjkzCiAgICAvLyB0b3RhbFJld2FyZHNNaW5lZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgMTMgLy8gInRvdGFsUmV3YXJkc01pbmVkIgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo2MjQKICAgIC8vIHRoaXMudG90YWxSZXdhcmRzTWluZWQudmFsdWUgPSB0aGlzLnRvdGFsUmV3YXJkc01pbmVkLnZhbHVlICsgYW1vdW50CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgpkaXNwZW5zZUhlYWx0aFNjYWxlZFJld2FyZF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjYwMwogICAgLy8gaWYgKHN0YWdlID09PSBTVEFHRV9URUVOKSB7CiAgICBmcmFtZV9kaWcgMAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBkaXNwZW5zZUhlYWx0aFNjYWxlZFJld2FyZF9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NjA0CiAgICAvLyByZXR1cm4gdGhpcy5zdGFnZVJld2FyZFRlZW4udmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjExNwogICAgLy8gc3RhZ2VSZXdhcmRUZWVuID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogREVGQVVMVF9TVEFHRV9SRVdBUkRfVEVFTiB9KQogICAgYnl0ZWMgMzEgLy8gInN0YWdlUmV3YXJkVGVlbiIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NjA0CiAgICAvLyByZXR1cm4gdGhpcy5zdGFnZVJld2FyZFRlZW4udmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjU4MgogICAgLy8gY29uc3QgYmFzZVJld2FyZCA9IHRoaXMuc3RhZ2VSZXdhcmRGb3JTdGFnZShzdGFnZSkKICAgIGIgZGlzcGVuc2VIZWFsdGhTY2FsZWRSZXdhcmRfYWZ0ZXJfaW5saW5lZF9zcmMvYWxnb2NoaS5hbGdvLnRzOjpBbGdvY2hpLnN0YWdlUmV3YXJkRm9yU3RhZ2VANgoKZGlzcGVuc2VIZWFsdGhTY2FsZWRSZXdhcmRfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo2MDYKICAgIC8vIHJldHVybiB0aGlzLnN0YWdlUmV3YXJkQWR1bHQudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjExOAogICAgLy8gc3RhZ2VSZXdhcmRBZHVsdCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IERFRkFVTFRfU1RBR0VfUkVXQVJEX0FEVUxUIH0pCiAgICBieXRlYyAzMiAvLyAic3RhZ2VSZXdhcmRBZHVsdCIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NjA2CiAgICAvLyByZXR1cm4gdGhpcy5zdGFnZVJld2FyZEFkdWx0LnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo1ODIKICAgIC8vIGNvbnN0IGJhc2VSZXdhcmQgPSB0aGlzLnN0YWdlUmV3YXJkRm9yU3RhZ2Uoc3RhZ2UpCiAgICBiIGRpc3BlbnNlSGVhbHRoU2NhbGVkUmV3YXJkX2FmdGVyX2lubGluZWRfc3JjL2FsZ29jaGkuYWxnby50czo6QWxnb2NoaS5zdGFnZVJld2FyZEZvclN0YWdlQDYKCgovLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjpBbGdvY2hpLmJ1cm5SZXdhcmRzKHNlbmRlcjogYnl0ZXMsIGFtb3VudDogdWludDY0KSAtPiB2b2lkOgpidXJuUmV3YXJkczoKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NjMxCiAgICAvLyBwcml2YXRlIGJ1cm5SZXdhcmRzKHNlbmRlcjogQWNjb3VudCwgYW1vdW50OiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo2MzIKICAgIC8vIGFzc2VydCh0aGlzLnJld2FyZEFzYUlkLmhhc1ZhbHVlLCAnUmV3YXJkIEFTQSBub3QgY29uZmlndXJlZCcpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo5NwogICAgLy8gcmV3YXJkQXNhSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCkKICAgIGJ5dGVjIDE3IC8vICJyZXdhcmRBc2FJZCIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NjMyCiAgICAvLyBhc3NlcnQodGhpcy5yZXdhcmRBc2FJZC5oYXNWYWx1ZSwgJ1Jld2FyZCBBU0Egbm90IGNvbmZpZ3VyZWQnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gUmV3YXJkIEFTQSBub3QgY29uZmlndXJlZAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo2MzUKICAgIC8vIGNvbnN0IFtiYWxhbmNlLCBoYXNCYWxhbmNlXSA9IG9wLkFzc2V0SG9sZGluZy5hc3NldEJhbGFuY2Uoc2VuZGVyLCBhc3NldCkKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjYzNgogICAgLy8gYXNzZXJ0KGhhc0JhbGFuY2UgJiYgYmFsYW5jZSA+PSBhbW91bnQsICdJbnN1ZmZpY2llbnQgJFRBTUEnKQogICAgYnogYnVyblJld2FyZHNfYm9vbF9mYWxzZUAzCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIC0xCiAgICA+PQogICAgYnogYnVyblJld2FyZHNfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMQoKYnVyblJld2FyZHNfYm9vbF9tZXJnZUA0OgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo2MzYKICAgIC8vIGFzc2VydChoYXNCYWxhbmNlICYmIGJhbGFuY2UgPj0gYW1vdW50LCAnSW5zdWZmaWNpZW50ICRUQU1BJykKICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgJFRBTUEKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NjM4LTY0NgogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50LAogICAgLy8gICAgIGFzc2V0U2VuZGVyOiBzZW5kZXIsCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLnplcm9BZGRyZXNzLAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjY0MwogICAgLy8gYXNzZXRSZWNlaXZlcjogR2xvYmFsLnplcm9BZGRyZXNzLAogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBBc3NldFNlbmRlcgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBmcmFtZV9kaWcgMAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NjM4LTY0NQogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50LAogICAgLy8gICAgIGFzc2V0U2VuZGVyOiBzZW5kZXIsCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLnplcm9BZGRyZXNzLAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjY0NAogICAgLy8gZmVlOiAwLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjYzOC02NDYKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgICBhc3NldFNlbmRlcjogc2VuZGVyLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC56ZXJvQWRkcmVzcywKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NjQ4CiAgICAvLyB0aGlzLnRvdGFsUmV3YXJkc0J1cm5lZC52YWx1ZSA9IHRoaXMudG90YWxSZXdhcmRzQnVybmVkLnZhbHVlICsgYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo5NAogICAgLy8gdG90YWxSZXdhcmRzQnVybmVkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyAxNCAvLyAidG90YWxSZXdhcmRzQnVybmVkIgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo2NDgKICAgIC8vIHRoaXMudG90YWxSZXdhcmRzQnVybmVkLnZhbHVlID0gdGhpcy50b3RhbFJld2FyZHNCdXJuZWQudmFsdWUgKyBhbW91bnQKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6OTQKICAgIC8vIHRvdGFsUmV3YXJkc0J1cm5lZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgMTQgLy8gInRvdGFsUmV3YXJkc0J1cm5lZCIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6NjQ4CiAgICAvLyB0aGlzLnRvdGFsUmV3YXJkc0J1cm5lZC52YWx1ZSA9IHRoaXMudG90YWxSZXdhcmRzQnVybmVkLnZhbHVlICsgYW1vdW50CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgpidXJuUmV3YXJkc19ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgYiBidXJuUmV3YXJkc19ib29sX21lcmdlQDQKCgovLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjpBbGdvY2hpLmFwcGx5VHJhaXRCeXRlcyhhY2NvdW50OiBieXRlcywgc291cmNlOiBieXRlcykgLT4gdm9pZDoKYXBwbHlUcmFpdEJ5dGVzOgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo2ODIKICAgIC8vIHByaXZhdGUgYXBwbHlUcmFpdEJ5dGVzKGFjY291bnQ6IEFjY291bnQsIHNvdXJjZTogYnl0ZXMpOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo2ODMKICAgIC8vIHRoaXMudHJhaXRDb2xvcihhY2NvdW50KS52YWx1ZSA9IG9wLmJ0b2koc291cmNlLnNsaWNlKDAsIDEpKSAlIFRSQUlUX0NPTE9SX01BWAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGludGNfMCAvLyAwCiAgICBkaWcgMQogICAgPj0KICAgIGludGNfMCAvLyAwCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGludGNfMSAvLyAxCiAgICBkaWcgMgogICAgPj0KICAgIGludGNfMSAvLyAxCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgYnRvaQogICAgcHVzaGludCAxNiAvLyAxNgogICAgJQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEzNwogICAgLy8gdHJhaXRDb2xvciA9IExvY2FsU3RhdGU8dWludDY0PigpIC8vIDAtMTUKICAgIGJ5dGVjIDM0IC8vICJ0cmFpdENvbG9yIgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo2ODMKICAgIC8vIHRoaXMudHJhaXRDb2xvcihhY2NvdW50KS52YWx1ZSA9IG9wLmJ0b2koc291cmNlLnNsaWNlKDAsIDEpKSAlIFRSQUlUX0NPTE9SX01BWAogICAgdW5jb3ZlciAyCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjY4NAogICAgLy8gdGhpcy50cmFpdFBhdHRlcm4oYWNjb3VudCkudmFsdWUgPSBvcC5idG9pKHNvdXJjZS5zbGljZSgxLCAyKSkgJSBUUkFJVF9QQVRURVJOX01BWAogICAgcHVzaGludCAyIC8vIDIKICAgIGRpZyAyCiAgICA+PQogICAgcHVzaGludCAyIC8vIDIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBidG9pCiAgICBwdXNoaW50IDggLy8gOAogICAgJQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEzOAogICAgLy8gdHJhaXRQYXR0ZXJuID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCkgLy8gMC03CiAgICBieXRlYyAzNSAvLyAidHJhaXRQYXR0ZXJuIgogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo2ODQKICAgIC8vIHRoaXMudHJhaXRQYXR0ZXJuKGFjY291bnQpLnZhbHVlID0gb3AuYnRvaShzb3VyY2Uuc2xpY2UoMSwgMikpICUgVFJBSVRfUEFUVEVSTl9NQVgKICAgIHVuY292ZXIgMgogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc3JjL2FsZ29jaGkuYWxnby50czo2ODUKICAgIC8vIHRoaXMudHJhaXRBY2Nlc3NvcnkoYWNjb3VudCkudmFsdWUgPSBvcC5idG9pKHNvdXJjZS5zbGljZSgyLCAzKSkgJSBUUkFJVF9BQ0NFU1NPUllfTUFYCiAgICBpbnRjXzMgLy8gMwogICAgZGlnIDIKICAgID49CiAgICBpbnRjXzMgLy8gMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBidG9pCiAgICBwdXNoaW50IDggLy8gOAogICAgJQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBzcmMvYWxnb2NoaS5hbGdvLnRzOjEzOQogICAgLy8gdHJhaXRBY2Nlc3NvcnkgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKSAvLyAwLTcKICAgIGJ5dGVjIDM2IC8vICJ0cmFpdEFjY2Vzc29yeSIKICAgIC8vIHNyYy9hbGdvY2hpLmFsZ28udHM6Njg1CiAgICAvLyB0aGlzLnRyYWl0QWNjZXNzb3J5KGFjY291bnQpLnZhbHVlID0gb3AuYnRvaShzb3VyY2Uuc2xpY2UoMiwgMykpICUgVFJBSVRfQUNDRVNTT1JZX01BWAogICAgdW5jb3ZlciAyCiAgICBhcHBfbG9jYWxfcHV0CiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAEAAEKAyYnBmh1bmdlcgloYXBwaW5lc3MOY29tbWl0dGVkUm91bmQGaXNEZWFkB21heFN0YXQEFR98dQdhc3NldElkBXN0YWdlCmxhc3RVcGRhdGULYmVhY29uQXBwSWQHYWdlRGF5cxJmZWVkSHVuZ2VyU25hcHNob3QJdG90YWxQZXRzEXRvdGFsUmV3YXJkc01pbmVkEnRvdGFsUmV3YXJkc0J1cm5lZA5pc0Jvb3RzdHJhcHBlZA1wZXRIdW5nZXJDb3N0C3Jld2FyZEFzYUlkD3RyYWl0c0ZpbmFsaXplZAUAAwAAABNyYW5kb21uZXNzR2FwUm91bmRzC3JhbmRvbURlbGF5EGFnZVNlY29uZHNQZXJEYXkOaHVuZ2VySW5jcmVhc2UUaHVuZ2VyRGVjYXlOdW1lcmF0b3IWaHVuZ2VyRGVjYXlEZW5vbWluYXRvchdoYXBwaW5lc3NEZWNheU51bWVyYXRvchloYXBwaW5lc3NEZWNheURlbm9taW5hdG9yCmV2b2x2ZUNvc3QKcmV2aXZlQ29zdA9zdGFnZVJld2FyZEJhYnkPc3RhZ2VSZXdhcmRUZWVuEHN0YWdlUmV3YXJkQWR1bHQKMDEyMzQ1Njc4OQp0cmFpdENvbG9yDHRyYWl0UGF0dGVybg50cmFpdEFjY2Vzc29yeQQYk5LFAgADMRhAAGsnDCJnJw0iZycOImcnFCRnJxWBC2cnBIFkZycWgYCjBWcnDyJnJxeBHmcnEIEPZycYgRlnJxmBwHBnJxqBFGcnG4HgqAFnJxyBwPD1C2cnHYGA4esXZycegaDCHmcnH4HAhD1nJyCBgIl6ZzEbQQBYgASbeuiUNhoAjgEAQDEZFEQxGESCBwS2H2LVBPdhzpwE+SjpjQQd3gAXBJ6TQjQEdlYYCgTOGeg+NhoAjgcAOQFyAasCSQKuAuADPAAxGSMSMRgQREIAkzEZFDEYFBBEI0OKAQGL/yQMQQAHJyGL/yNYiYv/JAqI/+iL/yQYJyFMI1hQiTYaAUkVgQgSRBciJw9lRBREJwlMZ7EyCkcDsiyyK7IqsimAD0FMR09DSEkgUkVXQVJEU7ImgAdSRVdBUkRTsiWBBrIjgYCU69wDsiIlshAisgGztDwnEUsBZycPI2cWJwVMULAjQzEWIwlJOBAjEkRJOAiBoI0GD0sBOAAxABIQTDgHMgoSEEQiJwxlRCMIsUmI/0mACUFsZ29jaGkgI0xQMgpHA4AOaXBmczovL3BlbmRpbmeyJ7IssiuyKrIpsiaAB0FMR09DSEmyJSKyIyOyIiWyECKyAbO0PDEAiAN/SwEnBksEZksBKIFQZksBKYFQZksBJwoiZksBJwciZjIHSwInCE8CZksBKyJmSwEnEiJmSwEqTwJmSScLImZJJyIiZkknIyJmJyQiZicMTwJnFicFTFCwI0MxAEmIAitJIihjRCInF2VEIicEZUROAggiTwKIA7hLAShLAmaIAv9LAipPAmZLAScLTwJmiAO7I0OAADEARwKIAe9JiALISSIqY0SAA3BldIgC3EkiWUsBFUsCTgJSVwIATIEQU0AAToEUSwJJIicLY0RPAgsiJwRlRApLAUyIAzgiKGNMSU4CRQVEIicQZUQNQQAeIicQZURLA0wJSwJJKE8DZkmIA0pJKiJmJwsiZiNDIkL/50cCFSJLAQ8iSwJPAk0jSwIPI08DTwJNUheBHxgkCEL/kzEARwKIAVNJIicHY0xJTgNOA0QiJwpjTE4CREAAL0klD0EAKSNLA0kiJwdjRE8CSU8CDUQiJxxlREsCTIgDOEsBJwdPAmaBHogClyNDSwEjEkEADEmBBw9BAAWBAkL/xUsBQv/AMQBJIicGY0UBREkiK2NEIxJEIicdZURLAUyIAvVJKyJmSSiBMmZJKYEyZicIMgdmI0MxAEcCIicGY0UBREkiJxJjRBRESYgBiUkiKmNEgAZ0cmFpdHOIAZpJIllLARVLAk4CUlcCAEyBEFNBABBKiALoSwFJJxIjZioiZiNDMQAyBxZQAUsCTIgCz0L/5DYaAUkVgQgSRCInCWVEsTIAJyWyGk8CshqABgAEdGVzdLIaTLIYgQayELIBs7Q7QAAJJxMnBUxQsCNDtToASVcABCcFEkRXBgBJFUmBIBJMFlcGAk8CUIABACJPA1QnJkxQTFBC/82KAQCAAEcEi/8iJwZjRQFEi/8iK2NEFEQyB4v/IicIY0xJTwJEQQAIiwWLBg5BAAiL/ycIiwVmiYsFiwYJSYwCQAABiSInGGVEiwJJTwILIicZZUQKSU4CjAQiJxplRAsiJxtlRAqMA4v/IihjTElOAowBRIv/IiljTIwARAxBAFiLAYsECYv/KE8CZosAiwMNQQBBiwCLAwmL/ylPAmYiJxZlRIsCTAqL/yInCmNECIv/JwpPAmaL/4gAtkAADov/IitjREAABYv/KyNmi/8nCIsFZokiQv/AIkL/qYoBAIv/IipjRElEMgYiJxVlRE8CCA1EiTIGIicUZUQIiYoDASInCWVFAUAAAycTiYv9IicGY0QWi/1Qi/9QAbEyACInCWVEi/4WgAIAIE8EUCclshpMshqyGrIYgQayELIBs7Q7QAADJxOJtToASVcABCcFEkRXBgBJFUmBIBJMFlcGAk8CUIABACJPA1QnJkxQTFCJigEBi/8iKGNEi/8iKWNESgxMTgJNiYoCAIv+IiljRIv/CCInBGVEIkyIAAeL/ilPAmaJigMBi/2L/gxBAAOL/omL/Yv/DUEAA4v/iYv9iYoBAIv/IicHY0xJTwJEQAA0IiceZUSL/4j/lgsiJwRlRAoiJxFlRLFLAbISi/+yFLIRgQSyECKyAbMiJw1lRAgnDUxniYsAIxJBAAgiJx9lREL/wiInIGVEQv+6igIAIicRZUxJTwJEi/5McABBADCLAYv/D0EAKCNEsTIDshSL/rITi/+yEosAshGBBLIQIrIBsyInDmVEi/8IJw5MZ4kiQv/VigIAi/8VIksBDyJLAk8CTSNLAg8jSwNPAk2L/08CSwJSF4EQGIv+JyJPAmaBAksCD4ECSwNPAk2L/08CSwJSF4EIGIv+JyNPAmYlSwIPJU8DTwJNi/9OAlIXgQgYi/4nJE8CZok=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 3, "patch": 2 } }, "events": [], "templateVariables": {} }