From d56b5cd5d97f884c049446f5931ffc3d695c22aa Mon Sep 17 00:00:00 2001 From: Patrick Bennett Date: Sun, 29 Sep 2024 00:20:59 -0400 Subject: [PATCH 01/24] feat(contracts): uncomment abi.readonly modifiers now that the sdk is ok with it in the generated json specs --- contracts/__test__/contracts.test.ts | 18 - .../artifacts/StakingPool.arc32.json | 1 + .../contracts/artifacts/StakingPool.arc4.json | 1 + .../artifacts/StakingPool.arc56_draft.json | 21 +- .../artifacts/StakingPool.src_map.json | 20 +- .../artifacts/ValidatorRegistry.approval.teal | 712 +- .../artifacts/ValidatorRegistry.arc32.json | 17 +- .../artifacts/ValidatorRegistry.arc4.json | 15 + .../ValidatorRegistry.arc56_draft.json | 13429 ++++++++-------- .../artifacts/ValidatorRegistry.src_map.json | 13412 +++++++-------- .../contracts/clients/StakingPoolClient.ts | 1 + .../clients/ValidatorRegistryClient.ts | 29 +- contracts/contracts/stakingPool.algo.ts | 2 +- contracts/contracts/validatorRegistry.algo.ts | 32 +- .../contracts/StakingPool.arc32.json | 1 + .../contracts/ValidatorRegistry.arc32.json | 17 +- ui/src/contracts/StakingPoolClient.ts | 1 + ui/src/contracts/ValidatorRegistryClient.ts | 29 +- 18 files changed, 13935 insertions(+), 13823 deletions(-) diff --git a/contracts/__test__/contracts.test.ts b/contracts/__test__/contracts.test.ts index 398b483e..6fb5ab2e 100644 --- a/contracts/__test__/contracts.test.ts +++ b/contracts/__test__/contracts.test.ts @@ -4500,23 +4500,5 @@ describe('CoinFabrik Audit suggested extra tests', () => { .execute({ populateAppCallResources: true, suppressLog: true }), ).rejects.toThrowError() }) - - // FAILS - Reflects ISSUE MI-05 - // invalid test - sunsetting is timestamp, not round and setting before now is way to instantly sunset which - // may be desired outcome. - test.skip('SunsettingOn cannot be set before now', async () => { - // set the new sunset 1000 rounds before now - const badSunset = (await fixture.context.algod.getTransactionParams().do()).firstRound - 1000 - - await expect( - validatorMasterClient - .compose() - .changeValidatorSunsetInfo( - { validatorId, sunsettingOn: badSunset, sunsettingTo: validatorId }, - { sender: validatorOwnerAccount }, - ) - .execute({ populateAppCallResources: true, suppressLog: true }), - ).rejects.toThrowError() - }) }) }) diff --git a/contracts/contracts/artifacts/StakingPool.arc32.json b/contracts/contracts/artifacts/StakingPool.arc32.json index 11ea9c56..77efe2d4 100644 --- a/contracts/contracts/artifacts/StakingPool.arc32.json +++ b/contracts/contracts/artifacts/StakingPool.arc32.json @@ -264,6 +264,7 @@ { "name": "getStakerInfo", "desc": "Retrieves the staked information for a given staker.", + "readonly": true, "args": [ { "name": "staker", diff --git a/contracts/contracts/artifacts/StakingPool.arc4.json b/contracts/contracts/artifacts/StakingPool.arc4.json index 125ec8d7..91691981 100644 --- a/contracts/contracts/artifacts/StakingPool.arc4.json +++ b/contracts/contracts/artifacts/StakingPool.arc4.json @@ -103,6 +103,7 @@ { "name": "getStakerInfo", "desc": "Retrieves the staked information for a given staker.", + "readonly": true, "args": [ { "name": "staker", diff --git a/contracts/contracts/artifacts/StakingPool.arc56_draft.json b/contracts/contracts/artifacts/StakingPool.arc56_draft.json index 8a5ead54..43a64489 100644 --- a/contracts/contracts/artifacts/StakingPool.arc56_draft.json +++ b/contracts/contracts/artifacts/StakingPool.arc56_draft.json @@ -139,6 +139,7 @@ { "name": "getStakerInfo", "desc": "Retrieves the staked information for a given staker.", + "readonly": true, "args": [ { "name": "staker", @@ -7865,7 +7866,7 @@ }, { "teal": 1731, - "source": 451, + "source": 450, "pc": [ 1801, 1802 @@ -7919,7 +7920,7 @@ }, { "teal": 1744, - "source": 451, + "source": 450, "pc": [ 1812, 1813, @@ -7928,35 +7929,35 @@ }, { "teal": 1745, - "source": 451, + "source": 450, "pc": [ 1815 ] }, { "teal": 1746, - "source": 451, + "source": 450, "pc": [ 1816 ] }, { "teal": 1747, - "source": 451, + "source": 450, "pc": [ 1817 ] }, { "teal": 1748, - "source": 451, + "source": 450, "pc": [ 1818 ] }, { "teal": 1758, - "source": 451, + "source": 450, "pc": [ 1819, 1820, @@ -7965,7 +7966,7 @@ }, { "teal": 1761, - "source": 451, + "source": 450, "pc": [ 1822, 1823 @@ -8340,7 +8341,7 @@ }, { "teal": 1846, - "source": 451, + "source": 450, "pc": [ 1902, 1903 @@ -8348,7 +8349,7 @@ }, { "teal": 1847, - "source": 451, + "source": 450, "pc": [ 1904 ] diff --git a/contracts/contracts/artifacts/StakingPool.src_map.json b/contracts/contracts/artifacts/StakingPool.src_map.json index b7ba9f30..2cb6c5f1 100644 --- a/contracts/contracts/artifacts/StakingPool.src_map.json +++ b/contracts/contracts/artifacts/StakingPool.src_map.json @@ -7376,7 +7376,7 @@ }, { "teal": 1731, - "source": 451, + "source": 450, "pc": [ 1801, 1802 @@ -7430,7 +7430,7 @@ }, { "teal": 1744, - "source": 451, + "source": 450, "pc": [ 1812, 1813, @@ -7439,35 +7439,35 @@ }, { "teal": 1745, - "source": 451, + "source": 450, "pc": [ 1815 ] }, { "teal": 1746, - "source": 451, + "source": 450, "pc": [ 1816 ] }, { "teal": 1747, - "source": 451, + "source": 450, "pc": [ 1817 ] }, { "teal": 1748, - "source": 451, + "source": 450, "pc": [ 1818 ] }, { "teal": 1758, - "source": 451, + "source": 450, "pc": [ 1819, 1820, @@ -7476,7 +7476,7 @@ }, { "teal": 1761, - "source": 451, + "source": 450, "pc": [ 1822, 1823 @@ -7851,7 +7851,7 @@ }, { "teal": 1846, - "source": 451, + "source": 450, "pc": [ 1902, 1903 @@ -7859,7 +7859,7 @@ }, { "teal": 1847, - "source": 451, + "source": 450, "pc": [ 1904 ] diff --git a/contracts/contracts/artifacts/ValidatorRegistry.approval.teal b/contracts/contracts/artifacts/ValidatorRegistry.approval.teal index f472e0bc..adb2a9e8 100644 --- a/contracts/contracts/artifacts/ValidatorRegistry.approval.teal +++ b/contracts/contracts/artifacts/ValidatorRegistry.approval.teal @@ -558,10 +558,14 @@ getPools: return // getPoolAppId(validatorId: uint64, poolId: uint64): uint64 +// +// getPoolAppId is useful for callers to determine app to call for removing stake if they don't have staking or +// want to get staker list for an account. The staking pool also uses it to get the app id of staking pool 1 +// (which contains reward tokens if being used) so that the amount available can be determined. getPoolAppId: proto 2 1 - // contracts/validatorRegistry.algo.ts:213 + // contracts/validatorRegistry.algo.ts:215 // assert( // poolId !== 0 && poolId <= this.validatorList(validatorId).value.pools.length, // 'pool id must be between 1 and number of pools for this validator', @@ -580,7 +584,7 @@ getPoolAppId: // pool id must be between 1 and number of pools for this validator assert - // contracts/validatorRegistry.algo.ts:217 + // contracts/validatorRegistry.algo.ts:219 // return this.validatorList(validatorId).value.pools[poolId - 1].poolAppId int 268 // headOffset frame_dig -2 // poolId: uint64 @@ -627,7 +631,7 @@ getPoolAppId: getPoolInfo: proto 1 1 - // contracts/validatorRegistry.algo.ts:222 + // contracts/validatorRegistry.algo.ts:224 // return this.validatorList(poolKey.id).value.pools[poolKey.poolId - 1] int 268 // headOffset frame_dig -1 // poolKey: ValidatorPoolKey @@ -680,7 +684,7 @@ getCurMaxStakePerPool: byte 0x dupn 2 - // contracts/validatorRegistry.algo.ts:233 + // contracts/validatorRegistry.algo.ts:236 // numPools = this.validatorList(validatorId).value.state.numPools as uint64 int 242 int 2 @@ -693,14 +697,14 @@ getCurMaxStakePerPool: btoi frame_bury 0 // numPools: uint64 - // contracts/validatorRegistry.algo.ts:234 + // contracts/validatorRegistry.algo.ts:237 // hardMaxDividedBetweenPools = this.maxAllowedStake() / numPools callsub maxAllowedStake frame_dig 0 // numPools: uint64 / frame_bury 1 // hardMaxDividedBetweenPools: uint64 - // contracts/validatorRegistry.algo.ts:235 + // contracts/validatorRegistry.algo.ts:238 // maxPerPool: uint64 = this.validatorList(validatorId).value.config.maxAlgoPerPool int 217 int 8 @@ -714,7 +718,7 @@ getCurMaxStakePerPool: frame_bury 2 // maxPerPool: uint64 // *if1_condition - // contracts/validatorRegistry.algo.ts:236 + // contracts/validatorRegistry.algo.ts:239 // maxPerPool === 0 frame_dig 2 // maxPerPool: uint64 int 0 @@ -722,14 +726,14 @@ getCurMaxStakePerPool: bz *if1_end // *if1_consequent - // contracts/validatorRegistry.algo.ts:237 + // contracts/validatorRegistry.algo.ts:240 // maxPerPool = this.maxAlgoAllowedPerPool() callsub maxAlgoAllowedPerPool frame_bury 2 // maxPerPool: uint64 *if1_end: // *if2_condition - // contracts/validatorRegistry.algo.ts:239 + // contracts/validatorRegistry.algo.ts:242 // hardMaxDividedBetweenPools < maxPerPool frame_dig 1 // hardMaxDividedBetweenPools: uint64 frame_dig 2 // maxPerPool: uint64 @@ -737,13 +741,13 @@ getCurMaxStakePerPool: bz *if2_end // *if2_consequent - // contracts/validatorRegistry.algo.ts:240 + // contracts/validatorRegistry.algo.ts:243 // maxPerPool = hardMaxDividedBetweenPools frame_dig 1 // hardMaxDividedBetweenPools: uint64 frame_bury 2 // maxPerPool: uint64 *if2_end: - // contracts/validatorRegistry.algo.ts:242 + // contracts/validatorRegistry.algo.ts:245 // return maxPerPool frame_dig 2 // maxPerPool: uint64 @@ -787,7 +791,7 @@ getCurMaxStakePerPool: doesStakerNeedToPayMBR: proto 1 1 - // contracts/validatorRegistry.algo.ts:251 + // contracts/validatorRegistry.algo.ts:254 // return !this.stakerPoolSet(staker).exists byte 0x737073 // "sps" frame_dig -1 // staker: Address @@ -842,7 +846,7 @@ getStakedPoolsForAccount: dupn 2 // *if3_condition - // contracts/validatorRegistry.algo.ts:261 + // contracts/validatorRegistry.algo.ts:265 // !this.stakerPoolSet(staker).exists byte 0x737073 // "sps" frame_dig -1 // staker: Address @@ -854,18 +858,18 @@ getStakedPoolsForAccount: bz *if3_end // *if3_consequent - // contracts/validatorRegistry.algo.ts:262 + // contracts/validatorRegistry.algo.ts:266 // return [] byte 0x b *getStakedPoolsForAccount*return *if3_end: - // contracts/validatorRegistry.algo.ts:264 + // contracts/validatorRegistry.algo.ts:268 // retData: ValidatorPoolKey[] = [] byte 0x frame_bury 0 // retData: ValidatorPoolKey[] - // contracts/validatorRegistry.algo.ts:265 + // contracts/validatorRegistry.algo.ts:269 // poolSet = clone(this.stakerPoolSet(staker).value) byte 0x737073 // "sps" frame_dig -1 // staker: Address @@ -876,13 +880,13 @@ getStakedPoolsForAccount: assert frame_bury 1 // poolSet: (uint64,uint64,uint64)[6] - // contracts/validatorRegistry.algo.ts:266 + // contracts/validatorRegistry.algo.ts:270 // for (let i = 0; i < poolSet.length; i += 1) int 0 frame_bury 2 // i: uint64 *for_1: - // contracts/validatorRegistry.algo.ts:266 + // contracts/validatorRegistry.algo.ts:270 // i < poolSet.length frame_dig 2 // i: uint64 int 6 @@ -890,7 +894,7 @@ getStakedPoolsForAccount: bz *for_1_end // *if4_condition - // contracts/validatorRegistry.algo.ts:267 + // contracts/validatorRegistry.algo.ts:271 // poolSet[i].id !== 0 frame_dig 1 // poolSet: (uint64,uint64,uint64)[6] frame_dig 2 // i: uint64 @@ -906,7 +910,7 @@ getStakedPoolsForAccount: bz *if4_end // *if4_consequent - // contracts/validatorRegistry.algo.ts:268 + // contracts/validatorRegistry.algo.ts:272 // retData.push(poolSet[i]) frame_dig 0 // retData: ValidatorPoolKey[] frame_dig 1 // poolSet: (uint64,uint64,uint64)[6] @@ -921,7 +925,7 @@ getStakedPoolsForAccount: *if4_end: *for_1_continue: - // contracts/validatorRegistry.algo.ts:266 + // contracts/validatorRegistry.algo.ts:270 // i += 1 frame_dig 2 // i: uint64 int 1 @@ -930,7 +934,7 @@ getStakedPoolsForAccount: b *for_1 *for_1_end: - // contracts/validatorRegistry.algo.ts:271 + // contracts/validatorRegistry.algo.ts:275 // return retData frame_dig 0 // retData: ValidatorPoolKey[] @@ -968,7 +972,7 @@ getStakedPoolsForAccount: getTokenPayoutRatio: proto 1 1 - // contracts/validatorRegistry.algo.ts:283 + // contracts/validatorRegistry.algo.ts:287 // return this.validatorList(validatorId).value.tokenPayoutRatio int 700 // headOffset int 200 @@ -1000,7 +1004,7 @@ getTokenPayoutRatio: getNodePoolAssignments: proto 1 1 - // contracts/validatorRegistry.algo.ts:288 + // contracts/validatorRegistry.algo.ts:292 // assert(this.validatorList(validatorId).exists, "the specified validator id doesn't exist") byte 0x76 // "v" frame_dig -1 // validatorId: uint64 @@ -1013,7 +1017,7 @@ getNodePoolAssignments: // the specified validator id doesn't exist assert - // contracts/validatorRegistry.algo.ts:290 + // contracts/validatorRegistry.algo.ts:294 // return this.validatorList(validatorId).value.nodePoolAssignments int 900 // headOffset int 192 @@ -1042,7 +1046,7 @@ getNodePoolAssignments: getNFDRegistryID: proto 0 1 - // contracts/validatorRegistry.algo.ts:294 + // contracts/validatorRegistry.algo.ts:299 // return this.nfdRegistryAppId load 200 // TMPL_nfdRegistryAppId retsub @@ -1101,12 +1105,12 @@ addValidator: // Push empty bytes after the frame pointer to reserve space for local variables byte 0x - // contracts/validatorRegistry.algo.ts:306 + // contracts/validatorRegistry.algo.ts:311 // this.validateConfig(config) frame_dig -3 // config: ValidatorConfig callsub validateConfig - // contracts/validatorRegistry.algo.ts:308 + // contracts/validatorRegistry.algo.ts:313 // verifyPayTxn(mbrPayment, { receiver: this.app.address, amount: this.getMbrAmounts().addValidatorMbr }) // verify receiver frame_dig -1 // mbrPayment: PayTxn @@ -1128,7 +1132,7 @@ addValidator: // transaction verification failed: {"txn":"mbrPayment","field":"amount","expected":"this.getMbrAmounts().addValidatorMbr"} assert - // contracts/validatorRegistry.algo.ts:310 + // contracts/validatorRegistry.algo.ts:315 // assert(mbrPayment.fee > 10 * 1000000, 'fee must be 10 ALGO or more to prevent spamming of validators') frame_dig -1 // mbrPayment: PayTxn gtxns Fee @@ -1138,7 +1142,7 @@ addValidator: // fee must be 10 ALGO or more to prevent spamming of validators assert - // contracts/validatorRegistry.algo.ts:313 + // contracts/validatorRegistry.algo.ts:318 // validatorId = this.numValidators.value + 1 byte 0x6e756d56 // "numV" app_global_get @@ -1146,13 +1150,13 @@ addValidator: + frame_bury 0 // validatorId: uint64 - // contracts/validatorRegistry.algo.ts:314 + // contracts/validatorRegistry.algo.ts:319 // this.numValidators.value = validatorId byte 0x6e756d56 // "numV" frame_dig 0 // validatorId: uint64 app_global_put - // contracts/validatorRegistry.algo.ts:316 + // contracts/validatorRegistry.algo.ts:321 // this.validatorList(validatorId).create() byte 0x76 // "v" frame_dig 0 // validatorId: uint64 @@ -1162,7 +1166,7 @@ addValidator: box_create pop - // contracts/validatorRegistry.algo.ts:317 + // contracts/validatorRegistry.algo.ts:322 // this.validatorList(validatorId).value.config = config int 0 frame_dig -3 // config: ValidatorConfig @@ -1173,7 +1177,7 @@ addValidator: cover 2 box_replace - // contracts/validatorRegistry.algo.ts:318 + // contracts/validatorRegistry.algo.ts:323 // this.validatorList(validatorId).value.config.id = validatorId int 0 frame_dig 0 // validatorId: uint64 @@ -1186,7 +1190,7 @@ addValidator: box_replace // *if5_condition - // contracts/validatorRegistry.algo.ts:321 + // contracts/validatorRegistry.algo.ts:326 // config.nfdForInfo !== 0 frame_dig -3 // config: ValidatorConfig extract 72 8 @@ -1196,7 +1200,7 @@ addValidator: bz *if5_end // *if5_consequent - // contracts/validatorRegistry.algo.ts:323 + // contracts/validatorRegistry.algo.ts:328 // assert(this.isNFDAppIDValid(config.nfdForInfo), 'provided NFD must be valid') frame_dig -3 // config: ValidatorConfig extract 72 8 @@ -1206,7 +1210,7 @@ addValidator: // provided NFD must be valid assert - // contracts/validatorRegistry.algo.ts:325 + // contracts/validatorRegistry.algo.ts:330 // assert( // this.txn.sender === (AppID.fromUint64(config.nfdForInfo).globalState('i.owner.a') as Address), // 'If specifying NFD, account adding validator must be owner', @@ -1227,7 +1231,7 @@ addValidator: *if5_end: // *if6_condition - // contracts/validatorRegistry.algo.ts:331 + // contracts/validatorRegistry.algo.ts:336 // config.entryGatingType === GATING_TYPE_CREATED_BY_NFD_ADDRESSES || // config.entryGatingType === GATING_TYPE_SEGMENT_OF_NFD frame_dig -3 // config: ValidatorConfig @@ -1248,7 +1252,7 @@ addValidator: bz *if6_end // *if6_consequent - // contracts/validatorRegistry.algo.ts:335 + // contracts/validatorRegistry.algo.ts:340 // assert( // this.isNFDAppIDValid(config.entryGatingAssets[0]), // 'provided NFD App id for gating must be valid NFD', @@ -1262,7 +1266,7 @@ addValidator: assert *if6_end: - // contracts/validatorRegistry.algo.ts:340 + // contracts/validatorRegistry.algo.ts:345 // this.retiOP_addedValidator.log({ id: validatorId, owner: config.owner, manager: config.manager }) byte 0xa8dd21cb // retiOP_addedValidator(uint64,address,address) frame_dig 0 // validatorId: uint64 @@ -1276,7 +1280,7 @@ addValidator: concat log - // contracts/validatorRegistry.algo.ts:341 + // contracts/validatorRegistry.algo.ts:346 // return validatorId frame_dig 0 // validatorId: uint64 @@ -1315,12 +1319,12 @@ addValidator: changeValidatorManager: proto 2 0 - // contracts/validatorRegistry.algo.ts:352 + // contracts/validatorRegistry.algo.ts:357 // this.callerMustBeOwner(validatorId) frame_dig -1 // validatorId: ValidatorIdType callsub callerMustBeOwner - // contracts/validatorRegistry.algo.ts:353 + // contracts/validatorRegistry.algo.ts:358 // assert(manager !== globals.zeroAddress, 'needs to at least be valid address') frame_dig -2 // manager: Address global ZeroAddress @@ -1329,7 +1333,7 @@ changeValidatorManager: // needs to at least be valid address assert - // contracts/validatorRegistry.algo.ts:354 + // contracts/validatorRegistry.algo.ts:359 // this.validatorList(validatorId).value.config.manager = manager int 40 frame_dig -2 // manager: Address @@ -1371,12 +1375,12 @@ changeValidatorManager: changeValidatorSunsetInfo: proto 3 0 - // contracts/validatorRegistry.algo.ts:366 + // contracts/validatorRegistry.algo.ts:371 // this.callerMustBeOwner(validatorId) frame_dig -1 // validatorId: ValidatorIdType callsub callerMustBeOwner - // contracts/validatorRegistry.algo.ts:367 + // contracts/validatorRegistry.algo.ts:372 // this.validatorList(validatorId).value.config.sunsettingOn = sunsettingOn int 226 frame_dig -2 // sunsettingOn: uint64 @@ -1388,7 +1392,7 @@ changeValidatorSunsetInfo: cover 2 box_replace - // contracts/validatorRegistry.algo.ts:368 + // contracts/validatorRegistry.algo.ts:373 // this.validatorList(validatorId).value.config.sunsettingTo = sunsettingTo int 234 frame_dig -3 // sunsettingTo: ValidatorIdType @@ -1431,12 +1435,12 @@ changeValidatorSunsetInfo: changeValidatorNFD: proto 3 0 - // contracts/validatorRegistry.algo.ts:380 + // contracts/validatorRegistry.algo.ts:385 // this.callerMustBeOwner(validatorId) frame_dig -1 // validatorId: ValidatorIdType callsub callerMustBeOwner - // contracts/validatorRegistry.algo.ts:382 + // contracts/validatorRegistry.algo.ts:387 // assert(this.isNFDAppIDValid(nfdAppID), 'provided NFD must be valid') frame_dig -2 // nfdAppID: uint64 callsub isNFDAppIDValid @@ -1444,7 +1448,7 @@ changeValidatorNFD: // provided NFD must be valid assert - // contracts/validatorRegistry.algo.ts:384 + // contracts/validatorRegistry.algo.ts:389 // assert( // this.txn.sender === (AppID.fromUint64(nfdAppID).globalState('i.owner.a') as Address), // 'If specifying NFD, account adding validator must be owner', @@ -1461,7 +1465,7 @@ changeValidatorNFD: // If specifying NFD, account adding validator must be owner assert - // contracts/validatorRegistry.algo.ts:388 + // contracts/validatorRegistry.algo.ts:393 // this.validatorList(validatorId).value.config.nfdForInfo = nfdAppID int 72 frame_dig -2 // nfdAppID: uint64 @@ -1502,19 +1506,19 @@ changeValidatorNFD: changeValidatorCommissionAddress: proto 2 0 - // contracts/validatorRegistry.algo.ts:396 + // contracts/validatorRegistry.algo.ts:401 // this.callerMustBeOwner(validatorId) frame_dig -1 // validatorId: ValidatorIdType callsub callerMustBeOwner - // contracts/validatorRegistry.algo.ts:397 + // contracts/validatorRegistry.algo.ts:402 // assert(commissionAddress !== Address.zeroAddress) frame_dig -2 // commissionAddress: Address global ZeroAddress != assert - // contracts/validatorRegistry.algo.ts:398 + // contracts/validatorRegistry.algo.ts:403 // this.validatorList(validatorId).value.config.validatorCommissionAddress = commissionAddress int 177 frame_dig -2 // commissionAddress: Address @@ -1583,12 +1587,12 @@ changeValidatorCommissionAddress: changeValidatorRewardInfo: proto 6 0 - // contracts/validatorRegistry.algo.ts:413 + // contracts/validatorRegistry.algo.ts:418 // this.callerMustBeOwner(validatorId) frame_dig -1 // validatorId: ValidatorIdType callsub callerMustBeOwner - // contracts/validatorRegistry.algo.ts:415 + // contracts/validatorRegistry.algo.ts:420 // assert( // EntryGatingType >= GATING_TYPE_NONE && EntryGatingType < GATING_TYPE_CONST_MAX, // 'invalid Entry gating type', @@ -1608,7 +1612,7 @@ changeValidatorRewardInfo: assert // *if7_condition - // contracts/validatorRegistry.algo.ts:419 + // contracts/validatorRegistry.algo.ts:424 // EntryGatingType === GATING_TYPE_ASSETS_CREATED_BY frame_dig -2 // EntryGatingType: uint8 int 1 @@ -1616,7 +1620,7 @@ changeValidatorRewardInfo: bz *if7_end // *if7_consequent - // contracts/validatorRegistry.algo.ts:420 + // contracts/validatorRegistry.algo.ts:425 // assert(EntryGatingAddress !== globals.zeroAddress) frame_dig -3 // EntryGatingAddress: Address global ZeroAddress @@ -1625,7 +1629,7 @@ changeValidatorRewardInfo: *if7_end: // *if8_condition - // contracts/validatorRegistry.algo.ts:423 + // contracts/validatorRegistry.algo.ts:428 // EntryGatingType === GATING_TYPE_CREATED_BY_NFD_ADDRESSES || // EntryGatingType === GATING_TYPE_SEGMENT_OF_NFD frame_dig -2 // EntryGatingType: uint8 @@ -1642,7 +1646,7 @@ changeValidatorRewardInfo: bz *if8_end // *if8_consequent - // contracts/validatorRegistry.algo.ts:426 + // contracts/validatorRegistry.algo.ts:431 // assert(this.isNFDAppIDValid(EntryGatingAssets[0]), 'provided NFD App id for gating must be valid NFD') frame_dig -4 // EntryGatingAssets: StaticArray extract 0 8 @@ -1653,7 +1657,7 @@ changeValidatorRewardInfo: assert *if8_end: - // contracts/validatorRegistry.algo.ts:428 + // contracts/validatorRegistry.algo.ts:433 // this.validatorList(validatorId).value.config.entryGatingType = EntryGatingType int 80 frame_dig -2 // EntryGatingType: uint8 @@ -1666,7 +1670,7 @@ changeValidatorRewardInfo: cover 2 box_replace - // contracts/validatorRegistry.algo.ts:429 + // contracts/validatorRegistry.algo.ts:434 // this.validatorList(validatorId).value.config.entryGatingAddress = EntryGatingAddress int 81 frame_dig -3 // EntryGatingAddress: Address @@ -1677,7 +1681,7 @@ changeValidatorRewardInfo: cover 2 box_replace - // contracts/validatorRegistry.algo.ts:430 + // contracts/validatorRegistry.algo.ts:435 // this.validatorList(validatorId).value.config.entryGatingAssets = EntryGatingAssets int 113 frame_dig -4 // EntryGatingAssets: StaticArray @@ -1688,7 +1692,7 @@ changeValidatorRewardInfo: cover 2 box_replace - // contracts/validatorRegistry.algo.ts:431 + // contracts/validatorRegistry.algo.ts:436 // this.validatorList(validatorId).value.config.gatingAssetMinBalance = GatingAssetMinBalance int 145 frame_dig -5 // GatingAssetMinBalance: uint64 @@ -1700,7 +1704,7 @@ changeValidatorRewardInfo: cover 2 box_replace - // contracts/validatorRegistry.algo.ts:432 + // contracts/validatorRegistry.algo.ts:437 // this.validatorList(validatorId).value.config.rewardPerPayout = RewardPerPayout int 161 frame_dig -6 // RewardPerPayout: uint64 @@ -1762,12 +1766,12 @@ addPool: byte 0x dup - // contracts/validatorRegistry.algo.ts:447 + // contracts/validatorRegistry.algo.ts:452 // this.callerMustBeOwnerOrManager(validatorId) frame_dig -2 // validatorId: ValidatorIdType callsub callerMustBeOwnerOrManager - // contracts/validatorRegistry.algo.ts:450 + // contracts/validatorRegistry.algo.ts:455 // verifyPayTxn(mbrPayment, { receiver: this.app.address, amount: this.getMbrAmounts().addPoolMbr }) // verify receiver frame_dig -1 // mbrPayment: PayTxn @@ -1789,7 +1793,7 @@ addPool: // transaction verification failed: {"txn":"mbrPayment","field":"amount","expected":"this.getMbrAmounts().addPoolMbr"} assert - // contracts/validatorRegistry.algo.ts:452 + // contracts/validatorRegistry.algo.ts:457 // assert(this.validatorList(validatorId).exists, "specified validator id isn't valid") byte 0x76 // "v" frame_dig -2 // validatorId: ValidatorIdType @@ -1802,7 +1806,7 @@ addPool: // specified validator id isn't valid assert - // contracts/validatorRegistry.algo.ts:454 + // contracts/validatorRegistry.algo.ts:459 // numPools: uint64 = this.validatorList(validatorId).value.state.numPools as uint64 int 242 int 2 @@ -1816,7 +1820,7 @@ addPool: frame_bury 0 // numPools: uint64 // *if9_condition - // contracts/validatorRegistry.algo.ts:455 + // contracts/validatorRegistry.algo.ts:460 // (numPools as uint64) >= MAX_POOLS frame_dig 0 // numPools: uint64 int 24 @@ -1828,14 +1832,14 @@ addPool: err *if9_end: - // contracts/validatorRegistry.algo.ts:458 + // contracts/validatorRegistry.algo.ts:463 // numPools += 1 frame_dig 0 // numPools: uint64 int 1 + frame_bury 0 // numPools: uint64 - // contracts/validatorRegistry.algo.ts:461 + // contracts/validatorRegistry.algo.ts:466 // sendAppCall({ // onCompletion: OnCompletion.NoOp, // approvalProgram: [ @@ -1859,12 +1863,12 @@ addPool: int appl itxn_field TypeEnum - // contracts/validatorRegistry.algo.ts:462 + // contracts/validatorRegistry.algo.ts:467 // onCompletion: OnCompletion.NoOp int 0 // NoOp itxn_field OnCompletion - // contracts/validatorRegistry.algo.ts:463 + // contracts/validatorRegistry.algo.ts:468 // approvalProgram: [ // this.stakingPoolApprovalProgram.extract(0, 4096), // this.stakingPoolApprovalProgram.extract(4096, this.stakingPoolApprovalProgram.size - 4096), @@ -1886,27 +1890,27 @@ addPool: box_extract itxn_field ApprovalProgramPages - // contracts/validatorRegistry.algo.ts:467 + // contracts/validatorRegistry.algo.ts:472 // clearStateProgram: StakingPool.clearProgram() byte b64 Cw== itxn_field ClearStateProgram - // contracts/validatorRegistry.algo.ts:468 + // contracts/validatorRegistry.algo.ts:473 // globalNumUint: StakingPool.schema.global.numUint int 11 itxn_field GlobalNumUint - // contracts/validatorRegistry.algo.ts:469 + // contracts/validatorRegistry.algo.ts:474 // globalNumByteSlice: StakingPool.schema.global.numByteSlice int 3 itxn_field GlobalNumByteSlice - // contracts/validatorRegistry.algo.ts:470 + // contracts/validatorRegistry.algo.ts:475 // extraProgramPages: 3 int 3 itxn_field ExtraProgramPages - // contracts/validatorRegistry.algo.ts:471 + // contracts/validatorRegistry.algo.ts:476 // applicationArgs: [ // // creatingContractID, validatorId, poolId, minEntryStake // method('createApplication(uint64,uint64,uint64,uint64)void'), @@ -1945,7 +1949,7 @@ addPool: // Submit inner transaction itxn_submit - // contracts/validatorRegistry.algo.ts:481 + // contracts/validatorRegistry.algo.ts:486 // this.validatorList(validatorId).value.state.numPools = numPools as uint16 int 242 frame_dig 0 // numPools: uint64 @@ -1958,12 +1962,12 @@ addPool: cover 2 box_replace - // contracts/validatorRegistry.algo.ts:484 + // contracts/validatorRegistry.algo.ts:489 // poolAppId = this.itxn.createdApplicationID.id itxn CreatedApplicationID frame_bury 1 // poolAppId: uint64 - // contracts/validatorRegistry.algo.ts:485 + // contracts/validatorRegistry.algo.ts:490 // this.validatorList(validatorId).value.pools[numPools - 1].poolAppId = poolAppId int 268 // headOffset frame_dig 0 // numPools: uint64 @@ -1983,14 +1987,14 @@ addPool: cover 2 box_replace - // contracts/validatorRegistry.algo.ts:486 + // contracts/validatorRegistry.algo.ts:491 // this.addPoolToNode(validatorId, poolAppId, nodeNum) frame_dig -3 // nodeNum: uint64 frame_dig 1 // poolAppId: uint64 frame_dig -2 // validatorId: ValidatorIdType callsub addPoolToNode - // contracts/validatorRegistry.algo.ts:488 + // contracts/validatorRegistry.algo.ts:493 // this.retiOP_validatorAddedPool.log({ // id: validatorId, // num: numPools as uint16, @@ -2016,7 +2020,7 @@ addPool: concat log - // contracts/validatorRegistry.algo.ts:494 + // contracts/validatorRegistry.algo.ts:499 // return { id: validatorId, poolId: numPools as uint64, poolAppId: this.itxn!.createdApplicationID.id } frame_dig -2 // validatorId: ValidatorIdType itob @@ -2082,7 +2086,7 @@ addStake: byte 0x dupn 5 - // contracts/validatorRegistry.algo.ts:507 + // contracts/validatorRegistry.algo.ts:512 // assert(this.validatorList(validatorId).exists, "specified validator id isn't valid") byte 0x76 // "v" frame_dig -2 // validatorId: ValidatorIdType @@ -2096,7 +2100,7 @@ addStake: assert // *if10_condition - // contracts/validatorRegistry.algo.ts:510 + // contracts/validatorRegistry.algo.ts:515 // this.validatorList(validatorId).value.config.sunsettingOn > 0 int 226 int 8 @@ -2112,7 +2116,7 @@ addStake: bz *if10_end // *if10_consequent - // contracts/validatorRegistry.algo.ts:512 + // contracts/validatorRegistry.algo.ts:517 // assert( // this.validatorList(validatorId).value.config.sunsettingOn > globals.latestTimestamp, // "can't stake with a validator that is past its sunsetting time", @@ -2133,12 +2137,12 @@ addStake: assert *if10_end: - // contracts/validatorRegistry.algo.ts:518 + // contracts/validatorRegistry.algo.ts:523 // staker = this.txn.sender txn Sender frame_bury 0 // staker: address - // contracts/validatorRegistry.algo.ts:522 + // contracts/validatorRegistry.algo.ts:527 // verifyPayTxn(stakedAmountPayment, { // sender: staker, // receiver: this.app.address, @@ -2161,46 +2165,46 @@ addStake: // transaction verification failed: {"txn":"stakedAmountPayment","field":"receiver","expected":"this.app.address"} assert - // contracts/validatorRegistry.algo.ts:530 + // contracts/validatorRegistry.algo.ts:535 // this.doesStakerMeetGating(validatorId, valueToVerify) frame_dig -3 // valueToVerify: uint64 frame_dig -2 // validatorId: ValidatorIdType callsub doesStakerMeetGating - // contracts/validatorRegistry.algo.ts:532 + // contracts/validatorRegistry.algo.ts:537 // realAmount = stakedAmountPayment.amount frame_dig -1 // stakedAmountPayment: PayTxn gtxns Amount frame_bury 1 // realAmount: uint64 - // contracts/validatorRegistry.algo.ts:533 + // contracts/validatorRegistry.algo.ts:538 // mbrAmtLeftBehind: uint64 = 0 int 0 frame_bury 2 // mbrAmtLeftBehind: uint64 // *if11_condition - // contracts/validatorRegistry.algo.ts:535 + // contracts/validatorRegistry.algo.ts:540 // this.doesStakerNeedToPayMBR(staker) frame_dig 0 // staker: address callsub doesStakerNeedToPayMBR bz *if11_end // *if11_consequent - // contracts/validatorRegistry.algo.ts:538 + // contracts/validatorRegistry.algo.ts:543 // mbrAmtLeftBehind = this.getMbrAmounts().addStakerMbr callsub getMbrAmounts extract 24 8 btoi frame_bury 2 // mbrAmtLeftBehind: uint64 - // contracts/validatorRegistry.algo.ts:539 + // contracts/validatorRegistry.algo.ts:544 // realAmount -= mbrAmtLeftBehind frame_dig 1 // realAmount: uint64 frame_dig 2 // mbrAmtLeftBehind: uint64 - frame_bury 1 // realAmount: uint64 - // contracts/validatorRegistry.algo.ts:540 + // contracts/validatorRegistry.algo.ts:545 // this.stakerPoolSet(staker).create() byte 0x737073 // "sps" frame_dig 0 // staker: address @@ -2210,7 +2214,7 @@ addStake: pop *if11_end: - // contracts/validatorRegistry.algo.ts:544 + // contracts/validatorRegistry.algo.ts:549 // assert( // this.validatorList(validatorId).value.state.totalAlgoStaked + realAmount < this.maxAllowedStake(), // 'total staked for all of a validators pools may not exceed hard cap', @@ -2232,7 +2236,7 @@ addStake: // total staked for all of a validators pools may not exceed hard cap assert - // contracts/validatorRegistry.algo.ts:551 + // contracts/validatorRegistry.algo.ts:556 // findRet = this.findPoolForStaker(validatorId, staker, realAmount) frame_dig 1 // realAmount: uint64 frame_dig 0 // staker: address @@ -2240,9 +2244,9 @@ addStake: callsub findPoolForStaker frame_bury 3 // findRet: ((uint64,uint64,uint64),bool,bool) - // contracts/validatorRegistry.algo.ts:552 + // contracts/validatorRegistry.algo.ts:557 // poolKey = findRet[0] - // contracts/validatorRegistry.algo.ts:553 + // contracts/validatorRegistry.algo.ts:558 // isNewStakerToValidator = findRet[1] frame_dig 3 // findRet: ((uint64,uint64,uint64),bool,bool) store 255 // full array @@ -2251,7 +2255,7 @@ addStake: getbit frame_bury 4 // isNewStakerToValidator: bool - // contracts/validatorRegistry.algo.ts:554 + // contracts/validatorRegistry.algo.ts:559 // isNewStakerToProtocol = findRet[2] frame_dig 3 // findRet: ((uint64,uint64,uint64),bool,bool) store 255 // full array @@ -2261,7 +2265,7 @@ addStake: frame_bury 5 // isNewStakerToProtocol: bool // *if12_condition - // contracts/validatorRegistry.algo.ts:555 + // contracts/validatorRegistry.algo.ts:560 // poolKey.poolId === 0 frame_dig 3 // findRet: ((uint64,uint64,uint64),bool,bool) store 255 // full array @@ -2277,7 +2281,7 @@ addStake: err *if12_end: - // contracts/validatorRegistry.algo.ts:560 + // contracts/validatorRegistry.algo.ts:565 // this.updateStakerPoolSet(staker, poolKey) frame_dig 3 // findRet: ((uint64,uint64,uint64),bool,bool) store 255 // full array @@ -2286,7 +2290,7 @@ addStake: frame_dig 0 // staker: address callsub updateStakerPoolSet - // contracts/validatorRegistry.algo.ts:563 + // contracts/validatorRegistry.algo.ts:568 // this.callPoolAddStake( // stakedAmountPayment, // poolKey, @@ -2304,7 +2308,7 @@ addStake: frame_dig -1 // stakedAmountPayment: PayTxn callsub callPoolAddStake - // contracts/validatorRegistry.algo.ts:570 + // contracts/validatorRegistry.algo.ts:575 // this.retiOP_stakeAdded.log({ // id: validatorId, // poolNum: poolKey.poolId as uint16, @@ -2345,7 +2349,7 @@ addStake: concat log - // contracts/validatorRegistry.algo.ts:578 + // contracts/validatorRegistry.algo.ts:583 // return poolKey frame_dig 3 // findRet: ((uint64,uint64,uint64),bool,bool) store 255 // full array @@ -2397,7 +2401,7 @@ setTokenPayoutRatio: byte 0x dupn 8 - // contracts/validatorRegistry.algo.ts:598 + // contracts/validatorRegistry.algo.ts:603 // pool1AppID = this.validatorList(validatorId).value.pools[0].poolAppId int 268 int 8 @@ -2410,7 +2414,7 @@ setTokenPayoutRatio: btoi frame_bury 0 // pool1AppID: uint64 - // contracts/validatorRegistry.algo.ts:599 + // contracts/validatorRegistry.algo.ts:604 // assert(pool1AppID !== 0) frame_dig 0 // pool1AppID: uint64 int 0 @@ -2418,7 +2422,7 @@ setTokenPayoutRatio: assert // *if13_condition - // contracts/validatorRegistry.algo.ts:601 + // contracts/validatorRegistry.algo.ts:606 // this.txn.sender !== AppID.fromUint64(pool1AppID).address txn Sender frame_dig 0 // pool1AppID: uint64 @@ -2428,7 +2432,7 @@ setTokenPayoutRatio: bz *if13_end // *if13_consequent - // contracts/validatorRegistry.algo.ts:602 + // contracts/validatorRegistry.algo.ts:607 // return this.validatorList(validatorId).value.tokenPayoutRatio int 700 // headOffset int 200 @@ -2441,12 +2445,12 @@ setTokenPayoutRatio: b *setTokenPayoutRatio*return *if13_end: - // contracts/validatorRegistry.algo.ts:608 + // contracts/validatorRegistry.algo.ts:613 // curRound = globals.round global Round frame_bury 1 // curRound: uint64 - // contracts/validatorRegistry.algo.ts:609 + // contracts/validatorRegistry.algo.ts:614 // lastPayoutUpdate = this.validatorList(validatorId).value.tokenPayoutRatio.updatedForPayout int 892 int 8 @@ -2460,7 +2464,7 @@ setTokenPayoutRatio: frame_bury 2 // lastPayoutUpdate: uint64 // *if14_condition - // contracts/validatorRegistry.algo.ts:610 + // contracts/validatorRegistry.algo.ts:615 // lastPayoutUpdate !== 0 frame_dig 2 // lastPayoutUpdate: uint64 int 0 @@ -2469,7 +2473,7 @@ setTokenPayoutRatio: // *if14_consequent // *if15_condition - // contracts/validatorRegistry.algo.ts:612 + // contracts/validatorRegistry.algo.ts:617 // (AppID.fromUint64(pool1AppID).globalState('lastPayout') as uint64) === lastPayoutUpdate frame_dig 0 // pool1AppID: uint64 byte 0x6c6173745061796f7574 // "lastPayout" @@ -2482,7 +2486,7 @@ setTokenPayoutRatio: bz *if15_end // *if15_consequent - // contracts/validatorRegistry.algo.ts:613 + // contracts/validatorRegistry.algo.ts:618 // return this.validatorList(validatorId).value.tokenPayoutRatio int 700 // headOffset int 200 @@ -2495,7 +2499,7 @@ setTokenPayoutRatio: b *setTokenPayoutRatio*return *if15_end: - // contracts/validatorRegistry.algo.ts:615 + // contracts/validatorRegistry.algo.ts:620 // epochRoundLength = this.validatorList(validatorId).value.config.epochRoundLength as uint64 int 169 int 4 @@ -2508,7 +2512,7 @@ setTokenPayoutRatio: btoi frame_bury 3 // epochRoundLength: uint64 - // contracts/validatorRegistry.algo.ts:616 + // contracts/validatorRegistry.algo.ts:621 // thisEpochBegin = curRound - (curRound % epochRoundLength) frame_dig 1 // curRound: uint64 frame_dig 1 // curRound: uint64 @@ -2518,7 +2522,7 @@ setTokenPayoutRatio: frame_bury 4 // thisEpochBegin: uint64 // *if16_condition - // contracts/validatorRegistry.algo.ts:618 + // contracts/validatorRegistry.algo.ts:623 // lastPayoutUpdate - (lastPayoutUpdate % epochRoundLength) === thisEpochBegin frame_dig 2 // lastPayoutUpdate: uint64 frame_dig 2 // lastPayoutUpdate: uint64 @@ -2530,7 +2534,7 @@ setTokenPayoutRatio: bz *if16_end // *if16_consequent - // contracts/validatorRegistry.algo.ts:619 + // contracts/validatorRegistry.algo.ts:624 // return this.validatorList(validatorId).value.tokenPayoutRatio int 700 // headOffset int 200 @@ -2545,7 +2549,7 @@ setTokenPayoutRatio: *if16_end: *if14_end: - // contracts/validatorRegistry.algo.ts:622 + // contracts/validatorRegistry.algo.ts:627 // this.validatorList(validatorId).value.tokenPayoutRatio.updatedForPayout = curRound int 892 frame_dig 1 // curRound: uint64 @@ -2557,7 +2561,7 @@ setTokenPayoutRatio: cover 2 box_replace - // contracts/validatorRegistry.algo.ts:624 + // contracts/validatorRegistry.algo.ts:629 // curNumPools = this.validatorList(validatorId).value.state.numPools as uint64 int 242 int 2 @@ -2570,7 +2574,7 @@ setTokenPayoutRatio: btoi frame_bury 5 // curNumPools: uint64 - // contracts/validatorRegistry.algo.ts:625 + // contracts/validatorRegistry.algo.ts:630 // totalStakeForValidator = this.validatorList(validatorId).value.state.totalAlgoStaked int 252 int 8 @@ -2583,20 +2587,20 @@ setTokenPayoutRatio: btoi frame_bury 6 // totalStakeForValidator: uint64 - // contracts/validatorRegistry.algo.ts:626 + // contracts/validatorRegistry.algo.ts:631 // for (let i = 0; i < curNumPools; i += 1) int 0 frame_bury 7 // i: uint64 *for_2: - // contracts/validatorRegistry.algo.ts:626 + // contracts/validatorRegistry.algo.ts:631 // i < curNumPools frame_dig 7 // i: uint64 frame_dig 5 // curNumPools: uint64 < bz *for_2_end - // contracts/validatorRegistry.algo.ts:631 + // contracts/validatorRegistry.algo.ts:636 // ourPoolPctOfWhole = wideRatio( // [this.validatorList(validatorId).value.pools[i].totalAlgoStaked, 1_000_000], // [totalStakeForValidator], @@ -2630,7 +2634,7 @@ setTokenPayoutRatio: assert frame_bury 8 // ourPoolPctOfWhole: uint64 - // contracts/validatorRegistry.algo.ts:635 + // contracts/validatorRegistry.algo.ts:640 // this.validatorList(validatorId).value.tokenPayoutRatio.poolPctOfWhole[i] = ourPoolPctOfWhole int 700 frame_dig 7 // i: uint64 @@ -2647,7 +2651,7 @@ setTokenPayoutRatio: box_replace *for_2_continue: - // contracts/validatorRegistry.algo.ts:626 + // contracts/validatorRegistry.algo.ts:631 // i += 1 frame_dig 7 // i: uint64 int 1 @@ -2656,7 +2660,7 @@ setTokenPayoutRatio: b *for_2 *for_2_end: - // contracts/validatorRegistry.algo.ts:637 + // contracts/validatorRegistry.algo.ts:642 // return this.validatorList(validatorId).value.tokenPayoutRatio int 700 // headOffset int 200 @@ -2722,12 +2726,12 @@ setTokenPayoutRatio: stakeUpdatedViaRewards: proto 5 0 - // contracts/validatorRegistry.algo.ts:658 + // contracts/validatorRegistry.algo.ts:663 // this.verifyPoolKeyCaller(poolKey) frame_dig -1 // poolKey: ValidatorPoolKey callsub verifyPoolKeyCaller - // contracts/validatorRegistry.algo.ts:661 + // contracts/validatorRegistry.algo.ts:666 // this.validatorList(poolKey.id).value.pools[poolKey.poolId - 1].totalAlgoStaked += algoToAdd int 268 // headOffset frame_dig -1 // poolKey: ValidatorPoolKey @@ -2773,7 +2777,7 @@ stakeUpdatedViaRewards: cover 2 box_replace - // contracts/validatorRegistry.algo.ts:662 + // contracts/validatorRegistry.algo.ts:667 // this.validatorList(poolKey.id).value.state.totalAlgoStaked += algoToAdd int 252 dup @@ -2799,7 +2803,7 @@ stakeUpdatedViaRewards: cover 2 box_replace - // contracts/validatorRegistry.algo.ts:663 + // contracts/validatorRegistry.algo.ts:668 // this.validatorList(poolKey.id).value.state.rewardTokenHeldBack += rewardTokenAmountReserved int 260 dup @@ -2825,7 +2829,7 @@ stakeUpdatedViaRewards: cover 2 box_replace - // contracts/validatorRegistry.algo.ts:665 + // contracts/validatorRegistry.algo.ts:670 // this.totalAlgoStaked.value += algoToAdd byte 0x7374616b6564 // "staked" app_global_get @@ -2835,14 +2839,14 @@ stakeUpdatedViaRewards: swap app_global_put - // contracts/validatorRegistry.algo.ts:668 + // contracts/validatorRegistry.algo.ts:673 // this.reverifyNFDOwnership(poolKey.id) frame_dig -1 // poolKey: ValidatorPoolKey extract 0 8 btoi callsub reverifyNFDOwnership - // contracts/validatorRegistry.algo.ts:670 + // contracts/validatorRegistry.algo.ts:675 // this.retiOP_epochRewardUpdate.log({ // id: poolKey.id, // poolNum: poolKey.poolId as uint16, @@ -2958,7 +2962,7 @@ stakeRemoved: dupn 3 // *if17_condition - // contracts/validatorRegistry.algo.ts:700 + // contracts/validatorRegistry.algo.ts:705 // globals.opcodeBudget < 300 global OpcodeBudget int 300 @@ -2966,7 +2970,7 @@ stakeRemoved: bz *if17_end // *if17_consequent - // contracts/validatorRegistry.algo.ts:701 + // contracts/validatorRegistry.algo.ts:706 // increaseOpcodeBudget() itxn_begin int appl @@ -2982,12 +2986,12 @@ stakeRemoved: itxn_submit *if17_end: - // contracts/validatorRegistry.algo.ts:703 + // contracts/validatorRegistry.algo.ts:708 // this.verifyPoolKeyCaller(poolKey) frame_dig -1 // poolKey: ValidatorPoolKey callsub verifyPoolKeyCaller - // contracts/validatorRegistry.algo.ts:707 + // contracts/validatorRegistry.algo.ts:712 // assert(amountRemoved > 0 || rewardRemoved > 0, 'should only be called if algo or reward was removed') frame_dig -3 // amountRemoved: uint64 int 0 @@ -3003,7 +3007,7 @@ stakeRemoved: // should only be called if algo or reward was removed assert - // contracts/validatorRegistry.algo.ts:710 + // contracts/validatorRegistry.algo.ts:715 // this.validatorList(poolKey.id).value.pools[poolKey.poolId - 1].totalAlgoStaked -= amountRemoved int 268 // headOffset frame_dig -1 // poolKey: ValidatorPoolKey @@ -3049,7 +3053,7 @@ stakeRemoved: cover 2 box_replace - // contracts/validatorRegistry.algo.ts:711 + // contracts/validatorRegistry.algo.ts:716 // this.validatorList(poolKey.id).value.state.totalAlgoStaked -= amountRemoved int 252 dup @@ -3075,7 +3079,7 @@ stakeRemoved: cover 2 box_replace - // contracts/validatorRegistry.algo.ts:712 + // contracts/validatorRegistry.algo.ts:717 // this.totalAlgoStaked.value -= amountRemoved byte 0x7374616b6564 // "staked" app_global_get @@ -3086,7 +3090,7 @@ stakeRemoved: app_global_put // *if18_condition - // contracts/validatorRegistry.algo.ts:714 + // contracts/validatorRegistry.algo.ts:719 // rewardRemoved > 0 frame_dig -4 // rewardRemoved: uint64 int 0 @@ -3094,7 +3098,7 @@ stakeRemoved: bz *if18_else // *if18_consequent - // contracts/validatorRegistry.algo.ts:715 + // contracts/validatorRegistry.algo.ts:720 // rewardTokenID = this.validatorList(poolKey.id).value.config.rewardTokenId int 153 int 8 @@ -3109,7 +3113,7 @@ stakeRemoved: btoi frame_bury 0 // rewardTokenID: uint64 - // contracts/validatorRegistry.algo.ts:716 + // contracts/validatorRegistry.algo.ts:721 // assert(rewardTokenID !== 0, "rewardRemoved can't be set if validator doesn't have reward token!") frame_dig 0 // rewardTokenID: uint64 int 0 @@ -3118,7 +3122,7 @@ stakeRemoved: // rewardRemoved can't be set if validator doesn't have reward token! assert - // contracts/validatorRegistry.algo.ts:717 + // contracts/validatorRegistry.algo.ts:722 // assert( // this.validatorList(poolKey.id).value.state.rewardTokenHeldBack >= rewardRemoved, // 'reward being removed must be covered by hold back amount', @@ -3140,7 +3144,7 @@ stakeRemoved: // reward being removed must be covered by hold back amount assert - // contracts/validatorRegistry.algo.ts:723 + // contracts/validatorRegistry.algo.ts:728 // this.validatorList(poolKey.id).value.state.rewardTokenHeldBack -= rewardRemoved int 260 dup @@ -3167,7 +3171,7 @@ stakeRemoved: box_replace // *if19_condition - // contracts/validatorRegistry.algo.ts:728 + // contracts/validatorRegistry.algo.ts:733 // poolKey.poolId !== 1 frame_dig -1 // poolKey: ValidatorPoolKey extract 8 8 @@ -3177,7 +3181,7 @@ stakeRemoved: bz *if19_end // *if19_consequent - // contracts/validatorRegistry.algo.ts:729 + // contracts/validatorRegistry.algo.ts:734 // sendMethodCall({ // applicationID: AppID.fromUint64(this.validatorList(poolKey.id).value.pools[0].poolAppId), // methodArgs: [staker, rewardTokenID, rewardRemoved], @@ -3188,7 +3192,7 @@ stakeRemoved: method "payTokenReward(address,uint64,uint64)void" itxn_field ApplicationArgs - // contracts/validatorRegistry.algo.ts:730 + // contracts/validatorRegistry.algo.ts:735 // applicationID: AppID.fromUint64(this.validatorList(poolKey.id).value.pools[0].poolAppId) int 268 int 8 @@ -3203,7 +3207,7 @@ stakeRemoved: btoi itxn_field ApplicationID - // contracts/validatorRegistry.algo.ts:731 + // contracts/validatorRegistry.algo.ts:736 // methodArgs: [staker, rewardTokenID, rewardRemoved] frame_dig -2 // staker: Address itxn_field ApplicationArgs @@ -3222,7 +3226,7 @@ stakeRemoved: itxn_submit *if19_end: - // contracts/validatorRegistry.algo.ts:734 + // contracts/validatorRegistry.algo.ts:739 // this.retiOP_stakeRemoved.log({ // id: poolKey.id, // poolNum: poolKey.poolId as uint16, @@ -3271,7 +3275,7 @@ stakeRemoved: b *if18_end *if18_else: - // contracts/validatorRegistry.algo.ts:744 + // contracts/validatorRegistry.algo.ts:749 // this.retiOP_stakeRemoved.log({ // id: poolKey.id, // poolNum: poolKey.poolId as uint16, @@ -3319,13 +3323,13 @@ stakeRemoved: *if18_end: // *if20_condition - // contracts/validatorRegistry.algo.ts:756 + // contracts/validatorRegistry.algo.ts:761 // stakerRemoved frame_dig -5 // stakerRemoved: boolean bz *if20_end // *if20_consequent - // contracts/validatorRegistry.algo.ts:758 + // contracts/validatorRegistry.algo.ts:763 // this.validatorList(poolKey.id).value.pools[poolKey.poolId - 1].totalStakers -= 1 int 268 // headOffset frame_dig -1 // poolKey: ValidatorPoolKey @@ -3372,7 +3376,7 @@ stakeRemoved: cover 2 box_replace - // contracts/validatorRegistry.algo.ts:760 + // contracts/validatorRegistry.algo.ts:765 // removeRet = this.removeFromStakerPoolSet(staker, { // id: poolKey.id, // poolId: poolKey.poolId, @@ -3396,7 +3400,7 @@ stakeRemoved: callsub removeFromStakerPoolSet frame_bury 1 // removeRet: (bool,bool) - // contracts/validatorRegistry.algo.ts:765 + // contracts/validatorRegistry.algo.ts:770 // stakerOutOfThisValidator = removeRet[0] frame_dig 1 // removeRet: (bool,bool) store 255 // full array @@ -3405,7 +3409,7 @@ stakeRemoved: getbit frame_bury 2 // stakerOutOfThisValidator: bool - // contracts/validatorRegistry.algo.ts:766 + // contracts/validatorRegistry.algo.ts:771 // stakerOutOfProtocol = removeRet[1] frame_dig 1 // removeRet: (bool,bool) store 255 // full array @@ -3415,13 +3419,13 @@ stakeRemoved: frame_bury 3 // stakerOutOfProtocol: bool // *if21_condition - // contracts/validatorRegistry.algo.ts:768 + // contracts/validatorRegistry.algo.ts:773 // stakerOutOfThisValidator frame_dig 2 // stakerOutOfThisValidator: bool bz *if21_end // *if21_consequent - // contracts/validatorRegistry.algo.ts:769 + // contracts/validatorRegistry.algo.ts:774 // this.validatorList(poolKey.id).value.state.totalStakers -= 1 int 244 dup @@ -3449,13 +3453,13 @@ stakeRemoved: *if21_end: // *if22_condition - // contracts/validatorRegistry.algo.ts:772 + // contracts/validatorRegistry.algo.ts:777 // stakerOutOfProtocol frame_dig 3 // stakerOutOfProtocol: bool bz *if22_end // *if22_consequent - // contracts/validatorRegistry.algo.ts:773 + // contracts/validatorRegistry.algo.ts:778 // this.numStakers.value -= 1 byte 0x6e756d5374616b657273 // "numStakers" app_global_get @@ -3518,24 +3522,24 @@ findPoolForStaker: byte 0x dupn 7 - // contracts/validatorRegistry.algo.ts:794 + // contracts/validatorRegistry.algo.ts:800 // isNewStakerToValidator = true int 1 frame_bury 0 // isNewStakerToValidator: bool - // contracts/validatorRegistry.algo.ts:795 + // contracts/validatorRegistry.algo.ts:801 // isNewStakerToProtocol = true int 1 frame_bury 1 // isNewStakerToProtocol: bool - // contracts/validatorRegistry.algo.ts:803 + // contracts/validatorRegistry.algo.ts:809 // maxPerPool = this.getCurMaxStakePerPool(validatorId) frame_dig -1 // validatorId: ValidatorIdType callsub getCurMaxStakePerPool frame_bury 2 // maxPerPool: uint64 // *if23_condition - // contracts/validatorRegistry.algo.ts:806 + // contracts/validatorRegistry.algo.ts:812 // this.stakerPoolSet(staker).exists byte 0x737073 // "sps" frame_dig -2 // staker: Address @@ -3546,7 +3550,7 @@ findPoolForStaker: bz *if23_end // *if23_consequent - // contracts/validatorRegistry.algo.ts:807 + // contracts/validatorRegistry.algo.ts:813 // poolSet = clone(this.stakerPoolSet(staker).value) byte 0x737073 // "sps" frame_dig -2 // staker: Address @@ -3557,20 +3561,20 @@ findPoolForStaker: assert frame_bury 3 // poolSet: (uint64,uint64,uint64)[6] - // contracts/validatorRegistry.algo.ts:808 + // contracts/validatorRegistry.algo.ts:814 // assert(validatorId !== 0) frame_dig -1 // validatorId: ValidatorIdType int 0 != assert - // contracts/validatorRegistry.algo.ts:809 + // contracts/validatorRegistry.algo.ts:815 // for (let i = 0; i < poolSet.length; i += 1) int 0 frame_bury 4 // i: uint64 *for_3: - // contracts/validatorRegistry.algo.ts:809 + // contracts/validatorRegistry.algo.ts:815 // i < poolSet.length frame_dig 4 // i: uint64 int 6 @@ -3578,7 +3582,7 @@ findPoolForStaker: bz *for_3_end // *if24_condition - // contracts/validatorRegistry.algo.ts:810 + // contracts/validatorRegistry.algo.ts:816 // globals.opcodeBudget < 300 global OpcodeBudget int 300 @@ -3586,7 +3590,7 @@ findPoolForStaker: bz *if24_end // *if24_consequent - // contracts/validatorRegistry.algo.ts:811 + // contracts/validatorRegistry.algo.ts:817 // increaseOpcodeBudget() itxn_begin int appl @@ -3603,7 +3607,7 @@ findPoolForStaker: *if24_end: // *if25_condition - // contracts/validatorRegistry.algo.ts:813 + // contracts/validatorRegistry.algo.ts:819 // poolSet[i].id === 0 frame_dig 3 // poolSet: (uint64,uint64,uint64)[6] frame_dig 4 // i: uint64 @@ -3622,13 +3626,13 @@ findPoolForStaker: b *for_3_continue *if25_end: - // contracts/validatorRegistry.algo.ts:816 + // contracts/validatorRegistry.algo.ts:822 // isNewStakerToProtocol = false int 0 frame_bury 1 // isNewStakerToProtocol: bool // *if26_condition - // contracts/validatorRegistry.algo.ts:817 + // contracts/validatorRegistry.algo.ts:823 // poolSet[i].id === validatorId frame_dig 3 // poolSet: (uint64,uint64,uint64)[6] frame_dig 4 // i: uint64 @@ -3644,13 +3648,13 @@ findPoolForStaker: bz *if26_end // *if26_consequent - // contracts/validatorRegistry.algo.ts:819 + // contracts/validatorRegistry.algo.ts:825 // isNewStakerToValidator = false int 0 frame_bury 0 // isNewStakerToValidator: bool // *if27_condition - // contracts/validatorRegistry.algo.ts:821 + // contracts/validatorRegistry.algo.ts:827 // this.validatorList(validatorId).value.pools[poolSet[i].poolId - 1].totalAlgoStaked + // amountToStake <= // maxPerPool @@ -3686,7 +3690,7 @@ findPoolForStaker: bz *if27_end // *if27_consequent - // contracts/validatorRegistry.algo.ts:825 + // contracts/validatorRegistry.algo.ts:831 // return [poolSet[i], isNewStakerToValidator, isNewStakerToProtocol] frame_dig 3 // poolSet: (uint64,uint64,uint64)[6] frame_dig 4 // i: uint64 @@ -3709,7 +3713,7 @@ findPoolForStaker: *if26_end: *for_3_continue: - // contracts/validatorRegistry.algo.ts:809 + // contracts/validatorRegistry.algo.ts:815 // i += 1 frame_dig 4 // i: uint64 int 1 @@ -3720,7 +3724,7 @@ findPoolForStaker: *for_3_end: *if23_end: - // contracts/validatorRegistry.algo.ts:832 + // contracts/validatorRegistry.algo.ts:838 // assert( // amountToStake >= this.validatorList(validatorId).value.config.minEntryStake, // 'must stake at least the minimum for this pool', @@ -3740,7 +3744,7 @@ findPoolForStaker: // must stake at least the minimum for this pool assert - // contracts/validatorRegistry.algo.ts:838 + // contracts/validatorRegistry.algo.ts:844 // pools = clone(this.validatorList(validatorId).value.pools) int 268 // headOffset int 432 @@ -3752,7 +3756,7 @@ findPoolForStaker: box_extract frame_bury 5 // pools: (uint64,uint16,uint64)[24] - // contracts/validatorRegistry.algo.ts:839 + // contracts/validatorRegistry.algo.ts:845 // curNumPools = this.validatorList(validatorId).value.state.numPools as uint64 int 242 int 2 @@ -3765,13 +3769,13 @@ findPoolForStaker: btoi frame_bury 6 // curNumPools: uint64 - // contracts/validatorRegistry.algo.ts:840 + // contracts/validatorRegistry.algo.ts:846 // for (let i = 0; i < curNumPools; i += 1) int 0 frame_bury 7 // i: uint64 *for_4: - // contracts/validatorRegistry.algo.ts:840 + // contracts/validatorRegistry.algo.ts:846 // i < curNumPools frame_dig 7 // i: uint64 frame_dig 6 // curNumPools: uint64 @@ -3779,7 +3783,7 @@ findPoolForStaker: bz *for_4_end // *if28_condition - // contracts/validatorRegistry.algo.ts:841 + // contracts/validatorRegistry.algo.ts:847 // pools[i].totalAlgoStaked + amountToStake <= maxPerPool frame_dig 5 // pools: (uint64,uint16,uint64)[24] frame_dig 7 // i: uint64 @@ -3797,7 +3801,7 @@ findPoolForStaker: bz *if28_end // *if28_consequent - // contracts/validatorRegistry.algo.ts:842 + // contracts/validatorRegistry.algo.ts:848 // return [ // { id: validatorId, poolId: i + 1, poolAppId: pools[i].poolAppId }, // isNewStakerToValidator, @@ -3834,7 +3838,7 @@ findPoolForStaker: *if28_end: *for_4_continue: - // contracts/validatorRegistry.algo.ts:840 + // contracts/validatorRegistry.algo.ts:846 // i += 1 frame_dig 7 // i: uint64 int 1 @@ -3843,7 +3847,7 @@ findPoolForStaker: b *for_4 *for_4_end: - // contracts/validatorRegistry.algo.ts:850 + // contracts/validatorRegistry.algo.ts:856 // return [{ id: validatorId, poolId: 0, poolAppId: 0 }, isNewStakerToValidator, isNewStakerToProtocol] frame_dig -1 // validatorId: ValidatorIdType itob @@ -3905,12 +3909,12 @@ movePoolToNode: byte 0x dupn 2 - // contracts/validatorRegistry.algo.ts:865 + // contracts/validatorRegistry.algo.ts:871 // this.callerMustBeOwnerOrManager(validatorId) frame_dig -1 // validatorId: ValidatorIdType callsub callerMustBeOwnerOrManager - // contracts/validatorRegistry.algo.ts:867 + // contracts/validatorRegistry.algo.ts:873 // nodePoolAssignments = clone(this.validatorList(validatorId).value.nodePoolAssignments) int 900 // headOffset int 192 @@ -3922,7 +3926,7 @@ movePoolToNode: box_extract frame_bury 0 // nodePoolAssignments: ((uint64[3])[8]) - // contracts/validatorRegistry.algo.ts:868 + // contracts/validatorRegistry.algo.ts:874 // assert(nodeNum >= 1 && nodeNum <= MAX_NODES, 'node number out of allowable range') frame_dig -3 // nodeNum: uint64 int 1 @@ -3938,26 +3942,26 @@ movePoolToNode: // node number out of allowable range assert - // contracts/validatorRegistry.algo.ts:870 + // contracts/validatorRegistry.algo.ts:876 // for (let srcNodeIdx = 0; srcNodeIdx < MAX_NODES; srcNodeIdx += 1) int 0 frame_bury 1 // srcNodeIdx: uint64 *for_5: - // contracts/validatorRegistry.algo.ts:870 + // contracts/validatorRegistry.algo.ts:876 // srcNodeIdx < MAX_NODES frame_dig 1 // srcNodeIdx: uint64 int 8 < bz *for_5_end - // contracts/validatorRegistry.algo.ts:871 + // contracts/validatorRegistry.algo.ts:877 // for (let i = 0; i < MAX_POOLS_PER_NODE; i += 1) int 0 frame_bury 2 // i: uint64 *for_6: - // contracts/validatorRegistry.algo.ts:871 + // contracts/validatorRegistry.algo.ts:877 // i < MAX_POOLS_PER_NODE frame_dig 2 // i: uint64 int 3 @@ -3965,7 +3969,7 @@ movePoolToNode: bz *for_6_end // *if29_condition - // contracts/validatorRegistry.algo.ts:872 + // contracts/validatorRegistry.algo.ts:878 // nodePoolAssignments.nodes[srcNodeIdx].poolAppIds[i] === poolAppId frame_dig 0 // nodePoolAssignments: ((uint64[3])[8]) int 0 @@ -3987,7 +3991,7 @@ movePoolToNode: bz *if29_end // *if29_consequent - // contracts/validatorRegistry.algo.ts:873 + // contracts/validatorRegistry.algo.ts:879 // assert(nodeNum - 1 !== srcNodeIdx, "can't move to same node") frame_dig -3 // nodeNum: uint64 int 1 @@ -3998,7 +4002,7 @@ movePoolToNode: // can't move to same node assert - // contracts/validatorRegistry.algo.ts:875 + // contracts/validatorRegistry.algo.ts:881 // this.validatorList(validatorId).value.nodePoolAssignments.nodes[srcNodeIdx].poolAppIds[i] = 0 int 900 frame_dig 1 // srcNodeIdx: uint64 @@ -4019,7 +4023,7 @@ movePoolToNode: cover 2 box_replace - // contracts/validatorRegistry.algo.ts:878 + // contracts/validatorRegistry.algo.ts:884 // sendMethodCall({ // applicationID: AppID.fromUint64(poolAppId), // }) @@ -4029,7 +4033,7 @@ movePoolToNode: method "goOffline()void" itxn_field ApplicationArgs - // contracts/validatorRegistry.algo.ts:879 + // contracts/validatorRegistry.algo.ts:885 // applicationID: AppID.fromUint64(poolAppId) frame_dig -2 // poolAppId: uint64 itxn_field ApplicationID @@ -4041,21 +4045,21 @@ movePoolToNode: // Submit inner transaction itxn_submit - // contracts/validatorRegistry.algo.ts:883 + // contracts/validatorRegistry.algo.ts:889 // this.addPoolToNode(validatorId, poolAppId, nodeNum) frame_dig -3 // nodeNum: uint64 frame_dig -2 // poolAppId: uint64 frame_dig -1 // validatorId: ValidatorIdType callsub addPoolToNode - // contracts/validatorRegistry.algo.ts:884 + // contracts/validatorRegistry.algo.ts:890 // return retsub *if29_end: *for_6_continue: - // contracts/validatorRegistry.algo.ts:871 + // contracts/validatorRegistry.algo.ts:877 // i += 1 frame_dig 2 // i: uint64 int 1 @@ -4066,7 +4070,7 @@ movePoolToNode: *for_6_end: *for_5_continue: - // contracts/validatorRegistry.algo.ts:870 + // contracts/validatorRegistry.algo.ts:876 // srcNodeIdx += 1 frame_dig 1 // srcNodeIdx: uint64 int 1 @@ -4124,12 +4128,12 @@ emptyTokenRewards: byte 0x dupn 3 - // contracts/validatorRegistry.algo.ts:903 + // contracts/validatorRegistry.algo.ts:909 // this.callerMustBeOwner(validatorId) frame_dig -1 // validatorId: ValidatorIdType callsub callerMustBeOwner - // contracts/validatorRegistry.algo.ts:904 + // contracts/validatorRegistry.algo.ts:910 // rewardTokenId = this.validatorList(validatorId).value.config.rewardTokenId int 153 int 8 @@ -4142,7 +4146,7 @@ emptyTokenRewards: btoi frame_bury 0 // rewardTokenId: uint64 - // contracts/validatorRegistry.algo.ts:905 + // contracts/validatorRegistry.algo.ts:911 // rewardTokenHeldBack = this.validatorList(validatorId).value.state.rewardTokenHeldBack int 260 int 8 @@ -4155,7 +4159,7 @@ emptyTokenRewards: btoi frame_bury 1 // rewardTokenHeldBack: uint64 - // contracts/validatorRegistry.algo.ts:906 + // contracts/validatorRegistry.algo.ts:912 // assert(rewardTokenId !== 0, "this validator doesn't have a reward token defined") frame_dig 0 // rewardTokenId: uint64 int 0 @@ -4164,7 +4168,7 @@ emptyTokenRewards: // this validator doesn't have a reward token defined assert - // contracts/validatorRegistry.algo.ts:907 + // contracts/validatorRegistry.algo.ts:913 // poolOneAppId = AppID.fromUint64(this.validatorList(validatorId).value.pools[0].poolAppId) int 268 int 8 @@ -4177,7 +4181,7 @@ emptyTokenRewards: btoi frame_bury 2 // poolOneAppId: uint64 - // contracts/validatorRegistry.algo.ts:909 + // contracts/validatorRegistry.algo.ts:915 // tokenRewardBal = // poolOneAppId.address.assetBalance(AssetID.fromUint64(rewardTokenId)) - rewardTokenHeldBack frame_dig 2 // poolOneAppId: uint64 @@ -4190,7 +4194,7 @@ emptyTokenRewards: - frame_bury 3 // tokenRewardBal: uint64 - // contracts/validatorRegistry.algo.ts:913 + // contracts/validatorRegistry.algo.ts:919 // sendMethodCall({ // applicationID: poolOneAppId, // methodArgs: [receiver, rewardTokenId, tokenRewardBal], @@ -4201,12 +4205,12 @@ emptyTokenRewards: method "payTokenReward(address,uint64,uint64)void" itxn_field ApplicationArgs - // contracts/validatorRegistry.algo.ts:914 + // contracts/validatorRegistry.algo.ts:920 // applicationID: poolOneAppId frame_dig 2 // poolOneAppId: uint64 itxn_field ApplicationID - // contracts/validatorRegistry.algo.ts:915 + // contracts/validatorRegistry.algo.ts:921 // methodArgs: [receiver, rewardTokenId, tokenRewardBal] frame_dig -2 // receiver: Address itxn_field ApplicationArgs @@ -4224,7 +4228,7 @@ emptyTokenRewards: // Submit inner transaction itxn_submit - // contracts/validatorRegistry.algo.ts:917 + // contracts/validatorRegistry.algo.ts:923 // assert( // poolOneAppId.address.assetBalance(AssetID.fromUint64(rewardTokenId)) === rewardTokenHeldBack, // 'balance of remaining reward tokens should match the held back amount', @@ -4241,7 +4245,7 @@ emptyTokenRewards: // balance of remaining reward tokens should match the held back amount assert - // contracts/validatorRegistry.algo.ts:921 + // contracts/validatorRegistry.algo.ts:927 // return tokenRewardBal frame_dig 3 // tokenRewardBal: uint64 @@ -4256,7 +4260,7 @@ emptyTokenRewards: callerMustBeOwner: proto 1 0 - // contracts/validatorRegistry.algo.ts:1014 + // contracts/validatorRegistry.algo.ts:1020 // assert( // this.txn.sender === this.validatorList(validatorId).value.config.owner, // 'can only be called by validator owner', @@ -4280,7 +4284,7 @@ callerMustBeOwner: callerMustBeOwnerOrManager: proto 1 0 - // contracts/validatorRegistry.algo.ts:1021 + // contracts/validatorRegistry.algo.ts:1027 // assert( // this.txn.sender === this.validatorList(validatorId).value.config.owner || // this.txn.sender === this.validatorList(validatorId).value.config.manager, @@ -4323,7 +4327,7 @@ callerMustBeOwnerOrManager: verifyPoolKeyCaller: proto 1 0 - // contracts/validatorRegistry.algo.ts:1034 + // contracts/validatorRegistry.algo.ts:1040 // assert(this.validatorList(poolKey.id).exists, "the specified validator id isn't valid") byte 0x76 // "v" frame_dig -1 // poolKey: ValidatorPoolKey @@ -4338,7 +4342,7 @@ verifyPoolKeyCaller: // the specified validator id isn't valid assert - // contracts/validatorRegistry.algo.ts:1035 + // contracts/validatorRegistry.algo.ts:1041 // assert(poolKey.poolId <= MAX_POOLS, 'pool id not in valid range') frame_dig -1 // poolKey: ValidatorPoolKey extract 8 8 @@ -4349,7 +4353,7 @@ verifyPoolKeyCaller: // pool id not in valid range assert - // contracts/validatorRegistry.algo.ts:1036 + // contracts/validatorRegistry.algo.ts:1042 // assert( // poolKey.poolId > 0 && (poolKey.poolId as uint16) <= this.validatorList(poolKey.id).value.state.numPools, // 'pool id outside of range of pools created for this validator', @@ -4382,7 +4386,7 @@ verifyPoolKeyCaller: // pool id outside of range of pools created for this validator assert - // contracts/validatorRegistry.algo.ts:1042 + // contracts/validatorRegistry.algo.ts:1048 // assert( // poolKey.poolAppId === this.validatorList(poolKey.id).value.pools[poolKey.poolId - 1].poolAppId, // "The passed in app id doesn't match the passed in ids", @@ -4416,7 +4420,7 @@ verifyPoolKeyCaller: // The passed in app id doesn't match the passed in ids assert - // contracts/validatorRegistry.algo.ts:1047 + // contracts/validatorRegistry.algo.ts:1053 // assert(this.txn.sender === AppID.fromUint64(poolKey.poolAppId).address) txn Sender frame_dig -1 // poolKey: ValidatorPoolKey @@ -4427,7 +4431,7 @@ verifyPoolKeyCaller: == assert - // contracts/validatorRegistry.algo.ts:1049 + // contracts/validatorRegistry.algo.ts:1055 // assert(poolKey.id === (AppID.fromUint64(poolKey.poolAppId).globalState('validatorId') as uint64)) frame_dig -1 // poolKey: ValidatorPoolKey extract 0 8 @@ -4443,7 +4447,7 @@ verifyPoolKeyCaller: == assert - // contracts/validatorRegistry.algo.ts:1050 + // contracts/validatorRegistry.algo.ts:1056 // assert(poolKey.poolId === (AppID.fromUint64(poolKey.poolAppId).globalState('poolId') as uint64)) frame_dig -1 // poolKey: ValidatorPoolKey extract 8 8 @@ -4473,7 +4477,7 @@ reverifyNFDOwnership: byte 0x dup - // contracts/validatorRegistry.algo.ts:1060 + // contracts/validatorRegistry.algo.ts:1066 // validatorConfig = this.validatorList(validatorId).value.config byte 0x76 // "v" frame_dig -1 // validatorId: ValidatorIdType @@ -4482,7 +4486,7 @@ reverifyNFDOwnership: frame_bury 0 // storage key//validatorConfig // *if30_condition - // contracts/validatorRegistry.algo.ts:1061 + // contracts/validatorRegistry.algo.ts:1067 // validatorConfig.nfdForInfo !== 0 int 72 int 8 @@ -4498,7 +4502,7 @@ reverifyNFDOwnership: bz *if30_end // *if30_consequent - // contracts/validatorRegistry.algo.ts:1064 + // contracts/validatorRegistry.algo.ts:1070 // nfdOwner = AppID.fromUint64(validatorConfig.nfdForInfo).globalState('i.owner.a') as Address int 72 int 8 @@ -4517,7 +4521,7 @@ reverifyNFDOwnership: frame_bury 1 // nfdOwner: address // *if31_condition - // contracts/validatorRegistry.algo.ts:1066 + // contracts/validatorRegistry.algo.ts:1072 // validatorConfig.owner !== nfdOwner && validatorConfig.manager !== nfdOwner int 8 int 32 @@ -4547,7 +4551,7 @@ reverifyNFDOwnership: bz *if31_end // *if31_consequent - // contracts/validatorRegistry.algo.ts:1068 + // contracts/validatorRegistry.algo.ts:1074 // this.validatorList(validatorId).value.config.nfdForInfo = 0 int 72 byte 0x0000000000000000 @@ -4567,7 +4571,7 @@ reverifyNFDOwnership: validateConfig: proto 1 0 - // contracts/validatorRegistry.algo.ts:1075 + // contracts/validatorRegistry.algo.ts:1081 // assert(config.owner !== Address.zeroAddress) frame_dig -1 // config: ValidatorConfig extract 8 32 @@ -4575,7 +4579,7 @@ validateConfig: != assert - // contracts/validatorRegistry.algo.ts:1076 + // contracts/validatorRegistry.algo.ts:1082 // assert(config.manager !== Address.zeroAddress) frame_dig -1 // config: ValidatorConfig extract 40 32 @@ -4583,7 +4587,7 @@ validateConfig: != assert - // contracts/validatorRegistry.algo.ts:1077 + // contracts/validatorRegistry.algo.ts:1083 // assert(this.txn.sender === config.owner, 'sender must be owner to add new validator') txn Sender frame_dig -1 // config: ValidatorConfig @@ -4593,7 +4597,7 @@ validateConfig: // sender must be owner to add new validator assert - // contracts/validatorRegistry.algo.ts:1079 + // contracts/validatorRegistry.algo.ts:1085 // assert( // config.entryGatingType >= GATING_TYPE_NONE && config.entryGatingType <= GATING_TYPE_CONST_MAX, // 'gating type not valid', @@ -4616,7 +4620,7 @@ validateConfig: // gating type not valid assert - // contracts/validatorRegistry.algo.ts:1083 + // contracts/validatorRegistry.algo.ts:1089 // assert( // config.epochRoundLength >= MIN_EPOCH_LENGTH && config.epochRoundLength <= MAX_EPOCH_LENGTH, // 'epoch length not in allowable range', @@ -4639,7 +4643,7 @@ validateConfig: // epoch length not in allowable range assert - // contracts/validatorRegistry.algo.ts:1087 + // contracts/validatorRegistry.algo.ts:1093 // assert( // config.percentToValidator >= MIN_PCT_TO_VALIDATOR && config.percentToValidator <= MAX_PCT_TO_VALIDATOR, // 'commission percentage not valid', @@ -4663,7 +4667,7 @@ validateConfig: assert // *if32_condition - // contracts/validatorRegistry.algo.ts:1091 + // contracts/validatorRegistry.algo.ts:1097 // config.percentToValidator !== 0 frame_dig -1 // config: ValidatorConfig extract 173 4 @@ -4673,7 +4677,7 @@ validateConfig: bz *if32_end // *if32_consequent - // contracts/validatorRegistry.algo.ts:1092 + // contracts/validatorRegistry.algo.ts:1098 // assert( // config.validatorCommissionAddress !== Address.zeroAddress, // 'validatorCommissionAddress must be set if percent to validator is not 0', @@ -4687,7 +4691,7 @@ validateConfig: assert *if32_end: - // contracts/validatorRegistry.algo.ts:1097 + // contracts/validatorRegistry.algo.ts:1103 // assert(config.minEntryStake >= MIN_ALGO_STAKE_PER_POOL, 'staking pool must have minimum entry of 1 algo') frame_dig -1 // config: ValidatorConfig extract 209 8 @@ -4698,7 +4702,7 @@ validateConfig: // staking pool must have minimum entry of 1 algo assert - // contracts/validatorRegistry.algo.ts:1099 + // contracts/validatorRegistry.algo.ts:1105 // assert( // config.poolsPerNode > 0 && config.poolsPerNode <= MAX_POOLS_PER_NODE, // 'number of pools per node must be be between 1 and the maximum allowed number', @@ -4722,7 +4726,7 @@ validateConfig: assert // *if33_condition - // contracts/validatorRegistry.algo.ts:1103 + // contracts/validatorRegistry.algo.ts:1109 // config.sunsettingOn !== 0 frame_dig -1 // config: ValidatorConfig extract 226 8 @@ -4732,7 +4736,7 @@ validateConfig: bz *if33_end // *if33_consequent - // contracts/validatorRegistry.algo.ts:1104 + // contracts/validatorRegistry.algo.ts:1110 // assert(config.sunsettingOn > globals.latestTimestamp, 'sunsettingOn must be later than now if set') frame_dig -1 // config: ValidatorConfig extract 226 8 @@ -4764,7 +4768,7 @@ callPoolAddStake: byte 0x dupn 2 - // contracts/validatorRegistry.algo.ts:1126 + // contracts/validatorRegistry.algo.ts:1132 // poolAppId = this.validatorList(poolKey.id).value.pools[poolKey.poolId - 1].poolAppId int 268 // headOffset frame_dig -2 // poolKey: ValidatorPoolKey @@ -4789,7 +4793,7 @@ callPoolAddStake: btoi frame_bury 0 // poolAppId: uint64 - // contracts/validatorRegistry.algo.ts:1130 + // contracts/validatorRegistry.algo.ts:1136 // sendMethodCall({ // applicationID: AppID.fromUint64(poolAppId), // methodArgs: [ @@ -4804,7 +4808,7 @@ callPoolAddStake: int pay itxn_field TypeEnum - // contracts/validatorRegistry.algo.ts:1135 + // contracts/validatorRegistry.algo.ts:1141 // amount: stakedAmountPayment.amount - mbrAmtPaid frame_dig -1 // stakedAmountPayment: PayTxn gtxns Amount @@ -4812,7 +4816,7 @@ callPoolAddStake: - itxn_field Amount - // contracts/validatorRegistry.algo.ts:1135 + // contracts/validatorRegistry.algo.ts:1141 // receiver: AppID.fromUint64(poolAppId).address frame_dig 0 // poolAppId: uint64 app_params_get AppAddress @@ -4828,12 +4832,12 @@ callPoolAddStake: method "addStake(pay,address)uint64" itxn_field ApplicationArgs - // contracts/validatorRegistry.algo.ts:1131 + // contracts/validatorRegistry.algo.ts:1137 // applicationID: AppID.fromUint64(poolAppId) frame_dig 0 // poolAppId: uint64 itxn_field ApplicationID - // contracts/validatorRegistry.algo.ts:1132 + // contracts/validatorRegistry.algo.ts:1138 // methodArgs: [ // // ======= // // THIS IS A SEND of the amount received right back out and into the staking pool contract account. @@ -4859,7 +4863,7 @@ callPoolAddStake: btoi // *if34_condition - // contracts/validatorRegistry.algo.ts:1140 + // contracts/validatorRegistry.algo.ts:1146 // globals.opcodeBudget < 500 global OpcodeBudget int 500 @@ -4867,7 +4871,7 @@ callPoolAddStake: bz *if34_end // *if34_consequent - // contracts/validatorRegistry.algo.ts:1141 + // contracts/validatorRegistry.algo.ts:1147 // increaseOpcodeBudget() itxn_begin int appl @@ -4883,7 +4887,7 @@ callPoolAddStake: itxn_submit *if34_end: - // contracts/validatorRegistry.algo.ts:1145 + // contracts/validatorRegistry.algo.ts:1151 // poolNumStakers = AppID.fromUint64(poolAppId).globalState('numStakers') as uint64 frame_dig 0 // poolAppId: uint64 byte 0x6e756d5374616b657273 // "numStakers" @@ -4893,7 +4897,7 @@ callPoolAddStake: assert frame_bury 1 // poolNumStakers: uint64 - // contracts/validatorRegistry.algo.ts:1146 + // contracts/validatorRegistry.algo.ts:1152 // poolAlgoStaked = AppID.fromUint64(poolAppId).globalState('staked') as uint64 frame_dig 0 // poolAppId: uint64 byte 0x7374616b6564 // "staked" @@ -4903,7 +4907,7 @@ callPoolAddStake: assert frame_bury 2 // poolAlgoStaked: uint64 - // contracts/validatorRegistry.algo.ts:1147 + // contracts/validatorRegistry.algo.ts:1153 // this.validatorList(poolKey.id).value.pools[poolKey.poolId - 1].totalStakers = poolNumStakers as uint16 int 268 // headOffset frame_dig -2 // poolKey: ValidatorPoolKey @@ -4928,7 +4932,7 @@ callPoolAddStake: cover 2 box_replace - // contracts/validatorRegistry.algo.ts:1148 + // contracts/validatorRegistry.algo.ts:1154 // this.validatorList(poolKey.id).value.pools[poolKey.poolId - 1].totalAlgoStaked = poolAlgoStaked int 268 // headOffset frame_dig -2 // poolKey: ValidatorPoolKey @@ -4953,13 +4957,13 @@ callPoolAddStake: box_replace // *if35_condition - // contracts/validatorRegistry.algo.ts:1151 + // contracts/validatorRegistry.algo.ts:1157 // isNewStakerToValidator frame_dig -4 // isNewStakerToValidator: boolean bz *if35_end // *if35_consequent - // contracts/validatorRegistry.algo.ts:1152 + // contracts/validatorRegistry.algo.ts:1158 // this.validatorList(poolKey.id).value.state.totalStakers += 1 int 244 dup @@ -4987,13 +4991,13 @@ callPoolAddStake: *if35_end: // *if36_condition - // contracts/validatorRegistry.algo.ts:1154 + // contracts/validatorRegistry.algo.ts:1160 // isNewStakerToProtocol frame_dig -5 // isNewStakerToProtocol: boolean bz *if36_end // *if36_consequent - // contracts/validatorRegistry.algo.ts:1155 + // contracts/validatorRegistry.algo.ts:1161 // this.numStakers.value += 1 byte 0x6e756d5374616b657273 // "numStakers" app_global_get @@ -5004,7 +5008,7 @@ callPoolAddStake: app_global_put *if36_end: - // contracts/validatorRegistry.algo.ts:1157 + // contracts/validatorRegistry.algo.ts:1163 // this.validatorList(poolKey.id).value.state.totalAlgoStaked += stakedAmountPayment.amount - mbrAmtPaid int 252 dup @@ -5033,7 +5037,7 @@ callPoolAddStake: cover 2 box_replace - // contracts/validatorRegistry.algo.ts:1158 + // contracts/validatorRegistry.algo.ts:1164 // this.totalAlgoStaked.value += stakedAmountPayment.amount - mbrAmtPaid byte 0x7374616b6564 // "staked" app_global_get @@ -5055,7 +5059,7 @@ updateStakerPoolSet: byte 0x dupn 2 - // contracts/validatorRegistry.algo.ts:1162 + // contracts/validatorRegistry.algo.ts:1168 // assert(this.stakerPoolSet(staker).exists) byte 0x737073 // "sps" frame_dig -1 // staker: Address @@ -5065,7 +5069,7 @@ updateStakerPoolSet: pop assert - // contracts/validatorRegistry.algo.ts:1164 + // contracts/validatorRegistry.algo.ts:1170 // poolSet = clone(this.stakerPoolSet(staker).value) byte 0x737073 // "sps" frame_dig -1 // staker: Address @@ -5076,18 +5080,18 @@ updateStakerPoolSet: assert frame_bury 0 // poolSet: (uint64,uint64,uint64)[6] - // contracts/validatorRegistry.algo.ts:1165 + // contracts/validatorRegistry.algo.ts:1171 // firstEmpty = 0 int 0 frame_bury 1 // firstEmpty: uint64 - // contracts/validatorRegistry.algo.ts:1166 + // contracts/validatorRegistry.algo.ts:1172 // for (let i = 0; i < this.stakerPoolSet(staker).value.length; i += 1) int 0 frame_bury 2 // i: uint64 *for_7: - // contracts/validatorRegistry.algo.ts:1166 + // contracts/validatorRegistry.algo.ts:1172 // i < this.stakerPoolSet(staker).value.length frame_dig 2 // i: uint64 int 6 @@ -5095,7 +5099,7 @@ updateStakerPoolSet: bz *for_7_end // *if37_condition - // contracts/validatorRegistry.algo.ts:1167 + // contracts/validatorRegistry.algo.ts:1173 // poolSet[i] === poolKey frame_dig 0 // poolSet: (uint64,uint64,uint64)[6] frame_dig 2 // i: uint64 @@ -5108,13 +5112,13 @@ updateStakerPoolSet: bz *if37_end // *if37_consequent - // contracts/validatorRegistry.algo.ts:1169 + // contracts/validatorRegistry.algo.ts:1175 // return retsub *if37_end: // *if38_condition - // contracts/validatorRegistry.algo.ts:1171 + // contracts/validatorRegistry.algo.ts:1177 // firstEmpty === 0 && poolSet[i].id === 0 frame_dig 1 // firstEmpty: uint64 int 0 @@ -5138,7 +5142,7 @@ updateStakerPoolSet: bz *if38_end // *if38_consequent - // contracts/validatorRegistry.algo.ts:1172 + // contracts/validatorRegistry.algo.ts:1178 // firstEmpty = i + 1 frame_dig 2 // i: uint64 int 1 @@ -5148,7 +5152,7 @@ updateStakerPoolSet: *if38_end: *for_7_continue: - // contracts/validatorRegistry.algo.ts:1166 + // contracts/validatorRegistry.algo.ts:1172 // i += 1 frame_dig 2 // i: uint64 int 1 @@ -5158,7 +5162,7 @@ updateStakerPoolSet: *for_7_end: // *if39_condition - // contracts/validatorRegistry.algo.ts:1175 + // contracts/validatorRegistry.algo.ts:1181 // firstEmpty === 0 frame_dig 1 // firstEmpty: uint64 int 0 @@ -5170,7 +5174,7 @@ updateStakerPoolSet: err *if39_end: - // contracts/validatorRegistry.algo.ts:1178 + // contracts/validatorRegistry.algo.ts:1184 // this.stakerPoolSet(staker).value[firstEmpty - 1] = poolKey frame_dig 1 // firstEmpty: uint64 int 1 @@ -5200,22 +5204,22 @@ removeFromStakerPoolSet: byte 0x dupn 4 - // contracts/validatorRegistry.algo.ts:1191 + // contracts/validatorRegistry.algo.ts:1197 // inSameValidatorPoolCount = 0 int 0 frame_bury 0 // inSameValidatorPoolCount: uint64 - // contracts/validatorRegistry.algo.ts:1192 + // contracts/validatorRegistry.algo.ts:1198 // inAnyPoolCount = 0 int 0 frame_bury 1 // inAnyPoolCount: uint64 - // contracts/validatorRegistry.algo.ts:1193 + // contracts/validatorRegistry.algo.ts:1199 // found = false int 0 frame_bury 2 // found: bool - // contracts/validatorRegistry.algo.ts:1195 + // contracts/validatorRegistry.algo.ts:1201 // poolSet = clone(this.stakerPoolSet(staker).value) byte 0x737073 // "sps" frame_dig -1 // staker: Address @@ -5226,13 +5230,13 @@ removeFromStakerPoolSet: assert frame_bury 3 // poolSet: (uint64,uint64,uint64)[6] - // contracts/validatorRegistry.algo.ts:1196 + // contracts/validatorRegistry.algo.ts:1202 // for (let i = 0; i < this.stakerPoolSet(staker).value.length; i += 1) int 0 frame_bury 4 // i: uint64 *for_8: - // contracts/validatorRegistry.algo.ts:1196 + // contracts/validatorRegistry.algo.ts:1202 // i < this.stakerPoolSet(staker).value.length frame_dig 4 // i: uint64 int 6 @@ -5240,7 +5244,7 @@ removeFromStakerPoolSet: bz *for_8_end // *if40_condition - // contracts/validatorRegistry.algo.ts:1197 + // contracts/validatorRegistry.algo.ts:1203 // poolSet[i].id === 0 frame_dig 3 // poolSet: (uint64,uint64,uint64)[6] frame_dig 4 // i: uint64 @@ -5259,7 +5263,7 @@ removeFromStakerPoolSet: b *for_8_continue *if40_end: - // contracts/validatorRegistry.algo.ts:1200 + // contracts/validatorRegistry.algo.ts:1206 // inAnyPoolCount += 1 frame_dig 1 // inAnyPoolCount: uint64 int 1 @@ -5267,7 +5271,7 @@ removeFromStakerPoolSet: frame_bury 1 // inAnyPoolCount: uint64 // *if41_condition - // contracts/validatorRegistry.algo.ts:1201 + // contracts/validatorRegistry.algo.ts:1207 // poolSet[i].id === poolKey.id frame_dig 3 // poolSet: (uint64,uint64,uint64)[6] frame_dig 4 // i: uint64 @@ -5286,7 +5290,7 @@ removeFromStakerPoolSet: // *if41_consequent // *if42_condition - // contracts/validatorRegistry.algo.ts:1202 + // contracts/validatorRegistry.algo.ts:1208 // poolSet[i] === poolKey frame_dig 3 // poolSet: (uint64,uint64,uint64)[6] frame_dig 4 // i: uint64 @@ -5299,12 +5303,12 @@ removeFromStakerPoolSet: bz *if42_else // *if42_consequent - // contracts/validatorRegistry.algo.ts:1203 + // contracts/validatorRegistry.algo.ts:1209 // found = true int 1 frame_bury 2 // found: bool - // contracts/validatorRegistry.algo.ts:1205 + // contracts/validatorRegistry.algo.ts:1211 // this.stakerPoolSet(staker).value[i] = { id: 0, poolId: 0, poolAppId: 0 } frame_dig 4 // i: uint64 int 24 @@ -5318,7 +5322,7 @@ removeFromStakerPoolSet: b *if42_end *if42_else: - // contracts/validatorRegistry.algo.ts:1207 + // contracts/validatorRegistry.algo.ts:1213 // inSameValidatorPoolCount += 1 frame_dig 0 // inSameValidatorPoolCount: uint64 int 1 @@ -5330,7 +5334,7 @@ removeFromStakerPoolSet: *if41_end: *for_8_continue: - // contracts/validatorRegistry.algo.ts:1196 + // contracts/validatorRegistry.algo.ts:1202 // i += 1 frame_dig 4 // i: uint64 int 1 @@ -5340,7 +5344,7 @@ removeFromStakerPoolSet: *for_8_end: // *if43_condition - // contracts/validatorRegistry.algo.ts:1211 + // contracts/validatorRegistry.algo.ts:1217 // !found frame_dig 2 // found: bool ! @@ -5351,7 +5355,7 @@ removeFromStakerPoolSet: err *if43_end: - // contracts/validatorRegistry.algo.ts:1215 + // contracts/validatorRegistry.algo.ts:1221 // return [inSameValidatorPoolCount === 0, inAnyPoolCount === 0] byte 0x00 int 0 @@ -5380,7 +5384,7 @@ addPoolToNode: byte 0x dupn 2 - // contracts/validatorRegistry.algo.ts:1219 + // contracts/validatorRegistry.algo.ts:1225 // nodePoolAssignments = clone(this.validatorList(validatorId).value.nodePoolAssignments) int 900 // headOffset int 192 @@ -5392,7 +5396,7 @@ addPoolToNode: box_extract frame_bury 0 // nodePoolAssignments: ((uint64[3])[8]) - // contracts/validatorRegistry.algo.ts:1220 + // contracts/validatorRegistry.algo.ts:1226 // maxPoolsPerNodeForThisValidator = this.validatorList(validatorId).value.config.poolsPerNode as uint64 int 225 int 1 @@ -5405,7 +5409,7 @@ addPoolToNode: btoi frame_bury 1 // maxPoolsPerNodeForThisValidator: uint64 - // contracts/validatorRegistry.algo.ts:1222 + // contracts/validatorRegistry.algo.ts:1228 // assert(nodeNum >= 1 && nodeNum <= MAX_NODES, 'node number not in valid range') frame_dig -3 // nodeNum: uint64 int 1 @@ -5421,13 +5425,13 @@ addPoolToNode: // node number not in valid range assert - // contracts/validatorRegistry.algo.ts:1224 + // contracts/validatorRegistry.algo.ts:1230 // for (let i = 0; i < maxPoolsPerNodeForThisValidator; i += 1) int 0 frame_bury 2 // i: uint64 *for_9: - // contracts/validatorRegistry.algo.ts:1224 + // contracts/validatorRegistry.algo.ts:1230 // i < maxPoolsPerNodeForThisValidator frame_dig 2 // i: uint64 frame_dig 1 // maxPoolsPerNodeForThisValidator: uint64 @@ -5435,7 +5439,7 @@ addPoolToNode: bz *for_9_end // *if44_condition - // contracts/validatorRegistry.algo.ts:1225 + // contracts/validatorRegistry.algo.ts:1231 // nodePoolAssignments.nodes[nodeNum - 1].poolAppIds[i] === 0 frame_dig 0 // nodePoolAssignments: ((uint64[3])[8]) int 0 @@ -5459,7 +5463,7 @@ addPoolToNode: bz *if44_end // *if44_consequent - // contracts/validatorRegistry.algo.ts:1227 + // contracts/validatorRegistry.algo.ts:1233 // this.validatorList(validatorId).value.nodePoolAssignments.nodes[nodeNum - 1].poolAppIds[i] = poolAppId int 900 frame_dig -3 // nodeNum: uint64 @@ -5483,14 +5487,14 @@ addPoolToNode: cover 2 box_replace - // contracts/validatorRegistry.algo.ts:1228 + // contracts/validatorRegistry.algo.ts:1234 // return retsub *if44_end: *for_9_continue: - // contracts/validatorRegistry.algo.ts:1224 + // contracts/validatorRegistry.algo.ts:1230 // i += 1 frame_dig 2 // i: uint64 int 1 @@ -5517,7 +5521,7 @@ doesStakerMeetGating: byte 0x dupn 8 - // contracts/validatorRegistry.algo.ts:1242 + // contracts/validatorRegistry.algo.ts:1248 // type = this.validatorList(validatorId).value.config.entryGatingType int 80 int 1 @@ -5531,7 +5535,7 @@ doesStakerMeetGating: frame_bury 0 // type: uint8 // *if45_condition - // contracts/validatorRegistry.algo.ts:1243 + // contracts/validatorRegistry.algo.ts:1249 // type === GATING_TYPE_NONE frame_dig 0 // type: uint8 int 0 @@ -5539,17 +5543,17 @@ doesStakerMeetGating: bz *if45_end // *if45_consequent - // contracts/validatorRegistry.algo.ts:1244 + // contracts/validatorRegistry.algo.ts:1250 // return retsub *if45_end: - // contracts/validatorRegistry.algo.ts:1246 + // contracts/validatorRegistry.algo.ts:1252 // staker = this.txn.sender txn Sender frame_bury 1 // staker: address - // contracts/validatorRegistry.algo.ts:1247 + // contracts/validatorRegistry.algo.ts:1253 // config = clone(this.validatorList(validatorId).value.config) int 0 int 242 @@ -5562,7 +5566,7 @@ doesStakerMeetGating: frame_bury 2 // config: (uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64) // *if46_condition - // contracts/validatorRegistry.algo.ts:1251 + // contracts/validatorRegistry.algo.ts:1257 // type === GATING_TYPE_ASSETS_CREATED_BY || // type === GATING_TYPE_ASSET_ID || // type === GATING_TYPE_CREATED_BY_NFD_ADDRESSES @@ -5588,14 +5592,14 @@ doesStakerMeetGating: bz *if46_end // *if46_consequent - // contracts/validatorRegistry.algo.ts:1255 + // contracts/validatorRegistry.algo.ts:1261 // assert(valueToVerify !== 0) frame_dig -2 // valueToVerify: uint64 int 0 != assert - // contracts/validatorRegistry.algo.ts:1256 + // contracts/validatorRegistry.algo.ts:1262 // balRequired = this.validatorList(validatorId).value.config.gatingAssetMinBalance int 145 int 8 @@ -5609,7 +5613,7 @@ doesStakerMeetGating: frame_bury 3 // balRequired: uint64 // *if47_condition - // contracts/validatorRegistry.algo.ts:1257 + // contracts/validatorRegistry.algo.ts:1263 // balRequired === 0 frame_dig 3 // balRequired: uint64 int 0 @@ -5617,13 +5621,13 @@ doesStakerMeetGating: bz *if47_end // *if47_consequent - // contracts/validatorRegistry.algo.ts:1258 + // contracts/validatorRegistry.algo.ts:1264 // balRequired = 1 int 1 frame_bury 3 // balRequired: uint64 *if47_end: - // contracts/validatorRegistry.algo.ts:1260 + // contracts/validatorRegistry.algo.ts:1266 // assert( // staker.assetBalance(AssetID.fromUint64(valueToVerify)) >= balRequired, // 'must have required minimum balance of validator defined token to add stake', @@ -5640,7 +5644,7 @@ doesStakerMeetGating: *if46_end: // *if48_condition - // contracts/validatorRegistry.algo.ts:1265 + // contracts/validatorRegistry.algo.ts:1271 // type === GATING_TYPE_ASSETS_CREATED_BY frame_dig 0 // type: uint8 int 1 @@ -5648,7 +5652,7 @@ doesStakerMeetGating: bz *if48_end // *if48_consequent - // contracts/validatorRegistry.algo.ts:1266 + // contracts/validatorRegistry.algo.ts:1272 // assert( // AssetID.fromUint64(valueToVerify).creator === config.entryGatingAddress, // 'specified asset must be created by creator that the validator defined as a requirement to stake', @@ -5665,7 +5669,7 @@ doesStakerMeetGating: *if48_end: // *if49_condition - // contracts/validatorRegistry.algo.ts:1271 + // contracts/validatorRegistry.algo.ts:1277 // type === GATING_TYPE_ASSET_ID frame_dig 0 // type: uint8 int 2 @@ -5673,12 +5677,12 @@ doesStakerMeetGating: bz *if49_end // *if49_consequent - // contracts/validatorRegistry.algo.ts:1272 + // contracts/validatorRegistry.algo.ts:1278 // found = false int 0 frame_bury 4 // found: bool - // contracts/validatorRegistry.algo.ts:1273 + // contracts/validatorRegistry.algo.ts:1279 // config.entryGatingAssets frame_dig 2 // config: (uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64) extract 113 32 @@ -5692,7 +5696,7 @@ doesStakerMeetGating: *forOf_0: // *if50_condition - // contracts/validatorRegistry.algo.ts:1274 + // contracts/validatorRegistry.algo.ts:1280 // valueToVerify === assetId frame_dig -2 // valueToVerify: uint64 frame_dig 6 // assetId: uint64 @@ -5700,7 +5704,7 @@ doesStakerMeetGating: bz *if50_end // *if50_consequent - // contracts/validatorRegistry.algo.ts:1275 + // contracts/validatorRegistry.algo.ts:1281 // found = true int 1 frame_bury 4 // found: bool @@ -5727,7 +5731,7 @@ doesStakerMeetGating: b *forOf_0 *forOf_0_end: - // contracts/validatorRegistry.algo.ts:1279 + // contracts/validatorRegistry.algo.ts:1285 // assert(found, 'specified asset must be identical to the asset id defined as a requirement to stake') frame_dig 4 // found: bool @@ -5736,7 +5740,7 @@ doesStakerMeetGating: *if49_end: // *if51_condition - // contracts/validatorRegistry.algo.ts:1281 + // contracts/validatorRegistry.algo.ts:1287 // type === GATING_TYPE_CREATED_BY_NFD_ADDRESSES frame_dig 0 // type: uint8 int 3 @@ -5744,7 +5748,7 @@ doesStakerMeetGating: bz *if51_end // *if51_consequent - // contracts/validatorRegistry.algo.ts:1284 + // contracts/validatorRegistry.algo.ts:1290 // assert( // this.isAddressInNFDCAAlgoList(config.entryGatingAssets[0], AssetID.fromUint64(valueToVerify).creator), // 'specified asset must be created by creator that is one of the linked addresses in an nfd', @@ -5762,7 +5766,7 @@ doesStakerMeetGating: *if51_end: // *if52_condition - // contracts/validatorRegistry.algo.ts:1289 + // contracts/validatorRegistry.algo.ts:1295 // type === GATING_TYPE_SEGMENT_OF_NFD frame_dig 0 // type: uint8 int 4 @@ -5770,12 +5774,12 @@ doesStakerMeetGating: bz *if52_end // *if52_consequent - // contracts/validatorRegistry.algo.ts:1291 + // contracts/validatorRegistry.algo.ts:1297 // userOfferedNFDAppID = valueToVerify frame_dig -2 // valueToVerify: uint64 frame_bury 8 // userOfferedNFDAppID: uint64 - // contracts/validatorRegistry.algo.ts:1292 + // contracts/validatorRegistry.algo.ts:1298 // assert(this.isNFDAppIDValid(userOfferedNFDAppID), 'provided NFD must be valid') frame_dig 8 // userOfferedNFDAppID: uint64 callsub isNFDAppIDValid @@ -5783,7 +5787,7 @@ doesStakerMeetGating: // provided NFD must be valid assert - // contracts/validatorRegistry.algo.ts:1295 + // contracts/validatorRegistry.algo.ts:1301 // assert( // rawBytes(AppID.fromUint64(userOfferedNFDAppID).globalState('i.owner.a') as Address) === // rawBytes(staker) || this.isAddressInNFDCAAlgoList(userOfferedNFDAppID, staker), @@ -5808,7 +5812,7 @@ doesStakerMeetGating: // provided nfd for entry isn't owned or linked to the staker assert - // contracts/validatorRegistry.algo.ts:1302 + // contracts/validatorRegistry.algo.ts:1308 // assert( // btoi(AppID.fromUint64(userOfferedNFDAppID).globalState('i.parentAppID') as bytes) === // config.entryGatingAssets[0], @@ -5847,7 +5851,7 @@ isNFDAppIDValid: // Push empty bytes after the frame pointer to reserve space for local variables byte 0x - // contracts/validatorRegistry.algo.ts:1321 + // contracts/validatorRegistry.algo.ts:1327 // userOfferedNFDName = AppID.fromUint64(nfdAppID).globalState('i.name') as string frame_dig -1 // nfdAppID: uint64 byte 0x692e6e616d65 // "i.name" @@ -5857,7 +5861,7 @@ isNFDAppIDValid: assert frame_bury 0 // userOfferedNFDName: string - // contracts/validatorRegistry.algo.ts:1323 + // contracts/validatorRegistry.algo.ts:1329 // return sendMethodCall<[string, uint64], boolean>({ // applicationID: AppID.fromUint64(this.nfdRegistryAppId), // name: 'isValidNfdAppId', @@ -5869,12 +5873,12 @@ isNFDAppIDValid: method "isValidNfdAppId(string,uint64)bool" itxn_field ApplicationArgs - // contracts/validatorRegistry.algo.ts:1324 + // contracts/validatorRegistry.algo.ts:1330 // applicationID: AppID.fromUint64(this.nfdRegistryAppId) load 200 // TMPL_nfdRegistryAppId itxn_field ApplicationID - // contracts/validatorRegistry.algo.ts:1326 + // contracts/validatorRegistry.algo.ts:1332 // methodArgs: [userOfferedNFDName, nfdAppID] frame_dig 0 // userOfferedNFDName: string dup @@ -5921,7 +5925,7 @@ isAddressInNFDCAAlgoList: byte 0x dupn 2 - // contracts/validatorRegistry.algo.ts:1339 + // contracts/validatorRegistry.algo.ts:1345 // sendAppCall({ // applicationID: AppID.fromUint64(nfdAppID), // applicationArgs: ['read_property', 'v.caAlgo.0.as'], @@ -5930,12 +5934,12 @@ isAddressInNFDCAAlgoList: int appl itxn_field TypeEnum - // contracts/validatorRegistry.algo.ts:1340 + // contracts/validatorRegistry.algo.ts:1346 // applicationID: AppID.fromUint64(nfdAppID) frame_dig -1 // nfdAppID: uint64 itxn_field ApplicationID - // contracts/validatorRegistry.algo.ts:1341 + // contracts/validatorRegistry.algo.ts:1347 // applicationArgs: ['read_property', 'v.caAlgo.0.as'] byte 0x726561645f70726f7065727479 // "read_property" itxn_field ApplicationArgs @@ -5949,18 +5953,18 @@ isAddressInNFDCAAlgoList: // Submit inner transaction itxn_submit - // contracts/validatorRegistry.algo.ts:1343 + // contracts/validatorRegistry.algo.ts:1349 // caAlgoData = this.itxn.lastLog itxn LastLog frame_bury 0 // caAlgoData: byte[] - // contracts/validatorRegistry.algo.ts:1344 + // contracts/validatorRegistry.algo.ts:1350 // for (let i = 0; i < caAlgoData.length; i += 32) int 0 frame_bury 1 // i: uint64 *for_10: - // contracts/validatorRegistry.algo.ts:1344 + // contracts/validatorRegistry.algo.ts:1350 // i < caAlgoData.length frame_dig 1 // i: uint64 frame_dig 0 // caAlgoData: byte[] @@ -5968,7 +5972,7 @@ isAddressInNFDCAAlgoList: < bz *for_10_end - // contracts/validatorRegistry.algo.ts:1345 + // contracts/validatorRegistry.algo.ts:1351 // addr = extract3(caAlgoData, i, 32) frame_dig 0 // caAlgoData: byte[] frame_dig 1 // i: uint64 @@ -5977,7 +5981,7 @@ isAddressInNFDCAAlgoList: frame_bury 2 // addr: byte[] // *if53_condition - // contracts/validatorRegistry.algo.ts:1346 + // contracts/validatorRegistry.algo.ts:1352 // addr !== rawBytes(globals.zeroAddress) && addr === rawBytes(addrToFind) frame_dig 2 // addr: byte[] global ZeroAddress @@ -5993,7 +5997,7 @@ isAddressInNFDCAAlgoList: bz *if53_end // *if53_consequent - // contracts/validatorRegistry.algo.ts:1347 + // contracts/validatorRegistry.algo.ts:1353 // return true int 1 b *isAddressInNFDCAAlgoList*return @@ -6001,7 +6005,7 @@ isAddressInNFDCAAlgoList: *if53_end: *for_10_continue: - // contracts/validatorRegistry.algo.ts:1344 + // contracts/validatorRegistry.algo.ts:1350 // i += 32 frame_dig 1 // i: uint64 int 32 @@ -6010,7 +6014,7 @@ isAddressInNFDCAAlgoList: b *for_10 *for_10_end: - // contracts/validatorRegistry.algo.ts:1350 + // contracts/validatorRegistry.algo.ts:1356 // return false int 0 @@ -6033,12 +6037,12 @@ algoSaturationLevel: // Push empty bytes after the frame pointer to reserve space for local variables byte 0x - // contracts/validatorRegistry.algo.ts:1359 + // contracts/validatorRegistry.algo.ts:1365 // online = this.getCurrentOnlineStake() callsub getCurrentOnlineStake frame_bury 0 // online: uint64 - // contracts/validatorRegistry.algo.ts:1361 + // contracts/validatorRegistry.algo.ts:1367 // return wideRatio([online, MAX_VALIDATOR_SOFT_PCT_OF_ONLINE_1DECIMAL], [1000]) frame_dig 0 // online: uint64 int 100 @@ -6068,12 +6072,12 @@ maxAllowedStake: // Push empty bytes after the frame pointer to reserve space for local variables byte 0x - // contracts/validatorRegistry.algo.ts:1369 + // contracts/validatorRegistry.algo.ts:1375 // online = this.getCurrentOnlineStake() callsub getCurrentOnlineStake frame_bury 0 // online: uint64 - // contracts/validatorRegistry.algo.ts:1371 + // contracts/validatorRegistry.algo.ts:1377 // return wideRatio([online, MAX_VALIDATOR_HARD_PCT_OF_ONLINE_1DECIMAL], [1000]) frame_dig 0 // online: uint64 int 150 @@ -6099,7 +6103,7 @@ maxAllowedStake: maxAlgoAllowedPerPool: proto 0 1 - // contracts/validatorRegistry.algo.ts:1378 + // contracts/validatorRegistry.algo.ts:1384 // return globals.payoutsMaxBalance global PayoutsMaxBalance retsub @@ -6108,7 +6112,7 @@ maxAlgoAllowedPerPool: getCurrentOnlineStake: proto 0 1 - // contracts/validatorRegistry.algo.ts:1382 + // contracts/validatorRegistry.algo.ts:1388 // return onlineStake() online_stake retsub @@ -6120,12 +6124,12 @@ minBalanceForAccount: // Push empty bytes after the frame pointer to reserve space for local variables byte 0x - // contracts/validatorRegistry.algo.ts:1394 + // contracts/validatorRegistry.algo.ts:1400 // minBal = ALGORAND_ACCOUNT_MIN_BALANCE int 100000 frame_bury 0 // minBal: uint64 - // contracts/validatorRegistry.algo.ts:1395 + // contracts/validatorRegistry.algo.ts:1401 // minBal += contracts * APPLICATION_BASE_FEE frame_dig 0 // minBal: uint64 frame_dig -1 // contracts: uint64 @@ -6134,7 +6138,7 @@ minBalanceForAccount: + frame_bury 0 // minBal: uint64 - // contracts/validatorRegistry.algo.ts:1396 + // contracts/validatorRegistry.algo.ts:1402 // minBal += extraPages * APPLICATION_BASE_FEE frame_dig 0 // minBal: uint64 frame_dig -2 // extraPages: uint64 @@ -6143,7 +6147,7 @@ minBalanceForAccount: + frame_bury 0 // minBal: uint64 - // contracts/validatorRegistry.algo.ts:1397 + // contracts/validatorRegistry.algo.ts:1403 // minBal += assets * ASSET_HOLDING_FEE frame_dig 0 // minBal: uint64 frame_dig -3 // assets: uint64 @@ -6152,7 +6156,7 @@ minBalanceForAccount: + frame_bury 0 // minBal: uint64 - // contracts/validatorRegistry.algo.ts:1398 + // contracts/validatorRegistry.algo.ts:1404 // minBal += localInts * SSC_VALUE_UINT frame_dig 0 // minBal: uint64 frame_dig -4 // localInts: uint64 @@ -6161,7 +6165,7 @@ minBalanceForAccount: + frame_bury 0 // minBal: uint64 - // contracts/validatorRegistry.algo.ts:1399 + // contracts/validatorRegistry.algo.ts:1405 // minBal += globalInts * SSC_VALUE_UINT frame_dig 0 // minBal: uint64 frame_dig -6 // globalInts: uint64 @@ -6170,7 +6174,7 @@ minBalanceForAccount: + frame_bury 0 // minBal: uint64 - // contracts/validatorRegistry.algo.ts:1400 + // contracts/validatorRegistry.algo.ts:1406 // minBal += localBytes * SSC_VALUE_BYTES frame_dig 0 // minBal: uint64 frame_dig -5 // localBytes: uint64 @@ -6179,7 +6183,7 @@ minBalanceForAccount: + frame_bury 0 // minBal: uint64 - // contracts/validatorRegistry.algo.ts:1401 + // contracts/validatorRegistry.algo.ts:1407 // minBal += globalBytes * SSC_VALUE_BYTES frame_dig 0 // minBal: uint64 frame_dig -7 // globalBytes: uint64 @@ -6188,7 +6192,7 @@ minBalanceForAccount: + frame_bury 0 // minBal: uint64 - // contracts/validatorRegistry.algo.ts:1402 + // contracts/validatorRegistry.algo.ts:1408 // return minBal frame_dig 0 // minBal: uint64 @@ -6200,7 +6204,7 @@ minBalanceForAccount: costForBoxStorage: proto 1 1 - // contracts/validatorRegistry.algo.ts:1409 + // contracts/validatorRegistry.algo.ts:1415 // return SCBOX_PERBOX + totalNumBytes * SCBOX_PERBYTE int 2500 frame_dig -1 // totalNumBytes: uint64 diff --git a/contracts/contracts/artifacts/ValidatorRegistry.arc32.json b/contracts/contracts/artifacts/ValidatorRegistry.arc32.json index 479210cd..3ee4523d 100644 --- a/contracts/contracts/artifacts/ValidatorRegistry.arc32.json +++ b/contracts/contracts/artifacts/ValidatorRegistry.arc32.json @@ -216,7 +216,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCgovLyBUaGlzIFRFQUwgd2FzIGdlbmVyYXRlZCBieSBURUFMU2NyaXB0IHYwLjEwMy4wCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbGdvcmFuZGZvdW5kYXRpb24vVEVBTFNjcmlwdAoKLy8gVGhpcyBjb250cmFjdCBpcyBjb21wbGlhbnQgd2l0aCBhbmQvb3IgaW1wbGVtZW50cyB0aGUgZm9sbG93aW5nIEFSQ3M6IFsgQVJDNCBdCgovLyBUaGUgZm9sbG93aW5nIGxpbmVzIG9mIFRFQUwgYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0ZW1wbGF0ZSB2YXJpYWJsZXMgaW4gc2NyYXRjaCBzbG90cwpwdXNoYnl0ZXMgVE1QTF9uZmRSZWdpc3RyeUFwcElkCmJ0b2kKc3RvcmUgMjAwCgovLyBUaGUgZm9sbG93aW5nIHRlbiBsaW5lcyBvZiBURUFMIGhhbmRsZSBpbml0aWFsIHByb2dyYW0gZmxvdwovLyBUaGlzIHBhdHRlcm4gaXMgdXNlZCB0byBtYWtlIGl0IGVhc3kgZm9yIGFueW9uZSB0byBwYXJzZSB0aGUgc3RhcnQgb2YgdGhlIHByb2dyYW0gYW5kIGRldGVybWluZSBpZiBhIHNwZWNpZmljIGFjdGlvbiBpcyBhbGxvd2VkCi8vIEhlcmUsIGFjdGlvbiByZWZlcnMgdG8gdGhlIE9uQ29tcGxldGUgaW4gY29tYmluYXRpb24gd2l0aCB3aGV0aGVyIHRoZSBhcHAgaXMgYmVpbmcgY3JlYXRlZCBvciBjYWxsZWQKLy8gRXZlcnkgcG9zc2libGUgYWN0aW9uIGZvciB0aGlzIGNvbnRyYWN0IGlzIHJlcHJlc2VudGVkIGluIHRoZSBzd2l0Y2ggc3RhdGVtZW50Ci8vIElmIHRoZSBhY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIGluIHRoZSBjb250cmFjdCwgaXRzIHJlc3BlY3RpdmUgYnJhbmNoIHdpbGwgYmUgIipOT1RfSU1QTEVNRU5URUQiIHdoaWNoIGp1c3QgY29udGFpbnMgImVyciIKdHhuIEFwcGxpY2F0aW9uSUQKIQppbnQgNgoqCnR4biBPbkNvbXBsZXRpb24KKwpzd2l0Y2ggKmNhbGxfTm9PcCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKmNyZWF0ZV9Ob09wICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRAoKKk5PVF9JTVBMRU1FTlRFRDoKCS8vIFRoZSByZXF1ZXN0ZWQgYWN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIGNvbnRyYWN0LiBBcmUgeW91IHVzaW5nIHRoZSBjb3JyZWN0IE9uQ29tcGxldGU/IERpZCB5b3Ugc2V0IHlvdXIgYXBwIElEPwoJZXJyCgovLyBjcmVhdGVBcHBsaWNhdGlvbigpdm9pZAoqYWJpX3JvdXRlX2NyZWF0ZUFwcGxpY2F0aW9uOgoJLy8gZXhlY3V0ZSBjcmVhdGVBcHBsaWNhdGlvbigpdm9pZAoJY2FsbHN1YiBjcmVhdGVBcHBsaWNhdGlvbgoJaW50IDEKCXJldHVybgoKLy8gY3JlYXRlQXBwbGljYXRpb24oKTogdm9pZApjcmVhdGVBcHBsaWNhdGlvbjoKCXByb3RvIDAgMAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyCgkvLyB0aGlzLnN0YWtpbmdQb29sSW5pdGlhbGl6ZWQudmFsdWUgPSBmYWxzZQoJYnl0ZSAweDY5NmU2OTc0IC8vICJpbml0IgoJaW50IDAKCWJ5dGUgMHgwMAoJaW50IDAKCXVuY292ZXIgMgoJc2V0Yml0CglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgzCgkvLyB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgPSAwCglieXRlIDB4NmU3NTZkNTYgLy8gIm51bVYiCglpbnQgMAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NAoJLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlID0gMAoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJaW50IDAKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODUKCS8vIHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlID0gMAoJYnl0ZSAweDczNzQ2MTZiNjU2NCAvLyAic3Rha2VkIgoJaW50IDAKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIGluaXRTdGFraW5nQ29udHJhY3QodWludDY0KXZvaWQKKmFiaV9yb3V0ZV9pbml0U3Rha2luZ0NvbnRyYWN0OgoJLy8gYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBpbml0U3Rha2luZ0NvbnRyYWN0KHVpbnQ2NCl2b2lkCgljYWxsc3ViIGluaXRTdGFraW5nQ29udHJhY3QKCWludCAxCglyZXR1cm4KCi8vIGluaXRTdGFraW5nQ29udHJhY3QoYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0KTogdm9pZAppbml0U3Rha2luZ0NvbnRyYWN0OgoJcHJvdG8gMSAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTAKCS8vIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uY3JlYXRlKGFwcHJvdmFsUHJvZ3JhbVNpemUpCglieXRlIDB4NzA2ZjZmNmM1NDY1NmQ3MDZjNjE3NDY1NDE3MDcwNzI2Zjc2NjE2YzQyNzk3NDY1NzMgLy8gInBvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMiCglmcmFtZV9kaWcgLTEgLy8gYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0Cglib3hfY3JlYXRlCglwb3AKCXJldHN1YgoKLy8gbG9hZFN0YWtpbmdDb250cmFjdERhdGEodWludDY0LGJ5dGVbXSl2b2lkCiphYmlfcm91dGVfbG9hZFN0YWtpbmdDb250cmFjdERhdGE6CgkvLyBkYXRhOiBieXRlW10KCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWV4dHJhY3QgMiAwCgoJLy8gb2Zmc2V0OiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGxvYWRTdGFraW5nQ29udHJhY3REYXRhKHVpbnQ2NCxieXRlW10pdm9pZAoJY2FsbHN1YiBsb2FkU3Rha2luZ0NvbnRyYWN0RGF0YQoJaW50IDEKCXJldHVybgoKLy8gbG9hZFN0YWtpbmdDb250cmFjdERhdGEob2Zmc2V0OiB1aW50NjQsIGRhdGE6IGJ5dGVzKTogdm9pZApsb2FkU3Rha2luZ0NvbnRyYWN0RGF0YToKCXByb3RvIDIgMAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk0CgkvLyBhc3NlcnQoIXRoaXMuc3Rha2luZ1Bvb2xJbml0aWFsaXplZC52YWx1ZSkKCWJ5dGUgMHg2OTZlNjk3NCAvLyAiaW5pdCIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMAoJZ2V0Yml0CgkhCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5NQoJLy8gdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5yZXBsYWNlKG9mZnNldCwgZGF0YSkKCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWZyYW1lX2RpZyAtMSAvLyBvZmZzZXQ6IHVpbnQ2NAoJZnJhbWVfZGlnIC0yIC8vIGRhdGE6IGJ5dGVzCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdCgpdm9pZAoqYWJpX3JvdXRlX2ZpbmFsaXplU3Rha2luZ0NvbnRyYWN0OgoJLy8gZXhlY3V0ZSBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdCgpdm9pZAoJY2FsbHN1YiBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdAoJaW50IDEKCXJldHVybgoKLy8gZmluYWxpemVTdGFraW5nQ29udHJhY3QoKTogdm9pZApmaW5hbGl6ZVN0YWtpbmdDb250cmFjdDoKCXByb3RvIDAgMAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk5CgkvLyB0aGlzLnN0YWtpbmdQb29sSW5pdGlhbGl6ZWQudmFsdWUgPSB0cnVlCglieXRlIDB4Njk2ZTY5NzQgLy8gImluaXQiCglpbnQgMQoJYnl0ZSAweDAwCglpbnQgMAoJdW5jb3ZlciAyCglzZXRiaXQKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIGdhcygpdm9pZAoqYWJpX3JvdXRlX2dhczoKCS8vIGV4ZWN1dGUgZ2FzKCl2b2lkCgljYWxsc3ViIGdhcwoJaW50IDEKCXJldHVybgoKLy8gZ2FzKCk6IHZvaWQKLy8KLy8gZ2FzIGlzIGEgZHVtbXkgbm8tb3AgY2FsbCB0aGF0IGNhbiBiZSB1c2VkIHRvIHBvb2wtdXAgcmVzb3VyY2UgcmVmZXJlbmNlcyBhbmQgb3Bjb2RlIGNvc3QKZ2FzOgoJcHJvdG8gMCAwCglyZXRzdWIKCi8vIGdldE1ickFtb3VudHMoKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0TWJyQW1vdW50czoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXRNYnJBbW91bnRzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0TWJyQW1vdW50cygpOiBNYnJBbW91bnRzCi8vCi8vIFJldHVybnMgdGhlIE1CUiBhbW91bnRzIG5lZWRlZCBmb3IgdmFyaW91cyBhY3Rpb25zOgovLyBbCi8vIGFkZFZhbGlkYXRvck1icjogdWludDY0IC0gbWJyIG5lZWRlZCB0byBhZGQgYSBuZXcgdmFsaWRhdG9yIC0gcGFpZCB0byB2YWxpZGF0b3IgY29udHJhY3QKLy8gYWRkUG9vbE1icjogdWludDY0IC0gbWJyIG5lZWRlZCB0byBhZGQgYSBuZXcgcG9vbCAtIHBhaWQgdG8gdmFsaWRhdG9yCi8vIHBvb2xJbml0TWJyOiB1aW50NjQgLSBtYnIgbmVlZGVkIHRvIGluaXRTdG9yYWdlKCkgb2YgcG9vbCAtIHBhaWQgdG8gcG9vbCBpdHNlbGYKLy8gYWRkU3Rha2VyTWJyOiB1aW50NjQgLSBtYnIgc3Rha2VyIG5lZWRzIHRvIGFkZCB0byBmaXJzdCBzdGFraW5nIHBheW1lbnQgKHN0YXlzIHcvIHZhbGlkYXRvcikKLy8gXQpnZXRNYnJBbW91bnRzOgoJcHJvdG8gMCAxCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5CgkvLyByZXR1cm4gewoJLy8gICAgICAgICAgICAgYWRkVmFsaWRhdG9yTWJyOiB0aGlzLmNvc3RGb3JCb3hTdG9yYWdlKDEgLyogdiBwcmVmaXggKi8gKyBsZW48VmFsaWRhdG9ySWRUeXBlPigpICsgbGVuPFZhbGlkYXRvckluZm8+KCkpLAoJLy8gICAgICAgICAgICAgYWRkUG9vbE1icjogdGhpcy5taW5CYWxhbmNlRm9yQWNjb3VudCgKCS8vICAgICAgICAgICAgICAgICAxLAoJLy8gICAgICAgICAgICAgICAgIC8vIHdlIGNvdWxkIGNhbGN1bGF0ZSB0aGlzIGRpcmVjdGx5IGJ5IHJlZmVyZW5jaW5nIHRoZSBzaXplIG9mIHN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtIGJ1dCBpdCB3b3VsZAoJLy8gICAgICAgICAgICAgICAgIC8vIG1lYW4gb3VyIGNhbGxlcnMgd291bGQgaGF2ZSB0byByZWZlcmVuY2UgdGhlIGJveCBBTkQgYnV5IHVwIGkvbyAtIHNvIGp1c3QgZ28gbWF4IG9uIGV4dHJhIHBhZ2VzCgkvLyAgICAgICAgICAgICAgICAgMywKCS8vICAgICAgICAgICAgICAgICAwLAoJLy8gICAgICAgICAgICAgICAgIDAsCgkvLyAgICAgICAgICAgICAgICAgMCwKCS8vICAgICAgICAgICAgICAgICBTdGFraW5nUG9vbC5zY2hlbWEuZ2xvYmFsLm51bVVpbnQsCgkvLyAgICAgICAgICAgICAgICAgU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1CeXRlU2xpY2UsCgkvLyAgICAgICAgICAgICApLAoJLy8gICAgICAgICAgICAgcG9vbEluaXRNYnI6CgkvLyAgICAgICAgICAgICAgICAgQUxHT1JBTkRfQUNDT1VOVF9NSU5fQkFMQU5DRSArCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5jb3N0Rm9yQm94U3RvcmFnZSg3IC8qICdzdGFrZXJzJyBuYW1lICovICsgbGVuPFN0YWtlZEluZm8+KCkgKiBNQVhfU1RBS0VSU19QRVJfUE9PTCksCgkvLyAgICAgICAgICAgICBhZGRTdGFrZXJNYnI6CgkvLyAgICAgICAgICAgICAgICAgLy8gaG93IG11Y2ggdG8gY2hhcmdlIGZvciBmaXJzdCB0aW1lIGEgc3Rha2VyIGFkZHMgc3Rha2UgLSBzaW5jZSB3ZSBhZGQgYSB0cmFja2luZyBib3ggcGVyIHN0YWtlcgoJLy8gICAgICAgICAgICAgICAgIHRoaXMuY29zdEZvckJveFN0b3JhZ2UoCgkvLyAgICAgICAgICAgICAgICAgICAgIDMgLyogJ3NwcycgcHJlZml4ICovICsgbGVuPEFkZHJlc3M+KCkgKyBsZW48VmFsaWRhdG9yUG9vbEtleT4oKSAqIE1BWF9QT09MU19QRVJfU1RBS0VSLAoJLy8gICAgICAgICAgICAgICAgICksIC8vIHNpemUgb2Yga2V5ICsgYWxsIHZhbHVlcwoJLy8gICAgICAgICB9CglpbnQgMTEwMQoJY2FsbHN1YiBjb3N0Rm9yQm94U3RvcmFnZQoJaXRvYgoJaW50IDMKCWludCAxMQoJaW50IDAKCWR1cG4gMgoJaW50IDMKCWludCAxCgljYWxsc3ViIG1pbkJhbGFuY2VGb3JBY2NvdW50CglpdG9iCgljb25jYXQKCWludCAxMDAwMDAKCWludCAxMjgwNwoJY2FsbHN1YiBjb3N0Rm9yQm94U3RvcmFnZQoJKwoJaXRvYgoJY29uY2F0CglpbnQgMTc5CgljYWxsc3ViIGNvc3RGb3JCb3hTdG9yYWdlCglpdG9iCgljb25jYXQKCXJldHN1YgoKLy8gZ2V0UHJvdG9jb2xDb25zdHJhaW50cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0UHJvdG9jb2xDb25zdHJhaW50czoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXRQcm90b2NvbENvbnN0cmFpbnRzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWNhbGxzdWIgZ2V0UHJvdG9jb2xDb25zdHJhaW50cwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFByb3RvY29sQ29uc3RyYWludHMoKTogQ29uc3RyYWludHMKLy8KLy8gUmV0dXJucyB0aGUgcHJvdG9jb2wgY29uc3RyYWludHMgc28gdGhhdCBVSXMgY2FuIGxpbWl0IHdoYXQgdXNlcnMgc3BlY2lmeSBmb3IgdmFsaWRhdG9yIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KZ2V0UHJvdG9jb2xDb25zdHJhaW50czoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0NwoJLy8gcmV0dXJuIHsKCS8vICAgICAgICAgICAgIGVwb2NoUGF5b3V0Um91bmRzTWluOiBNSU5fRVBPQ0hfTEVOR1RILAoJLy8gICAgICAgICAgICAgZXBvY2hQYXlvdXRSb3VuZHNNYXg6IE1BWF9FUE9DSF9MRU5HVEgsCgkvLyAgICAgICAgICAgICBtaW5QY3RUb1ZhbGlkYXRvcldGb3VyRGVjaW1hbHM6IE1JTl9QQ1RfVE9fVkFMSURBVE9SLAoJLy8gICAgICAgICAgICAgbWF4UGN0VG9WYWxpZGF0b3JXRm91ckRlY2ltYWxzOiBNQVhfUENUX1RPX1ZBTElEQVRPUiwKCS8vICAgICAgICAgICAgIG1pbkVudHJ5U3Rha2U6IE1JTl9BTEdPX1NUQUtFX1BFUl9QT09MLAoJLy8gICAgICAgICAgICAgbWF4QWxnb1BlclBvb2w6IHRoaXMubWF4QWxnb0FsbG93ZWRQZXJQb29sKCksCgkvLyAgICAgICAgICAgICBtYXhBbGdvUGVyVmFsaWRhdG9yOiB0aGlzLm1heEFsbG93ZWRTdGFrZSgpLAoJLy8gICAgICAgICAgICAgYW10Q29uc2lkZXJlZFNhdHVyYXRlZDogdGhpcy5hbGdvU2F0dXJhdGlvbkxldmVsKCksCgkvLyAgICAgICAgICAgICBtYXhOb2RlczogTUFYX05PREVTLAoJLy8gICAgICAgICAgICAgbWF4UG9vbHNQZXJOb2RlOiBNQVhfUE9PTFNfUEVSX05PREUsCgkvLyAgICAgICAgICAgICBtYXhTdGFrZXJzUGVyUG9vbDogTUFYX1NUQUtFUlNfUEVSX1BPT0wsCgkvLyAgICAgICAgIH0KCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDBmNDI0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGY0MjQwMDAwMDAwMDAwMDBmNDI0MAoJY2FsbHN1YiBtYXhBbGdvQWxsb3dlZFBlclBvb2wKCWl0b2IKCWNvbmNhdAoJY2FsbHN1YiBtYXhBbGxvd2VkU3Rha2UKCWl0b2IKCWNvbmNhdAoJY2FsbHN1YiBhbGdvU2F0dXJhdGlvbkxldmVsCglpdG9iCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDA4Cgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAzCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMGM4Cgljb25jYXQKCXJldHN1YgoKLy8gZ2V0TnVtVmFsaWRhdG9ycygpdWludDY0CiphYmlfcm91dGVfZ2V0TnVtVmFsaWRhdG9yczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXROdW1WYWxpZGF0b3JzKCl1aW50NjQKCWNhbGxzdWIgZ2V0TnVtVmFsaWRhdG9ycwoJaXRvYgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldE51bVZhbGlkYXRvcnMoKTogdWludDY0Ci8vCi8vIFJldHVybnMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHZhbGlkYXRvcnMKZ2V0TnVtVmFsaWRhdG9yczoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE2NwoJLy8gcmV0dXJuIHRoaXMubnVtVmFsaWRhdG9ycy52YWx1ZQoJYnl0ZSAweDZlNzU2ZDU2IC8vICJudW1WIgoJYXBwX2dsb2JhbF9nZXQKCXJldHN1YgoKLy8gZ2V0VmFsaWRhdG9yQ29uZmlnKHVpbnQ2NCkodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKKmFiaV9yb3V0ZV9nZXRWYWxpZGF0b3JDb25maWc6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFZhbGlkYXRvckNvbmZpZyh1aW50NjQpKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCgljYWxsc3ViIGdldFZhbGlkYXRvckNvbmZpZwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvckNvbmZpZyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogVmFsaWRhdG9yQ29uZmlnCmdldFZhbGlkYXRvckNvbmZpZzoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE3MgoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnCglpbnQgMAoJaW50IDI0MgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCXJldHN1YgoKLy8gZ2V0VmFsaWRhdG9yU3RhdGUodWludDY0KSh1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0VmFsaWRhdG9yU3RhdGU6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFZhbGlkYXRvclN0YXRlKHVpbnQ2NCkodWludDE2LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBnZXRWYWxpZGF0b3JTdGF0ZQoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvclN0YXRlKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBWYWxpZGF0b3JDdXJTdGF0ZQpnZXRWYWxpZGF0b3JTdGF0ZToKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE3NwoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUKCWludCAyNDIgLy8gaGVhZE9mZnNldAoJaW50IDI2CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpCiphYmlfcm91dGVfZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpCgljYWxsc3ViIGdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcih2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogW0FkZHJlc3MsIEFkZHJlc3NdCmdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcjoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE4MgoJLy8gcmV0dXJuIFsKCS8vICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLAoJLy8gICAgICAgICAgICAgdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWFuYWdlciwKCS8vICAgICAgICAgXQoJaW50IDgKCWludCAzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWludCA0MAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJY29uY2F0CglyZXRzdWIKCi8vIGdldFBvb2xzKHVpbnQ2NCkodWludDY0LHVpbnQxNix1aW50NjQpW10KKmFiaV9yb3V0ZV9nZXRQb29sczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0UG9vbHModWludDY0KSh1aW50NjQsdWludDE2LHVpbnQ2NClbXQoJY2FsbHN1YiBnZXRQb29scwoJZHVwCglsZW4KCWludCAxOAoJLwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFBvb2xzKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBQb29sSW5mb1tdCi8vCi8vIFJldHVybiBsaXN0IG9mIGFsbCBwb29scyBmb3IgdGhpcyB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWxpZGF0b3JJZAovLyBAcmV0dXJuIHtQb29sSW5mb1tdfSAtIGFycmF5IG9mIHBvb2xzCi8vIE5vdCBjYWxsYWJsZSBmcm9tIG90aGVyIGNvbnRyYWN0cyBiZWNhdXNlID4xSyByZXR1cm4gYnV0IGNhbiBiZSBjYWxsZWQgdy8gc2ltdWxhdGUgd2hpY2ggYnVtcHMgbG9nIHJldHVybnMKZ2V0UG9vbHM6Cglwcm90byAxIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiAyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk2CgkvLyByZXREYXRhOiBQb29sSW5mb1tdID0gW10KCWJ5dGUgMHgKCWZyYW1lX2J1cnkgMCAvLyByZXREYXRhOiBQb29sSW5mb1tdCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk3CgkvLyBwb29sU2V0ID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29scykKCWludCAyNjggLy8gaGVhZE9mZnNldAoJaW50IDQzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWZyYW1lX2J1cnkgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE5OAoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBwb29sU2V0Lmxlbmd0aDsgaSArPSAxKQoJaW50IDAKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCipmb3JfMDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE5OAoJLy8gaSA8IHBvb2xTZXQubGVuZ3RoCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCAyNAoJPAoJYnogKmZvcl8wX2VuZAoKCS8vICppZjBfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxOTkKCS8vIHBvb2xTZXRbaV0ucG9vbEFwcElkID09PSAwCglmcmFtZV9kaWcgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWYwX2VuZAoKCS8vICppZjBfY29uc2VxdWVudAoJYiAqZm9yXzBfZW5kCgoqaWYwX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIwMwoJLy8gcmV0RGF0YS5wdXNoKHBvb2xTZXRbaV0pCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBQb29sSW5mb1tdCglmcmFtZV9kaWcgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDE4CglleHRyYWN0MwoJY29uY2F0CglmcmFtZV9idXJ5IDAgLy8gcmV0RGF0YTogUG9vbEluZm9bXQoKKmZvcl8wX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk4CgkvLyBpICs9IDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCWIgKmZvcl8wCgoqZm9yXzBfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjA1CgkvLyByZXR1cm4gcmV0RGF0YQoJZnJhbWVfZGlnIDAgLy8gcmV0RGF0YTogUG9vbEluZm9bXQoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDIKCXJldHN1YgoKLy8gZ2V0UG9vbEFwcElkKHVpbnQ2NCx1aW50NjQpdWludDY0CiphYmlfcm91dGVfZ2V0UG9vbEFwcElkOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBwb29sSWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJYnRvaQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFBvb2xBcHBJZCh1aW50NjQsdWludDY0KXVpbnQ2NAoJY2FsbHN1YiBnZXRQb29sQXBwSWQKCWl0b2IKCWNvbmNhdAoJbG9nCglpbnQgMQoJcmV0dXJuCgovLyBnZXRQb29sQXBwSWQodmFsaWRhdG9ySWQ6IHVpbnQ2NCwgcG9vbElkOiB1aW50NjQpOiB1aW50NjQKZ2V0UG9vbEFwcElkOgoJcHJvdG8gMiAxCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjEzCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBwb29sSWQgIT09IDAgJiYgcG9vbElkIDw9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHMubGVuZ3RoLAoJLy8gICAgICAgICAgICAgJ3Bvb2wgaWQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIG51bWJlciBvZiBwb29scyBmb3IgdGhpcyB2YWxpZGF0b3InLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTIgLy8gcG9vbElkOiB1aW50NjQKCWludCAwCgkhPQoJZHVwCglieiAqc2tpcF9hbmQwCglmcmFtZV9kaWcgLTIgLy8gcG9vbElkOiB1aW50NjQKCWludCAyNAoJPD0KCSYmCgoqc2tpcF9hbmQwOgoJLy8gcG9vbCBpZCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgbnVtYmVyIG9mIHBvb2xzIGZvciB0aGlzIHZhbGlkYXRvcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjE3CgkvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1twb29sSWQgLSAxXS5wb29sQXBwSWQKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0yIC8vIHBvb2xJZDogdWludDY0CglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCXJldHN1YgoKLy8gZ2V0UG9vbEluZm8oKHVpbnQ2NCx1aW50NjQsdWludDY0KSkodWludDY0LHVpbnQxNix1aW50NjQpCiphYmlfcm91dGVfZ2V0UG9vbEluZm86CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHBvb2xLZXk6ICh1aW50NjQsdWludDY0LHVpbnQ2NCkKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWR1cAoJbGVuCglpbnQgMjQKCT09CgoJLy8gYXJndW1lbnQgMCAocG9vbEtleSkgZm9yIGdldFBvb2xJbmZvIG11c3QgYmUgYSAodWludDY0LHVpbnQ2NCx1aW50NjQpCglhc3NlcnQKCgkvLyBleGVjdXRlIGdldFBvb2xJbmZvKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpKHVpbnQ2NCx1aW50MTYsdWludDY0KQoJY2FsbHN1YiBnZXRQb29sSW5mbwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFBvb2xJbmZvKHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkpOiBQb29sSW5mbwpnZXRQb29sSW5mbzoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIyMgoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRDdXJNYXhTdGFrZVBlclBvb2wodWludDY0KXVpbnQ2NAoqYWJpX3JvdXRlX2dldEN1ck1heFN0YWtlUGVyUG9vbDoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHVpbnQ2NCl1aW50NjQKCWNhbGxzdWIgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sCglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiB1aW50NjQKLy8KLy8gQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIHN0YWtlIHBlciBwb29sIGZvciBhIGdpdmVuIHZhbGlkYXRvci4KLy8gTm9ybWFsbHkgdGhpcyB3b3VsZCBiZSBtYXhBbGdvUGVyUG9vbCwgYnV0IGl0IHNob3VsZCBhbHNvIG5ldmVyIGdvIGFib3ZlIE1heEFsbG93ZWRTdGFrZSAvIG51bVBvb2xzIHNvCi8vIGFzIHBvb2xzIGFyZSBhZGRlZCB0aGUgbWF4IGFsbG93ZWQgcGVyIHBvb2wgY2FuIHJlZHVjZS4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCmdldEN1ck1heFN0YWtlUGVyUG9vbDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzMKCS8vIG51bVBvb2xzID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyBhcyB1aW50NjQKCWludCAyNDIKCWludCAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIG51bVBvb2xzOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzQKCS8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzID0gdGhpcy5tYXhBbGxvd2VkU3Rha2UoKSAvIG51bVBvb2xzCgljYWxsc3ViIG1heEFsbG93ZWRTdGFrZQoJZnJhbWVfZGlnIDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoJLwoJZnJhbWVfYnVyeSAxIC8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzUKCS8vIG1heFBlclBvb2w6IHVpbnQ2NCA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1heEFsZ29QZXJQb29sCglpbnQgMjE3CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCgkvLyAqaWYxX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjM2CgkvLyBtYXhQZXJQb29sID09PSAwCglmcmFtZV9kaWcgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCWludCAwCgk9PQoJYnogKmlmMV9lbmQKCgkvLyAqaWYxX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIzNwoJLy8gbWF4UGVyUG9vbCA9IHRoaXMubWF4QWxnb0FsbG93ZWRQZXJQb29sKCkKCWNhbGxzdWIgbWF4QWxnb0FsbG93ZWRQZXJQb29sCglmcmFtZV9idXJ5IDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoqaWYxX2VuZDoKCS8vICppZjJfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzkKCS8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzIDwgbWF4UGVyUG9vbAoJZnJhbWVfZGlnIDEgLy8gaGFyZE1heERpdmlkZWRCZXR3ZWVuUG9vbHM6IHVpbnQ2NAoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8CglieiAqaWYyX2VuZAoKCS8vICppZjJfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjQwCgkvLyBtYXhQZXJQb29sID0gaGFyZE1heERpdmlkZWRCZXR3ZWVuUG9vbHMKCWZyYW1lX2RpZyAxIC8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzOiB1aW50NjQKCWZyYW1lX2J1cnkgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCippZjJfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjQyCgkvLyByZXR1cm4gbWF4UGVyUG9vbAoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCgoJLy8gcG9wIGFsbCBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUgc3RhY2sKCXBvcG4gMgoJcmV0c3ViCgovLyBkb2VzU3Rha2VyTmVlZFRvUGF5TUJSKGFkZHJlc3MpYm9vbAoqYWJpX3JvdXRlX2RvZXNTdGFrZXJOZWVkVG9QYXlNQlI6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHN0YWtlcjogYWRkcmVzcwoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZHVwCglsZW4KCWludCAzMgoJPT0KCgkvLyBhcmd1bWVudCAwIChzdGFrZXIpIGZvciBkb2VzU3Rha2VyTmVlZFRvUGF5TUJSIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBleGVjdXRlIGRvZXNTdGFrZXJOZWVkVG9QYXlNQlIoYWRkcmVzcylib29sCgljYWxsc3ViIGRvZXNTdGFrZXJOZWVkVG9QYXlNQlIKCWJ5dGUgMHgwMAoJaW50IDAKCXVuY292ZXIgMgoJc2V0Yml0Cgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZG9lc1N0YWtlck5lZWRUb1BheU1CUihzdGFrZXI6IEFkZHJlc3MpOiBib29sZWFuCi8vCi8vIEhlbHBlciBjYWxsZXJzIGNhbiBjYWxsIHcvIHNpbXVsYXRlIHRvIGRldGVybWluZSBpZiAnQWRkU3Rha2VyJyBNQlIgc2hvdWxkIGJlIGluY2x1ZGVkIHcvIHN0YWtpbmcgYW1vdW50Ci8vIEBwYXJhbSBzdGFrZXIKZG9lc1N0YWtlck5lZWRUb1BheU1CUjoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI1MQoJLy8gcmV0dXJuICF0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS5leGlzdHMKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZXI6IEFkZHJlc3MKCWNvbmNhdAoJYm94X2xlbgoJc3dhcAoJcG9wCgkhCglyZXRzdWIKCi8vIGdldFN0YWtlZFBvb2xzRm9yQWNjb3VudChhZGRyZXNzKSh1aW50NjQsdWludDY0LHVpbnQ2NClbXQoqYWJpX3JvdXRlX2dldFN0YWtlZFBvb2xzRm9yQWNjb3VudDoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gc3Rha2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKHN0YWtlcikgZm9yIGdldFN0YWtlZFBvb2xzRm9yQWNjb3VudCBtdXN0IGJlIGEgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBnZXRTdGFrZWRQb29sc0ZvckFjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCx1aW50NjQpW10KCWNhbGxzdWIgZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50CglkdXAKCWxlbgoJaW50IDI0CgkvCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0Cgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50KHN0YWtlcjogQWRkcmVzcyk6IFZhbGlkYXRvclBvb2xLZXlbXQovLwovLyBSZXRyaWV2ZXMgdGhlIHN0YWtlZCBwb29scyBmb3IgYW4gYWNjb3VudC4KLy8KLy8gQHBhcmFtIHtBZGRyZXNzfSBzdGFrZXIgLSBUaGUgYWNjb3VudCB0byByZXRyaWV2ZSBzdGFrZWQgcG9vbHMgZm9yLgovLyBAcmV0dXJuIHtWYWxpZGF0b3JQb29sS2V5W119IC0gVGhlIGFycmF5IG9mIHN0YWtlZCBwb29scyBmb3IgdGhlIGFjY291bnQuCmdldFN0YWtlZFBvb2xzRm9yQWNjb3VudDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyAqaWYzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjYxCgkvLyAhdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikuZXhpc3RzCglieXRlIDB4NzM3MDczIC8vICJzcHMiCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoJIQoJYnogKmlmM19lbmQKCgkvLyAqaWYzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2MgoJLy8gcmV0dXJuIFtdCglieXRlIDB4CgliICpnZXRTdGFrZWRQb29sc0ZvckFjY291bnQqcmV0dXJuCgoqaWYzX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2NAoJLy8gcmV0RGF0YTogVmFsaWRhdG9yUG9vbEtleVtdID0gW10KCWJ5dGUgMHgKCWZyYW1lX2J1cnkgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjUKCS8vIHBvb2xTZXQgPSBjbG9uZSh0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZSkKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZXI6IEFkZHJlc3MKCWNvbmNhdAoJYm94X2dldAoKCS8vIGJveCB2YWx1ZSBkb2VzIG5vdCBleGlzdDogdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUKCWFzc2VydAoJZnJhbWVfYnVyeSAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjYKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgcG9vbFNldC5sZW5ndGg7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzE6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjYKCS8vIGkgPCBwb29sU2V0Lmxlbmd0aAoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl8xX2VuZAoKCS8vICppZjRfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjcKCS8vIHBvb2xTZXRbaV0uaWQgIT09IDAKCWZyYW1lX2RpZyAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgkhPQoJYnogKmlmNF9lbmQKCgkvLyAqaWY0X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2OAoJLy8gcmV0RGF0YS5wdXNoKHBvb2xTZXRbaV0pCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCWZyYW1lX2RpZyAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWNvbmNhdAoJZnJhbWVfYnVyeSAwIC8vIHJldERhdGE6IFZhbGlkYXRvclBvb2xLZXlbXQoKKmlmNF9lbmQ6CgoqZm9yXzFfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjYKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzEKCipmb3JfMV9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzEKCS8vIHJldHVybiByZXREYXRhCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCipnZXRTdGFrZWRQb29sc0ZvckFjY291bnQqcmV0dXJuOgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCgoJLy8gcG9wIGFsbCBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUgc3RhY2sKCXBvcG4gMgoJcmV0c3ViCgovLyBnZXRUb2tlblBheW91dFJhdGlvKHVpbnQ2NCkodWludDY0WzI0XSx1aW50NjQpCiphYmlfcm91dGVfZ2V0VG9rZW5QYXlvdXRSYXRpbzoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KQoJY2FsbHN1YiBnZXRUb2tlblBheW91dFJhdGlvCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0VG9rZW5QYXlvdXRSYXRpbyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogUG9vbFRva2VuUGF5b3V0UmF0aW8KLy8KLy8gUmV0cmlldmVzIHRoZSB0b2tlbiBwYXlvdXQgcmF0aW8gZm9yIGEgZ2l2ZW4gdmFsaWRhdG9yIC0gcmV0dXJuaW5nIHRoZSBwb29sIHJhdGlvcyBvZiB3aG9sZSBzbyB0aGF0IHRva2VuCi8vIHBheW91dHMgYWNyb3NzIHBvb2xzIGNhbiBiZSBiYXNlZCBvbiBhIHN0YWJsZSBzbmFwaG9zdCBvZiBzdGFrZS4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEByZXR1cm4ge1Bvb2xUb2tlblBheW91dFJhdGlvfSAtIFRoZSB0b2tlbiBwYXlvdXQgcmF0aW8gZm9yIHRoZSB2YWxpZGF0b3IuCmdldFRva2VuUGF5b3V0UmF0aW86Cglwcm90byAxIDEKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyODMKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCXJldHN1YgoKLy8gZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cyh1aW50NjQpKCh1aW50NjRbM10pWzhdKQoqYWJpX3JvdXRlX2dldE5vZGVQb29sQXNzaWdubWVudHM6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldE5vZGVQb29sQXNzaWdubWVudHModWludDY0KSgodWludDY0WzNdKVs4XSkKCWNhbGxzdWIgZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldE5vZGVQb29sQXNzaWdubWVudHModmFsaWRhdG9ySWQ6IHVpbnQ2NCk6IE5vZGVQb29sQXNzaWdubWVudENvbmZpZwpnZXROb2RlUG9vbEFzc2lnbm1lbnRzOgoJcHJvdG8gMSAxCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mjg4CgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS5leGlzdHMsICJ0aGUgc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBkb2Vzbid0IGV4aXN0IikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoKCS8vIHRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGRvZXNuJ3QgZXhpc3QKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI5MAoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUubm9kZVBvb2xBc3NpZ25tZW50cwoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRORkRSZWdpc3RyeUlEKCl1aW50NjQKKmFiaV9yb3V0ZV9nZXRORkRSZWdpc3RyeUlEOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBleGVjdXRlIGdldE5GRFJlZ2lzdHJ5SUQoKXVpbnQ2NAoJY2FsbHN1YiBnZXRORkRSZWdpc3RyeUlECglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0TkZEUmVnaXN0cnlJRCgpOiB1aW50NjQKZ2V0TkZEUmVnaXN0cnlJRDoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI5NAoJLy8gcmV0dXJuIHRoaXMubmZkUmVnaXN0cnlBcHBJZAoJbG9hZCAyMDAgLy8gVE1QTF9uZmRSZWdpc3RyeUFwcElkCglyZXRzdWIKCi8vIGFkZFZhbGlkYXRvcihwYXksc3RyaW5nLCh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KSl1aW50NjQKKmFiaV9yb3V0ZV9hZGRWYWxpZGF0b3I6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIGNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDI0MgoJPT0KCgkvLyBhcmd1bWVudCAwIChjb25maWcpIGZvciBhZGRWYWxpZGF0b3IgbXVzdCBiZSBhICh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KQoJYXNzZXJ0CgoJLy8gbmZkTmFtZTogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglleHRyYWN0IDIgMAoKCS8vIG1iclBheW1lbnQ6IHBheQoJdHhuIEdyb3VwSW5kZXgKCWludCAxCgktCglkdXAKCWd0eG5zIFR5cGVFbnVtCglpbnQgcGF5Cgk9PQoKCS8vIGFyZ3VtZW50IDIgKG1iclBheW1lbnQpIGZvciBhZGRWYWxpZGF0b3IgbXVzdCBiZSBhIHBheSB0cmFuc2FjdGlvbgoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBhZGRWYWxpZGF0b3IocGF5LHN0cmluZywodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkpdWludDY0CgljYWxsc3ViIGFkZFZhbGlkYXRvcgoJaXRvYgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFZhbGlkYXRvcihtYnJQYXltZW50OiBQYXlUeG4sIG5mZE5hbWU6IHN0cmluZywgY29uZmlnOiBWYWxpZGF0b3JDb25maWcpOiB1aW50NjQKLy8KLy8gQWRkcyBhIG5ldyB2YWxpZGF0b3IKLy8gUmVxdWlyZXMgYXQgbGVhc3QgMTAgQUxHTyBhcyB0aGUgJ2ZlZScgZm9yIHRoZSB0cmFuc2FjdGlvbiB0byBoZWxwIGRpc3N1YWRlIHNwYW1tZWQgdmFsaWRhdG9yIGFkZHMuCi8vCi8vIEBwYXJhbSB7UGF5VHhufSBtYnJQYXltZW50IHBheW1lbnQgZnJvbSBjYWxsZXIgd2hpY2ggY292ZXJzIG1iciBpbmNyZWFzZSBvZiBuZXcgdmFsaWRhdG9yIHN0b3JhZ2UKLy8gQHBhcmFtIHtzdHJpbmd9IG5mZE5hbWUgKE9wdGlvbmFsKSBOYW1lIG9mIG5mZCAodXNlZCBhcyBkb3VibGUtY2hlY2sgYWdhaW5zdCBpZCBzcGVjaWZpZWQgaW4gY29uZmlnKQovLyBAcGFyYW0ge1ZhbGlkYXRvckNvbmZpZ30gY29uZmlnIFZhbGlkYXRvckNvbmZpZyBzdHJ1Y3QKLy8gQHJldHVybnMge3VpbnQ2NH0gdmFsaWRhdG9yIGlkCmFkZFZhbGlkYXRvcjoKCXByb3RvIDMgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzA2CgkvLyB0aGlzLnZhbGlkYXRlQ29uZmlnKGNvbmZpZykKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJY2FsbHN1YiB2YWxpZGF0ZUNvbmZpZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMwOAoJLy8gdmVyaWZ5UGF5VHhuKG1iclBheW1lbnQsIHsgcmVjZWl2ZXI6IHRoaXMuYXBwLmFkZHJlc3MsIGFtb3VudDogdGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkVmFsaWRhdG9yTWJyIH0pCgkvLyB2ZXJpZnkgcmVjZWl2ZXIKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIFJlY2VpdmVyCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6InJlY2VpdmVyIiwiZXhwZWN0ZWQiOiJ0aGlzLmFwcC5hZGRyZXNzIn0KCWFzc2VydAoKCS8vIHZlcmlmeSBhbW91bnQKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCglleHRyYWN0IDAgOAoJYnRvaQoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6ImFtb3VudCIsImV4cGVjdGVkIjoidGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkVmFsaWRhdG9yTWJyIn0KCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxMAoJLy8gYXNzZXJ0KG1iclBheW1lbnQuZmVlID4gMTAgKiAxMDAwMDAwLCAnZmVlIG11c3QgYmUgMTAgQUxHTyBvciBtb3JlIHRvIHByZXZlbnQgc3BhbW1pbmcgb2YgdmFsaWRhdG9ycycpCglmcmFtZV9kaWcgLTEgLy8gbWJyUGF5bWVudDogUGF5VHhuCglndHhucyBGZWUKCWludCAxMDAwMDAwMAoJPgoKCS8vIGZlZSBtdXN0IGJlIDEwIEFMR08gb3IgbW9yZSB0byBwcmV2ZW50IHNwYW1taW5nIG9mIHZhbGlkYXRvcnMKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxMwoJLy8gdmFsaWRhdG9ySWQgPSB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgKyAxCglieXRlIDB4NmU3NTZkNTYgLy8gIm51bVYiCglhcHBfZ2xvYmFsX2dldAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzE0CgkvLyB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgPSB2YWxpZGF0b3JJZAoJYnl0ZSAweDZlNzU2ZDU2IC8vICJudW1WIgoJZnJhbWVfZGlnIDAgLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMTYKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkuY3JlYXRlKCkKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJaW50IDEwOTIKCWJveF9jcmVhdGUKCXBvcAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxNwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcgPSBjb25maWcKCWludCAwCglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMTgKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLmlkID0gdmFsaWRhdG9ySWQKCWludCAwCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gKmlmNV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMyMQoJLy8gY29uZmlnLm5mZEZvckluZm8gIT09IDAKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA3MiA4CglidG9pCglpbnQgMAoJIT0KCWJ6ICppZjVfZW5kCgoJLy8gKmlmNV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMjMKCS8vIGFzc2VydCh0aGlzLmlzTkZEQXBwSURWYWxpZChjb25maWcubmZkRm9ySW5mbyksICdwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZCcpCglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgNzIgOAoJYnRvaQoJY2FsbHN1YiBpc05GREFwcElEVmFsaWQKCgkvLyBwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzI1CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgdGhpcy50eG4uc2VuZGVyID09PSAoQXBwSUQuZnJvbVVpbnQ2NChjb25maWcubmZkRm9ySW5mbykuZ2xvYmFsU3RhdGUoJ2kub3duZXIuYScpIGFzIEFkZHJlc3MpLAoJLy8gICAgICAgICAgICAgICAgICdJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXInLAoJLy8gICAgICAgICAgICAgKQoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIC0zIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDcyIDgKCWJ0b2kKCWJ5dGUgMHg2OTJlNmY3NzZlNjU3MjJlNjEgLy8gImkub3duZXIuYSIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KGNvbmZpZy5uZmRGb3JJbmZvKS5nbG9iYWxTdGF0ZSgnaS5vd25lci5hJykKCWFzc2VydAoJPT0KCgkvLyBJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXIKCWFzc2VydAoKKmlmNV9lbmQ6CgkvLyAqaWY2X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzMxCgkvLyBjb25maWcuZW50cnlHYXRpbmdUeXBlID09PSBHQVRJTkdfVFlQRV9DUkVBVEVEX0JZX05GRF9BRERSRVNTRVMgfHwKCS8vICAgICAgICAgICAgIGNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX1NFR01FTlRfT0ZfTkZECglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgODAgMQoJYnRvaQoJaW50IDMKCT09CglkdXAKCWJueiAqc2tpcF9vcjAKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4MCAxCglidG9pCglpbnQgNAoJPT0KCXx8Cgoqc2tpcF9vcjA6CglieiAqaWY2X2VuZAoKCS8vICppZjZfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzM1CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5pc05GREFwcElEVmFsaWQoY29uZmlnLmVudHJ5R2F0aW5nQXNzZXRzWzBdKSwKCS8vICAgICAgICAgICAgICAgICAncHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZEJywKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAxMTMgOAoJYnRvaQoJY2FsbHN1YiBpc05GREFwcElEVmFsaWQKCgkvLyBwcm92aWRlZCBORkQgQXBwIGlkIGZvciBnYXRpbmcgbXVzdCBiZSB2YWxpZCBORkQKCWFzc2VydAoKKmlmNl9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNDAKCS8vIHRoaXMucmV0aU9QX2FkZGVkVmFsaWRhdG9yLmxvZyh7IGlkOiB2YWxpZGF0b3JJZCwgb3duZXI6IGNvbmZpZy5vd25lciwgbWFuYWdlcjogY29uZmlnLm1hbmFnZXIgfSkKCWJ5dGUgMHhhOGRkMjFjYiAvLyByZXRpT1BfYWRkZWRWYWxpZGF0b3IodWludDY0LGFkZHJlc3MsYWRkcmVzcykKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4IDMyCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA0MCAzMgoJY29uY2F0Cgljb25jYXQKCWxvZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM0MQoJLy8gcmV0dXJuIHZhbGlkYXRvcklkCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvck1hbmFnZXIodWludDY0LGFkZHJlc3Mpdm9pZAoqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvck1hbmFnZXI6CgkvLyBtYW5hZ2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKG1hbmFnZXIpIGZvciBjaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyKHVpbnQ2NCxhZGRyZXNzKXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yTWFuYWdlcgoJaW50IDEKCXJldHVybgoKLy8gY2hhbmdlVmFsaWRhdG9yTWFuYWdlcih2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBtYW5hZ2VyOiBBZGRyZXNzKTogdm9pZAovLwovLyBDaGFuZ2VzIHRoZSBWYWxpZGF0b3IgbWFuYWdlciBmb3IgYSBzcGVjaWZpYyBWYWxpZGF0b3IgaWQuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gY2hhbmdlIHRoZSBtYW5hZ2VyIGZvci4KLy8gQHBhcmFtIHtBZGRyZXNzfSBtYW5hZ2VyIC0gVGhlIG5ldyBtYW5hZ2VyIGFkZHJlc3MuCmNoYW5nZVZhbGlkYXRvck1hbmFnZXI6Cglwcm90byAyIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNTIKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM1MwoJLy8gYXNzZXJ0KG1hbmFnZXIgIT09IGdsb2JhbHMuemVyb0FkZHJlc3MsICduZWVkcyB0byBhdCBsZWFzdCBiZSB2YWxpZCBhZGRyZXNzJykKCWZyYW1lX2RpZyAtMiAvLyBtYW5hZ2VyOiBBZGRyZXNzCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CgoJLy8gbmVlZHMgdG8gYXQgbGVhc3QgYmUgdmFsaWQgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzU0CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5tYW5hZ2VyID0gbWFuYWdlcgoJaW50IDQwCglmcmFtZV9kaWcgLTIgLy8gbWFuYWdlcjogQWRkcmVzcwoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCXJldHN1YgoKLy8gY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyh1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkCiphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbzoKCS8vIHN1bnNldHRpbmdUbzogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglidG9pCgoJLy8gc3Vuc2V0dGluZ09uOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbwoJaW50IDEKCXJldHVybgoKLy8gY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBzdW5zZXR0aW5nT246IHVpbnQ2NCwgc3Vuc2V0dGluZ1RvOiBWYWxpZGF0b3JJZFR5cGUpOiB2b2lkCi8vCi8vIFVwZGF0ZXMgdGhlIHN1bnNldCBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiB2YWxpZGF0b3IuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gdXBkYXRlLgovLyBAcGFyYW0ge3VpbnQ2NH0gc3Vuc2V0dGluZ09uIC0gVGhlIG5ldyBzdW5zZXQgdGltZXN0YW1wLgovLyBAcGFyYW0ge3VpbnQ2NH0gc3Vuc2V0dGluZ1RvIC0gVGhlIG5ldyBzdW5zZXQgdG8gdmFsaWRhdG9yIGlkLgpjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvOgoJcHJvdG8gMyAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzY2CgkvLyB0aGlzLmNhbGxlck11c3RCZU93bmVyKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgY2FsbGVyTXVzdEJlT3duZXIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNjcKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnN1bnNldHRpbmdPbiA9IHN1bnNldHRpbmdPbgoJaW50IDIyNgoJZnJhbWVfZGlnIC0yIC8vIHN1bnNldHRpbmdPbjogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM2OAoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcuc3Vuc2V0dGluZ1RvID0gc3Vuc2V0dGluZ1RvCglpbnQgMjM0CglmcmFtZV9kaWcgLTMgLy8gc3Vuc2V0dGluZ1RvOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvck5GRCh1aW50NjQsdWludDY0LHN0cmluZyl2b2lkCiphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yTkZEOgoJLy8gbmZkTmFtZTogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglleHRyYWN0IDIgMAoKCS8vIG5mZEFwcElEOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JORkQodWludDY0LHVpbnQ2NCxzdHJpbmcpdm9pZAoJY2FsbHN1YiBjaGFuZ2VWYWxpZGF0b3JORkQKCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvck5GRCh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBuZmRBcHBJRDogdWludDY0LCBuZmROYW1lOiBzdHJpbmcpOiB2b2lkCi8vCi8vIENoYW5nZXMgdGhlIE5GRCBmb3IgYSB2YWxpZGF0b3IgaW4gdGhlIHZhbGlkYXRvckxpc3QgY29udHJhY3QuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gdXBkYXRlLgovLyBAcGFyYW0ge3VpbnQ2NH0gbmZkQXBwSUQgLSBUaGUgYXBwbGljYXRpb24gaWQgb2YgdGhlIE5GRCB0byBhc3NpZ24gdG8gdGhlIHZhbGlkYXRvci4KLy8gQHBhcmFtIHtzdHJpbmd9IG5mZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgTkZEICh3aGljaCBtdXN0IG1hdGNoKQpjaGFuZ2VWYWxpZGF0b3JORkQ6Cglwcm90byAzIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozODAKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM4MgoJLy8gYXNzZXJ0KHRoaXMuaXNORkRBcHBJRFZhbGlkKG5mZEFwcElEKSwgJ3Byb3ZpZGVkIE5GRCBtdXN0IGJlIHZhbGlkJykKCWZyYW1lX2RpZyAtMiAvLyBuZmRBcHBJRDogdWludDY0CgljYWxsc3ViIGlzTkZEQXBwSURWYWxpZAoKCS8vIHByb3ZpZGVkIE5GRCBtdXN0IGJlIHZhbGlkCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozODQKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHRoaXMudHhuLnNlbmRlciA9PT0gKEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzKSwKCS8vICAgICAgICAgICAgICdJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXInLAoJLy8gICAgICAgICApCgl0eG4gU2VuZGVyCglmcmFtZV9kaWcgLTIgLy8gbmZkQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKQoJYXNzZXJ0Cgk9PQoKCS8vIElmIHNwZWNpZnlpbmcgTkZELCBhY2NvdW50IGFkZGluZyB2YWxpZGF0b3IgbXVzdCBiZSBvd25lcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mzg4CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5uZmRGb3JJbmZvID0gbmZkQXBwSUQKCWludCA3MgoJZnJhbWVfZGlnIC0yIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHVpbnQ2NCxhZGRyZXNzKXZvaWQKKmFiaV9yb3V0ZV9jaGFuZ2VWYWxpZGF0b3JDb21taXNzaW9uQWRkcmVzczoKCS8vIGNvbW1pc3Npb25BZGRyZXNzOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKGNvbW1pc3Npb25BZGRyZXNzKSBmb3IgY2hhbmdlVmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MgbXVzdCBiZSBhIGFkZHJlc3MKCWFzc2VydAoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHVpbnQ2NCxhZGRyZXNzKXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MKCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIGNvbW1pc3Npb25BZGRyZXNzOiBBZGRyZXNzKTogdm9pZAovLwovLyBDaGFuZ2UgdGhlIGNvbW1pc3Npb24gYWRkcmVzcyB0aGF0IHZhbGlkYXRvciByZXdhcmRzIGFyZSBzZW50IHRvLgovLyBbIE9OTFkgT1dORVIgQ0FOIENIQU5HRSBdCmNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzOgoJcHJvdG8gMiAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mzk2CgkvLyB0aGlzLmNhbGxlck11c3RCZU93bmVyKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgY2FsbGVyTXVzdEJlT3duZXIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozOTcKCS8vIGFzc2VydChjb21taXNzaW9uQWRkcmVzcyAhPT0gQWRkcmVzcy56ZXJvQWRkcmVzcykKCWZyYW1lX2RpZyAtMiAvLyBjb21taXNzaW9uQWRkcmVzczogQWRkcmVzcwoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mzk4CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy52YWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyA9IGNvbW1pc3Npb25BZGRyZXNzCglpbnQgMTc3CglmcmFtZV9kaWcgLTIgLy8gY29tbWlzc2lvbkFkZHJlc3M6IEFkZHJlc3MKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8odWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQpdm9pZAoqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvclJld2FyZEluZm86CgkvLyBSZXdhcmRQZXJQYXlvdXQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgoJYnRvaQoKCS8vIEdhdGluZ0Fzc2V0TWluQmFsYW5jZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyA1CglidG9pCgoJLy8gRW50cnlHYXRpbmdBc3NldHM6IHVpbnQ2NFs0XQoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAoJZHVwCglsZW4KCWludCAzMgoJPT0KCgkvLyBhcmd1bWVudCAyIChFbnRyeUdhdGluZ0Fzc2V0cykgZm9yIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8gbXVzdCBiZSBhIHVpbnQ2NFs0XQoJYXNzZXJ0CgoJLy8gRW50cnlHYXRpbmdBZGRyZXNzOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDMgKEVudHJ5R2F0aW5nQWRkcmVzcykgZm9yIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8gbXVzdCBiZSBhIGFkZHJlc3MKCWFzc2VydAoKCS8vIEVudHJ5R2F0aW5nVHlwZTogdWludDgKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMQoJPT0KCgkvLyBhcmd1bWVudCA0IChFbnRyeUdhdGluZ1R5cGUpIGZvciBjaGFuZ2VWYWxpZGF0b3JSZXdhcmRJbmZvIG11c3QgYmUgYSB1aW50OAoJYXNzZXJ0CglidG9pCgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mbyh1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCl2b2lkCgljYWxsc3ViIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8KCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8odmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgRW50cnlHYXRpbmdUeXBlOiB1aW50OCwgRW50cnlHYXRpbmdBZGRyZXNzOiBBZGRyZXNzLCBFbnRyeUdhdGluZ0Fzc2V0czogU3RhdGljQXJyYXk8dWludDY0LCA0PiwgR2F0aW5nQXNzZXRNaW5CYWxhbmNlOiB1aW50NjQsIFJld2FyZFBlclBheW91dDogdWludDY0KTogdm9pZAovLwovLyBBbGxvdyB0aGUgYWRkaXRpb25hbCByZXdhcmRzIChnYXRpbmcgZW50cnksIGFkZGl0aW9uYWwgdG9rZW4gcmV3YXJkcykgaW5mb3JtYXRpb24gYmUgY2hhbmdlZCBhdCB3aWxsLgovLyBbIE9OTFkgT1dORVIgQ0FOIENIQU5HRSBdCmNoYW5nZVZhbGlkYXRvclJld2FyZEluZm86Cglwcm90byA2IDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MTMKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQxNQoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgRW50cnlHYXRpbmdUeXBlID49IEdBVElOR19UWVBFX05PTkUgJiYgRW50cnlHYXRpbmdUeXBlIDwgR0FUSU5HX1RZUEVfQ09OU1RfTUFYLAoJLy8gICAgICAgICAgICAgJ2ludmFsaWQgRW50cnkgZ2F0aW5nIHR5cGUnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDAKCT49CglkdXAKCWJ6ICpza2lwX2FuZDEKCWZyYW1lX2RpZyAtMiAvLyBFbnRyeUdhdGluZ1R5cGU6IHVpbnQ4CglpbnQgNAoJPAoJJiYKCipza2lwX2FuZDE6CgkvLyBpbnZhbGlkIEVudHJ5IGdhdGluZyB0eXBlCglhc3NlcnQKCgkvLyAqaWY3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDE5CgkvLyBFbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX0FTU0VUU19DUkVBVEVEX0JZCglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDEKCT09CglieiAqaWY3X2VuZAoKCS8vICppZjdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDIwCgkvLyBhc3NlcnQoRW50cnlHYXRpbmdBZGRyZXNzICE9PSBnbG9iYWxzLnplcm9BZGRyZXNzKQoJZnJhbWVfZGlnIC0zIC8vIEVudHJ5R2F0aW5nQWRkcmVzczogQWRkcmVzcwoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoqaWY3X2VuZDoKCS8vICppZjhfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MjMKCS8vIEVudHJ5R2F0aW5nVHlwZSA9PT0gR0FUSU5HX1RZUEVfQ1JFQVRFRF9CWV9ORkRfQUREUkVTU0VTIHx8CgkvLyAgICAgICAgICAgICBFbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX1NFR01FTlRfT0ZfTkZECglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDMKCT09CglkdXAKCWJueiAqc2tpcF9vcjEKCWZyYW1lX2RpZyAtMiAvLyBFbnRyeUdhdGluZ1R5cGU6IHVpbnQ4CglpbnQgNAoJPT0KCXx8Cgoqc2tpcF9vcjE6CglieiAqaWY4X2VuZAoKCS8vICppZjhfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDI2CgkvLyBhc3NlcnQodGhpcy5pc05GREFwcElEVmFsaWQoRW50cnlHYXRpbmdBc3NldHNbMF0pLCAncHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZEJykKCWZyYW1lX2RpZyAtNCAvLyBFbnRyeUdhdGluZ0Fzc2V0czogU3RhdGljQXJyYXk8dWludDY0LCA0PgoJZXh0cmFjdCAwIDgKCWJ0b2kKCWNhbGxzdWIgaXNORkRBcHBJRFZhbGlkCgoJLy8gcHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZECglhc3NlcnQKCippZjhfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDI4CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPSBFbnRyeUdhdGluZ1R5cGUKCWludCA4MAoJZnJhbWVfZGlnIC0yIC8vIEVudHJ5R2F0aW5nVHlwZTogdWludDgKCWl0b2IKCWV4dHJhY3QgNyAxCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQyOQoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcuZW50cnlHYXRpbmdBZGRyZXNzID0gRW50cnlHYXRpbmdBZGRyZXNzCglpbnQgODEKCWZyYW1lX2RpZyAtMyAvLyBFbnRyeUdhdGluZ0FkZHJlc3M6IEFkZHJlc3MKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDMwCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0cyA9IEVudHJ5R2F0aW5nQXNzZXRzCglpbnQgMTEzCglmcmFtZV9kaWcgLTQgLy8gRW50cnlHYXRpbmdBc3NldHM6IFN0YXRpY0FycmF5PHVpbnQ2NCwgND4KCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDMxCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5nYXRpbmdBc3NldE1pbkJhbGFuY2UgPSBHYXRpbmdBc3NldE1pbkJhbGFuY2UKCWludCAxNDUKCWZyYW1lX2RpZyAtNSAvLyBHYXRpbmdBc3NldE1pbkJhbGFuY2U6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MzIKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnJld2FyZFBlclBheW91dCA9IFJld2FyZFBlclBheW91dAoJaW50IDE2MQoJZnJhbWVfZGlnIC02IC8vIFJld2FyZFBlclBheW91dDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyBhZGRQb29sKHBheSx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCkKKmFiaV9yb3V0ZV9hZGRQb29sOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBub2RlTnVtOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gbWJyUGF5bWVudDogcGF5Cgl0eG4gR3JvdXBJbmRleAoJaW50IDEKCS0KCWR1cAoJZ3R4bnMgVHlwZUVudW0KCWludCBwYXkKCT09CgoJLy8gYXJndW1lbnQgMiAobWJyUGF5bWVudCkgZm9yIGFkZFBvb2wgbXVzdCBiZSBhIHBheSB0cmFuc2FjdGlvbgoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBhZGRQb29sKHBheSx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCkKCWNhbGxzdWIgYWRkUG9vbAoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFBvb2wobWJyUGF5bWVudDogUGF5VHhuLCB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBub2RlTnVtOiB1aW50NjQpOiBWYWxpZGF0b3JQb29sS2V5Ci8vCi8vIEFkZHMgYSBuZXcgcG9vbCB0byBhIHZhbGlkYXRvcidzIHBvb2wgc2V0LCByZXR1cm5pbmcgdGhlICdrZXknIHRvIHJlZmVyZW5jZSB0aGUgcG9vbCBpbiB0aGUgZnV0dXJlIGZvciBzdGFraW5nLCBldGMuCi8vIFRoZSBjYWxsZXIgbXVzdCBwYXkgdGhlIGNvc3Qgb2YgdGhlIHZhbGlkYXRvcnMgTUJSIGluY3JlYXNlIGFzIHdlbGwgYXMgdGhlIE1CUiB0aGF0IHdpbGwgYmUgbmVlZGVkIGZvciB0aGUgcG9vbCBpdHNlbGYuCi8vCi8vIFsgT05MWSBPV05FUiBPUiBNQU5BR0VSIENBTiBjYWxsIF0KLy8gQHBhcmFtIHtQYXlUeG59IG1iclBheW1lbnQgcGF5bWVudCBmcm9tIGNhbGxlciB3aGljaCBjb3ZlcnMgbWJyIGluY3JlYXNlIG9mIGFkZGluZyBhIG5ldyBwb29sCi8vIEBwYXJhbSB7dWludDY0fSB2YWxpZGF0b3JJZCBpcyBpZCBvZiB2YWxpZGF0b3IgdG8gcG9vbCB0byAobXVzdCBiZSBvd25lciBvciBtYW5hZ2VyKQovLyBAcGFyYW0ge3VpbnQ2NH0gbm9kZU51bSBpcyBub2RlIG51bWJlciB0byBhZGQgdG8KLy8gQHJldHVybnMge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2wga2V5IHRvIGNyZWF0ZWQgcG9vbAphZGRQb29sOgoJcHJvdG8gMyAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ0NwoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lck9yTWFuYWdlcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyT3JNYW5hZ2VyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDUwCgkvLyB2ZXJpZnlQYXlUeG4obWJyUGF5bWVudCwgeyByZWNlaXZlcjogdGhpcy5hcHAuYWRkcmVzcywgYW1vdW50OiB0aGlzLmdldE1ickFtb3VudHMoKS5hZGRQb29sTWJyIH0pCgkvLyB2ZXJpZnkgcmVjZWl2ZXIKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIFJlY2VpdmVyCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6InJlY2VpdmVyIiwiZXhwZWN0ZWQiOiJ0aGlzLmFwcC5hZGRyZXNzIn0KCWFzc2VydAoKCS8vIHZlcmlmeSBhbW91bnQKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCglleHRyYWN0IDggOAoJYnRvaQoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6ImFtb3VudCIsImV4cGVjdGVkIjoidGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkUG9vbE1iciJ9Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NTIKCS8vIGFzc2VydCh0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLmV4aXN0cywgInNwZWNpZmllZCB2YWxpZGF0b3IgaWQgaXNuJ3QgdmFsaWQiKQoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJYm94X2xlbgoJc3dhcAoJcG9wCgoJLy8gc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBpc24ndCB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDU0CgkvLyBudW1Qb29sczogdWludDY0ID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyBhcyB1aW50NjQKCWludCAyNDIKCWludCAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIG51bVBvb2xzOiB1aW50NjQKCgkvLyAqaWY5X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDU1CgkvLyAobnVtUG9vbHMgYXMgdWludDY0KSA+PSBNQVhfUE9PTFMKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWludCAyNAoJPj0KCWJ6ICppZjlfZW5kCgoJLy8gKmlmOV9jb25zZXF1ZW50CgkvLyBhbHJlYWR5IGF0IG1heCBwb29sIHNpemUKCWVycgoKKmlmOV9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NTgKCS8vIG51bVBvb2xzICs9IDEKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ2MQoJLy8gc2VuZEFwcENhbGwoewoJLy8gICAgICAgICAgICAgb25Db21wbGV0aW9uOiBPbkNvbXBsZXRpb24uTm9PcCwKCS8vICAgICAgICAgICAgIGFwcHJvdmFsUHJvZ3JhbTogWwoJLy8gICAgICAgICAgICAgICAgIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uZXh0cmFjdCgwLCA0MDk2KSwKCS8vICAgICAgICAgICAgICAgICB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLmV4dHJhY3QoNDA5NiwgdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5zaXplIC0gNDA5NiksCgkvLyAgICAgICAgICAgICBdLAoJLy8gICAgICAgICAgICAgY2xlYXJTdGF0ZVByb2dyYW06IFN0YWtpbmdQb29sLmNsZWFyUHJvZ3JhbSgpLAoJLy8gICAgICAgICAgICAgZ2xvYmFsTnVtVWludDogU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1VaW50LAoJLy8gICAgICAgICAgICAgZ2xvYmFsTnVtQnl0ZVNsaWNlOiBTdGFraW5nUG9vbC5zY2hlbWEuZ2xvYmFsLm51bUJ5dGVTbGljZSwKCS8vICAgICAgICAgICAgIGV4dHJhUHJvZ3JhbVBhZ2VzOiAzLAoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25BcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gY3JlYXRpbmdDb250cmFjdElELCB2YWxpZGF0b3JJZCwgcG9vbElkLCBtaW5FbnRyeVN0YWtlCgkvLyAgICAgICAgICAgICAgICAgbWV0aG9kKCdjcmVhdGVBcHBsaWNhdGlvbih1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCcpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodGhpcy5hcHAuaWQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodmFsaWRhdG9ySWQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IobnVtUG9vbHMgYXMgdWludDY0KSwKCS8vICAgICAgICAgICAgICAgICBpdG9iKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1pbkVudHJ5U3Rha2UpLAoJLy8gICAgICAgICAgICAgXSwKCS8vICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDYyCgkvLyBvbkNvbXBsZXRpb246IE9uQ29tcGxldGlvbi5Ob09wCglpbnQgMCAvLyBOb09wCglpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ2MwoJLy8gYXBwcm92YWxQcm9ncmFtOiBbCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5leHRyYWN0KDAsIDQwOTYpLAoJLy8gICAgICAgICAgICAgICAgIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uZXh0cmFjdCg0MDk2LCB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLnNpemUgLSA0MDk2KSwKCS8vICAgICAgICAgICAgIF0KCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWludCAwCglpbnQgNDA5NgoJYm94X2V4dHJhY3QKCWl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWludCA0MDk2CglieXRlIDB4NzA2ZjZmNmM1NDY1NmQ3MDZjNjE3NDY1NDE3MDcwNzI2Zjc2NjE2YzQyNzk3NDY1NzMgLy8gInBvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMiCglib3hfbGVuCgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLnNpemUKCWFzc2VydAoJaW50IDQwOTYKCS0KCWJveF9leHRyYWN0CglpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDY3CgkvLyBjbGVhclN0YXRlUHJvZ3JhbTogU3Rha2luZ1Bvb2wuY2xlYXJQcm9ncmFtKCkKCWJ5dGUgYjY0IEN3PT0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NjgKCS8vIGdsb2JhbE51bVVpbnQ6IFN0YWtpbmdQb29sLnNjaGVtYS5nbG9iYWwubnVtVWludAoJaW50IDExCglpdHhuX2ZpZWxkIEdsb2JhbE51bVVpbnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NjkKCS8vIGdsb2JhbE51bUJ5dGVTbGljZTogU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1CeXRlU2xpY2UKCWludCAzCglpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ3MAoJLy8gZXh0cmFQcm9ncmFtUGFnZXM6IDMKCWludCAzCglpdHhuX2ZpZWxkIEV4dHJhUHJvZ3JhbVBhZ2VzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDcxCgkvLyBhcHBsaWNhdGlvbkFyZ3M6IFsKCS8vICAgICAgICAgICAgICAgICAvLyBjcmVhdGluZ0NvbnRyYWN0SUQsIHZhbGlkYXRvcklkLCBwb29sSWQsIG1pbkVudHJ5U3Rha2UKCS8vICAgICAgICAgICAgICAgICBtZXRob2QoJ2NyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkJyksCgkvLyAgICAgICAgICAgICAgICAgaXRvYih0aGlzLmFwcC5pZCksCgkvLyAgICAgICAgICAgICAgICAgaXRvYih2YWxpZGF0b3JJZCksCgkvLyAgICAgICAgICAgICAgICAgaXRvYihudW1Qb29scyBhcyB1aW50NjQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWluRW50cnlTdGFrZSksCgkvLyAgICAgICAgICAgICBdCgltZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCXR4bmEgQXBwbGljYXRpb25zIDAKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglpbnQgMjA5CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ4MQoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyA9IG51bVBvb2xzIGFzIHVpbnQxNgoJaW50IDI0MgoJZnJhbWVfZGlnIDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoJaXRvYgoJZXh0cmFjdCA2IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDg0CgkvLyBwb29sQXBwSWQgPSB0aGlzLml0eG4uY3JlYXRlZEFwcGxpY2F0aW9uSUQuaWQKCWl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKCWZyYW1lX2J1cnkgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ4NQoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1tudW1Qb29scyAtIDFdLnBvb2xBcHBJZCA9IHBvb2xBcHBJZAoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgMCAvLyBudW1Qb29sczogdWludDY0CglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0ODYKCS8vIHRoaXMuYWRkUG9vbFRvTm9kZSh2YWxpZGF0b3JJZCwgcG9vbEFwcElkLCBub2RlTnVtKQoJZnJhbWVfZGlnIC0zIC8vIG5vZGVOdW06IHVpbnQ2NAoJZnJhbWVfZGlnIDEgLy8gcG9vbEFwcElkOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGFkZFBvb2xUb05vZGUKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0ODgKCS8vIHRoaXMucmV0aU9QX3ZhbGlkYXRvckFkZGVkUG9vbC5sb2coewoJLy8gICAgICAgICAgICAgaWQ6IHZhbGlkYXRvcklkLAoJLy8gICAgICAgICAgICAgbnVtOiBudW1Qb29scyBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKSwKCS8vICAgICAgICAgfSkKCWJ5dGUgMHhmYmNjMGY2YiAvLyByZXRpT1BfdmFsaWRhdG9yQWRkZWRQb29sKHVpbnQ2NCx1aW50MTYsdWludDY0KQoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWl0b2IKCWR1cAoJYml0bGVuCglpbnQgMTYKCTw9CgoJLy8gbnVtUG9vbHMgYXMgdWludDE2IG92ZXJmbG93ZWQgMTYgYml0cwoJYXNzZXJ0CglleHRyYWN0IDYgMgoJY29uY2F0CglmcmFtZV9kaWcgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cgljb25jYXQKCWxvZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ5NAoJLy8gcmV0dXJuIHsgaWQ6IHZhbGlkYXRvcklkLCBwb29sSWQ6IG51bVBvb2xzIGFzIHVpbnQ2NCwgcG9vbEFwcElkOiB0aGlzLml0eG4hLmNyZWF0ZWRBcHBsaWNhdGlvbklELmlkIH0KCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCglmcmFtZV9kaWcgMCAvLyBudW1Qb29sczogdWludDY0CglpdG9iCgljb25jYXQKCWl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKCWl0b2IKCWNvbmNhdAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDEKCXJldHN1YgoKLy8gYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KQoqYWJpX3JvdXRlX2FkZFN0YWtlOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gc3Rha2VkQW1vdW50UGF5bWVudDogcGF5Cgl0eG4gR3JvdXBJbmRleAoJaW50IDEKCS0KCWR1cAoJZ3R4bnMgVHlwZUVudW0KCWludCBwYXkKCT09CgoJLy8gYXJndW1lbnQgMiAoc3Rha2VkQW1vdW50UGF5bWVudCkgZm9yIGFkZFN0YWtlIG11c3QgYmUgYSBwYXkgdHJhbnNhY3Rpb24KCWFzc2VydAoKCS8vIGV4ZWN1dGUgYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBhZGRTdGFrZQoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFN0YWtlKHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4biwgdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgdmFsdWVUb1ZlcmlmeTogdWludDY0KTogVmFsaWRhdG9yUG9vbEtleQovLwovLyBBZGRzIHN0YWtlIHRvIGEgdmFsaWRhdG9yIHBvb2wuCi8vCi8vIEBwYXJhbSB7UGF5VHhufSBzdGFrZWRBbW91bnRQYXltZW50IC0gcGF5bWVudCBjb21pbmcgZnJvbSBzdGFrZXIgdG8gcGxhY2UgaW50byBhIHBvb2wKLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWx1ZVRvVmVyaWZ5IC0gb25seSBpZiB2YWxpZGF0b3IgaGFzIGdhdGluZyB0byBlbnRlciAtIHRoaXMgaXMgYXNzZXQgaWQgb3IgbmZkIGlkIHRoYXQgY29ycmVzcG9uZHMgdG8gZ2F0aW5nLgovLyBUeG4gc2VuZGVyIGlzIGZhY3RvcmVkIGluIGFzIHdlbGwgaWYgdGhhdCBpcyBwYXJ0IG9mIGdhdGluZy4KLy8gKiBAcmV0dXJucyB7VmFsaWRhdG9yUG9vbEtleX0gLSBUaGUga2V5IG9mIHRoZSB2YWxpZGF0b3IgcG9vbC4KYWRkU3Rha2U6Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA1CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTA3CgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS5leGlzdHMsICJzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGlzbid0IHZhbGlkIikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoKCS8vIHNwZWNpZmllZCB2YWxpZGF0b3IgaWQgaXNuJ3QgdmFsaWQKCWFzc2VydAoKCS8vICppZjEwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTEwCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5zdW5zZXR0aW5nT24gPiAwCglpbnQgMjI2CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWludCAwCgk+CglieiAqaWYxMF9lbmQKCgkvLyAqaWYxMF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MTIKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5zdW5zZXR0aW5nT24gPiBnbG9iYWxzLmxhdGVzdFRpbWVzdGFtcCwKCS8vICAgICAgICAgICAgICAgICAiY2FuJ3Qgc3Rha2Ugd2l0aCBhIHZhbGlkYXRvciB0aGF0IGlzIHBhc3QgaXRzIHN1bnNldHRpbmcgdGltZSIsCgkvLyAgICAgICAgICAgICApCglpbnQgMjI2CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKCT4KCgkvLyBjYW4ndCBzdGFrZSB3aXRoIGEgdmFsaWRhdG9yIHRoYXQgaXMgcGFzdCBpdHMgc3Vuc2V0dGluZyB0aW1lCglhc3NlcnQKCippZjEwX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUxOAoJLy8gc3Rha2VyID0gdGhpcy50eG4uc2VuZGVyCgl0eG4gU2VuZGVyCglmcmFtZV9idXJ5IDAgLy8gc3Rha2VyOiBhZGRyZXNzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTIyCgkvLyB2ZXJpZnlQYXlUeG4oc3Rha2VkQW1vdW50UGF5bWVudCwgewoJLy8gICAgICAgICAgICAgc2VuZGVyOiBzdGFrZXIsCgkvLyAgICAgICAgICAgICByZWNlaXZlcjogdGhpcy5hcHAuYWRkcmVzcywKCS8vICAgICAgICAgfSkKCS8vIHZlcmlmeSBzZW5kZXIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIFNlbmRlcgoJZnJhbWVfZGlnIDAgLy8gc3Rha2VyOiBhZGRyZXNzCgk9PQoKCS8vIHRyYW5zYWN0aW9uIHZlcmlmaWNhdGlvbiBmYWlsZWQ6IHsidHhuIjoic3Rha2VkQW1vdW50UGF5bWVudCIsImZpZWxkIjoic2VuZGVyIiwiZXhwZWN0ZWQiOiJzdGFrZXIifQoJYXNzZXJ0CgoJLy8gdmVyaWZ5IHJlY2VpdmVyCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBSZWNlaXZlcgoJZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCT09CgoJLy8gdHJhbnNhY3Rpb24gdmVyaWZpY2F0aW9uIGZhaWxlZDogeyJ0eG4iOiJzdGFrZWRBbW91bnRQYXltZW50IiwiZmllbGQiOiJyZWNlaXZlciIsImV4cGVjdGVkIjoidGhpcy5hcHAuYWRkcmVzcyJ9Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzAKCS8vIHRoaXMuZG9lc1N0YWtlck1lZXRHYXRpbmcodmFsaWRhdG9ySWQsIHZhbHVlVG9WZXJpZnkpCglmcmFtZV9kaWcgLTMgLy8gdmFsdWVUb1ZlcmlmeTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBkb2VzU3Rha2VyTWVldEdhdGluZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUzMgoJLy8gcmVhbEFtb3VudCA9IHN0YWtlZEFtb3VudFBheW1lbnQuYW1vdW50CglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBBbW91bnQKCWZyYW1lX2J1cnkgMSAvLyByZWFsQW1vdW50OiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzMKCS8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NCA9IDAKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gbWJyQW10TGVmdEJlaGluZDogdWludDY0CgoJLy8gKmlmMTFfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzUKCS8vIHRoaXMuZG9lc1N0YWtlck5lZWRUb1BheU1CUihzdGFrZXIpCglmcmFtZV9kaWcgMCAvLyBzdGFrZXI6IGFkZHJlc3MKCWNhbGxzdWIgZG9lc1N0YWtlck5lZWRUb1BheU1CUgoJYnogKmlmMTFfZW5kCgoJLy8gKmlmMTFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTM4CgkvLyBtYnJBbXRMZWZ0QmVoaW5kID0gdGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkU3Rha2VyTWJyCgljYWxsc3ViIGdldE1ickFtb3VudHMKCWV4dHJhY3QgMjQgOAoJYnRvaQoJZnJhbWVfYnVyeSAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUzOQoJLy8gcmVhbEFtb3VudCAtPSBtYnJBbXRMZWZ0QmVoaW5kCglmcmFtZV9kaWcgMSAvLyByZWFsQW1vdW50OiB1aW50NjQKCWZyYW1lX2RpZyAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoJLQoJZnJhbWVfYnVyeSAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU0MAoJLy8gdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikuY3JlYXRlKCkKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAwIC8vIHN0YWtlcjogYWRkcmVzcwoJY29uY2F0CglpbnQgMTQ0Cglib3hfY3JlYXRlCglwb3AKCippZjExX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU0NAoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS50b3RhbEFsZ29TdGFrZWQgKyByZWFsQW1vdW50IDwgdGhpcy5tYXhBbGxvd2VkU3Rha2UoKSwKCS8vICAgICAgICAgICAgICd0b3RhbCBzdGFrZWQgZm9yIGFsbCBvZiBhIHZhbGlkYXRvcnMgcG9vbHMgbWF5IG5vdCBleGNlZWQgaGFyZCBjYXAnLAoJLy8gICAgICAgICApCglpbnQgMjUyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoJKwoJY2FsbHN1YiBtYXhBbGxvd2VkU3Rha2UKCTwKCgkvLyB0b3RhbCBzdGFrZWQgZm9yIGFsbCBvZiBhIHZhbGlkYXRvcnMgcG9vbHMgbWF5IG5vdCBleGNlZWQgaGFyZCBjYXAKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU1MQoJLy8gZmluZFJldCA9IHRoaXMuZmluZFBvb2xGb3JTdGFrZXIodmFsaWRhdG9ySWQsIHN0YWtlciwgcmVhbEFtb3VudCkKCWZyYW1lX2RpZyAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoJZnJhbWVfZGlnIDAgLy8gc3Rha2VyOiBhZGRyZXNzCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBmaW5kUG9vbEZvclN0YWtlcgoJZnJhbWVfYnVyeSAzIC8vIGZpbmRSZXQ6ICgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NTIKCS8vIHBvb2xLZXkgPSBmaW5kUmV0WzBdCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NTMKCS8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IgPSBmaW5kUmV0WzFdCglmcmFtZV9kaWcgMyAvLyBmaW5kUmV0OiAoKHVpbnQ2NCx1aW50NjQsdWludDY0KSxib29sLGJvb2wpCglzdG9yZSAyNTUgLy8gZnVsbCBhcnJheQoJbG9hZCAyNTUgLy8gZnVsbCBhcnJheQoJaW50IDE5MgoJZ2V0Yml0CglmcmFtZV9idXJ5IDQgLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU1NAoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sID0gZmluZFJldFsyXQoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWludCAxOTMKCWdldGJpdAoJZnJhbWVfYnVyeSA1IC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoKCS8vICppZjEyX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTU1CgkvLyBwb29sS2V5LnBvb2xJZCA9PT0gMAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMAoJPT0KCWJ6ICppZjEyX2VuZAoKCS8vICppZjEyX2NvbnNlcXVlbnQKCS8vIE5vIHBvb2wgYXZhaWxhYmxlIHdpdGggZnJlZSBzdGFrZS4gIFZhbGlkYXRvciBuZWVkcyB0byBhZGQgYW5vdGhlciBwb29sCgllcnIKCippZjEyX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU2MAoJLy8gdGhpcy51cGRhdGVTdGFrZXJQb29sU2V0KHN0YWtlciwgcG9vbEtleSkKCWZyYW1lX2RpZyAzIC8vIGZpbmRSZXQ6ICgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKCXN0b3JlIDI1NSAvLyBmdWxsIGFycmF5Cglsb2FkIDI1NSAvLyBmdWxsIGFycmF5CglleHRyYWN0IDAgMjQKCWZyYW1lX2RpZyAwIC8vIHN0YWtlcjogYWRkcmVzcwoJY2FsbHN1YiB1cGRhdGVTdGFrZXJQb29sU2V0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTYzCgkvLyB0aGlzLmNhbGxQb29sQWRkU3Rha2UoCgkvLyAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LAoJLy8gICAgICAgICAgICAgcG9vbEtleSwKCS8vICAgICAgICAgICAgIG1ickFtdExlZnRCZWhpbmQsCgkvLyAgICAgICAgICAgICBpc05ld1N0YWtlclRvVmFsaWRhdG9yLAoJLy8gICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1Byb3RvY29sLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgNSAvLyBpc05ld1N0YWtlclRvUHJvdG9jb2w6IGJvb2wKCWZyYW1lX2RpZyA0IC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCWZyYW1lX2RpZyAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMCAyNAoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4bgoJY2FsbHN1YiBjYWxsUG9vbEFkZFN0YWtlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTcwCgkvLyB0aGlzLnJldGlPUF9zdGFrZUFkZGVkLmxvZyh7CgkvLyAgICAgICAgICAgICBpZDogdmFsaWRhdG9ySWQsCgkvLyAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLAoJLy8gICAgICAgICAgICAgYW1vdW50U3Rha2VkOiByZWFsQW1vdW50LAoJLy8gICAgICAgICAgICAgc3Rha2VyOiBzdGFrZXIsCgkvLyAgICAgICAgIH0pCglieXRlIDB4OTYyYjQxNDMgLy8gcmV0aU9QX3N0YWtlQWRkZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQpCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgMCAvLyBzdGFrZXI6IGFkZHJlc3MKCWNvbmNhdAoJZnJhbWVfZGlnIDEgLy8gcmVhbEFtb3VudDogdWludDY0CglpdG9iCgljb25jYXQKCWNvbmNhdAoJbG9nCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTc4CgkvLyByZXR1cm4gcG9vbEtleQoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMCAyNAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDUKCXJldHN1YgoKLy8gc2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KQoqYWJpX3JvdXRlX3NldFRva2VuUGF5b3V0UmF0aW86CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIHNldFRva2VuUGF5b3V0UmF0aW8odWludDY0KSh1aW50NjRbMjRdLHVpbnQ2NCkKCWNhbGxzdWIgc2V0VG9rZW5QYXlvdXRSYXRpbwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIHNldFRva2VuUGF5b3V0UmF0aW8odmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IFBvb2xUb2tlblBheW91dFJhdGlvCi8vCi8vIHNldFRva2VuUGF5b3V0UmF0aW8gaXMgY2FsbGVkIGJ5IFN0YWtpbmcgUG9vbCAjIDEgKE9OTFkpIHRvIGFzayB0aGUgdmFsaWRhdG9yICh1cykgdG8gY2FsY3VsYXRlIHRoZSByYXRpb3MKLy8gb2Ygc3Rha2UgaW4gdGhlIHBvb2xzIGZvciBzdWJzZXF1ZW50IHRva2VuIHBheW91dHMgKGllOiAyIHBvb2xzLCAnMTAwJyBhbGdvIHRvdGFsIHN0YWtlZCwgNjAgaW4gcG9vbCAxLCBhbmQgNDAKLy8gaW4gcG9vbCAyKSAgVGhpcyBpcyBkb25lIHNvIHdlIGhhdmUgYSBzdGFibGUgc25hcHNob3Qgb2Ygc3Rha2UgLSB0YWtlbiBvbmNlIHBlciBlcG9jaCAtIG9ubHkgdHJpZ2dlcmVkIGJ5Ci8vIHBvb2wgMSBkb2luZyBwYXlvdXQuICBwb29scyBvdGhlciB0aGFuIDEgZG9pbmcgcGF5b3V0IGNhbGwgcG9vbCAxIHRvIGFzayBpdCBkbyBpdCBmaXJzdC4KLy8gSXQgd291bGQgYmUgNjAvNDAlIGluIHRoZSBwb29sUGN0T2ZXaG9sZSB2YWx1ZXMuICBUaGUgdG9rZW4gcmV3YXJkIHBheW91dHMgdGhlbiB1c2UgdGhlc2UgdmFsdWVzIGluc3RlYWQgb2YKLy8gdGhlaXIgJ2N1cnJlbnQnIHN0YWtlIHdoaWNoIGNoYW5nZXMgYXMgcGFydCBvZiB0aGUgcGF5b3V0cyB0aGVtc2VsdmVzIChhbmQgcGVvcGxlIGNvdWxkIGJlIGNoYW5naW5nIHN0YWtlCi8vIGR1cmluZyB0aGUgZXBvY2ggdXBkYXRlcyBhY3Jvc3MgcG9vbHMpCi8vCi8vIE11bHRpcGxlIHBvb2xzIHdpbGwgY2FsbCB1cyB2aWEgcG9vbCAxIChwb29sMi0+cG9vbDEtPnZhbGlkYXRvciwgZXRjLikgc28gZG9uJ3QgYXNzZXJ0IG9uIHBvb2wxIGNhbGxpbmcgbXVsdGlwbGUKLy8gdGltZXMgaW4gc2FtZSBlcG9jaC4gIEp1c3QgcmV0dXJuLgovLwovLyBAcGFyYW0gdmFsaWRhdG9ySWQgLSB2YWxpZGF0b3IgaWQgKGFuZCB0aHVzIHBvb2wpIGNhbGxpbmcgdXMuICBWZXJpZmllZCBzbyB0aGF0IHNlbmRlciBNVVNUIGJlIHBvb2wgMSBvZiB0aGlzIHZhbGlkYXRvci4KLy8gQHJldHVybnMgUG9vbFRva2VuUGF5b3V0UmF0aW8gLSB0aGUgZmluaXNoZWQgcmF0aW8gZGF0YQpzZXRUb2tlblBheW91dFJhdGlvOgoJcHJvdG8gMSAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gOAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU5OAoJLy8gcG9vbDFBcHBJRCA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkCglpbnQgMjY4CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMCAvLyBwb29sMUFwcElEOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1OTkKCS8vIGFzc2VydChwb29sMUFwcElEICE9PSAwKQoJZnJhbWVfZGlnIDAgLy8gcG9vbDFBcHBJRDogdWludDY0CglpbnQgMAoJIT0KCWFzc2VydAoKCS8vICppZjEzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjAxCgkvLyB0aGlzLnR4bi5zZW5kZXIgIT09IEFwcElELmZyb21VaW50NjQocG9vbDFBcHBJRCkuYWRkcmVzcwoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIDAgLy8gcG9vbDFBcHBJRDogdWludDY0CglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCSE9CglieiAqaWYxM19lbmQKCgkvLyAqaWYxM19jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MDIKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWIgKnNldFRva2VuUGF5b3V0UmF0aW8qcmV0dXJuCgoqaWYxM19lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MDgKCS8vIGN1clJvdW5kID0gZ2xvYmFscy5yb3VuZAoJZ2xvYmFsIFJvdW5kCglmcmFtZV9idXJ5IDEgLy8gY3VyUm91bmQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYwOQoJLy8gbGFzdFBheW91dFVwZGF0ZSA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUudG9rZW5QYXlvdXRSYXRpby51cGRhdGVkRm9yUGF5b3V0CglpbnQgODkyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCgkvLyAqaWYxNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYxMAoJLy8gbGFzdFBheW91dFVwZGF0ZSAhPT0gMAoJZnJhbWVfZGlnIDIgLy8gbGFzdFBheW91dFVwZGF0ZTogdWludDY0CglpbnQgMAoJIT0KCWJ6ICppZjE0X2VuZAoKCS8vICppZjE0X2NvbnNlcXVlbnQKCS8vICppZjE1X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjEyCgkvLyAoQXBwSUQuZnJvbVVpbnQ2NChwb29sMUFwcElEKS5nbG9iYWxTdGF0ZSgnbGFzdFBheW91dCcpIGFzIHVpbnQ2NCkgPT09IGxhc3RQYXlvdXRVcGRhdGUKCWZyYW1lX2RpZyAwIC8vIHBvb2wxQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDZjNjE3Mzc0NTA2MTc5NmY3NTc0IC8vICJsYXN0UGF5b3V0IgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQocG9vbDFBcHBJRCkuZ2xvYmFsU3RhdGUoJ2xhc3RQYXlvdXQnKQoJYXNzZXJ0CglmcmFtZV9kaWcgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCT09CglieiAqaWYxNV9lbmQKCgkvLyAqaWYxNV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MTMKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWIgKnNldFRva2VuUGF5b3V0UmF0aW8qcmV0dXJuCgoqaWYxNV9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MTUKCS8vIGVwb2NoUm91bmRMZW5ndGggPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lcG9jaFJvdW5kTGVuZ3RoIGFzIHVpbnQ2NAoJaW50IDE2OQoJaW50IDQKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDMgLy8gZXBvY2hSb3VuZExlbmd0aDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjE2CgkvLyB0aGlzRXBvY2hCZWdpbiA9IGN1clJvdW5kIC0gKGN1clJvdW5kICUgZXBvY2hSb3VuZExlbmd0aCkKCWZyYW1lX2RpZyAxIC8vIGN1clJvdW5kOiB1aW50NjQKCWZyYW1lX2RpZyAxIC8vIGN1clJvdW5kOiB1aW50NjQKCWZyYW1lX2RpZyAzIC8vIGVwb2NoUm91bmRMZW5ndGg6IHVpbnQ2NAoJJQoJLQoJZnJhbWVfYnVyeSA0IC8vIHRoaXNFcG9jaEJlZ2luOiB1aW50NjQKCgkvLyAqaWYxNl9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYxOAoJLy8gbGFzdFBheW91dFVwZGF0ZSAtIChsYXN0UGF5b3V0VXBkYXRlICUgZXBvY2hSb3VuZExlbmd0aCkgPT09IHRoaXNFcG9jaEJlZ2luCglmcmFtZV9kaWcgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCWZyYW1lX2RpZyAyIC8vIGxhc3RQYXlvdXRVcGRhdGU6IHVpbnQ2NAoJZnJhbWVfZGlnIDMgLy8gZXBvY2hSb3VuZExlbmd0aDogdWludDY0CgklCgktCglmcmFtZV9kaWcgNCAvLyB0aGlzRXBvY2hCZWdpbjogdWludDY0Cgk9PQoJYnogKmlmMTZfZW5kCgoJLy8gKmlmMTZfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjE5CgkvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS50b2tlblBheW91dFJhdGlvCglpbnQgNzAwIC8vIGhlYWRPZmZzZXQKCWludCAyMDAKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CgliICpzZXRUb2tlblBheW91dFJhdGlvKnJldHVybgoKKmlmMTZfZW5kOgoKKmlmMTRfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjIyCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8udXBkYXRlZEZvclBheW91dCA9IGN1clJvdW5kCglpbnQgODkyCglmcmFtZV9kaWcgMSAvLyBjdXJSb3VuZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYyNAoJLy8gY3VyTnVtUG9vbHMgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnN0YXRlLm51bVBvb2xzIGFzIHVpbnQ2NAoJaW50IDI0MgoJaW50IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDUgLy8gY3VyTnVtUG9vbHM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYyNQoJLy8gdG90YWxTdGFrZUZvclZhbGlkYXRvciA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUudG90YWxBbGdvU3Rha2VkCglpbnQgMjUyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgNiAvLyB0b3RhbFN0YWtlRm9yVmFsaWRhdG9yOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MjYKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgY3VyTnVtUG9vbHM7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDcgLy8gaTogdWludDY0CgoqZm9yXzI6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MjYKCS8vIGkgPCBjdXJOdW1Qb29scwoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglmcmFtZV9kaWcgNSAvLyBjdXJOdW1Qb29sczogdWludDY0Cgk8CglieiAqZm9yXzJfZW5kCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjMxCgkvLyBvdXJQb29sUGN0T2ZXaG9sZSA9IHdpZGVSYXRpbygKCS8vICAgICAgICAgICAgICAgICBbdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1tpXS50b3RhbEFsZ29TdGFrZWQsIDFfMDAwXzAwMF0sCgkvLyAgICAgICAgICAgICAgICAgW3RvdGFsU3Rha2VGb3JWYWxpZGF0b3JdLAoJLy8gICAgICAgICAgICAgKQoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglpbnQgMV8wMDBfMDAwCgltdWx3CglpbnQgMAoJZnJhbWVfZGlnIDYgLy8gdG90YWxTdGFrZUZvclZhbGlkYXRvcjogdWludDY0CglkaXZtb2R3Cglwb3AKCXBvcAoJc3dhcAoJIQoKCS8vIHdpZGVSYXRpbyBmYWlsZWQKCWFzc2VydAoJZnJhbWVfYnVyeSA4IC8vIG91clBvb2xQY3RPZldob2xlOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MzUKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUudG9rZW5QYXlvdXRSYXRpby5wb29sUGN0T2ZXaG9sZVtpXSA9IG91clBvb2xQY3RPZldob2xlCglpbnQgNzAwCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWZyYW1lX2RpZyA4IC8vIG91clBvb2xQY3RPZldob2xlOiB1aW50NjQKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoqZm9yXzJfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MjYKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSA3IC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzIKCipmb3JfMl9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MzcKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCipzZXRUb2tlblBheW91dFJhdGlvKnJldHVybjoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDgKCXJldHN1YgoKLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcygodWludDY0LHVpbnQ2NCx1aW50NjQpLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkCiphYmlfcm91dGVfc3Rha2VVcGRhdGVkVmlhUmV3YXJkczoKCS8vIHNhdHVyYXRlZEJ1cm5Ub0ZlZVNpbms6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQoJYnRvaQoKCS8vIHZhbGlkYXRvckNvbW1pc3Npb246IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAoJYnRvaQoKCS8vIHJld2FyZFRva2VuQW1vdW50UmVzZXJ2ZWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwoJYnRvaQoKCS8vIGFsZ29Ub0FkZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglidG9pCgoJLy8gcG9vbEtleTogKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZHVwCglsZW4KCWludCAyNAoJPT0KCgkvLyBhcmd1bWVudCA0IChwb29sS2V5KSBmb3Igc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyBtdXN0IGJlIGEgKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBzdGFrZVVwZGF0ZWRWaWFSZXdhcmRzKCh1aW50NjQsdWludDY0LHVpbnQ2NCksdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKCWNhbGxzdWIgc3Rha2VVcGRhdGVkVmlhUmV3YXJkcwoJaW50IDEKCXJldHVybgoKLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyhwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5LCBhbGdvVG9BZGQ6IHVpbnQ2NCwgcmV3YXJkVG9rZW5BbW91bnRSZXNlcnZlZDogdWludDY0LCB2YWxpZGF0b3JDb21taXNzaW9uOiB1aW50NjQsIHNhdHVyYXRlZEJ1cm5Ub0ZlZVNpbms6IHVpbnQ2NCk6IHZvaWQKLy8KLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyBpcyBjYWxsZWQgYnkgU3Rha2luZyBwb29scyB0byBpbmZvcm0gdGhlIHZhbGlkYXRvciAodXMpIHRoYXQgYSBwYXJ0aWN1bGFyIGFtb3VudCBvZiB0b3RhbAovLyBzdGFrZSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgc3BlY2lmaWVkIHBvb2wuICBUaGlzIGlzIHVzZWQgdG8gdXBkYXRlIHRoZSBzdGF0cyB3ZSBoYXZlIGluIG91ciBQb29sSW5mbyBzdG9yYWdlLgovLyBUaGUgY2FsbGluZyBBcHAgaWQgaXMgdmFsaWRhdGVkIGFnYWluc3Qgb3VyIHBvb2wgbGlzdCBhcyB3ZWxsLgovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBWYWxpZGF0b3JQb29sS2V5IHR5cGUKLy8gQHBhcmFtIHt1aW50NjR9IGFsZ29Ub0FkZCAtIGFtb3VudCB0aGlzIHZhbGlkYXRvcidzIHRvdGFsIHN0YWtlIGluY3JlYXNlZCB2aWEgcmV3YXJkcwovLyBAcGFyYW0ge3VpbnQ2NH0gcmV3YXJkVG9rZW5BbW91bnRSZXNlcnZlZCAtIGFtb3VudCB0aGlzIHZhbGlkYXRvcidzIHRvdGFsIHN0YWtlIGluY3JlYXNlZCB2aWEgcmV3YXJkcyAodGhhdCBzaG91bGQgYmUKLy8gQHBhcmFtIHt1aW50NjR9IHZhbGlkYXRvckNvbW1pc3Npb24gLSB0aGUgY29tbWlzc2lvbiBhbW91bnQgdGhlIHZhbGlkYXRvciB3YXMgcGFpZCwgaWYgYW55Ci8vIEBwYXJhbSB7dWludDY0fSBzYXR1cmF0ZWRCdXJuVG9GZWVTaW5rIC0gaWYgdGhlIHBvb2wgd2FzIGluIHNhdHVyYXRlZCBzdGF0ZSwgdGhlIGFtb3VudCBzZW50IGJhY2sgdG8gdGhlIGZlZSBzaW5rLgovLyBzZWVuIGFzICdhY2NvdW50ZWQgZm9yL3BlbmRpbmcgc3BlbnQnKQpzdGFrZVVwZGF0ZWRWaWFSZXdhcmRzOgoJcHJvdG8gNSAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjU4CgkvLyB0aGlzLnZlcmlmeVBvb2xLZXlDYWxsZXIocG9vbEtleSkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CgljYWxsc3ViIHZlcmlmeVBvb2xLZXlDYWxsZXIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NjEKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCArPSBhbGdvVG9BZGQKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAxMCAvLyBoZWFkT2Zmc2V0CgkrCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NjIKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS50b3RhbEFsZ29TdGFrZWQgKz0gYWxnb1RvQWRkCglpbnQgMjUyCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMiAvLyBhbGdvVG9BZGQ6IHVpbnQ2NAoJKwoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjYzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUucmV3YXJkVG9rZW5IZWxkQmFjayArPSByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkCglpbnQgMjYwCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkOiB1aW50NjQKCSsKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY2NQoJLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgKz0gYWxnb1RvQWRkCglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglhcHBfZ2xvYmFsX2dldAoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CgkrCglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglzd2FwCglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY2OAoJLy8gdGhpcy5yZXZlcmlmeU5GRE93bmVyc2hpcChwb29sS2V5LmlkKQoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCgljYWxsc3ViIHJldmVyaWZ5TkZET3duZXJzaGlwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjcwCgkvLyB0aGlzLnJldGlPUF9lcG9jaFJld2FyZFVwZGF0ZS5sb2coewoJLy8gICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLAoJLy8gICAgICAgICAgICAgYWxnb0FkZGVkOiBhbGdvVG9BZGQsCgkvLyAgICAgICAgICAgICByZXdhcmRUb2tlbkhlbGRCYWNrOiByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkLAoJLy8gICAgICAgICAgICAgc2F0dXJhdGVkQnVyblRvRmVlU2luazogc2F0dXJhdGVkQnVyblRvRmVlU2luaywKCS8vICAgICAgICAgICAgIHZhbGlkYXRvckNvbW1pc3Npb246IHZhbGlkYXRvckNvbW1pc3Npb24sCgkvLyAgICAgICAgIH0pCglieXRlIDB4YjNlNDdjM2QgLy8gcmV0aU9QX2Vwb2NoUmV3YXJkVXBkYXRlKHVpbnQ2NCx1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTQgLy8gdmFsaWRhdG9yQ29tbWlzc2lvbjogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtNSAvLyBzYXR1cmF0ZWRCdXJuVG9GZWVTaW5rOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY29uY2F0Cglsb2cKCXJldHN1YgoKLy8gc3Rha2VSZW1vdmVkKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wpdm9pZAoqYWJpX3JvdXRlX3N0YWtlUmVtb3ZlZDoKCS8vIHN0YWtlclJlbW92ZWQ6IGJvb2wKCXR4bmEgQXBwbGljYXRpb25BcmdzIDUKCWR1cAoJbGVuCglpbnQgMQoJPT0KCgkvLyBhcmd1bWVudCAwIChzdGFrZXJSZW1vdmVkKSBmb3Igc3Rha2VSZW1vdmVkIG11c3QgYmUgYSBib29sCglhc3NlcnQKCWludCAwCglnZXRiaXQKCgkvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDQKCWJ0b2kKCgkvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDMKCWJ0b2kKCgkvLyBzdGFrZXI6IGFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMzIKCT09CgoJLy8gYXJndW1lbnQgMyAoc3Rha2VyKSBmb3Igc3Rha2VSZW1vdmVkIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBwb29sS2V5OiAodWludDY0LHVpbnQ2NCx1aW50NjQpCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDI0Cgk9PQoKCS8vIGFyZ3VtZW50IDQgKHBvb2xLZXkpIGZvciBzdGFrZVJlbW92ZWQgbXVzdCBiZSBhICh1aW50NjQsdWludDY0LHVpbnQ2NCkKCWFzc2VydAoKCS8vIGV4ZWN1dGUgc3Rha2VSZW1vdmVkKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wpdm9pZAoJY2FsbHN1YiBzdGFrZVJlbW92ZWQKCWludCAxCglyZXR1cm4KCi8vIHN0YWtlUmVtb3ZlZChwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5LCBzdGFrZXI6IEFkZHJlc3MsIGFtb3VudFJlbW92ZWQ6IHVpbnQ2NCwgcmV3YXJkUmVtb3ZlZDogdWludDY0LCBzdGFrZXJSZW1vdmVkOiBib29sZWFuKTogdm9pZAovLwovLyBzdGFrZVJlbW92ZWQgaXMgY2FsbGVkIGJ5IFN0YWtpbmcgcG9vbHMgdG8gaW5mb3JtIHRoZSB2YWxpZGF0b3IgKHVzKSB0aGF0IGEgcGFydGljdWxhciBhbW91bnQgb2YgdG90YWwgc3Rha2UgaGFzIGJlZW4gcmVtb3ZlZAovLyBmcm9tIHRoZSBzcGVjaWZpZWQgcG9vbC4gIFRoaXMgaXMgdXNlZCB0byB1cGRhdGUgdGhlIHN0YXRzIHdlIGhhdmUgaW4gb3VyIFBvb2xJbmZvIHN0b3JhZ2UuCi8vIElmIGFueSBhbW91bnQgb2YgcmV3YXJkUmVtb3ZlZCBpcyBzcGVjaWZpZWQsIHRoZW4gdGhhdCBhbW91bnQgb2YgcmV3YXJkIGlzIHNlbnQgdG8gdGhlIHVzZQovLyBUaGUgY2FsbGluZyBBcHAgaWQgaXMgdmFsaWRhdGVkIGFnYWluc3Qgb3VyIHBvb2wgbGlzdCBhcyB3ZWxsLgovLwovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgY2FsbGluZyB1cyBmcm9tIHdoaWNoIHN0YWtlIHdhcyByZW1vdmVkCi8vIEBwYXJhbSB7QWRkcmVzc30gc3Rha2VyCi8vIEBwYXJhbSB7dWludDY0fSBhbW91bnRSZW1vdmVkIC0gYWxnbyBhbW91bnQgcmVtb3ZlZAovLyBAcGFyYW0ge3VpbnQ2NH0gcmV3YXJkUmVtb3ZlZCAtIGlmIGFwcGxpY2FibGUsIGFtb3VudCBvZiB0b2tlbiByZXdhcmQgcmVtb3ZlZCAoYnkgcG9vbCAxIGNhbGxlcikgb3IgVE8gcmVtb3ZlIGFuZCBwYXkgb3V0ICh2aWEgcG9vbCAxIGZyb20gZGlmZmVyZW50IHBvb2wgY2FsbGVyKQovLyBAcGFyYW0ge2Jvb2xlYW59IHN0YWtlclJlbW92ZWQKc3Rha2VSZW1vdmVkOgoJcHJvdG8gNSAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMwoKCS8vICppZjE3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzAwCgkvLyBnbG9iYWxzLm9wY29kZUJ1ZGdldCA8IDMwMAoJZ2xvYmFsIE9wY29kZUJ1ZGdldAoJaW50IDMwMAoJPAoJYnogKmlmMTdfZW5kCgoJLy8gKmlmMTdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzAxCgkvLyBpbmNyZWFzZU9wY29kZUJ1ZGdldCgpCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJaW50IDAKCWl0eG5fZmllbGQgRmVlCglieXRlIGI2NCBDb0VCIC8vICNwcmFnbWEgdmVyc2lvbiAxMDsgaW50IDEKCWR1cAoJaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCWludCBEZWxldGVBcHBsaWNhdGlvbgoJaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KCWl0eG5fc3VibWl0CgoqaWYxN19lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MDMKCS8vIHRoaXMudmVyaWZ5UG9vbEtleUNhbGxlcihwb29sS2V5KQoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWNhbGxzdWIgdmVyaWZ5UG9vbEtleUNhbGxlcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcwNwoJLy8gYXNzZXJ0KGFtb3VudFJlbW92ZWQgPiAwIHx8IHJld2FyZFJlbW92ZWQgPiAwLCAnc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGFsZ28gb3IgcmV3YXJkIHdhcyByZW1vdmVkJykKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWludCAwCgk+CglkdXAKCWJueiAqc2tpcF9vcjIKCWZyYW1lX2RpZyAtNCAvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCWludCAwCgk+Cgl8fAoKKnNraXBfb3IyOgoJLy8gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGFsZ28gb3IgcmV3YXJkIHdhcyByZW1vdmVkCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MTAKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCAtPSBhbW91bnRSZW1vdmVkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxMQoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsQWxnb1N0YWtlZCAtPSBhbW91bnRSZW1vdmVkCglpbnQgMjUyCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxMgoJLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgLT0gYW1vdW50UmVtb3ZlZAoJYnl0ZSAweDczNzQ2MTZiNjU2NCAvLyAic3Rha2VkIgoJYXBwX2dsb2JhbF9nZXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCXN3YXAKCWFwcF9nbG9iYWxfcHV0CgoJLy8gKmlmMThfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MTQKCS8vIHJld2FyZFJlbW92ZWQgPiAwCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CglpbnQgMAoJPgoJYnogKmlmMThfZWxzZQoKCS8vICppZjE4X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxNQoJLy8gcmV3YXJkVG9rZW5JRCA9IHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5jb25maWcucmV3YXJkVG9rZW5JZAoJaW50IDE1MwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIHJld2FyZFRva2VuSUQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxNgoJLy8gYXNzZXJ0KHJld2FyZFRva2VuSUQgIT09IDAsICJyZXdhcmRSZW1vdmVkIGNhbid0IGJlIHNldCBpZiB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIHJld2FyZCB0b2tlbiEiKQoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JRDogdWludDY0CglpbnQgMAoJIT0KCgkvLyByZXdhcmRSZW1vdmVkIGNhbid0IGJlIHNldCBpZiB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIHJld2FyZCB0b2tlbiEKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxNwoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS5yZXdhcmRUb2tlbkhlbGRCYWNrID49IHJld2FyZFJlbW92ZWQsCgkvLyAgICAgICAgICAgICAgICAgJ3Jld2FyZCBiZWluZyByZW1vdmVkIG11c3QgYmUgY292ZXJlZCBieSBob2xkIGJhY2sgYW1vdW50JywKCS8vICAgICAgICAgICAgICkKCWludCAyNjAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtNCAvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCT49CgoJLy8gcmV3YXJkIGJlaW5nIHJlbW92ZWQgbXVzdCBiZSBjb3ZlcmVkIGJ5IGhvbGQgYmFjayBhbW91bnQKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyMwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnJld2FyZFRva2VuSGVsZEJhY2sgLT0gcmV3YXJkUmVtb3ZlZAoJaW50IDI2MAoJZHVwCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CgktCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyAqaWYxOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyOAoJLy8gcG9vbEtleS5wb29sSWQgIT09IDEKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCSE9CglieiAqaWYxOV9lbmQKCgkvLyAqaWYxOV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MjkKCS8vIHNlbmRNZXRob2RDYWxsPHR5cGVvZiBTdGFraW5nUG9vbC5wcm90b3R5cGUucGF5VG9rZW5SZXdhcmQ+KHsKCS8vICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRDogQXBwSUQuZnJvbVVpbnQ2NCh0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJnczogW3N0YWtlciwgcmV3YXJkVG9rZW5JRCwgcmV3YXJkUmVtb3ZlZF0sCgkvLyAgICAgICAgICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgltZXRob2QgInBheVRva2VuUmV3YXJkKGFkZHJlc3MsdWludDY0LHVpbnQ2NCl2b2lkIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MzAKCS8vIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQodGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzWzBdLnBvb2xBcHBJZCkKCWludCAyNjgKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczMQoJLy8gbWV0aG9kQXJnczogW3N0YWtlciwgcmV3YXJkVG9rZW5JRCwgcmV3YXJkUmVtb3ZlZF0KCWZyYW1lX2RpZyAtMiAvLyBzdGFrZXI6IEFkZHJlc3MKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklEOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCippZjE5X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczNAoJLy8gdGhpcy5yZXRpT1Bfc3Rha2VSZW1vdmVkLmxvZyh7CgkvLyAgICAgICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICAgICAgcG9vbE51bTogcG9vbEtleS5wb29sSWQgYXMgdWludDE2LAoJLy8gICAgICAgICAgICAgICAgIHBvb2xBcHBJZDogQXBwSUQuZnJvbVVpbnQ2NChwb29sS2V5LnBvb2xBcHBJZCksCgkvLyAgICAgICAgICAgICAgICAgc3Rha2VyOiBzdGFrZXIsCgkvLyAgICAgICAgICAgICAgICAgYW1vdW50VW5zdGFrZWQ6IGFtb3VudFJlbW92ZWQsCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5Bc3NldElkOiBBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JRCksCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5zUmVjZWl2ZWQ6IHJld2FyZFJlbW92ZWQsCgkvLyAgICAgICAgICAgICB9KQoJYnl0ZSAweDEyZjRiZDRiIC8vIHJldGlPUF9zdGFrZVJlbW92ZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTIgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC00IC8vIHJld2FyZFJlbW92ZWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklEOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWIgKmlmMThfZW5kCgoqaWYxOF9lbHNlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzQ0CgkvLyB0aGlzLnJldGlPUF9zdGFrZVJlbW92ZWQubG9nKHsKCS8vICAgICAgICAgICAgICAgICBpZDogcG9vbEtleS5pZCwKCS8vICAgICAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICAgICAgcG9vbEFwcElkOiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICBzdGFrZXI6IHN0YWtlciwKCS8vICAgICAgICAgICAgICAgICBhbW91bnRVbnN0YWtlZDogYW1vdW50UmVtb3ZlZCwKCS8vICAgICAgICAgICAgICAgICAvLyBubyB0b2tlbnMgcmV3YXJkZWQuLgoJLy8gICAgICAgICAgICAgICAgIHJld2FyZFRva2VuQXNzZXRJZDogQXNzZXRJRC56ZXJvSW5kZXgsCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5zUmVjZWl2ZWQ6IDAsCgkvLyAgICAgICAgICAgICB9KQoJYnl0ZSAweDEyZjRiZDRiIC8vIHJldGlPUF9zdGFrZVJlbW92ZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTIgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAKCWNvbmNhdAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCippZjE4X2VuZDoKCS8vICppZjIwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzU2CgkvLyBzdGFrZXJSZW1vdmVkCglmcmFtZV9kaWcgLTUgLy8gc3Rha2VyUmVtb3ZlZDogYm9vbGVhbgoJYnogKmlmMjBfZW5kCgoJLy8gKmlmMjBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzU4CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbcG9vbEtleS5wb29sSWQgLSAxXS50b3RhbFN0YWtlcnMgLT0gMQoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJaW50IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDEKCS0KCWl0b2IKCWV4dHJhY3QgNiAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NjAKCS8vIHJlbW92ZVJldCA9IHRoaXMucmVtb3ZlRnJvbVN0YWtlclBvb2xTZXQoc3Rha2VyLCA8VmFsaWRhdG9yUG9vbEtleT57CgkvLyAgICAgICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICAgICAgcG9vbElkOiBwb29sS2V5LnBvb2xJZCwKCS8vICAgICAgICAgICAgICAgICBwb29sQXBwSWQ6IHBvb2xLZXkucG9vbEFwcElkLAoJLy8gICAgICAgICAgICAgfSkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY2FsbHN1YiByZW1vdmVGcm9tU3Rha2VyUG9vbFNldAoJZnJhbWVfYnVyeSAxIC8vIHJlbW92ZVJldDogKGJvb2wsYm9vbCkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NjUKCS8vIHN0YWtlck91dE9mVGhpc1ZhbGlkYXRvciA9IHJlbW92ZVJldFswXQoJZnJhbWVfZGlnIDEgLy8gcmVtb3ZlUmV0OiAoYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWludCAwCglnZXRiaXQKCWZyYW1lX2J1cnkgMiAvLyBzdGFrZXJPdXRPZlRoaXNWYWxpZGF0b3I6IGJvb2wKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NjYKCS8vIHN0YWtlck91dE9mUHJvdG9jb2wgPSByZW1vdmVSZXRbMV0KCWZyYW1lX2RpZyAxIC8vIHJlbW92ZVJldDogKGJvb2wsYm9vbCkKCXN0b3JlIDI1NSAvLyBmdWxsIGFycmF5Cglsb2FkIDI1NSAvLyBmdWxsIGFycmF5CglpbnQgMQoJZ2V0Yml0CglmcmFtZV9idXJ5IDMgLy8gc3Rha2VyT3V0T2ZQcm90b2NvbDogYm9vbAoKCS8vICppZjIxX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzY4CgkvLyBzdGFrZXJPdXRPZlRoaXNWYWxpZGF0b3IKCWZyYW1lX2RpZyAyIC8vIHN0YWtlck91dE9mVGhpc1ZhbGlkYXRvcjogYm9vbAoJYnogKmlmMjFfZW5kCgoJLy8gKmlmMjFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzY5CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUudG90YWxTdGFrZXJzIC09IDEKCWludCAyNDQKCWR1cAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDEKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKKmlmMjFfZW5kOgoJLy8gKmlmMjJfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NzIKCS8vIHN0YWtlck91dE9mUHJvdG9jb2wKCWZyYW1lX2RpZyAzIC8vIHN0YWtlck91dE9mUHJvdG9jb2w6IGJvb2wKCWJ6ICppZjIyX2VuZAoKCS8vICppZjIyX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc3MwoJLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlIC09IDEKCWJ5dGUgMHg2ZTc1NmQ1Mzc0NjE2YjY1NzI3MyAvLyAibnVtU3Rha2VycyIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMQoJLQoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJc3dhcAoJYXBwX2dsb2JhbF9wdXQKCippZjIyX2VuZDoKCippZjIwX2VuZDoKCXJldHN1YgoKLy8gZmluZFBvb2xGb3JTdGFrZXIodWludDY0LGFkZHJlc3MsdWludDY0KSgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKKmFiaV9yb3V0ZV9maW5kUG9vbEZvclN0YWtlcjoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gYW1vdW50VG9TdGFrZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglidG9pCgoJLy8gc3Rha2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDEgKHN0YWtlcikgZm9yIGZpbmRQb29sRm9yU3Rha2VyIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBmaW5kUG9vbEZvclN0YWtlcih1aW50NjQsYWRkcmVzcyx1aW50NjQpKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJY2FsbHN1YiBmaW5kUG9vbEZvclN0YWtlcgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGZpbmRQb29sRm9yU3Rha2VyKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIHN0YWtlcjogQWRkcmVzcywgYW1vdW50VG9TdGFrZTogdWludDY0KTogW1ZhbGlkYXRvclBvb2xLZXksIGJvb2xlYW4sIGJvb2xlYW5dCi8vCi8vIEZpbmRzIHRoZSBwb29sIGZvciBhIHN0YWtlciBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgdmFsaWRhdG9yIGlkLCBzdGFrZXIgYWRkcmVzcywgYW5kIGFtb3VudCB0byBzdGFrZS4KLy8gRmlyc3QgY2hlY2tzIHRoZSBzdGFrZXJzICdhbHJlYWR5IHN0YWtlZCBsaXN0JyBmb3IgdGhlIHZhbGlkYXRvciBwcmVmZXJyaW5nIHRob3NlIChhZGRpbmcgaWYgcG9zc2libGUpIHRoZW4gYWRkcwovLyB0byBuZXcgcG9vbCBpZiBuZWNlc3NhcnkuCi8vCi8vIEBwYXJhbSB7VmFsaWRhdG9ySWRUeXBlfSB2YWxpZGF0b3JJZCAtIFRoZSBpZCBvZiB0aGUgdmFsaWRhdG9yLgovLyBAcGFyYW0ge0FkZHJlc3N9IHN0YWtlciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzdGFrZXIuCi8vIEBwYXJhbSB7dWludDY0fSBhbW91bnRUb1N0YWtlIC0gVGhlIGFtb3VudCB0byBzdGFrZS4KLy8gQHJldHVybnMge1ZhbGlkYXRvclBvb2xLZXksIGJvb2xlYW4sIGJvb2xlYW59IC0gVGhlIHBvb2wgZm9yIHRoZSBzdGFrZXIsIHRydWUvZmFsc2Ugb24gd2hldGhlciB0aGUgc3Rha2VyIGlzICduZXcnCi8vIHRvIHRoaXMgVkFMSURBVE9SLCBhbmQgdHJ1ZS9mYWxzZSBpZiBzdGFrZXIgaXMgbmV3IHRvIHRoZSBwcm90b2NvbC4KZmluZFBvb2xGb3JTdGFrZXI6Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA3CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Nzk0CgkvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yID0gdHJ1ZQoJaW50IDEKCWZyYW1lX2J1cnkgMCAvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yOiBib29sCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Nzk1CgkvLyBpc05ld1N0YWtlclRvUHJvdG9jb2wgPSB0cnVlCglpbnQgMQoJZnJhbWVfYnVyeSAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgwMwoJLy8gbWF4UGVyUG9vbCA9IHRoaXMuZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sCglmcmFtZV9idXJ5IDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoJLy8gKmlmMjNfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MDYKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLmV4aXN0cwoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfbGVuCglzd2FwCglwb3AKCWJ6ICppZjIzX2VuZAoKCS8vICppZjIzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgwNwoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgwOAoJLy8gYXNzZXJ0KHZhbGlkYXRvcklkICE9PSAwKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWludCAwCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODA5CgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IHBvb2xTZXQubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoKKmZvcl8zOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODA5CgkvLyBpIDwgcG9vbFNldC5sZW5ndGgKCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDYKCTwKCWJ6ICpmb3JfM19lbmQKCgkvLyAqaWYyNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxMAoJLy8gZ2xvYmFscy5vcGNvZGVCdWRnZXQgPCAzMDAKCWdsb2JhbCBPcGNvZGVCdWRnZXQKCWludCAzMDAKCTwKCWJ6ICppZjI0X2VuZAoKCS8vICppZjI0X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxMQoJLy8gaW5jcmVhc2VPcGNvZGVCdWRnZXQoKQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCWludCAwCglpdHhuX2ZpZWxkIEZlZQoJYnl0ZSBiNjQgQ29FQiAvLyAjcHJhZ21hIHZlcnNpb24gMTA7IGludCAxCglkdXAKCWl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCglpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCglpbnQgRGVsZXRlQXBwbGljYXRpb24KCWl0eG5fZmllbGQgT25Db21wbGV0aW9uCglpdHhuX3N1Ym1pdAoKKmlmMjRfZW5kOgoJLy8gKmlmMjVfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MTMKCS8vIHBvb2xTZXRbaV0uaWQgPT09IDAKCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgk9PQoJYnogKmlmMjVfZW5kCgoJLy8gKmlmMjVfY29uc2VxdWVudAoJYiAqZm9yXzNfY29udGludWUKCippZjI1X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxNgoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sID0gZmFsc2UKCWludCAwCglmcmFtZV9idXJ5IDEgLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sCgoJLy8gKmlmMjZfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MTcKCS8vIHBvb2xTZXRbaV0uaWQgPT09IHZhbGlkYXRvcklkCglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgMAoJKwoJaW50IDgKCWV4dHJhY3QzCglidG9pCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJPT0KCWJ6ICppZjI2X2VuZAoKCS8vICppZjI2X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxOQoJLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciA9IGZhbHNlCglpbnQgMAoJZnJhbWVfYnVyeSAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCgkvLyAqaWYyN19jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyMQoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1twb29sU2V0W2ldLnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCArCgkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50VG9TdGFrZSA8PQoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4UGVyUG9vbAoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgOCAvLyBoZWFkT2Zmc2V0CgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJKwoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8PQoJYnogKmlmMjdfZW5kCgoJLy8gKmlmMjdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODI1CgkvLyByZXR1cm4gW3Bvb2xTZXRbaV0sIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IsIGlzTmV3U3Rha2VyVG9Qcm90b2NvbF0KCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWJ5dGUgMHgwMAoJaW50IDAKCWZyYW1lX2RpZyAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCXNldGJpdAoJaW50IDEKCWZyYW1lX2RpZyAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoJc2V0Yml0Cgljb25jYXQKCWIgKmZpbmRQb29sRm9yU3Rha2VyKnJldHVybgoKKmlmMjdfZW5kOgoKKmlmMjZfZW5kOgoKKmZvcl8zX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODA5CgkvLyBpICs9IDEKCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgNCAvLyBpOiB1aW50NjQKCWIgKmZvcl8zCgoqZm9yXzNfZW5kOgoKKmlmMjNfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODMyCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBhbW91bnRUb1N0YWtlID49IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1pbkVudHJ5U3Rha2UsCgkvLyAgICAgICAgICAgICAnbXVzdCBzdGFrZSBhdCBsZWFzdCB0aGUgbWluaW11bSBmb3IgdGhpcyBwb29sJywKCS8vICAgICAgICAgKQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJaW50IDIwOQoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk+PQoKCS8vIG11c3Qgc3Rha2UgYXQgbGVhc3QgdGhlIG1pbmltdW0gZm9yIHRoaXMgcG9vbAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODM4CgkvLyBwb29scyA9IGNsb25lKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHMpCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWludCA0MzIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglmcmFtZV9idXJ5IDUgLy8gcG9vbHM6ICh1aW50NjQsdWludDE2LHVpbnQ2NClbMjRdCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODM5CgkvLyBjdXJOdW1Qb29scyA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUubnVtUG9vbHMgYXMgdWludDY0CglpbnQgMjQyCglpbnQgMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgNiAvLyBjdXJOdW1Qb29sczogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQwCgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IGN1ck51bVBvb2xzOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA3IC8vIGk6IHVpbnQ2NAoKKmZvcl80OgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQwCgkvLyBpIDwgY3VyTnVtUG9vbHMKCWZyYW1lX2RpZyA3IC8vIGk6IHVpbnQ2NAoJZnJhbWVfZGlnIDYgLy8gY3VyTnVtUG9vbHM6IHVpbnQ2NAoJPAoJYnogKmZvcl80X2VuZAoKCS8vICppZjI4X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQxCgkvLyBwb29sc1tpXS50b3RhbEFsZ29TdGFrZWQgKyBhbW91bnRUb1N0YWtlIDw9IG1heFBlclBvb2wKCWZyYW1lX2RpZyA1IC8vIHBvb2xzOiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJKwoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8PQoJYnogKmlmMjhfZW5kCgoJLy8gKmlmMjhfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQyCgkvLyByZXR1cm4gWwoJLy8gICAgICAgICAgICAgICAgICAgICB7IGlkOiB2YWxpZGF0b3JJZCwgcG9vbElkOiBpICsgMSwgcG9vbEFwcElkOiBwb29sc1tpXS5wb29sQXBwSWQgfSwKCS8vICAgICAgICAgICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciwKCS8vICAgICAgICAgICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1Byb3RvY29sLAoJLy8gICAgICAgICAgICAgICAgIF0KCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxCgkrCglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyA1IC8vIHBvb2xzOiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglieXRlIDB4MDAKCWludCAwCglmcmFtZV9kaWcgMCAvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yOiBib29sCglzZXRiaXQKCWludCAxCglmcmFtZV9kaWcgMSAvLyBpc05ld1N0YWtlclRvUHJvdG9jb2w6IGJvb2wKCXNldGJpdAoJY29uY2F0CgliICpmaW5kUG9vbEZvclN0YWtlcipyZXR1cm4KCippZjI4X2VuZDoKCipmb3JfNF9jb250aW51ZToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg0MAoJLy8gaSArPSAxCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDcgLy8gaTogdWludDY0CgliICpmb3JfNAoKKmZvcl80X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg1MAoJLy8gcmV0dXJuIFt7IGlkOiB2YWxpZGF0b3JJZCwgcG9vbElkOiAwLCBwb29sQXBwSWQ6IDAgfSwgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciwgaXNOZXdTdGFrZXJUb1Byb3RvY29sXQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCgljb25jYXQKCWJ5dGUgMHgwMAoJaW50IDAKCWZyYW1lX2RpZyAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCXNldGJpdAoJaW50IDEKCWZyYW1lX2RpZyAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoJc2V0Yml0Cgljb25jYXQKCipmaW5kUG9vbEZvclN0YWtlcipyZXR1cm46CgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCgkvLyBwb3AgYWxsIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHRoZSBzdGFjawoJcG9wbiA3CglyZXRzdWIKCi8vIG1vdmVQb29sVG9Ob2RlKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKKmFiaV9yb3V0ZV9tb3ZlUG9vbFRvTm9kZToKCS8vIG5vZGVOdW06IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwoJYnRvaQoKCS8vIHBvb2xBcHBJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglidG9pCgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgbW92ZVBvb2xUb05vZGUodWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZAoJY2FsbHN1YiBtb3ZlUG9vbFRvTm9kZQoJaW50IDEKCXJldHVybgoKLy8gbW92ZVBvb2xUb05vZGUodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcG9vbEFwcElkOiB1aW50NjQsIG5vZGVOdW06IHVpbnQ2NCk6IHZvaWQKLy8KLy8gRmluZCB0aGUgc3BlY2lmaWVkIHBvb2wgKGluIGFueSBub2RlIG51bWJlcikgYW5kIG1vdmUgaXQgdG8gdGhlIHNwZWNpZmllZCBub2RlLgovLyBUaGUgcG9vbCBhY2NvdW50IGlzIGZvcmNlZCBvZmZsaW5lIGlmIG1vdmVkIHNvIHByaW9yIG5vZGUgd2lsbCBzdGlsbCBydW4gZm9yIDMyMCByb3VuZHMgYnV0Ci8vIG5ldyBrZXkgZ29lcyBvbmxpbmUgb24gbmV3IG5vZGUgc29vbiBhZnRlciAoMzIwIHJvdW5kcyBhZnRlciBpdCBnb2VzIG9ubGluZSkKLy8gTm8tb3AgaWYgc3VjY2VzcywgYXNzZXJ0cyBpZiBub3QgZm91bmQgb3IgY2FuJ3QgbW92ZSAgKG5vIHNwYWNlIGluIHRhcmdldCkKLy8gWyBPTkxZIE9XTkVSIE9SIE1BTkFHRVIgQ0FOIENIQU5HRSBdCi8vCi8vIEBwYXJhbSB7VmFsaWRhdG9ySWRUeXBlfSB2YWxpZGF0b3JJZCAtIFRoZSBpZCBvZiB0aGUgdmFsaWRhdG9yLgovLyBAcGFyYW0ge3VpbnQ2NH0gcG9vbEFwcElkCi8vIEBwYXJhbSB7dWludDY0fSBub2RlTnVtCm1vdmVQb29sVG9Ob2RlOgoJcHJvdG8gMyAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg2NQoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lck9yTWFuYWdlcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyT3JNYW5hZ2VyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODY3CgkvLyBub2RlUG9vbEFzc2lnbm1lbnRzID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5ub2RlUG9vbEFzc2lnbm1lbnRzKQoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfYnVyeSAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NjgKCS8vIGFzc2VydChub2RlTnVtID49IDEgJiYgbm9kZU51bSA8PSBNQVhfTk9ERVMsICdub2RlIG51bWJlciBvdXQgb2YgYWxsb3dhYmxlIHJhbmdlJykKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCAxCgk+PQoJZHVwCglieiAqc2tpcF9hbmQyCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgOAoJPD0KCSYmCgoqc2tpcF9hbmQyOgoJLy8gbm9kZSBudW1iZXIgb3V0IG9mIGFsbG93YWJsZSByYW5nZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODcwCgkvLyBmb3IgKGxldCBzcmNOb2RlSWR4ID0gMDsgc3JjTm9kZUlkeCA8IE1BWF9OT0RFUzsgc3JjTm9kZUlkeCArPSAxKQoJaW50IDAKCWZyYW1lX2J1cnkgMSAvLyBzcmNOb2RlSWR4OiB1aW50NjQKCipmb3JfNToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3MAoJLy8gc3JjTm9kZUlkeCA8IE1BWF9OT0RFUwoJZnJhbWVfZGlnIDEgLy8gc3JjTm9kZUlkeDogdWludDY0CglpbnQgOAoJPAoJYnogKmZvcl81X2VuZAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3MQoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBNQVhfUE9PTFNfUEVSX05PREU7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzY6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzEKCS8vIGkgPCBNQVhfUE9PTFNfUEVSX05PREUKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDMKCTwKCWJ6ICpmb3JfNl9lbmQKCgkvLyAqaWYyOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3MgoJLy8gbm9kZVBvb2xBc3NpZ25tZW50cy5ub2Rlc1tzcmNOb2RlSWR4XS5wb29sQXBwSWRzW2ldID09PSBwb29sQXBwSWQKCWZyYW1lX2RpZyAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCWludCAwCglmcmFtZV9kaWcgMSAvLyBzcmNOb2RlSWR4OiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMAoJKwoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWZyYW1lX2RpZyAtMiAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJPT0KCWJ6ICppZjI5X2VuZAoKCS8vICppZjI5X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3MwoJLy8gYXNzZXJ0KG5vZGVOdW0gLSAxICE9PSBzcmNOb2RlSWR4LCAiY2FuJ3QgbW92ZSB0byBzYW1lIG5vZGUiKQoJZnJhbWVfZGlnIC0zIC8vIG5vZGVOdW06IHVpbnQ2NAoJaW50IDEKCS0KCWZyYW1lX2RpZyAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJIT0KCgkvLyBjYW4ndCBtb3ZlIHRvIHNhbWUgbm9kZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODc1CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLm5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbc3JjTm9kZUlkeF0ucG9vbEFwcElkc1tpXSA9IDAKCWludCA5MDAKCWZyYW1lX2RpZyAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3OAoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5nb09mZmxpbmU+KHsKCS8vICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgltZXRob2QgImdvT2ZmbGluZSgpdm9pZCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODc5CgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkKCWZyYW1lX2RpZyAtMiAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4MwoJLy8gdGhpcy5hZGRQb29sVG9Ob2RlKHZhbGlkYXRvcklkLCBwb29sQXBwSWQsIG5vZGVOdW0pCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gcG9vbEFwcElkOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGFkZFBvb2xUb05vZGUKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4ODQKCS8vIHJldHVybgoJcmV0c3ViCgoqaWYyOV9lbmQ6CgoqZm9yXzZfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzEKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzYKCipmb3JfNl9lbmQ6CgoqZm9yXzVfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzAKCS8vIHNyY05vZGVJZHggKz0gMQoJZnJhbWVfZGlnIDEgLy8gc3JjTm9kZUlkeDogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJYiAqZm9yXzUKCipmb3JfNV9lbmQ6CgkvLyBjb3VsZG4ndCBmaW5kIHBvb2wgYXBwIGlkIGluIG5vZGVzIHRvIG1vdmUKCWVycgoJcmV0c3ViCgovLyBlbXB0eVRva2VuUmV3YXJkcyh1aW50NjQsYWRkcmVzcyl1aW50NjQKKmFiaV9yb3V0ZV9lbXB0eVRva2VuUmV3YXJkczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gcmVjZWl2ZXI6IGFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMzIKCT09CgoJLy8gYXJndW1lbnQgMCAocmVjZWl2ZXIpIGZvciBlbXB0eVRva2VuUmV3YXJkcyBtdXN0IGJlIGEgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZW1wdHlUb2tlblJld2FyZHModWludDY0LGFkZHJlc3MpdWludDY0CgljYWxsc3ViIGVtcHR5VG9rZW5SZXdhcmRzCglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZW1wdHlUb2tlblJld2FyZHModmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcmVjZWl2ZXI6IEFkZHJlc3MpOiB1aW50NjQKLy8KLy8gU2VuZHMgdGhlIHJld2FyZCB0b2tlbnMgaGVsZCBpbiBwb29sIDEgdG8gc3BlY2lmaWVkIHJlY2VpdmVyLgovLyBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgdGhlIG93bmVyIHdoZW4gdGhleSB3YW50IHRvIGdldCByZXdhcmQgdG9rZW5zICdiYWNrJyB3aGljaCB0aGV5IHNlbnQgdG8KLy8gdGhlIGZpcnN0IHBvb2wgKGxpa2VseSBiZWNhdXNlIHZhbGlkYXRvciBpcyBzdW5zZXR0aW5nLiAgQW55IHRva2VucyBjdXJyZW50bHkgJ3Jlc2VydmVkJyBmb3Igc3Rha2VycyB0byBjbGFpbSB3aWxsCi8vIE5PVCBiZSBzZW50IGFzIHRoZXkgbXVzdCBiZSBoZWxkIGJhY2sgZm9yIHN0YWtlcnMgdG8gbGF0ZXIgY2xhaW0uCi8vIFsgT05MWSBPV05FUiBDQU4gQ0FMTF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7QWRkcmVzc30gcmVjZWl2ZXIgLSB0aGUgYWNjb3VudCB0byBzZW5kIHRoZSB0b2tlbnMgdG8gKG11c3QgYWxyZWFkeSBiZSBvcHRlZC1pbiB0byB0aGUgcmV3YXJkIHRva2VuKQovLyBAcmV0dXJucyB7dWludDY0fSB0aGUgYW1vdW50IG9mIHJld2FyZCB0b2tlbiBzZW50CmVtcHR5VG9rZW5SZXdhcmRzOgoJcHJvdG8gMiAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkwMwoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTA0CgkvLyByZXdhcmRUb2tlbklkID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcucmV3YXJkVG9rZW5JZAoJaW50IDE1MwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTA1CgkvLyByZXdhcmRUb2tlbkhlbGRCYWNrID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5yZXdhcmRUb2tlbkhlbGRCYWNrCglpbnQgMjYwCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMSAvLyByZXdhcmRUb2tlbkhlbGRCYWNrOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MDYKCS8vIGFzc2VydChyZXdhcmRUb2tlbklkICE9PSAwLCAidGhpcyB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIGEgcmV3YXJkIHRva2VuIGRlZmluZWQiKQoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0CglpbnQgMAoJIT0KCgkvLyB0aGlzIHZhbGlkYXRvciBkb2Vzbid0IGhhdmUgYSByZXdhcmQgdG9rZW4gZGVmaW5lZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTA3CgkvLyBwb29sT25lQXBwSWQgPSBBcHBJRC5mcm9tVWludDY0KHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkKQoJaW50IDI2OAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MDkKCS8vIHRva2VuUmV3YXJkQmFsID0KCS8vICAgICAgICAgICAgIHBvb2xPbmVBcHBJZC5hZGRyZXNzLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JZCkpIC0gcmV3YXJkVG9rZW5IZWxkQmFjawoJZnJhbWVfZGlnIDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCXBvcAoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0Cglhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKCXBvcAoJZnJhbWVfZGlnIDEgLy8gcmV3YXJkVG9rZW5IZWxkQmFjazogdWludDY0CgktCglmcmFtZV9idXJ5IDMgLy8gdG9rZW5SZXdhcmRCYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkxMwoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5wYXlUb2tlblJld2FyZD4oewoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25JRDogcG9vbE9uZUFwcElkLAoJLy8gICAgICAgICAgICAgbWV0aG9kQXJnczogW3JlY2VpdmVyLCByZXdhcmRUb2tlbklkLCB0b2tlblJld2FyZEJhbF0sCgkvLyAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJbWV0aG9kICJwYXlUb2tlblJld2FyZChhZGRyZXNzLHVpbnQ2NCx1aW50NjQpdm9pZCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTE0CgkvLyBhcHBsaWNhdGlvbklEOiBwb29sT25lQXBwSWQKCWZyYW1lX2RpZyAyIC8vIHBvb2xPbmVBcHBJZDogdWludDY0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MTUKCS8vIG1ldGhvZEFyZ3M6IFtyZWNlaXZlciwgcmV3YXJkVG9rZW5JZCwgdG9rZW5SZXdhcmRCYWxdCglmcmFtZV9kaWcgLTIgLy8gcmVjZWl2ZXI6IEFkZHJlc3MKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklkOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMyAvLyB0b2tlblJld2FyZEJhbDogdWludDY0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MTcKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHBvb2xPbmVBcHBJZC5hZGRyZXNzLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JZCkpID09PSByZXdhcmRUb2tlbkhlbGRCYWNrLAoJLy8gICAgICAgICAgICAgJ2JhbGFuY2Ugb2YgcmVtYWluaW5nIHJld2FyZCB0b2tlbnMgc2hvdWxkIG1hdGNoIHRoZSBoZWxkIGJhY2sgYW1vdW50JywKCS8vICAgICAgICAgKQoJZnJhbWVfZGlnIDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCXBvcAoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0Cglhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKCXBvcAoJZnJhbWVfZGlnIDEgLy8gcmV3YXJkVG9rZW5IZWxkQmFjazogdWludDY0Cgk9PQoKCS8vIGJhbGFuY2Ugb2YgcmVtYWluaW5nIHJld2FyZCB0b2tlbnMgc2hvdWxkIG1hdGNoIHRoZSBoZWxkIGJhY2sgYW1vdW50Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MjEKCS8vIHJldHVybiB0b2tlblJld2FyZEJhbAoJZnJhbWVfZGlnIDMgLy8gdG9rZW5SZXdhcmRCYWw6IHVpbnQ2NAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDMKCXJldHN1YgoKLy8gY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IHZvaWQKY2FsbGVyTXVzdEJlT3duZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDE0CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICB0aGlzLnR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLAoJLy8gICAgICAgICAgICAgJ2NhbiBvbmx5IGJlIGNhbGxlZCBieSB2YWxpZGF0b3Igb3duZXInLAoJLy8gICAgICAgICApCgl0eG4gU2VuZGVyCglpbnQgOAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJPT0KCgkvLyBjYW4gb25seSBiZSBjYWxsZWQgYnkgdmFsaWRhdG9yIG93bmVyCglhc3NlcnQKCXJldHN1YgoKLy8gY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXIodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IHZvaWQKY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDIxCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICB0aGlzLnR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyIHx8CgkvLyAgICAgICAgICAgICAgICAgdGhpcy50eG4uc2VuZGVyID09PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5tYW5hZ2VyLAoJLy8gICAgICAgICAgICAgJ2NhbiBvbmx5IGJlIGNhbGxlZCBieSBvd25lciBvciBtYW5hZ2VyIG9mIHZhbGlkYXRvcicsCgkvLyAgICAgICAgICkKCXR4biBTZW5kZXIKCWludCA4CglpbnQgMzIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0Cgk9PQoJZHVwCglibnogKnNraXBfb3IzCgl0eG4gU2VuZGVyCglpbnQgNDAKCWludCAzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCT09Cgl8fAoKKnNraXBfb3IzOgoJLy8gY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IG93bmVyIG9yIG1hbmFnZXIgb2YgdmFsaWRhdG9yCglhc3NlcnQKCXJldHN1YgoKLy8gdmVyaWZ5UG9vbEtleUNhbGxlcihwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5KTogdm9pZAovLwovLyB2ZXJpZnlQb29sS2V5Q2FsbGVyIHZlcmlmaWVzIHRoZSBwYXNzZWQgaW4ga2V5IChmcm9tIGEgc3Rha2luZyBwb29sIGNhbGxpbmcgdXMgdG8gdXBkYXRlIG1ldHJpY3MpIGlzIHZhbGlkCi8vIGFuZCBtYXRjaGVzIHRoZSBpbmZvcm1hdGlvbiB3ZSBoYXZlIGluIG91ciBzdGF0ZS4gICdGYWtlJyBwb29scyBjb3VsZCBjYWxsIHVzIHRvIHVwZGF0ZSBvdXIgZGF0YSwgYnV0IHRoZXkKLy8gY2FuJ3QgZmFrZSB0aGUgaWRzIGFuZCBtb3N0IGltcG9ydGFudGx5IGFwcGxpY2F0aW9uIGlkKCEpIG9mIHRoZSBjYWxsZXIgdGhhdCBoYXMgdG8gbWF0Y2guCnZlcmlmeVBvb2xLZXlDYWxsZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDM0CgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLmV4aXN0cywgInRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGlzbid0IHZhbGlkIikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cglib3hfbGVuCglzd2FwCglwb3AKCgkvLyB0aGUgc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBpc24ndCB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTAzNQoJLy8gYXNzZXJ0KHBvb2xLZXkucG9vbElkIDw9IE1BWF9QT09MUywgJ3Bvb2wgaWQgbm90IGluIHZhbGlkIHJhbmdlJykKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDI0Cgk8PQoKCS8vIHBvb2wgaWQgbm90IGluIHZhbGlkIHJhbmdlCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDM2CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBwb29sS2V5LnBvb2xJZCA+IDAgJiYgKHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNikgPD0gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLm51bVBvb2xzLAoJLy8gICAgICAgICAgICAgJ3Bvb2wgaWQgb3V0c2lkZSBvZiByYW5nZSBvZiBwb29scyBjcmVhdGVkIGZvciB0aGlzIHZhbGlkYXRvcicsCgkvLyAgICAgICAgICkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDAKCT4KCWR1cAoJYnogKnNraXBfYW5kMwoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMjQyCglpbnQgMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk8PQoJJiYKCipza2lwX2FuZDM6CgkvLyBwb29sIGlkIG91dHNpZGUgb2YgcmFuZ2Ugb2YgcG9vbHMgY3JlYXRlZCBmb3IgdGhpcyB2YWxpZGF0b3IKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNDIKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHBvb2xLZXkucG9vbEFwcElkID09PSB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbcG9vbEtleS5wb29sSWQgLSAxXS5wb29sQXBwSWQsCgkvLyAgICAgICAgICAgICAiVGhlIHBhc3NlZCBpbiBhcHAgaWQgZG9lc24ndCBtYXRjaCB0aGUgcGFzc2VkIGluIGlkcyIsCgkvLyAgICAgICAgICkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk9PQoKCS8vIFRoZSBwYXNzZWQgaW4gYXBwIGlkIGRvZXNuJ3QgbWF0Y2ggdGhlIHBhc3NlZCBpbiBpZHMKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNDcKCS8vIGFzc2VydCh0aGlzLnR4bi5zZW5kZXIgPT09IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLmFkZHJlc3MpCgl0eG4gU2VuZGVyCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAxNiA4CglidG9pCglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCT09Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDQ5CgkvLyBhc3NlcnQocG9vbEtleS5pZCA9PT0gKEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLmdsb2JhbFN0YXRlKCd2YWxpZGF0b3JJZCcpIGFzIHVpbnQ2NCkpCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWJ5dGUgMHg3NjYxNmM2OTY0NjE3NDZmNzI0OTY0IC8vICJ2YWxpZGF0b3JJZCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgndmFsaWRhdG9ySWQnKQoJYXNzZXJ0Cgk9PQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA1MAoJLy8gYXNzZXJ0KHBvb2xLZXkucG9vbElkID09PSAoQXBwSUQuZnJvbVVpbnQ2NChwb29sS2V5LnBvb2xBcHBJZCkuZ2xvYmFsU3RhdGUoJ3Bvb2xJZCcpIGFzIHVpbnQ2NCkpCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWJ5dGUgMHg3MDZmNmY2YzQ5NjQgLy8gInBvb2xJZCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgncG9vbElkJykKCWFzc2VydAoJPT0KCWFzc2VydAoJcmV0c3ViCgovLyByZXZlcmlmeU5GRE93bmVyc2hpcCh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogdm9pZAovLwovLyBUaGlzIG1ldGhvZCB2ZXJpZmllcyB0aGUgb3duZXJzaGlwIG9mIE5GRCAoTmFtZWQgRnVuY3Rpb24gRGF0YSkgYnkgYSB2YWxpZGF0b3IuCi8vIElmIHRoZSBvd25lcnNoaXAgaXMgbm8gbG9uZ2VyIHZhbGlkLCBpdCByZW1vdmVzIHRoZSBORkQgZnJvbSB0aGUgdmFsaWRhdG9yJ3MgY29uZmlndXJhdGlvbi4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3Igd2hvc2UgZGF0YSBzaG91bGQgYmUgcmUtZXZhbHVhdGVkLgpyZXZlcmlmeU5GRE93bmVyc2hpcDoKCXByb3RvIDEgMAoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDYwCgkvLyB2YWxpZGF0b3JDb25maWcgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZwoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJZnJhbWVfYnVyeSAwIC8vIHN0b3JhZ2Uga2V5Ly92YWxpZGF0b3JDb25maWcKCgkvLyAqaWYzMF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNjEKCS8vIHZhbGlkYXRvckNvbmZpZy5uZmRGb3JJbmZvICE9PSAwCglpbnQgNzIKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDAKCSE9CglieiAqaWYzMF9lbmQKCgkvLyAqaWYzMF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDY0CgkvLyBuZmRPd25lciA9IEFwcElELmZyb21VaW50NjQodmFsaWRhdG9yQ29uZmlnLm5mZEZvckluZm8pLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzCglpbnQgNzIKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQodmFsaWRhdG9yQ29uZmlnLm5mZEZvckluZm8pLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCgkvLyAqaWYzMV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNjYKCS8vIHZhbGlkYXRvckNvbmZpZy5vd25lciAhPT0gbmZkT3duZXIgJiYgdmFsaWRhdG9yQ29uZmlnLm1hbmFnZXIgIT09IG5mZE93bmVyCglpbnQgOAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfZGlnIDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCSE9CglkdXAKCWJ6ICpza2lwX2FuZDQKCWludCA0MAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfZGlnIDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCSE9CgkmJgoKKnNraXBfYW5kNDoKCWJ6ICppZjMxX2VuZAoKCS8vICppZjMxX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNjgKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm5mZEZvckluZm8gPSAwCglpbnQgNzIKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKKmlmMzFfZW5kOgoKKmlmMzBfZW5kOgoJcmV0c3ViCgovLyB2YWxpZGF0ZUNvbmZpZyhjb25maWc6IFZhbGlkYXRvckNvbmZpZyk6IHZvaWQKdmFsaWRhdGVDb25maWc6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDc1CgkvLyBhc3NlcnQoY29uZmlnLm93bmVyICE9PSBBZGRyZXNzLnplcm9BZGRyZXNzKQoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDggMzIKCWdsb2JhbCBaZXJvQWRkcmVzcwoJIT0KCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNzYKCS8vIGFzc2VydChjb25maWcubWFuYWdlciAhPT0gQWRkcmVzcy56ZXJvQWRkcmVzcykKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA0MCAzMgoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA3NwoJLy8gYXNzZXJ0KHRoaXMudHhuLnNlbmRlciA9PT0gY29uZmlnLm93bmVyLCAnc2VuZGVyIG11c3QgYmUgb3duZXIgdG8gYWRkIG5ldyB2YWxpZGF0b3InKQoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDggMzIKCT09CgoJLy8gc2VuZGVyIG11c3QgYmUgb3duZXIgdG8gYWRkIG5ldyB2YWxpZGF0b3IKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNzkKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIGNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPj0gR0FUSU5HX1RZUEVfTk9ORSAmJiBjb25maWcuZW50cnlHYXRpbmdUeXBlIDw9IEdBVElOR19UWVBFX0NPTlNUX01BWCwKCS8vICAgICAgICAgICAgICdnYXRpbmcgdHlwZSBub3QgdmFsaWQnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgODAgMQoJYnRvaQoJaW50IDAKCT49CglkdXAKCWJ6ICpza2lwX2FuZDUKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4MCAxCglidG9pCglpbnQgNAoJPD0KCSYmCgoqc2tpcF9hbmQ1OgoJLy8gZ2F0aW5nIHR5cGUgbm90IHZhbGlkCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDgzCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBjb25maWcuZXBvY2hSb3VuZExlbmd0aCA+PSBNSU5fRVBPQ0hfTEVOR1RIICYmIGNvbmZpZy5lcG9jaFJvdW5kTGVuZ3RoIDw9IE1BWF9FUE9DSF9MRU5HVEgsCgkvLyAgICAgICAgICAgICAnZXBvY2ggbGVuZ3RoIG5vdCBpbiBhbGxvd2FibGUgcmFuZ2UnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTY5IDQKCWJ0b2kKCWludCAxCgk+PQoJZHVwCglieiAqc2tpcF9hbmQ2CglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTY5IDQKCWJ0b2kKCWludCAxMDAwMDAwCgk8PQoJJiYKCipza2lwX2FuZDY6CgkvLyBlcG9jaCBsZW5ndGggbm90IGluIGFsbG93YWJsZSByYW5nZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA4NwoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgY29uZmlnLnBlcmNlbnRUb1ZhbGlkYXRvciA+PSBNSU5fUENUX1RPX1ZBTElEQVRPUiAmJiBjb25maWcucGVyY2VudFRvVmFsaWRhdG9yIDw9IE1BWF9QQ1RfVE9fVkFMSURBVE9SLAoJLy8gICAgICAgICAgICAgJ2NvbW1pc3Npb24gcGVyY2VudGFnZSBub3QgdmFsaWQnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTczIDQKCWJ0b2kKCWludCAwCgk+PQoJZHVwCglieiAqc2tpcF9hbmQ3CglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTczIDQKCWJ0b2kKCWludCAxMDAwMDAwCgk8PQoJJiYKCipza2lwX2FuZDc6CgkvLyBjb21taXNzaW9uIHBlcmNlbnRhZ2Ugbm90IHZhbGlkCglhc3NlcnQKCgkvLyAqaWYzMl9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwOTEKCS8vIGNvbmZpZy5wZXJjZW50VG9WYWxpZGF0b3IgIT09IDAKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAxNzMgNAoJYnRvaQoJaW50IDAKCSE9CglieiAqaWYzMl9lbmQKCgkvLyAqaWYzMl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDkyCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgY29uZmlnLnZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzICE9PSBBZGRyZXNzLnplcm9BZGRyZXNzLAoJLy8gICAgICAgICAgICAgICAgICd2YWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyBtdXN0IGJlIHNldCBpZiBwZXJjZW50IHRvIHZhbGlkYXRvciBpcyBub3QgMCcsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTc3IDMyCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CgoJLy8gdmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MgbXVzdCBiZSBzZXQgaWYgcGVyY2VudCB0byB2YWxpZGF0b3IgaXMgbm90IDAKCWFzc2VydAoKKmlmMzJfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA5NwoJLy8gYXNzZXJ0KGNvbmZpZy5taW5FbnRyeVN0YWtlID49IE1JTl9BTEdPX1NUQUtFX1BFUl9QT09MLCAnc3Rha2luZyBwb29sIG11c3QgaGF2ZSBtaW5pbXVtIGVudHJ5IG9mIDEgYWxnbycpCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMjA5IDgKCWJ0b2kKCWludCAxMDAwMDAwCgk+PQoKCS8vIHN0YWtpbmcgcG9vbCBtdXN0IGhhdmUgbWluaW11bSBlbnRyeSBvZiAxIGFsZ28KCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwOTkKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIGNvbmZpZy5wb29sc1Blck5vZGUgPiAwICYmIGNvbmZpZy5wb29sc1Blck5vZGUgPD0gTUFYX1BPT0xTX1BFUl9OT0RFLAoJLy8gICAgICAgICAgICAgJ251bWJlciBvZiBwb29scyBwZXIgbm9kZSBtdXN0IGJlIGJlIGJldHdlZW4gMSBhbmQgdGhlIG1heGltdW0gYWxsb3dlZCBudW1iZXInLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMjI1IDEKCWJ0b2kKCWludCAwCgk+CglkdXAKCWJ6ICpza2lwX2FuZDgKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAyMjUgMQoJYnRvaQoJaW50IDMKCTw9CgkmJgoKKnNraXBfYW5kODoKCS8vIG51bWJlciBvZiBwb29scyBwZXIgbm9kZSBtdXN0IGJlIGJlIGJldHdlZW4gMSBhbmQgdGhlIG1heGltdW0gYWxsb3dlZCBudW1iZXIKCWFzc2VydAoKCS8vICppZjMzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEwMwoJLy8gY29uZmlnLnN1bnNldHRpbmdPbiAhPT0gMAoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDIyNiA4CglidG9pCglpbnQgMAoJIT0KCWJ6ICppZjMzX2VuZAoKCS8vICppZjMzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMDQKCS8vIGFzc2VydChjb25maWcuc3Vuc2V0dGluZ09uID4gZ2xvYmFscy5sYXRlc3RUaW1lc3RhbXAsICdzdW5zZXR0aW5nT24gbXVzdCBiZSBsYXRlciB0aGFuIG5vdyBpZiBzZXQnKQoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDIyNiA4CglidG9pCglnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCgk+CgoJLy8gc3Vuc2V0dGluZ09uIG11c3QgYmUgbGF0ZXIgdGhhbiBub3cgaWYgc2V0Cglhc3NlcnQKCippZjMzX2VuZDoKCXJldHN1YgoKLy8gY2FsbFBvb2xBZGRTdGFrZShzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4sIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXksIG1ickFtdFBhaWQ6IHVpbnQ2NCwgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbGVhbiwgaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sZWFuKTogdm9pZAovLwovLyBBZGRzIGEgc3Rha2VycyBhbW91bnQgb2YgYWxnbyB0byBhIHZhbGlkYXRvciBwb29sLCB0cmFuc2ZlcnJpbmcgdGhlIGFsZ28gd2UgcmVjZWl2ZWQgZnJvbSB0aGVtIChhbHJlYWR5IHZlcmlmaWVkCi8vIGJ5IG91ciBjYWxsZXIpIHRvIHRoZSBzdGFraW5nIHBvb2wgYWNjb3VudCwgYW5kIHRoZW4gdGVsbGluZyBpdCBhYm91dCB0aGUgYW1vdW50IGJlaW5nIGFkZGVkIGZvciB0aGUgc3BlY2lmaWVkCi8vIHN0YWtlci4KLy8KLy8gQHBhcmFtIHtQYXlUeG59IHN0YWtlZEFtb3VudFBheW1lbnQgLSBwYXltZW50IGNvbWluZyBmcm9tIHN0YWtlciB0byBwbGFjZSBpbnRvIGEgcG9vbAovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBUaGUga2V5IG9mIHRoZSB2YWxpZGF0b3IgcG9vbC4KLy8gQHBhcmFtIHt1aW50NjR9IG1ickFtdFBhaWQgLSBBbW91bnQgdGhlIHVzZXIgaXMgbGVhdmluZyBiZWhpbmQgaW4gdGhlIHZhbGlkYXRvciB0byBwYXkgZm9yIHRoZWlyIHN0YWtlciBNQlIgY29zdAovLyBAcGFyYW0ge2Jvb2xlYW59IGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IgLSBpZiB0aGlzIGlzIGEgbmV3LCBmaXJzdC10aW1lIHN0YWtlciB0byB0aGUgdmFsaWRhdG9yCi8vIEBwYXJhbSB7Ym9vbGVhbn0gaXNOZXdTdGFrZXJUb1Byb3RvY29sIC0gaWYgdGhpcyBpcyBhIG5ldywgZmlyc3QtdGltZSBzdGFrZXIgdG8gdGhlIHByb3RvY29sCmNhbGxQb29sQWRkU3Rha2U6Cglwcm90byA1IDAKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiAyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEyNgoJLy8gcG9vbEFwcElkID0gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzW3Bvb2xLZXkucG9vbElkIC0gMV0ucG9vbEFwcElkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIHBvb2xBcHBJZDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEzMAoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5hZGRTdGFrZSwgdWludDY0Pih7CgkvLyAgICAgICAgICAgICBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCksCgkvLyAgICAgICAgICAgICBtZXRob2RBcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gPT09PT09PQoJLy8gICAgICAgICAgICAgICAgIC8vIFRISVMgSVMgQSBTRU5EIG9mIHRoZSBhbW91bnQgcmVjZWl2ZWQgcmlnaHQgYmFjayBvdXQgYW5kIGludG8gdGhlIHN0YWtpbmcgcG9vbCBjb250cmFjdCBhY2NvdW50LgoJLy8gICAgICAgICAgICAgICAgIHsgYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQsIHJlY2VpdmVyOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuYWRkcmVzcyB9LAoJLy8gICAgICAgICAgICAgICAgIC8vID09PT09PT0KCS8vICAgICAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LnNlbmRlciwKCS8vICAgICAgICAgICAgIF0sCgkvLyAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgcGF5CglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEzNQoJLy8gYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJZnJhbWVfZGlnIC0zIC8vIG1ickFtdFBhaWQ6IHVpbnQ2NAoJLQoJaXR4bl9maWVsZCBBbW91bnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTM1CgkvLyByZWNlaXZlcjogQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmFkZHJlc3MKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCWl0eG5fZmllbGQgUmVjZWl2ZXIKCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCWl0eG5fbmV4dAoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAiYWRkU3Rha2UocGF5LGFkZHJlc3MpdWludDY0IgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTMxCgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTMyCgkvLyBtZXRob2RBcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gPT09PT09PQoJLy8gICAgICAgICAgICAgICAgIC8vIFRISVMgSVMgQSBTRU5EIG9mIHRoZSBhbW91bnQgcmVjZWl2ZWQgcmlnaHQgYmFjayBvdXQgYW5kIGludG8gdGhlIHN0YWtpbmcgcG9vbCBjb250cmFjdCBhY2NvdW50LgoJLy8gICAgICAgICAgICAgICAgIHsgYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQsIHJlY2VpdmVyOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuYWRkcmVzcyB9LAoJLy8gICAgICAgICAgICAgICAgIC8vID09PT09PT0KCS8vICAgICAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LnNlbmRlciwKCS8vICAgICAgICAgICAgIF0KCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIFNlbmRlcgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCgkvLyBTdWJtaXQgaW5uZXIgdHJhbnNhY3Rpb24KCWl0eG5fc3VibWl0CglpdHhuIE51bUxvZ3MKCWludCAxCgktCglpdHhuYXMgTG9ncwoJZXh0cmFjdCA0IDAKCWJ0b2kKCgkvLyAqaWYzNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNDAKCS8vIGdsb2JhbHMub3Bjb2RlQnVkZ2V0IDwgNTAwCglnbG9iYWwgT3Bjb2RlQnVkZ2V0CglpbnQgNTAwCgk8CglieiAqaWYzNF9lbmQKCgkvLyAqaWYzNF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTQxCgkvLyBpbmNyZWFzZU9wY29kZUJ1ZGdldCgpCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJaW50IDAKCWl0eG5fZmllbGQgRmVlCglieXRlIGI2NCBDb0VCIC8vICNwcmFnbWEgdmVyc2lvbiAxMDsgaW50IDEKCWR1cAoJaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCWludCBEZWxldGVBcHBsaWNhdGlvbgoJaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KCWl0eG5fc3VibWl0CgoqaWYzNF9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTQ1CgkvLyBwb29sTnVtU3Rha2VycyA9IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgnbnVtU3Rha2VycycpIGFzIHVpbnQ2NAoJZnJhbWVfZGlnIDAgLy8gcG9vbEFwcElkOiB1aW50NjQKCWJ5dGUgMHg2ZTc1NmQ1Mzc0NjE2YjY1NzI3MyAvLyAibnVtU3Rha2VycyIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuZ2xvYmFsU3RhdGUoJ251bVN0YWtlcnMnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDEgLy8gcG9vbE51bVN0YWtlcnM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNDYKCS8vIHBvb2xBbGdvU3Rha2VkID0gQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmdsb2JhbFN0YXRlKCdzdGFrZWQnKSBhcyB1aW50NjQKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglhcHBfZ2xvYmFsX2dldF9leAoKCS8vIGdsb2JhbCBzdGF0ZSB2YWx1ZSBkb2VzIG5vdCBleGlzdDogQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmdsb2JhbFN0YXRlKCdzdGFrZWQnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDIgLy8gcG9vbEFsZ29TdGFrZWQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNDcKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsU3Rha2VycyA9IHBvb2xOdW1TdGFrZXJzIGFzIHVpbnQxNgoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJZnJhbWVfZGlnIDEgLy8gcG9vbE51bVN0YWtlcnM6IHVpbnQ2NAoJaXRvYgoJZXh0cmFjdCA2IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNDgKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCA9IHBvb2xBbGdvU3Rha2VkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJZnJhbWVfZGlnIDIgLy8gcG9vbEFsZ29TdGFrZWQ6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gKmlmMzVfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTUxCgkvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yCglmcmFtZV9kaWcgLTQgLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbGVhbgoJYnogKmlmMzVfZW5kCgoJLy8gKmlmMzVfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE1MgoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsU3Rha2VycyArPSAxCglpbnQgMjQ0CglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWludCAxCgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCippZjM1X2VuZDoKCS8vICppZjM2X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE1NAoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sCglmcmFtZV9kaWcgLTUgLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sZWFuCglieiAqaWYzNl9lbmQKCgkvLyAqaWYzNl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTU1CgkvLyB0aGlzLm51bVN0YWtlcnMudmFsdWUgKz0gMQoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJYXBwX2dsb2JhbF9nZXQKCWludCAxCgkrCglieXRlIDB4NmU3NTZkNTM3NDYxNmI2NTcyNzMgLy8gIm51bVN0YWtlcnMiCglzd2FwCglhcHBfZ2xvYmFsX3B1dAoKKmlmMzZfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE1NwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsQWxnb1N0YWtlZCArPSBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWludCAyNTIKCWR1cAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4bgoJZ3R4bnMgQW1vdW50CglmcmFtZV9kaWcgLTMgLy8gbWJyQW10UGFpZDogdWludDY0CgktCgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTU4CgkvLyB0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSArPSBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCWFwcF9nbG9iYWxfZ2V0CglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBBbW91bnQKCWZyYW1lX2RpZyAtMyAvLyBtYnJBbXRQYWlkOiB1aW50NjQKCS0KCSsKCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCXN3YXAKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIHVwZGF0ZVN0YWtlclBvb2xTZXQoc3Rha2VyOiBBZGRyZXNzLCBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5KTogdm9pZAp1cGRhdGVTdGFrZXJQb29sU2V0OgoJcHJvdG8gMiAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjIKCS8vIGFzc2VydCh0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS5leGlzdHMpCglieXRlIDB4NzM3MDczIC8vICJzcHMiCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE2NAoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDAgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjUKCS8vIGZpcnN0RW1wdHkgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjYKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoKKmZvcl83OgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE2NgoJLy8gaSA8IHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlLmxlbmd0aAoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl83X2VuZAoKCS8vICppZjM3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE2NwoJLy8gcG9vbFNldFtpXSA9PT0gcG9vbEtleQoJZnJhbWVfZGlnIDAgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDI0CglleHRyYWN0MwoJZnJhbWVfZGlnIC0yIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCT09CglieiAqaWYzN19lbmQKCgkvLyAqaWYzN19jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTY5CgkvLyByZXR1cm4KCXJldHN1YgoKKmlmMzdfZW5kOgoJLy8gKmlmMzhfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTcxCgkvLyBmaXJzdEVtcHR5ID09PSAwICYmIHBvb2xTZXRbaV0uaWQgPT09IDAKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDAKCT09CglkdXAKCWJ6ICpza2lwX2FuZDkKCWZyYW1lX2RpZyAwIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgk9PQoJJiYKCipza2lwX2FuZDk6CglieiAqaWYzOF9lbmQKCgkvLyAqaWYzOF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTcyCgkvLyBmaXJzdEVtcHR5ID0gaSArIDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMSAvLyBmaXJzdEVtcHR5OiB1aW50NjQKCippZjM4X2VuZDoKCipmb3JfN19jb250aW51ZToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjYKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzcKCipmb3JfN19lbmQ6CgkvLyAqaWYzOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNzUKCS8vIGZpcnN0RW1wdHkgPT09IDAKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDAKCT09CglieiAqaWYzOV9lbmQKCgkvLyAqaWYzOV9jb25zZXF1ZW50CgkvLyBObyBlbXB0eSBzbG90IGF2YWlsYWJsZSBpbiB0aGUgc3Rha2VyIHBvb2wgc2V0CgllcnIKCippZjM5X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNzgKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlW2ZpcnN0RW1wdHkgLSAxXSA9IHBvb2xLZXkKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDEKCS0KCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyByZW1vdmVGcm9tU3Rha2VyUG9vbFNldChzdGFrZXI6IEFkZHJlc3MsIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkpOiBbYm9vbGVhbiwgYm9vbGVhbl0KLy8KLy8gUmVtb3ZlcyBhIHBvb2wga2V5IGZyb20gdGhlIHN0YWtlcidzIGFjdGl2ZSBwb29sIHNldCAtIGZhaWxzIGlmIG5vdCBmb3VuZCAoISkKLy8KLy8gQHBhcmFtIHtBZGRyZXNzfSBzdGFrZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgc3Rha2VyLgovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBUaGUgcG9vbCBrZXkgdGhleSBzaG91bGQgYmUgc3RvcmVkIGluCi8vCi8vIEByZXR1cm4gW2Jvb2xlYW4sIGJvb2xlYW5dIFtpcyB0aGUgc3Rha2VyIGdvbmUgZnJvbSBBTEwgcG9vbHMgb2YgdGhlIGdpdmVuIFZBTElEQVRPUiwgYW5kIGlzIHN0YWtlciBnb25lIGZyb20gQUxMIHBvb2xzXQpyZW1vdmVGcm9tU3Rha2VyUG9vbFNldDoKCXByb3RvIDIgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTkxCgkvLyBpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAwIC8vIGluU2FtZVZhbGlkYXRvclBvb2xDb3VudDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5MgoJLy8gaW5BbnlQb29sQ291bnQgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAxIC8vIGluQW55UG9vbENvdW50OiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTkzCgkvLyBmb3VuZCA9IGZhbHNlCglpbnQgMAoJZnJhbWVfYnVyeSAyIC8vIGZvdW5kOiBib29sCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5NQoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExOTYKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoKKmZvcl84OgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5NgoJLy8gaSA8IHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlLmxlbmd0aAoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl84X2VuZAoKCS8vICppZjQwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5NwoJLy8gcG9vbFNldFtpXS5pZCA9PT0gMAoJZnJhbWVfZGlnIDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWY0MF9lbmQKCgkvLyAqaWY0MF9jb25zZXF1ZW50CgliICpmb3JfOF9jb250aW51ZQoKKmlmNDBfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwMAoJLy8gaW5BbnlQb29sQ291bnQgKz0gMQoJZnJhbWVfZGlnIDEgLy8gaW5BbnlQb29sQ291bnQ6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMSAvLyBpbkFueVBvb2xDb3VudDogdWludDY0CgoJLy8gKmlmNDFfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjAxCgkvLyBwb29sU2V0W2ldLmlkID09PSBwb29sS2V5LmlkCglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgMAoJKwoJaW50IDgKCWV4dHJhY3QzCglidG9pCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCT09CglieiAqaWY0MV9lbmQKCgkvLyAqaWY0MV9jb25zZXF1ZW50CgkvLyAqaWY0Ml9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDIKCS8vIHBvb2xTZXRbaV0gPT09IHBvb2xLZXkKCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5Cgk9PQoJYnogKmlmNDJfZWxzZQoKCS8vICppZjQyX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDMKCS8vIGZvdW5kID0gdHJ1ZQoJaW50IDEKCWZyYW1lX2J1cnkgMiAvLyBmb3VuZDogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDUKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlW2ldID0geyBpZDogMCwgcG9vbElkOiAwLCBwb29sQXBwSWQ6IDAgfQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJYiAqaWY0Ml9lbmQKCippZjQyX2Vsc2U6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjA3CgkvLyBpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgKz0gMQoJZnJhbWVfZGlnIDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCippZjQyX2VuZDoKCippZjQxX2VuZDoKCipmb3JfOF9jb250aW51ZToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExOTYKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzgKCipmb3JfOF9lbmQ6CgkvLyAqaWY0M19jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMTEKCS8vICFmb3VuZAoJZnJhbWVfZGlnIDIgLy8gZm91bmQ6IGJvb2wKCSEKCWJ6ICppZjQzX2VuZAoKCS8vICppZjQzX2NvbnNlcXVlbnQKCS8vIE5vIG1hdGNoaW5nIHNsb3QgZm91bmQgd2hlbiB0b2xkIHRvIHJlbW92ZSBhIHBvb2wgZnJvbSB0aGUgc3Rha2VycyBzZXQKCWVycgoKKmlmNDNfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIxNQoJLy8gcmV0dXJuIFtpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgPT09IDAsIGluQW55UG9vbENvdW50ID09PSAwXQoJYnl0ZSAweDAwCglpbnQgMAoJZnJhbWVfZGlnIDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCWludCAwCgk9PQoJc2V0Yml0CglpbnQgMQoJZnJhbWVfZGlnIDEgLy8gaW5BbnlQb29sQ291bnQ6IHVpbnQ2NAoJaW50IDAKCT09CglzZXRiaXQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCgkvLyBwb3AgYWxsIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHRoZSBzdGFjawoJcG9wbiA0CglyZXRzdWIKCi8vIGFkZFBvb2xUb05vZGUodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcG9vbEFwcElkOiB1aW50NjQsIG5vZGVOdW06IHVpbnQ2NCk6IHZvaWQKYWRkUG9vbFRvTm9kZToKCXByb3RvIDMgMAoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjE5CgkvLyBub2RlUG9vbEFzc2lnbm1lbnRzID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5ub2RlUG9vbEFzc2lnbm1lbnRzKQoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfYnVyeSAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjIwCgkvLyBtYXhQb29sc1Blck5vZGVGb3JUaGlzVmFsaWRhdG9yID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcucG9vbHNQZXJOb2RlIGFzIHVpbnQ2NAoJaW50IDIyNQoJaW50IDEKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDEgLy8gbWF4UG9vbHNQZXJOb2RlRm9yVGhpc1ZhbGlkYXRvcjogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIyMgoJLy8gYXNzZXJ0KG5vZGVOdW0gPj0gMSAmJiBub2RlTnVtIDw9IE1BWF9OT0RFUywgJ25vZGUgbnVtYmVyIG5vdCBpbiB2YWxpZCByYW5nZScpCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgMQoJPj0KCWR1cAoJYnogKnNraXBfYW5kMTAKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCA4Cgk8PQoJJiYKCipza2lwX2FuZDEwOgoJLy8gbm9kZSBudW1iZXIgbm90IGluIHZhbGlkIHJhbmdlCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI0CgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IG1heFBvb2xzUGVyTm9kZUZvclRoaXNWYWxpZGF0b3I7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzk6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI0CgkvLyBpIDwgbWF4UG9vbHNQZXJOb2RlRm9yVGhpc1ZhbGlkYXRvcgoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglmcmFtZV9kaWcgMSAvLyBtYXhQb29sc1Blck5vZGVGb3JUaGlzVmFsaWRhdG9yOiB1aW50NjQKCTwKCWJ6ICpmb3JfOV9lbmQKCgkvLyAqaWY0NF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMjUKCS8vIG5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbbm9kZU51bSAtIDFdLnBvb2xBcHBJZHNbaV0gPT09IDAKCWZyYW1lX2RpZyAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCWludCAwCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgMQoJLQoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWY0NF9lbmQKCgkvLyAqaWY0NF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI3CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLm5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbbm9kZU51bSAtIDFdLnBvb2xBcHBJZHNbaV0gPSBwb29sQXBwSWQKCWludCA5MDAKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCAxCgktCglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDAKCSsKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJZnJhbWVfZGlnIC0yIC8vIHBvb2xBcHBJZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMjgKCS8vIHJldHVybgoJcmV0c3ViCgoqaWY0NF9lbmQ6CgoqZm9yXzlfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI0CgkvLyBpICs9IDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCWIgKmZvcl85CgoqZm9yXzlfZW5kOgoJLy8gbm8gYXZhaWxhYmxlIHNwYWNlIGluIHNwZWNpZmllZCBub2RlIGZvciB0aGlzIHBvb2wKCWVycgoJcmV0c3ViCgovLyBkb2VzU3Rha2VyTWVldEdhdGluZyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQpOiB2b2lkCi8vCi8vIENoZWNrcyBpZiBhIHN0YWtlciBtZWV0cyB0aGUgZ2F0aW5nIHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgYnkgdGhlIHZhbGlkYXRvci4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWx1ZVRvVmVyaWZ5IC0gVGhlIHZhbHVlIHRvIHZlcmlmeSBhZ2FpbnN0IHRoZSBnYXRpbmcgcmVxdWlyZW1lbnRzLgovLyBAcmV0dXJucyB7dm9pZH0gb3IgYXNzZXJ0cyBpZiByZXF1aXJlbWVudHMgbm90IG1ldC4KZG9lc1N0YWtlck1lZXRHYXRpbmc6Cglwcm90byAyIDAKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA4CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI0MgoJLy8gdHlwZSA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLmVudHJ5R2F0aW5nVHlwZQoJaW50IDgwCglpbnQgMQoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMCAvLyB0eXBlOiB1aW50OAoKCS8vICppZjQ1X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI0MwoJLy8gdHlwZSA9PT0gR0FUSU5HX1RZUEVfTk9ORQoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAwCgk9PQoJYnogKmlmNDVfZW5kCgoJLy8gKmlmNDVfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI0NAoJLy8gcmV0dXJuCglyZXRzdWIKCippZjQ1X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNDYKCS8vIHN0YWtlciA9IHRoaXMudHhuLnNlbmRlcgoJdHhuIFNlbmRlcgoJZnJhbWVfYnVyeSAxIC8vIHN0YWtlcjogYWRkcmVzcwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNDcKCS8vIGNvbmZpZyA9IGNsb25lKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnKQoJaW50IDAKCWludCAyNDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglmcmFtZV9idXJ5IDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCgkvLyAqaWY0Nl9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTEKCS8vIHR5cGUgPT09IEdBVElOR19UWVBFX0FTU0VUU19DUkVBVEVEX0JZIHx8CgkvLyAgICAgICAgICAgICB0eXBlID09PSBHQVRJTkdfVFlQRV9BU1NFVF9JRCB8fAoJLy8gICAgICAgICAgICAgdHlwZSA9PT0gR0FUSU5HX1RZUEVfQ1JFQVRFRF9CWV9ORkRfQUREUkVTU0VTCglmcmFtZV9kaWcgMCAvLyB0eXBlOiB1aW50OAoJaW50IDEKCT09CglkdXAKCWJueiAqc2tpcF9vcjQKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMgoJPT0KCXx8Cgoqc2tpcF9vcjQ6CglkdXAKCWJueiAqc2tpcF9vcjUKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMwoJPT0KCXx8Cgoqc2tpcF9vcjU6CglieiAqaWY0Nl9lbmQKCgkvLyAqaWY0Nl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjU1CgkvLyBhc3NlcnQodmFsdWVUb1ZlcmlmeSAhPT0gMCkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWludCAwCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI1NgoJLy8gYmFsUmVxdWlyZWQgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5nYXRpbmdBc3NldE1pbkJhbGFuY2UKCWludCAxNDUKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAzIC8vIGJhbFJlcXVpcmVkOiB1aW50NjQKCgkvLyAqaWY0N19jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTcKCS8vIGJhbFJlcXVpcmVkID09PSAwCglmcmFtZV9kaWcgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0CglpbnQgMAoJPT0KCWJ6ICppZjQ3X2VuZAoKCS8vICppZjQ3X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTgKCS8vIGJhbFJlcXVpcmVkID0gMQoJaW50IDEKCWZyYW1lX2J1cnkgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0CgoqaWY0N19lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjYwCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgc3Rha2VyLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQodmFsdWVUb1ZlcmlmeSkpID49IGJhbFJlcXVpcmVkLAoJLy8gICAgICAgICAgICAgICAgICdtdXN0IGhhdmUgcmVxdWlyZWQgbWluaW11bSBiYWxhbmNlIG9mIHZhbGlkYXRvciBkZWZpbmVkIHRva2VuIHRvIGFkZCBzdGFrZScsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgMSAvLyBzdGFrZXI6IGFkZHJlc3MKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQoJcG9wCglmcmFtZV9kaWcgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0Cgk+PQoKCS8vIG11c3QgaGF2ZSByZXF1aXJlZCBtaW5pbXVtIGJhbGFuY2Ugb2YgdmFsaWRhdG9yIGRlZmluZWQgdG9rZW4gdG8gYWRkIHN0YWtlCglhc3NlcnQKCippZjQ2X2VuZDoKCS8vICppZjQ4X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI2NQoJLy8gdHlwZSA9PT0gR0FUSU5HX1RZUEVfQVNTRVRTX0NSRUFURURfQlkKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMQoJPT0KCWJ6ICppZjQ4X2VuZAoKCS8vICppZjQ4X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNjYKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICBBc3NldElELmZyb21VaW50NjQodmFsdWVUb1ZlcmlmeSkuY3JlYXRvciA9PT0gY29uZmlnLmVudHJ5R2F0aW5nQWRkcmVzcywKCS8vICAgICAgICAgICAgICAgICAnc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgY3JlYXRlZCBieSBjcmVhdG9yIHRoYXQgdGhlIHZhbGlkYXRvciBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UnLAoJLy8gICAgICAgICAgICAgKQoJZnJhbWVfZGlnIC0yIC8vIHZhbHVlVG9WZXJpZnk6IHVpbnQ2NAoJYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKCXBvcAoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgODEgMzIKCT09CgoJLy8gc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgY3JlYXRlZCBieSBjcmVhdG9yIHRoYXQgdGhlIHZhbGlkYXRvciBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UKCWFzc2VydAoKKmlmNDhfZW5kOgoJLy8gKmlmNDlfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjcxCgkvLyB0eXBlID09PSBHQVRJTkdfVFlQRV9BU1NFVF9JRAoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAyCgk9PQoJYnogKmlmNDlfZW5kCgoJLy8gKmlmNDlfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3MgoJLy8gZm91bmQgPSBmYWxzZQoJaW50IDAKCWZyYW1lX2J1cnkgNCAvLyBmb3VuZDogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNzMKCS8vIGNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0cwoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMTEzIDMyCglkdXAKCWZyYW1lX2J1cnkgNSAvLyBjb3B5IG9mIHRoZSBhcnJheSB3ZSBhcmUgaXRlcmF0aW5nIG92ZXIKCWV4dHJhY3QgMCA4CglidG9pCglmcmFtZV9idXJ5IDYgLy8gYXNzZXRJZDogdWludDY0CglpbnQgMAoJZnJhbWVfYnVyeSA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCgoqZm9yT2ZfMDoKCS8vICppZjUwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3NAoJLy8gdmFsdWVUb1ZlcmlmeSA9PT0gYXNzZXRJZAoJZnJhbWVfZGlnIC0yIC8vIHZhbHVlVG9WZXJpZnk6IHVpbnQ2NAoJZnJhbWVfZGlnIDYgLy8gYXNzZXRJZDogdWludDY0Cgk9PQoJYnogKmlmNTBfZW5kCgoJLy8gKmlmNTBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3NQoJLy8gZm91bmQgPSB0cnVlCglpbnQgMQoJZnJhbWVfYnVyeSA0IC8vIGZvdW5kOiBib29sCgliICpmb3JPZl8wX2VuZAoKKmlmNTBfZW5kOgoKKmZvck9mXzBfY29udGludWU6CgkvLyBpbmNyZW1lbnQgb2Zmc2V0IGFuZCBsb29wIGlmIG5vdCBvdXQgb2YgYm91bmRzCglmcmFtZV9kaWcgNyAvLyB0aGUgb2Zmc2V0IHdlIGFyZSBleHRyYWN0aW5nIHRoZSBuZXh0IGVsZW1lbnQgZnJvbQoJaW50IDgKCSsKCWR1cAoJaW50IDMyIC8vIG9mZnNldCBvZiBsYXN0IGVsZW1lbnQKCTwKCWJ6ICpmb3JPZl8wX2VuZAoJZnJhbWVfYnVyeSA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCglmcmFtZV9kaWcgNSAvLyBjb3B5IG9mIHRoZSBhcnJheSB3ZSBhcmUgaXRlcmF0aW5nIG92ZXIKCWZyYW1lX2RpZyA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCglpbnQgOAoJZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSA2IC8vIGFzc2V0SWQ6IHVpbnQ2NAoJYiAqZm9yT2ZfMAoKKmZvck9mXzBfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3OQoJLy8gYXNzZXJ0KGZvdW5kLCAnc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgaWRlbnRpY2FsIHRvIHRoZSBhc3NldCBpZCBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UnKQoJZnJhbWVfZGlnIDQgLy8gZm91bmQ6IGJvb2wKCgkvLyBzcGVjaWZpZWQgYXNzZXQgbXVzdCBiZSBpZGVudGljYWwgdG8gdGhlIGFzc2V0IGlkIGRlZmluZWQgYXMgYSByZXF1aXJlbWVudCB0byBzdGFrZQoJYXNzZXJ0CgoqaWY0OV9lbmQ6CgkvLyAqaWY1MV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyODEKCS8vIHR5cGUgPT09IEdBVElOR19UWVBFX0NSRUFURURfQllfTkZEX0FERFJFU1NFUwoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAzCgk9PQoJYnogKmlmNTFfZW5kCgoJLy8gKmlmNTFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI4NAoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIHRoaXMuaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0KGNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0c1swXSwgQXNzZXRJRC5mcm9tVWludDY0KHZhbHVlVG9WZXJpZnkpLmNyZWF0b3IpLAoJLy8gICAgICAgICAgICAgICAgICdzcGVjaWZpZWQgYXNzZXQgbXVzdCBiZSBjcmVhdGVkIGJ5IGNyZWF0b3IgdGhhdCBpcyBvbmUgb2YgdGhlIGxpbmtlZCBhZGRyZXNzZXMgaW4gYW4gbmZkJywKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCglwb3AKCWZyYW1lX2RpZyAyIC8vIGNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCglleHRyYWN0IDExMyA4CglidG9pCgljYWxsc3ViIGlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdAoKCS8vIHNwZWNpZmllZCBhc3NldCBtdXN0IGJlIGNyZWF0ZWQgYnkgY3JlYXRvciB0aGF0IGlzIG9uZSBvZiB0aGUgbGlua2VkIGFkZHJlc3NlcyBpbiBhbiBuZmQKCWFzc2VydAoKKmlmNTFfZW5kOgoJLy8gKmlmNTJfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjg5CgkvLyB0eXBlID09PSBHQVRJTkdfVFlQRV9TRUdNRU5UX09GX05GRAoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCA0Cgk9PQoJYnogKmlmNTJfZW5kCgoJLy8gKmlmNTJfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI5MQoJLy8gdXNlck9mZmVyZWRORkRBcHBJRCA9IHZhbHVlVG9WZXJpZnkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWZyYW1lX2J1cnkgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjkyCgkvLyBhc3NlcnQodGhpcy5pc05GREFwcElEVmFsaWQodXNlck9mZmVyZWRORkRBcHBJRCksICdwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZCcpCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWNhbGxzdWIgaXNORkRBcHBJRFZhbGlkCgoJLy8gcHJvdmlkZWQgTkZEIG11c3QgYmUgdmFsaWQKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyOTUKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICByYXdCeXRlcyhBcHBJRC5mcm9tVWludDY0KHVzZXJPZmZlcmVkTkZEQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzKSA9PT0KCS8vICAgICAgICAgICAgICAgICAgICAgcmF3Qnl0ZXMoc3Rha2VyKSB8fCB0aGlzLmlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdCh1c2VyT2ZmZXJlZE5GREFwcElELCBzdGFrZXIpLAoJLy8gICAgICAgICAgICAgICAgICJwcm92aWRlZCBuZmQgZm9yIGVudHJ5IGlzbid0IG93bmVkIG9yIGxpbmtlZCB0byB0aGUgc3Rha2VyIiwKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyA4IC8vIHVzZXJPZmZlcmVkTkZEQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQodXNlck9mZmVyZWRORkRBcHBJRCkuZ2xvYmFsU3RhdGUoJ2kub3duZXIuYScpCglhc3NlcnQKCWZyYW1lX2RpZyAxIC8vIHN0YWtlcjogYWRkcmVzcwoJPT0KCWR1cAoJYm56ICpza2lwX29yNgoJZnJhbWVfZGlnIDEgLy8gc3Rha2VyOiBhZGRyZXNzCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWNhbGxzdWIgaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0Cgl8fAoKKnNraXBfb3I2OgoJLy8gcHJvdmlkZWQgbmZkIGZvciBlbnRyeSBpc24ndCBvd25lZCBvciBsaW5rZWQgdG8gdGhlIHN0YWtlcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMwMgoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIGJ0b2koQXBwSUQuZnJvbVVpbnQ2NCh1c2VyT2ZmZXJlZE5GREFwcElEKS5nbG9iYWxTdGF0ZSgnaS5wYXJlbnRBcHBJRCcpIGFzIGJ5dGVzKSA9PT0KCS8vICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmVudHJ5R2F0aW5nQXNzZXRzWzBdLAoJLy8gICAgICAgICAgICAgICAgICdzcGVjaWZpZWQgbmZkIG11c3QgYmUgYSBzZWdtZW50IG9mIHRoZSBuZmQgdGhlIHZhbGlkYXRvciBzcGVjaWZpZWQgYXMgYSByZXF1aXJlbWVudCcsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWJ5dGUgMHg2OTJlNzA2MTcyNjU2ZTc0NDE3MDcwNDk0NCAvLyAiaS5wYXJlbnRBcHBJRCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHVzZXJPZmZlcmVkTkZEQXBwSUQpLmdsb2JhbFN0YXRlKCdpLnBhcmVudEFwcElEJykKCWFzc2VydAoJYnRvaQoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMTEzIDgKCWJ0b2kKCT09CgoJLy8gc3BlY2lmaWVkIG5mZCBtdXN0IGJlIGEgc2VnbWVudCBvZiB0aGUgbmZkIHRoZSB2YWxpZGF0b3Igc3BlY2lmaWVkIGFzIGEgcmVxdWlyZW1lbnQKCWFzc2VydAoKKmlmNTJfZW5kOgoJcmV0c3ViCgovLyBpc05GREFwcElEVmFsaWQobmZkQXBwSUQ6IHVpbnQ2NCk6IGJvb2xlYW4KLy8KLy8gQ2hlY2tzIGlmIHRoZSBnaXZlbiBORkQgQXBwIGlkIGlzIHZhbGlkLiAgVXNpbmcgb25seSB0aGUgQXBwIGlkIHRoZXJlJ3Mgbm8gdmFsaWRhdGlvbiBhZ2FpbnN0IHRoZSBuYW1lIChpZTogdGhhdCBuZmQgWCBpcyBuYW1lIFkpCi8vIFNvIGl0J3MgYXNzdW1lZCBmb3IgdGhlIGNhbGxlciwgdGhlIGFwcCBpZCBhbG9uZSBpcyBmaW5lLiAgVGhlIG5hbWUgaXMgZmV0Y2hlZCBmcm9tIHRoZSBzcGVjaWZpZWQgYXBwIGlkIGFuZCB0aGUgdHdvCi8vIHRvZ2V0aGVyIGFyZSB1c2VkIGZvciB2YWxpZGl0eSBjaGVjayBjYWxsIHRvIHRoZSBuZmQgcmVnaXN0cnkuCi8vCi8vIEBwYXJhbSB7dWludDY0fSBuZmRBcHBJRCAtIFRoZSBORkQgQXBwIGlkIHRvIHZlcmlmeS4KLy8KLy8gQHJldHVybnMge2Jvb2xlYW59IC0gUmV0dXJucyB0cnVlIGlmIHRoZSBORkQgQXBwIGlkIGlzIHZhbGlkLCBvdGhlcndpc2UgZmFsc2UuCmlzTkZEQXBwSURWYWxpZDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMyMQoJLy8gdXNlck9mZmVyZWRORkROYW1lID0gQXBwSUQuZnJvbVVpbnQ2NChuZmRBcHBJRCkuZ2xvYmFsU3RhdGUoJ2kubmFtZScpIGFzIHN0cmluZwoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWJ5dGUgMHg2OTJlNmU2MTZkNjUgLy8gImkubmFtZSIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KG5mZEFwcElEKS5nbG9iYWxTdGF0ZSgnaS5uYW1lJykKCWFzc2VydAoJZnJhbWVfYnVyeSAwIC8vIHVzZXJPZmZlcmVkTkZETmFtZTogc3RyaW5nCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMyMwoJLy8gcmV0dXJuIHNlbmRNZXRob2RDYWxsPFtzdHJpbmcsIHVpbnQ2NF0sIGJvb2xlYW4+KHsKCS8vICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQodGhpcy5uZmRSZWdpc3RyeUFwcElkKSwKCS8vICAgICAgICAgICAgIG5hbWU6ICdpc1ZhbGlkTmZkQXBwSWQnLAoJLy8gICAgICAgICAgICAgbWV0aG9kQXJnczogW3VzZXJPZmZlcmVkTkZETmFtZSwgbmZkQXBwSURdLAoJLy8gICAgICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAiaXNWYWxpZE5mZEFwcElkKHN0cmluZyx1aW50NjQpYm9vbCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMyNAoJLy8gYXBwbGljYXRpb25JRDogQXBwSUQuZnJvbVVpbnQ2NCh0aGlzLm5mZFJlZ2lzdHJ5QXBwSWQpCglsb2FkIDIwMCAvLyBUTVBMX25mZFJlZ2lzdHJ5QXBwSWQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMjYKCS8vIG1ldGhvZEFyZ3M6IFt1c2VyT2ZmZXJlZE5GRE5hbWUsIG5mZEFwcElEXQoJZnJhbWVfZGlnIDAgLy8gdXNlck9mZmVyZWRORkROYW1lOiBzdHJpbmcKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoJaXR4biBOdW1Mb2dzCglpbnQgMQoJLQoJaXR4bmFzIExvZ3MKCWV4dHJhY3QgNCAwCglpbnQgMAoJZ2V0Yml0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCglyZXRzdWIKCi8vIGlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdChuZmRBcHBJRDogdWludDY0LCBhZGRyVG9GaW5kOiBBZGRyZXNzKTogYm9vbGVhbgovLwovLyBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBhZGRyZXNzIGlzIHByZXNlbnQgaW4gYW4gTkZEcyBsaXN0IG9mIHZlcmlmaWVkIGFkZHJlc3Nlcy4KLy8gVGhlIE5GRCBpcyBhc3N1bWVkIHRvIGhhdmUgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcyBvZmZpY2lhbC4KLy8KLy8gQHBhcmFtIHt1aW50NjR9IG5mZEFwcElEIC0gVGhlIE5GRCBhcHBsaWNhdGlvbiBpZC4KLy8gQHBhcmFtIHtBZGRyZXNzfSBhZGRyVG9GaW5kIC0gVGhlIGFkZHJlc3MgdG8gZmluZCBpbiB0aGUgdi5jYUFsZ28uMC5hcyBwcm9wZXJ0eQovLyBAcmV0dXJuIHtib29sZWFufSAtIGB0cnVlYCBpZiB0aGUgYWRkcmVzcyBpcyBwcmVzZW50LCBgZmFsc2VgIG90aGVyd2lzZS4KaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0OgoJcHJvdG8gMiAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMzkKCS8vIHNlbmRBcHBDYWxsKHsKCS8vICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLAoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25BcmdzOiBbJ3JlYWRfcHJvcGVydHknLCAndi5jYUFsZ28uMC5hcyddLAoJLy8gICAgICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzQwCgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KG5mZEFwcElEKQoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDEKCS8vIGFwcGxpY2F0aW9uQXJnczogWydyZWFkX3Byb3BlcnR5JywgJ3YuY2FBbGdvLjAuYXMnXQoJYnl0ZSAweDcyNjU2MTY0NWY3MDcyNmY3MDY1NzI3NDc5IC8vICJyZWFkX3Byb3BlcnR5IgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWJ5dGUgMHg3NjJlNjM2MTQxNmM2NzZmMmUzMDJlNjE3MyAvLyAidi5jYUFsZ28uMC5hcyIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDMKCS8vIGNhQWxnb0RhdGEgPSB0aGlzLml0eG4ubGFzdExvZwoJaXR4biBMYXN0TG9nCglmcmFtZV9idXJ5IDAgLy8gY2FBbGdvRGF0YTogYnl0ZVtdCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM0NAoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBjYUFsZ29EYXRhLmxlbmd0aDsgaSArPSAzMikKCWludCAwCglmcmFtZV9idXJ5IDEgLy8gaTogdWludDY0CgoqZm9yXzEwOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM0NAoJLy8gaSA8IGNhQWxnb0RhdGEubGVuZ3RoCglmcmFtZV9kaWcgMSAvLyBpOiB1aW50NjQKCWZyYW1lX2RpZyAwIC8vIGNhQWxnb0RhdGE6IGJ5dGVbXQoJbGVuCgk8CglieiAqZm9yXzEwX2VuZAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDUKCS8vIGFkZHIgPSBleHRyYWN0MyhjYUFsZ29EYXRhLCBpLCAzMikKCWZyYW1lX2RpZyAwIC8vIGNhQWxnb0RhdGE6IGJ5dGVbXQoJZnJhbWVfZGlnIDEgLy8gaTogdWludDY0CglpbnQgMzIKCWV4dHJhY3QzCglmcmFtZV9idXJ5IDIgLy8gYWRkcjogYnl0ZVtdCgoJLy8gKmlmNTNfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzQ2CgkvLyBhZGRyICE9PSByYXdCeXRlcyhnbG9iYWxzLnplcm9BZGRyZXNzKSAmJiBhZGRyID09PSByYXdCeXRlcyhhZGRyVG9GaW5kKQoJZnJhbWVfZGlnIDIgLy8gYWRkcjogYnl0ZVtdCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CglkdXAKCWJ6ICpza2lwX2FuZDExCglmcmFtZV9kaWcgMiAvLyBhZGRyOiBieXRlW10KCWZyYW1lX2RpZyAtMiAvLyBhZGRyVG9GaW5kOiBBZGRyZXNzCgk9PQoJJiYKCipza2lwX2FuZDExOgoJYnogKmlmNTNfZW5kCgoJLy8gKmlmNTNfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM0NwoJLy8gcmV0dXJuIHRydWUKCWludCAxCgliICppc0FkZHJlc3NJbk5GRENBQWxnb0xpc3QqcmV0dXJuCgoqaWY1M19lbmQ6CgoqZm9yXzEwX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM0NAoJLy8gaSArPSAzMgoJZnJhbWVfZGlnIDEgLy8gaTogdWludDY0CglpbnQgMzIKCSsKCWZyYW1lX2J1cnkgMSAvLyBpOiB1aW50NjQKCWIgKmZvcl8xMAoKKmZvcl8xMF9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzUwCgkvLyByZXR1cm4gZmFsc2UKCWludCAwCgoqaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0KnJldHVybjoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDIKCXJldHN1YgoKLy8gYWxnb1NhdHVyYXRpb25MZXZlbCgpOiB1aW50NjQKLy8KLy8gUmV0dXJucyB0aGUgbWF4aW11bSBhbGxvd2VkIHN0YWtlIHBlciB2YWxpZGF0b3IgYmFzZWQgb24gYSBwZXJjZW50YWdlIG9mIGFsbCBjdXJyZW50IG9ubGluZSBzdGFrZSBiZWZvcmUKLy8gdGhlIHZhbGlkYXRvciBpcyBjb25zaWRlcmVkIHNhdHVyYXRlZCAtIHdoZXJlIHJld2FyZHMgYXJlIGRpbWluaXNoZWQuCi8vIE5PVEU6IHRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCB0d2ljZSAtIGhlcmUgYW5kIGluIHN0YWtpbmcgcG9vbCBjb250cmFjdC4gIEJvdGggbXVzdCBiZSBpZGVudGljYWwuCmFsZ29TYXR1cmF0aW9uTGV2ZWw6Cglwcm90byAwIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNTkKCS8vIG9ubGluZSA9IHRoaXMuZ2V0Q3VycmVudE9ubGluZVN0YWtlKCkKCWNhbGxzdWIgZ2V0Q3VycmVudE9ubGluZVN0YWtlCglmcmFtZV9idXJ5IDAgLy8gb25saW5lOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzYxCgkvLyByZXR1cm4gd2lkZVJhdGlvKFtvbmxpbmUsIE1BWF9WQUxJREFUT1JfU09GVF9QQ1RfT0ZfT05MSU5FXzFERUNJTUFMXSwgWzEwMDBdKQoJZnJhbWVfZGlnIDAgLy8gb25saW5lOiB1aW50NjQKCWludCAxMDAKCW11bHcKCWludCAwCglpbnQgMTAwMAoJZGl2bW9kdwoJcG9wCglwb3AKCXN3YXAKCSEKCgkvLyB3aWRlUmF0aW8gZmFpbGVkCglhc3NlcnQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gbWF4QWxsb3dlZFN0YWtlKCk6IHVpbnQ2NAovLwovLyBSZXR1cm5zIHRoZSBNQVhJTVVNIGFsbG93ZWQgc3Rha2UgcGVyIHZhbGlkYXRvciBiYXNlZCBvbiBhIHBlcmNlbnRhZ2Ugb2YgYWxsIGN1cnJlbnQgb25saW5lIHN0YWtlLgovLyBBZGRpbmcgc3Rha2UgaXMgY29tcGxldGVseSBibG9ja2VkIGF0IHRoaXMgYW1vdW50LgptYXhBbGxvd2VkU3Rha2U6Cglwcm90byAwIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNjkKCS8vIG9ubGluZSA9IHRoaXMuZ2V0Q3VycmVudE9ubGluZVN0YWtlKCkKCWNhbGxzdWIgZ2V0Q3VycmVudE9ubGluZVN0YWtlCglmcmFtZV9idXJ5IDAgLy8gb25saW5lOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzcxCgkvLyByZXR1cm4gd2lkZVJhdGlvKFtvbmxpbmUsIE1BWF9WQUxJREFUT1JfSEFSRF9QQ1RfT0ZfT05MSU5FXzFERUNJTUFMXSwgWzEwMDBdKQoJZnJhbWVfZGlnIDAgLy8gb25saW5lOiB1aW50NjQKCWludCAxNTAKCW11bHcKCWludCAwCglpbnQgMTAwMAoJZGl2bW9kdwoJcG9wCglwb3AKCXN3YXAKCSEKCgkvLyB3aWRlUmF0aW8gZmFpbGVkCglhc3NlcnQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gbWF4QWxnb0FsbG93ZWRQZXJQb29sKCk6IHVpbnQ2NAovLwovLyBSZXR1cm5zIHRoZSBNQVhJTVVNIGFsbG93ZWQgc3Rha2UgcGVyIHBvb2wgYW5kIHN0aWxsIHJlY2VpdmUgaW5jZW50aXZlcyAtIHdlJ2xsIHRyZWF0IHRoaXMgYXMgdGhlICdtYXggcGVyIHBvb2wnCm1heEFsZ29BbGxvd2VkUGVyUG9vbDoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNzgKCS8vIHJldHVybiBnbG9iYWxzLnBheW91dHNNYXhCYWxhbmNlCglnbG9iYWwgUGF5b3V0c01heEJhbGFuY2UKCXJldHN1YgoKLy8gZ2V0Q3VycmVudE9ubGluZVN0YWtlKCk6IHVpbnQ2NApnZXRDdXJyZW50T25saW5lU3Rha2U6Cglwcm90byAwIDEKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzgyCgkvLyByZXR1cm4gb25saW5lU3Rha2UoKQoJb25saW5lX3N0YWtlCglyZXRzdWIKCi8vIG1pbkJhbGFuY2VGb3JBY2NvdW50KGNvbnRyYWN0czogdWludDY0LCBleHRyYVBhZ2VzOiB1aW50NjQsIGFzc2V0czogdWludDY0LCBsb2NhbEludHM6IHVpbnQ2NCwgbG9jYWxCeXRlczogdWludDY0LCBnbG9iYWxJbnRzOiB1aW50NjQsIGdsb2JhbEJ5dGVzOiB1aW50NjQpOiB1aW50NjQKbWluQmFsYW5jZUZvckFjY291bnQ6Cglwcm90byA3IDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzOTQKCS8vIG1pbkJhbCA9IEFMR09SQU5EX0FDQ09VTlRfTUlOX0JBTEFOQ0UKCWludCAxMDAwMDAKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzOTUKCS8vIG1pbkJhbCArPSBjb250cmFjdHMgKiBBUFBMSUNBVElPTl9CQVNFX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyBjb250cmFjdHM6IHVpbnQ2NAoJaW50IDEwMDAwMAoJKgoJKwoJZnJhbWVfYnVyeSAwIC8vIG1pbkJhbDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM5NgoJLy8gbWluQmFsICs9IGV4dHJhUGFnZXMgKiBBUFBMSUNBVElPTl9CQVNFX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyBleHRyYVBhZ2VzOiB1aW50NjQKCWludCAxMDAwMDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzOTcKCS8vIG1pbkJhbCArPSBhc3NldHMgKiBBU1NFVF9IT0xESU5HX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMyAvLyBhc3NldHM6IHVpbnQ2NAoJaW50IDEwMDAwMAoJKgoJKwoJZnJhbWVfYnVyeSAwIC8vIG1pbkJhbDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM5OAoJLy8gbWluQmFsICs9IGxvY2FsSW50cyAqIFNTQ19WQUxVRV9VSU5UCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoJZnJhbWVfZGlnIC00IC8vIGxvY2FsSW50czogdWludDY0CglpbnQgMjg1MDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzOTkKCS8vIG1pbkJhbCArPSBnbG9iYWxJbnRzICogU1NDX1ZBTFVFX1VJTlQKCWZyYW1lX2RpZyAwIC8vIG1pbkJhbDogdWludDY0CglmcmFtZV9kaWcgLTYgLy8gZ2xvYmFsSW50czogdWludDY0CglpbnQgMjg1MDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDAKCS8vIG1pbkJhbCArPSBsb2NhbEJ5dGVzICogU1NDX1ZBTFVFX0JZVEVTCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoJZnJhbWVfZGlnIC01IC8vIGxvY2FsQnl0ZXM6IHVpbnQ2NAoJaW50IDUwMDAwCgkqCgkrCglmcmFtZV9idXJ5IDAgLy8gbWluQmFsOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDAxCgkvLyBtaW5CYWwgKz0gZ2xvYmFsQnl0ZXMgKiBTU0NfVkFMVUVfQllURVMKCWZyYW1lX2RpZyAwIC8vIG1pbkJhbDogdWludDY0CglmcmFtZV9kaWcgLTcgLy8gZ2xvYmFsQnl0ZXM6IHVpbnQ2NAoJaW50IDUwMDAwCgkqCgkrCglmcmFtZV9idXJ5IDAgLy8gbWluQmFsOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDAyCgkvLyByZXR1cm4gbWluQmFsCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoJcmV0c3ViCgovLyBjb3N0Rm9yQm94U3RvcmFnZSh0b3RhbE51bUJ5dGVzOiB1aW50NjQpOiB1aW50NjQKY29zdEZvckJveFN0b3JhZ2U6Cglwcm90byAxIDEKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDA5CgkvLyByZXR1cm4gU0NCT1hfUEVSQk9YICsgdG90YWxOdW1CeXRlcyAqIFNDQk9YX1BFUkJZVEUKCWludCAyNTAwCglmcmFtZV9kaWcgLTEgLy8gdG90YWxOdW1CeXRlczogdWludDY0CglpbnQgNDAwCgkqCgkrCglyZXRzdWIKCipjcmVhdGVfTm9PcDoKCW1ldGhvZCAiY3JlYXRlQXBwbGljYXRpb24oKXZvaWQiCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAwCgltYXRjaCAqYWJpX3JvdXRlX2NyZWF0ZUFwcGxpY2F0aW9uCgoJLy8gdGhpcyBjb250cmFjdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGdpdmVuIEFCSSBtZXRob2QgZm9yIGNyZWF0ZSBOb09wCgllcnIKCipjYWxsX05vT3A6CgltZXRob2QgImluaXRTdGFraW5nQ29udHJhY3QodWludDY0KXZvaWQiCgltZXRob2QgImxvYWRTdGFraW5nQ29udHJhY3REYXRhKHVpbnQ2NCxieXRlW10pdm9pZCIKCW1ldGhvZCAiZmluYWxpemVTdGFraW5nQ29udHJhY3QoKXZvaWQiCgltZXRob2QgImdhcygpdm9pZCIKCW1ldGhvZCAiZ2V0TWJyQW1vdW50cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCgltZXRob2QgImdldFByb3RvY29sQ29uc3RyYWludHMoKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiZ2V0TnVtVmFsaWRhdG9ycygpdWludDY0IgoJbWV0aG9kICJnZXRWYWxpZGF0b3JDb25maWcodWludDY0KSh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiZ2V0VmFsaWRhdG9yU3RhdGUodWludDY0KSh1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQpIgoJbWV0aG9kICJnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpIgoJbWV0aG9kICJnZXRQb29scyh1aW50NjQpKHVpbnQ2NCx1aW50MTYsdWludDY0KVtdIgoJbWV0aG9kICJnZXRQb29sQXBwSWQodWludDY0LHVpbnQ2NCl1aW50NjQiCgltZXRob2QgImdldFBvb2xJbmZvKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpKHVpbnQ2NCx1aW50MTYsdWludDY0KSIKCW1ldGhvZCAiZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHVpbnQ2NCl1aW50NjQiCgltZXRob2QgImRvZXNTdGFrZXJOZWVkVG9QYXlNQlIoYWRkcmVzcylib29sIgoJbWV0aG9kICJnZXRTdGFrZWRQb29sc0ZvckFjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCx1aW50NjQpW10iCgltZXRob2QgImdldFRva2VuUGF5b3V0UmF0aW8odWludDY0KSh1aW50NjRbMjRdLHVpbnQ2NCkiCgltZXRob2QgImdldE5vZGVQb29sQXNzaWdubWVudHModWludDY0KSgodWludDY0WzNdKVs4XSkiCgltZXRob2QgImdldE5GRFJlZ2lzdHJ5SUQoKXVpbnQ2NCIKCW1ldGhvZCAiYWRkVmFsaWRhdG9yKHBheSxzdHJpbmcsKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIKCW1ldGhvZCAiY2hhbmdlVmFsaWRhdG9yTWFuYWdlcih1aW50NjQsYWRkcmVzcyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQiCgltZXRob2QgImNoYW5nZVZhbGlkYXRvck5GRCh1aW50NjQsdWludDY0LHN0cmluZyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyh1aW50NjQsYWRkcmVzcyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JSZXdhcmRJbmZvKHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0KXZvaWQiCgltZXRob2QgImFkZFBvb2wocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAic2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KSIKCW1ldGhvZCAic3Rha2VVcGRhdGVkVmlhUmV3YXJkcygodWludDY0LHVpbnQ2NCx1aW50NjQpLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIgoJbWV0aG9kICJzdGFrZVJlbW92ZWQoKHVpbnQ2NCx1aW50NjQsdWludDY0KSxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCl2b2lkIgoJbWV0aG9kICJmaW5kUG9vbEZvclN0YWtlcih1aW50NjQsYWRkcmVzcyx1aW50NjQpKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKSIKCW1ldGhvZCAibW92ZVBvb2xUb05vZGUodWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIKCW1ldGhvZCAiZW1wdHlUb2tlblJld2FyZHModWludDY0LGFkZHJlc3MpdWludDY0IgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggKmFiaV9yb3V0ZV9pbml0U3Rha2luZ0NvbnRyYWN0ICphYmlfcm91dGVfbG9hZFN0YWtpbmdDb250cmFjdERhdGEgKmFiaV9yb3V0ZV9maW5hbGl6ZVN0YWtpbmdDb250cmFjdCAqYWJpX3JvdXRlX2dhcyAqYWJpX3JvdXRlX2dldE1ickFtb3VudHMgKmFiaV9yb3V0ZV9nZXRQcm90b2NvbENvbnN0cmFpbnRzICphYmlfcm91dGVfZ2V0TnVtVmFsaWRhdG9ycyAqYWJpX3JvdXRlX2dldFZhbGlkYXRvckNvbmZpZyAqYWJpX3JvdXRlX2dldFZhbGlkYXRvclN0YXRlICphYmlfcm91dGVfZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyICphYmlfcm91dGVfZ2V0UG9vbHMgKmFiaV9yb3V0ZV9nZXRQb29sQXBwSWQgKmFiaV9yb3V0ZV9nZXRQb29sSW5mbyAqYWJpX3JvdXRlX2dldEN1ck1heFN0YWtlUGVyUG9vbCAqYWJpX3JvdXRlX2RvZXNTdGFrZXJOZWVkVG9QYXlNQlIgKmFiaV9yb3V0ZV9nZXRTdGFrZWRQb29sc0ZvckFjY291bnQgKmFiaV9yb3V0ZV9nZXRUb2tlblBheW91dFJhdGlvICphYmlfcm91dGVfZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cyAqYWJpX3JvdXRlX2dldE5GRFJlZ2lzdHJ5SUQgKmFiaV9yb3V0ZV9hZGRWYWxpZGF0b3IgKmFiaV9yb3V0ZV9jaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyICphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyAqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvck5GRCAqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzICphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mbyAqYWJpX3JvdXRlX2FkZFBvb2wgKmFiaV9yb3V0ZV9hZGRTdGFrZSAqYWJpX3JvdXRlX3NldFRva2VuUGF5b3V0UmF0aW8gKmFiaV9yb3V0ZV9zdGFrZVVwZGF0ZWRWaWFSZXdhcmRzICphYmlfcm91dGVfc3Rha2VSZW1vdmVkICphYmlfcm91dGVfZmluZFBvb2xGb3JTdGFrZXIgKmFiaV9yb3V0ZV9tb3ZlUG9vbFRvTm9kZSAqYWJpX3JvdXRlX2VtcHR5VG9rZW5SZXdhcmRzCgoJLy8gdGhpcyBjb250cmFjdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGdpdmVuIEFCSSBtZXRob2QgZm9yIGNhbGwgTm9PcAoJZXJy", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCgovLyBUaGlzIFRFQUwgd2FzIGdlbmVyYXRlZCBieSBURUFMU2NyaXB0IHYwLjEwMy4wCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbGdvcmFuZGZvdW5kYXRpb24vVEVBTFNjcmlwdAoKLy8gVGhpcyBjb250cmFjdCBpcyBjb21wbGlhbnQgd2l0aCBhbmQvb3IgaW1wbGVtZW50cyB0aGUgZm9sbG93aW5nIEFSQ3M6IFsgQVJDNCBdCgovLyBUaGUgZm9sbG93aW5nIGxpbmVzIG9mIFRFQUwgYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0ZW1wbGF0ZSB2YXJpYWJsZXMgaW4gc2NyYXRjaCBzbG90cwpwdXNoYnl0ZXMgVE1QTF9uZmRSZWdpc3RyeUFwcElkCmJ0b2kKc3RvcmUgMjAwCgovLyBUaGUgZm9sbG93aW5nIHRlbiBsaW5lcyBvZiBURUFMIGhhbmRsZSBpbml0aWFsIHByb2dyYW0gZmxvdwovLyBUaGlzIHBhdHRlcm4gaXMgdXNlZCB0byBtYWtlIGl0IGVhc3kgZm9yIGFueW9uZSB0byBwYXJzZSB0aGUgc3RhcnQgb2YgdGhlIHByb2dyYW0gYW5kIGRldGVybWluZSBpZiBhIHNwZWNpZmljIGFjdGlvbiBpcyBhbGxvd2VkCi8vIEhlcmUsIGFjdGlvbiByZWZlcnMgdG8gdGhlIE9uQ29tcGxldGUgaW4gY29tYmluYXRpb24gd2l0aCB3aGV0aGVyIHRoZSBhcHAgaXMgYmVpbmcgY3JlYXRlZCBvciBjYWxsZWQKLy8gRXZlcnkgcG9zc2libGUgYWN0aW9uIGZvciB0aGlzIGNvbnRyYWN0IGlzIHJlcHJlc2VudGVkIGluIHRoZSBzd2l0Y2ggc3RhdGVtZW50Ci8vIElmIHRoZSBhY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIGluIHRoZSBjb250cmFjdCwgaXRzIHJlc3BlY3RpdmUgYnJhbmNoIHdpbGwgYmUgIipOT1RfSU1QTEVNRU5URUQiIHdoaWNoIGp1c3QgY29udGFpbnMgImVyciIKdHhuIEFwcGxpY2F0aW9uSUQKIQppbnQgNgoqCnR4biBPbkNvbXBsZXRpb24KKwpzd2l0Y2ggKmNhbGxfTm9PcCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKmNyZWF0ZV9Ob09wICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRAoKKk5PVF9JTVBMRU1FTlRFRDoKCS8vIFRoZSByZXF1ZXN0ZWQgYWN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIGNvbnRyYWN0LiBBcmUgeW91IHVzaW5nIHRoZSBjb3JyZWN0IE9uQ29tcGxldGU/IERpZCB5b3Ugc2V0IHlvdXIgYXBwIElEPwoJZXJyCgovLyBjcmVhdGVBcHBsaWNhdGlvbigpdm9pZAoqYWJpX3JvdXRlX2NyZWF0ZUFwcGxpY2F0aW9uOgoJLy8gZXhlY3V0ZSBjcmVhdGVBcHBsaWNhdGlvbigpdm9pZAoJY2FsbHN1YiBjcmVhdGVBcHBsaWNhdGlvbgoJaW50IDEKCXJldHVybgoKLy8gY3JlYXRlQXBwbGljYXRpb24oKTogdm9pZApjcmVhdGVBcHBsaWNhdGlvbjoKCXByb3RvIDAgMAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyCgkvLyB0aGlzLnN0YWtpbmdQb29sSW5pdGlhbGl6ZWQudmFsdWUgPSBmYWxzZQoJYnl0ZSAweDY5NmU2OTc0IC8vICJpbml0IgoJaW50IDAKCWJ5dGUgMHgwMAoJaW50IDAKCXVuY292ZXIgMgoJc2V0Yml0CglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgzCgkvLyB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgPSAwCglieXRlIDB4NmU3NTZkNTYgLy8gIm51bVYiCglpbnQgMAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NAoJLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlID0gMAoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJaW50IDAKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODUKCS8vIHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlID0gMAoJYnl0ZSAweDczNzQ2MTZiNjU2NCAvLyAic3Rha2VkIgoJaW50IDAKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIGluaXRTdGFraW5nQ29udHJhY3QodWludDY0KXZvaWQKKmFiaV9yb3V0ZV9pbml0U3Rha2luZ0NvbnRyYWN0OgoJLy8gYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBpbml0U3Rha2luZ0NvbnRyYWN0KHVpbnQ2NCl2b2lkCgljYWxsc3ViIGluaXRTdGFraW5nQ29udHJhY3QKCWludCAxCglyZXR1cm4KCi8vIGluaXRTdGFraW5nQ29udHJhY3QoYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0KTogdm9pZAppbml0U3Rha2luZ0NvbnRyYWN0OgoJcHJvdG8gMSAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTAKCS8vIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uY3JlYXRlKGFwcHJvdmFsUHJvZ3JhbVNpemUpCglieXRlIDB4NzA2ZjZmNmM1NDY1NmQ3MDZjNjE3NDY1NDE3MDcwNzI2Zjc2NjE2YzQyNzk3NDY1NzMgLy8gInBvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMiCglmcmFtZV9kaWcgLTEgLy8gYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0Cglib3hfY3JlYXRlCglwb3AKCXJldHN1YgoKLy8gbG9hZFN0YWtpbmdDb250cmFjdERhdGEodWludDY0LGJ5dGVbXSl2b2lkCiphYmlfcm91dGVfbG9hZFN0YWtpbmdDb250cmFjdERhdGE6CgkvLyBkYXRhOiBieXRlW10KCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWV4dHJhY3QgMiAwCgoJLy8gb2Zmc2V0OiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGxvYWRTdGFraW5nQ29udHJhY3REYXRhKHVpbnQ2NCxieXRlW10pdm9pZAoJY2FsbHN1YiBsb2FkU3Rha2luZ0NvbnRyYWN0RGF0YQoJaW50IDEKCXJldHVybgoKLy8gbG9hZFN0YWtpbmdDb250cmFjdERhdGEob2Zmc2V0OiB1aW50NjQsIGRhdGE6IGJ5dGVzKTogdm9pZApsb2FkU3Rha2luZ0NvbnRyYWN0RGF0YToKCXByb3RvIDIgMAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk0CgkvLyBhc3NlcnQoIXRoaXMuc3Rha2luZ1Bvb2xJbml0aWFsaXplZC52YWx1ZSkKCWJ5dGUgMHg2OTZlNjk3NCAvLyAiaW5pdCIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMAoJZ2V0Yml0CgkhCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5NQoJLy8gdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5yZXBsYWNlKG9mZnNldCwgZGF0YSkKCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWZyYW1lX2RpZyAtMSAvLyBvZmZzZXQ6IHVpbnQ2NAoJZnJhbWVfZGlnIC0yIC8vIGRhdGE6IGJ5dGVzCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdCgpdm9pZAoqYWJpX3JvdXRlX2ZpbmFsaXplU3Rha2luZ0NvbnRyYWN0OgoJLy8gZXhlY3V0ZSBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdCgpdm9pZAoJY2FsbHN1YiBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdAoJaW50IDEKCXJldHVybgoKLy8gZmluYWxpemVTdGFraW5nQ29udHJhY3QoKTogdm9pZApmaW5hbGl6ZVN0YWtpbmdDb250cmFjdDoKCXByb3RvIDAgMAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk5CgkvLyB0aGlzLnN0YWtpbmdQb29sSW5pdGlhbGl6ZWQudmFsdWUgPSB0cnVlCglieXRlIDB4Njk2ZTY5NzQgLy8gImluaXQiCglpbnQgMQoJYnl0ZSAweDAwCglpbnQgMAoJdW5jb3ZlciAyCglzZXRiaXQKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIGdhcygpdm9pZAoqYWJpX3JvdXRlX2dhczoKCS8vIGV4ZWN1dGUgZ2FzKCl2b2lkCgljYWxsc3ViIGdhcwoJaW50IDEKCXJldHVybgoKLy8gZ2FzKCk6IHZvaWQKLy8KLy8gZ2FzIGlzIGEgZHVtbXkgbm8tb3AgY2FsbCB0aGF0IGNhbiBiZSB1c2VkIHRvIHBvb2wtdXAgcmVzb3VyY2UgcmVmZXJlbmNlcyBhbmQgb3Bjb2RlIGNvc3QKZ2FzOgoJcHJvdG8gMCAwCglyZXRzdWIKCi8vIGdldE1ickFtb3VudHMoKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0TWJyQW1vdW50czoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXRNYnJBbW91bnRzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0TWJyQW1vdW50cygpOiBNYnJBbW91bnRzCi8vCi8vIFJldHVybnMgdGhlIE1CUiBhbW91bnRzIG5lZWRlZCBmb3IgdmFyaW91cyBhY3Rpb25zOgovLyBbCi8vIGFkZFZhbGlkYXRvck1icjogdWludDY0IC0gbWJyIG5lZWRlZCB0byBhZGQgYSBuZXcgdmFsaWRhdG9yIC0gcGFpZCB0byB2YWxpZGF0b3IgY29udHJhY3QKLy8gYWRkUG9vbE1icjogdWludDY0IC0gbWJyIG5lZWRlZCB0byBhZGQgYSBuZXcgcG9vbCAtIHBhaWQgdG8gdmFsaWRhdG9yCi8vIHBvb2xJbml0TWJyOiB1aW50NjQgLSBtYnIgbmVlZGVkIHRvIGluaXRTdG9yYWdlKCkgb2YgcG9vbCAtIHBhaWQgdG8gcG9vbCBpdHNlbGYKLy8gYWRkU3Rha2VyTWJyOiB1aW50NjQgLSBtYnIgc3Rha2VyIG5lZWRzIHRvIGFkZCB0byBmaXJzdCBzdGFraW5nIHBheW1lbnQgKHN0YXlzIHcvIHZhbGlkYXRvcikKLy8gXQpnZXRNYnJBbW91bnRzOgoJcHJvdG8gMCAxCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5CgkvLyByZXR1cm4gewoJLy8gICAgICAgICAgICAgYWRkVmFsaWRhdG9yTWJyOiB0aGlzLmNvc3RGb3JCb3hTdG9yYWdlKDEgLyogdiBwcmVmaXggKi8gKyBsZW48VmFsaWRhdG9ySWRUeXBlPigpICsgbGVuPFZhbGlkYXRvckluZm8+KCkpLAoJLy8gICAgICAgICAgICAgYWRkUG9vbE1icjogdGhpcy5taW5CYWxhbmNlRm9yQWNjb3VudCgKCS8vICAgICAgICAgICAgICAgICAxLAoJLy8gICAgICAgICAgICAgICAgIC8vIHdlIGNvdWxkIGNhbGN1bGF0ZSB0aGlzIGRpcmVjdGx5IGJ5IHJlZmVyZW5jaW5nIHRoZSBzaXplIG9mIHN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtIGJ1dCBpdCB3b3VsZAoJLy8gICAgICAgICAgICAgICAgIC8vIG1lYW4gb3VyIGNhbGxlcnMgd291bGQgaGF2ZSB0byByZWZlcmVuY2UgdGhlIGJveCBBTkQgYnV5IHVwIGkvbyAtIHNvIGp1c3QgZ28gbWF4IG9uIGV4dHJhIHBhZ2VzCgkvLyAgICAgICAgICAgICAgICAgMywKCS8vICAgICAgICAgICAgICAgICAwLAoJLy8gICAgICAgICAgICAgICAgIDAsCgkvLyAgICAgICAgICAgICAgICAgMCwKCS8vICAgICAgICAgICAgICAgICBTdGFraW5nUG9vbC5zY2hlbWEuZ2xvYmFsLm51bVVpbnQsCgkvLyAgICAgICAgICAgICAgICAgU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1CeXRlU2xpY2UsCgkvLyAgICAgICAgICAgICApLAoJLy8gICAgICAgICAgICAgcG9vbEluaXRNYnI6CgkvLyAgICAgICAgICAgICAgICAgQUxHT1JBTkRfQUNDT1VOVF9NSU5fQkFMQU5DRSArCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5jb3N0Rm9yQm94U3RvcmFnZSg3IC8qICdzdGFrZXJzJyBuYW1lICovICsgbGVuPFN0YWtlZEluZm8+KCkgKiBNQVhfU1RBS0VSU19QRVJfUE9PTCksCgkvLyAgICAgICAgICAgICBhZGRTdGFrZXJNYnI6CgkvLyAgICAgICAgICAgICAgICAgLy8gaG93IG11Y2ggdG8gY2hhcmdlIGZvciBmaXJzdCB0aW1lIGEgc3Rha2VyIGFkZHMgc3Rha2UgLSBzaW5jZSB3ZSBhZGQgYSB0cmFja2luZyBib3ggcGVyIHN0YWtlcgoJLy8gICAgICAgICAgICAgICAgIHRoaXMuY29zdEZvckJveFN0b3JhZ2UoCgkvLyAgICAgICAgICAgICAgICAgICAgIDMgLyogJ3NwcycgcHJlZml4ICovICsgbGVuPEFkZHJlc3M+KCkgKyBsZW48VmFsaWRhdG9yUG9vbEtleT4oKSAqIE1BWF9QT09MU19QRVJfU1RBS0VSLAoJLy8gICAgICAgICAgICAgICAgICksIC8vIHNpemUgb2Yga2V5ICsgYWxsIHZhbHVlcwoJLy8gICAgICAgICB9CglpbnQgMTEwMQoJY2FsbHN1YiBjb3N0Rm9yQm94U3RvcmFnZQoJaXRvYgoJaW50IDMKCWludCAxMQoJaW50IDAKCWR1cG4gMgoJaW50IDMKCWludCAxCgljYWxsc3ViIG1pbkJhbGFuY2VGb3JBY2NvdW50CglpdG9iCgljb25jYXQKCWludCAxMDAwMDAKCWludCAxMjgwNwoJY2FsbHN1YiBjb3N0Rm9yQm94U3RvcmFnZQoJKwoJaXRvYgoJY29uY2F0CglpbnQgMTc5CgljYWxsc3ViIGNvc3RGb3JCb3hTdG9yYWdlCglpdG9iCgljb25jYXQKCXJldHN1YgoKLy8gZ2V0UHJvdG9jb2xDb25zdHJhaW50cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0UHJvdG9jb2xDb25zdHJhaW50czoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXRQcm90b2NvbENvbnN0cmFpbnRzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWNhbGxzdWIgZ2V0UHJvdG9jb2xDb25zdHJhaW50cwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFByb3RvY29sQ29uc3RyYWludHMoKTogQ29uc3RyYWludHMKLy8KLy8gUmV0dXJucyB0aGUgcHJvdG9jb2wgY29uc3RyYWludHMgc28gdGhhdCBVSXMgY2FuIGxpbWl0IHdoYXQgdXNlcnMgc3BlY2lmeSBmb3IgdmFsaWRhdG9yIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KZ2V0UHJvdG9jb2xDb25zdHJhaW50czoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0NwoJLy8gcmV0dXJuIHsKCS8vICAgICAgICAgICAgIGVwb2NoUGF5b3V0Um91bmRzTWluOiBNSU5fRVBPQ0hfTEVOR1RILAoJLy8gICAgICAgICAgICAgZXBvY2hQYXlvdXRSb3VuZHNNYXg6IE1BWF9FUE9DSF9MRU5HVEgsCgkvLyAgICAgICAgICAgICBtaW5QY3RUb1ZhbGlkYXRvcldGb3VyRGVjaW1hbHM6IE1JTl9QQ1RfVE9fVkFMSURBVE9SLAoJLy8gICAgICAgICAgICAgbWF4UGN0VG9WYWxpZGF0b3JXRm91ckRlY2ltYWxzOiBNQVhfUENUX1RPX1ZBTElEQVRPUiwKCS8vICAgICAgICAgICAgIG1pbkVudHJ5U3Rha2U6IE1JTl9BTEdPX1NUQUtFX1BFUl9QT09MLAoJLy8gICAgICAgICAgICAgbWF4QWxnb1BlclBvb2w6IHRoaXMubWF4QWxnb0FsbG93ZWRQZXJQb29sKCksCgkvLyAgICAgICAgICAgICBtYXhBbGdvUGVyVmFsaWRhdG9yOiB0aGlzLm1heEFsbG93ZWRTdGFrZSgpLAoJLy8gICAgICAgICAgICAgYW10Q29uc2lkZXJlZFNhdHVyYXRlZDogdGhpcy5hbGdvU2F0dXJhdGlvbkxldmVsKCksCgkvLyAgICAgICAgICAgICBtYXhOb2RlczogTUFYX05PREVTLAoJLy8gICAgICAgICAgICAgbWF4UG9vbHNQZXJOb2RlOiBNQVhfUE9PTFNfUEVSX05PREUsCgkvLyAgICAgICAgICAgICBtYXhTdGFrZXJzUGVyUG9vbDogTUFYX1NUQUtFUlNfUEVSX1BPT0wsCgkvLyAgICAgICAgIH0KCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDBmNDI0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGY0MjQwMDAwMDAwMDAwMDBmNDI0MAoJY2FsbHN1YiBtYXhBbGdvQWxsb3dlZFBlclBvb2wKCWl0b2IKCWNvbmNhdAoJY2FsbHN1YiBtYXhBbGxvd2VkU3Rha2UKCWl0b2IKCWNvbmNhdAoJY2FsbHN1YiBhbGdvU2F0dXJhdGlvbkxldmVsCglpdG9iCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDA4Cgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAzCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMGM4Cgljb25jYXQKCXJldHN1YgoKLy8gZ2V0TnVtVmFsaWRhdG9ycygpdWludDY0CiphYmlfcm91dGVfZ2V0TnVtVmFsaWRhdG9yczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXROdW1WYWxpZGF0b3JzKCl1aW50NjQKCWNhbGxzdWIgZ2V0TnVtVmFsaWRhdG9ycwoJaXRvYgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldE51bVZhbGlkYXRvcnMoKTogdWludDY0Ci8vCi8vIFJldHVybnMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHZhbGlkYXRvcnMKZ2V0TnVtVmFsaWRhdG9yczoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE2NwoJLy8gcmV0dXJuIHRoaXMubnVtVmFsaWRhdG9ycy52YWx1ZQoJYnl0ZSAweDZlNzU2ZDU2IC8vICJudW1WIgoJYXBwX2dsb2JhbF9nZXQKCXJldHN1YgoKLy8gZ2V0VmFsaWRhdG9yQ29uZmlnKHVpbnQ2NCkodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKKmFiaV9yb3V0ZV9nZXRWYWxpZGF0b3JDb25maWc6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFZhbGlkYXRvckNvbmZpZyh1aW50NjQpKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCgljYWxsc3ViIGdldFZhbGlkYXRvckNvbmZpZwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvckNvbmZpZyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogVmFsaWRhdG9yQ29uZmlnCmdldFZhbGlkYXRvckNvbmZpZzoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE3MgoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnCglpbnQgMAoJaW50IDI0MgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCXJldHN1YgoKLy8gZ2V0VmFsaWRhdG9yU3RhdGUodWludDY0KSh1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0VmFsaWRhdG9yU3RhdGU6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFZhbGlkYXRvclN0YXRlKHVpbnQ2NCkodWludDE2LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBnZXRWYWxpZGF0b3JTdGF0ZQoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvclN0YXRlKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBWYWxpZGF0b3JDdXJTdGF0ZQpnZXRWYWxpZGF0b3JTdGF0ZToKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE3NwoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUKCWludCAyNDIgLy8gaGVhZE9mZnNldAoJaW50IDI2CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpCiphYmlfcm91dGVfZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpCgljYWxsc3ViIGdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcih2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogW0FkZHJlc3MsIEFkZHJlc3NdCmdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcjoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE4MgoJLy8gcmV0dXJuIFsKCS8vICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLAoJLy8gICAgICAgICAgICAgdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWFuYWdlciwKCS8vICAgICAgICAgXQoJaW50IDgKCWludCAzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWludCA0MAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJY29uY2F0CglyZXRzdWIKCi8vIGdldFBvb2xzKHVpbnQ2NCkodWludDY0LHVpbnQxNix1aW50NjQpW10KKmFiaV9yb3V0ZV9nZXRQb29sczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0UG9vbHModWludDY0KSh1aW50NjQsdWludDE2LHVpbnQ2NClbXQoJY2FsbHN1YiBnZXRQb29scwoJZHVwCglsZW4KCWludCAxOAoJLwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFBvb2xzKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBQb29sSW5mb1tdCi8vCi8vIFJldHVybiBsaXN0IG9mIGFsbCBwb29scyBmb3IgdGhpcyB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWxpZGF0b3JJZAovLyBAcmV0dXJuIHtQb29sSW5mb1tdfSAtIGFycmF5IG9mIHBvb2xzCi8vIE5vdCBjYWxsYWJsZSBmcm9tIG90aGVyIGNvbnRyYWN0cyBiZWNhdXNlID4xSyByZXR1cm4gYnV0IGNhbiBiZSBjYWxsZWQgdy8gc2ltdWxhdGUgd2hpY2ggYnVtcHMgbG9nIHJldHVybnMKZ2V0UG9vbHM6Cglwcm90byAxIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiAyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk2CgkvLyByZXREYXRhOiBQb29sSW5mb1tdID0gW10KCWJ5dGUgMHgKCWZyYW1lX2J1cnkgMCAvLyByZXREYXRhOiBQb29sSW5mb1tdCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk3CgkvLyBwb29sU2V0ID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29scykKCWludCAyNjggLy8gaGVhZE9mZnNldAoJaW50IDQzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWZyYW1lX2J1cnkgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE5OAoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBwb29sU2V0Lmxlbmd0aDsgaSArPSAxKQoJaW50IDAKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCipmb3JfMDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE5OAoJLy8gaSA8IHBvb2xTZXQubGVuZ3RoCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCAyNAoJPAoJYnogKmZvcl8wX2VuZAoKCS8vICppZjBfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxOTkKCS8vIHBvb2xTZXRbaV0ucG9vbEFwcElkID09PSAwCglmcmFtZV9kaWcgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWYwX2VuZAoKCS8vICppZjBfY29uc2VxdWVudAoJYiAqZm9yXzBfZW5kCgoqaWYwX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIwMwoJLy8gcmV0RGF0YS5wdXNoKHBvb2xTZXRbaV0pCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBQb29sSW5mb1tdCglmcmFtZV9kaWcgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDE4CglleHRyYWN0MwoJY29uY2F0CglmcmFtZV9idXJ5IDAgLy8gcmV0RGF0YTogUG9vbEluZm9bXQoKKmZvcl8wX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk4CgkvLyBpICs9IDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCWIgKmZvcl8wCgoqZm9yXzBfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjA1CgkvLyByZXR1cm4gcmV0RGF0YQoJZnJhbWVfZGlnIDAgLy8gcmV0RGF0YTogUG9vbEluZm9bXQoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDIKCXJldHN1YgoKLy8gZ2V0UG9vbEFwcElkKHVpbnQ2NCx1aW50NjQpdWludDY0CiphYmlfcm91dGVfZ2V0UG9vbEFwcElkOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBwb29sSWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJYnRvaQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFBvb2xBcHBJZCh1aW50NjQsdWludDY0KXVpbnQ2NAoJY2FsbHN1YiBnZXRQb29sQXBwSWQKCWl0b2IKCWNvbmNhdAoJbG9nCglpbnQgMQoJcmV0dXJuCgovLyBnZXRQb29sQXBwSWQodmFsaWRhdG9ySWQ6IHVpbnQ2NCwgcG9vbElkOiB1aW50NjQpOiB1aW50NjQKLy8KLy8gZ2V0UG9vbEFwcElkIGlzIHVzZWZ1bCBmb3IgY2FsbGVycyB0byBkZXRlcm1pbmUgYXBwIHRvIGNhbGwgZm9yIHJlbW92aW5nIHN0YWtlIGlmIHRoZXkgZG9uJ3QgaGF2ZSBzdGFraW5nIG9yCi8vIHdhbnQgdG8gZ2V0IHN0YWtlciBsaXN0IGZvciBhbiBhY2NvdW50LiAgVGhlIHN0YWtpbmcgcG9vbCBhbHNvIHVzZXMgaXQgdG8gZ2V0IHRoZSBhcHAgaWQgb2Ygc3Rha2luZyBwb29sIDEKLy8gKHdoaWNoIGNvbnRhaW5zIHJld2FyZCB0b2tlbnMgaWYgYmVpbmcgdXNlZCkgc28gdGhhdCB0aGUgYW1vdW50IGF2YWlsYWJsZSBjYW4gYmUgZGV0ZXJtaW5lZC4KZ2V0UG9vbEFwcElkOgoJcHJvdG8gMiAxCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjE1CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBwb29sSWQgIT09IDAgJiYgcG9vbElkIDw9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHMubGVuZ3RoLAoJLy8gICAgICAgICAgICAgJ3Bvb2wgaWQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIG51bWJlciBvZiBwb29scyBmb3IgdGhpcyB2YWxpZGF0b3InLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTIgLy8gcG9vbElkOiB1aW50NjQKCWludCAwCgkhPQoJZHVwCglieiAqc2tpcF9hbmQwCglmcmFtZV9kaWcgLTIgLy8gcG9vbElkOiB1aW50NjQKCWludCAyNAoJPD0KCSYmCgoqc2tpcF9hbmQwOgoJLy8gcG9vbCBpZCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgbnVtYmVyIG9mIHBvb2xzIGZvciB0aGlzIHZhbGlkYXRvcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjE5CgkvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1twb29sSWQgLSAxXS5wb29sQXBwSWQKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0yIC8vIHBvb2xJZDogdWludDY0CglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCXJldHN1YgoKLy8gZ2V0UG9vbEluZm8oKHVpbnQ2NCx1aW50NjQsdWludDY0KSkodWludDY0LHVpbnQxNix1aW50NjQpCiphYmlfcm91dGVfZ2V0UG9vbEluZm86CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHBvb2xLZXk6ICh1aW50NjQsdWludDY0LHVpbnQ2NCkKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWR1cAoJbGVuCglpbnQgMjQKCT09CgoJLy8gYXJndW1lbnQgMCAocG9vbEtleSkgZm9yIGdldFBvb2xJbmZvIG11c3QgYmUgYSAodWludDY0LHVpbnQ2NCx1aW50NjQpCglhc3NlcnQKCgkvLyBleGVjdXRlIGdldFBvb2xJbmZvKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpKHVpbnQ2NCx1aW50MTYsdWludDY0KQoJY2FsbHN1YiBnZXRQb29sSW5mbwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFBvb2xJbmZvKHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkpOiBQb29sSW5mbwpnZXRQb29sSW5mbzoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIyNAoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRDdXJNYXhTdGFrZVBlclBvb2wodWludDY0KXVpbnQ2NAoqYWJpX3JvdXRlX2dldEN1ck1heFN0YWtlUGVyUG9vbDoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHVpbnQ2NCl1aW50NjQKCWNhbGxzdWIgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sCglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiB1aW50NjQKLy8KLy8gQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIHN0YWtlIHBlciBwb29sIGZvciBhIGdpdmVuIHZhbGlkYXRvci4KLy8gTm9ybWFsbHkgdGhpcyB3b3VsZCBiZSBtYXhBbGdvUGVyUG9vbCwgYnV0IGl0IHNob3VsZCBhbHNvIG5ldmVyIGdvIGFib3ZlIE1heEFsbG93ZWRTdGFrZSAvIG51bVBvb2xzIHNvCi8vIGFzIHBvb2xzIGFyZSBhZGRlZCB0aGUgbWF4IGFsbG93ZWQgcGVyIHBvb2wgY2FuIHJlZHVjZS4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCmdldEN1ck1heFN0YWtlUGVyUG9vbDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzYKCS8vIG51bVBvb2xzID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyBhcyB1aW50NjQKCWludCAyNDIKCWludCAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIG51bVBvb2xzOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzcKCS8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzID0gdGhpcy5tYXhBbGxvd2VkU3Rha2UoKSAvIG51bVBvb2xzCgljYWxsc3ViIG1heEFsbG93ZWRTdGFrZQoJZnJhbWVfZGlnIDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoJLwoJZnJhbWVfYnVyeSAxIC8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzgKCS8vIG1heFBlclBvb2w6IHVpbnQ2NCA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1heEFsZ29QZXJQb29sCglpbnQgMjE3CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCgkvLyAqaWYxX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjM5CgkvLyBtYXhQZXJQb29sID09PSAwCglmcmFtZV9kaWcgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCWludCAwCgk9PQoJYnogKmlmMV9lbmQKCgkvLyAqaWYxX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI0MAoJLy8gbWF4UGVyUG9vbCA9IHRoaXMubWF4QWxnb0FsbG93ZWRQZXJQb29sKCkKCWNhbGxzdWIgbWF4QWxnb0FsbG93ZWRQZXJQb29sCglmcmFtZV9idXJ5IDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoqaWYxX2VuZDoKCS8vICppZjJfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNDIKCS8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzIDwgbWF4UGVyUG9vbAoJZnJhbWVfZGlnIDEgLy8gaGFyZE1heERpdmlkZWRCZXR3ZWVuUG9vbHM6IHVpbnQ2NAoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8CglieiAqaWYyX2VuZAoKCS8vICppZjJfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjQzCgkvLyBtYXhQZXJQb29sID0gaGFyZE1heERpdmlkZWRCZXR3ZWVuUG9vbHMKCWZyYW1lX2RpZyAxIC8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzOiB1aW50NjQKCWZyYW1lX2J1cnkgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCippZjJfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjQ1CgkvLyByZXR1cm4gbWF4UGVyUG9vbAoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCgoJLy8gcG9wIGFsbCBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUgc3RhY2sKCXBvcG4gMgoJcmV0c3ViCgovLyBkb2VzU3Rha2VyTmVlZFRvUGF5TUJSKGFkZHJlc3MpYm9vbAoqYWJpX3JvdXRlX2RvZXNTdGFrZXJOZWVkVG9QYXlNQlI6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHN0YWtlcjogYWRkcmVzcwoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZHVwCglsZW4KCWludCAzMgoJPT0KCgkvLyBhcmd1bWVudCAwIChzdGFrZXIpIGZvciBkb2VzU3Rha2VyTmVlZFRvUGF5TUJSIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBleGVjdXRlIGRvZXNTdGFrZXJOZWVkVG9QYXlNQlIoYWRkcmVzcylib29sCgljYWxsc3ViIGRvZXNTdGFrZXJOZWVkVG9QYXlNQlIKCWJ5dGUgMHgwMAoJaW50IDAKCXVuY292ZXIgMgoJc2V0Yml0Cgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZG9lc1N0YWtlck5lZWRUb1BheU1CUihzdGFrZXI6IEFkZHJlc3MpOiBib29sZWFuCi8vCi8vIEhlbHBlciBjYWxsZXJzIGNhbiBjYWxsIHcvIHNpbXVsYXRlIHRvIGRldGVybWluZSBpZiAnQWRkU3Rha2VyJyBNQlIgc2hvdWxkIGJlIGluY2x1ZGVkIHcvIHN0YWtpbmcgYW1vdW50Ci8vIEBwYXJhbSBzdGFrZXIKZG9lc1N0YWtlck5lZWRUb1BheU1CUjoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI1NAoJLy8gcmV0dXJuICF0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS5leGlzdHMKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZXI6IEFkZHJlc3MKCWNvbmNhdAoJYm94X2xlbgoJc3dhcAoJcG9wCgkhCglyZXRzdWIKCi8vIGdldFN0YWtlZFBvb2xzRm9yQWNjb3VudChhZGRyZXNzKSh1aW50NjQsdWludDY0LHVpbnQ2NClbXQoqYWJpX3JvdXRlX2dldFN0YWtlZFBvb2xzRm9yQWNjb3VudDoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gc3Rha2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKHN0YWtlcikgZm9yIGdldFN0YWtlZFBvb2xzRm9yQWNjb3VudCBtdXN0IGJlIGEgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBnZXRTdGFrZWRQb29sc0ZvckFjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCx1aW50NjQpW10KCWNhbGxzdWIgZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50CglkdXAKCWxlbgoJaW50IDI0CgkvCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0Cgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50KHN0YWtlcjogQWRkcmVzcyk6IFZhbGlkYXRvclBvb2xLZXlbXQovLwovLyBSZXRyaWV2ZXMgdGhlIHN0YWtlZCBwb29scyBmb3IgYW4gYWNjb3VudC4KLy8KLy8gQHBhcmFtIHtBZGRyZXNzfSBzdGFrZXIgLSBUaGUgYWNjb3VudCB0byByZXRyaWV2ZSBzdGFrZWQgcG9vbHMgZm9yLgovLyBAcmV0dXJuIHtWYWxpZGF0b3JQb29sS2V5W119IC0gVGhlIGFycmF5IG9mIHN0YWtlZCBwb29scyBmb3IgdGhlIGFjY291bnQuCmdldFN0YWtlZFBvb2xzRm9yQWNjb3VudDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyAqaWYzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjY1CgkvLyAhdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikuZXhpc3RzCglieXRlIDB4NzM3MDczIC8vICJzcHMiCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoJIQoJYnogKmlmM19lbmQKCgkvLyAqaWYzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2NgoJLy8gcmV0dXJuIFtdCglieXRlIDB4CgliICpnZXRTdGFrZWRQb29sc0ZvckFjY291bnQqcmV0dXJuCgoqaWYzX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2OAoJLy8gcmV0RGF0YTogVmFsaWRhdG9yUG9vbEtleVtdID0gW10KCWJ5dGUgMHgKCWZyYW1lX2J1cnkgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjkKCS8vIHBvb2xTZXQgPSBjbG9uZSh0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZSkKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZXI6IEFkZHJlc3MKCWNvbmNhdAoJYm94X2dldAoKCS8vIGJveCB2YWx1ZSBkb2VzIG5vdCBleGlzdDogdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUKCWFzc2VydAoJZnJhbWVfYnVyeSAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzAKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgcG9vbFNldC5sZW5ndGg7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzE6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzAKCS8vIGkgPCBwb29sU2V0Lmxlbmd0aAoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl8xX2VuZAoKCS8vICppZjRfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzEKCS8vIHBvb2xTZXRbaV0uaWQgIT09IDAKCWZyYW1lX2RpZyAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgkhPQoJYnogKmlmNF9lbmQKCgkvLyAqaWY0X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI3MgoJLy8gcmV0RGF0YS5wdXNoKHBvb2xTZXRbaV0pCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCWZyYW1lX2RpZyAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWNvbmNhdAoJZnJhbWVfYnVyeSAwIC8vIHJldERhdGE6IFZhbGlkYXRvclBvb2xLZXlbXQoKKmlmNF9lbmQ6CgoqZm9yXzFfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzAKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzEKCipmb3JfMV9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzUKCS8vIHJldHVybiByZXREYXRhCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCipnZXRTdGFrZWRQb29sc0ZvckFjY291bnQqcmV0dXJuOgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCgoJLy8gcG9wIGFsbCBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUgc3RhY2sKCXBvcG4gMgoJcmV0c3ViCgovLyBnZXRUb2tlblBheW91dFJhdGlvKHVpbnQ2NCkodWludDY0WzI0XSx1aW50NjQpCiphYmlfcm91dGVfZ2V0VG9rZW5QYXlvdXRSYXRpbzoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KQoJY2FsbHN1YiBnZXRUb2tlblBheW91dFJhdGlvCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0VG9rZW5QYXlvdXRSYXRpbyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogUG9vbFRva2VuUGF5b3V0UmF0aW8KLy8KLy8gUmV0cmlldmVzIHRoZSB0b2tlbiBwYXlvdXQgcmF0aW8gZm9yIGEgZ2l2ZW4gdmFsaWRhdG9yIC0gcmV0dXJuaW5nIHRoZSBwb29sIHJhdGlvcyBvZiB3aG9sZSBzbyB0aGF0IHRva2VuCi8vIHBheW91dHMgYWNyb3NzIHBvb2xzIGNhbiBiZSBiYXNlZCBvbiBhIHN0YWJsZSBzbmFwaG9zdCBvZiBzdGFrZS4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEByZXR1cm4ge1Bvb2xUb2tlblBheW91dFJhdGlvfSAtIFRoZSB0b2tlbiBwYXlvdXQgcmF0aW8gZm9yIHRoZSB2YWxpZGF0b3IuCmdldFRva2VuUGF5b3V0UmF0aW86Cglwcm90byAxIDEKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyODcKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCXJldHN1YgoKLy8gZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cyh1aW50NjQpKCh1aW50NjRbM10pWzhdKQoqYWJpX3JvdXRlX2dldE5vZGVQb29sQXNzaWdubWVudHM6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldE5vZGVQb29sQXNzaWdubWVudHModWludDY0KSgodWludDY0WzNdKVs4XSkKCWNhbGxzdWIgZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldE5vZGVQb29sQXNzaWdubWVudHModmFsaWRhdG9ySWQ6IHVpbnQ2NCk6IE5vZGVQb29sQXNzaWdubWVudENvbmZpZwpnZXROb2RlUG9vbEFzc2lnbm1lbnRzOgoJcHJvdG8gMSAxCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjkyCgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS5leGlzdHMsICJ0aGUgc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBkb2Vzbid0IGV4aXN0IikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoKCS8vIHRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGRvZXNuJ3QgZXhpc3QKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI5NAoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUubm9kZVBvb2xBc3NpZ25tZW50cwoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRORkRSZWdpc3RyeUlEKCl1aW50NjQKKmFiaV9yb3V0ZV9nZXRORkRSZWdpc3RyeUlEOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBleGVjdXRlIGdldE5GRFJlZ2lzdHJ5SUQoKXVpbnQ2NAoJY2FsbHN1YiBnZXRORkRSZWdpc3RyeUlECglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0TkZEUmVnaXN0cnlJRCgpOiB1aW50NjQKZ2V0TkZEUmVnaXN0cnlJRDoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI5OQoJLy8gcmV0dXJuIHRoaXMubmZkUmVnaXN0cnlBcHBJZAoJbG9hZCAyMDAgLy8gVE1QTF9uZmRSZWdpc3RyeUFwcElkCglyZXRzdWIKCi8vIGFkZFZhbGlkYXRvcihwYXksc3RyaW5nLCh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KSl1aW50NjQKKmFiaV9yb3V0ZV9hZGRWYWxpZGF0b3I6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIGNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDI0MgoJPT0KCgkvLyBhcmd1bWVudCAwIChjb25maWcpIGZvciBhZGRWYWxpZGF0b3IgbXVzdCBiZSBhICh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KQoJYXNzZXJ0CgoJLy8gbmZkTmFtZTogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglleHRyYWN0IDIgMAoKCS8vIG1iclBheW1lbnQ6IHBheQoJdHhuIEdyb3VwSW5kZXgKCWludCAxCgktCglkdXAKCWd0eG5zIFR5cGVFbnVtCglpbnQgcGF5Cgk9PQoKCS8vIGFyZ3VtZW50IDIgKG1iclBheW1lbnQpIGZvciBhZGRWYWxpZGF0b3IgbXVzdCBiZSBhIHBheSB0cmFuc2FjdGlvbgoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBhZGRWYWxpZGF0b3IocGF5LHN0cmluZywodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkpdWludDY0CgljYWxsc3ViIGFkZFZhbGlkYXRvcgoJaXRvYgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFZhbGlkYXRvcihtYnJQYXltZW50OiBQYXlUeG4sIG5mZE5hbWU6IHN0cmluZywgY29uZmlnOiBWYWxpZGF0b3JDb25maWcpOiB1aW50NjQKLy8KLy8gQWRkcyBhIG5ldyB2YWxpZGF0b3IKLy8gUmVxdWlyZXMgYXQgbGVhc3QgMTAgQUxHTyBhcyB0aGUgJ2ZlZScgZm9yIHRoZSB0cmFuc2FjdGlvbiB0byBoZWxwIGRpc3N1YWRlIHNwYW1tZWQgdmFsaWRhdG9yIGFkZHMuCi8vCi8vIEBwYXJhbSB7UGF5VHhufSBtYnJQYXltZW50IHBheW1lbnQgZnJvbSBjYWxsZXIgd2hpY2ggY292ZXJzIG1iciBpbmNyZWFzZSBvZiBuZXcgdmFsaWRhdG9yIHN0b3JhZ2UKLy8gQHBhcmFtIHtzdHJpbmd9IG5mZE5hbWUgKE9wdGlvbmFsKSBOYW1lIG9mIG5mZCAodXNlZCBhcyBkb3VibGUtY2hlY2sgYWdhaW5zdCBpZCBzcGVjaWZpZWQgaW4gY29uZmlnKQovLyBAcGFyYW0ge1ZhbGlkYXRvckNvbmZpZ30gY29uZmlnIFZhbGlkYXRvckNvbmZpZyBzdHJ1Y3QKLy8gQHJldHVybnMge3VpbnQ2NH0gdmFsaWRhdG9yIGlkCmFkZFZhbGlkYXRvcjoKCXByb3RvIDMgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzExCgkvLyB0aGlzLnZhbGlkYXRlQ29uZmlnKGNvbmZpZykKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJY2FsbHN1YiB2YWxpZGF0ZUNvbmZpZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxMwoJLy8gdmVyaWZ5UGF5VHhuKG1iclBheW1lbnQsIHsgcmVjZWl2ZXI6IHRoaXMuYXBwLmFkZHJlc3MsIGFtb3VudDogdGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkVmFsaWRhdG9yTWJyIH0pCgkvLyB2ZXJpZnkgcmVjZWl2ZXIKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIFJlY2VpdmVyCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6InJlY2VpdmVyIiwiZXhwZWN0ZWQiOiJ0aGlzLmFwcC5hZGRyZXNzIn0KCWFzc2VydAoKCS8vIHZlcmlmeSBhbW91bnQKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCglleHRyYWN0IDAgOAoJYnRvaQoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6ImFtb3VudCIsImV4cGVjdGVkIjoidGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkVmFsaWRhdG9yTWJyIn0KCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxNQoJLy8gYXNzZXJ0KG1iclBheW1lbnQuZmVlID4gMTAgKiAxMDAwMDAwLCAnZmVlIG11c3QgYmUgMTAgQUxHTyBvciBtb3JlIHRvIHByZXZlbnQgc3BhbW1pbmcgb2YgdmFsaWRhdG9ycycpCglmcmFtZV9kaWcgLTEgLy8gbWJyUGF5bWVudDogUGF5VHhuCglndHhucyBGZWUKCWludCAxMDAwMDAwMAoJPgoKCS8vIGZlZSBtdXN0IGJlIDEwIEFMR08gb3IgbW9yZSB0byBwcmV2ZW50IHNwYW1taW5nIG9mIHZhbGlkYXRvcnMKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxOAoJLy8gdmFsaWRhdG9ySWQgPSB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgKyAxCglieXRlIDB4NmU3NTZkNTYgLy8gIm51bVYiCglhcHBfZ2xvYmFsX2dldAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzE5CgkvLyB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgPSB2YWxpZGF0b3JJZAoJYnl0ZSAweDZlNzU2ZDU2IC8vICJudW1WIgoJZnJhbWVfZGlnIDAgLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMjEKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkuY3JlYXRlKCkKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJaW50IDEwOTIKCWJveF9jcmVhdGUKCXBvcAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMyMgoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcgPSBjb25maWcKCWludCAwCglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMjMKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLmlkID0gdmFsaWRhdG9ySWQKCWludCAwCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gKmlmNV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMyNgoJLy8gY29uZmlnLm5mZEZvckluZm8gIT09IDAKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA3MiA4CglidG9pCglpbnQgMAoJIT0KCWJ6ICppZjVfZW5kCgoJLy8gKmlmNV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMjgKCS8vIGFzc2VydCh0aGlzLmlzTkZEQXBwSURWYWxpZChjb25maWcubmZkRm9ySW5mbyksICdwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZCcpCglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgNzIgOAoJYnRvaQoJY2FsbHN1YiBpc05GREFwcElEVmFsaWQKCgkvLyBwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzMwCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgdGhpcy50eG4uc2VuZGVyID09PSAoQXBwSUQuZnJvbVVpbnQ2NChjb25maWcubmZkRm9ySW5mbykuZ2xvYmFsU3RhdGUoJ2kub3duZXIuYScpIGFzIEFkZHJlc3MpLAoJLy8gICAgICAgICAgICAgICAgICdJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXInLAoJLy8gICAgICAgICAgICAgKQoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIC0zIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDcyIDgKCWJ0b2kKCWJ5dGUgMHg2OTJlNmY3NzZlNjU3MjJlNjEgLy8gImkub3duZXIuYSIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KGNvbmZpZy5uZmRGb3JJbmZvKS5nbG9iYWxTdGF0ZSgnaS5vd25lci5hJykKCWFzc2VydAoJPT0KCgkvLyBJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXIKCWFzc2VydAoKKmlmNV9lbmQ6CgkvLyAqaWY2X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzM2CgkvLyBjb25maWcuZW50cnlHYXRpbmdUeXBlID09PSBHQVRJTkdfVFlQRV9DUkVBVEVEX0JZX05GRF9BRERSRVNTRVMgfHwKCS8vICAgICAgICAgICAgIGNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX1NFR01FTlRfT0ZfTkZECglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgODAgMQoJYnRvaQoJaW50IDMKCT09CglkdXAKCWJueiAqc2tpcF9vcjAKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4MCAxCglidG9pCglpbnQgNAoJPT0KCXx8Cgoqc2tpcF9vcjA6CglieiAqaWY2X2VuZAoKCS8vICppZjZfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzQwCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5pc05GREFwcElEVmFsaWQoY29uZmlnLmVudHJ5R2F0aW5nQXNzZXRzWzBdKSwKCS8vICAgICAgICAgICAgICAgICAncHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZEJywKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAxMTMgOAoJYnRvaQoJY2FsbHN1YiBpc05GREFwcElEVmFsaWQKCgkvLyBwcm92aWRlZCBORkQgQXBwIGlkIGZvciBnYXRpbmcgbXVzdCBiZSB2YWxpZCBORkQKCWFzc2VydAoKKmlmNl9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNDUKCS8vIHRoaXMucmV0aU9QX2FkZGVkVmFsaWRhdG9yLmxvZyh7IGlkOiB2YWxpZGF0b3JJZCwgb3duZXI6IGNvbmZpZy5vd25lciwgbWFuYWdlcjogY29uZmlnLm1hbmFnZXIgfSkKCWJ5dGUgMHhhOGRkMjFjYiAvLyByZXRpT1BfYWRkZWRWYWxpZGF0b3IodWludDY0LGFkZHJlc3MsYWRkcmVzcykKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4IDMyCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA0MCAzMgoJY29uY2F0Cgljb25jYXQKCWxvZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM0NgoJLy8gcmV0dXJuIHZhbGlkYXRvcklkCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvck1hbmFnZXIodWludDY0LGFkZHJlc3Mpdm9pZAoqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvck1hbmFnZXI6CgkvLyBtYW5hZ2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKG1hbmFnZXIpIGZvciBjaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyKHVpbnQ2NCxhZGRyZXNzKXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yTWFuYWdlcgoJaW50IDEKCXJldHVybgoKLy8gY2hhbmdlVmFsaWRhdG9yTWFuYWdlcih2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBtYW5hZ2VyOiBBZGRyZXNzKTogdm9pZAovLwovLyBDaGFuZ2VzIHRoZSBWYWxpZGF0b3IgbWFuYWdlciBmb3IgYSBzcGVjaWZpYyBWYWxpZGF0b3IgaWQuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gY2hhbmdlIHRoZSBtYW5hZ2VyIGZvci4KLy8gQHBhcmFtIHtBZGRyZXNzfSBtYW5hZ2VyIC0gVGhlIG5ldyBtYW5hZ2VyIGFkZHJlc3MuCmNoYW5nZVZhbGlkYXRvck1hbmFnZXI6Cglwcm90byAyIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNTcKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM1OAoJLy8gYXNzZXJ0KG1hbmFnZXIgIT09IGdsb2JhbHMuemVyb0FkZHJlc3MsICduZWVkcyB0byBhdCBsZWFzdCBiZSB2YWxpZCBhZGRyZXNzJykKCWZyYW1lX2RpZyAtMiAvLyBtYW5hZ2VyOiBBZGRyZXNzCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CgoJLy8gbmVlZHMgdG8gYXQgbGVhc3QgYmUgdmFsaWQgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzU5CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5tYW5hZ2VyID0gbWFuYWdlcgoJaW50IDQwCglmcmFtZV9kaWcgLTIgLy8gbWFuYWdlcjogQWRkcmVzcwoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCXJldHN1YgoKLy8gY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyh1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkCiphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbzoKCS8vIHN1bnNldHRpbmdUbzogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglidG9pCgoJLy8gc3Vuc2V0dGluZ09uOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbwoJaW50IDEKCXJldHVybgoKLy8gY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBzdW5zZXR0aW5nT246IHVpbnQ2NCwgc3Vuc2V0dGluZ1RvOiBWYWxpZGF0b3JJZFR5cGUpOiB2b2lkCi8vCi8vIFVwZGF0ZXMgdGhlIHN1bnNldCBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiB2YWxpZGF0b3IuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gdXBkYXRlLgovLyBAcGFyYW0ge3VpbnQ2NH0gc3Vuc2V0dGluZ09uIC0gVGhlIG5ldyBzdW5zZXQgdGltZXN0YW1wLgovLyBAcGFyYW0ge3VpbnQ2NH0gc3Vuc2V0dGluZ1RvIC0gVGhlIG5ldyBzdW5zZXQgdG8gdmFsaWRhdG9yIGlkLgpjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvOgoJcHJvdG8gMyAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzcxCgkvLyB0aGlzLmNhbGxlck11c3RCZU93bmVyKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgY2FsbGVyTXVzdEJlT3duZXIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNzIKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnN1bnNldHRpbmdPbiA9IHN1bnNldHRpbmdPbgoJaW50IDIyNgoJZnJhbWVfZGlnIC0yIC8vIHN1bnNldHRpbmdPbjogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM3MwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcuc3Vuc2V0dGluZ1RvID0gc3Vuc2V0dGluZ1RvCglpbnQgMjM0CglmcmFtZV9kaWcgLTMgLy8gc3Vuc2V0dGluZ1RvOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvck5GRCh1aW50NjQsdWludDY0LHN0cmluZyl2b2lkCiphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yTkZEOgoJLy8gbmZkTmFtZTogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglleHRyYWN0IDIgMAoKCS8vIG5mZEFwcElEOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JORkQodWludDY0LHVpbnQ2NCxzdHJpbmcpdm9pZAoJY2FsbHN1YiBjaGFuZ2VWYWxpZGF0b3JORkQKCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvck5GRCh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBuZmRBcHBJRDogdWludDY0LCBuZmROYW1lOiBzdHJpbmcpOiB2b2lkCi8vCi8vIENoYW5nZXMgdGhlIE5GRCBmb3IgYSB2YWxpZGF0b3IgaW4gdGhlIHZhbGlkYXRvckxpc3QgY29udHJhY3QuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gdXBkYXRlLgovLyBAcGFyYW0ge3VpbnQ2NH0gbmZkQXBwSUQgLSBUaGUgYXBwbGljYXRpb24gaWQgb2YgdGhlIE5GRCB0byBhc3NpZ24gdG8gdGhlIHZhbGlkYXRvci4KLy8gQHBhcmFtIHtzdHJpbmd9IG5mZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgTkZEICh3aGljaCBtdXN0IG1hdGNoKQpjaGFuZ2VWYWxpZGF0b3JORkQ6Cglwcm90byAzIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozODUKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM4NwoJLy8gYXNzZXJ0KHRoaXMuaXNORkRBcHBJRFZhbGlkKG5mZEFwcElEKSwgJ3Byb3ZpZGVkIE5GRCBtdXN0IGJlIHZhbGlkJykKCWZyYW1lX2RpZyAtMiAvLyBuZmRBcHBJRDogdWludDY0CgljYWxsc3ViIGlzTkZEQXBwSURWYWxpZAoKCS8vIHByb3ZpZGVkIE5GRCBtdXN0IGJlIHZhbGlkCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozODkKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHRoaXMudHhuLnNlbmRlciA9PT0gKEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzKSwKCS8vICAgICAgICAgICAgICdJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXInLAoJLy8gICAgICAgICApCgl0eG4gU2VuZGVyCglmcmFtZV9kaWcgLTIgLy8gbmZkQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKQoJYXNzZXJ0Cgk9PQoKCS8vIElmIHNwZWNpZnlpbmcgTkZELCBhY2NvdW50IGFkZGluZyB2YWxpZGF0b3IgbXVzdCBiZSBvd25lcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzkzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5uZmRGb3JJbmZvID0gbmZkQXBwSUQKCWludCA3MgoJZnJhbWVfZGlnIC0yIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHVpbnQ2NCxhZGRyZXNzKXZvaWQKKmFiaV9yb3V0ZV9jaGFuZ2VWYWxpZGF0b3JDb21taXNzaW9uQWRkcmVzczoKCS8vIGNvbW1pc3Npb25BZGRyZXNzOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKGNvbW1pc3Npb25BZGRyZXNzKSBmb3IgY2hhbmdlVmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MgbXVzdCBiZSBhIGFkZHJlc3MKCWFzc2VydAoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHVpbnQ2NCxhZGRyZXNzKXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MKCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIGNvbW1pc3Npb25BZGRyZXNzOiBBZGRyZXNzKTogdm9pZAovLwovLyBDaGFuZ2UgdGhlIGNvbW1pc3Npb24gYWRkcmVzcyB0aGF0IHZhbGlkYXRvciByZXdhcmRzIGFyZSBzZW50IHRvLgovLyBbIE9OTFkgT1dORVIgQ0FOIENIQU5HRSBdCmNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzOgoJcHJvdG8gMiAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDAxCgkvLyB0aGlzLmNhbGxlck11c3RCZU93bmVyKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgY2FsbGVyTXVzdEJlT3duZXIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MDIKCS8vIGFzc2VydChjb21taXNzaW9uQWRkcmVzcyAhPT0gQWRkcmVzcy56ZXJvQWRkcmVzcykKCWZyYW1lX2RpZyAtMiAvLyBjb21taXNzaW9uQWRkcmVzczogQWRkcmVzcwoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDAzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy52YWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyA9IGNvbW1pc3Npb25BZGRyZXNzCglpbnQgMTc3CglmcmFtZV9kaWcgLTIgLy8gY29tbWlzc2lvbkFkZHJlc3M6IEFkZHJlc3MKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8odWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQpdm9pZAoqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvclJld2FyZEluZm86CgkvLyBSZXdhcmRQZXJQYXlvdXQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgoJYnRvaQoKCS8vIEdhdGluZ0Fzc2V0TWluQmFsYW5jZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyA1CglidG9pCgoJLy8gRW50cnlHYXRpbmdBc3NldHM6IHVpbnQ2NFs0XQoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAoJZHVwCglsZW4KCWludCAzMgoJPT0KCgkvLyBhcmd1bWVudCAyIChFbnRyeUdhdGluZ0Fzc2V0cykgZm9yIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8gbXVzdCBiZSBhIHVpbnQ2NFs0XQoJYXNzZXJ0CgoJLy8gRW50cnlHYXRpbmdBZGRyZXNzOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDMgKEVudHJ5R2F0aW5nQWRkcmVzcykgZm9yIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8gbXVzdCBiZSBhIGFkZHJlc3MKCWFzc2VydAoKCS8vIEVudHJ5R2F0aW5nVHlwZTogdWludDgKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMQoJPT0KCgkvLyBhcmd1bWVudCA0IChFbnRyeUdhdGluZ1R5cGUpIGZvciBjaGFuZ2VWYWxpZGF0b3JSZXdhcmRJbmZvIG11c3QgYmUgYSB1aW50OAoJYXNzZXJ0CglidG9pCgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mbyh1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCl2b2lkCgljYWxsc3ViIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8KCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8odmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgRW50cnlHYXRpbmdUeXBlOiB1aW50OCwgRW50cnlHYXRpbmdBZGRyZXNzOiBBZGRyZXNzLCBFbnRyeUdhdGluZ0Fzc2V0czogU3RhdGljQXJyYXk8dWludDY0LCA0PiwgR2F0aW5nQXNzZXRNaW5CYWxhbmNlOiB1aW50NjQsIFJld2FyZFBlclBheW91dDogdWludDY0KTogdm9pZAovLwovLyBBbGxvdyB0aGUgYWRkaXRpb25hbCByZXdhcmRzIChnYXRpbmcgZW50cnksIGFkZGl0aW9uYWwgdG9rZW4gcmV3YXJkcykgaW5mb3JtYXRpb24gYmUgY2hhbmdlZCBhdCB3aWxsLgovLyBbIE9OTFkgT1dORVIgQ0FOIENIQU5HRSBdCmNoYW5nZVZhbGlkYXRvclJld2FyZEluZm86Cglwcm90byA2IDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MTgKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQyMAoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgRW50cnlHYXRpbmdUeXBlID49IEdBVElOR19UWVBFX05PTkUgJiYgRW50cnlHYXRpbmdUeXBlIDwgR0FUSU5HX1RZUEVfQ09OU1RfTUFYLAoJLy8gICAgICAgICAgICAgJ2ludmFsaWQgRW50cnkgZ2F0aW5nIHR5cGUnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDAKCT49CglkdXAKCWJ6ICpza2lwX2FuZDEKCWZyYW1lX2RpZyAtMiAvLyBFbnRyeUdhdGluZ1R5cGU6IHVpbnQ4CglpbnQgNAoJPAoJJiYKCipza2lwX2FuZDE6CgkvLyBpbnZhbGlkIEVudHJ5IGdhdGluZyB0eXBlCglhc3NlcnQKCgkvLyAqaWY3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDI0CgkvLyBFbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX0FTU0VUU19DUkVBVEVEX0JZCglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDEKCT09CglieiAqaWY3X2VuZAoKCS8vICppZjdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDI1CgkvLyBhc3NlcnQoRW50cnlHYXRpbmdBZGRyZXNzICE9PSBnbG9iYWxzLnplcm9BZGRyZXNzKQoJZnJhbWVfZGlnIC0zIC8vIEVudHJ5R2F0aW5nQWRkcmVzczogQWRkcmVzcwoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoqaWY3X2VuZDoKCS8vICppZjhfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MjgKCS8vIEVudHJ5R2F0aW5nVHlwZSA9PT0gR0FUSU5HX1RZUEVfQ1JFQVRFRF9CWV9ORkRfQUREUkVTU0VTIHx8CgkvLyAgICAgICAgICAgICBFbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX1NFR01FTlRfT0ZfTkZECglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDMKCT09CglkdXAKCWJueiAqc2tpcF9vcjEKCWZyYW1lX2RpZyAtMiAvLyBFbnRyeUdhdGluZ1R5cGU6IHVpbnQ4CglpbnQgNAoJPT0KCXx8Cgoqc2tpcF9vcjE6CglieiAqaWY4X2VuZAoKCS8vICppZjhfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDMxCgkvLyBhc3NlcnQodGhpcy5pc05GREFwcElEVmFsaWQoRW50cnlHYXRpbmdBc3NldHNbMF0pLCAncHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZEJykKCWZyYW1lX2RpZyAtNCAvLyBFbnRyeUdhdGluZ0Fzc2V0czogU3RhdGljQXJyYXk8dWludDY0LCA0PgoJZXh0cmFjdCAwIDgKCWJ0b2kKCWNhbGxzdWIgaXNORkRBcHBJRFZhbGlkCgoJLy8gcHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZECglhc3NlcnQKCippZjhfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDMzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPSBFbnRyeUdhdGluZ1R5cGUKCWludCA4MAoJZnJhbWVfZGlnIC0yIC8vIEVudHJ5R2F0aW5nVHlwZTogdWludDgKCWl0b2IKCWV4dHJhY3QgNyAxCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQzNAoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcuZW50cnlHYXRpbmdBZGRyZXNzID0gRW50cnlHYXRpbmdBZGRyZXNzCglpbnQgODEKCWZyYW1lX2RpZyAtMyAvLyBFbnRyeUdhdGluZ0FkZHJlc3M6IEFkZHJlc3MKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDM1CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0cyA9IEVudHJ5R2F0aW5nQXNzZXRzCglpbnQgMTEzCglmcmFtZV9kaWcgLTQgLy8gRW50cnlHYXRpbmdBc3NldHM6IFN0YXRpY0FycmF5PHVpbnQ2NCwgND4KCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDM2CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5nYXRpbmdBc3NldE1pbkJhbGFuY2UgPSBHYXRpbmdBc3NldE1pbkJhbGFuY2UKCWludCAxNDUKCWZyYW1lX2RpZyAtNSAvLyBHYXRpbmdBc3NldE1pbkJhbGFuY2U6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MzcKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnJld2FyZFBlclBheW91dCA9IFJld2FyZFBlclBheW91dAoJaW50IDE2MQoJZnJhbWVfZGlnIC02IC8vIFJld2FyZFBlclBheW91dDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyBhZGRQb29sKHBheSx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCkKKmFiaV9yb3V0ZV9hZGRQb29sOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBub2RlTnVtOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gbWJyUGF5bWVudDogcGF5Cgl0eG4gR3JvdXBJbmRleAoJaW50IDEKCS0KCWR1cAoJZ3R4bnMgVHlwZUVudW0KCWludCBwYXkKCT09CgoJLy8gYXJndW1lbnQgMiAobWJyUGF5bWVudCkgZm9yIGFkZFBvb2wgbXVzdCBiZSBhIHBheSB0cmFuc2FjdGlvbgoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBhZGRQb29sKHBheSx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCkKCWNhbGxzdWIgYWRkUG9vbAoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFBvb2wobWJyUGF5bWVudDogUGF5VHhuLCB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBub2RlTnVtOiB1aW50NjQpOiBWYWxpZGF0b3JQb29sS2V5Ci8vCi8vIEFkZHMgYSBuZXcgcG9vbCB0byBhIHZhbGlkYXRvcidzIHBvb2wgc2V0LCByZXR1cm5pbmcgdGhlICdrZXknIHRvIHJlZmVyZW5jZSB0aGUgcG9vbCBpbiB0aGUgZnV0dXJlIGZvciBzdGFraW5nLCBldGMuCi8vIFRoZSBjYWxsZXIgbXVzdCBwYXkgdGhlIGNvc3Qgb2YgdGhlIHZhbGlkYXRvcnMgTUJSIGluY3JlYXNlIGFzIHdlbGwgYXMgdGhlIE1CUiB0aGF0IHdpbGwgYmUgbmVlZGVkIGZvciB0aGUgcG9vbCBpdHNlbGYuCi8vCi8vIFsgT05MWSBPV05FUiBPUiBNQU5BR0VSIENBTiBjYWxsIF0KLy8gQHBhcmFtIHtQYXlUeG59IG1iclBheW1lbnQgcGF5bWVudCBmcm9tIGNhbGxlciB3aGljaCBjb3ZlcnMgbWJyIGluY3JlYXNlIG9mIGFkZGluZyBhIG5ldyBwb29sCi8vIEBwYXJhbSB7dWludDY0fSB2YWxpZGF0b3JJZCBpcyBpZCBvZiB2YWxpZGF0b3IgdG8gcG9vbCB0byAobXVzdCBiZSBvd25lciBvciBtYW5hZ2VyKQovLyBAcGFyYW0ge3VpbnQ2NH0gbm9kZU51bSBpcyBub2RlIG51bWJlciB0byBhZGQgdG8KLy8gQHJldHVybnMge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2wga2V5IHRvIGNyZWF0ZWQgcG9vbAphZGRQb29sOgoJcHJvdG8gMyAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ1MgoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lck9yTWFuYWdlcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyT3JNYW5hZ2VyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDU1CgkvLyB2ZXJpZnlQYXlUeG4obWJyUGF5bWVudCwgeyByZWNlaXZlcjogdGhpcy5hcHAuYWRkcmVzcywgYW1vdW50OiB0aGlzLmdldE1ickFtb3VudHMoKS5hZGRQb29sTWJyIH0pCgkvLyB2ZXJpZnkgcmVjZWl2ZXIKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIFJlY2VpdmVyCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6InJlY2VpdmVyIiwiZXhwZWN0ZWQiOiJ0aGlzLmFwcC5hZGRyZXNzIn0KCWFzc2VydAoKCS8vIHZlcmlmeSBhbW91bnQKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCglleHRyYWN0IDggOAoJYnRvaQoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6ImFtb3VudCIsImV4cGVjdGVkIjoidGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkUG9vbE1iciJ9Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NTcKCS8vIGFzc2VydCh0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLmV4aXN0cywgInNwZWNpZmllZCB2YWxpZGF0b3IgaWQgaXNuJ3QgdmFsaWQiKQoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJYm94X2xlbgoJc3dhcAoJcG9wCgoJLy8gc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBpc24ndCB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDU5CgkvLyBudW1Qb29sczogdWludDY0ID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyBhcyB1aW50NjQKCWludCAyNDIKCWludCAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIG51bVBvb2xzOiB1aW50NjQKCgkvLyAqaWY5X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDYwCgkvLyAobnVtUG9vbHMgYXMgdWludDY0KSA+PSBNQVhfUE9PTFMKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWludCAyNAoJPj0KCWJ6ICppZjlfZW5kCgoJLy8gKmlmOV9jb25zZXF1ZW50CgkvLyBhbHJlYWR5IGF0IG1heCBwb29sIHNpemUKCWVycgoKKmlmOV9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NjMKCS8vIG51bVBvb2xzICs9IDEKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ2NgoJLy8gc2VuZEFwcENhbGwoewoJLy8gICAgICAgICAgICAgb25Db21wbGV0aW9uOiBPbkNvbXBsZXRpb24uTm9PcCwKCS8vICAgICAgICAgICAgIGFwcHJvdmFsUHJvZ3JhbTogWwoJLy8gICAgICAgICAgICAgICAgIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uZXh0cmFjdCgwLCA0MDk2KSwKCS8vICAgICAgICAgICAgICAgICB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLmV4dHJhY3QoNDA5NiwgdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5zaXplIC0gNDA5NiksCgkvLyAgICAgICAgICAgICBdLAoJLy8gICAgICAgICAgICAgY2xlYXJTdGF0ZVByb2dyYW06IFN0YWtpbmdQb29sLmNsZWFyUHJvZ3JhbSgpLAoJLy8gICAgICAgICAgICAgZ2xvYmFsTnVtVWludDogU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1VaW50LAoJLy8gICAgICAgICAgICAgZ2xvYmFsTnVtQnl0ZVNsaWNlOiBTdGFraW5nUG9vbC5zY2hlbWEuZ2xvYmFsLm51bUJ5dGVTbGljZSwKCS8vICAgICAgICAgICAgIGV4dHJhUHJvZ3JhbVBhZ2VzOiAzLAoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25BcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gY3JlYXRpbmdDb250cmFjdElELCB2YWxpZGF0b3JJZCwgcG9vbElkLCBtaW5FbnRyeVN0YWtlCgkvLyAgICAgICAgICAgICAgICAgbWV0aG9kKCdjcmVhdGVBcHBsaWNhdGlvbih1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCcpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodGhpcy5hcHAuaWQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodmFsaWRhdG9ySWQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IobnVtUG9vbHMgYXMgdWludDY0KSwKCS8vICAgICAgICAgICAgICAgICBpdG9iKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1pbkVudHJ5U3Rha2UpLAoJLy8gICAgICAgICAgICAgXSwKCS8vICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDY3CgkvLyBvbkNvbXBsZXRpb246IE9uQ29tcGxldGlvbi5Ob09wCglpbnQgMCAvLyBOb09wCglpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ2OAoJLy8gYXBwcm92YWxQcm9ncmFtOiBbCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5leHRyYWN0KDAsIDQwOTYpLAoJLy8gICAgICAgICAgICAgICAgIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uZXh0cmFjdCg0MDk2LCB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLnNpemUgLSA0MDk2KSwKCS8vICAgICAgICAgICAgIF0KCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWludCAwCglpbnQgNDA5NgoJYm94X2V4dHJhY3QKCWl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWludCA0MDk2CglieXRlIDB4NzA2ZjZmNmM1NDY1NmQ3MDZjNjE3NDY1NDE3MDcwNzI2Zjc2NjE2YzQyNzk3NDY1NzMgLy8gInBvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMiCglib3hfbGVuCgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLnNpemUKCWFzc2VydAoJaW50IDQwOTYKCS0KCWJveF9leHRyYWN0CglpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDcyCgkvLyBjbGVhclN0YXRlUHJvZ3JhbTogU3Rha2luZ1Bvb2wuY2xlYXJQcm9ncmFtKCkKCWJ5dGUgYjY0IEN3PT0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NzMKCS8vIGdsb2JhbE51bVVpbnQ6IFN0YWtpbmdQb29sLnNjaGVtYS5nbG9iYWwubnVtVWludAoJaW50IDExCglpdHhuX2ZpZWxkIEdsb2JhbE51bVVpbnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NzQKCS8vIGdsb2JhbE51bUJ5dGVTbGljZTogU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1CeXRlU2xpY2UKCWludCAzCglpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ3NQoJLy8gZXh0cmFQcm9ncmFtUGFnZXM6IDMKCWludCAzCglpdHhuX2ZpZWxkIEV4dHJhUHJvZ3JhbVBhZ2VzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDc2CgkvLyBhcHBsaWNhdGlvbkFyZ3M6IFsKCS8vICAgICAgICAgICAgICAgICAvLyBjcmVhdGluZ0NvbnRyYWN0SUQsIHZhbGlkYXRvcklkLCBwb29sSWQsIG1pbkVudHJ5U3Rha2UKCS8vICAgICAgICAgICAgICAgICBtZXRob2QoJ2NyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkJyksCgkvLyAgICAgICAgICAgICAgICAgaXRvYih0aGlzLmFwcC5pZCksCgkvLyAgICAgICAgICAgICAgICAgaXRvYih2YWxpZGF0b3JJZCksCgkvLyAgICAgICAgICAgICAgICAgaXRvYihudW1Qb29scyBhcyB1aW50NjQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWluRW50cnlTdGFrZSksCgkvLyAgICAgICAgICAgICBdCgltZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCXR4bmEgQXBwbGljYXRpb25zIDAKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglpbnQgMjA5CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ4NgoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyA9IG51bVBvb2xzIGFzIHVpbnQxNgoJaW50IDI0MgoJZnJhbWVfZGlnIDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoJaXRvYgoJZXh0cmFjdCA2IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDg5CgkvLyBwb29sQXBwSWQgPSB0aGlzLml0eG4uY3JlYXRlZEFwcGxpY2F0aW9uSUQuaWQKCWl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKCWZyYW1lX2J1cnkgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ5MAoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1tudW1Qb29scyAtIDFdLnBvb2xBcHBJZCA9IHBvb2xBcHBJZAoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgMCAvLyBudW1Qb29sczogdWludDY0CglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0OTEKCS8vIHRoaXMuYWRkUG9vbFRvTm9kZSh2YWxpZGF0b3JJZCwgcG9vbEFwcElkLCBub2RlTnVtKQoJZnJhbWVfZGlnIC0zIC8vIG5vZGVOdW06IHVpbnQ2NAoJZnJhbWVfZGlnIDEgLy8gcG9vbEFwcElkOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGFkZFBvb2xUb05vZGUKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0OTMKCS8vIHRoaXMucmV0aU9QX3ZhbGlkYXRvckFkZGVkUG9vbC5sb2coewoJLy8gICAgICAgICAgICAgaWQ6IHZhbGlkYXRvcklkLAoJLy8gICAgICAgICAgICAgbnVtOiBudW1Qb29scyBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKSwKCS8vICAgICAgICAgfSkKCWJ5dGUgMHhmYmNjMGY2YiAvLyByZXRpT1BfdmFsaWRhdG9yQWRkZWRQb29sKHVpbnQ2NCx1aW50MTYsdWludDY0KQoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWl0b2IKCWR1cAoJYml0bGVuCglpbnQgMTYKCTw9CgoJLy8gbnVtUG9vbHMgYXMgdWludDE2IG92ZXJmbG93ZWQgMTYgYml0cwoJYXNzZXJ0CglleHRyYWN0IDYgMgoJY29uY2F0CglmcmFtZV9kaWcgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cgljb25jYXQKCWxvZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ5OQoJLy8gcmV0dXJuIHsgaWQ6IHZhbGlkYXRvcklkLCBwb29sSWQ6IG51bVBvb2xzIGFzIHVpbnQ2NCwgcG9vbEFwcElkOiB0aGlzLml0eG4hLmNyZWF0ZWRBcHBsaWNhdGlvbklELmlkIH0KCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCglmcmFtZV9kaWcgMCAvLyBudW1Qb29sczogdWludDY0CglpdG9iCgljb25jYXQKCWl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKCWl0b2IKCWNvbmNhdAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDEKCXJldHN1YgoKLy8gYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KQoqYWJpX3JvdXRlX2FkZFN0YWtlOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gc3Rha2VkQW1vdW50UGF5bWVudDogcGF5Cgl0eG4gR3JvdXBJbmRleAoJaW50IDEKCS0KCWR1cAoJZ3R4bnMgVHlwZUVudW0KCWludCBwYXkKCT09CgoJLy8gYXJndW1lbnQgMiAoc3Rha2VkQW1vdW50UGF5bWVudCkgZm9yIGFkZFN0YWtlIG11c3QgYmUgYSBwYXkgdHJhbnNhY3Rpb24KCWFzc2VydAoKCS8vIGV4ZWN1dGUgYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBhZGRTdGFrZQoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFN0YWtlKHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4biwgdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgdmFsdWVUb1ZlcmlmeTogdWludDY0KTogVmFsaWRhdG9yUG9vbEtleQovLwovLyBBZGRzIHN0YWtlIHRvIGEgdmFsaWRhdG9yIHBvb2wuCi8vCi8vIEBwYXJhbSB7UGF5VHhufSBzdGFrZWRBbW91bnRQYXltZW50IC0gcGF5bWVudCBjb21pbmcgZnJvbSBzdGFrZXIgdG8gcGxhY2UgaW50byBhIHBvb2wKLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWx1ZVRvVmVyaWZ5IC0gb25seSBpZiB2YWxpZGF0b3IgaGFzIGdhdGluZyB0byBlbnRlciAtIHRoaXMgaXMgYXNzZXQgaWQgb3IgbmZkIGlkIHRoYXQgY29ycmVzcG9uZHMgdG8gZ2F0aW5nLgovLyBUeG4gc2VuZGVyIGlzIGZhY3RvcmVkIGluIGFzIHdlbGwgaWYgdGhhdCBpcyBwYXJ0IG9mIGdhdGluZy4KLy8gKiBAcmV0dXJucyB7VmFsaWRhdG9yUG9vbEtleX0gLSBUaGUga2V5IG9mIHRoZSB2YWxpZGF0b3IgcG9vbC4KYWRkU3Rha2U6Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA1CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTEyCgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS5leGlzdHMsICJzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGlzbid0IHZhbGlkIikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoKCS8vIHNwZWNpZmllZCB2YWxpZGF0b3IgaWQgaXNuJ3QgdmFsaWQKCWFzc2VydAoKCS8vICppZjEwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTE1CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5zdW5zZXR0aW5nT24gPiAwCglpbnQgMjI2CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWludCAwCgk+CglieiAqaWYxMF9lbmQKCgkvLyAqaWYxMF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MTcKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5zdW5zZXR0aW5nT24gPiBnbG9iYWxzLmxhdGVzdFRpbWVzdGFtcCwKCS8vICAgICAgICAgICAgICAgICAiY2FuJ3Qgc3Rha2Ugd2l0aCBhIHZhbGlkYXRvciB0aGF0IGlzIHBhc3QgaXRzIHN1bnNldHRpbmcgdGltZSIsCgkvLyAgICAgICAgICAgICApCglpbnQgMjI2CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKCT4KCgkvLyBjYW4ndCBzdGFrZSB3aXRoIGEgdmFsaWRhdG9yIHRoYXQgaXMgcGFzdCBpdHMgc3Vuc2V0dGluZyB0aW1lCglhc3NlcnQKCippZjEwX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUyMwoJLy8gc3Rha2VyID0gdGhpcy50eG4uc2VuZGVyCgl0eG4gU2VuZGVyCglmcmFtZV9idXJ5IDAgLy8gc3Rha2VyOiBhZGRyZXNzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTI3CgkvLyB2ZXJpZnlQYXlUeG4oc3Rha2VkQW1vdW50UGF5bWVudCwgewoJLy8gICAgICAgICAgICAgc2VuZGVyOiBzdGFrZXIsCgkvLyAgICAgICAgICAgICByZWNlaXZlcjogdGhpcy5hcHAuYWRkcmVzcywKCS8vICAgICAgICAgfSkKCS8vIHZlcmlmeSBzZW5kZXIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIFNlbmRlcgoJZnJhbWVfZGlnIDAgLy8gc3Rha2VyOiBhZGRyZXNzCgk9PQoKCS8vIHRyYW5zYWN0aW9uIHZlcmlmaWNhdGlvbiBmYWlsZWQ6IHsidHhuIjoic3Rha2VkQW1vdW50UGF5bWVudCIsImZpZWxkIjoic2VuZGVyIiwiZXhwZWN0ZWQiOiJzdGFrZXIifQoJYXNzZXJ0CgoJLy8gdmVyaWZ5IHJlY2VpdmVyCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBSZWNlaXZlcgoJZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCT09CgoJLy8gdHJhbnNhY3Rpb24gdmVyaWZpY2F0aW9uIGZhaWxlZDogeyJ0eG4iOiJzdGFrZWRBbW91bnRQYXltZW50IiwiZmllbGQiOiJyZWNlaXZlciIsImV4cGVjdGVkIjoidGhpcy5hcHAuYWRkcmVzcyJ9Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzUKCS8vIHRoaXMuZG9lc1N0YWtlck1lZXRHYXRpbmcodmFsaWRhdG9ySWQsIHZhbHVlVG9WZXJpZnkpCglmcmFtZV9kaWcgLTMgLy8gdmFsdWVUb1ZlcmlmeTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBkb2VzU3Rha2VyTWVldEdhdGluZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUzNwoJLy8gcmVhbEFtb3VudCA9IHN0YWtlZEFtb3VudFBheW1lbnQuYW1vdW50CglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBBbW91bnQKCWZyYW1lX2J1cnkgMSAvLyByZWFsQW1vdW50OiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzgKCS8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NCA9IDAKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gbWJyQW10TGVmdEJlaGluZDogdWludDY0CgoJLy8gKmlmMTFfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NDAKCS8vIHRoaXMuZG9lc1N0YWtlck5lZWRUb1BheU1CUihzdGFrZXIpCglmcmFtZV9kaWcgMCAvLyBzdGFrZXI6IGFkZHJlc3MKCWNhbGxzdWIgZG9lc1N0YWtlck5lZWRUb1BheU1CUgoJYnogKmlmMTFfZW5kCgoJLy8gKmlmMTFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTQzCgkvLyBtYnJBbXRMZWZ0QmVoaW5kID0gdGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkU3Rha2VyTWJyCgljYWxsc3ViIGdldE1ickFtb3VudHMKCWV4dHJhY3QgMjQgOAoJYnRvaQoJZnJhbWVfYnVyeSAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU0NAoJLy8gcmVhbEFtb3VudCAtPSBtYnJBbXRMZWZ0QmVoaW5kCglmcmFtZV9kaWcgMSAvLyByZWFsQW1vdW50OiB1aW50NjQKCWZyYW1lX2RpZyAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoJLQoJZnJhbWVfYnVyeSAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU0NQoJLy8gdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikuY3JlYXRlKCkKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAwIC8vIHN0YWtlcjogYWRkcmVzcwoJY29uY2F0CglpbnQgMTQ0Cglib3hfY3JlYXRlCglwb3AKCippZjExX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU0OQoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS50b3RhbEFsZ29TdGFrZWQgKyByZWFsQW1vdW50IDwgdGhpcy5tYXhBbGxvd2VkU3Rha2UoKSwKCS8vICAgICAgICAgICAgICd0b3RhbCBzdGFrZWQgZm9yIGFsbCBvZiBhIHZhbGlkYXRvcnMgcG9vbHMgbWF5IG5vdCBleGNlZWQgaGFyZCBjYXAnLAoJLy8gICAgICAgICApCglpbnQgMjUyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoJKwoJY2FsbHN1YiBtYXhBbGxvd2VkU3Rha2UKCTwKCgkvLyB0b3RhbCBzdGFrZWQgZm9yIGFsbCBvZiBhIHZhbGlkYXRvcnMgcG9vbHMgbWF5IG5vdCBleGNlZWQgaGFyZCBjYXAKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU1NgoJLy8gZmluZFJldCA9IHRoaXMuZmluZFBvb2xGb3JTdGFrZXIodmFsaWRhdG9ySWQsIHN0YWtlciwgcmVhbEFtb3VudCkKCWZyYW1lX2RpZyAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoJZnJhbWVfZGlnIDAgLy8gc3Rha2VyOiBhZGRyZXNzCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBmaW5kUG9vbEZvclN0YWtlcgoJZnJhbWVfYnVyeSAzIC8vIGZpbmRSZXQ6ICgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NTcKCS8vIHBvb2xLZXkgPSBmaW5kUmV0WzBdCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NTgKCS8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IgPSBmaW5kUmV0WzFdCglmcmFtZV9kaWcgMyAvLyBmaW5kUmV0OiAoKHVpbnQ2NCx1aW50NjQsdWludDY0KSxib29sLGJvb2wpCglzdG9yZSAyNTUgLy8gZnVsbCBhcnJheQoJbG9hZCAyNTUgLy8gZnVsbCBhcnJheQoJaW50IDE5MgoJZ2V0Yml0CglmcmFtZV9idXJ5IDQgLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU1OQoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sID0gZmluZFJldFsyXQoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWludCAxOTMKCWdldGJpdAoJZnJhbWVfYnVyeSA1IC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoKCS8vICppZjEyX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTYwCgkvLyBwb29sS2V5LnBvb2xJZCA9PT0gMAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMAoJPT0KCWJ6ICppZjEyX2VuZAoKCS8vICppZjEyX2NvbnNlcXVlbnQKCS8vIE5vIHBvb2wgYXZhaWxhYmxlIHdpdGggZnJlZSBzdGFrZS4gIFZhbGlkYXRvciBuZWVkcyB0byBhZGQgYW5vdGhlciBwb29sCgllcnIKCippZjEyX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU2NQoJLy8gdGhpcy51cGRhdGVTdGFrZXJQb29sU2V0KHN0YWtlciwgcG9vbEtleSkKCWZyYW1lX2RpZyAzIC8vIGZpbmRSZXQ6ICgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKCXN0b3JlIDI1NSAvLyBmdWxsIGFycmF5Cglsb2FkIDI1NSAvLyBmdWxsIGFycmF5CglleHRyYWN0IDAgMjQKCWZyYW1lX2RpZyAwIC8vIHN0YWtlcjogYWRkcmVzcwoJY2FsbHN1YiB1cGRhdGVTdGFrZXJQb29sU2V0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTY4CgkvLyB0aGlzLmNhbGxQb29sQWRkU3Rha2UoCgkvLyAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LAoJLy8gICAgICAgICAgICAgcG9vbEtleSwKCS8vICAgICAgICAgICAgIG1ickFtdExlZnRCZWhpbmQsCgkvLyAgICAgICAgICAgICBpc05ld1N0YWtlclRvVmFsaWRhdG9yLAoJLy8gICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1Byb3RvY29sLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgNSAvLyBpc05ld1N0YWtlclRvUHJvdG9jb2w6IGJvb2wKCWZyYW1lX2RpZyA0IC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCWZyYW1lX2RpZyAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMCAyNAoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4bgoJY2FsbHN1YiBjYWxsUG9vbEFkZFN0YWtlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTc1CgkvLyB0aGlzLnJldGlPUF9zdGFrZUFkZGVkLmxvZyh7CgkvLyAgICAgICAgICAgICBpZDogdmFsaWRhdG9ySWQsCgkvLyAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLAoJLy8gICAgICAgICAgICAgYW1vdW50U3Rha2VkOiByZWFsQW1vdW50LAoJLy8gICAgICAgICAgICAgc3Rha2VyOiBzdGFrZXIsCgkvLyAgICAgICAgIH0pCglieXRlIDB4OTYyYjQxNDMgLy8gcmV0aU9QX3N0YWtlQWRkZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQpCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgMCAvLyBzdGFrZXI6IGFkZHJlc3MKCWNvbmNhdAoJZnJhbWVfZGlnIDEgLy8gcmVhbEFtb3VudDogdWludDY0CglpdG9iCgljb25jYXQKCWNvbmNhdAoJbG9nCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTgzCgkvLyByZXR1cm4gcG9vbEtleQoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMCAyNAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDUKCXJldHN1YgoKLy8gc2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KQoqYWJpX3JvdXRlX3NldFRva2VuUGF5b3V0UmF0aW86CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIHNldFRva2VuUGF5b3V0UmF0aW8odWludDY0KSh1aW50NjRbMjRdLHVpbnQ2NCkKCWNhbGxzdWIgc2V0VG9rZW5QYXlvdXRSYXRpbwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIHNldFRva2VuUGF5b3V0UmF0aW8odmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IFBvb2xUb2tlblBheW91dFJhdGlvCi8vCi8vIHNldFRva2VuUGF5b3V0UmF0aW8gaXMgY2FsbGVkIGJ5IFN0YWtpbmcgUG9vbCAjIDEgKE9OTFkpIHRvIGFzayB0aGUgdmFsaWRhdG9yICh1cykgdG8gY2FsY3VsYXRlIHRoZSByYXRpb3MKLy8gb2Ygc3Rha2UgaW4gdGhlIHBvb2xzIGZvciBzdWJzZXF1ZW50IHRva2VuIHBheW91dHMgKGllOiAyIHBvb2xzLCAnMTAwJyBhbGdvIHRvdGFsIHN0YWtlZCwgNjAgaW4gcG9vbCAxLCBhbmQgNDAKLy8gaW4gcG9vbCAyKSAgVGhpcyBpcyBkb25lIHNvIHdlIGhhdmUgYSBzdGFibGUgc25hcHNob3Qgb2Ygc3Rha2UgLSB0YWtlbiBvbmNlIHBlciBlcG9jaCAtIG9ubHkgdHJpZ2dlcmVkIGJ5Ci8vIHBvb2wgMSBkb2luZyBwYXlvdXQuICBwb29scyBvdGhlciB0aGFuIDEgZG9pbmcgcGF5b3V0IGNhbGwgcG9vbCAxIHRvIGFzayBpdCBkbyBpdCBmaXJzdC4KLy8gSXQgd291bGQgYmUgNjAvNDAlIGluIHRoZSBwb29sUGN0T2ZXaG9sZSB2YWx1ZXMuICBUaGUgdG9rZW4gcmV3YXJkIHBheW91dHMgdGhlbiB1c2UgdGhlc2UgdmFsdWVzIGluc3RlYWQgb2YKLy8gdGhlaXIgJ2N1cnJlbnQnIHN0YWtlIHdoaWNoIGNoYW5nZXMgYXMgcGFydCBvZiB0aGUgcGF5b3V0cyB0aGVtc2VsdmVzIChhbmQgcGVvcGxlIGNvdWxkIGJlIGNoYW5naW5nIHN0YWtlCi8vIGR1cmluZyB0aGUgZXBvY2ggdXBkYXRlcyBhY3Jvc3MgcG9vbHMpCi8vCi8vIE11bHRpcGxlIHBvb2xzIHdpbGwgY2FsbCB1cyB2aWEgcG9vbCAxIChwb29sMi0+cG9vbDEtPnZhbGlkYXRvciwgZXRjLikgc28gZG9uJ3QgYXNzZXJ0IG9uIHBvb2wxIGNhbGxpbmcgbXVsdGlwbGUKLy8gdGltZXMgaW4gc2FtZSBlcG9jaC4gIEp1c3QgcmV0dXJuLgovLwovLyBAcGFyYW0gdmFsaWRhdG9ySWQgLSB2YWxpZGF0b3IgaWQgKGFuZCB0aHVzIHBvb2wpIGNhbGxpbmcgdXMuICBWZXJpZmllZCBzbyB0aGF0IHNlbmRlciBNVVNUIGJlIHBvb2wgMSBvZiB0aGlzIHZhbGlkYXRvci4KLy8gQHJldHVybnMgUG9vbFRva2VuUGF5b3V0UmF0aW8gLSB0aGUgZmluaXNoZWQgcmF0aW8gZGF0YQpzZXRUb2tlblBheW91dFJhdGlvOgoJcHJvdG8gMSAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gOAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYwMwoJLy8gcG9vbDFBcHBJRCA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkCglpbnQgMjY4CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMCAvLyBwb29sMUFwcElEOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MDQKCS8vIGFzc2VydChwb29sMUFwcElEICE9PSAwKQoJZnJhbWVfZGlnIDAgLy8gcG9vbDFBcHBJRDogdWludDY0CglpbnQgMAoJIT0KCWFzc2VydAoKCS8vICppZjEzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjA2CgkvLyB0aGlzLnR4bi5zZW5kZXIgIT09IEFwcElELmZyb21VaW50NjQocG9vbDFBcHBJRCkuYWRkcmVzcwoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIDAgLy8gcG9vbDFBcHBJRDogdWludDY0CglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCSE9CglieiAqaWYxM19lbmQKCgkvLyAqaWYxM19jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MDcKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWIgKnNldFRva2VuUGF5b3V0UmF0aW8qcmV0dXJuCgoqaWYxM19lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MTMKCS8vIGN1clJvdW5kID0gZ2xvYmFscy5yb3VuZAoJZ2xvYmFsIFJvdW5kCglmcmFtZV9idXJ5IDEgLy8gY3VyUm91bmQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYxNAoJLy8gbGFzdFBheW91dFVwZGF0ZSA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUudG9rZW5QYXlvdXRSYXRpby51cGRhdGVkRm9yUGF5b3V0CglpbnQgODkyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCgkvLyAqaWYxNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYxNQoJLy8gbGFzdFBheW91dFVwZGF0ZSAhPT0gMAoJZnJhbWVfZGlnIDIgLy8gbGFzdFBheW91dFVwZGF0ZTogdWludDY0CglpbnQgMAoJIT0KCWJ6ICppZjE0X2VuZAoKCS8vICppZjE0X2NvbnNlcXVlbnQKCS8vICppZjE1X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjE3CgkvLyAoQXBwSUQuZnJvbVVpbnQ2NChwb29sMUFwcElEKS5nbG9iYWxTdGF0ZSgnbGFzdFBheW91dCcpIGFzIHVpbnQ2NCkgPT09IGxhc3RQYXlvdXRVcGRhdGUKCWZyYW1lX2RpZyAwIC8vIHBvb2wxQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDZjNjE3Mzc0NTA2MTc5NmY3NTc0IC8vICJsYXN0UGF5b3V0IgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQocG9vbDFBcHBJRCkuZ2xvYmFsU3RhdGUoJ2xhc3RQYXlvdXQnKQoJYXNzZXJ0CglmcmFtZV9kaWcgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCT09CglieiAqaWYxNV9lbmQKCgkvLyAqaWYxNV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MTgKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWIgKnNldFRva2VuUGF5b3V0UmF0aW8qcmV0dXJuCgoqaWYxNV9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MjAKCS8vIGVwb2NoUm91bmRMZW5ndGggPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lcG9jaFJvdW5kTGVuZ3RoIGFzIHVpbnQ2NAoJaW50IDE2OQoJaW50IDQKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDMgLy8gZXBvY2hSb3VuZExlbmd0aDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjIxCgkvLyB0aGlzRXBvY2hCZWdpbiA9IGN1clJvdW5kIC0gKGN1clJvdW5kICUgZXBvY2hSb3VuZExlbmd0aCkKCWZyYW1lX2RpZyAxIC8vIGN1clJvdW5kOiB1aW50NjQKCWZyYW1lX2RpZyAxIC8vIGN1clJvdW5kOiB1aW50NjQKCWZyYW1lX2RpZyAzIC8vIGVwb2NoUm91bmRMZW5ndGg6IHVpbnQ2NAoJJQoJLQoJZnJhbWVfYnVyeSA0IC8vIHRoaXNFcG9jaEJlZ2luOiB1aW50NjQKCgkvLyAqaWYxNl9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYyMwoJLy8gbGFzdFBheW91dFVwZGF0ZSAtIChsYXN0UGF5b3V0VXBkYXRlICUgZXBvY2hSb3VuZExlbmd0aCkgPT09IHRoaXNFcG9jaEJlZ2luCglmcmFtZV9kaWcgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCWZyYW1lX2RpZyAyIC8vIGxhc3RQYXlvdXRVcGRhdGU6IHVpbnQ2NAoJZnJhbWVfZGlnIDMgLy8gZXBvY2hSb3VuZExlbmd0aDogdWludDY0CgklCgktCglmcmFtZV9kaWcgNCAvLyB0aGlzRXBvY2hCZWdpbjogdWludDY0Cgk9PQoJYnogKmlmMTZfZW5kCgoJLy8gKmlmMTZfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjI0CgkvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS50b2tlblBheW91dFJhdGlvCglpbnQgNzAwIC8vIGhlYWRPZmZzZXQKCWludCAyMDAKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CgliICpzZXRUb2tlblBheW91dFJhdGlvKnJldHVybgoKKmlmMTZfZW5kOgoKKmlmMTRfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjI3CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8udXBkYXRlZEZvclBheW91dCA9IGN1clJvdW5kCglpbnQgODkyCglmcmFtZV9kaWcgMSAvLyBjdXJSb3VuZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYyOQoJLy8gY3VyTnVtUG9vbHMgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnN0YXRlLm51bVBvb2xzIGFzIHVpbnQ2NAoJaW50IDI0MgoJaW50IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDUgLy8gY3VyTnVtUG9vbHM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYzMAoJLy8gdG90YWxTdGFrZUZvclZhbGlkYXRvciA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUudG90YWxBbGdvU3Rha2VkCglpbnQgMjUyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgNiAvLyB0b3RhbFN0YWtlRm9yVmFsaWRhdG9yOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MzEKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgY3VyTnVtUG9vbHM7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDcgLy8gaTogdWludDY0CgoqZm9yXzI6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MzEKCS8vIGkgPCBjdXJOdW1Qb29scwoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglmcmFtZV9kaWcgNSAvLyBjdXJOdW1Qb29sczogdWludDY0Cgk8CglieiAqZm9yXzJfZW5kCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjM2CgkvLyBvdXJQb29sUGN0T2ZXaG9sZSA9IHdpZGVSYXRpbygKCS8vICAgICAgICAgICAgICAgICBbdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1tpXS50b3RhbEFsZ29TdGFrZWQsIDFfMDAwXzAwMF0sCgkvLyAgICAgICAgICAgICAgICAgW3RvdGFsU3Rha2VGb3JWYWxpZGF0b3JdLAoJLy8gICAgICAgICAgICAgKQoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglpbnQgMV8wMDBfMDAwCgltdWx3CglpbnQgMAoJZnJhbWVfZGlnIDYgLy8gdG90YWxTdGFrZUZvclZhbGlkYXRvcjogdWludDY0CglkaXZtb2R3Cglwb3AKCXBvcAoJc3dhcAoJIQoKCS8vIHdpZGVSYXRpbyBmYWlsZWQKCWFzc2VydAoJZnJhbWVfYnVyeSA4IC8vIG91clBvb2xQY3RPZldob2xlOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NDAKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUudG9rZW5QYXlvdXRSYXRpby5wb29sUGN0T2ZXaG9sZVtpXSA9IG91clBvb2xQY3RPZldob2xlCglpbnQgNzAwCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWZyYW1lX2RpZyA4IC8vIG91clBvb2xQY3RPZldob2xlOiB1aW50NjQKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoqZm9yXzJfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MzEKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSA3IC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzIKCipmb3JfMl9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NDIKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCipzZXRUb2tlblBheW91dFJhdGlvKnJldHVybjoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDgKCXJldHN1YgoKLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcygodWludDY0LHVpbnQ2NCx1aW50NjQpLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkCiphYmlfcm91dGVfc3Rha2VVcGRhdGVkVmlhUmV3YXJkczoKCS8vIHNhdHVyYXRlZEJ1cm5Ub0ZlZVNpbms6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQoJYnRvaQoKCS8vIHZhbGlkYXRvckNvbW1pc3Npb246IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAoJYnRvaQoKCS8vIHJld2FyZFRva2VuQW1vdW50UmVzZXJ2ZWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwoJYnRvaQoKCS8vIGFsZ29Ub0FkZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglidG9pCgoJLy8gcG9vbEtleTogKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZHVwCglsZW4KCWludCAyNAoJPT0KCgkvLyBhcmd1bWVudCA0IChwb29sS2V5KSBmb3Igc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyBtdXN0IGJlIGEgKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBzdGFrZVVwZGF0ZWRWaWFSZXdhcmRzKCh1aW50NjQsdWludDY0LHVpbnQ2NCksdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKCWNhbGxzdWIgc3Rha2VVcGRhdGVkVmlhUmV3YXJkcwoJaW50IDEKCXJldHVybgoKLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyhwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5LCBhbGdvVG9BZGQ6IHVpbnQ2NCwgcmV3YXJkVG9rZW5BbW91bnRSZXNlcnZlZDogdWludDY0LCB2YWxpZGF0b3JDb21taXNzaW9uOiB1aW50NjQsIHNhdHVyYXRlZEJ1cm5Ub0ZlZVNpbms6IHVpbnQ2NCk6IHZvaWQKLy8KLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyBpcyBjYWxsZWQgYnkgU3Rha2luZyBwb29scyB0byBpbmZvcm0gdGhlIHZhbGlkYXRvciAodXMpIHRoYXQgYSBwYXJ0aWN1bGFyIGFtb3VudCBvZiB0b3RhbAovLyBzdGFrZSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgc3BlY2lmaWVkIHBvb2wuICBUaGlzIGlzIHVzZWQgdG8gdXBkYXRlIHRoZSBzdGF0cyB3ZSBoYXZlIGluIG91ciBQb29sSW5mbyBzdG9yYWdlLgovLyBUaGUgY2FsbGluZyBBcHAgaWQgaXMgdmFsaWRhdGVkIGFnYWluc3Qgb3VyIHBvb2wgbGlzdCBhcyB3ZWxsLgovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBWYWxpZGF0b3JQb29sS2V5IHR5cGUKLy8gQHBhcmFtIHt1aW50NjR9IGFsZ29Ub0FkZCAtIGFtb3VudCB0aGlzIHZhbGlkYXRvcidzIHRvdGFsIHN0YWtlIGluY3JlYXNlZCB2aWEgcmV3YXJkcwovLyBAcGFyYW0ge3VpbnQ2NH0gcmV3YXJkVG9rZW5BbW91bnRSZXNlcnZlZCAtIGFtb3VudCB0aGlzIHZhbGlkYXRvcidzIHRvdGFsIHN0YWtlIGluY3JlYXNlZCB2aWEgcmV3YXJkcyAodGhhdCBzaG91bGQgYmUKLy8gQHBhcmFtIHt1aW50NjR9IHZhbGlkYXRvckNvbW1pc3Npb24gLSB0aGUgY29tbWlzc2lvbiBhbW91bnQgdGhlIHZhbGlkYXRvciB3YXMgcGFpZCwgaWYgYW55Ci8vIEBwYXJhbSB7dWludDY0fSBzYXR1cmF0ZWRCdXJuVG9GZWVTaW5rIC0gaWYgdGhlIHBvb2wgd2FzIGluIHNhdHVyYXRlZCBzdGF0ZSwgdGhlIGFtb3VudCBzZW50IGJhY2sgdG8gdGhlIGZlZSBzaW5rLgovLyBzZWVuIGFzICdhY2NvdW50ZWQgZm9yL3BlbmRpbmcgc3BlbnQnKQpzdGFrZVVwZGF0ZWRWaWFSZXdhcmRzOgoJcHJvdG8gNSAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjYzCgkvLyB0aGlzLnZlcmlmeVBvb2xLZXlDYWxsZXIocG9vbEtleSkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CgljYWxsc3ViIHZlcmlmeVBvb2xLZXlDYWxsZXIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NjYKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCArPSBhbGdvVG9BZGQKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAxMCAvLyBoZWFkT2Zmc2V0CgkrCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NjcKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS50b3RhbEFsZ29TdGFrZWQgKz0gYWxnb1RvQWRkCglpbnQgMjUyCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMiAvLyBhbGdvVG9BZGQ6IHVpbnQ2NAoJKwoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjY4CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUucmV3YXJkVG9rZW5IZWxkQmFjayArPSByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkCglpbnQgMjYwCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkOiB1aW50NjQKCSsKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY3MAoJLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgKz0gYWxnb1RvQWRkCglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglhcHBfZ2xvYmFsX2dldAoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CgkrCglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglzd2FwCglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY3MwoJLy8gdGhpcy5yZXZlcmlmeU5GRE93bmVyc2hpcChwb29sS2V5LmlkKQoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCgljYWxsc3ViIHJldmVyaWZ5TkZET3duZXJzaGlwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Njc1CgkvLyB0aGlzLnJldGlPUF9lcG9jaFJld2FyZFVwZGF0ZS5sb2coewoJLy8gICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLAoJLy8gICAgICAgICAgICAgYWxnb0FkZGVkOiBhbGdvVG9BZGQsCgkvLyAgICAgICAgICAgICByZXdhcmRUb2tlbkhlbGRCYWNrOiByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkLAoJLy8gICAgICAgICAgICAgc2F0dXJhdGVkQnVyblRvRmVlU2luazogc2F0dXJhdGVkQnVyblRvRmVlU2luaywKCS8vICAgICAgICAgICAgIHZhbGlkYXRvckNvbW1pc3Npb246IHZhbGlkYXRvckNvbW1pc3Npb24sCgkvLyAgICAgICAgIH0pCglieXRlIDB4YjNlNDdjM2QgLy8gcmV0aU9QX2Vwb2NoUmV3YXJkVXBkYXRlKHVpbnQ2NCx1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTQgLy8gdmFsaWRhdG9yQ29tbWlzc2lvbjogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtNSAvLyBzYXR1cmF0ZWRCdXJuVG9GZWVTaW5rOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY29uY2F0Cglsb2cKCXJldHN1YgoKLy8gc3Rha2VSZW1vdmVkKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wpdm9pZAoqYWJpX3JvdXRlX3N0YWtlUmVtb3ZlZDoKCS8vIHN0YWtlclJlbW92ZWQ6IGJvb2wKCXR4bmEgQXBwbGljYXRpb25BcmdzIDUKCWR1cAoJbGVuCglpbnQgMQoJPT0KCgkvLyBhcmd1bWVudCAwIChzdGFrZXJSZW1vdmVkKSBmb3Igc3Rha2VSZW1vdmVkIG11c3QgYmUgYSBib29sCglhc3NlcnQKCWludCAwCglnZXRiaXQKCgkvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDQKCWJ0b2kKCgkvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDMKCWJ0b2kKCgkvLyBzdGFrZXI6IGFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMzIKCT09CgoJLy8gYXJndW1lbnQgMyAoc3Rha2VyKSBmb3Igc3Rha2VSZW1vdmVkIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBwb29sS2V5OiAodWludDY0LHVpbnQ2NCx1aW50NjQpCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDI0Cgk9PQoKCS8vIGFyZ3VtZW50IDQgKHBvb2xLZXkpIGZvciBzdGFrZVJlbW92ZWQgbXVzdCBiZSBhICh1aW50NjQsdWludDY0LHVpbnQ2NCkKCWFzc2VydAoKCS8vIGV4ZWN1dGUgc3Rha2VSZW1vdmVkKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wpdm9pZAoJY2FsbHN1YiBzdGFrZVJlbW92ZWQKCWludCAxCglyZXR1cm4KCi8vIHN0YWtlUmVtb3ZlZChwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5LCBzdGFrZXI6IEFkZHJlc3MsIGFtb3VudFJlbW92ZWQ6IHVpbnQ2NCwgcmV3YXJkUmVtb3ZlZDogdWludDY0LCBzdGFrZXJSZW1vdmVkOiBib29sZWFuKTogdm9pZAovLwovLyBzdGFrZVJlbW92ZWQgaXMgY2FsbGVkIGJ5IFN0YWtpbmcgcG9vbHMgdG8gaW5mb3JtIHRoZSB2YWxpZGF0b3IgKHVzKSB0aGF0IGEgcGFydGljdWxhciBhbW91bnQgb2YgdG90YWwgc3Rha2UgaGFzIGJlZW4gcmVtb3ZlZAovLyBmcm9tIHRoZSBzcGVjaWZpZWQgcG9vbC4gIFRoaXMgaXMgdXNlZCB0byB1cGRhdGUgdGhlIHN0YXRzIHdlIGhhdmUgaW4gb3VyIFBvb2xJbmZvIHN0b3JhZ2UuCi8vIElmIGFueSBhbW91bnQgb2YgcmV3YXJkUmVtb3ZlZCBpcyBzcGVjaWZpZWQsIHRoZW4gdGhhdCBhbW91bnQgb2YgcmV3YXJkIGlzIHNlbnQgdG8gdGhlIHVzZQovLyBUaGUgY2FsbGluZyBBcHAgaWQgaXMgdmFsaWRhdGVkIGFnYWluc3Qgb3VyIHBvb2wgbGlzdCBhcyB3ZWxsLgovLwovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgY2FsbGluZyB1cyBmcm9tIHdoaWNoIHN0YWtlIHdhcyByZW1vdmVkCi8vIEBwYXJhbSB7QWRkcmVzc30gc3Rha2VyCi8vIEBwYXJhbSB7dWludDY0fSBhbW91bnRSZW1vdmVkIC0gYWxnbyBhbW91bnQgcmVtb3ZlZAovLyBAcGFyYW0ge3VpbnQ2NH0gcmV3YXJkUmVtb3ZlZCAtIGlmIGFwcGxpY2FibGUsIGFtb3VudCBvZiB0b2tlbiByZXdhcmQgcmVtb3ZlZCAoYnkgcG9vbCAxIGNhbGxlcikgb3IgVE8gcmVtb3ZlIGFuZCBwYXkgb3V0ICh2aWEgcG9vbCAxIGZyb20gZGlmZmVyZW50IHBvb2wgY2FsbGVyKQovLyBAcGFyYW0ge2Jvb2xlYW59IHN0YWtlclJlbW92ZWQKc3Rha2VSZW1vdmVkOgoJcHJvdG8gNSAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMwoKCS8vICppZjE3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzA1CgkvLyBnbG9iYWxzLm9wY29kZUJ1ZGdldCA8IDMwMAoJZ2xvYmFsIE9wY29kZUJ1ZGdldAoJaW50IDMwMAoJPAoJYnogKmlmMTdfZW5kCgoJLy8gKmlmMTdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzA2CgkvLyBpbmNyZWFzZU9wY29kZUJ1ZGdldCgpCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJaW50IDAKCWl0eG5fZmllbGQgRmVlCglieXRlIGI2NCBDb0VCIC8vICNwcmFnbWEgdmVyc2lvbiAxMDsgaW50IDEKCWR1cAoJaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCWludCBEZWxldGVBcHBsaWNhdGlvbgoJaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KCWl0eG5fc3VibWl0CgoqaWYxN19lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MDgKCS8vIHRoaXMudmVyaWZ5UG9vbEtleUNhbGxlcihwb29sS2V5KQoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWNhbGxzdWIgdmVyaWZ5UG9vbEtleUNhbGxlcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxMgoJLy8gYXNzZXJ0KGFtb3VudFJlbW92ZWQgPiAwIHx8IHJld2FyZFJlbW92ZWQgPiAwLCAnc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGFsZ28gb3IgcmV3YXJkIHdhcyByZW1vdmVkJykKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWludCAwCgk+CglkdXAKCWJueiAqc2tpcF9vcjIKCWZyYW1lX2RpZyAtNCAvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCWludCAwCgk+Cgl8fAoKKnNraXBfb3IyOgoJLy8gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGFsZ28gb3IgcmV3YXJkIHdhcyByZW1vdmVkCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MTUKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCAtPSBhbW91bnRSZW1vdmVkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxNgoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsQWxnb1N0YWtlZCAtPSBhbW91bnRSZW1vdmVkCglpbnQgMjUyCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxNwoJLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgLT0gYW1vdW50UmVtb3ZlZAoJYnl0ZSAweDczNzQ2MTZiNjU2NCAvLyAic3Rha2VkIgoJYXBwX2dsb2JhbF9nZXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCXN3YXAKCWFwcF9nbG9iYWxfcHV0CgoJLy8gKmlmMThfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MTkKCS8vIHJld2FyZFJlbW92ZWQgPiAwCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CglpbnQgMAoJPgoJYnogKmlmMThfZWxzZQoKCS8vICppZjE4X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyMAoJLy8gcmV3YXJkVG9rZW5JRCA9IHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5jb25maWcucmV3YXJkVG9rZW5JZAoJaW50IDE1MwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIHJld2FyZFRva2VuSUQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyMQoJLy8gYXNzZXJ0KHJld2FyZFRva2VuSUQgIT09IDAsICJyZXdhcmRSZW1vdmVkIGNhbid0IGJlIHNldCBpZiB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIHJld2FyZCB0b2tlbiEiKQoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JRDogdWludDY0CglpbnQgMAoJIT0KCgkvLyByZXdhcmRSZW1vdmVkIGNhbid0IGJlIHNldCBpZiB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIHJld2FyZCB0b2tlbiEKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyMgoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS5yZXdhcmRUb2tlbkhlbGRCYWNrID49IHJld2FyZFJlbW92ZWQsCgkvLyAgICAgICAgICAgICAgICAgJ3Jld2FyZCBiZWluZyByZW1vdmVkIG11c3QgYmUgY292ZXJlZCBieSBob2xkIGJhY2sgYW1vdW50JywKCS8vICAgICAgICAgICAgICkKCWludCAyNjAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtNCAvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCT49CgoJLy8gcmV3YXJkIGJlaW5nIHJlbW92ZWQgbXVzdCBiZSBjb3ZlcmVkIGJ5IGhvbGQgYmFjayBhbW91bnQKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyOAoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnJld2FyZFRva2VuSGVsZEJhY2sgLT0gcmV3YXJkUmVtb3ZlZAoJaW50IDI2MAoJZHVwCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CgktCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyAqaWYxOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczMwoJLy8gcG9vbEtleS5wb29sSWQgIT09IDEKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCSE9CglieiAqaWYxOV9lbmQKCgkvLyAqaWYxOV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MzQKCS8vIHNlbmRNZXRob2RDYWxsPHR5cGVvZiBTdGFraW5nUG9vbC5wcm90b3R5cGUucGF5VG9rZW5SZXdhcmQ+KHsKCS8vICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRDogQXBwSUQuZnJvbVVpbnQ2NCh0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJnczogW3N0YWtlciwgcmV3YXJkVG9rZW5JRCwgcmV3YXJkUmVtb3ZlZF0sCgkvLyAgICAgICAgICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgltZXRob2QgInBheVRva2VuUmV3YXJkKGFkZHJlc3MsdWludDY0LHVpbnQ2NCl2b2lkIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MzUKCS8vIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQodGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzWzBdLnBvb2xBcHBJZCkKCWludCAyNjgKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczNgoJLy8gbWV0aG9kQXJnczogW3N0YWtlciwgcmV3YXJkVG9rZW5JRCwgcmV3YXJkUmVtb3ZlZF0KCWZyYW1lX2RpZyAtMiAvLyBzdGFrZXI6IEFkZHJlc3MKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklEOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCippZjE5X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczOQoJLy8gdGhpcy5yZXRpT1Bfc3Rha2VSZW1vdmVkLmxvZyh7CgkvLyAgICAgICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICAgICAgcG9vbE51bTogcG9vbEtleS5wb29sSWQgYXMgdWludDE2LAoJLy8gICAgICAgICAgICAgICAgIHBvb2xBcHBJZDogQXBwSUQuZnJvbVVpbnQ2NChwb29sS2V5LnBvb2xBcHBJZCksCgkvLyAgICAgICAgICAgICAgICAgc3Rha2VyOiBzdGFrZXIsCgkvLyAgICAgICAgICAgICAgICAgYW1vdW50VW5zdGFrZWQ6IGFtb3VudFJlbW92ZWQsCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5Bc3NldElkOiBBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JRCksCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5zUmVjZWl2ZWQ6IHJld2FyZFJlbW92ZWQsCgkvLyAgICAgICAgICAgICB9KQoJYnl0ZSAweDEyZjRiZDRiIC8vIHJldGlPUF9zdGFrZVJlbW92ZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTIgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC00IC8vIHJld2FyZFJlbW92ZWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklEOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWIgKmlmMThfZW5kCgoqaWYxOF9lbHNlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzQ5CgkvLyB0aGlzLnJldGlPUF9zdGFrZVJlbW92ZWQubG9nKHsKCS8vICAgICAgICAgICAgICAgICBpZDogcG9vbEtleS5pZCwKCS8vICAgICAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICAgICAgcG9vbEFwcElkOiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICBzdGFrZXI6IHN0YWtlciwKCS8vICAgICAgICAgICAgICAgICBhbW91bnRVbnN0YWtlZDogYW1vdW50UmVtb3ZlZCwKCS8vICAgICAgICAgICAgICAgICAvLyBubyB0b2tlbnMgcmV3YXJkZWQuLgoJLy8gICAgICAgICAgICAgICAgIHJld2FyZFRva2VuQXNzZXRJZDogQXNzZXRJRC56ZXJvSW5kZXgsCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5zUmVjZWl2ZWQ6IDAsCgkvLyAgICAgICAgICAgICB9KQoJYnl0ZSAweDEyZjRiZDRiIC8vIHJldGlPUF9zdGFrZVJlbW92ZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTIgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAKCWNvbmNhdAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCippZjE4X2VuZDoKCS8vICppZjIwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzYxCgkvLyBzdGFrZXJSZW1vdmVkCglmcmFtZV9kaWcgLTUgLy8gc3Rha2VyUmVtb3ZlZDogYm9vbGVhbgoJYnogKmlmMjBfZW5kCgoJLy8gKmlmMjBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzYzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbcG9vbEtleS5wb29sSWQgLSAxXS50b3RhbFN0YWtlcnMgLT0gMQoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJaW50IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDEKCS0KCWl0b2IKCWV4dHJhY3QgNiAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NjUKCS8vIHJlbW92ZVJldCA9IHRoaXMucmVtb3ZlRnJvbVN0YWtlclBvb2xTZXQoc3Rha2VyLCA8VmFsaWRhdG9yUG9vbEtleT57CgkvLyAgICAgICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICAgICAgcG9vbElkOiBwb29sS2V5LnBvb2xJZCwKCS8vICAgICAgICAgICAgICAgICBwb29sQXBwSWQ6IHBvb2xLZXkucG9vbEFwcElkLAoJLy8gICAgICAgICAgICAgfSkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY2FsbHN1YiByZW1vdmVGcm9tU3Rha2VyUG9vbFNldAoJZnJhbWVfYnVyeSAxIC8vIHJlbW92ZVJldDogKGJvb2wsYm9vbCkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NzAKCS8vIHN0YWtlck91dE9mVGhpc1ZhbGlkYXRvciA9IHJlbW92ZVJldFswXQoJZnJhbWVfZGlnIDEgLy8gcmVtb3ZlUmV0OiAoYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWludCAwCglnZXRiaXQKCWZyYW1lX2J1cnkgMiAvLyBzdGFrZXJPdXRPZlRoaXNWYWxpZGF0b3I6IGJvb2wKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NzEKCS8vIHN0YWtlck91dE9mUHJvdG9jb2wgPSByZW1vdmVSZXRbMV0KCWZyYW1lX2RpZyAxIC8vIHJlbW92ZVJldDogKGJvb2wsYm9vbCkKCXN0b3JlIDI1NSAvLyBmdWxsIGFycmF5Cglsb2FkIDI1NSAvLyBmdWxsIGFycmF5CglpbnQgMQoJZ2V0Yml0CglmcmFtZV9idXJ5IDMgLy8gc3Rha2VyT3V0T2ZQcm90b2NvbDogYm9vbAoKCS8vICppZjIxX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzczCgkvLyBzdGFrZXJPdXRPZlRoaXNWYWxpZGF0b3IKCWZyYW1lX2RpZyAyIC8vIHN0YWtlck91dE9mVGhpc1ZhbGlkYXRvcjogYm9vbAoJYnogKmlmMjFfZW5kCgoJLy8gKmlmMjFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Nzc0CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUudG90YWxTdGFrZXJzIC09IDEKCWludCAyNDQKCWR1cAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDEKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKKmlmMjFfZW5kOgoJLy8gKmlmMjJfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NzcKCS8vIHN0YWtlck91dE9mUHJvdG9jb2wKCWZyYW1lX2RpZyAzIC8vIHN0YWtlck91dE9mUHJvdG9jb2w6IGJvb2wKCWJ6ICppZjIyX2VuZAoKCS8vICppZjIyX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc3OAoJLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlIC09IDEKCWJ5dGUgMHg2ZTc1NmQ1Mzc0NjE2YjY1NzI3MyAvLyAibnVtU3Rha2VycyIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMQoJLQoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJc3dhcAoJYXBwX2dsb2JhbF9wdXQKCippZjIyX2VuZDoKCippZjIwX2VuZDoKCXJldHN1YgoKLy8gZmluZFBvb2xGb3JTdGFrZXIodWludDY0LGFkZHJlc3MsdWludDY0KSgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKKmFiaV9yb3V0ZV9maW5kUG9vbEZvclN0YWtlcjoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gYW1vdW50VG9TdGFrZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglidG9pCgoJLy8gc3Rha2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDEgKHN0YWtlcikgZm9yIGZpbmRQb29sRm9yU3Rha2VyIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBmaW5kUG9vbEZvclN0YWtlcih1aW50NjQsYWRkcmVzcyx1aW50NjQpKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJY2FsbHN1YiBmaW5kUG9vbEZvclN0YWtlcgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGZpbmRQb29sRm9yU3Rha2VyKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIHN0YWtlcjogQWRkcmVzcywgYW1vdW50VG9TdGFrZTogdWludDY0KTogW1ZhbGlkYXRvclBvb2xLZXksIGJvb2xlYW4sIGJvb2xlYW5dCi8vCi8vIEZpbmRzIHRoZSBwb29sIGZvciBhIHN0YWtlciBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgdmFsaWRhdG9yIGlkLCBzdGFrZXIgYWRkcmVzcywgYW5kIGFtb3VudCB0byBzdGFrZS4KLy8gRmlyc3QgY2hlY2tzIHRoZSBzdGFrZXJzICdhbHJlYWR5IHN0YWtlZCBsaXN0JyBmb3IgdGhlIHZhbGlkYXRvciBwcmVmZXJyaW5nIHRob3NlIChhZGRpbmcgaWYgcG9zc2libGUpIHRoZW4gYWRkcwovLyB0byBuZXcgcG9vbCBpZiBuZWNlc3NhcnkuCi8vCi8vIEBwYXJhbSB7VmFsaWRhdG9ySWRUeXBlfSB2YWxpZGF0b3JJZCAtIFRoZSBpZCBvZiB0aGUgdmFsaWRhdG9yLgovLyBAcGFyYW0ge0FkZHJlc3N9IHN0YWtlciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzdGFrZXIuCi8vIEBwYXJhbSB7dWludDY0fSBhbW91bnRUb1N0YWtlIC0gVGhlIGFtb3VudCB0byBzdGFrZS4KLy8gQHJldHVybnMge1ZhbGlkYXRvclBvb2xLZXksIGJvb2xlYW4sIGJvb2xlYW59IC0gVGhlIHBvb2wgZm9yIHRoZSBzdGFrZXIsIHRydWUvZmFsc2Ugb24gd2hldGhlciB0aGUgc3Rha2VyIGlzICduZXcnCi8vIHRvIHRoaXMgVkFMSURBVE9SLCBhbmQgdHJ1ZS9mYWxzZSBpZiBzdGFrZXIgaXMgbmV3IHRvIHRoZSBwcm90b2NvbC4KZmluZFBvb2xGb3JTdGFrZXI6Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA3CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODAwCgkvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yID0gdHJ1ZQoJaW50IDEKCWZyYW1lX2J1cnkgMCAvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yOiBib29sCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODAxCgkvLyBpc05ld1N0YWtlclRvUHJvdG9jb2wgPSB0cnVlCglpbnQgMQoJZnJhbWVfYnVyeSAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgwOQoJLy8gbWF4UGVyUG9vbCA9IHRoaXMuZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sCglmcmFtZV9idXJ5IDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoJLy8gKmlmMjNfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MTIKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLmV4aXN0cwoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfbGVuCglzd2FwCglwb3AKCWJ6ICppZjIzX2VuZAoKCS8vICppZjIzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxMwoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxNAoJLy8gYXNzZXJ0KHZhbGlkYXRvcklkICE9PSAwKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWludCAwCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODE1CgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IHBvb2xTZXQubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoKKmZvcl8zOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODE1CgkvLyBpIDwgcG9vbFNldC5sZW5ndGgKCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDYKCTwKCWJ6ICpmb3JfM19lbmQKCgkvLyAqaWYyNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxNgoJLy8gZ2xvYmFscy5vcGNvZGVCdWRnZXQgPCAzMDAKCWdsb2JhbCBPcGNvZGVCdWRnZXQKCWludCAzMDAKCTwKCWJ6ICppZjI0X2VuZAoKCS8vICppZjI0X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxNwoJLy8gaW5jcmVhc2VPcGNvZGVCdWRnZXQoKQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCWludCAwCglpdHhuX2ZpZWxkIEZlZQoJYnl0ZSBiNjQgQ29FQiAvLyAjcHJhZ21hIHZlcnNpb24gMTA7IGludCAxCglkdXAKCWl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCglpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCglpbnQgRGVsZXRlQXBwbGljYXRpb24KCWl0eG5fZmllbGQgT25Db21wbGV0aW9uCglpdHhuX3N1Ym1pdAoKKmlmMjRfZW5kOgoJLy8gKmlmMjVfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MTkKCS8vIHBvb2xTZXRbaV0uaWQgPT09IDAKCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgk9PQoJYnogKmlmMjVfZW5kCgoJLy8gKmlmMjVfY29uc2VxdWVudAoJYiAqZm9yXzNfY29udGludWUKCippZjI1X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyMgoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sID0gZmFsc2UKCWludCAwCglmcmFtZV9idXJ5IDEgLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sCgoJLy8gKmlmMjZfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MjMKCS8vIHBvb2xTZXRbaV0uaWQgPT09IHZhbGlkYXRvcklkCglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgMAoJKwoJaW50IDgKCWV4dHJhY3QzCglidG9pCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJPT0KCWJ6ICppZjI2X2VuZAoKCS8vICppZjI2X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyNQoJLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciA9IGZhbHNlCglpbnQgMAoJZnJhbWVfYnVyeSAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCgkvLyAqaWYyN19jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyNwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1twb29sU2V0W2ldLnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCArCgkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50VG9TdGFrZSA8PQoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4UGVyUG9vbAoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgOCAvLyBoZWFkT2Zmc2V0CgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJKwoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8PQoJYnogKmlmMjdfZW5kCgoJLy8gKmlmMjdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODMxCgkvLyByZXR1cm4gW3Bvb2xTZXRbaV0sIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IsIGlzTmV3U3Rha2VyVG9Qcm90b2NvbF0KCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWJ5dGUgMHgwMAoJaW50IDAKCWZyYW1lX2RpZyAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCXNldGJpdAoJaW50IDEKCWZyYW1lX2RpZyAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoJc2V0Yml0Cgljb25jYXQKCWIgKmZpbmRQb29sRm9yU3Rha2VyKnJldHVybgoKKmlmMjdfZW5kOgoKKmlmMjZfZW5kOgoKKmZvcl8zX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODE1CgkvLyBpICs9IDEKCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgNCAvLyBpOiB1aW50NjQKCWIgKmZvcl8zCgoqZm9yXzNfZW5kOgoKKmlmMjNfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODM4CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBhbW91bnRUb1N0YWtlID49IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1pbkVudHJ5U3Rha2UsCgkvLyAgICAgICAgICAgICAnbXVzdCBzdGFrZSBhdCBsZWFzdCB0aGUgbWluaW11bSBmb3IgdGhpcyBwb29sJywKCS8vICAgICAgICAgKQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJaW50IDIwOQoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk+PQoKCS8vIG11c3Qgc3Rha2UgYXQgbGVhc3QgdGhlIG1pbmltdW0gZm9yIHRoaXMgcG9vbAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ0CgkvLyBwb29scyA9IGNsb25lKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHMpCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWludCA0MzIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglmcmFtZV9idXJ5IDUgLy8gcG9vbHM6ICh1aW50NjQsdWludDE2LHVpbnQ2NClbMjRdCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ1CgkvLyBjdXJOdW1Qb29scyA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUubnVtUG9vbHMgYXMgdWludDY0CglpbnQgMjQyCglpbnQgMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgNiAvLyBjdXJOdW1Qb29sczogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ2CgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IGN1ck51bVBvb2xzOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA3IC8vIGk6IHVpbnQ2NAoKKmZvcl80OgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ2CgkvLyBpIDwgY3VyTnVtUG9vbHMKCWZyYW1lX2RpZyA3IC8vIGk6IHVpbnQ2NAoJZnJhbWVfZGlnIDYgLy8gY3VyTnVtUG9vbHM6IHVpbnQ2NAoJPAoJYnogKmZvcl80X2VuZAoKCS8vICppZjI4X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ3CgkvLyBwb29sc1tpXS50b3RhbEFsZ29TdGFrZWQgKyBhbW91bnRUb1N0YWtlIDw9IG1heFBlclBvb2wKCWZyYW1lX2RpZyA1IC8vIHBvb2xzOiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJKwoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8PQoJYnogKmlmMjhfZW5kCgoJLy8gKmlmMjhfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ4CgkvLyByZXR1cm4gWwoJLy8gICAgICAgICAgICAgICAgICAgICB7IGlkOiB2YWxpZGF0b3JJZCwgcG9vbElkOiBpICsgMSwgcG9vbEFwcElkOiBwb29sc1tpXS5wb29sQXBwSWQgfSwKCS8vICAgICAgICAgICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciwKCS8vICAgICAgICAgICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1Byb3RvY29sLAoJLy8gICAgICAgICAgICAgICAgIF0KCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxCgkrCglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyA1IC8vIHBvb2xzOiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglieXRlIDB4MDAKCWludCAwCglmcmFtZV9kaWcgMCAvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yOiBib29sCglzZXRiaXQKCWludCAxCglmcmFtZV9kaWcgMSAvLyBpc05ld1N0YWtlclRvUHJvdG9jb2w6IGJvb2wKCXNldGJpdAoJY29uY2F0CgliICpmaW5kUG9vbEZvclN0YWtlcipyZXR1cm4KCippZjI4X2VuZDoKCipmb3JfNF9jb250aW51ZToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg0NgoJLy8gaSArPSAxCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDcgLy8gaTogdWludDY0CgliICpmb3JfNAoKKmZvcl80X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg1NgoJLy8gcmV0dXJuIFt7IGlkOiB2YWxpZGF0b3JJZCwgcG9vbElkOiAwLCBwb29sQXBwSWQ6IDAgfSwgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciwgaXNOZXdTdGFrZXJUb1Byb3RvY29sXQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCgljb25jYXQKCWJ5dGUgMHgwMAoJaW50IDAKCWZyYW1lX2RpZyAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCXNldGJpdAoJaW50IDEKCWZyYW1lX2RpZyAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoJc2V0Yml0Cgljb25jYXQKCipmaW5kUG9vbEZvclN0YWtlcipyZXR1cm46CgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCgkvLyBwb3AgYWxsIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHRoZSBzdGFjawoJcG9wbiA3CglyZXRzdWIKCi8vIG1vdmVQb29sVG9Ob2RlKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKKmFiaV9yb3V0ZV9tb3ZlUG9vbFRvTm9kZToKCS8vIG5vZGVOdW06IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwoJYnRvaQoKCS8vIHBvb2xBcHBJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglidG9pCgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgbW92ZVBvb2xUb05vZGUodWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZAoJY2FsbHN1YiBtb3ZlUG9vbFRvTm9kZQoJaW50IDEKCXJldHVybgoKLy8gbW92ZVBvb2xUb05vZGUodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcG9vbEFwcElkOiB1aW50NjQsIG5vZGVOdW06IHVpbnQ2NCk6IHZvaWQKLy8KLy8gRmluZCB0aGUgc3BlY2lmaWVkIHBvb2wgKGluIGFueSBub2RlIG51bWJlcikgYW5kIG1vdmUgaXQgdG8gdGhlIHNwZWNpZmllZCBub2RlLgovLyBUaGUgcG9vbCBhY2NvdW50IGlzIGZvcmNlZCBvZmZsaW5lIGlmIG1vdmVkIHNvIHByaW9yIG5vZGUgd2lsbCBzdGlsbCBydW4gZm9yIDMyMCByb3VuZHMgYnV0Ci8vIG5ldyBrZXkgZ29lcyBvbmxpbmUgb24gbmV3IG5vZGUgc29vbiBhZnRlciAoMzIwIHJvdW5kcyBhZnRlciBpdCBnb2VzIG9ubGluZSkKLy8gTm8tb3AgaWYgc3VjY2VzcywgYXNzZXJ0cyBpZiBub3QgZm91bmQgb3IgY2FuJ3QgbW92ZSAgKG5vIHNwYWNlIGluIHRhcmdldCkKLy8gWyBPTkxZIE9XTkVSIE9SIE1BTkFHRVIgQ0FOIENIQU5HRSBdCi8vCi8vIEBwYXJhbSB7VmFsaWRhdG9ySWRUeXBlfSB2YWxpZGF0b3JJZCAtIFRoZSBpZCBvZiB0aGUgdmFsaWRhdG9yLgovLyBAcGFyYW0ge3VpbnQ2NH0gcG9vbEFwcElkCi8vIEBwYXJhbSB7dWludDY0fSBub2RlTnVtCm1vdmVQb29sVG9Ob2RlOgoJcHJvdG8gMyAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3MQoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lck9yTWFuYWdlcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyT3JNYW5hZ2VyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODczCgkvLyBub2RlUG9vbEFzc2lnbm1lbnRzID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5ub2RlUG9vbEFzc2lnbm1lbnRzKQoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfYnVyeSAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzQKCS8vIGFzc2VydChub2RlTnVtID49IDEgJiYgbm9kZU51bSA8PSBNQVhfTk9ERVMsICdub2RlIG51bWJlciBvdXQgb2YgYWxsb3dhYmxlIHJhbmdlJykKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCAxCgk+PQoJZHVwCglieiAqc2tpcF9hbmQyCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgOAoJPD0KCSYmCgoqc2tpcF9hbmQyOgoJLy8gbm9kZSBudW1iZXIgb3V0IG9mIGFsbG93YWJsZSByYW5nZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODc2CgkvLyBmb3IgKGxldCBzcmNOb2RlSWR4ID0gMDsgc3JjTm9kZUlkeCA8IE1BWF9OT0RFUzsgc3JjTm9kZUlkeCArPSAxKQoJaW50IDAKCWZyYW1lX2J1cnkgMSAvLyBzcmNOb2RlSWR4OiB1aW50NjQKCipmb3JfNToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3NgoJLy8gc3JjTm9kZUlkeCA8IE1BWF9OT0RFUwoJZnJhbWVfZGlnIDEgLy8gc3JjTm9kZUlkeDogdWludDY0CglpbnQgOAoJPAoJYnogKmZvcl81X2VuZAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3NwoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBNQVhfUE9PTFNfUEVSX05PREU7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzY6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzcKCS8vIGkgPCBNQVhfUE9PTFNfUEVSX05PREUKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDMKCTwKCWJ6ICpmb3JfNl9lbmQKCgkvLyAqaWYyOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3OAoJLy8gbm9kZVBvb2xBc3NpZ25tZW50cy5ub2Rlc1tzcmNOb2RlSWR4XS5wb29sQXBwSWRzW2ldID09PSBwb29sQXBwSWQKCWZyYW1lX2RpZyAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCWludCAwCglmcmFtZV9kaWcgMSAvLyBzcmNOb2RlSWR4OiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMAoJKwoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWZyYW1lX2RpZyAtMiAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJPT0KCWJ6ICppZjI5X2VuZAoKCS8vICppZjI5X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3OQoJLy8gYXNzZXJ0KG5vZGVOdW0gLSAxICE9PSBzcmNOb2RlSWR4LCAiY2FuJ3QgbW92ZSB0byBzYW1lIG5vZGUiKQoJZnJhbWVfZGlnIC0zIC8vIG5vZGVOdW06IHVpbnQ2NAoJaW50IDEKCS0KCWZyYW1lX2RpZyAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJIT0KCgkvLyBjYW4ndCBtb3ZlIHRvIHNhbWUgbm9kZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODgxCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLm5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbc3JjTm9kZUlkeF0ucG9vbEFwcElkc1tpXSA9IDAKCWludCA5MDAKCWZyYW1lX2RpZyAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4NAoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5nb09mZmxpbmU+KHsKCS8vICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgltZXRob2QgImdvT2ZmbGluZSgpdm9pZCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODg1CgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkKCWZyYW1lX2RpZyAtMiAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4OQoJLy8gdGhpcy5hZGRQb29sVG9Ob2RlKHZhbGlkYXRvcklkLCBwb29sQXBwSWQsIG5vZGVOdW0pCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gcG9vbEFwcElkOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGFkZFBvb2xUb05vZGUKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4OTAKCS8vIHJldHVybgoJcmV0c3ViCgoqaWYyOV9lbmQ6CgoqZm9yXzZfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzcKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzYKCipmb3JfNl9lbmQ6CgoqZm9yXzVfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzYKCS8vIHNyY05vZGVJZHggKz0gMQoJZnJhbWVfZGlnIDEgLy8gc3JjTm9kZUlkeDogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJYiAqZm9yXzUKCipmb3JfNV9lbmQ6CgkvLyBjb3VsZG4ndCBmaW5kIHBvb2wgYXBwIGlkIGluIG5vZGVzIHRvIG1vdmUKCWVycgoJcmV0c3ViCgovLyBlbXB0eVRva2VuUmV3YXJkcyh1aW50NjQsYWRkcmVzcyl1aW50NjQKKmFiaV9yb3V0ZV9lbXB0eVRva2VuUmV3YXJkczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gcmVjZWl2ZXI6IGFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMzIKCT09CgoJLy8gYXJndW1lbnQgMCAocmVjZWl2ZXIpIGZvciBlbXB0eVRva2VuUmV3YXJkcyBtdXN0IGJlIGEgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZW1wdHlUb2tlblJld2FyZHModWludDY0LGFkZHJlc3MpdWludDY0CgljYWxsc3ViIGVtcHR5VG9rZW5SZXdhcmRzCglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZW1wdHlUb2tlblJld2FyZHModmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcmVjZWl2ZXI6IEFkZHJlc3MpOiB1aW50NjQKLy8KLy8gU2VuZHMgdGhlIHJld2FyZCB0b2tlbnMgaGVsZCBpbiBwb29sIDEgdG8gc3BlY2lmaWVkIHJlY2VpdmVyLgovLyBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgdGhlIG93bmVyIHdoZW4gdGhleSB3YW50IHRvIGdldCByZXdhcmQgdG9rZW5zICdiYWNrJyB3aGljaCB0aGV5IHNlbnQgdG8KLy8gdGhlIGZpcnN0IHBvb2wgKGxpa2VseSBiZWNhdXNlIHZhbGlkYXRvciBpcyBzdW5zZXR0aW5nLiAgQW55IHRva2VucyBjdXJyZW50bHkgJ3Jlc2VydmVkJyBmb3Igc3Rha2VycyB0byBjbGFpbSB3aWxsCi8vIE5PVCBiZSBzZW50IGFzIHRoZXkgbXVzdCBiZSBoZWxkIGJhY2sgZm9yIHN0YWtlcnMgdG8gbGF0ZXIgY2xhaW0uCi8vIFsgT05MWSBPV05FUiBDQU4gQ0FMTF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7QWRkcmVzc30gcmVjZWl2ZXIgLSB0aGUgYWNjb3VudCB0byBzZW5kIHRoZSB0b2tlbnMgdG8gKG11c3QgYWxyZWFkeSBiZSBvcHRlZC1pbiB0byB0aGUgcmV3YXJkIHRva2VuKQovLyBAcmV0dXJucyB7dWludDY0fSB0aGUgYW1vdW50IG9mIHJld2FyZCB0b2tlbiBzZW50CmVtcHR5VG9rZW5SZXdhcmRzOgoJcHJvdG8gMiAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkwOQoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTEwCgkvLyByZXdhcmRUb2tlbklkID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcucmV3YXJkVG9rZW5JZAoJaW50IDE1MwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTExCgkvLyByZXdhcmRUb2tlbkhlbGRCYWNrID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5yZXdhcmRUb2tlbkhlbGRCYWNrCglpbnQgMjYwCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMSAvLyByZXdhcmRUb2tlbkhlbGRCYWNrOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MTIKCS8vIGFzc2VydChyZXdhcmRUb2tlbklkICE9PSAwLCAidGhpcyB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIGEgcmV3YXJkIHRva2VuIGRlZmluZWQiKQoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0CglpbnQgMAoJIT0KCgkvLyB0aGlzIHZhbGlkYXRvciBkb2Vzbid0IGhhdmUgYSByZXdhcmQgdG9rZW4gZGVmaW5lZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTEzCgkvLyBwb29sT25lQXBwSWQgPSBBcHBJRC5mcm9tVWludDY0KHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkKQoJaW50IDI2OAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MTUKCS8vIHRva2VuUmV3YXJkQmFsID0KCS8vICAgICAgICAgICAgIHBvb2xPbmVBcHBJZC5hZGRyZXNzLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JZCkpIC0gcmV3YXJkVG9rZW5IZWxkQmFjawoJZnJhbWVfZGlnIDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCXBvcAoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0Cglhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKCXBvcAoJZnJhbWVfZGlnIDEgLy8gcmV3YXJkVG9rZW5IZWxkQmFjazogdWludDY0CgktCglmcmFtZV9idXJ5IDMgLy8gdG9rZW5SZXdhcmRCYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkxOQoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5wYXlUb2tlblJld2FyZD4oewoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25JRDogcG9vbE9uZUFwcElkLAoJLy8gICAgICAgICAgICAgbWV0aG9kQXJnczogW3JlY2VpdmVyLCByZXdhcmRUb2tlbklkLCB0b2tlblJld2FyZEJhbF0sCgkvLyAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJbWV0aG9kICJwYXlUb2tlblJld2FyZChhZGRyZXNzLHVpbnQ2NCx1aW50NjQpdm9pZCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTIwCgkvLyBhcHBsaWNhdGlvbklEOiBwb29sT25lQXBwSWQKCWZyYW1lX2RpZyAyIC8vIHBvb2xPbmVBcHBJZDogdWludDY0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MjEKCS8vIG1ldGhvZEFyZ3M6IFtyZWNlaXZlciwgcmV3YXJkVG9rZW5JZCwgdG9rZW5SZXdhcmRCYWxdCglmcmFtZV9kaWcgLTIgLy8gcmVjZWl2ZXI6IEFkZHJlc3MKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklkOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMyAvLyB0b2tlblJld2FyZEJhbDogdWludDY0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MjMKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHBvb2xPbmVBcHBJZC5hZGRyZXNzLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JZCkpID09PSByZXdhcmRUb2tlbkhlbGRCYWNrLAoJLy8gICAgICAgICAgICAgJ2JhbGFuY2Ugb2YgcmVtYWluaW5nIHJld2FyZCB0b2tlbnMgc2hvdWxkIG1hdGNoIHRoZSBoZWxkIGJhY2sgYW1vdW50JywKCS8vICAgICAgICAgKQoJZnJhbWVfZGlnIDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCXBvcAoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0Cglhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKCXBvcAoJZnJhbWVfZGlnIDEgLy8gcmV3YXJkVG9rZW5IZWxkQmFjazogdWludDY0Cgk9PQoKCS8vIGJhbGFuY2Ugb2YgcmVtYWluaW5nIHJld2FyZCB0b2tlbnMgc2hvdWxkIG1hdGNoIHRoZSBoZWxkIGJhY2sgYW1vdW50Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MjcKCS8vIHJldHVybiB0b2tlblJld2FyZEJhbAoJZnJhbWVfZGlnIDMgLy8gdG9rZW5SZXdhcmRCYWw6IHVpbnQ2NAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDMKCXJldHN1YgoKLy8gY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IHZvaWQKY2FsbGVyTXVzdEJlT3duZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDIwCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICB0aGlzLnR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLAoJLy8gICAgICAgICAgICAgJ2NhbiBvbmx5IGJlIGNhbGxlZCBieSB2YWxpZGF0b3Igb3duZXInLAoJLy8gICAgICAgICApCgl0eG4gU2VuZGVyCglpbnQgOAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJPT0KCgkvLyBjYW4gb25seSBiZSBjYWxsZWQgYnkgdmFsaWRhdG9yIG93bmVyCglhc3NlcnQKCXJldHN1YgoKLy8gY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXIodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IHZvaWQKY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDI3CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICB0aGlzLnR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyIHx8CgkvLyAgICAgICAgICAgICAgICAgdGhpcy50eG4uc2VuZGVyID09PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5tYW5hZ2VyLAoJLy8gICAgICAgICAgICAgJ2NhbiBvbmx5IGJlIGNhbGxlZCBieSBvd25lciBvciBtYW5hZ2VyIG9mIHZhbGlkYXRvcicsCgkvLyAgICAgICAgICkKCXR4biBTZW5kZXIKCWludCA4CglpbnQgMzIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0Cgk9PQoJZHVwCglibnogKnNraXBfb3IzCgl0eG4gU2VuZGVyCglpbnQgNDAKCWludCAzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCT09Cgl8fAoKKnNraXBfb3IzOgoJLy8gY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IG93bmVyIG9yIG1hbmFnZXIgb2YgdmFsaWRhdG9yCglhc3NlcnQKCXJldHN1YgoKLy8gdmVyaWZ5UG9vbEtleUNhbGxlcihwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5KTogdm9pZAovLwovLyB2ZXJpZnlQb29sS2V5Q2FsbGVyIHZlcmlmaWVzIHRoZSBwYXNzZWQgaW4ga2V5IChmcm9tIGEgc3Rha2luZyBwb29sIGNhbGxpbmcgdXMgdG8gdXBkYXRlIG1ldHJpY3MpIGlzIHZhbGlkCi8vIGFuZCBtYXRjaGVzIHRoZSBpbmZvcm1hdGlvbiB3ZSBoYXZlIGluIG91ciBzdGF0ZS4gICdGYWtlJyBwb29scyBjb3VsZCBjYWxsIHVzIHRvIHVwZGF0ZSBvdXIgZGF0YSwgYnV0IHRoZXkKLy8gY2FuJ3QgZmFrZSB0aGUgaWRzIGFuZCBtb3N0IGltcG9ydGFudGx5IGFwcGxpY2F0aW9uIGlkKCEpIG9mIHRoZSBjYWxsZXIgdGhhdCBoYXMgdG8gbWF0Y2guCnZlcmlmeVBvb2xLZXlDYWxsZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDQwCgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLmV4aXN0cywgInRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGlzbid0IHZhbGlkIikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cglib3hfbGVuCglzd2FwCglwb3AKCgkvLyB0aGUgc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBpc24ndCB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA0MQoJLy8gYXNzZXJ0KHBvb2xLZXkucG9vbElkIDw9IE1BWF9QT09MUywgJ3Bvb2wgaWQgbm90IGluIHZhbGlkIHJhbmdlJykKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDI0Cgk8PQoKCS8vIHBvb2wgaWQgbm90IGluIHZhbGlkIHJhbmdlCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDQyCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBwb29sS2V5LnBvb2xJZCA+IDAgJiYgKHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNikgPD0gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLm51bVBvb2xzLAoJLy8gICAgICAgICAgICAgJ3Bvb2wgaWQgb3V0c2lkZSBvZiByYW5nZSBvZiBwb29scyBjcmVhdGVkIGZvciB0aGlzIHZhbGlkYXRvcicsCgkvLyAgICAgICAgICkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDAKCT4KCWR1cAoJYnogKnNraXBfYW5kMwoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMjQyCglpbnQgMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk8PQoJJiYKCipza2lwX2FuZDM6CgkvLyBwb29sIGlkIG91dHNpZGUgb2YgcmFuZ2Ugb2YgcG9vbHMgY3JlYXRlZCBmb3IgdGhpcyB2YWxpZGF0b3IKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNDgKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHBvb2xLZXkucG9vbEFwcElkID09PSB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbcG9vbEtleS5wb29sSWQgLSAxXS5wb29sQXBwSWQsCgkvLyAgICAgICAgICAgICAiVGhlIHBhc3NlZCBpbiBhcHAgaWQgZG9lc24ndCBtYXRjaCB0aGUgcGFzc2VkIGluIGlkcyIsCgkvLyAgICAgICAgICkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk9PQoKCS8vIFRoZSBwYXNzZWQgaW4gYXBwIGlkIGRvZXNuJ3QgbWF0Y2ggdGhlIHBhc3NlZCBpbiBpZHMKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNTMKCS8vIGFzc2VydCh0aGlzLnR4bi5zZW5kZXIgPT09IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLmFkZHJlc3MpCgl0eG4gU2VuZGVyCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAxNiA4CglidG9pCglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCT09Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDU1CgkvLyBhc3NlcnQocG9vbEtleS5pZCA9PT0gKEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLmdsb2JhbFN0YXRlKCd2YWxpZGF0b3JJZCcpIGFzIHVpbnQ2NCkpCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWJ5dGUgMHg3NjYxNmM2OTY0NjE3NDZmNzI0OTY0IC8vICJ2YWxpZGF0b3JJZCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgndmFsaWRhdG9ySWQnKQoJYXNzZXJ0Cgk9PQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA1NgoJLy8gYXNzZXJ0KHBvb2xLZXkucG9vbElkID09PSAoQXBwSUQuZnJvbVVpbnQ2NChwb29sS2V5LnBvb2xBcHBJZCkuZ2xvYmFsU3RhdGUoJ3Bvb2xJZCcpIGFzIHVpbnQ2NCkpCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWJ5dGUgMHg3MDZmNmY2YzQ5NjQgLy8gInBvb2xJZCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgncG9vbElkJykKCWFzc2VydAoJPT0KCWFzc2VydAoJcmV0c3ViCgovLyByZXZlcmlmeU5GRE93bmVyc2hpcCh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogdm9pZAovLwovLyBUaGlzIG1ldGhvZCB2ZXJpZmllcyB0aGUgb3duZXJzaGlwIG9mIE5GRCAoTmFtZWQgRnVuY3Rpb24gRGF0YSkgYnkgYSB2YWxpZGF0b3IuCi8vIElmIHRoZSBvd25lcnNoaXAgaXMgbm8gbG9uZ2VyIHZhbGlkLCBpdCByZW1vdmVzIHRoZSBORkQgZnJvbSB0aGUgdmFsaWRhdG9yJ3MgY29uZmlndXJhdGlvbi4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3Igd2hvc2UgZGF0YSBzaG91bGQgYmUgcmUtZXZhbHVhdGVkLgpyZXZlcmlmeU5GRE93bmVyc2hpcDoKCXByb3RvIDEgMAoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDY2CgkvLyB2YWxpZGF0b3JDb25maWcgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZwoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJZnJhbWVfYnVyeSAwIC8vIHN0b3JhZ2Uga2V5Ly92YWxpZGF0b3JDb25maWcKCgkvLyAqaWYzMF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNjcKCS8vIHZhbGlkYXRvckNvbmZpZy5uZmRGb3JJbmZvICE9PSAwCglpbnQgNzIKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDAKCSE9CglieiAqaWYzMF9lbmQKCgkvLyAqaWYzMF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDcwCgkvLyBuZmRPd25lciA9IEFwcElELmZyb21VaW50NjQodmFsaWRhdG9yQ29uZmlnLm5mZEZvckluZm8pLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzCglpbnQgNzIKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQodmFsaWRhdG9yQ29uZmlnLm5mZEZvckluZm8pLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCgkvLyAqaWYzMV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNzIKCS8vIHZhbGlkYXRvckNvbmZpZy5vd25lciAhPT0gbmZkT3duZXIgJiYgdmFsaWRhdG9yQ29uZmlnLm1hbmFnZXIgIT09IG5mZE93bmVyCglpbnQgOAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfZGlnIDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCSE9CglkdXAKCWJ6ICpza2lwX2FuZDQKCWludCA0MAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfZGlnIDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCSE9CgkmJgoKKnNraXBfYW5kNDoKCWJ6ICppZjMxX2VuZAoKCS8vICppZjMxX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNzQKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm5mZEZvckluZm8gPSAwCglpbnQgNzIKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKKmlmMzFfZW5kOgoKKmlmMzBfZW5kOgoJcmV0c3ViCgovLyB2YWxpZGF0ZUNvbmZpZyhjb25maWc6IFZhbGlkYXRvckNvbmZpZyk6IHZvaWQKdmFsaWRhdGVDb25maWc6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDgxCgkvLyBhc3NlcnQoY29uZmlnLm93bmVyICE9PSBBZGRyZXNzLnplcm9BZGRyZXNzKQoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDggMzIKCWdsb2JhbCBaZXJvQWRkcmVzcwoJIT0KCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwODIKCS8vIGFzc2VydChjb25maWcubWFuYWdlciAhPT0gQWRkcmVzcy56ZXJvQWRkcmVzcykKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA0MCAzMgoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA4MwoJLy8gYXNzZXJ0KHRoaXMudHhuLnNlbmRlciA9PT0gY29uZmlnLm93bmVyLCAnc2VuZGVyIG11c3QgYmUgb3duZXIgdG8gYWRkIG5ldyB2YWxpZGF0b3InKQoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDggMzIKCT09CgoJLy8gc2VuZGVyIG11c3QgYmUgb3duZXIgdG8gYWRkIG5ldyB2YWxpZGF0b3IKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwODUKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIGNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPj0gR0FUSU5HX1RZUEVfTk9ORSAmJiBjb25maWcuZW50cnlHYXRpbmdUeXBlIDw9IEdBVElOR19UWVBFX0NPTlNUX01BWCwKCS8vICAgICAgICAgICAgICdnYXRpbmcgdHlwZSBub3QgdmFsaWQnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgODAgMQoJYnRvaQoJaW50IDAKCT49CglkdXAKCWJ6ICpza2lwX2FuZDUKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4MCAxCglidG9pCglpbnQgNAoJPD0KCSYmCgoqc2tpcF9hbmQ1OgoJLy8gZ2F0aW5nIHR5cGUgbm90IHZhbGlkCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDg5CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBjb25maWcuZXBvY2hSb3VuZExlbmd0aCA+PSBNSU5fRVBPQ0hfTEVOR1RIICYmIGNvbmZpZy5lcG9jaFJvdW5kTGVuZ3RoIDw9IE1BWF9FUE9DSF9MRU5HVEgsCgkvLyAgICAgICAgICAgICAnZXBvY2ggbGVuZ3RoIG5vdCBpbiBhbGxvd2FibGUgcmFuZ2UnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTY5IDQKCWJ0b2kKCWludCAxCgk+PQoJZHVwCglieiAqc2tpcF9hbmQ2CglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTY5IDQKCWJ0b2kKCWludCAxMDAwMDAwCgk8PQoJJiYKCipza2lwX2FuZDY6CgkvLyBlcG9jaCBsZW5ndGggbm90IGluIGFsbG93YWJsZSByYW5nZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA5MwoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgY29uZmlnLnBlcmNlbnRUb1ZhbGlkYXRvciA+PSBNSU5fUENUX1RPX1ZBTElEQVRPUiAmJiBjb25maWcucGVyY2VudFRvVmFsaWRhdG9yIDw9IE1BWF9QQ1RfVE9fVkFMSURBVE9SLAoJLy8gICAgICAgICAgICAgJ2NvbW1pc3Npb24gcGVyY2VudGFnZSBub3QgdmFsaWQnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTczIDQKCWJ0b2kKCWludCAwCgk+PQoJZHVwCglieiAqc2tpcF9hbmQ3CglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTczIDQKCWJ0b2kKCWludCAxMDAwMDAwCgk8PQoJJiYKCipza2lwX2FuZDc6CgkvLyBjb21taXNzaW9uIHBlcmNlbnRhZ2Ugbm90IHZhbGlkCglhc3NlcnQKCgkvLyAqaWYzMl9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwOTcKCS8vIGNvbmZpZy5wZXJjZW50VG9WYWxpZGF0b3IgIT09IDAKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAxNzMgNAoJYnRvaQoJaW50IDAKCSE9CglieiAqaWYzMl9lbmQKCgkvLyAqaWYzMl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDk4CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgY29uZmlnLnZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzICE9PSBBZGRyZXNzLnplcm9BZGRyZXNzLAoJLy8gICAgICAgICAgICAgICAgICd2YWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyBtdXN0IGJlIHNldCBpZiBwZXJjZW50IHRvIHZhbGlkYXRvciBpcyBub3QgMCcsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTc3IDMyCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CgoJLy8gdmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MgbXVzdCBiZSBzZXQgaWYgcGVyY2VudCB0byB2YWxpZGF0b3IgaXMgbm90IDAKCWFzc2VydAoKKmlmMzJfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEwMwoJLy8gYXNzZXJ0KGNvbmZpZy5taW5FbnRyeVN0YWtlID49IE1JTl9BTEdPX1NUQUtFX1BFUl9QT09MLCAnc3Rha2luZyBwb29sIG11c3QgaGF2ZSBtaW5pbXVtIGVudHJ5IG9mIDEgYWxnbycpCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMjA5IDgKCWJ0b2kKCWludCAxMDAwMDAwCgk+PQoKCS8vIHN0YWtpbmcgcG9vbCBtdXN0IGhhdmUgbWluaW11bSBlbnRyeSBvZiAxIGFsZ28KCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMDUKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIGNvbmZpZy5wb29sc1Blck5vZGUgPiAwICYmIGNvbmZpZy5wb29sc1Blck5vZGUgPD0gTUFYX1BPT0xTX1BFUl9OT0RFLAoJLy8gICAgICAgICAgICAgJ251bWJlciBvZiBwb29scyBwZXIgbm9kZSBtdXN0IGJlIGJlIGJldHdlZW4gMSBhbmQgdGhlIG1heGltdW0gYWxsb3dlZCBudW1iZXInLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMjI1IDEKCWJ0b2kKCWludCAwCgk+CglkdXAKCWJ6ICpza2lwX2FuZDgKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAyMjUgMQoJYnRvaQoJaW50IDMKCTw9CgkmJgoKKnNraXBfYW5kODoKCS8vIG51bWJlciBvZiBwb29scyBwZXIgbm9kZSBtdXN0IGJlIGJlIGJldHdlZW4gMSBhbmQgdGhlIG1heGltdW0gYWxsb3dlZCBudW1iZXIKCWFzc2VydAoKCS8vICppZjMzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEwOQoJLy8gY29uZmlnLnN1bnNldHRpbmdPbiAhPT0gMAoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDIyNiA4CglidG9pCglpbnQgMAoJIT0KCWJ6ICppZjMzX2VuZAoKCS8vICppZjMzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMTAKCS8vIGFzc2VydChjb25maWcuc3Vuc2V0dGluZ09uID4gZ2xvYmFscy5sYXRlc3RUaW1lc3RhbXAsICdzdW5zZXR0aW5nT24gbXVzdCBiZSBsYXRlciB0aGFuIG5vdyBpZiBzZXQnKQoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDIyNiA4CglidG9pCglnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCgk+CgoJLy8gc3Vuc2V0dGluZ09uIG11c3QgYmUgbGF0ZXIgdGhhbiBub3cgaWYgc2V0Cglhc3NlcnQKCippZjMzX2VuZDoKCXJldHN1YgoKLy8gY2FsbFBvb2xBZGRTdGFrZShzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4sIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXksIG1ickFtdFBhaWQ6IHVpbnQ2NCwgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbGVhbiwgaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sZWFuKTogdm9pZAovLwovLyBBZGRzIGEgc3Rha2VycyBhbW91bnQgb2YgYWxnbyB0byBhIHZhbGlkYXRvciBwb29sLCB0cmFuc2ZlcnJpbmcgdGhlIGFsZ28gd2UgcmVjZWl2ZWQgZnJvbSB0aGVtIChhbHJlYWR5IHZlcmlmaWVkCi8vIGJ5IG91ciBjYWxsZXIpIHRvIHRoZSBzdGFraW5nIHBvb2wgYWNjb3VudCwgYW5kIHRoZW4gdGVsbGluZyBpdCBhYm91dCB0aGUgYW1vdW50IGJlaW5nIGFkZGVkIGZvciB0aGUgc3BlY2lmaWVkCi8vIHN0YWtlci4KLy8KLy8gQHBhcmFtIHtQYXlUeG59IHN0YWtlZEFtb3VudFBheW1lbnQgLSBwYXltZW50IGNvbWluZyBmcm9tIHN0YWtlciB0byBwbGFjZSBpbnRvIGEgcG9vbAovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBUaGUga2V5IG9mIHRoZSB2YWxpZGF0b3IgcG9vbC4KLy8gQHBhcmFtIHt1aW50NjR9IG1ickFtdFBhaWQgLSBBbW91bnQgdGhlIHVzZXIgaXMgbGVhdmluZyBiZWhpbmQgaW4gdGhlIHZhbGlkYXRvciB0byBwYXkgZm9yIHRoZWlyIHN0YWtlciBNQlIgY29zdAovLyBAcGFyYW0ge2Jvb2xlYW59IGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IgLSBpZiB0aGlzIGlzIGEgbmV3LCBmaXJzdC10aW1lIHN0YWtlciB0byB0aGUgdmFsaWRhdG9yCi8vIEBwYXJhbSB7Ym9vbGVhbn0gaXNOZXdTdGFrZXJUb1Byb3RvY29sIC0gaWYgdGhpcyBpcyBhIG5ldywgZmlyc3QtdGltZSBzdGFrZXIgdG8gdGhlIHByb3RvY29sCmNhbGxQb29sQWRkU3Rha2U6Cglwcm90byA1IDAKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiAyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEzMgoJLy8gcG9vbEFwcElkID0gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzW3Bvb2xLZXkucG9vbElkIC0gMV0ucG9vbEFwcElkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIHBvb2xBcHBJZDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEzNgoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5hZGRTdGFrZSwgdWludDY0Pih7CgkvLyAgICAgICAgICAgICBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCksCgkvLyAgICAgICAgICAgICBtZXRob2RBcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gPT09PT09PQoJLy8gICAgICAgICAgICAgICAgIC8vIFRISVMgSVMgQSBTRU5EIG9mIHRoZSBhbW91bnQgcmVjZWl2ZWQgcmlnaHQgYmFjayBvdXQgYW5kIGludG8gdGhlIHN0YWtpbmcgcG9vbCBjb250cmFjdCBhY2NvdW50LgoJLy8gICAgICAgICAgICAgICAgIHsgYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQsIHJlY2VpdmVyOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuYWRkcmVzcyB9LAoJLy8gICAgICAgICAgICAgICAgIC8vID09PT09PT0KCS8vICAgICAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LnNlbmRlciwKCS8vICAgICAgICAgICAgIF0sCgkvLyAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgcGF5CglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE0MQoJLy8gYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJZnJhbWVfZGlnIC0zIC8vIG1ickFtdFBhaWQ6IHVpbnQ2NAoJLQoJaXR4bl9maWVsZCBBbW91bnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTQxCgkvLyByZWNlaXZlcjogQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmFkZHJlc3MKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCWl0eG5fZmllbGQgUmVjZWl2ZXIKCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCWl0eG5fbmV4dAoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAiYWRkU3Rha2UocGF5LGFkZHJlc3MpdWludDY0IgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTM3CgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTM4CgkvLyBtZXRob2RBcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gPT09PT09PQoJLy8gICAgICAgICAgICAgICAgIC8vIFRISVMgSVMgQSBTRU5EIG9mIHRoZSBhbW91bnQgcmVjZWl2ZWQgcmlnaHQgYmFjayBvdXQgYW5kIGludG8gdGhlIHN0YWtpbmcgcG9vbCBjb250cmFjdCBhY2NvdW50LgoJLy8gICAgICAgICAgICAgICAgIHsgYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQsIHJlY2VpdmVyOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuYWRkcmVzcyB9LAoJLy8gICAgICAgICAgICAgICAgIC8vID09PT09PT0KCS8vICAgICAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LnNlbmRlciwKCS8vICAgICAgICAgICAgIF0KCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIFNlbmRlcgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCgkvLyBTdWJtaXQgaW5uZXIgdHJhbnNhY3Rpb24KCWl0eG5fc3VibWl0CglpdHhuIE51bUxvZ3MKCWludCAxCgktCglpdHhuYXMgTG9ncwoJZXh0cmFjdCA0IDAKCWJ0b2kKCgkvLyAqaWYzNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNDYKCS8vIGdsb2JhbHMub3Bjb2RlQnVkZ2V0IDwgNTAwCglnbG9iYWwgT3Bjb2RlQnVkZ2V0CglpbnQgNTAwCgk8CglieiAqaWYzNF9lbmQKCgkvLyAqaWYzNF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTQ3CgkvLyBpbmNyZWFzZU9wY29kZUJ1ZGdldCgpCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJaW50IDAKCWl0eG5fZmllbGQgRmVlCglieXRlIGI2NCBDb0VCIC8vICNwcmFnbWEgdmVyc2lvbiAxMDsgaW50IDEKCWR1cAoJaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCWludCBEZWxldGVBcHBsaWNhdGlvbgoJaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KCWl0eG5fc3VibWl0CgoqaWYzNF9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTUxCgkvLyBwb29sTnVtU3Rha2VycyA9IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgnbnVtU3Rha2VycycpIGFzIHVpbnQ2NAoJZnJhbWVfZGlnIDAgLy8gcG9vbEFwcElkOiB1aW50NjQKCWJ5dGUgMHg2ZTc1NmQ1Mzc0NjE2YjY1NzI3MyAvLyAibnVtU3Rha2VycyIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuZ2xvYmFsU3RhdGUoJ251bVN0YWtlcnMnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDEgLy8gcG9vbE51bVN0YWtlcnM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNTIKCS8vIHBvb2xBbGdvU3Rha2VkID0gQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmdsb2JhbFN0YXRlKCdzdGFrZWQnKSBhcyB1aW50NjQKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglhcHBfZ2xvYmFsX2dldF9leAoKCS8vIGdsb2JhbCBzdGF0ZSB2YWx1ZSBkb2VzIG5vdCBleGlzdDogQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmdsb2JhbFN0YXRlKCdzdGFrZWQnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDIgLy8gcG9vbEFsZ29TdGFrZWQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNTMKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsU3Rha2VycyA9IHBvb2xOdW1TdGFrZXJzIGFzIHVpbnQxNgoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJZnJhbWVfZGlnIDEgLy8gcG9vbE51bVN0YWtlcnM6IHVpbnQ2NAoJaXRvYgoJZXh0cmFjdCA2IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNTQKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCA9IHBvb2xBbGdvU3Rha2VkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJZnJhbWVfZGlnIDIgLy8gcG9vbEFsZ29TdGFrZWQ6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gKmlmMzVfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTU3CgkvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yCglmcmFtZV9kaWcgLTQgLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbGVhbgoJYnogKmlmMzVfZW5kCgoJLy8gKmlmMzVfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE1OAoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsU3Rha2VycyArPSAxCglpbnQgMjQ0CglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWludCAxCgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCippZjM1X2VuZDoKCS8vICppZjM2X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE2MAoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sCglmcmFtZV9kaWcgLTUgLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sZWFuCglieiAqaWYzNl9lbmQKCgkvLyAqaWYzNl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTYxCgkvLyB0aGlzLm51bVN0YWtlcnMudmFsdWUgKz0gMQoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJYXBwX2dsb2JhbF9nZXQKCWludCAxCgkrCglieXRlIDB4NmU3NTZkNTM3NDYxNmI2NTcyNzMgLy8gIm51bVN0YWtlcnMiCglzd2FwCglhcHBfZ2xvYmFsX3B1dAoKKmlmMzZfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE2MwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsQWxnb1N0YWtlZCArPSBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWludCAyNTIKCWR1cAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4bgoJZ3R4bnMgQW1vdW50CglmcmFtZV9kaWcgLTMgLy8gbWJyQW10UGFpZDogdWludDY0CgktCgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTY0CgkvLyB0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSArPSBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCWFwcF9nbG9iYWxfZ2V0CglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBBbW91bnQKCWZyYW1lX2RpZyAtMyAvLyBtYnJBbXRQYWlkOiB1aW50NjQKCS0KCSsKCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCXN3YXAKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIHVwZGF0ZVN0YWtlclBvb2xTZXQoc3Rha2VyOiBBZGRyZXNzLCBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5KTogdm9pZAp1cGRhdGVTdGFrZXJQb29sU2V0OgoJcHJvdG8gMiAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjgKCS8vIGFzc2VydCh0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS5leGlzdHMpCglieXRlIDB4NzM3MDczIC8vICJzcHMiCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE3MAoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDAgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNzEKCS8vIGZpcnN0RW1wdHkgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNzIKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoKKmZvcl83OgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE3MgoJLy8gaSA8IHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlLmxlbmd0aAoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl83X2VuZAoKCS8vICppZjM3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE3MwoJLy8gcG9vbFNldFtpXSA9PT0gcG9vbEtleQoJZnJhbWVfZGlnIDAgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDI0CglleHRyYWN0MwoJZnJhbWVfZGlnIC0yIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCT09CglieiAqaWYzN19lbmQKCgkvLyAqaWYzN19jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTc1CgkvLyByZXR1cm4KCXJldHN1YgoKKmlmMzdfZW5kOgoJLy8gKmlmMzhfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTc3CgkvLyBmaXJzdEVtcHR5ID09PSAwICYmIHBvb2xTZXRbaV0uaWQgPT09IDAKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDAKCT09CglkdXAKCWJ6ICpza2lwX2FuZDkKCWZyYW1lX2RpZyAwIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgk9PQoJJiYKCipza2lwX2FuZDk6CglieiAqaWYzOF9lbmQKCgkvLyAqaWYzOF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTc4CgkvLyBmaXJzdEVtcHR5ID0gaSArIDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMSAvLyBmaXJzdEVtcHR5OiB1aW50NjQKCippZjM4X2VuZDoKCipmb3JfN19jb250aW51ZToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNzIKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzcKCipmb3JfN19lbmQ6CgkvLyAqaWYzOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExODEKCS8vIGZpcnN0RW1wdHkgPT09IDAKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDAKCT09CglieiAqaWYzOV9lbmQKCgkvLyAqaWYzOV9jb25zZXF1ZW50CgkvLyBObyBlbXB0eSBzbG90IGF2YWlsYWJsZSBpbiB0aGUgc3Rha2VyIHBvb2wgc2V0CgllcnIKCippZjM5X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExODQKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlW2ZpcnN0RW1wdHkgLSAxXSA9IHBvb2xLZXkKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDEKCS0KCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyByZW1vdmVGcm9tU3Rha2VyUG9vbFNldChzdGFrZXI6IEFkZHJlc3MsIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkpOiBbYm9vbGVhbiwgYm9vbGVhbl0KLy8KLy8gUmVtb3ZlcyBhIHBvb2wga2V5IGZyb20gdGhlIHN0YWtlcidzIGFjdGl2ZSBwb29sIHNldCAtIGZhaWxzIGlmIG5vdCBmb3VuZCAoISkKLy8KLy8gQHBhcmFtIHtBZGRyZXNzfSBzdGFrZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgc3Rha2VyLgovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBUaGUgcG9vbCBrZXkgdGhleSBzaG91bGQgYmUgc3RvcmVkIGluCi8vCi8vIEByZXR1cm4gW2Jvb2xlYW4sIGJvb2xlYW5dIFtpcyB0aGUgc3Rha2VyIGdvbmUgZnJvbSBBTEwgcG9vbHMgb2YgdGhlIGdpdmVuIFZBTElEQVRPUiwgYW5kIGlzIHN0YWtlciBnb25lIGZyb20gQUxMIHBvb2xzXQpyZW1vdmVGcm9tU3Rha2VyUG9vbFNldDoKCXByb3RvIDIgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTk3CgkvLyBpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAwIC8vIGluU2FtZVZhbGlkYXRvclBvb2xDb3VudDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5OAoJLy8gaW5BbnlQb29sQ291bnQgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAxIC8vIGluQW55UG9vbENvdW50OiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTk5CgkvLyBmb3VuZCA9IGZhbHNlCglpbnQgMAoJZnJhbWVfYnVyeSAyIC8vIGZvdW5kOiBib29sCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwMQoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDIKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoKKmZvcl84OgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwMgoJLy8gaSA8IHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlLmxlbmd0aAoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl84X2VuZAoKCS8vICppZjQwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwMwoJLy8gcG9vbFNldFtpXS5pZCA9PT0gMAoJZnJhbWVfZGlnIDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWY0MF9lbmQKCgkvLyAqaWY0MF9jb25zZXF1ZW50CgliICpmb3JfOF9jb250aW51ZQoKKmlmNDBfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwNgoJLy8gaW5BbnlQb29sQ291bnQgKz0gMQoJZnJhbWVfZGlnIDEgLy8gaW5BbnlQb29sQ291bnQ6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMSAvLyBpbkFueVBvb2xDb3VudDogdWludDY0CgoJLy8gKmlmNDFfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjA3CgkvLyBwb29sU2V0W2ldLmlkID09PSBwb29sS2V5LmlkCglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgMAoJKwoJaW50IDgKCWV4dHJhY3QzCglidG9pCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCT09CglieiAqaWY0MV9lbmQKCgkvLyAqaWY0MV9jb25zZXF1ZW50CgkvLyAqaWY0Ml9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDgKCS8vIHBvb2xTZXRbaV0gPT09IHBvb2xLZXkKCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5Cgk9PQoJYnogKmlmNDJfZWxzZQoKCS8vICppZjQyX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDkKCS8vIGZvdW5kID0gdHJ1ZQoJaW50IDEKCWZyYW1lX2J1cnkgMiAvLyBmb3VuZDogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMTEKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlW2ldID0geyBpZDogMCwgcG9vbElkOiAwLCBwb29sQXBwSWQ6IDAgfQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJYiAqaWY0Ml9lbmQKCippZjQyX2Vsc2U6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjEzCgkvLyBpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgKz0gMQoJZnJhbWVfZGlnIDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCippZjQyX2VuZDoKCippZjQxX2VuZDoKCipmb3JfOF9jb250aW51ZToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDIKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzgKCipmb3JfOF9lbmQ6CgkvLyAqaWY0M19jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMTcKCS8vICFmb3VuZAoJZnJhbWVfZGlnIDIgLy8gZm91bmQ6IGJvb2wKCSEKCWJ6ICppZjQzX2VuZAoKCS8vICppZjQzX2NvbnNlcXVlbnQKCS8vIE5vIG1hdGNoaW5nIHNsb3QgZm91bmQgd2hlbiB0b2xkIHRvIHJlbW92ZSBhIHBvb2wgZnJvbSB0aGUgc3Rha2VycyBzZXQKCWVycgoKKmlmNDNfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIyMQoJLy8gcmV0dXJuIFtpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgPT09IDAsIGluQW55UG9vbENvdW50ID09PSAwXQoJYnl0ZSAweDAwCglpbnQgMAoJZnJhbWVfZGlnIDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCWludCAwCgk9PQoJc2V0Yml0CglpbnQgMQoJZnJhbWVfZGlnIDEgLy8gaW5BbnlQb29sQ291bnQ6IHVpbnQ2NAoJaW50IDAKCT09CglzZXRiaXQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCgkvLyBwb3AgYWxsIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHRoZSBzdGFjawoJcG9wbiA0CglyZXRzdWIKCi8vIGFkZFBvb2xUb05vZGUodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcG9vbEFwcElkOiB1aW50NjQsIG5vZGVOdW06IHVpbnQ2NCk6IHZvaWQKYWRkUG9vbFRvTm9kZToKCXByb3RvIDMgMAoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI1CgkvLyBub2RlUG9vbEFzc2lnbm1lbnRzID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5ub2RlUG9vbEFzc2lnbm1lbnRzKQoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfYnVyeSAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI2CgkvLyBtYXhQb29sc1Blck5vZGVGb3JUaGlzVmFsaWRhdG9yID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcucG9vbHNQZXJOb2RlIGFzIHVpbnQ2NAoJaW50IDIyNQoJaW50IDEKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDEgLy8gbWF4UG9vbHNQZXJOb2RlRm9yVGhpc1ZhbGlkYXRvcjogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIyOAoJLy8gYXNzZXJ0KG5vZGVOdW0gPj0gMSAmJiBub2RlTnVtIDw9IE1BWF9OT0RFUywgJ25vZGUgbnVtYmVyIG5vdCBpbiB2YWxpZCByYW5nZScpCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgMQoJPj0KCWR1cAoJYnogKnNraXBfYW5kMTAKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCA4Cgk8PQoJJiYKCipza2lwX2FuZDEwOgoJLy8gbm9kZSBudW1iZXIgbm90IGluIHZhbGlkIHJhbmdlCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjMwCgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IG1heFBvb2xzUGVyTm9kZUZvclRoaXNWYWxpZGF0b3I7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzk6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjMwCgkvLyBpIDwgbWF4UG9vbHNQZXJOb2RlRm9yVGhpc1ZhbGlkYXRvcgoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglmcmFtZV9kaWcgMSAvLyBtYXhQb29sc1Blck5vZGVGb3JUaGlzVmFsaWRhdG9yOiB1aW50NjQKCTwKCWJ6ICpmb3JfOV9lbmQKCgkvLyAqaWY0NF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMzEKCS8vIG5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbbm9kZU51bSAtIDFdLnBvb2xBcHBJZHNbaV0gPT09IDAKCWZyYW1lX2RpZyAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCWludCAwCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgMQoJLQoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWY0NF9lbmQKCgkvLyAqaWY0NF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjMzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLm5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbbm9kZU51bSAtIDFdLnBvb2xBcHBJZHNbaV0gPSBwb29sQXBwSWQKCWludCA5MDAKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCAxCgktCglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDAKCSsKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJZnJhbWVfZGlnIC0yIC8vIHBvb2xBcHBJZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMzQKCS8vIHJldHVybgoJcmV0c3ViCgoqaWY0NF9lbmQ6CgoqZm9yXzlfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjMwCgkvLyBpICs9IDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCWIgKmZvcl85CgoqZm9yXzlfZW5kOgoJLy8gbm8gYXZhaWxhYmxlIHNwYWNlIGluIHNwZWNpZmllZCBub2RlIGZvciB0aGlzIHBvb2wKCWVycgoJcmV0c3ViCgovLyBkb2VzU3Rha2VyTWVldEdhdGluZyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQpOiB2b2lkCi8vCi8vIENoZWNrcyBpZiBhIHN0YWtlciBtZWV0cyB0aGUgZ2F0aW5nIHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgYnkgdGhlIHZhbGlkYXRvci4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWx1ZVRvVmVyaWZ5IC0gVGhlIHZhbHVlIHRvIHZlcmlmeSBhZ2FpbnN0IHRoZSBnYXRpbmcgcmVxdWlyZW1lbnRzLgovLyBAcmV0dXJucyB7dm9pZH0gb3IgYXNzZXJ0cyBpZiByZXF1aXJlbWVudHMgbm90IG1ldC4KZG9lc1N0YWtlck1lZXRHYXRpbmc6Cglwcm90byAyIDAKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA4CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI0OAoJLy8gdHlwZSA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLmVudHJ5R2F0aW5nVHlwZQoJaW50IDgwCglpbnQgMQoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMCAvLyB0eXBlOiB1aW50OAoKCS8vICppZjQ1X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI0OQoJLy8gdHlwZSA9PT0gR0FUSU5HX1RZUEVfTk9ORQoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAwCgk9PQoJYnogKmlmNDVfZW5kCgoJLy8gKmlmNDVfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI1MAoJLy8gcmV0dXJuCglyZXRzdWIKCippZjQ1X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTIKCS8vIHN0YWtlciA9IHRoaXMudHhuLnNlbmRlcgoJdHhuIFNlbmRlcgoJZnJhbWVfYnVyeSAxIC8vIHN0YWtlcjogYWRkcmVzcwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTMKCS8vIGNvbmZpZyA9IGNsb25lKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnKQoJaW50IDAKCWludCAyNDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglmcmFtZV9idXJ5IDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCgkvLyAqaWY0Nl9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTcKCS8vIHR5cGUgPT09IEdBVElOR19UWVBFX0FTU0VUU19DUkVBVEVEX0JZIHx8CgkvLyAgICAgICAgICAgICB0eXBlID09PSBHQVRJTkdfVFlQRV9BU1NFVF9JRCB8fAoJLy8gICAgICAgICAgICAgdHlwZSA9PT0gR0FUSU5HX1RZUEVfQ1JFQVRFRF9CWV9ORkRfQUREUkVTU0VTCglmcmFtZV9kaWcgMCAvLyB0eXBlOiB1aW50OAoJaW50IDEKCT09CglkdXAKCWJueiAqc2tpcF9vcjQKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMgoJPT0KCXx8Cgoqc2tpcF9vcjQ6CglkdXAKCWJueiAqc2tpcF9vcjUKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMwoJPT0KCXx8Cgoqc2tpcF9vcjU6CglieiAqaWY0Nl9lbmQKCgkvLyAqaWY0Nl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjYxCgkvLyBhc3NlcnQodmFsdWVUb1ZlcmlmeSAhPT0gMCkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWludCAwCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI2MgoJLy8gYmFsUmVxdWlyZWQgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5nYXRpbmdBc3NldE1pbkJhbGFuY2UKCWludCAxNDUKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAzIC8vIGJhbFJlcXVpcmVkOiB1aW50NjQKCgkvLyAqaWY0N19jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNjMKCS8vIGJhbFJlcXVpcmVkID09PSAwCglmcmFtZV9kaWcgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0CglpbnQgMAoJPT0KCWJ6ICppZjQ3X2VuZAoKCS8vICppZjQ3X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNjQKCS8vIGJhbFJlcXVpcmVkID0gMQoJaW50IDEKCWZyYW1lX2J1cnkgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0CgoqaWY0N19lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjY2CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgc3Rha2VyLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQodmFsdWVUb1ZlcmlmeSkpID49IGJhbFJlcXVpcmVkLAoJLy8gICAgICAgICAgICAgICAgICdtdXN0IGhhdmUgcmVxdWlyZWQgbWluaW11bSBiYWxhbmNlIG9mIHZhbGlkYXRvciBkZWZpbmVkIHRva2VuIHRvIGFkZCBzdGFrZScsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgMSAvLyBzdGFrZXI6IGFkZHJlc3MKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQoJcG9wCglmcmFtZV9kaWcgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0Cgk+PQoKCS8vIG11c3QgaGF2ZSByZXF1aXJlZCBtaW5pbXVtIGJhbGFuY2Ugb2YgdmFsaWRhdG9yIGRlZmluZWQgdG9rZW4gdG8gYWRkIHN0YWtlCglhc3NlcnQKCippZjQ2X2VuZDoKCS8vICppZjQ4X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3MQoJLy8gdHlwZSA9PT0gR0FUSU5HX1RZUEVfQVNTRVRTX0NSRUFURURfQlkKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMQoJPT0KCWJ6ICppZjQ4X2VuZAoKCS8vICppZjQ4X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNzIKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICBBc3NldElELmZyb21VaW50NjQodmFsdWVUb1ZlcmlmeSkuY3JlYXRvciA9PT0gY29uZmlnLmVudHJ5R2F0aW5nQWRkcmVzcywKCS8vICAgICAgICAgICAgICAgICAnc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgY3JlYXRlZCBieSBjcmVhdG9yIHRoYXQgdGhlIHZhbGlkYXRvciBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UnLAoJLy8gICAgICAgICAgICAgKQoJZnJhbWVfZGlnIC0yIC8vIHZhbHVlVG9WZXJpZnk6IHVpbnQ2NAoJYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKCXBvcAoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgODEgMzIKCT09CgoJLy8gc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgY3JlYXRlZCBieSBjcmVhdG9yIHRoYXQgdGhlIHZhbGlkYXRvciBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UKCWFzc2VydAoKKmlmNDhfZW5kOgoJLy8gKmlmNDlfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjc3CgkvLyB0eXBlID09PSBHQVRJTkdfVFlQRV9BU1NFVF9JRAoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAyCgk9PQoJYnogKmlmNDlfZW5kCgoJLy8gKmlmNDlfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3OAoJLy8gZm91bmQgPSBmYWxzZQoJaW50IDAKCWZyYW1lX2J1cnkgNCAvLyBmb3VuZDogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNzkKCS8vIGNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0cwoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMTEzIDMyCglkdXAKCWZyYW1lX2J1cnkgNSAvLyBjb3B5IG9mIHRoZSBhcnJheSB3ZSBhcmUgaXRlcmF0aW5nIG92ZXIKCWV4dHJhY3QgMCA4CglidG9pCglmcmFtZV9idXJ5IDYgLy8gYXNzZXRJZDogdWludDY0CglpbnQgMAoJZnJhbWVfYnVyeSA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCgoqZm9yT2ZfMDoKCS8vICppZjUwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI4MAoJLy8gdmFsdWVUb1ZlcmlmeSA9PT0gYXNzZXRJZAoJZnJhbWVfZGlnIC0yIC8vIHZhbHVlVG9WZXJpZnk6IHVpbnQ2NAoJZnJhbWVfZGlnIDYgLy8gYXNzZXRJZDogdWludDY0Cgk9PQoJYnogKmlmNTBfZW5kCgoJLy8gKmlmNTBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI4MQoJLy8gZm91bmQgPSB0cnVlCglpbnQgMQoJZnJhbWVfYnVyeSA0IC8vIGZvdW5kOiBib29sCgliICpmb3JPZl8wX2VuZAoKKmlmNTBfZW5kOgoKKmZvck9mXzBfY29udGludWU6CgkvLyBpbmNyZW1lbnQgb2Zmc2V0IGFuZCBsb29wIGlmIG5vdCBvdXQgb2YgYm91bmRzCglmcmFtZV9kaWcgNyAvLyB0aGUgb2Zmc2V0IHdlIGFyZSBleHRyYWN0aW5nIHRoZSBuZXh0IGVsZW1lbnQgZnJvbQoJaW50IDgKCSsKCWR1cAoJaW50IDMyIC8vIG9mZnNldCBvZiBsYXN0IGVsZW1lbnQKCTwKCWJ6ICpmb3JPZl8wX2VuZAoJZnJhbWVfYnVyeSA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCglmcmFtZV9kaWcgNSAvLyBjb3B5IG9mIHRoZSBhcnJheSB3ZSBhcmUgaXRlcmF0aW5nIG92ZXIKCWZyYW1lX2RpZyA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCglpbnQgOAoJZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSA2IC8vIGFzc2V0SWQ6IHVpbnQ2NAoJYiAqZm9yT2ZfMAoKKmZvck9mXzBfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI4NQoJLy8gYXNzZXJ0KGZvdW5kLCAnc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgaWRlbnRpY2FsIHRvIHRoZSBhc3NldCBpZCBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UnKQoJZnJhbWVfZGlnIDQgLy8gZm91bmQ6IGJvb2wKCgkvLyBzcGVjaWZpZWQgYXNzZXQgbXVzdCBiZSBpZGVudGljYWwgdG8gdGhlIGFzc2V0IGlkIGRlZmluZWQgYXMgYSByZXF1aXJlbWVudCB0byBzdGFrZQoJYXNzZXJ0CgoqaWY0OV9lbmQ6CgkvLyAqaWY1MV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyODcKCS8vIHR5cGUgPT09IEdBVElOR19UWVBFX0NSRUFURURfQllfTkZEX0FERFJFU1NFUwoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAzCgk9PQoJYnogKmlmNTFfZW5kCgoJLy8gKmlmNTFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI5MAoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIHRoaXMuaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0KGNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0c1swXSwgQXNzZXRJRC5mcm9tVWludDY0KHZhbHVlVG9WZXJpZnkpLmNyZWF0b3IpLAoJLy8gICAgICAgICAgICAgICAgICdzcGVjaWZpZWQgYXNzZXQgbXVzdCBiZSBjcmVhdGVkIGJ5IGNyZWF0b3IgdGhhdCBpcyBvbmUgb2YgdGhlIGxpbmtlZCBhZGRyZXNzZXMgaW4gYW4gbmZkJywKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCglwb3AKCWZyYW1lX2RpZyAyIC8vIGNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCglleHRyYWN0IDExMyA4CglidG9pCgljYWxsc3ViIGlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdAoKCS8vIHNwZWNpZmllZCBhc3NldCBtdXN0IGJlIGNyZWF0ZWQgYnkgY3JlYXRvciB0aGF0IGlzIG9uZSBvZiB0aGUgbGlua2VkIGFkZHJlc3NlcyBpbiBhbiBuZmQKCWFzc2VydAoKKmlmNTFfZW5kOgoJLy8gKmlmNTJfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjk1CgkvLyB0eXBlID09PSBHQVRJTkdfVFlQRV9TRUdNRU5UX09GX05GRAoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCA0Cgk9PQoJYnogKmlmNTJfZW5kCgoJLy8gKmlmNTJfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI5NwoJLy8gdXNlck9mZmVyZWRORkRBcHBJRCA9IHZhbHVlVG9WZXJpZnkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWZyYW1lX2J1cnkgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjk4CgkvLyBhc3NlcnQodGhpcy5pc05GREFwcElEVmFsaWQodXNlck9mZmVyZWRORkRBcHBJRCksICdwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZCcpCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWNhbGxzdWIgaXNORkRBcHBJRFZhbGlkCgoJLy8gcHJvdmlkZWQgTkZEIG11c3QgYmUgdmFsaWQKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMDEKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICByYXdCeXRlcyhBcHBJRC5mcm9tVWludDY0KHVzZXJPZmZlcmVkTkZEQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzKSA9PT0KCS8vICAgICAgICAgICAgICAgICAgICAgcmF3Qnl0ZXMoc3Rha2VyKSB8fCB0aGlzLmlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdCh1c2VyT2ZmZXJlZE5GREFwcElELCBzdGFrZXIpLAoJLy8gICAgICAgICAgICAgICAgICJwcm92aWRlZCBuZmQgZm9yIGVudHJ5IGlzbid0IG93bmVkIG9yIGxpbmtlZCB0byB0aGUgc3Rha2VyIiwKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyA4IC8vIHVzZXJPZmZlcmVkTkZEQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQodXNlck9mZmVyZWRORkRBcHBJRCkuZ2xvYmFsU3RhdGUoJ2kub3duZXIuYScpCglhc3NlcnQKCWZyYW1lX2RpZyAxIC8vIHN0YWtlcjogYWRkcmVzcwoJPT0KCWR1cAoJYm56ICpza2lwX29yNgoJZnJhbWVfZGlnIDEgLy8gc3Rha2VyOiBhZGRyZXNzCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWNhbGxzdWIgaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0Cgl8fAoKKnNraXBfb3I2OgoJLy8gcHJvdmlkZWQgbmZkIGZvciBlbnRyeSBpc24ndCBvd25lZCBvciBsaW5rZWQgdG8gdGhlIHN0YWtlcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMwOAoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIGJ0b2koQXBwSUQuZnJvbVVpbnQ2NCh1c2VyT2ZmZXJlZE5GREFwcElEKS5nbG9iYWxTdGF0ZSgnaS5wYXJlbnRBcHBJRCcpIGFzIGJ5dGVzKSA9PT0KCS8vICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmVudHJ5R2F0aW5nQXNzZXRzWzBdLAoJLy8gICAgICAgICAgICAgICAgICdzcGVjaWZpZWQgbmZkIG11c3QgYmUgYSBzZWdtZW50IG9mIHRoZSBuZmQgdGhlIHZhbGlkYXRvciBzcGVjaWZpZWQgYXMgYSByZXF1aXJlbWVudCcsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWJ5dGUgMHg2OTJlNzA2MTcyNjU2ZTc0NDE3MDcwNDk0NCAvLyAiaS5wYXJlbnRBcHBJRCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHVzZXJPZmZlcmVkTkZEQXBwSUQpLmdsb2JhbFN0YXRlKCdpLnBhcmVudEFwcElEJykKCWFzc2VydAoJYnRvaQoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMTEzIDgKCWJ0b2kKCT09CgoJLy8gc3BlY2lmaWVkIG5mZCBtdXN0IGJlIGEgc2VnbWVudCBvZiB0aGUgbmZkIHRoZSB2YWxpZGF0b3Igc3BlY2lmaWVkIGFzIGEgcmVxdWlyZW1lbnQKCWFzc2VydAoKKmlmNTJfZW5kOgoJcmV0c3ViCgovLyBpc05GREFwcElEVmFsaWQobmZkQXBwSUQ6IHVpbnQ2NCk6IGJvb2xlYW4KLy8KLy8gQ2hlY2tzIGlmIHRoZSBnaXZlbiBORkQgQXBwIGlkIGlzIHZhbGlkLiAgVXNpbmcgb25seSB0aGUgQXBwIGlkIHRoZXJlJ3Mgbm8gdmFsaWRhdGlvbiBhZ2FpbnN0IHRoZSBuYW1lIChpZTogdGhhdCBuZmQgWCBpcyBuYW1lIFkpCi8vIFNvIGl0J3MgYXNzdW1lZCBmb3IgdGhlIGNhbGxlciwgdGhlIGFwcCBpZCBhbG9uZSBpcyBmaW5lLiAgVGhlIG5hbWUgaXMgZmV0Y2hlZCBmcm9tIHRoZSBzcGVjaWZpZWQgYXBwIGlkIGFuZCB0aGUgdHdvCi8vIHRvZ2V0aGVyIGFyZSB1c2VkIGZvciB2YWxpZGl0eSBjaGVjayBjYWxsIHRvIHRoZSBuZmQgcmVnaXN0cnkuCi8vCi8vIEBwYXJhbSB7dWludDY0fSBuZmRBcHBJRCAtIFRoZSBORkQgQXBwIGlkIHRvIHZlcmlmeS4KLy8KLy8gQHJldHVybnMge2Jvb2xlYW59IC0gUmV0dXJucyB0cnVlIGlmIHRoZSBORkQgQXBwIGlkIGlzIHZhbGlkLCBvdGhlcndpc2UgZmFsc2UuCmlzTkZEQXBwSURWYWxpZDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMyNwoJLy8gdXNlck9mZmVyZWRORkROYW1lID0gQXBwSUQuZnJvbVVpbnQ2NChuZmRBcHBJRCkuZ2xvYmFsU3RhdGUoJ2kubmFtZScpIGFzIHN0cmluZwoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWJ5dGUgMHg2OTJlNmU2MTZkNjUgLy8gImkubmFtZSIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KG5mZEFwcElEKS5nbG9iYWxTdGF0ZSgnaS5uYW1lJykKCWFzc2VydAoJZnJhbWVfYnVyeSAwIC8vIHVzZXJPZmZlcmVkTkZETmFtZTogc3RyaW5nCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMyOQoJLy8gcmV0dXJuIHNlbmRNZXRob2RDYWxsPFtzdHJpbmcsIHVpbnQ2NF0sIGJvb2xlYW4+KHsKCS8vICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQodGhpcy5uZmRSZWdpc3RyeUFwcElkKSwKCS8vICAgICAgICAgICAgIG5hbWU6ICdpc1ZhbGlkTmZkQXBwSWQnLAoJLy8gICAgICAgICAgICAgbWV0aG9kQXJnczogW3VzZXJPZmZlcmVkTkZETmFtZSwgbmZkQXBwSURdLAoJLy8gICAgICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAiaXNWYWxpZE5mZEFwcElkKHN0cmluZyx1aW50NjQpYm9vbCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMzMAoJLy8gYXBwbGljYXRpb25JRDogQXBwSUQuZnJvbVVpbnQ2NCh0aGlzLm5mZFJlZ2lzdHJ5QXBwSWQpCglsb2FkIDIwMCAvLyBUTVBMX25mZFJlZ2lzdHJ5QXBwSWQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMzIKCS8vIG1ldGhvZEFyZ3M6IFt1c2VyT2ZmZXJlZE5GRE5hbWUsIG5mZEFwcElEXQoJZnJhbWVfZGlnIDAgLy8gdXNlck9mZmVyZWRORkROYW1lOiBzdHJpbmcKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoJaXR4biBOdW1Mb2dzCglpbnQgMQoJLQoJaXR4bmFzIExvZ3MKCWV4dHJhY3QgNCAwCglpbnQgMAoJZ2V0Yml0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCglyZXRzdWIKCi8vIGlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdChuZmRBcHBJRDogdWludDY0LCBhZGRyVG9GaW5kOiBBZGRyZXNzKTogYm9vbGVhbgovLwovLyBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBhZGRyZXNzIGlzIHByZXNlbnQgaW4gYW4gTkZEcyBsaXN0IG9mIHZlcmlmaWVkIGFkZHJlc3Nlcy4KLy8gVGhlIE5GRCBpcyBhc3N1bWVkIHRvIGhhdmUgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcyBvZmZpY2lhbC4KLy8KLy8gQHBhcmFtIHt1aW50NjR9IG5mZEFwcElEIC0gVGhlIE5GRCBhcHBsaWNhdGlvbiBpZC4KLy8gQHBhcmFtIHtBZGRyZXNzfSBhZGRyVG9GaW5kIC0gVGhlIGFkZHJlc3MgdG8gZmluZCBpbiB0aGUgdi5jYUFsZ28uMC5hcyBwcm9wZXJ0eQovLyBAcmV0dXJuIHtib29sZWFufSAtIGB0cnVlYCBpZiB0aGUgYWRkcmVzcyBpcyBwcmVzZW50LCBgZmFsc2VgIG90aGVyd2lzZS4KaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0OgoJcHJvdG8gMiAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDUKCS8vIHNlbmRBcHBDYWxsKHsKCS8vICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLAoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25BcmdzOiBbJ3JlYWRfcHJvcGVydHknLCAndi5jYUFsZ28uMC5hcyddLAoJLy8gICAgICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzQ2CgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KG5mZEFwcElEKQoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDcKCS8vIGFwcGxpY2F0aW9uQXJnczogWydyZWFkX3Byb3BlcnR5JywgJ3YuY2FBbGdvLjAuYXMnXQoJYnl0ZSAweDcyNjU2MTY0NWY3MDcyNmY3MDY1NzI3NDc5IC8vICJyZWFkX3Byb3BlcnR5IgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWJ5dGUgMHg3NjJlNjM2MTQxNmM2NzZmMmUzMDJlNjE3MyAvLyAidi5jYUFsZ28uMC5hcyIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDkKCS8vIGNhQWxnb0RhdGEgPSB0aGlzLml0eG4ubGFzdExvZwoJaXR4biBMYXN0TG9nCglmcmFtZV9idXJ5IDAgLy8gY2FBbGdvRGF0YTogYnl0ZVtdCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM1MAoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBjYUFsZ29EYXRhLmxlbmd0aDsgaSArPSAzMikKCWludCAwCglmcmFtZV9idXJ5IDEgLy8gaTogdWludDY0CgoqZm9yXzEwOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM1MAoJLy8gaSA8IGNhQWxnb0RhdGEubGVuZ3RoCglmcmFtZV9kaWcgMSAvLyBpOiB1aW50NjQKCWZyYW1lX2RpZyAwIC8vIGNhQWxnb0RhdGE6IGJ5dGVbXQoJbGVuCgk8CglieiAqZm9yXzEwX2VuZAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNTEKCS8vIGFkZHIgPSBleHRyYWN0MyhjYUFsZ29EYXRhLCBpLCAzMikKCWZyYW1lX2RpZyAwIC8vIGNhQWxnb0RhdGE6IGJ5dGVbXQoJZnJhbWVfZGlnIDEgLy8gaTogdWludDY0CglpbnQgMzIKCWV4dHJhY3QzCglmcmFtZV9idXJ5IDIgLy8gYWRkcjogYnl0ZVtdCgoJLy8gKmlmNTNfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzUyCgkvLyBhZGRyICE9PSByYXdCeXRlcyhnbG9iYWxzLnplcm9BZGRyZXNzKSAmJiBhZGRyID09PSByYXdCeXRlcyhhZGRyVG9GaW5kKQoJZnJhbWVfZGlnIDIgLy8gYWRkcjogYnl0ZVtdCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CglkdXAKCWJ6ICpza2lwX2FuZDExCglmcmFtZV9kaWcgMiAvLyBhZGRyOiBieXRlW10KCWZyYW1lX2RpZyAtMiAvLyBhZGRyVG9GaW5kOiBBZGRyZXNzCgk9PQoJJiYKCipza2lwX2FuZDExOgoJYnogKmlmNTNfZW5kCgoJLy8gKmlmNTNfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM1MwoJLy8gcmV0dXJuIHRydWUKCWludCAxCgliICppc0FkZHJlc3NJbk5GRENBQWxnb0xpc3QqcmV0dXJuCgoqaWY1M19lbmQ6CgoqZm9yXzEwX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM1MAoJLy8gaSArPSAzMgoJZnJhbWVfZGlnIDEgLy8gaTogdWludDY0CglpbnQgMzIKCSsKCWZyYW1lX2J1cnkgMSAvLyBpOiB1aW50NjQKCWIgKmZvcl8xMAoKKmZvcl8xMF9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzU2CgkvLyByZXR1cm4gZmFsc2UKCWludCAwCgoqaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0KnJldHVybjoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDIKCXJldHN1YgoKLy8gYWxnb1NhdHVyYXRpb25MZXZlbCgpOiB1aW50NjQKLy8KLy8gUmV0dXJucyB0aGUgbWF4aW11bSBhbGxvd2VkIHN0YWtlIHBlciB2YWxpZGF0b3IgYmFzZWQgb24gYSBwZXJjZW50YWdlIG9mIGFsbCBjdXJyZW50IG9ubGluZSBzdGFrZSBiZWZvcmUKLy8gdGhlIHZhbGlkYXRvciBpcyBjb25zaWRlcmVkIHNhdHVyYXRlZCAtIHdoZXJlIHJld2FyZHMgYXJlIGRpbWluaXNoZWQuCi8vIE5PVEU6IHRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCB0d2ljZSAtIGhlcmUgYW5kIGluIHN0YWtpbmcgcG9vbCBjb250cmFjdC4gIEJvdGggbXVzdCBiZSBpZGVudGljYWwuCmFsZ29TYXR1cmF0aW9uTGV2ZWw6Cglwcm90byAwIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNjUKCS8vIG9ubGluZSA9IHRoaXMuZ2V0Q3VycmVudE9ubGluZVN0YWtlKCkKCWNhbGxzdWIgZ2V0Q3VycmVudE9ubGluZVN0YWtlCglmcmFtZV9idXJ5IDAgLy8gb25saW5lOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzY3CgkvLyByZXR1cm4gd2lkZVJhdGlvKFtvbmxpbmUsIE1BWF9WQUxJREFUT1JfU09GVF9QQ1RfT0ZfT05MSU5FXzFERUNJTUFMXSwgWzEwMDBdKQoJZnJhbWVfZGlnIDAgLy8gb25saW5lOiB1aW50NjQKCWludCAxMDAKCW11bHcKCWludCAwCglpbnQgMTAwMAoJZGl2bW9kdwoJcG9wCglwb3AKCXN3YXAKCSEKCgkvLyB3aWRlUmF0aW8gZmFpbGVkCglhc3NlcnQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gbWF4QWxsb3dlZFN0YWtlKCk6IHVpbnQ2NAovLwovLyBSZXR1cm5zIHRoZSBNQVhJTVVNIGFsbG93ZWQgc3Rha2UgcGVyIHZhbGlkYXRvciBiYXNlZCBvbiBhIHBlcmNlbnRhZ2Ugb2YgYWxsIGN1cnJlbnQgb25saW5lIHN0YWtlLgovLyBBZGRpbmcgc3Rha2UgaXMgY29tcGxldGVseSBibG9ja2VkIGF0IHRoaXMgYW1vdW50LgptYXhBbGxvd2VkU3Rha2U6Cglwcm90byAwIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNzUKCS8vIG9ubGluZSA9IHRoaXMuZ2V0Q3VycmVudE9ubGluZVN0YWtlKCkKCWNhbGxzdWIgZ2V0Q3VycmVudE9ubGluZVN0YWtlCglmcmFtZV9idXJ5IDAgLy8gb25saW5lOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzc3CgkvLyByZXR1cm4gd2lkZVJhdGlvKFtvbmxpbmUsIE1BWF9WQUxJREFUT1JfSEFSRF9QQ1RfT0ZfT05MSU5FXzFERUNJTUFMXSwgWzEwMDBdKQoJZnJhbWVfZGlnIDAgLy8gb25saW5lOiB1aW50NjQKCWludCAxNTAKCW11bHcKCWludCAwCglpbnQgMTAwMAoJZGl2bW9kdwoJcG9wCglwb3AKCXN3YXAKCSEKCgkvLyB3aWRlUmF0aW8gZmFpbGVkCglhc3NlcnQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gbWF4QWxnb0FsbG93ZWRQZXJQb29sKCk6IHVpbnQ2NAovLwovLyBSZXR1cm5zIHRoZSBNQVhJTVVNIGFsbG93ZWQgc3Rha2UgcGVyIHBvb2wgYW5kIHN0aWxsIHJlY2VpdmUgaW5jZW50aXZlcyAtIHdlJ2xsIHRyZWF0IHRoaXMgYXMgdGhlICdtYXggcGVyIHBvb2wnCm1heEFsZ29BbGxvd2VkUGVyUG9vbDoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzODQKCS8vIHJldHVybiBnbG9iYWxzLnBheW91dHNNYXhCYWxhbmNlCglnbG9iYWwgUGF5b3V0c01heEJhbGFuY2UKCXJldHN1YgoKLy8gZ2V0Q3VycmVudE9ubGluZVN0YWtlKCk6IHVpbnQ2NApnZXRDdXJyZW50T25saW5lU3Rha2U6Cglwcm90byAwIDEKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzg4CgkvLyByZXR1cm4gb25saW5lU3Rha2UoKQoJb25saW5lX3N0YWtlCglyZXRzdWIKCi8vIG1pbkJhbGFuY2VGb3JBY2NvdW50KGNvbnRyYWN0czogdWludDY0LCBleHRyYVBhZ2VzOiB1aW50NjQsIGFzc2V0czogdWludDY0LCBsb2NhbEludHM6IHVpbnQ2NCwgbG9jYWxCeXRlczogdWludDY0LCBnbG9iYWxJbnRzOiB1aW50NjQsIGdsb2JhbEJ5dGVzOiB1aW50NjQpOiB1aW50NjQKbWluQmFsYW5jZUZvckFjY291bnQ6Cglwcm90byA3IDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDAKCS8vIG1pbkJhbCA9IEFMR09SQU5EX0FDQ09VTlRfTUlOX0JBTEFOQ0UKCWludCAxMDAwMDAKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDEKCS8vIG1pbkJhbCArPSBjb250cmFjdHMgKiBBUFBMSUNBVElPTl9CQVNFX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyBjb250cmFjdHM6IHVpbnQ2NAoJaW50IDEwMDAwMAoJKgoJKwoJZnJhbWVfYnVyeSAwIC8vIG1pbkJhbDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTQwMgoJLy8gbWluQmFsICs9IGV4dHJhUGFnZXMgKiBBUFBMSUNBVElPTl9CQVNFX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyBleHRyYVBhZ2VzOiB1aW50NjQKCWludCAxMDAwMDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDMKCS8vIG1pbkJhbCArPSBhc3NldHMgKiBBU1NFVF9IT0xESU5HX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMyAvLyBhc3NldHM6IHVpbnQ2NAoJaW50IDEwMDAwMAoJKgoJKwoJZnJhbWVfYnVyeSAwIC8vIG1pbkJhbDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTQwNAoJLy8gbWluQmFsICs9IGxvY2FsSW50cyAqIFNTQ19WQUxVRV9VSU5UCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoJZnJhbWVfZGlnIC00IC8vIGxvY2FsSW50czogdWludDY0CglpbnQgMjg1MDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDUKCS8vIG1pbkJhbCArPSBnbG9iYWxJbnRzICogU1NDX1ZBTFVFX1VJTlQKCWZyYW1lX2RpZyAwIC8vIG1pbkJhbDogdWludDY0CglmcmFtZV9kaWcgLTYgLy8gZ2xvYmFsSW50czogdWludDY0CglpbnQgMjg1MDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDYKCS8vIG1pbkJhbCArPSBsb2NhbEJ5dGVzICogU1NDX1ZBTFVFX0JZVEVTCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoJZnJhbWVfZGlnIC01IC8vIGxvY2FsQnl0ZXM6IHVpbnQ2NAoJaW50IDUwMDAwCgkqCgkrCglmcmFtZV9idXJ5IDAgLy8gbWluQmFsOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDA3CgkvLyBtaW5CYWwgKz0gZ2xvYmFsQnl0ZXMgKiBTU0NfVkFMVUVfQllURVMKCWZyYW1lX2RpZyAwIC8vIG1pbkJhbDogdWludDY0CglmcmFtZV9kaWcgLTcgLy8gZ2xvYmFsQnl0ZXM6IHVpbnQ2NAoJaW50IDUwMDAwCgkqCgkrCglmcmFtZV9idXJ5IDAgLy8gbWluQmFsOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDA4CgkvLyByZXR1cm4gbWluQmFsCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoJcmV0c3ViCgovLyBjb3N0Rm9yQm94U3RvcmFnZSh0b3RhbE51bUJ5dGVzOiB1aW50NjQpOiB1aW50NjQKY29zdEZvckJveFN0b3JhZ2U6Cglwcm90byAxIDEKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDE1CgkvLyByZXR1cm4gU0NCT1hfUEVSQk9YICsgdG90YWxOdW1CeXRlcyAqIFNDQk9YX1BFUkJZVEUKCWludCAyNTAwCglmcmFtZV9kaWcgLTEgLy8gdG90YWxOdW1CeXRlczogdWludDY0CglpbnQgNDAwCgkqCgkrCglyZXRzdWIKCipjcmVhdGVfTm9PcDoKCW1ldGhvZCAiY3JlYXRlQXBwbGljYXRpb24oKXZvaWQiCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAwCgltYXRjaCAqYWJpX3JvdXRlX2NyZWF0ZUFwcGxpY2F0aW9uCgoJLy8gdGhpcyBjb250cmFjdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGdpdmVuIEFCSSBtZXRob2QgZm9yIGNyZWF0ZSBOb09wCgllcnIKCipjYWxsX05vT3A6CgltZXRob2QgImluaXRTdGFraW5nQ29udHJhY3QodWludDY0KXZvaWQiCgltZXRob2QgImxvYWRTdGFraW5nQ29udHJhY3REYXRhKHVpbnQ2NCxieXRlW10pdm9pZCIKCW1ldGhvZCAiZmluYWxpemVTdGFraW5nQ29udHJhY3QoKXZvaWQiCgltZXRob2QgImdhcygpdm9pZCIKCW1ldGhvZCAiZ2V0TWJyQW1vdW50cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCgltZXRob2QgImdldFByb3RvY29sQ29uc3RyYWludHMoKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiZ2V0TnVtVmFsaWRhdG9ycygpdWludDY0IgoJbWV0aG9kICJnZXRWYWxpZGF0b3JDb25maWcodWludDY0KSh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiZ2V0VmFsaWRhdG9yU3RhdGUodWludDY0KSh1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQpIgoJbWV0aG9kICJnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpIgoJbWV0aG9kICJnZXRQb29scyh1aW50NjQpKHVpbnQ2NCx1aW50MTYsdWludDY0KVtdIgoJbWV0aG9kICJnZXRQb29sQXBwSWQodWludDY0LHVpbnQ2NCl1aW50NjQiCgltZXRob2QgImdldFBvb2xJbmZvKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpKHVpbnQ2NCx1aW50MTYsdWludDY0KSIKCW1ldGhvZCAiZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHVpbnQ2NCl1aW50NjQiCgltZXRob2QgImRvZXNTdGFrZXJOZWVkVG9QYXlNQlIoYWRkcmVzcylib29sIgoJbWV0aG9kICJnZXRTdGFrZWRQb29sc0ZvckFjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCx1aW50NjQpW10iCgltZXRob2QgImdldFRva2VuUGF5b3V0UmF0aW8odWludDY0KSh1aW50NjRbMjRdLHVpbnQ2NCkiCgltZXRob2QgImdldE5vZGVQb29sQXNzaWdubWVudHModWludDY0KSgodWludDY0WzNdKVs4XSkiCgltZXRob2QgImdldE5GRFJlZ2lzdHJ5SUQoKXVpbnQ2NCIKCW1ldGhvZCAiYWRkVmFsaWRhdG9yKHBheSxzdHJpbmcsKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIKCW1ldGhvZCAiY2hhbmdlVmFsaWRhdG9yTWFuYWdlcih1aW50NjQsYWRkcmVzcyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQiCgltZXRob2QgImNoYW5nZVZhbGlkYXRvck5GRCh1aW50NjQsdWludDY0LHN0cmluZyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyh1aW50NjQsYWRkcmVzcyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JSZXdhcmRJbmZvKHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0KXZvaWQiCgltZXRob2QgImFkZFBvb2wocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAic2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KSIKCW1ldGhvZCAic3Rha2VVcGRhdGVkVmlhUmV3YXJkcygodWludDY0LHVpbnQ2NCx1aW50NjQpLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIgoJbWV0aG9kICJzdGFrZVJlbW92ZWQoKHVpbnQ2NCx1aW50NjQsdWludDY0KSxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCl2b2lkIgoJbWV0aG9kICJmaW5kUG9vbEZvclN0YWtlcih1aW50NjQsYWRkcmVzcyx1aW50NjQpKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKSIKCW1ldGhvZCAibW92ZVBvb2xUb05vZGUodWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIKCW1ldGhvZCAiZW1wdHlUb2tlblJld2FyZHModWludDY0LGFkZHJlc3MpdWludDY0IgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggKmFiaV9yb3V0ZV9pbml0U3Rha2luZ0NvbnRyYWN0ICphYmlfcm91dGVfbG9hZFN0YWtpbmdDb250cmFjdERhdGEgKmFiaV9yb3V0ZV9maW5hbGl6ZVN0YWtpbmdDb250cmFjdCAqYWJpX3JvdXRlX2dhcyAqYWJpX3JvdXRlX2dldE1ickFtb3VudHMgKmFiaV9yb3V0ZV9nZXRQcm90b2NvbENvbnN0cmFpbnRzICphYmlfcm91dGVfZ2V0TnVtVmFsaWRhdG9ycyAqYWJpX3JvdXRlX2dldFZhbGlkYXRvckNvbmZpZyAqYWJpX3JvdXRlX2dldFZhbGlkYXRvclN0YXRlICphYmlfcm91dGVfZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyICphYmlfcm91dGVfZ2V0UG9vbHMgKmFiaV9yb3V0ZV9nZXRQb29sQXBwSWQgKmFiaV9yb3V0ZV9nZXRQb29sSW5mbyAqYWJpX3JvdXRlX2dldEN1ck1heFN0YWtlUGVyUG9vbCAqYWJpX3JvdXRlX2RvZXNTdGFrZXJOZWVkVG9QYXlNQlIgKmFiaV9yb3V0ZV9nZXRTdGFrZWRQb29sc0ZvckFjY291bnQgKmFiaV9yb3V0ZV9nZXRUb2tlblBheW91dFJhdGlvICphYmlfcm91dGVfZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cyAqYWJpX3JvdXRlX2dldE5GRFJlZ2lzdHJ5SUQgKmFiaV9yb3V0ZV9hZGRWYWxpZGF0b3IgKmFiaV9yb3V0ZV9jaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyICphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyAqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvck5GRCAqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzICphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mbyAqYWJpX3JvdXRlX2FkZFBvb2wgKmFiaV9yb3V0ZV9hZGRTdGFrZSAqYWJpX3JvdXRlX3NldFRva2VuUGF5b3V0UmF0aW8gKmFiaV9yb3V0ZV9zdGFrZVVwZGF0ZWRWaWFSZXdhcmRzICphYmlfcm91dGVfc3Rha2VSZW1vdmVkICphYmlfcm91dGVfZmluZFBvb2xGb3JTdGFrZXIgKmFiaV9yb3V0ZV9tb3ZlUG9vbFRvTm9kZSAqYWJpX3JvdXRlX2VtcHR5VG9rZW5SZXdhcmRzCgoJLy8gdGhpcyBjb250cmFjdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGdpdmVuIEFCSSBtZXRob2QgZm9yIGNhbGwgTm9PcAoJZXJy", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEx" }, "contract": { @@ -292,6 +292,7 @@ { "name": "getNumValidators", "desc": "Returns the current number of validators", + "readonly": true, "args": [], "returns": { "type": "uint64" @@ -299,6 +300,7 @@ }, { "name": "getValidatorConfig", + "readonly": true, "args": [ { "name": "validatorId", @@ -311,6 +313,7 @@ }, { "name": "getValidatorState", + "readonly": true, "args": [ { "name": "validatorId", @@ -323,6 +326,7 @@ }, { "name": "getValidatorOwnerAndManager", + "readonly": true, "args": [ { "name": "validatorId", @@ -336,6 +340,7 @@ { "name": "getPools", "desc": "Return list of all pools for this validator.", + "readonly": true, "args": [ { "name": "validatorId", @@ -349,6 +354,8 @@ }, { "name": "getPoolAppId", + "desc": "getPoolAppId is useful for callers to determine app to call for removing stake if they don't have staking or\nwant to get staker list for an account. The staking pool also uses it to get the app id of staking pool 1\n(which contains reward tokens if being used) so that the amount available can be determined.", + "readonly": true, "args": [ { "name": "validatorId", @@ -365,6 +372,7 @@ }, { "name": "getPoolInfo", + "readonly": true, "args": [ { "name": "poolKey", @@ -378,6 +386,7 @@ { "name": "getCurMaxStakePerPool", "desc": "Calculate the maximum stake per pool for a given validator.\nNormally this would be maxAlgoPerPool, but it should also never go above MaxAllowedStake / numPools so\nas pools are added the max allowed per pool can reduce.", + "readonly": true, "args": [ { "name": "validatorId", @@ -392,6 +401,7 @@ { "name": "doesStakerNeedToPayMBR", "desc": "Helper callers can call w/ simulate to determine if 'AddStaker' MBR should be included w/ staking amount", + "readonly": true, "args": [ { "name": "staker", @@ -405,6 +415,7 @@ { "name": "getStakedPoolsForAccount", "desc": "Retrieves the staked pools for an account.", + "readonly": true, "args": [ { "name": "staker", @@ -419,6 +430,7 @@ { "name": "getTokenPayoutRatio", "desc": "Retrieves the token payout ratio for a given validator - returning the pool ratios of whole so that token\npayouts across pools can be based on a stable snaphost of stake.", + "readonly": true, "args": [ { "name": "validatorId", @@ -432,6 +444,7 @@ }, { "name": "getNodePoolAssignments", + "readonly": true, "args": [ { "name": "validatorId", @@ -444,6 +457,7 @@ }, { "name": "getNFDRegistryID", + "readonly": true, "args": [], "returns": { "type": "uint64" @@ -865,6 +879,7 @@ { "name": "findPoolForStaker", "desc": "Finds the pool for a staker based on the provided validator id, staker address, and amount to stake.\nFirst checks the stakers 'already staked list' for the validator preferring those (adding if possible) then adds\nto new pool if necessary.", + "readonly": true, "args": [ { "name": "validatorId", diff --git a/contracts/contracts/artifacts/ValidatorRegistry.arc4.json b/contracts/contracts/artifacts/ValidatorRegistry.arc4.json index f6f9246a..c10ecd8e 100644 --- a/contracts/contracts/artifacts/ValidatorRegistry.arc4.json +++ b/contracts/contracts/artifacts/ValidatorRegistry.arc4.json @@ -71,6 +71,7 @@ { "name": "getNumValidators", "desc": "Returns the current number of validators", + "readonly": true, "args": [], "returns": { "type": "uint64" @@ -78,6 +79,7 @@ }, { "name": "getValidatorConfig", + "readonly": true, "args": [ { "name": "validatorId", @@ -90,6 +92,7 @@ }, { "name": "getValidatorState", + "readonly": true, "args": [ { "name": "validatorId", @@ -102,6 +105,7 @@ }, { "name": "getValidatorOwnerAndManager", + "readonly": true, "args": [ { "name": "validatorId", @@ -115,6 +119,7 @@ { "name": "getPools", "desc": "Return list of all pools for this validator.", + "readonly": true, "args": [ { "name": "validatorId", @@ -128,6 +133,8 @@ }, { "name": "getPoolAppId", + "desc": "getPoolAppId is useful for callers to determine app to call for removing stake if they don't have staking or\nwant to get staker list for an account. The staking pool also uses it to get the app id of staking pool 1\n(which contains reward tokens if being used) so that the amount available can be determined.", + "readonly": true, "args": [ { "name": "validatorId", @@ -144,6 +151,7 @@ }, { "name": "getPoolInfo", + "readonly": true, "args": [ { "name": "poolKey", @@ -157,6 +165,7 @@ { "name": "getCurMaxStakePerPool", "desc": "Calculate the maximum stake per pool for a given validator.\nNormally this would be maxAlgoPerPool, but it should also never go above MaxAllowedStake / numPools so\nas pools are added the max allowed per pool can reduce.", + "readonly": true, "args": [ { "name": "validatorId", @@ -171,6 +180,7 @@ { "name": "doesStakerNeedToPayMBR", "desc": "Helper callers can call w/ simulate to determine if 'AddStaker' MBR should be included w/ staking amount", + "readonly": true, "args": [ { "name": "staker", @@ -184,6 +194,7 @@ { "name": "getStakedPoolsForAccount", "desc": "Retrieves the staked pools for an account.", + "readonly": true, "args": [ { "name": "staker", @@ -198,6 +209,7 @@ { "name": "getTokenPayoutRatio", "desc": "Retrieves the token payout ratio for a given validator - returning the pool ratios of whole so that token\npayouts across pools can be based on a stable snaphost of stake.", + "readonly": true, "args": [ { "name": "validatorId", @@ -211,6 +223,7 @@ }, { "name": "getNodePoolAssignments", + "readonly": true, "args": [ { "name": "validatorId", @@ -223,6 +236,7 @@ }, { "name": "getNFDRegistryID", + "readonly": true, "args": [], "returns": { "type": "uint64" @@ -644,6 +658,7 @@ { "name": "findPoolForStaker", "desc": "Finds the pool for a staker based on the provided validator id, staker address, and amount to stake.\nFirst checks the stakers 'already staked list' for the validator preferring those (adding if possible) then adds\nto new pool if necessary.", + "readonly": true, "args": [ { "name": "validatorId", diff --git a/contracts/contracts/artifacts/ValidatorRegistry.arc56_draft.json b/contracts/contracts/artifacts/ValidatorRegistry.arc56_draft.json index b560122c..8c0a60ce 100644 --- a/contracts/contracts/artifacts/ValidatorRegistry.arc56_draft.json +++ b/contracts/contracts/artifacts/ValidatorRegistry.arc56_draft.json @@ -115,6 +115,7 @@ { "name": "getNumValidators", "desc": "Returns the current number of validators", + "readonly": true, "args": [], "returns": { "type": "uint64" @@ -128,6 +129,7 @@ }, { "name": "getValidatorConfig", + "readonly": true, "args": [ { "name": "validatorId", @@ -147,6 +149,7 @@ }, { "name": "getValidatorState", + "readonly": true, "args": [ { "name": "validatorId", @@ -166,6 +169,7 @@ }, { "name": "getValidatorOwnerAndManager", + "readonly": true, "args": [ { "name": "validatorId", @@ -185,6 +189,7 @@ { "name": "getPools", "desc": "Return list of all pools for this validator.", + "readonly": true, "args": [ { "name": "validatorId", @@ -204,6 +209,8 @@ }, { "name": "getPoolAppId", + "desc": "getPoolAppId is useful for callers to determine app to call for removing stake if they don't have staking or\nwant to get staker list for an account. The staking pool also uses it to get the app id of staking pool 1\n(which contains reward tokens if being used) so that the amount available can be determined.", + "readonly": true, "args": [ { "name": "validatorId", @@ -226,6 +233,7 @@ }, { "name": "getPoolInfo", + "readonly": true, "args": [ { "name": "poolKey", @@ -247,6 +255,7 @@ { "name": "getCurMaxStakePerPool", "desc": "Calculate the maximum stake per pool for a given validator.\nNormally this would be maxAlgoPerPool, but it should also never go above MaxAllowedStake / numPools so\nas pools are added the max allowed per pool can reduce.", + "readonly": true, "args": [ { "name": "validatorId", @@ -267,6 +276,7 @@ { "name": "doesStakerNeedToPayMBR", "desc": "Helper callers can call w/ simulate to determine if 'AddStaker' MBR should be included w/ staking amount", + "readonly": true, "args": [ { "name": "staker", @@ -286,6 +296,7 @@ { "name": "getStakedPoolsForAccount", "desc": "Retrieves the staked pools for an account.", + "readonly": true, "args": [ { "name": "staker", @@ -306,6 +317,7 @@ { "name": "getTokenPayoutRatio", "desc": "Retrieves the token payout ratio for a given validator - returning the pool ratios of whole so that token\npayouts across pools can be based on a stable snaphost of stake.", + "readonly": true, "args": [ { "name": "validatorId", @@ -326,6 +338,7 @@ }, { "name": "getNodePoolAssignments", + "readonly": true, "args": [ { "name": "validatorId", @@ -345,6 +358,7 @@ }, { "name": "getNFDRegistryID", + "readonly": true, "args": [], "returns": { "type": "uint64" @@ -844,6 +858,7 @@ { "name": "findPoolForStaker", "desc": "Finds the pool for a staker based on the provided validator id, staker address, and amount to stake.\nFirst checks the stakers 'already staked list' for the validator preferring those (adding if possible) then adds\nto new pool if necessary.", + "readonly": true, "args": [ { "name": "validatorId", @@ -2742,14 +2757,14 @@ }, { "teal": 289, - "source": 166, + "source": 165, "pc": [ 478 ] }, { "teal": 292, - "source": 166, + "source": 165, "pc": [ 479, 480, @@ -2758,42 +2773,42 @@ }, { "teal": 293, - "source": 166, + "source": 165, "pc": [ 482 ] }, { "teal": 294, - "source": 166, + "source": 165, "pc": [ 483 ] }, { "teal": 295, - "source": 166, + "source": 165, "pc": [ 484 ] }, { "teal": 296, - "source": 166, + "source": 165, "pc": [ 485 ] }, { "teal": 297, - "source": 166, + "source": 165, "pc": [ 486 ] }, { "teal": 303, - "source": 166, + "source": 165, "pc": [ 487, 488, @@ -2817,14 +2832,14 @@ }, { "teal": 309, - "source": 166, + "source": 165, "pc": [ 493 ] }, { "teal": 314, - "source": 171, + "source": 170, "pc": [ 494 ] @@ -2847,7 +2862,7 @@ }, { "teal": 321, - "source": 171, + "source": 170, "pc": [ 499, 500, @@ -2856,35 +2871,35 @@ }, { "teal": 322, - "source": 171, + "source": 170, "pc": [ 502 ] }, { "teal": 323, - "source": 171, + "source": 170, "pc": [ 503 ] }, { "teal": 324, - "source": 171, + "source": 170, "pc": [ 504 ] }, { "teal": 325, - "source": 171, + "source": 170, "pc": [ 505 ] }, { "teal": 329, - "source": 171, + "source": 170, "pc": [ 506, 507, @@ -2952,14 +2967,14 @@ }, { "teal": 341, - "source": 171, + "source": 170, "pc": [ 520 ] }, { "teal": 346, - "source": 176, + "source": 175, "pc": [ 521 ] @@ -2982,7 +2997,7 @@ }, { "teal": 353, - "source": 176, + "source": 175, "pc": [ 526, 527, @@ -2991,35 +3006,35 @@ }, { "teal": 354, - "source": 176, + "source": 175, "pc": [ 529 ] }, { "teal": 355, - "source": 176, + "source": 175, "pc": [ 530 ] }, { "teal": 356, - "source": 176, + "source": 175, "pc": [ 531 ] }, { "teal": 357, - "source": 176, + "source": 175, "pc": [ 532 ] }, { "teal": 361, - "source": 176, + "source": 175, "pc": [ 533, 534, @@ -3088,14 +3103,14 @@ }, { "teal": 373, - "source": 176, + "source": 175, "pc": [ 548 ] }, { "teal": 378, - "source": 181, + "source": 180, "pc": [ 549 ] @@ -3118,7 +3133,7 @@ }, { "teal": 385, - "source": 181, + "source": 180, "pc": [ 554, 555, @@ -3127,35 +3142,35 @@ }, { "teal": 386, - "source": 181, + "source": 180, "pc": [ 557 ] }, { "teal": 387, - "source": 181, + "source": 180, "pc": [ 558 ] }, { "teal": 388, - "source": 181, + "source": 180, "pc": [ 559 ] }, { "teal": 389, - "source": 181, + "source": 180, "pc": [ 560 ] }, { "teal": 393, - "source": 181, + "source": 180, "pc": [ 561, 562, @@ -3290,14 +3305,14 @@ }, { "teal": 417, - "source": 181, + "source": 180, "pc": [ 588 ] }, { "teal": 422, - "source": 195, + "source": 194, "pc": [ 589 ] @@ -3320,7 +3335,7 @@ }, { "teal": 429, - "source": 195, + "source": 194, "pc": [ 594, 595, @@ -3329,21 +3344,21 @@ }, { "teal": 430, - "source": 195, + "source": 194, "pc": [ 597 ] }, { "teal": 431, - "source": 195, + "source": 194, "pc": [ 598 ] }, { "teal": 432, - "source": 195, + "source": 194, "pc": [ 599, 600 @@ -3351,21 +3366,21 @@ }, { "teal": 433, - "source": 195, + "source": 194, "pc": [ 601 ] }, { "teal": 434, - "source": 195, + "source": 194, "pc": [ 602 ] }, { "teal": 435, - "source": 195, + "source": 194, "pc": [ 603, 604, @@ -3374,49 +3389,49 @@ }, { "teal": 436, - "source": 195, + "source": 194, "pc": [ 606 ] }, { "teal": 437, - "source": 195, + "source": 194, "pc": [ 607 ] }, { "teal": 438, - "source": 195, + "source": 194, "pc": [ 608 ] }, { "teal": 439, - "source": 195, + "source": 194, "pc": [ 609 ] }, { "teal": 440, - "source": 195, + "source": 194, "pc": [ 610 ] }, { "teal": 441, - "source": 195, + "source": 194, "pc": [ 611 ] }, { "teal": 450, - "source": 195, + "source": 194, "pc": [ 612, 613, @@ -3425,14 +3440,14 @@ }, { "teal": 453, - "source": 195, + "source": 194, "pc": [ 615 ] }, { "teal": 454, - "source": 195, + "source": 194, "pc": [ 616, 617 @@ -3783,7 +3798,7 @@ }, { "teal": 533, - "source": 195, + "source": 194, "pc": [ 691, 692 @@ -3791,7 +3806,7 @@ }, { "teal": 536, - "source": 195, + "source": 194, "pc": [ 693, 694 @@ -3799,21 +3814,21 @@ }, { "teal": 537, - "source": 195, + "source": 194, "pc": [ 695 ] }, { "teal": 542, - "source": 212, + "source": 213, "pc": [ 696 ] }, { "teal": 545, - "source": 212, + "source": 214, "pc": [ 697, 698, @@ -3822,14 +3837,14 @@ }, { "teal": 546, - "source": 212, + "source": 214, "pc": [ 700 ] }, { "teal": 549, - "source": 212, + "source": 214, "pc": [ 701, 702, @@ -3838,14 +3853,14 @@ }, { "teal": 550, - "source": 212, + "source": 214, "pc": [ 704 ] }, { "teal": 553, - "source": 212, + "source": 213, "pc": [ 705, 706, @@ -3854,42 +3869,42 @@ }, { "teal": 554, - "source": 212, + "source": 213, "pc": [ 708 ] }, { "teal": 555, - "source": 212, + "source": 213, "pc": [ 709 ] }, { "teal": 556, - "source": 212, + "source": 213, "pc": [ 710 ] }, { "teal": 557, - "source": 212, + "source": 213, "pc": [ 711 ] }, { "teal": 558, - "source": 212, + "source": 213, "pc": [ 712 ] }, { - "teal": 562, - "source": 212, + "teal": 566, + "source": 213, "pc": [ 713, 714, @@ -3897,37 +3912,37 @@ ] }, { - "teal": 569, - "source": 214, + "teal": 573, + "source": 216, "pc": [ 716, 717 ] }, { - "teal": 570, - "source": 214, + "teal": 574, + "source": 216, "pc": [ 718 ] }, { - "teal": 571, - "source": 214, + "teal": 575, + "source": 216, "pc": [ 719 ] }, { - "teal": 572, - "source": 214, + "teal": 576, + "source": 216, "pc": [ 720 ] }, { - "teal": 573, - "source": 214, + "teal": 577, + "source": 216, "pc": [ 721, 722, @@ -3935,183 +3950,183 @@ ] }, { - "teal": 574, - "source": 214, + "teal": 578, + "source": 216, "pc": [ 724, 725 ] }, { - "teal": 575, - "source": 214, + "teal": 579, + "source": 216, "pc": [ 726 ] }, { - "teal": 576, - "source": 214, + "teal": 580, + "source": 216, "pc": [ 727 ] }, { - "teal": 577, - "source": 214, + "teal": 581, + "source": 216, "pc": [ 728 ] }, { - "teal": 581, - "source": 213, + "teal": 585, + "source": 215, "errorMessage": "pool id must be between 1 and number of pools for this validator", "pc": [ 729 ] }, { - "teal": 585, - "source": 217, + "teal": 589, + "source": 219, "pc": [ 730, 731 ] }, { - "teal": 586, - "source": 217, + "teal": 590, + "source": 219, "pc": [ 732, 733 ] }, { - "teal": 587, - "source": 217, + "teal": 591, + "source": 219, "pc": [ 734 ] }, { - "teal": 588, - "source": 217, + "teal": 592, + "source": 219, "pc": [ 735 ] }, { - "teal": 589, - "source": 217, + "teal": 593, + "source": 219, "pc": [ 736, 737 ] }, { - "teal": 590, - "source": 217, + "teal": 594, + "source": 219, "pc": [ 738 ] }, { - "teal": 591, - "source": 217, + "teal": 595, + "source": 219, "pc": [ 739 ] }, { - "teal": 592, - "source": 217, + "teal": 596, + "source": 219, "pc": [ 740 ] }, { - "teal": 593, - "source": 217, + "teal": 597, + "source": 219, "pc": [ 741 ] }, { - "teal": 594, - "source": 217, + "teal": 598, + "source": 219, "pc": [ 742 ] }, { - "teal": 595, - "source": 217, + "teal": 599, + "source": 219, "pc": [ 743 ] }, { - "teal": 596, - "source": 217, + "teal": 600, + "source": 219, "pc": [ 744, 745 ] }, { - "teal": 597, - "source": 217, + "teal": 601, + "source": 219, "pc": [ 746 ] }, { - "teal": 598, - "source": 217, + "teal": 602, + "source": 219, "pc": [ 747 ] }, { - "teal": 599, - "source": 217, + "teal": 603, + "source": 219, "pc": [ 748, 749 ] }, { - "teal": 600, - "source": 217, + "teal": 604, + "source": 219, "pc": [ 750 ] }, { - "teal": 601, - "source": 217, + "teal": 605, + "source": 219, "pc": [ 751 ] }, { - "teal": 602, - "source": 212, + "teal": 606, + "source": 213, "pc": [ 752 ] }, { - "teal": 607, - "source": 221, + "teal": 611, + "source": 222, "pc": [ 753 ] }, { - "teal": 610, - "source": 221, + "teal": 614, + "source": 223, "pc": [ 754, 755, @@ -4119,44 +4134,44 @@ ] }, { - "teal": 611, - "source": 221, + "teal": 615, + "source": 223, "pc": [ 757 ] }, { - "teal": 612, - "source": 221, + "teal": 616, + "source": 223, "pc": [ 758 ] }, { - "teal": 613, - "source": 221, + "teal": 617, + "source": 223, "pc": [ 759 ] }, { - "teal": 614, - "source": 221, + "teal": 618, + "source": 223, "pc": [ 760 ] }, { - "teal": 617, - "source": 221, + "teal": 621, + "source": 223, "errorMessage": "argument 0 (poolKey) for getPoolInfo must be a (uint64,uint64,uint64)", "pc": [ 761 ] }, { - "teal": 620, - "source": 221, + "teal": 624, + "source": 222, "pc": [ 762, 763, @@ -4164,36 +4179,36 @@ ] }, { - "teal": 621, - "source": 221, + "teal": 625, + "source": 222, "pc": [ 765 ] }, { - "teal": 622, - "source": 221, + "teal": 626, + "source": 222, "pc": [ 766 ] }, { - "teal": 623, - "source": 221, + "teal": 627, + "source": 222, "pc": [ 767 ] }, { - "teal": 624, - "source": 221, + "teal": 628, + "source": 222, "pc": [ 768 ] }, { - "teal": 628, - "source": 221, + "teal": 632, + "source": 222, "pc": [ 769, 770, @@ -4201,24 +4216,24 @@ ] }, { - "teal": 632, - "source": 222, + "teal": 636, + "source": 224, "pc": [ 772, 773 ] }, { - "teal": 633, - "source": 222, + "teal": 637, + "source": 224, "pc": [ 774, 775 ] }, { - "teal": 634, - "source": 222, + "teal": 638, + "source": 224, "pc": [ 776, 777, @@ -4226,74 +4241,74 @@ ] }, { - "teal": 635, - "source": 222, + "teal": 639, + "source": 224, "pc": [ 779 ] }, { - "teal": 636, - "source": 222, + "teal": 640, + "source": 224, "pc": [ 780 ] }, { - "teal": 637, - "source": 222, + "teal": 641, + "source": 224, "pc": [ 781 ] }, { - "teal": 638, - "source": 222, + "teal": 642, + "source": 224, "pc": [ 782, 783 ] }, { - "teal": 639, - "source": 222, + "teal": 643, + "source": 224, "pc": [ 784 ] }, { - "teal": 640, - "source": 222, + "teal": 644, + "source": 224, "pc": [ 785 ] }, { - "teal": 641, - "source": 222, + "teal": 645, + "source": 224, "pc": [ 786, 787 ] }, { - "teal": 642, - "source": 222, + "teal": 646, + "source": 224, "pc": [ 788 ] }, { - "teal": 643, - "source": 222, + "teal": 647, + "source": 224, "pc": [ 789, 790 ] }, { - "teal": 644, - "source": 222, + "teal": 648, + "source": 224, "pc": [ 791, 792, @@ -4301,58 +4316,58 @@ ] }, { - "teal": 645, - "source": 222, + "teal": 649, + "source": 224, "pc": [ 794 ] }, { - "teal": 646, - "source": 222, + "teal": 650, + "source": 224, "pc": [ 795 ] }, { - "teal": 647, - "source": 222, + "teal": 651, + "source": 224, "pc": [ 796 ] }, { - "teal": 648, - "source": 222, + "teal": 652, + "source": 224, "pc": [ 797, 798 ] }, { - "teal": 649, - "source": 222, + "teal": 653, + "source": 224, "pc": [ 799 ] }, { - "teal": 650, - "source": 221, + "teal": 654, + "source": 222, "pc": [ 800 ] }, { - "teal": 655, - "source": 232, + "teal": 659, + "source": 234, "pc": [ 801 ] }, { - "teal": 658, - "source": 232, + "teal": 662, + "source": 235, "pc": [ 802, 803, @@ -4360,15 +4375,15 @@ ] }, { - "teal": 659, - "source": 232, + "teal": 663, + "source": 235, "pc": [ 805 ] }, { - "teal": 662, - "source": 232, + "teal": 666, + "source": 234, "pc": [ 806, 807, @@ -4376,43 +4391,43 @@ ] }, { - "teal": 663, - "source": 232, + "teal": 667, + "source": 234, "pc": [ 809 ] }, { - "teal": 664, - "source": 232, + "teal": 668, + "source": 234, "pc": [ 810 ] }, { - "teal": 665, - "source": 232, + "teal": 669, + "source": 234, "pc": [ 811 ] }, { - "teal": 666, - "source": 232, + "teal": 670, + "source": 234, "pc": [ 812 ] }, { - "teal": 667, - "source": 232, + "teal": 671, + "source": 234, "pc": [ 813 ] }, { - "teal": 677, - "source": 232, + "teal": 681, + "source": 234, "pc": [ 814, 815, @@ -4420,98 +4435,98 @@ ] }, { - "teal": 680, - "source": 232, + "teal": 684, + "source": 234, "pc": [ 817 ] }, { - "teal": 681, - "source": 232, + "teal": 685, + "source": 234, "pc": [ 818, 819 ] }, { - "teal": 685, - "source": 233, + "teal": 689, + "source": 236, "pc": [ 820, 821 ] }, { - "teal": 686, - "source": 233, + "teal": 690, + "source": 236, "pc": [ 822, 823 ] }, { - "teal": 687, - "source": 233, + "teal": 691, + "source": 236, "pc": [ 824 ] }, { - "teal": 688, - "source": 233, + "teal": 692, + "source": 236, "pc": [ 825, 826 ] }, { - "teal": 689, - "source": 233, + "teal": 693, + "source": 236, "pc": [ 827 ] }, { - "teal": 690, - "source": 233, + "teal": 694, + "source": 236, "pc": [ 828 ] }, { - "teal": 691, - "source": 233, + "teal": 695, + "source": 236, "pc": [ 829, 830 ] }, { - "teal": 692, - "source": 233, + "teal": 696, + "source": 236, "pc": [ 831 ] }, { - "teal": 693, - "source": 233, + "teal": 697, + "source": 236, "pc": [ 832 ] }, { - "teal": 694, - "source": 233, + "teal": 698, + "source": 236, "pc": [ 833, 834 ] }, { - "teal": 698, - "source": 234, + "teal": 702, + "source": 237, "pc": [ 835, 836, @@ -4519,31 +4534,31 @@ ] }, { - "teal": 699, - "source": 234, + "teal": 703, + "source": 237, "pc": [ 838, 839 ] }, { - "teal": 700, - "source": 234, + "teal": 704, + "source": 237, "pc": [ 840 ] }, { - "teal": 701, - "source": 234, + "teal": 705, + "source": 237, "pc": [ 841, 842 ] }, { - "teal": 705, - "source": 235, + "teal": 709, + "source": 238, "pc": [ 843, 844, @@ -4551,96 +4566,96 @@ ] }, { - "teal": 706, - "source": 235, + "teal": 710, + "source": 238, "pc": [ 846 ] }, { - "teal": 707, - "source": 235, + "teal": 711, + "source": 238, "pc": [ 847 ] }, { - "teal": 708, - "source": 235, + "teal": 712, + "source": 238, "pc": [ 848, 849 ] }, { - "teal": 709, - "source": 235, + "teal": 713, + "source": 238, "pc": [ 850 ] }, { - "teal": 710, - "source": 235, + "teal": 714, + "source": 238, "pc": [ 851 ] }, { - "teal": 711, - "source": 235, + "teal": 715, + "source": 238, "pc": [ 852, 853 ] }, { - "teal": 712, - "source": 235, + "teal": 716, + "source": 238, "pc": [ 854 ] }, { - "teal": 713, - "source": 235, + "teal": 717, + "source": 238, "pc": [ 855 ] }, { - "teal": 714, - "source": 235, + "teal": 718, + "source": 238, "pc": [ 856, 857 ] }, { - "teal": 719, - "source": 236, + "teal": 723, + "source": 239, "pc": [ 858, 859 ] }, { - "teal": 720, - "source": 236, + "teal": 724, + "source": 239, "pc": [ 860 ] }, { - "teal": 721, - "source": 236, + "teal": 725, + "source": 239, "pc": [ 861 ] }, { - "teal": 722, - "source": 236, + "teal": 726, + "source": 239, "pc": [ 862, 863, @@ -4648,8 +4663,8 @@ ] }, { - "teal": 727, - "source": 237, + "teal": 731, + "source": 240, "pc": [ 865, 866, @@ -4657,39 +4672,39 @@ ] }, { - "teal": 728, - "source": 237, + "teal": 732, + "source": 240, "pc": [ 868, 869 ] }, { - "teal": 734, - "source": 239, + "teal": 738, + "source": 242, "pc": [ 870, 871 ] }, { - "teal": 735, - "source": 239, + "teal": 739, + "source": 242, "pc": [ 872, 873 ] }, { - "teal": 736, - "source": 239, + "teal": 740, + "source": 242, "pc": [ 874 ] }, { - "teal": 737, - "source": 239, + "teal": 741, + "source": 242, "pc": [ 875, 876, @@ -4697,62 +4712,62 @@ ] }, { - "teal": 742, - "source": 240, + "teal": 746, + "source": 243, "pc": [ 878, 879 ] }, { - "teal": 743, - "source": 240, + "teal": 747, + "source": 243, "pc": [ 880, 881 ] }, { - "teal": 748, - "source": 242, + "teal": 752, + "source": 245, "pc": [ 882, 883 ] }, { - "teal": 751, - "source": 232, + "teal": 755, + "source": 234, "pc": [ 884, 885 ] }, { - "teal": 754, - "source": 232, + "teal": 758, + "source": 234, "pc": [ 886, 887 ] }, { - "teal": 755, - "source": 232, + "teal": 759, + "source": 234, "pc": [ 888 ] }, { - "teal": 760, - "source": 250, + "teal": 764, + "source": 252, "pc": [ 889 ] }, { - "teal": 763, - "source": 250, + "teal": 767, + "source": 253, "pc": [ 890, 891, @@ -4760,45 +4775,45 @@ ] }, { - "teal": 764, - "source": 250, + "teal": 768, + "source": 253, "pc": [ 893 ] }, { - "teal": 765, - "source": 250, + "teal": 769, + "source": 253, "pc": [ 894 ] }, { - "teal": 766, - "source": 250, + "teal": 770, + "source": 253, "pc": [ 895, 896 ] }, { - "teal": 767, - "source": 250, + "teal": 771, + "source": 253, "pc": [ 897 ] }, { - "teal": 770, - "source": 250, + "teal": 774, + "source": 253, "errorMessage": "argument 0 (staker) for doesStakerNeedToPayMBR must be a address", "pc": [ 898 ] }, { - "teal": 773, - "source": 250, + "teal": 777, + "source": 252, "pc": [ 899, 900, @@ -4806,66 +4821,66 @@ ] }, { - "teal": 774, - "source": 250, + "teal": 778, + "source": 252, "pc": [ 902, 903 ] }, { - "teal": 775, - "source": 250, + "teal": 779, + "source": 252, "pc": [ 904 ] }, { - "teal": 776, - "source": 250, + "teal": 780, + "source": 252, "pc": [ 905, 906 ] }, { - "teal": 777, - "source": 250, + "teal": 781, + "source": 252, "pc": [ 907 ] }, { - "teal": 778, - "source": 250, + "teal": 782, + "source": 252, "pc": [ 908 ] }, { - "teal": 779, - "source": 250, + "teal": 783, + "source": 252, "pc": [ 909 ] }, { - "teal": 780, - "source": 250, + "teal": 784, + "source": 252, "pc": [ 910 ] }, { - "teal": 781, - "source": 250, + "teal": 785, + "source": 252, "pc": [ 911 ] }, { - "teal": 788, - "source": 250, + "teal": 792, + "source": 252, "pc": [ 912, 913, @@ -4873,72 +4888,72 @@ ] }, { - "teal": 792, - "source": 251, + "teal": 796, + "source": 254, "pc": [ 915 ] }, { - "teal": 793, - "source": 251, + "teal": 797, + "source": 254, "pc": [ 916, 917 ] }, { - "teal": 794, - "source": 251, + "teal": 798, + "source": 254, "pc": [ 918 ] }, { - "teal": 795, - "source": 251, + "teal": 799, + "source": 254, "pc": [ 919 ] }, { - "teal": 796, - "source": 251, + "teal": 800, + "source": 254, "pc": [ 920 ] }, { - "teal": 797, - "source": 251, + "teal": 801, + "source": 254, "pc": [ 921 ] }, { - "teal": 798, - "source": 251, + "teal": 802, + "source": 254, "pc": [ 922 ] }, { - "teal": 799, - "source": 250, + "teal": 803, + "source": 252, "pc": [ 923 ] }, { - "teal": 804, - "source": 260, + "teal": 808, + "source": 263, "pc": [ 924 ] }, { - "teal": 807, - "source": 260, + "teal": 811, + "source": 264, "pc": [ 925, 926, @@ -4946,45 +4961,45 @@ ] }, { - "teal": 808, - "source": 260, + "teal": 812, + "source": 264, "pc": [ 928 ] }, { - "teal": 809, - "source": 260, + "teal": 813, + "source": 264, "pc": [ 929 ] }, { - "teal": 810, - "source": 260, + "teal": 814, + "source": 264, "pc": [ 930, 931 ] }, { - "teal": 811, - "source": 260, + "teal": 815, + "source": 264, "pc": [ 932 ] }, { - "teal": 814, - "source": 260, + "teal": 818, + "source": 264, "errorMessage": "argument 0 (staker) for getStakedPoolsForAccount must be a address", "pc": [ 933 ] }, { - "teal": 817, - "source": 260, + "teal": 821, + "source": 263, "pc": [ 934, 935, @@ -4992,43 +5007,43 @@ ] }, { - "teal": 818, - "source": 260, + "teal": 822, + "source": 263, "pc": [ 937 ] }, { - "teal": 819, - "source": 260, + "teal": 823, + "source": 263, "pc": [ 938 ] }, { - "teal": 820, - "source": 260, + "teal": 824, + "source": 263, "pc": [ 939 ] }, { - "teal": 821, - "source": 260, + "teal": 825, + "source": 263, "pc": [ 940 ] }, { - "teal": 822, - "source": 260, + "teal": 826, + "source": 263, "pc": [ 941 ] }, { - "teal": 823, - "source": 260, + "teal": 827, + "source": 263, "pc": [ 942, 943, @@ -5036,50 +5051,50 @@ ] }, { - "teal": 824, - "source": 260, + "teal": 828, + "source": 263, "pc": [ 945 ] }, { - "teal": 825, - "source": 260, + "teal": 829, + "source": 263, "pc": [ 946 ] }, { - "teal": 826, - "source": 260, + "teal": 830, + "source": 263, "pc": [ 947 ] }, { - "teal": 827, - "source": 260, + "teal": 831, + "source": 263, "pc": [ 948 ] }, { - "teal": 828, - "source": 260, + "teal": 832, + "source": 263, "pc": [ 949 ] }, { - "teal": 829, - "source": 260, + "teal": 833, + "source": 263, "pc": [ 950 ] }, { - "teal": 838, - "source": 260, + "teal": 842, + "source": 263, "pc": [ 951, 952, @@ -5087,73 +5102,73 @@ ] }, { - "teal": 841, - "source": 260, + "teal": 845, + "source": 263, "pc": [ 954 ] }, { - "teal": 842, - "source": 260, + "teal": 846, + "source": 263, "pc": [ 955, 956 ] }, { - "teal": 847, - "source": 261, + "teal": 851, + "source": 265, "pc": [ 957 ] }, { - "teal": 848, - "source": 261, + "teal": 852, + "source": 265, "pc": [ 958, 959 ] }, { - "teal": 849, - "source": 261, + "teal": 853, + "source": 265, "pc": [ 960 ] }, { - "teal": 850, - "source": 261, + "teal": 854, + "source": 265, "pc": [ 961 ] }, { - "teal": 851, - "source": 261, + "teal": 855, + "source": 265, "pc": [ 962 ] }, { - "teal": 852, - "source": 261, + "teal": 856, + "source": 265, "pc": [ 963 ] }, { - "teal": 853, - "source": 261, + "teal": 857, + "source": 265, "pc": [ 964 ] }, { - "teal": 854, - "source": 261, + "teal": 858, + "source": 265, "pc": [ 965, 966, @@ -5161,15 +5176,15 @@ ] }, { - "teal": 859, - "source": 262, + "teal": 863, + "source": 266, "pc": [ 968 ] }, { - "teal": 860, - "source": 262, + "teal": 864, + "source": 266, "pc": [ 969, 970, @@ -5177,106 +5192,106 @@ ] }, { - "teal": 865, - "source": 264, + "teal": 869, + "source": 268, "pc": [ 972 ] }, { - "teal": 866, - "source": 264, + "teal": 870, + "source": 268, "pc": [ 973, 974 ] }, { - "teal": 870, - "source": 265, + "teal": 874, + "source": 269, "pc": [ 975 ] }, { - "teal": 871, - "source": 265, + "teal": 875, + "source": 269, "pc": [ 976, 977 ] }, { - "teal": 872, - "source": 265, + "teal": 876, + "source": 269, "pc": [ 978 ] }, { - "teal": 873, - "source": 265, + "teal": 877, + "source": 269, "pc": [ 979 ] }, { - "teal": 876, - "source": 265, + "teal": 880, + "source": 269, "errorMessage": "box value does not exist: this.stakerPoolSet(staker).value", "pc": [ 980 ] }, { - "teal": 877, - "source": 265, + "teal": 881, + "source": 269, "pc": [ 981, 982 ] }, { - "teal": 881, - "source": 266, + "teal": 885, + "source": 270, "pc": [ 983 ] }, { - "teal": 882, - "source": 266, + "teal": 886, + "source": 270, "pc": [ 984, 985 ] }, { - "teal": 887, - "source": 266, + "teal": 891, + "source": 270, "pc": [ 986, 987 ] }, { - "teal": 888, - "source": 266, + "teal": 892, + "source": 270, "pc": [ 988, 989 ] }, { - "teal": 889, - "source": 266, + "teal": 893, + "source": 270, "pc": [ 990 ] }, { - "teal": 890, - "source": 266, + "teal": 894, + "source": 270, "pc": [ 991, 992, @@ -5284,87 +5299,87 @@ ] }, { - "teal": 895, - "source": 267, + "teal": 899, + "source": 271, "pc": [ 994, 995 ] }, { - "teal": 896, - "source": 267, + "teal": 900, + "source": 271, "pc": [ 996, 997 ] }, { - "teal": 897, - "source": 267, + "teal": 901, + "source": 271, "pc": [ 998 ] }, { - "teal": 898, - "source": 267, + "teal": 902, + "source": 271, "pc": [ 999 ] }, { - "teal": 899, - "source": 267, + "teal": 903, + "source": 271, "pc": [ 1000 ] }, { - "teal": 900, - "source": 267, + "teal": 904, + "source": 271, "pc": [ 1001 ] }, { - "teal": 901, - "source": 267, + "teal": 905, + "source": 271, "pc": [ 1002 ] }, { - "teal": 902, - "source": 267, + "teal": 906, + "source": 271, "pc": [ 1003 ] }, { - "teal": 903, - "source": 267, + "teal": 907, + "source": 271, "pc": [ 1004 ] }, { - "teal": 904, - "source": 267, + "teal": 908, + "source": 271, "pc": [ 1005 ] }, { - "teal": 905, - "source": 267, + "teal": 909, + "source": 271, "pc": [ 1006 ] }, { - "teal": 906, - "source": 267, + "teal": 910, + "source": 271, "pc": [ 1007, 1008, @@ -5372,105 +5387,105 @@ ] }, { - "teal": 911, - "source": 268, + "teal": 915, + "source": 272, "pc": [ 1010, 1011 ] }, { - "teal": 912, - "source": 268, + "teal": 916, + "source": 272, "pc": [ 1012, 1013 ] }, { - "teal": 913, - "source": 268, + "teal": 917, + "source": 272, "pc": [ 1014, 1015 ] }, { - "teal": 914, - "source": 268, + "teal": 918, + "source": 272, "pc": [ 1016 ] }, { - "teal": 915, - "source": 268, + "teal": 919, + "source": 272, "pc": [ 1017 ] }, { - "teal": 916, - "source": 268, + "teal": 920, + "source": 272, "pc": [ 1018 ] }, { - "teal": 917, - "source": 268, + "teal": 921, + "source": 272, "pc": [ 1019 ] }, { - "teal": 918, - "source": 268, + "teal": 922, + "source": 272, "pc": [ 1020 ] }, { - "teal": 919, - "source": 268, + "teal": 923, + "source": 272, "pc": [ 1021, 1022 ] }, { - "teal": 926, - "source": 266, + "teal": 930, + "source": 270, "pc": [ 1023, 1024 ] }, { - "teal": 927, - "source": 266, + "teal": 931, + "source": 270, "pc": [ 1025 ] }, { - "teal": 928, - "source": 266, + "teal": 932, + "source": 270, "pc": [ 1026 ] }, { - "teal": 929, - "source": 266, + "teal": 933, + "source": 270, "pc": [ 1027, 1028 ] }, { - "teal": 930, - "source": 266, + "teal": 934, + "source": 270, "pc": [ 1029, 1030, @@ -5478,46 +5493,46 @@ ] }, { - "teal": 935, - "source": 271, + "teal": 939, + "source": 275, "pc": [ 1032, 1033 ] }, { - "teal": 939, - "source": 260, + "teal": 943, + "source": 263, "pc": [ 1034, 1035 ] }, { - "teal": 942, - "source": 260, + "teal": 946, + "source": 263, "pc": [ 1036, 1037 ] }, { - "teal": 943, - "source": 260, + "teal": 947, + "source": 263, "pc": [ 1038 ] }, { - "teal": 948, - "source": 282, + "teal": 952, + "source": 285, "pc": [ 1039 ] }, { - "teal": 951, - "source": 282, + "teal": 955, + "source": 286, "pc": [ 1040, 1041, @@ -5525,15 +5540,15 @@ ] }, { - "teal": 952, - "source": 282, + "teal": 956, + "source": 286, "pc": [ 1043 ] }, { - "teal": 955, - "source": 282, + "teal": 959, + "source": 285, "pc": [ 1044, 1045, @@ -5541,36 +5556,36 @@ ] }, { - "teal": 956, - "source": 282, + "teal": 960, + "source": 285, "pc": [ 1047 ] }, { - "teal": 957, - "source": 282, + "teal": 961, + "source": 285, "pc": [ 1048 ] }, { - "teal": 958, - "source": 282, + "teal": 962, + "source": 285, "pc": [ 1049 ] }, { - "teal": 959, - "source": 282, + "teal": 963, + "source": 285, "pc": [ 1050 ] }, { - "teal": 969, - "source": 282, + "teal": 973, + "source": 285, "pc": [ 1051, 1052, @@ -5578,82 +5593,82 @@ ] }, { - "teal": 973, - "source": 283, + "teal": 977, + "source": 287, "pc": [ 1054, 1055 ] }, { - "teal": 974, - "source": 283, + "teal": 978, + "source": 287, "pc": [ 1056, 1057 ] }, { - "teal": 975, - "source": 283, + "teal": 979, + "source": 287, "pc": [ 1058 ] }, { - "teal": 976, - "source": 283, + "teal": 980, + "source": 287, "pc": [ 1059, 1060 ] }, { - "teal": 977, - "source": 283, + "teal": 981, + "source": 287, "pc": [ 1061 ] }, { - "teal": 978, - "source": 283, + "teal": 982, + "source": 287, "pc": [ 1062 ] }, { - "teal": 979, - "source": 283, + "teal": 983, + "source": 287, "pc": [ 1063, 1064 ] }, { - "teal": 980, - "source": 283, + "teal": 984, + "source": 287, "pc": [ 1065 ] }, { - "teal": 981, - "source": 282, + "teal": 985, + "source": 285, "pc": [ 1066 ] }, { - "teal": 986, - "source": 287, + "teal": 990, + "source": 290, "pc": [ 1067 ] }, { - "teal": 989, - "source": 287, + "teal": 993, + "source": 291, "pc": [ 1068, 1069, @@ -5661,15 +5676,15 @@ ] }, { - "teal": 990, - "source": 287, + "teal": 994, + "source": 291, "pc": [ 1071 ] }, { - "teal": 993, - "source": 287, + "teal": 997, + "source": 290, "pc": [ 1072, 1073, @@ -5677,36 +5692,36 @@ ] }, { - "teal": 994, - "source": 287, + "teal": 998, + "source": 290, "pc": [ 1075 ] }, { - "teal": 995, - "source": 287, + "teal": 999, + "source": 290, "pc": [ 1076 ] }, { - "teal": 996, - "source": 287, + "teal": 1000, + "source": 290, "pc": [ 1077 ] }, { - "teal": 997, - "source": 287, + "teal": 1001, + "source": 290, "pc": [ 1078 ] }, { - "teal": 1001, - "source": 287, + "teal": 1005, + "source": 290, "pc": [ 1079, 1080, @@ -5714,140 +5729,140 @@ ] }, { - "teal": 1005, - "source": 288, + "teal": 1009, + "source": 292, "pc": [ 1082 ] }, { - "teal": 1006, - "source": 288, + "teal": 1010, + "source": 292, "pc": [ 1083, 1084 ] }, { - "teal": 1007, - "source": 288, + "teal": 1011, + "source": 292, "pc": [ 1085 ] }, { - "teal": 1008, - "source": 288, + "teal": 1012, + "source": 292, "pc": [ 1086 ] }, { - "teal": 1009, - "source": 288, + "teal": 1013, + "source": 292, "pc": [ 1087 ] }, { - "teal": 1010, - "source": 288, + "teal": 1014, + "source": 292, "pc": [ 1088 ] }, { - "teal": 1011, - "source": 288, + "teal": 1015, + "source": 292, "pc": [ 1089 ] }, { - "teal": 1014, - "source": 288, + "teal": 1018, + "source": 292, "errorMessage": "the specified validator id doesn't exist", "pc": [ 1090 ] }, { - "teal": 1018, - "source": 290, + "teal": 1022, + "source": 294, "pc": [ 1091, 1092 ] }, { - "teal": 1019, - "source": 290, + "teal": 1023, + "source": 294, "pc": [ 1093, 1094 ] }, { - "teal": 1020, - "source": 290, + "teal": 1024, + "source": 294, "pc": [ 1095 ] }, { - "teal": 1021, - "source": 290, + "teal": 1025, + "source": 294, "pc": [ 1096, 1097 ] }, { - "teal": 1022, - "source": 290, + "teal": 1026, + "source": 294, "pc": [ 1098 ] }, { - "teal": 1023, - "source": 290, + "teal": 1027, + "source": 294, "pc": [ 1099 ] }, { - "teal": 1024, - "source": 290, + "teal": 1028, + "source": 294, "pc": [ 1100, 1101 ] }, { - "teal": 1025, - "source": 290, + "teal": 1029, + "source": 294, "pc": [ 1102 ] }, { - "teal": 1026, - "source": 287, + "teal": 1030, + "source": 290, "pc": [ 1103 ] }, { - "teal": 1031, - "source": 293, + "teal": 1035, + "source": 297, "pc": [ 1104 ] }, { - "teal": 1034, - "source": 293, + "teal": 1038, + "source": 297, "pc": [ 1105, 1106, @@ -5855,43 +5870,43 @@ ] }, { - "teal": 1035, - "source": 293, + "teal": 1039, + "source": 297, "pc": [ 1108 ] }, { - "teal": 1036, - "source": 293, + "teal": 1040, + "source": 297, "pc": [ 1109 ] }, { - "teal": 1037, - "source": 293, + "teal": 1041, + "source": 297, "pc": [ 1110 ] }, { - "teal": 1038, - "source": 293, + "teal": 1042, + "source": 297, "pc": [ 1111 ] }, { - "teal": 1039, - "source": 293, + "teal": 1043, + "source": 297, "pc": [ 1112 ] }, { - "teal": 1043, - "source": 293, + "teal": 1047, + "source": 297, "pc": [ 1113, 1114, @@ -5899,30 +5914,30 @@ ] }, { - "teal": 1047, - "source": 294, + "teal": 1051, + "source": 299, "pc": [ 1116, 1117 ] }, { - "teal": 1048, - "source": 293, + "teal": 1052, + "source": 297, "pc": [ 1118 ] }, { - "teal": 1053, - "source": 305, + "teal": 1057, + "source": 310, "pc": [ 1119 ] }, { - "teal": 1056, - "source": 305, + "teal": 1060, + "source": 310, "pc": [ 1120, 1121, @@ -5930,45 +5945,45 @@ ] }, { - "teal": 1057, - "source": 305, + "teal": 1061, + "source": 310, "pc": [ 1123 ] }, { - "teal": 1058, - "source": 305, + "teal": 1062, + "source": 310, "pc": [ 1124 ] }, { - "teal": 1059, - "source": 305, + "teal": 1063, + "source": 310, "pc": [ 1125, 1126 ] }, { - "teal": 1060, - "source": 305, + "teal": 1064, + "source": 310, "pc": [ 1127 ] }, { - "teal": 1063, - "source": 305, + "teal": 1067, + "source": 310, "errorMessage": "argument 0 (config) for addValidator must be a (uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64)", "pc": [ 1128 ] }, { - "teal": 1066, - "source": 305, + "teal": 1070, + "source": 310, "pc": [ 1129, 1130, @@ -5976,8 +5991,8 @@ ] }, { - "teal": 1067, - "source": 305, + "teal": 1071, + "source": 310, "pc": [ 1132, 1133, @@ -5985,67 +6000,67 @@ ] }, { - "teal": 1070, - "source": 305, + "teal": 1074, + "source": 310, "pc": [ 1135, 1136 ] }, { - "teal": 1071, - "source": 305, + "teal": 1075, + "source": 310, "pc": [ 1137 ] }, { - "teal": 1072, - "source": 305, + "teal": 1076, + "source": 310, "pc": [ 1138 ] }, { - "teal": 1073, - "source": 305, + "teal": 1077, + "source": 310, "pc": [ 1139 ] }, { - "teal": 1074, - "source": 305, + "teal": 1078, + "source": 310, "pc": [ 1140, 1141 ] }, { - "teal": 1075, - "source": 305, + "teal": 1079, + "source": 310, "pc": [ 1142 ] }, { - "teal": 1076, - "source": 305, + "teal": 1080, + "source": 310, "pc": [ 1143 ] }, { - "teal": 1079, - "source": 305, + "teal": 1083, + "source": 310, "errorMessage": "argument 2 (mbrPayment) for addValidator must be a pay transaction", "pc": [ 1144 ] }, { - "teal": 1082, - "source": 305, + "teal": 1086, + "source": 310, "pc": [ 1145, 1146, @@ -6053,43 +6068,43 @@ ] }, { - "teal": 1083, - "source": 305, + "teal": 1087, + "source": 310, "pc": [ 1148 ] }, { - "teal": 1084, - "source": 305, + "teal": 1088, + "source": 310, "pc": [ 1149 ] }, { - "teal": 1085, - "source": 305, + "teal": 1089, + "source": 310, "pc": [ 1150 ] }, { - "teal": 1086, - "source": 305, + "teal": 1090, + "source": 310, "pc": [ 1151 ] }, { - "teal": 1087, - "source": 305, + "teal": 1091, + "source": 310, "pc": [ 1152 ] }, { - "teal": 1099, - "source": 305, + "teal": 1103, + "source": 310, "pc": [ 1153, 1154, @@ -6097,23 +6112,23 @@ ] }, { - "teal": 1102, - "source": 305, + "teal": 1106, + "source": 310, "pc": [ 1156 ] }, { - "teal": 1106, - "source": 306, + "teal": 1110, + "source": 311, "pc": [ 1157, 1158 ] }, { - "teal": 1107, - "source": 306, + "teal": 1111, + "source": 311, "pc": [ 1159, 1160, @@ -6121,63 +6136,63 @@ ] }, { - "teal": 1112, - "source": 308, + "teal": 1116, + "source": 313, "pc": [ 1162, 1163 ] }, { - "teal": 1113, - "source": 308, + "teal": 1117, + "source": 313, "pc": [ 1164, 1165 ] }, { - "teal": 1114, - "source": 308, + "teal": 1118, + "source": 313, "pc": [ 1166, 1167 ] }, { - "teal": 1115, - "source": 308, + "teal": 1119, + "source": 313, "pc": [ 1168 ] }, { - "teal": 1118, - "source": 308, + "teal": 1122, + "source": 313, "errorMessage": "transaction verification failed: {\"txn\":\"mbrPayment\",\"field\":\"receiver\",\"expected\":\"this.app.address\"}", "pc": [ 1169 ] }, { - "teal": 1121, - "source": 308, + "teal": 1125, + "source": 313, "pc": [ 1170, 1171 ] }, { - "teal": 1122, - "source": 308, + "teal": 1126, + "source": 313, "pc": [ 1172, 1173 ] }, { - "teal": 1123, - "source": 308, + "teal": 1127, + "source": 313, "pc": [ 1174, 1175, @@ -6185,8 +6200,8 @@ ] }, { - "teal": 1124, - "source": 308, + "teal": 1128, + "source": 313, "pc": [ 1177, 1178, @@ -6194,46 +6209,46 @@ ] }, { - "teal": 1125, - "source": 308, + "teal": 1129, + "source": 313, "pc": [ 1180 ] }, { - "teal": 1126, - "source": 308, + "teal": 1130, + "source": 313, "pc": [ 1181 ] }, { - "teal": 1129, - "source": 308, + "teal": 1133, + "source": 313, "errorMessage": "transaction verification failed: {\"txn\":\"mbrPayment\",\"field\":\"amount\",\"expected\":\"this.getMbrAmounts().addValidatorMbr\"}", "pc": [ 1182 ] }, { - "teal": 1133, - "source": 310, + "teal": 1137, + "source": 315, "pc": [ 1183, 1184 ] }, { - "teal": 1134, - "source": 310, + "teal": 1138, + "source": 315, "pc": [ 1185, 1186 ] }, { - "teal": 1135, - "source": 310, + "teal": 1139, + "source": 315, "pc": [ 1187, 1188, @@ -6243,112 +6258,112 @@ ] }, { - "teal": 1136, - "source": 310, + "teal": 1140, + "source": 315, "pc": [ 1192 ] }, { - "teal": 1139, - "source": 310, + "teal": 1143, + "source": 315, "errorMessage": "fee must be 10 ALGO or more to prevent spamming of validators", "pc": [ 1193 ] }, { - "teal": 1143, - "source": 313, + "teal": 1147, + "source": 318, "pc": [ 1194, 1195 ] }, { - "teal": 1144, - "source": 313, + "teal": 1148, + "source": 318, "pc": [ 1196 ] }, { - "teal": 1145, - "source": 313, + "teal": 1149, + "source": 318, "pc": [ 1197 ] }, { - "teal": 1146, - "source": 313, + "teal": 1150, + "source": 318, "pc": [ 1198 ] }, { - "teal": 1147, - "source": 313, + "teal": 1151, + "source": 318, "pc": [ 1199, 1200 ] }, { - "teal": 1151, - "source": 314, + "teal": 1155, + "source": 319, "pc": [ 1201, 1202 ] }, { - "teal": 1152, - "source": 314, + "teal": 1156, + "source": 319, "pc": [ 1203, 1204 ] }, { - "teal": 1153, - "source": 314, + "teal": 1157, + "source": 319, "pc": [ 1205 ] }, { - "teal": 1157, - "source": 316, + "teal": 1161, + "source": 321, "pc": [ 1206 ] }, { - "teal": 1158, - "source": 316, + "teal": 1162, + "source": 321, "pc": [ 1207, 1208 ] }, { - "teal": 1159, - "source": 316, + "teal": 1163, + "source": 321, "pc": [ 1209 ] }, { - "teal": 1160, - "source": 316, + "teal": 1164, + "source": 321, "pc": [ 1210 ] }, { - "teal": 1161, - "source": 316, + "teal": 1165, + "source": 321, "pc": [ 1211, 1212, @@ -6356,155 +6371,155 @@ ] }, { - "teal": 1162, - "source": 316, + "teal": 1166, + "source": 321, "pc": [ 1214 ] }, { - "teal": 1163, - "source": 316, + "teal": 1167, + "source": 321, "pc": [ 1215 ] }, { - "teal": 1167, - "source": 317, + "teal": 1171, + "source": 322, "pc": [ 1216 ] }, { - "teal": 1168, - "source": 317, + "teal": 1172, + "source": 322, "pc": [ 1217, 1218 ] }, { - "teal": 1169, - "source": 317, + "teal": 1173, + "source": 322, "pc": [ 1219 ] }, { - "teal": 1170, - "source": 317, + "teal": 1174, + "source": 322, "pc": [ 1220, 1221 ] }, { - "teal": 1171, - "source": 317, + "teal": 1175, + "source": 322, "pc": [ 1222 ] }, { - "teal": 1172, - "source": 317, + "teal": 1176, + "source": 322, "pc": [ 1223 ] }, { - "teal": 1173, - "source": 317, + "teal": 1177, + "source": 322, "pc": [ 1224, 1225 ] }, { - "teal": 1174, - "source": 317, + "teal": 1178, + "source": 322, "pc": [ 1226 ] }, { - "teal": 1178, - "source": 318, + "teal": 1182, + "source": 323, "pc": [ 1227 ] }, { - "teal": 1179, - "source": 318, + "teal": 1183, + "source": 323, "pc": [ 1228, 1229 ] }, { - "teal": 1180, - "source": 318, + "teal": 1184, + "source": 323, "pc": [ 1230 ] }, { - "teal": 1181, - "source": 318, + "teal": 1185, + "source": 323, "pc": [ 1231 ] }, { - "teal": 1182, - "source": 318, + "teal": 1186, + "source": 323, "pc": [ 1232, 1233 ] }, { - "teal": 1183, - "source": 318, + "teal": 1187, + "source": 323, "pc": [ 1234 ] }, { - "teal": 1184, - "source": 318, + "teal": 1188, + "source": 323, "pc": [ 1235 ] }, { - "teal": 1185, - "source": 318, + "teal": 1189, + "source": 323, "pc": [ 1236, 1237 ] }, { - "teal": 1186, - "source": 318, + "teal": 1190, + "source": 323, "pc": [ 1238 ] }, { - "teal": 1191, - "source": 321, + "teal": 1195, + "source": 326, "pc": [ 1239, 1240 ] }, { - "teal": 1192, - "source": 321, + "teal": 1196, + "source": 326, "pc": [ 1241, 1242, @@ -6512,29 +6527,29 @@ ] }, { - "teal": 1193, - "source": 321, + "teal": 1197, + "source": 326, "pc": [ 1244 ] }, { - "teal": 1194, - "source": 321, + "teal": 1198, + "source": 326, "pc": [ 1245 ] }, { - "teal": 1195, - "source": 321, + "teal": 1199, + "source": 326, "pc": [ 1246 ] }, { - "teal": 1196, - "source": 321, + "teal": 1200, + "source": 326, "pc": [ 1247, 1248, @@ -6542,16 +6557,16 @@ ] }, { - "teal": 1201, - "source": 323, + "teal": 1205, + "source": 328, "pc": [ 1250, 1251 ] }, { - "teal": 1202, - "source": 323, + "teal": 1206, + "source": 328, "pc": [ 1252, 1253, @@ -6559,15 +6574,15 @@ ] }, { - "teal": 1203, - "source": 323, + "teal": 1207, + "source": 328, "pc": [ 1255 ] }, { - "teal": 1204, - "source": 323, + "teal": 1208, + "source": 328, "pc": [ 1256, 1257, @@ -6575,32 +6590,32 @@ ] }, { - "teal": 1207, - "source": 323, + "teal": 1211, + "source": 328, "errorMessage": "provided NFD must be valid", "pc": [ 1259 ] }, { - "teal": 1214, - "source": 326, + "teal": 1218, + "source": 331, "pc": [ 1260, 1261 ] }, { - "teal": 1215, - "source": 326, + "teal": 1219, + "source": 331, "pc": [ 1262, 1263 ] }, { - "teal": 1216, - "source": 326, + "teal": 1220, + "source": 331, "pc": [ 1264, 1265, @@ -6608,61 +6623,61 @@ ] }, { - "teal": 1217, - "source": 326, + "teal": 1221, + "source": 331, "pc": [ 1267 ] }, { - "teal": 1218, - "source": 326, + "teal": 1222, + "source": 331, "pc": [ 1268, 1269 ] }, { - "teal": 1219, - "source": 326, + "teal": 1223, + "source": 331, "pc": [ 1270 ] }, { - "teal": 1222, - "source": 326, + "teal": 1226, + "source": 331, "errorMessage": "global state value does not exist: AppID.fromUint64(config.nfdForInfo).globalState('i.owner.a')", "pc": [ 1271 ] }, { - "teal": 1223, - "source": 326, + "teal": 1227, + "source": 331, "pc": [ 1272 ] }, { - "teal": 1226, - "source": 325, + "teal": 1230, + "source": 330, "errorMessage": "If specifying NFD, account adding validator must be owner", "pc": [ 1273 ] }, { - "teal": 1233, - "source": 331, + "teal": 1237, + "source": 336, "pc": [ 1274, 1275 ] }, { - "teal": 1234, - "source": 331, + "teal": 1238, + "source": 336, "pc": [ 1276, 1277, @@ -6670,37 +6685,37 @@ ] }, { - "teal": 1235, - "source": 331, + "teal": 1239, + "source": 336, "pc": [ 1279 ] }, { - "teal": 1236, - "source": 331, + "teal": 1240, + "source": 336, "pc": [ 1280, 1281 ] }, { - "teal": 1237, - "source": 331, + "teal": 1241, + "source": 336, "pc": [ 1282 ] }, { - "teal": 1238, - "source": 331, + "teal": 1242, + "source": 336, "pc": [ 1283 ] }, { - "teal": 1239, - "source": 331, + "teal": 1243, + "source": 336, "pc": [ 1284, 1285, @@ -6708,16 +6723,16 @@ ] }, { - "teal": 1240, - "source": 332, + "teal": 1244, + "source": 337, "pc": [ 1287, 1288 ] }, { - "teal": 1241, - "source": 332, + "teal": 1245, + "source": 337, "pc": [ 1289, 1290, @@ -6725,37 +6740,37 @@ ] }, { - "teal": 1242, - "source": 332, + "teal": 1246, + "source": 337, "pc": [ 1292 ] }, { - "teal": 1243, - "source": 332, + "teal": 1247, + "source": 337, "pc": [ 1293, 1294 ] }, { - "teal": 1244, - "source": 332, + "teal": 1248, + "source": 337, "pc": [ 1295 ] }, { - "teal": 1245, - "source": 331, + "teal": 1249, + "source": 336, "pc": [ 1296 ] }, { - "teal": 1248, - "source": 330, + "teal": 1252, + "source": 335, "pc": [ 1297, 1298, @@ -6763,16 +6778,16 @@ ] }, { - "teal": 1256, - "source": 336, + "teal": 1260, + "source": 341, "pc": [ 1300, 1301 ] }, { - "teal": 1257, - "source": 336, + "teal": 1261, + "source": 341, "pc": [ 1302, 1303, @@ -6780,15 +6795,15 @@ ] }, { - "teal": 1258, - "source": 336, + "teal": 1262, + "source": 341, "pc": [ 1305 ] }, { - "teal": 1259, - "source": 336, + "teal": 1263, + "source": 341, "pc": [ 1306, 1307, @@ -6796,16 +6811,16 @@ ] }, { - "teal": 1262, - "source": 335, + "teal": 1266, + "source": 340, "errorMessage": "provided NFD App id for gating must be valid NFD", "pc": [ 1309 ] }, { - "teal": 1267, - "source": 340, + "teal": 1271, + "source": 345, "pc": [ 1310, 1311, @@ -6816,31 +6831,31 @@ ] }, { - "teal": 1268, - "source": 340, + "teal": 1272, + "source": 345, "pc": [ 1316, 1317 ] }, { - "teal": 1269, - "source": 340, + "teal": 1273, + "source": 345, "pc": [ 1318 ] }, { - "teal": 1270, - "source": 340, + "teal": 1274, + "source": 345, "pc": [ 1319, 1320 ] }, { - "teal": 1271, - "source": 340, + "teal": 1275, + "source": 345, "pc": [ 1321, 1322, @@ -6848,23 +6863,23 @@ ] }, { - "teal": 1272, - "source": 340, + "teal": 1276, + "source": 345, "pc": [ 1324 ] }, { - "teal": 1273, - "source": 340, + "teal": 1277, + "source": 345, "pc": [ 1325, 1326 ] }, { - "teal": 1274, - "source": 340, + "teal": 1278, + "source": 345, "pc": [ 1327, 1328, @@ -6872,52 +6887,52 @@ ] }, { - "teal": 1275, - "source": 340, + "teal": 1279, + "source": 345, "pc": [ 1330 ] }, { - "teal": 1276, - "source": 340, + "teal": 1280, + "source": 345, "pc": [ 1331 ] }, { - "teal": 1277, - "source": 340, + "teal": 1281, + "source": 345, "pc": [ 1332 ] }, { - "teal": 1281, - "source": 341, + "teal": 1285, + "source": 346, "pc": [ 1333, 1334 ] }, { - "teal": 1284, - "source": 305, + "teal": 1288, + "source": 310, "pc": [ 1335, 1336 ] }, { - "teal": 1285, - "source": 305, + "teal": 1289, + "source": 310, "pc": [ 1337 ] }, { - "teal": 1290, - "source": 351, + "teal": 1294, + "source": 356, "pc": [ 1338, 1339, @@ -6925,45 +6940,45 @@ ] }, { - "teal": 1291, - "source": 351, + "teal": 1295, + "source": 356, "pc": [ 1341 ] }, { - "teal": 1292, - "source": 351, + "teal": 1296, + "source": 356, "pc": [ 1342 ] }, { - "teal": 1293, - "source": 351, + "teal": 1297, + "source": 356, "pc": [ 1343, 1344 ] }, { - "teal": 1294, - "source": 351, + "teal": 1298, + "source": 356, "pc": [ 1345 ] }, { - "teal": 1297, - "source": 351, + "teal": 1301, + "source": 356, "errorMessage": "argument 0 (manager) for changeValidatorManager must be a address", "pc": [ 1346 ] }, { - "teal": 1300, - "source": 351, + "teal": 1304, + "source": 356, "pc": [ 1347, 1348, @@ -6971,15 +6986,15 @@ ] }, { - "teal": 1301, - "source": 351, + "teal": 1305, + "source": 356, "pc": [ 1350 ] }, { - "teal": 1304, - "source": 351, + "teal": 1308, + "source": 356, "pc": [ 1351, 1352, @@ -6987,22 +7002,22 @@ ] }, { - "teal": 1305, - "source": 351, + "teal": 1309, + "source": 356, "pc": [ 1354 ] }, { - "teal": 1306, - "source": 351, + "teal": 1310, + "source": 356, "pc": [ 1355 ] }, { - "teal": 1316, - "source": 351, + "teal": 1320, + "source": 356, "pc": [ 1356, 1357, @@ -7010,16 +7025,16 @@ ] }, { - "teal": 1320, - "source": 352, + "teal": 1324, + "source": 357, "pc": [ 1359, 1360 ] }, { - "teal": 1321, - "source": 352, + "teal": 1325, + "source": 357, "pc": [ 1361, 1362, @@ -7027,106 +7042,106 @@ ] }, { - "teal": 1325, - "source": 353, + "teal": 1329, + "source": 358, "pc": [ 1364, 1365 ] }, { - "teal": 1326, - "source": 353, + "teal": 1330, + "source": 358, "pc": [ 1366, 1367 ] }, { - "teal": 1327, - "source": 353, + "teal": 1331, + "source": 358, "pc": [ 1368 ] }, { - "teal": 1330, - "source": 353, + "teal": 1334, + "source": 358, "errorMessage": "needs to at least be valid address", "pc": [ 1369 ] }, { - "teal": 1334, - "source": 354, + "teal": 1338, + "source": 359, "pc": [ 1370, 1371 ] }, { - "teal": 1335, - "source": 354, + "teal": 1339, + "source": 359, "pc": [ 1372, 1373 ] }, { - "teal": 1336, - "source": 354, + "teal": 1340, + "source": 359, "pc": [ 1374 ] }, { - "teal": 1337, - "source": 354, + "teal": 1341, + "source": 359, "pc": [ 1375, 1376 ] }, { - "teal": 1338, - "source": 354, + "teal": 1342, + "source": 359, "pc": [ 1377 ] }, { - "teal": 1339, - "source": 354, + "teal": 1343, + "source": 359, "pc": [ 1378 ] }, { - "teal": 1340, - "source": 354, + "teal": 1344, + "source": 359, "pc": [ 1379, 1380 ] }, { - "teal": 1341, - "source": 354, + "teal": 1345, + "source": 359, "pc": [ 1381 ] }, { - "teal": 1342, - "source": 351, + "teal": 1346, + "source": 356, "pc": [ 1382 ] }, { - "teal": 1347, - "source": 365, + "teal": 1351, + "source": 370, "pc": [ 1383, 1384, @@ -7134,15 +7149,15 @@ ] }, { - "teal": 1348, - "source": 365, + "teal": 1352, + "source": 370, "pc": [ 1386 ] }, { - "teal": 1351, - "source": 365, + "teal": 1355, + "source": 370, "pc": [ 1387, 1388, @@ -7150,15 +7165,15 @@ ] }, { - "teal": 1352, - "source": 365, + "teal": 1356, + "source": 370, "pc": [ 1390 ] }, { - "teal": 1355, - "source": 365, + "teal": 1359, + "source": 370, "pc": [ 1391, 1392, @@ -7166,15 +7181,15 @@ ] }, { - "teal": 1356, - "source": 365, + "teal": 1360, + "source": 370, "pc": [ 1394 ] }, { - "teal": 1359, - "source": 365, + "teal": 1363, + "source": 370, "pc": [ 1395, 1396, @@ -7182,22 +7197,22 @@ ] }, { - "teal": 1360, - "source": 365, + "teal": 1364, + "source": 370, "pc": [ 1398 ] }, { - "teal": 1361, - "source": 365, + "teal": 1365, + "source": 370, "pc": [ 1399 ] }, { - "teal": 1372, - "source": 365, + "teal": 1376, + "source": 370, "pc": [ 1400, 1401, @@ -7205,16 +7220,16 @@ ] }, { - "teal": 1376, - "source": 366, + "teal": 1380, + "source": 371, "pc": [ 1403, 1404 ] }, { - "teal": 1377, - "source": 366, + "teal": 1381, + "source": 371, "pc": [ 1405, 1406, @@ -7222,75 +7237,75 @@ ] }, { - "teal": 1381, - "source": 367, + "teal": 1385, + "source": 372, "pc": [ 1408, 1409 ] }, { - "teal": 1382, - "source": 367, + "teal": 1386, + "source": 372, "pc": [ 1410, 1411 ] }, { - "teal": 1383, - "source": 367, + "teal": 1387, + "source": 372, "pc": [ 1412 ] }, { - "teal": 1384, - "source": 367, + "teal": 1388, + "source": 372, "pc": [ 1413 ] }, { - "teal": 1385, - "source": 367, + "teal": 1389, + "source": 372, "pc": [ 1414, 1415 ] }, { - "teal": 1386, - "source": 367, + "teal": 1390, + "source": 372, "pc": [ 1416 ] }, { - "teal": 1387, - "source": 367, + "teal": 1391, + "source": 372, "pc": [ 1417 ] }, { - "teal": 1388, - "source": 367, + "teal": 1392, + "source": 372, "pc": [ 1418, 1419 ] }, { - "teal": 1389, - "source": 367, + "teal": 1393, + "source": 372, "pc": [ 1420 ] }, { - "teal": 1393, - "source": 368, + "teal": 1397, + "source": 373, "pc": [ 1421, 1422, @@ -7298,74 +7313,74 @@ ] }, { - "teal": 1394, - "source": 368, + "teal": 1398, + "source": 373, "pc": [ 1424, 1425 ] }, { - "teal": 1395, - "source": 368, + "teal": 1399, + "source": 373, "pc": [ 1426 ] }, { - "teal": 1396, - "source": 368, + "teal": 1400, + "source": 373, "pc": [ 1427 ] }, { - "teal": 1397, - "source": 368, + "teal": 1401, + "source": 373, "pc": [ 1428, 1429 ] }, { - "teal": 1398, - "source": 368, + "teal": 1402, + "source": 373, "pc": [ 1430 ] }, { - "teal": 1399, - "source": 368, + "teal": 1403, + "source": 373, "pc": [ 1431 ] }, { - "teal": 1400, - "source": 368, + "teal": 1404, + "source": 373, "pc": [ 1432, 1433 ] }, { - "teal": 1401, - "source": 368, + "teal": 1405, + "source": 373, "pc": [ 1434 ] }, { - "teal": 1402, - "source": 365, + "teal": 1406, + "source": 370, "pc": [ 1435 ] }, { - "teal": 1407, - "source": 379, + "teal": 1411, + "source": 384, "pc": [ 1436, 1437, @@ -7373,8 +7388,8 @@ ] }, { - "teal": 1408, - "source": 379, + "teal": 1412, + "source": 384, "pc": [ 1439, 1440, @@ -7382,8 +7397,8 @@ ] }, { - "teal": 1411, - "source": 379, + "teal": 1415, + "source": 384, "pc": [ 1442, 1443, @@ -7391,15 +7406,15 @@ ] }, { - "teal": 1412, - "source": 379, + "teal": 1416, + "source": 384, "pc": [ 1445 ] }, { - "teal": 1415, - "source": 379, + "teal": 1419, + "source": 384, "pc": [ 1446, 1447, @@ -7407,15 +7422,15 @@ ] }, { - "teal": 1416, - "source": 379, + "teal": 1420, + "source": 384, "pc": [ 1449 ] }, { - "teal": 1419, - "source": 379, + "teal": 1423, + "source": 384, "pc": [ 1450, 1451, @@ -7423,22 +7438,22 @@ ] }, { - "teal": 1420, - "source": 379, + "teal": 1424, + "source": 384, "pc": [ 1453 ] }, { - "teal": 1421, - "source": 379, + "teal": 1425, + "source": 384, "pc": [ 1454 ] }, { - "teal": 1432, - "source": 379, + "teal": 1436, + "source": 384, "pc": [ 1455, 1456, @@ -7446,16 +7461,16 @@ ] }, { - "teal": 1436, - "source": 380, + "teal": 1440, + "source": 385, "pc": [ 1458, 1459 ] }, { - "teal": 1437, - "source": 380, + "teal": 1441, + "source": 385, "pc": [ 1460, 1461, @@ -7463,16 +7478,16 @@ ] }, { - "teal": 1441, - "source": 382, + "teal": 1445, + "source": 387, "pc": [ 1463, 1464 ] }, { - "teal": 1442, - "source": 382, + "teal": 1446, + "source": 387, "pc": [ 1465, 1466, @@ -7480,144 +7495,144 @@ ] }, { - "teal": 1445, - "source": 382, + "teal": 1449, + "source": 387, "errorMessage": "provided NFD must be valid", "pc": [ 1468 ] }, { - "teal": 1452, - "source": 385, + "teal": 1456, + "source": 390, "pc": [ 1469, 1470 ] }, { - "teal": 1453, - "source": 385, + "teal": 1457, + "source": 390, "pc": [ 1471, 1472 ] }, { - "teal": 1454, - "source": 385, + "teal": 1458, + "source": 390, "pc": [ 1473, 1474 ] }, { - "teal": 1455, - "source": 385, + "teal": 1459, + "source": 390, "pc": [ 1475 ] }, { - "teal": 1458, - "source": 385, + "teal": 1462, + "source": 390, "errorMessage": "global state value does not exist: AppID.fromUint64(nfdAppID).globalState('i.owner.a')", "pc": [ 1476 ] }, { - "teal": 1459, - "source": 385, + "teal": 1463, + "source": 390, "pc": [ 1477 ] }, { - "teal": 1462, - "source": 384, + "teal": 1466, + "source": 389, "errorMessage": "If specifying NFD, account adding validator must be owner", "pc": [ 1478 ] }, { - "teal": 1466, - "source": 388, + "teal": 1470, + "source": 393, "pc": [ 1479, 1480 ] }, { - "teal": 1467, - "source": 388, + "teal": 1471, + "source": 393, "pc": [ 1481, 1482 ] }, { - "teal": 1468, - "source": 388, + "teal": 1472, + "source": 393, "pc": [ 1483 ] }, { - "teal": 1469, - "source": 388, + "teal": 1473, + "source": 393, "pc": [ 1484 ] }, { - "teal": 1470, - "source": 388, + "teal": 1474, + "source": 393, "pc": [ 1485, 1486 ] }, { - "teal": 1471, - "source": 388, + "teal": 1475, + "source": 393, "pc": [ 1487 ] }, { - "teal": 1472, - "source": 388, + "teal": 1476, + "source": 393, "pc": [ 1488 ] }, { - "teal": 1473, - "source": 388, + "teal": 1477, + "source": 393, "pc": [ 1489, 1490 ] }, { - "teal": 1474, - "source": 388, + "teal": 1478, + "source": 393, "pc": [ 1491 ] }, { - "teal": 1475, - "source": 379, + "teal": 1479, + "source": 384, "pc": [ 1492 ] }, { - "teal": 1480, - "source": 395, + "teal": 1484, + "source": 400, "pc": [ 1493, 1494, @@ -7625,45 +7640,45 @@ ] }, { - "teal": 1481, - "source": 395, + "teal": 1485, + "source": 400, "pc": [ 1496 ] }, { - "teal": 1482, - "source": 395, + "teal": 1486, + "source": 400, "pc": [ 1497 ] }, { - "teal": 1483, - "source": 395, + "teal": 1487, + "source": 400, "pc": [ 1498, 1499 ] }, { - "teal": 1484, - "source": 395, + "teal": 1488, + "source": 400, "pc": [ 1500 ] }, { - "teal": 1487, - "source": 395, + "teal": 1491, + "source": 400, "errorMessage": "argument 0 (commissionAddress) for changeValidatorCommissionAddress must be a address", "pc": [ 1501 ] }, { - "teal": 1490, - "source": 395, + "teal": 1494, + "source": 400, "pc": [ 1502, 1503, @@ -7671,15 +7686,15 @@ ] }, { - "teal": 1491, - "source": 395, + "teal": 1495, + "source": 400, "pc": [ 1505 ] }, { - "teal": 1494, - "source": 395, + "teal": 1498, + "source": 400, "pc": [ 1506, 1507, @@ -7687,22 +7702,22 @@ ] }, { - "teal": 1495, - "source": 395, + "teal": 1499, + "source": 400, "pc": [ 1509 ] }, { - "teal": 1496, - "source": 395, + "teal": 1500, + "source": 400, "pc": [ 1510 ] }, { - "teal": 1503, - "source": 395, + "teal": 1507, + "source": 400, "pc": [ 1511, 1512, @@ -7710,16 +7725,16 @@ ] }, { - "teal": 1507, - "source": 396, + "teal": 1511, + "source": 401, "pc": [ 1514, 1515 ] }, { - "teal": 1508, - "source": 396, + "teal": 1512, + "source": 401, "pc": [ 1516, 1517, @@ -7727,38 +7742,38 @@ ] }, { - "teal": 1512, - "source": 397, + "teal": 1516, + "source": 402, "pc": [ 1519, 1520 ] }, { - "teal": 1513, - "source": 397, + "teal": 1517, + "source": 402, "pc": [ 1521, 1522 ] }, { - "teal": 1514, - "source": 397, + "teal": 1518, + "source": 402, "pc": [ 1523 ] }, { - "teal": 1515, - "source": 397, + "teal": 1519, + "source": 402, "pc": [ 1524 ] }, { - "teal": 1519, - "source": 398, + "teal": 1523, + "source": 403, "pc": [ 1525, 1526, @@ -7766,67 +7781,67 @@ ] }, { - "teal": 1520, - "source": 398, + "teal": 1524, + "source": 403, "pc": [ 1528, 1529 ] }, { - "teal": 1521, - "source": 398, + "teal": 1525, + "source": 403, "pc": [ 1530 ] }, { - "teal": 1522, - "source": 398, + "teal": 1526, + "source": 403, "pc": [ 1531, 1532 ] }, { - "teal": 1523, - "source": 398, + "teal": 1527, + "source": 403, "pc": [ 1533 ] }, { - "teal": 1524, - "source": 398, + "teal": 1528, + "source": 403, "pc": [ 1534 ] }, { - "teal": 1525, - "source": 398, + "teal": 1529, + "source": 403, "pc": [ 1535, 1536 ] }, { - "teal": 1526, - "source": 398, + "teal": 1530, + "source": 403, "pc": [ 1537 ] }, { - "teal": 1527, - "source": 395, + "teal": 1531, + "source": 400, "pc": [ 1538 ] }, { - "teal": 1532, - "source": 411, + "teal": 1536, + "source": 416, "pc": [ 1539, 1540, @@ -7834,15 +7849,15 @@ ] }, { - "teal": 1533, - "source": 411, + "teal": 1537, + "source": 416, "pc": [ 1542 ] }, { - "teal": 1536, - "source": 410, + "teal": 1540, + "source": 415, "pc": [ 1543, 1544, @@ -7850,15 +7865,15 @@ ] }, { - "teal": 1537, - "source": 410, + "teal": 1541, + "source": 415, "pc": [ 1546 ] }, { - "teal": 1540, - "source": 409, + "teal": 1544, + "source": 414, "pc": [ 1547, 1548, @@ -7866,45 +7881,45 @@ ] }, { - "teal": 1541, - "source": 409, + "teal": 1545, + "source": 414, "pc": [ 1550 ] }, { - "teal": 1542, - "source": 409, + "teal": 1546, + "source": 414, "pc": [ 1551 ] }, { - "teal": 1543, - "source": 409, + "teal": 1547, + "source": 414, "pc": [ 1552, 1553 ] }, { - "teal": 1544, - "source": 409, + "teal": 1548, + "source": 414, "pc": [ 1554 ] }, { - "teal": 1547, - "source": 409, + "teal": 1551, + "source": 414, "errorMessage": "argument 2 (EntryGatingAssets) for changeValidatorRewardInfo must be a uint64[4]", "pc": [ 1555 ] }, { - "teal": 1550, - "source": 408, + "teal": 1554, + "source": 413, "pc": [ 1556, 1557, @@ -7912,45 +7927,45 @@ ] }, { - "teal": 1551, - "source": 408, + "teal": 1555, + "source": 413, "pc": [ 1559 ] }, { - "teal": 1552, - "source": 408, + "teal": 1556, + "source": 413, "pc": [ 1560 ] }, { - "teal": 1553, - "source": 408, + "teal": 1557, + "source": 413, "pc": [ 1561, 1562 ] }, { - "teal": 1554, - "source": 408, + "teal": 1558, + "source": 413, "pc": [ 1563 ] }, { - "teal": 1557, - "source": 408, + "teal": 1561, + "source": 413, "errorMessage": "argument 3 (EntryGatingAddress) for changeValidatorRewardInfo must be a address", "pc": [ 1564 ] }, { - "teal": 1560, - "source": 407, + "teal": 1564, + "source": 412, "pc": [ 1565, 1566, @@ -7958,51 +7973,51 @@ ] }, { - "teal": 1561, - "source": 407, + "teal": 1565, + "source": 412, "pc": [ 1568 ] }, { - "teal": 1562, - "source": 407, + "teal": 1566, + "source": 412, "pc": [ 1569 ] }, { - "teal": 1563, - "source": 407, + "teal": 1567, + "source": 412, "pc": [ 1570 ] }, { - "teal": 1564, - "source": 407, + "teal": 1568, + "source": 412, "pc": [ 1571 ] }, { - "teal": 1567, - "source": 407, + "teal": 1571, + "source": 412, "errorMessage": "argument 4 (EntryGatingType) for changeValidatorRewardInfo must be a uint8", "pc": [ 1572 ] }, { - "teal": 1568, - "source": 407, + "teal": 1572, + "source": 412, "pc": [ 1573 ] }, { - "teal": 1571, - "source": 406, + "teal": 1575, + "source": 411, "pc": [ 1574, 1575, @@ -8010,15 +8025,15 @@ ] }, { - "teal": 1572, - "source": 406, + "teal": 1576, + "source": 411, "pc": [ 1577 ] }, { - "teal": 1575, - "source": 405, + "teal": 1579, + "source": 410, "pc": [ 1578, 1579, @@ -8026,22 +8041,22 @@ ] }, { - "teal": 1576, - "source": 405, + "teal": 1580, + "source": 410, "pc": [ 1581 ] }, { - "teal": 1577, - "source": 405, + "teal": 1581, + "source": 410, "pc": [ 1582 ] }, { - "teal": 1584, - "source": 405, + "teal": 1588, + "source": 410, "pc": [ 1583, 1584, @@ -8049,16 +8064,16 @@ ] }, { - "teal": 1588, - "source": 413, + "teal": 1592, + "source": 418, "pc": [ 1586, 1587 ] }, { - "teal": 1589, - "source": 413, + "teal": 1593, + "source": 418, "pc": [ 1588, 1589, @@ -8066,37 +8081,37 @@ ] }, { - "teal": 1596, - "source": 416, + "teal": 1600, + "source": 421, "pc": [ 1591, 1592 ] }, { - "teal": 1597, - "source": 416, + "teal": 1601, + "source": 421, "pc": [ 1593 ] }, { - "teal": 1598, - "source": 416, + "teal": 1602, + "source": 421, "pc": [ 1594 ] }, { - "teal": 1599, - "source": 416, + "teal": 1603, + "source": 421, "pc": [ 1595 ] }, { - "teal": 1600, - "source": 416, + "teal": 1604, + "source": 421, "pc": [ 1596, 1597, @@ -8104,68 +8119,68 @@ ] }, { - "teal": 1601, - "source": 416, + "teal": 1605, + "source": 421, "pc": [ 1599, 1600 ] }, { - "teal": 1602, - "source": 416, + "teal": 1606, + "source": 421, "pc": [ 1601, 1602 ] }, { - "teal": 1603, - "source": 416, + "teal": 1607, + "source": 421, "pc": [ 1603 ] }, { - "teal": 1604, - "source": 416, + "teal": 1608, + "source": 421, "pc": [ 1604 ] }, { - "teal": 1608, - "source": 415, + "teal": 1612, + "source": 420, "errorMessage": "invalid Entry gating type", "pc": [ 1605 ] }, { - "teal": 1613, - "source": 419, + "teal": 1617, + "source": 424, "pc": [ 1606, 1607 ] }, { - "teal": 1614, - "source": 419, + "teal": 1618, + "source": 424, "pc": [ 1608 ] }, { - "teal": 1615, - "source": 419, + "teal": 1619, + "source": 424, "pc": [ 1609 ] }, { - "teal": 1616, - "source": 419, + "teal": 1620, + "source": 424, "pc": [ 1610, 1611, @@ -8173,68 +8188,68 @@ ] }, { - "teal": 1621, - "source": 420, + "teal": 1625, + "source": 425, "pc": [ 1613, 1614 ] }, { - "teal": 1622, - "source": 420, + "teal": 1626, + "source": 425, "pc": [ 1615, 1616 ] }, { - "teal": 1623, - "source": 420, + "teal": 1627, + "source": 425, "pc": [ 1617 ] }, { - "teal": 1624, - "source": 420, + "teal": 1628, + "source": 425, "pc": [ 1618 ] }, { - "teal": 1631, - "source": 423, + "teal": 1635, + "source": 428, "pc": [ 1619, 1620 ] }, { - "teal": 1632, - "source": 423, + "teal": 1636, + "source": 428, "pc": [ 1621, 1622 ] }, { - "teal": 1633, - "source": 423, + "teal": 1637, + "source": 428, "pc": [ 1623 ] }, { - "teal": 1634, - "source": 423, + "teal": 1638, + "source": 428, "pc": [ 1624 ] }, { - "teal": 1635, - "source": 423, + "teal": 1639, + "source": 428, "pc": [ 1625, 1626, @@ -8242,38 +8257,38 @@ ] }, { - "teal": 1636, - "source": 424, + "teal": 1640, + "source": 429, "pc": [ 1628, 1629 ] }, { - "teal": 1637, - "source": 424, + "teal": 1641, + "source": 429, "pc": [ 1630, 1631 ] }, { - "teal": 1638, - "source": 424, + "teal": 1642, + "source": 429, "pc": [ 1632 ] }, { - "teal": 1639, - "source": 423, + "teal": 1643, + "source": 428, "pc": [ 1633 ] }, { - "teal": 1642, - "source": 422, + "teal": 1646, + "source": 427, "pc": [ 1634, 1635, @@ -8281,16 +8296,16 @@ ] }, { - "teal": 1647, - "source": 426, + "teal": 1651, + "source": 431, "pc": [ 1637, 1638 ] }, { - "teal": 1648, - "source": 426, + "teal": 1652, + "source": 431, "pc": [ 1639, 1640, @@ -8298,15 +8313,15 @@ ] }, { - "teal": 1649, - "source": 426, + "teal": 1653, + "source": 431, "pc": [ 1642 ] }, { - "teal": 1650, - "source": 426, + "teal": 1654, + "source": 431, "pc": [ 1643, 1644, @@ -8314,39 +8329,39 @@ ] }, { - "teal": 1653, - "source": 426, + "teal": 1657, + "source": 431, "errorMessage": "provided NFD App id for gating must be valid NFD", "pc": [ 1646 ] }, { - "teal": 1658, - "source": 428, + "teal": 1662, + "source": 433, "pc": [ 1647, 1648 ] }, { - "teal": 1659, - "source": 428, + "teal": 1663, + "source": 433, "pc": [ 1649, 1650 ] }, { - "teal": 1660, - "source": 428, + "teal": 1664, + "source": 433, "pc": [ 1651 ] }, { - "teal": 1661, - "source": 428, + "teal": 1665, + "source": 433, "pc": [ 1652, 1653, @@ -8354,239 +8369,239 @@ ] }, { - "teal": 1662, - "source": 428, + "teal": 1666, + "source": 433, "pc": [ 1655 ] }, { - "teal": 1663, - "source": 428, + "teal": 1667, + "source": 433, "pc": [ 1656, 1657 ] }, { - "teal": 1664, - "source": 428, + "teal": 1668, + "source": 433, "pc": [ 1658 ] }, { - "teal": 1665, - "source": 428, + "teal": 1669, + "source": 433, "pc": [ 1659 ] }, { - "teal": 1666, - "source": 428, + "teal": 1670, + "source": 433, "pc": [ 1660, 1661 ] }, { - "teal": 1667, - "source": 428, + "teal": 1671, + "source": 433, "pc": [ 1662 ] }, { - "teal": 1671, - "source": 429, + "teal": 1675, + "source": 434, "pc": [ 1663, 1664 ] }, { - "teal": 1672, - "source": 429, + "teal": 1676, + "source": 434, "pc": [ 1665, 1666 ] }, { - "teal": 1673, - "source": 429, + "teal": 1677, + "source": 434, "pc": [ 1667 ] }, { - "teal": 1674, - "source": 429, + "teal": 1678, + "source": 434, "pc": [ 1668, 1669 ] }, { - "teal": 1675, - "source": 429, + "teal": 1679, + "source": 434, "pc": [ 1670 ] }, { - "teal": 1676, - "source": 429, + "teal": 1680, + "source": 434, "pc": [ 1671 ] }, { - "teal": 1677, - "source": 429, + "teal": 1681, + "source": 434, "pc": [ 1672, 1673 ] }, { - "teal": 1678, - "source": 429, + "teal": 1682, + "source": 434, "pc": [ 1674 ] }, { - "teal": 1682, - "source": 430, + "teal": 1686, + "source": 435, "pc": [ 1675, 1676 ] }, { - "teal": 1683, - "source": 430, + "teal": 1687, + "source": 435, "pc": [ 1677, 1678 ] }, { - "teal": 1684, - "source": 430, + "teal": 1688, + "source": 435, "pc": [ 1679 ] }, { - "teal": 1685, - "source": 430, + "teal": 1689, + "source": 435, "pc": [ 1680, 1681 ] }, { - "teal": 1686, - "source": 430, + "teal": 1690, + "source": 435, "pc": [ 1682 ] }, { - "teal": 1687, - "source": 430, + "teal": 1691, + "source": 435, "pc": [ 1683 ] }, { - "teal": 1688, - "source": 430, + "teal": 1692, + "source": 435, "pc": [ 1684, 1685 ] }, { - "teal": 1689, - "source": 430, + "teal": 1693, + "source": 435, "pc": [ 1686 ] }, { - "teal": 1693, - "source": 431, + "teal": 1697, + "source": 436, "pc": [ 1687, 1688 ] }, { - "teal": 1694, - "source": 431, + "teal": 1698, + "source": 436, "pc": [ 1689, 1690 ] }, { - "teal": 1695, - "source": 431, + "teal": 1699, + "source": 436, "pc": [ 1691 ] }, { - "teal": 1696, - "source": 431, + "teal": 1700, + "source": 436, "pc": [ 1692 ] }, { - "teal": 1697, - "source": 431, + "teal": 1701, + "source": 436, "pc": [ 1693, 1694 ] }, { - "teal": 1698, - "source": 431, + "teal": 1702, + "source": 436, "pc": [ 1695 ] }, { - "teal": 1699, - "source": 431, + "teal": 1703, + "source": 436, "pc": [ 1696 ] }, { - "teal": 1700, - "source": 431, + "teal": 1704, + "source": 436, "pc": [ 1697, 1698 ] }, { - "teal": 1701, - "source": 431, + "teal": 1705, + "source": 436, "pc": [ 1699 ] }, { - "teal": 1705, - "source": 432, + "teal": 1709, + "source": 437, "pc": [ 1700, 1701, @@ -8594,81 +8609,81 @@ ] }, { - "teal": 1706, - "source": 432, + "teal": 1710, + "source": 437, "pc": [ 1703, 1704 ] }, { - "teal": 1707, - "source": 432, + "teal": 1711, + "source": 437, "pc": [ 1705 ] }, { - "teal": 1708, - "source": 432, + "teal": 1712, + "source": 437, "pc": [ 1706 ] }, { - "teal": 1709, - "source": 432, + "teal": 1713, + "source": 437, "pc": [ 1707, 1708 ] }, { - "teal": 1710, - "source": 432, + "teal": 1714, + "source": 437, "pc": [ 1709 ] }, { - "teal": 1711, - "source": 432, + "teal": 1715, + "source": 437, "pc": [ 1710 ] }, { - "teal": 1712, - "source": 432, + "teal": 1716, + "source": 437, "pc": [ 1711, 1712 ] }, { - "teal": 1713, - "source": 432, + "teal": 1717, + "source": 437, "pc": [ 1713 ] }, { - "teal": 1714, - "source": 405, + "teal": 1718, + "source": 410, "pc": [ 1714 ] }, { - "teal": 1719, - "source": 446, + "teal": 1723, + "source": 451, "pc": [ 1715 ] }, { - "teal": 1722, - "source": 446, + "teal": 1726, + "source": 451, "pc": [ 1716, 1717, @@ -8676,15 +8691,15 @@ ] }, { - "teal": 1723, - "source": 446, + "teal": 1727, + "source": 451, "pc": [ 1719 ] }, { - "teal": 1726, - "source": 446, + "teal": 1730, + "source": 451, "pc": [ 1720, 1721, @@ -8692,74 +8707,74 @@ ] }, { - "teal": 1727, - "source": 446, + "teal": 1731, + "source": 451, "pc": [ 1723 ] }, { - "teal": 1730, - "source": 446, + "teal": 1734, + "source": 451, "pc": [ 1724, 1725 ] }, { - "teal": 1731, - "source": 446, + "teal": 1735, + "source": 451, "pc": [ 1726 ] }, { - "teal": 1732, - "source": 446, + "teal": 1736, + "source": 451, "pc": [ 1727 ] }, { - "teal": 1733, - "source": 446, + "teal": 1737, + "source": 451, "pc": [ 1728 ] }, { - "teal": 1734, - "source": 446, + "teal": 1738, + "source": 451, "pc": [ 1729, 1730 ] }, { - "teal": 1735, - "source": 446, + "teal": 1739, + "source": 451, "pc": [ 1731 ] }, { - "teal": 1736, - "source": 446, + "teal": 1740, + "source": 451, "pc": [ 1732 ] }, { - "teal": 1739, - "source": 446, + "teal": 1743, + "source": 451, "errorMessage": "argument 2 (mbrPayment) for addPool must be a pay transaction", "pc": [ 1733 ] }, { - "teal": 1742, - "source": 446, + "teal": 1746, + "source": 451, "pc": [ 1734, 1735, @@ -8767,36 +8782,36 @@ ] }, { - "teal": 1743, - "source": 446, + "teal": 1747, + "source": 451, "pc": [ 1737 ] }, { - "teal": 1744, - "source": 446, + "teal": 1748, + "source": 451, "pc": [ 1738 ] }, { - "teal": 1745, - "source": 446, + "teal": 1749, + "source": 451, "pc": [ 1739 ] }, { - "teal": 1746, - "source": 446, + "teal": 1750, + "source": 451, "pc": [ 1740 ] }, { - "teal": 1759, - "source": 446, + "teal": 1763, + "source": 451, "pc": [ 1741, 1742, @@ -8804,30 +8819,30 @@ ] }, { - "teal": 1762, - "source": 446, + "teal": 1766, + "source": 451, "pc": [ 1744 ] }, { - "teal": 1763, - "source": 446, + "teal": 1767, + "source": 451, "pc": [ 1745 ] }, { - "teal": 1767, - "source": 447, + "teal": 1771, + "source": 452, "pc": [ 1746, 1747 ] }, { - "teal": 1768, - "source": 447, + "teal": 1772, + "source": 452, "pc": [ 1748, 1749, @@ -8835,63 +8850,63 @@ ] }, { - "teal": 1773, - "source": 450, + "teal": 1777, + "source": 455, "pc": [ 1751, 1752 ] }, { - "teal": 1774, - "source": 450, + "teal": 1778, + "source": 455, "pc": [ 1753, 1754 ] }, { - "teal": 1775, - "source": 450, + "teal": 1779, + "source": 455, "pc": [ 1755, 1756 ] }, { - "teal": 1776, - "source": 450, + "teal": 1780, + "source": 455, "pc": [ 1757 ] }, { - "teal": 1779, - "source": 450, + "teal": 1783, + "source": 455, "errorMessage": "transaction verification failed: {\"txn\":\"mbrPayment\",\"field\":\"receiver\",\"expected\":\"this.app.address\"}", "pc": [ 1758 ] }, { - "teal": 1782, - "source": 450, + "teal": 1786, + "source": 455, "pc": [ 1759, 1760 ] }, { - "teal": 1783, - "source": 450, + "teal": 1787, + "source": 455, "pc": [ 1761, 1762 ] }, { - "teal": 1784, - "source": 450, + "teal": 1788, + "source": 455, "pc": [ 1763, 1764, @@ -8899,8 +8914,8 @@ ] }, { - "teal": 1785, - "source": 450, + "teal": 1789, + "source": 455, "pc": [ 1766, 1767, @@ -8908,185 +8923,185 @@ ] }, { - "teal": 1786, - "source": 450, + "teal": 1790, + "source": 455, "pc": [ 1769 ] }, { - "teal": 1787, - "source": 450, + "teal": 1791, + "source": 455, "pc": [ 1770 ] }, { - "teal": 1790, - "source": 450, + "teal": 1794, + "source": 455, "errorMessage": "transaction verification failed: {\"txn\":\"mbrPayment\",\"field\":\"amount\",\"expected\":\"this.getMbrAmounts().addPoolMbr\"}", "pc": [ 1771 ] }, { - "teal": 1794, - "source": 452, + "teal": 1798, + "source": 457, "pc": [ 1772 ] }, { - "teal": 1795, - "source": 452, + "teal": 1799, + "source": 457, "pc": [ 1773, 1774 ] }, { - "teal": 1796, - "source": 452, + "teal": 1800, + "source": 457, "pc": [ 1775 ] }, { - "teal": 1797, - "source": 452, + "teal": 1801, + "source": 457, "pc": [ 1776 ] }, { - "teal": 1798, - "source": 452, + "teal": 1802, + "source": 457, "pc": [ 1777 ] }, { - "teal": 1799, - "source": 452, + "teal": 1803, + "source": 457, "pc": [ 1778 ] }, { - "teal": 1800, - "source": 452, + "teal": 1804, + "source": 457, "pc": [ 1779 ] }, { - "teal": 1803, - "source": 452, + "teal": 1807, + "source": 457, "errorMessage": "specified validator id isn't valid", "pc": [ 1780 ] }, { - "teal": 1807, - "source": 454, + "teal": 1811, + "source": 459, "pc": [ 1781, 1782 ] }, { - "teal": 1808, - "source": 454, + "teal": 1812, + "source": 459, "pc": [ 1783, 1784 ] }, { - "teal": 1809, - "source": 454, + "teal": 1813, + "source": 459, "pc": [ 1785 ] }, { - "teal": 1810, - "source": 454, + "teal": 1814, + "source": 459, "pc": [ 1786, 1787 ] }, { - "teal": 1811, - "source": 454, + "teal": 1815, + "source": 459, "pc": [ 1788 ] }, { - "teal": 1812, - "source": 454, + "teal": 1816, + "source": 459, "pc": [ 1789 ] }, { - "teal": 1813, - "source": 454, + "teal": 1817, + "source": 459, "pc": [ 1790, 1791 ] }, { - "teal": 1814, - "source": 454, + "teal": 1818, + "source": 459, "pc": [ 1792 ] }, { - "teal": 1815, - "source": 454, + "teal": 1819, + "source": 459, "pc": [ 1793 ] }, { - "teal": 1816, - "source": 454, + "teal": 1820, + "source": 459, "pc": [ 1794, 1795 ] }, { - "teal": 1821, - "source": 455, + "teal": 1825, + "source": 460, "pc": [ 1796, 1797 ] }, { - "teal": 1822, + "teal": 1826, "source": 58, "pc": [ 1798 ] }, { - "teal": 1823, - "source": 455, + "teal": 1827, + "source": 460, "pc": [ 1799 ] }, { - "teal": 1824, - "source": 455, + "teal": 1828, + "source": 460, "pc": [ 1800, 1801, @@ -9094,191 +9109,191 @@ ] }, { - "teal": 1828, - "source": 456, + "teal": 1832, + "source": 461, "errorMessage": "already at max pool size", "pc": [ 1803 ] }, { - "teal": 1833, - "source": 458, + "teal": 1837, + "source": 463, "pc": [ 1804, 1805 ] }, { - "teal": 1834, - "source": 458, + "teal": 1838, + "source": 463, "pc": [ 1806 ] }, { - "teal": 1835, - "source": 458, + "teal": 1839, + "source": 463, "pc": [ 1807 ] }, { - "teal": 1836, - "source": 458, + "teal": 1840, + "source": 463, "pc": [ 1808, 1809 ] }, { - "teal": 1858, - "source": 461, + "teal": 1862, + "source": 466, "pc": [ 1810 ] }, { - "teal": 1859, - "source": 461, + "teal": 1863, + "source": 466, "pc": [ 1811, 1812 ] }, { - "teal": 1860, - "source": 461, + "teal": 1864, + "source": 466, "pc": [ 1813, 1814 ] }, { - "teal": 1864, - "source": 462, + "teal": 1868, + "source": 467, "pc": [ 1815 ] }, { - "teal": 1865, - "source": 462, + "teal": 1869, + "source": 467, "pc": [ 1816, 1817 ] }, { - "teal": 1872, - "source": 464, + "teal": 1876, + "source": 469, "pc": [ 1818, 1819 ] }, { - "teal": 1873, - "source": 464, + "teal": 1877, + "source": 469, "pc": [ 1820 ] }, { - "teal": 1874, - "source": 464, + "teal": 1878, + "source": 469, "pc": [ 1821, 1822 ] }, { - "teal": 1875, - "source": 464, + "teal": 1879, + "source": 469, "pc": [ 1823 ] }, { - "teal": 1876, - "source": 464, + "teal": 1880, + "source": 469, "pc": [ 1824, 1825 ] }, { - "teal": 1877, - "source": 465, + "teal": 1881, + "source": 470, "pc": [ 1826, 1827 ] }, { - "teal": 1878, - "source": 465, + "teal": 1882, + "source": 470, "pc": [ 1828, 1829 ] }, { - "teal": 1879, - "source": 465, + "teal": 1883, + "source": 470, "pc": [ 1830, 1831 ] }, { - "teal": 1880, - "source": 465, + "teal": 1884, + "source": 470, "pc": [ 1832 ] }, { - "teal": 1883, - "source": 465, + "teal": 1887, + "source": 470, "errorMessage": "box value does not exist: this.stakingPoolApprovalProgram.size", "pc": [ 1833 ] }, { - "teal": 1884, - "source": 465, + "teal": 1888, + "source": 470, "pc": [ 1834, 1835 ] }, { - "teal": 1885, - "source": 465, + "teal": 1889, + "source": 470, "pc": [ 1836 ] }, { - "teal": 1886, - "source": 465, + "teal": 1890, + "source": 470, "pc": [ 1837 ] }, { - "teal": 1887, - "source": 465, + "teal": 1891, + "source": 470, "pc": [ 1838, 1839 ] }, { - "teal": 1891, - "source": 467, + "teal": 1895, + "source": 472, "pc": [ 1840, 1841, @@ -9286,64 +9301,64 @@ ] }, { - "teal": 1892, - "source": 467, + "teal": 1896, + "source": 472, "pc": [ 1843, 1844 ] }, { - "teal": 1896, - "source": 468, + "teal": 1900, + "source": 473, "pc": [ 1845, 1846 ] }, { - "teal": 1897, - "source": 468, + "teal": 1901, + "source": 473, "pc": [ 1847, 1848 ] }, { - "teal": 1901, - "source": 469, + "teal": 1905, + "source": 474, "pc": [ 1849, 1850 ] }, { - "teal": 1902, - "source": 469, + "teal": 1906, + "source": 474, "pc": [ 1851, 1852 ] }, { - "teal": 1906, - "source": 470, + "teal": 1910, + "source": 475, "pc": [ 1853, 1854 ] }, { - "teal": 1907, - "source": 470, + "teal": 1911, + "source": 475, "pc": [ 1855, 1856 ] }, { - "teal": 1918, - "source": 473, + "teal": 1922, + "source": 478, "pc": [ 1857, 1858, @@ -9354,16 +9369,16 @@ ] }, { - "teal": 1919, - "source": 473, + "teal": 1923, + "source": 478, "pc": [ 1863, 1864 ] }, { - "teal": 1920, - "source": 474, + "teal": 1924, + "source": 479, "pc": [ 1865, 1866, @@ -9371,195 +9386,195 @@ ] }, { - "teal": 1921, - "source": 474, + "teal": 1925, + "source": 479, "pc": [ 1868 ] }, { - "teal": 1922, - "source": 474, + "teal": 1926, + "source": 479, "pc": [ 1869, 1870 ] }, { - "teal": 1923, - "source": 475, + "teal": 1927, + "source": 480, "pc": [ 1871, 1872 ] }, { - "teal": 1924, - "source": 475, + "teal": 1928, + "source": 480, "pc": [ 1873 ] }, { - "teal": 1925, - "source": 475, + "teal": 1929, + "source": 480, "pc": [ 1874, 1875 ] }, { - "teal": 1926, - "source": 476, + "teal": 1930, + "source": 481, "pc": [ 1876, 1877 ] }, { - "teal": 1927, - "source": 476, + "teal": 1931, + "source": 481, "pc": [ 1878 ] }, { - "teal": 1928, - "source": 476, + "teal": 1932, + "source": 481, "pc": [ 1879, 1880 ] }, { - "teal": 1929, - "source": 477, + "teal": 1933, + "source": 482, "pc": [ 1881, 1882 ] }, { - "teal": 1930, - "source": 477, + "teal": 1934, + "source": 482, "pc": [ 1883 ] }, { - "teal": 1931, - "source": 477, + "teal": 1935, + "source": 482, "pc": [ 1884 ] }, { - "teal": 1932, - "source": 477, + "teal": 1936, + "source": 482, "pc": [ 1885, 1886 ] }, { - "teal": 1933, - "source": 477, + "teal": 1937, + "source": 482, "pc": [ 1887 ] }, { - "teal": 1934, - "source": 477, + "teal": 1938, + "source": 482, "pc": [ 1888 ] }, { - "teal": 1935, - "source": 477, + "teal": 1939, + "source": 482, "pc": [ 1889, 1890 ] }, { - "teal": 1936, - "source": 477, + "teal": 1940, + "source": 482, "pc": [ 1891 ] }, { - "teal": 1937, - "source": 477, + "teal": 1941, + "source": 482, "pc": [ 1892 ] }, { - "teal": 1938, - "source": 477, + "teal": 1942, + "source": 482, "pc": [ 1893 ] }, { - "teal": 1939, - "source": 477, + "teal": 1943, + "source": 482, "pc": [ 1894, 1895 ] }, { - "teal": 1942, - "source": 461, + "teal": 1946, + "source": 466, "pc": [ 1896 ] }, { - "teal": 1943, - "source": 461, + "teal": 1947, + "source": 466, "pc": [ 1897, 1898 ] }, { - "teal": 1946, - "source": 461, + "teal": 1950, + "source": 466, "pc": [ 1899 ] }, { - "teal": 1950, - "source": 481, + "teal": 1954, + "source": 486, "pc": [ 1900, 1901 ] }, { - "teal": 1951, - "source": 481, + "teal": 1955, + "source": 486, "pc": [ 1902, 1903 ] }, { - "teal": 1952, - "source": 481, + "teal": 1956, + "source": 486, "pc": [ 1904 ] }, { - "teal": 1953, - "source": 481, + "teal": 1957, + "source": 486, "pc": [ 1905, 1906, @@ -9567,217 +9582,217 @@ ] }, { - "teal": 1954, - "source": 481, + "teal": 1958, + "source": 486, "pc": [ 1908 ] }, { - "teal": 1955, - "source": 481, + "teal": 1959, + "source": 486, "pc": [ 1909, 1910 ] }, { - "teal": 1956, - "source": 481, + "teal": 1960, + "source": 486, "pc": [ 1911 ] }, { - "teal": 1957, - "source": 481, + "teal": 1961, + "source": 486, "pc": [ 1912 ] }, { - "teal": 1958, - "source": 481, + "teal": 1962, + "source": 486, "pc": [ 1913, 1914 ] }, { - "teal": 1959, - "source": 481, + "teal": 1963, + "source": 486, "pc": [ 1915 ] }, { - "teal": 1963, - "source": 484, + "teal": 1967, + "source": 489, "pc": [ 1916, 1917 ] }, { - "teal": 1964, - "source": 484, + "teal": 1968, + "source": 489, "pc": [ 1918, 1919 ] }, { - "teal": 1968, - "source": 485, + "teal": 1972, + "source": 490, "pc": [ 1920, 1921 ] }, { - "teal": 1969, - "source": 485, + "teal": 1973, + "source": 490, "pc": [ 1922, 1923 ] }, { - "teal": 1970, - "source": 485, + "teal": 1974, + "source": 490, "pc": [ 1924 ] }, { - "teal": 1971, - "source": 485, + "teal": 1975, + "source": 490, "pc": [ 1925 ] }, { - "teal": 1972, - "source": 485, + "teal": 1976, + "source": 490, "pc": [ 1926, 1927 ] }, { - "teal": 1973, - "source": 485, + "teal": 1977, + "source": 490, "pc": [ 1928 ] }, { - "teal": 1974, - "source": 485, + "teal": 1978, + "source": 490, "pc": [ 1929 ] }, { - "teal": 1975, - "source": 485, + "teal": 1979, + "source": 490, "pc": [ 1930 ] }, { - "teal": 1976, - "source": 485, + "teal": 1980, + "source": 490, "pc": [ 1931 ] }, { - "teal": 1977, - "source": 485, + "teal": 1981, + "source": 490, "pc": [ 1932, 1933 ] }, { - "teal": 1978, - "source": 485, + "teal": 1982, + "source": 490, "pc": [ 1934 ] }, { - "teal": 1979, - "source": 485, + "teal": 1983, + "source": 490, "pc": [ 1935 ] }, { - "teal": 1980, - "source": 485, + "teal": 1984, + "source": 490, "pc": [ 1936, 1937 ] }, { - "teal": 1981, - "source": 485, + "teal": 1985, + "source": 490, "pc": [ 1938 ] }, { - "teal": 1982, - "source": 485, + "teal": 1986, + "source": 490, "pc": [ 1939 ] }, { - "teal": 1983, - "source": 485, + "teal": 1987, + "source": 490, "pc": [ 1940, 1941 ] }, { - "teal": 1984, - "source": 485, + "teal": 1988, + "source": 490, "pc": [ 1942 ] }, { - "teal": 1988, - "source": 486, + "teal": 1992, + "source": 491, "pc": [ 1943, 1944 ] }, { - "teal": 1989, - "source": 486, + "teal": 1993, + "source": 491, "pc": [ 1945, 1946 ] }, { - "teal": 1990, - "source": 486, + "teal": 1994, + "source": 491, "pc": [ 1947, 1948 ] }, { - "teal": 1991, - "source": 486, + "teal": 1995, + "source": 491, "pc": [ 1949, 1950, @@ -9785,8 +9800,8 @@ ] }, { - "teal": 1999, - "source": 488, + "teal": 2003, + "source": 493, "pc": [ 1952, 1953, @@ -9797,75 +9812,75 @@ ] }, { - "teal": 2000, - "source": 489, + "teal": 2004, + "source": 494, "pc": [ 1958, 1959 ] }, { - "teal": 2001, - "source": 489, + "teal": 2005, + "source": 494, "pc": [ 1960 ] }, { - "teal": 2002, - "source": 490, + "teal": 2006, + "source": 495, "pc": [ 1961, 1962 ] }, { - "teal": 2003, - "source": 490, + "teal": 2007, + "source": 495, "pc": [ 1963 ] }, { - "teal": 2004, - "source": 490, + "teal": 2008, + "source": 495, "pc": [ 1964 ] }, { - "teal": 2005, - "source": 490, + "teal": 2009, + "source": 495, "pc": [ 1965 ] }, { - "teal": 2006, - "source": 490, + "teal": 2010, + "source": 495, "pc": [ 1966, 1967 ] }, { - "teal": 2007, - "source": 490, + "teal": 2011, + "source": 495, "pc": [ 1968 ] }, { - "teal": 2010, - "source": 490, + "teal": 2014, + "source": 495, "errorMessage": "numPools as uint16 overflowed 16 bits", "pc": [ 1969 ] }, { - "teal": 2011, - "source": 490, + "teal": 2015, + "source": 495, "pc": [ 1970, 1971, @@ -9873,140 +9888,140 @@ ] }, { - "teal": 2012, - "source": 490, + "teal": 2016, + "source": 495, "pc": [ 1973 ] }, { - "teal": 2013, - "source": 491, + "teal": 2017, + "source": 496, "pc": [ 1974, 1975 ] }, { - "teal": 2014, - "source": 491, + "teal": 2018, + "source": 496, "pc": [ 1976 ] }, { - "teal": 2015, - "source": 491, + "teal": 2019, + "source": 496, "pc": [ 1977 ] }, { - "teal": 2016, - "source": 488, + "teal": 2020, + "source": 493, "pc": [ 1978 ] }, { - "teal": 2017, - "source": 488, + "teal": 2021, + "source": 493, "pc": [ 1979 ] }, { - "teal": 2021, - "source": 494, + "teal": 2025, + "source": 499, "pc": [ 1980, 1981 ] }, { - "teal": 2022, - "source": 494, + "teal": 2026, + "source": 499, "pc": [ 1982 ] }, { - "teal": 2023, - "source": 494, + "teal": 2027, + "source": 499, "pc": [ 1983, 1984 ] }, { - "teal": 2024, - "source": 494, + "teal": 2028, + "source": 499, "pc": [ 1985 ] }, { - "teal": 2025, - "source": 494, + "teal": 2029, + "source": 499, "pc": [ 1986 ] }, { - "teal": 2026, - "source": 494, + "teal": 2030, + "source": 499, "pc": [ 1987, 1988 ] }, { - "teal": 2027, - "source": 494, + "teal": 2031, + "source": 499, "pc": [ 1989 ] }, { - "teal": 2028, - "source": 494, + "teal": 2032, + "source": 499, "pc": [ 1990 ] }, { - "teal": 2031, - "source": 446, + "teal": 2035, + "source": 451, "pc": [ 1991, 1992 ] }, { - "teal": 2034, - "source": 446, + "teal": 2038, + "source": 451, "pc": [ 1993, 1994 ] }, { - "teal": 2035, - "source": 446, + "teal": 2039, + "source": 451, "pc": [ 1995 ] }, { - "teal": 2040, - "source": 506, + "teal": 2044, + "source": 511, "pc": [ 1996 ] }, { - "teal": 2043, - "source": 506, + "teal": 2047, + "source": 511, "pc": [ 1997, 1998, @@ -10014,15 +10029,15 @@ ] }, { - "teal": 2044, - "source": 506, + "teal": 2048, + "source": 511, "pc": [ 2000 ] }, { - "teal": 2047, - "source": 506, + "teal": 2051, + "source": 511, "pc": [ 2001, 2002, @@ -10030,74 +10045,74 @@ ] }, { - "teal": 2048, - "source": 506, + "teal": 2052, + "source": 511, "pc": [ 2004 ] }, { - "teal": 2051, - "source": 506, + "teal": 2055, + "source": 511, "pc": [ 2005, 2006 ] }, { - "teal": 2052, - "source": 506, + "teal": 2056, + "source": 511, "pc": [ 2007 ] }, { - "teal": 2053, - "source": 506, + "teal": 2057, + "source": 511, "pc": [ 2008 ] }, { - "teal": 2054, - "source": 506, + "teal": 2058, + "source": 511, "pc": [ 2009 ] }, { - "teal": 2055, - "source": 506, + "teal": 2059, + "source": 511, "pc": [ 2010, 2011 ] }, { - "teal": 2056, - "source": 506, + "teal": 2060, + "source": 511, "pc": [ 2012 ] }, { - "teal": 2057, - "source": 506, + "teal": 2061, + "source": 511, "pc": [ 2013 ] }, { - "teal": 2060, - "source": 506, + "teal": 2064, + "source": 511, "errorMessage": "argument 2 (stakedAmountPayment) for addStake must be a pay transaction", "pc": [ 2014 ] }, { - "teal": 2063, - "source": 506, + "teal": 2067, + "source": 511, "pc": [ 2015, 2016, @@ -10105,36 +10120,36 @@ ] }, { - "teal": 2064, - "source": 506, + "teal": 2068, + "source": 511, "pc": [ 2018 ] }, { - "teal": 2065, - "source": 506, + "teal": 2069, + "source": 511, "pc": [ 2019 ] }, { - "teal": 2066, - "source": 506, + "teal": 2070, + "source": 511, "pc": [ 2020 ] }, { - "teal": 2067, - "source": 506, + "teal": 2071, + "source": 511, "pc": [ 2021 ] }, { - "teal": 2079, - "source": 506, + "teal": 2083, + "source": 511, "pc": [ 2022, 2023, @@ -10142,161 +10157,161 @@ ] }, { - "teal": 2082, - "source": 506, + "teal": 2086, + "source": 511, "pc": [ 2025 ] }, { - "teal": 2083, - "source": 506, + "teal": 2087, + "source": 511, "pc": [ 2026, 2027 ] }, { - "teal": 2087, - "source": 507, + "teal": 2091, + "source": 512, "pc": [ 2028 ] }, { - "teal": 2088, - "source": 507, + "teal": 2092, + "source": 512, "pc": [ 2029, 2030 ] }, { - "teal": 2089, - "source": 507, + "teal": 2093, + "source": 512, "pc": [ 2031 ] }, { - "teal": 2090, - "source": 507, + "teal": 2094, + "source": 512, "pc": [ 2032 ] }, { - "teal": 2091, - "source": 507, + "teal": 2095, + "source": 512, "pc": [ 2033 ] }, { - "teal": 2092, - "source": 507, + "teal": 2096, + "source": 512, "pc": [ 2034 ] }, { - "teal": 2093, - "source": 507, + "teal": 2097, + "source": 512, "pc": [ 2035 ] }, { - "teal": 2096, - "source": 507, + "teal": 2100, + "source": 512, "errorMessage": "specified validator id isn't valid", "pc": [ 2036 ] }, { - "teal": 2101, - "source": 510, + "teal": 2105, + "source": 515, "pc": [ 2037, 2038 ] }, { - "teal": 2102, - "source": 510, + "teal": 2106, + "source": 515, "pc": [ 2039 ] }, { - "teal": 2103, - "source": 510, + "teal": 2107, + "source": 515, "pc": [ 2040 ] }, { - "teal": 2104, - "source": 510, + "teal": 2108, + "source": 515, "pc": [ 2041, 2042 ] }, { - "teal": 2105, - "source": 510, + "teal": 2109, + "source": 515, "pc": [ 2043 ] }, { - "teal": 2106, - "source": 510, + "teal": 2110, + "source": 515, "pc": [ 2044 ] }, { - "teal": 2107, - "source": 510, + "teal": 2111, + "source": 515, "pc": [ 2045, 2046 ] }, { - "teal": 2108, - "source": 510, + "teal": 2112, + "source": 515, "pc": [ 2047 ] }, { - "teal": 2109, - "source": 510, + "teal": 2113, + "source": 515, "pc": [ 2048 ] }, { - "teal": 2110, - "source": 510, + "teal": 2114, + "source": 515, "pc": [ 2049 ] }, { - "teal": 2111, - "source": 510, + "teal": 2115, + "source": 515, "pc": [ 2050 ] }, { - "teal": 2112, - "source": 510, + "teal": 2116, + "source": 515, "pc": [ 2051, 2052, @@ -10304,207 +10319,207 @@ ] }, { - "teal": 2120, - "source": 513, + "teal": 2124, + "source": 518, "pc": [ 2054, 2055 ] }, { - "teal": 2121, - "source": 513, + "teal": 2125, + "source": 518, "pc": [ 2056 ] }, { - "teal": 2122, - "source": 513, + "teal": 2126, + "source": 518, "pc": [ 2057 ] }, { - "teal": 2123, - "source": 513, + "teal": 2127, + "source": 518, "pc": [ 2058, 2059 ] }, { - "teal": 2124, - "source": 513, + "teal": 2128, + "source": 518, "pc": [ 2060 ] }, { - "teal": 2125, - "source": 513, + "teal": 2129, + "source": 518, "pc": [ 2061 ] }, { - "teal": 2126, - "source": 513, + "teal": 2130, + "source": 518, "pc": [ 2062, 2063 ] }, { - "teal": 2127, - "source": 513, + "teal": 2131, + "source": 518, "pc": [ 2064 ] }, { - "teal": 2128, - "source": 513, + "teal": 2132, + "source": 518, "pc": [ 2065 ] }, { - "teal": 2129, - "source": 513, + "teal": 2133, + "source": 518, "pc": [ 2066, 2067 ] }, { - "teal": 2130, - "source": 513, + "teal": 2134, + "source": 518, "pc": [ 2068 ] }, { - "teal": 2133, - "source": 512, + "teal": 2137, + "source": 517, "errorMessage": "can't stake with a validator that is past its sunsetting time", "pc": [ 2069 ] }, { - "teal": 2138, - "source": 518, + "teal": 2142, + "source": 523, "pc": [ 2070, 2071 ] }, { - "teal": 2139, - "source": 518, + "teal": 2143, + "source": 523, "pc": [ 2072, 2073 ] }, { - "teal": 2147, - "source": 522, + "teal": 2151, + "source": 527, "pc": [ 2074, 2075 ] }, { - "teal": 2148, - "source": 523, + "teal": 2152, + "source": 528, "pc": [ 2076, 2077 ] }, { - "teal": 2149, - "source": 523, + "teal": 2153, + "source": 528, "pc": [ 2078, 2079 ] }, { - "teal": 2150, - "source": 523, + "teal": 2154, + "source": 528, "pc": [ 2080 ] }, { - "teal": 2153, - "source": 523, + "teal": 2157, + "source": 528, "errorMessage": "transaction verification failed: {\"txn\":\"stakedAmountPayment\",\"field\":\"sender\",\"expected\":\"staker\"}", "pc": [ 2081 ] }, { - "teal": 2156, - "source": 522, + "teal": 2160, + "source": 527, "pc": [ 2082, 2083 ] }, { - "teal": 2157, - "source": 524, + "teal": 2161, + "source": 529, "pc": [ 2084, 2085 ] }, { - "teal": 2158, - "source": 524, + "teal": 2162, + "source": 529, "pc": [ 2086, 2087 ] }, { - "teal": 2159, - "source": 524, + "teal": 2163, + "source": 529, "pc": [ 2088 ] }, { - "teal": 2162, - "source": 524, + "teal": 2166, + "source": 529, "errorMessage": "transaction verification failed: {\"txn\":\"stakedAmountPayment\",\"field\":\"receiver\",\"expected\":\"this.app.address\"}", "pc": [ 2089 ] }, { - "teal": 2166, - "source": 530, + "teal": 2170, + "source": 535, "pc": [ 2090, 2091 ] }, { - "teal": 2167, - "source": 530, + "teal": 2171, + "source": 535, "pc": [ 2092, 2093 ] }, { - "teal": 2168, - "source": 530, + "teal": 2172, + "source": 535, "pc": [ 2094, 2095, @@ -10512,55 +10527,55 @@ ] }, { - "teal": 2172, - "source": 532, + "teal": 2176, + "source": 537, "pc": [ 2097, 2098 ] }, { - "teal": 2173, - "source": 532, + "teal": 2177, + "source": 537, "pc": [ 2099, 2100 ] }, { - "teal": 2174, - "source": 532, + "teal": 2178, + "source": 537, "pc": [ 2101, 2102 ] }, { - "teal": 2178, - "source": 533, + "teal": 2182, + "source": 538, "pc": [ 2103 ] }, { - "teal": 2179, - "source": 533, + "teal": 2183, + "source": 538, "pc": [ 2104, 2105 ] }, { - "teal": 2184, - "source": 535, + "teal": 2188, + "source": 540, "pc": [ 2106, 2107 ] }, { - "teal": 2185, - "source": 535, + "teal": 2189, + "source": 540, "pc": [ 2108, 2109, @@ -10568,8 +10583,8 @@ ] }, { - "teal": 2186, - "source": 535, + "teal": 2190, + "source": 540, "pc": [ 2111, 2112, @@ -10577,8 +10592,8 @@ ] }, { - "teal": 2191, - "source": 538, + "teal": 2195, + "source": 543, "pc": [ 2114, 2115, @@ -10586,8 +10601,8 @@ ] }, { - "teal": 2192, - "source": 538, + "teal": 2196, + "source": 543, "pc": [ 2117, 2118, @@ -10595,76 +10610,76 @@ ] }, { - "teal": 2193, - "source": 538, + "teal": 2197, + "source": 543, "pc": [ 2120 ] }, { - "teal": 2194, - "source": 538, + "teal": 2198, + "source": 543, "pc": [ 2121, 2122 ] }, { - "teal": 2198, - "source": 539, + "teal": 2202, + "source": 544, "pc": [ 2123, 2124 ] }, { - "teal": 2199, - "source": 539, + "teal": 2203, + "source": 544, "pc": [ 2125, 2126 ] }, { - "teal": 2200, - "source": 539, + "teal": 2204, + "source": 544, "pc": [ 2127 ] }, { - "teal": 2201, - "source": 539, + "teal": 2205, + "source": 544, "pc": [ 2128, 2129 ] }, { - "teal": 2205, - "source": 540, + "teal": 2209, + "source": 545, "pc": [ 2130 ] }, { - "teal": 2206, - "source": 540, + "teal": 2210, + "source": 545, "pc": [ 2131, 2132 ] }, { - "teal": 2207, - "source": 540, + "teal": 2211, + "source": 545, "pc": [ 2133 ] }, { - "teal": 2208, - "source": 540, + "teal": 2212, + "source": 545, "pc": [ 2134, 2135, @@ -10672,103 +10687,103 @@ ] }, { - "teal": 2209, - "source": 540, + "teal": 2213, + "source": 545, "pc": [ 2137 ] }, { - "teal": 2210, - "source": 540, + "teal": 2214, + "source": 545, "pc": [ 2138 ] }, { - "teal": 2218, - "source": 545, + "teal": 2222, + "source": 550, "pc": [ 2139, 2140 ] }, { - "teal": 2219, - "source": 545, + "teal": 2223, + "source": 550, "pc": [ 2141 ] }, { - "teal": 2220, - "source": 545, + "teal": 2224, + "source": 550, "pc": [ 2142 ] }, { - "teal": 2221, - "source": 545, + "teal": 2225, + "source": 550, "pc": [ 2143, 2144 ] }, { - "teal": 2222, - "source": 545, + "teal": 2226, + "source": 550, "pc": [ 2145 ] }, { - "teal": 2223, - "source": 545, + "teal": 2227, + "source": 550, "pc": [ 2146 ] }, { - "teal": 2224, - "source": 545, + "teal": 2228, + "source": 550, "pc": [ 2147, 2148 ] }, { - "teal": 2225, - "source": 545, + "teal": 2229, + "source": 550, "pc": [ 2149 ] }, { - "teal": 2226, - "source": 545, + "teal": 2230, + "source": 550, "pc": [ 2150 ] }, { - "teal": 2227, - "source": 545, + "teal": 2231, + "source": 550, "pc": [ 2151, 2152 ] }, { - "teal": 2228, - "source": 545, + "teal": 2232, + "source": 550, "pc": [ 2153 ] }, { - "teal": 2229, - "source": 545, + "teal": 2233, + "source": 550, "pc": [ 2154, 2155, @@ -10776,47 +10791,47 @@ ] }, { - "teal": 2230, - "source": 545, + "teal": 2234, + "source": 550, "pc": [ 2157 ] }, { - "teal": 2233, - "source": 544, + "teal": 2237, + "source": 549, "errorMessage": "total staked for all of a validators pools may not exceed hard cap", "pc": [ 2158 ] }, { - "teal": 2237, - "source": 551, + "teal": 2241, + "source": 556, "pc": [ 2159, 2160 ] }, { - "teal": 2238, - "source": 551, + "teal": 2242, + "source": 556, "pc": [ 2161, 2162 ] }, { - "teal": 2239, - "source": 551, + "teal": 2243, + "source": 556, "pc": [ 2163, 2164 ] }, { - "teal": 2240, - "source": 551, + "teal": 2244, + "source": 556, "pc": [ 2165, 2166, @@ -10824,87 +10839,87 @@ ] }, { - "teal": 2241, - "source": 551, + "teal": 2245, + "source": 556, "pc": [ 2168, 2169 ] }, { - "teal": 2247, - "source": 553, + "teal": 2251, + "source": 558, "pc": [ 2170, 2171 ] }, { - "teal": 2248, - "source": 553, + "teal": 2252, + "source": 558, "pc": [ 2172, 2173 ] }, { - "teal": 2249, - "source": 553, + "teal": 2253, + "source": 558, "pc": [ 2174, 2175 ] }, { - "teal": 2250, - "source": 553, + "teal": 2254, + "source": 558, "pc": [ 2176, 2177 ] }, { - "teal": 2251, - "source": 553, + "teal": 2255, + "source": 558, "pc": [ 2178 ] }, { - "teal": 2252, - "source": 553, + "teal": 2256, + "source": 558, "pc": [ 2179, 2180 ] }, { - "teal": 2256, - "source": 554, + "teal": 2260, + "source": 559, "pc": [ 2181, 2182 ] }, { - "teal": 2257, - "source": 554, + "teal": 2261, + "source": 559, "pc": [ 2183, 2184 ] }, { - "teal": 2258, - "source": 554, + "teal": 2262, + "source": 559, "pc": [ 2185, 2186 ] }, { - "teal": 2259, - "source": 554, + "teal": 2263, + "source": 559, "pc": [ 2187, 2188, @@ -10912,47 +10927,47 @@ ] }, { - "teal": 2260, - "source": 554, + "teal": 2264, + "source": 559, "pc": [ 2190 ] }, { - "teal": 2261, - "source": 554, + "teal": 2265, + "source": 559, "pc": [ 2191, 2192 ] }, { - "teal": 2266, - "source": 555, + "teal": 2270, + "source": 560, "pc": [ 2193, 2194 ] }, { - "teal": 2267, - "source": 555, + "teal": 2271, + "source": 560, "pc": [ 2195, 2196 ] }, { - "teal": 2268, - "source": 555, + "teal": 2272, + "source": 560, "pc": [ 2197, 2198 ] }, { - "teal": 2269, - "source": 555, + "teal": 2273, + "source": 560, "pc": [ 2199, 2200, @@ -10960,29 +10975,29 @@ ] }, { - "teal": 2270, - "source": 555, + "teal": 2274, + "source": 560, "pc": [ 2202 ] }, { - "teal": 2271, - "source": 555, + "teal": 2275, + "source": 560, "pc": [ 2203 ] }, { - "teal": 2272, - "source": 555, + "teal": 2276, + "source": 560, "pc": [ 2204 ] }, { - "teal": 2273, - "source": 555, + "teal": 2277, + "source": 560, "pc": [ 2205, 2206, @@ -10990,40 +11005,40 @@ ] }, { - "teal": 2277, - "source": 556, + "teal": 2281, + "source": 561, "errorMessage": "No pool available with free stake. Validator needs to add another pool", "pc": [ 2208 ] }, { - "teal": 2282, - "source": 560, + "teal": 2286, + "source": 565, "pc": [ 2209, 2210 ] }, { - "teal": 2283, - "source": 560, + "teal": 2287, + "source": 565, "pc": [ 2211, 2212 ] }, { - "teal": 2284, - "source": 560, + "teal": 2288, + "source": 565, "pc": [ 2213, 2214 ] }, { - "teal": 2285, - "source": 560, + "teal": 2289, + "source": 565, "pc": [ 2215, 2216, @@ -11031,16 +11046,16 @@ ] }, { - "teal": 2286, - "source": 560, + "teal": 2290, + "source": 565, "pc": [ 2218, 2219 ] }, { - "teal": 2287, - "source": 560, + "teal": 2291, + "source": 565, "pc": [ 2220, 2221, @@ -11048,56 +11063,56 @@ ] }, { - "teal": 2297, - "source": 568, + "teal": 2301, + "source": 573, "pc": [ 2223, 2224 ] }, { - "teal": 2298, - "source": 567, + "teal": 2302, + "source": 572, "pc": [ 2225, 2226 ] }, { - "teal": 2299, - "source": 566, + "teal": 2303, + "source": 571, "pc": [ 2227, 2228 ] }, { - "teal": 2300, - "source": 565, + "teal": 2304, + "source": 570, "pc": [ 2229, 2230 ] }, { - "teal": 2301, - "source": 565, + "teal": 2305, + "source": 570, "pc": [ 2231, 2232 ] }, { - "teal": 2302, - "source": 565, + "teal": 2306, + "source": 570, "pc": [ 2233, 2234 ] }, { - "teal": 2303, - "source": 565, + "teal": 2307, + "source": 570, "pc": [ 2235, 2236, @@ -11105,16 +11120,16 @@ ] }, { - "teal": 2304, - "source": 564, + "teal": 2308, + "source": 569, "pc": [ 2238, 2239 ] }, { - "teal": 2305, - "source": 563, + "teal": 2309, + "source": 568, "pc": [ 2240, 2241, @@ -11122,8 +11137,8 @@ ] }, { - "teal": 2315, - "source": 570, + "teal": 2319, + "source": 575, "pc": [ 2243, 2244, @@ -11134,47 +11149,47 @@ ] }, { - "teal": 2316, - "source": 571, + "teal": 2320, + "source": 576, "pc": [ 2249, 2250 ] }, { - "teal": 2317, - "source": 571, + "teal": 2321, + "source": 576, "pc": [ 2251 ] }, { - "teal": 2318, - "source": 572, + "teal": 2322, + "source": 577, "pc": [ 2252, 2253 ] }, { - "teal": 2319, - "source": 572, + "teal": 2323, + "source": 577, "pc": [ 2254, 2255 ] }, { - "teal": 2320, - "source": 572, + "teal": 2324, + "source": 577, "pc": [ 2256, 2257 ] }, { - "teal": 2321, - "source": 572, + "teal": 2325, + "source": 577, "pc": [ 2258, 2259, @@ -11182,59 +11197,59 @@ ] }, { - "teal": 2322, - "source": 572, + "teal": 2326, + "source": 577, "pc": [ 2261 ] }, { - "teal": 2323, - "source": 572, + "teal": 2327, + "source": 577, "pc": [ 2262 ] }, { - "teal": 2324, - "source": 572, + "teal": 2328, + "source": 577, "pc": [ 2263 ] }, { - "teal": 2325, - "source": 572, + "teal": 2329, + "source": 577, "pc": [ 2264 ] }, { - "teal": 2326, - "source": 572, + "teal": 2330, + "source": 577, "pc": [ 2265, 2266 ] }, { - "teal": 2327, - "source": 572, + "teal": 2331, + "source": 577, "pc": [ 2267 ] }, { - "teal": 2330, - "source": 572, + "teal": 2334, + "source": 577, "errorMessage": "poolKey.poolId as uint16 overflowed 16 bits", "pc": [ 2268 ] }, { - "teal": 2331, - "source": 572, + "teal": 2335, + "source": 577, "pc": [ 2269, 2270, @@ -11242,39 +11257,39 @@ ] }, { - "teal": 2332, - "source": 572, + "teal": 2336, + "source": 577, "pc": [ 2272 ] }, { - "teal": 2333, - "source": 573, + "teal": 2337, + "source": 578, "pc": [ 2273, 2274 ] }, { - "teal": 2334, - "source": 573, + "teal": 2338, + "source": 578, "pc": [ 2275, 2276 ] }, { - "teal": 2335, - "source": 573, + "teal": 2339, + "source": 578, "pc": [ 2277, 2278 ] }, { - "teal": 2336, - "source": 573, + "teal": 2340, + "source": 578, "pc": [ 2279, 2280, @@ -11282,104 +11297,104 @@ ] }, { - "teal": 2337, - "source": 573, + "teal": 2341, + "source": 578, "pc": [ 2282 ] }, { - "teal": 2338, - "source": 573, + "teal": 2342, + "source": 578, "pc": [ 2283 ] }, { - "teal": 2339, - "source": 573, + "teal": 2343, + "source": 578, "pc": [ 2284 ] }, { - "teal": 2340, - "source": 575, + "teal": 2344, + "source": 580, "pc": [ 2285, 2286 ] }, { - "teal": 2341, - "source": 575, + "teal": 2345, + "source": 580, "pc": [ 2287 ] }, { - "teal": 2342, - "source": 574, + "teal": 2346, + "source": 579, "pc": [ 2288, 2289 ] }, { - "teal": 2343, - "source": 574, + "teal": 2347, + "source": 579, "pc": [ 2290 ] }, { - "teal": 2344, - "source": 574, + "teal": 2348, + "source": 579, "pc": [ 2291 ] }, { - "teal": 2345, - "source": 570, + "teal": 2349, + "source": 575, "pc": [ 2292 ] }, { - "teal": 2346, - "source": 570, + "teal": 2350, + "source": 575, "pc": [ 2293 ] }, { - "teal": 2350, - "source": 578, + "teal": 2354, + "source": 583, "pc": [ 2294, 2295 ] }, { - "teal": 2351, - "source": 578, + "teal": 2355, + "source": 583, "pc": [ 2296, 2297 ] }, { - "teal": 2352, - "source": 578, + "teal": 2356, + "source": 583, "pc": [ 2298, 2299 ] }, { - "teal": 2353, - "source": 578, + "teal": 2357, + "source": 583, "pc": [ 2300, 2301, @@ -11387,38 +11402,38 @@ ] }, { - "teal": 2356, - "source": 506, + "teal": 2360, + "source": 511, "pc": [ 2303, 2304 ] }, { - "teal": 2359, - "source": 506, + "teal": 2363, + "source": 511, "pc": [ 2305, 2306 ] }, { - "teal": 2360, - "source": 506, + "teal": 2364, + "source": 511, "pc": [ 2307 ] }, { - "teal": 2365, - "source": 596, + "teal": 2369, + "source": 601, "pc": [ 2308 ] }, { - "teal": 2368, - "source": 596, + "teal": 2372, + "source": 601, "pc": [ 2309, 2310, @@ -11426,15 +11441,15 @@ ] }, { - "teal": 2369, - "source": 596, + "teal": 2373, + "source": 601, "pc": [ 2312 ] }, { - "teal": 2372, - "source": 596, + "teal": 2376, + "source": 601, "pc": [ 2313, 2314, @@ -11442,36 +11457,36 @@ ] }, { - "teal": 2373, - "source": 596, + "teal": 2377, + "source": 601, "pc": [ 2316 ] }, { - "teal": 2374, - "source": 596, + "teal": 2378, + "source": 601, "pc": [ 2317 ] }, { - "teal": 2375, - "source": 596, + "teal": 2379, + "source": 601, "pc": [ 2318 ] }, { - "teal": 2376, - "source": 596, + "teal": 2380, + "source": 601, "pc": [ 2319 ] }, { - "teal": 2394, - "source": 596, + "teal": 2398, + "source": 601, "pc": [ 2320, 2321, @@ -11479,164 +11494,164 @@ ] }, { - "teal": 2397, - "source": 596, + "teal": 2401, + "source": 601, "pc": [ 2323 ] }, { - "teal": 2398, - "source": 596, + "teal": 2402, + "source": 601, "pc": [ 2324, 2325 ] }, { - "teal": 2402, - "source": 598, + "teal": 2406, + "source": 603, "pc": [ 2326, 2327 ] }, { - "teal": 2403, - "source": 598, + "teal": 2407, + "source": 603, "pc": [ 2328 ] }, { - "teal": 2404, - "source": 598, + "teal": 2408, + "source": 603, "pc": [ 2329 ] }, { - "teal": 2405, - "source": 598, + "teal": 2409, + "source": 603, "pc": [ 2330, 2331 ] }, { - "teal": 2406, - "source": 598, + "teal": 2410, + "source": 603, "pc": [ 2332 ] }, { - "teal": 2407, - "source": 598, + "teal": 2411, + "source": 603, "pc": [ 2333 ] }, { - "teal": 2408, - "source": 598, + "teal": 2412, + "source": 603, "pc": [ 2334, 2335 ] }, { - "teal": 2409, - "source": 598, + "teal": 2413, + "source": 603, "pc": [ 2336 ] }, { - "teal": 2410, - "source": 598, + "teal": 2414, + "source": 603, "pc": [ 2337 ] }, { - "teal": 2411, - "source": 598, + "teal": 2415, + "source": 603, "pc": [ 2338, 2339 ] }, { - "teal": 2415, - "source": 599, + "teal": 2419, + "source": 604, "pc": [ 2340, 2341 ] }, { - "teal": 2416, - "source": 599, + "teal": 2420, + "source": 604, "pc": [ 2342 ] }, { - "teal": 2417, - "source": 599, + "teal": 2421, + "source": 604, "pc": [ 2343 ] }, { - "teal": 2418, - "source": 599, + "teal": 2422, + "source": 604, "pc": [ 2344 ] }, { - "teal": 2423, - "source": 601, + "teal": 2427, + "source": 606, "pc": [ 2345, 2346 ] }, { - "teal": 2424, - "source": 601, + "teal": 2428, + "source": 606, "pc": [ 2347, 2348 ] }, { - "teal": 2425, - "source": 601, + "teal": 2429, + "source": 606, "pc": [ 2349, 2350 ] }, { - "teal": 2426, - "source": 601, + "teal": 2430, + "source": 606, "pc": [ 2351 ] }, { - "teal": 2427, - "source": 601, + "teal": 2431, + "source": 606, "pc": [ 2352 ] }, { - "teal": 2428, - "source": 601, + "teal": 2432, + "source": 606, "pc": [ 2353, 2354, @@ -11644,68 +11659,68 @@ ] }, { - "teal": 2433, - "source": 602, + "teal": 2437, + "source": 607, "pc": [ 2356, 2357 ] }, { - "teal": 2434, - "source": 602, + "teal": 2438, + "source": 607, "pc": [ 2358, 2359 ] }, { - "teal": 2435, - "source": 602, + "teal": 2439, + "source": 607, "pc": [ 2360 ] }, { - "teal": 2436, - "source": 602, + "teal": 2440, + "source": 607, "pc": [ 2361, 2362 ] }, { - "teal": 2437, - "source": 602, + "teal": 2441, + "source": 607, "pc": [ 2363 ] }, { - "teal": 2438, - "source": 602, + "teal": 2442, + "source": 607, "pc": [ 2364 ] }, { - "teal": 2439, - "source": 602, + "teal": 2443, + "source": 607, "pc": [ 2365, 2366 ] }, { - "teal": 2440, - "source": 602, + "teal": 2444, + "source": 607, "pc": [ 2367 ] }, { - "teal": 2441, - "source": 602, + "teal": 2445, + "source": 607, "pc": [ 2368, 2369, @@ -11713,120 +11728,120 @@ ] }, { - "teal": 2446, - "source": 608, + "teal": 2450, + "source": 613, "pc": [ 2371, 2372 ] }, { - "teal": 2447, - "source": 608, + "teal": 2451, + "source": 613, "pc": [ 2373, 2374 ] }, { - "teal": 2451, - "source": 609, + "teal": 2455, + "source": 614, "pc": [ 2375, 2376 ] }, { - "teal": 2452, - "source": 609, + "teal": 2456, + "source": 614, "pc": [ 2377 ] }, { - "teal": 2453, - "source": 609, + "teal": 2457, + "source": 614, "pc": [ 2378 ] }, { - "teal": 2454, - "source": 609, + "teal": 2458, + "source": 614, "pc": [ 2379, 2380 ] }, { - "teal": 2455, - "source": 609, + "teal": 2459, + "source": 614, "pc": [ 2381 ] }, { - "teal": 2456, - "source": 609, + "teal": 2460, + "source": 614, "pc": [ 2382 ] }, { - "teal": 2457, - "source": 609, + "teal": 2461, + "source": 614, "pc": [ 2383, 2384 ] }, { - "teal": 2458, - "source": 609, + "teal": 2462, + "source": 614, "pc": [ 2385 ] }, { - "teal": 2459, - "source": 609, + "teal": 2463, + "source": 614, "pc": [ 2386 ] }, { - "teal": 2460, - "source": 609, + "teal": 2464, + "source": 614, "pc": [ 2387, 2388 ] }, { - "teal": 2465, - "source": 610, + "teal": 2469, + "source": 615, "pc": [ 2389, 2390 ] }, { - "teal": 2466, - "source": 610, + "teal": 2470, + "source": 615, "pc": [ 2391 ] }, { - "teal": 2467, - "source": 610, + "teal": 2471, + "source": 615, "pc": [ 2392 ] }, { - "teal": 2468, - "source": 610, + "teal": 2472, + "source": 615, "pc": [ 2393, 2394, @@ -11834,16 +11849,16 @@ ] }, { - "teal": 2474, - "source": 612, + "teal": 2478, + "source": 617, "pc": [ 2396, 2397 ] }, { - "teal": 2475, - "source": 612, + "teal": 2479, + "source": 617, "pc": [ 2398, 2399, @@ -11860,38 +11875,38 @@ ] }, { - "teal": 2476, - "source": 612, + "teal": 2480, + "source": 617, "pc": [ 2410 ] }, { - "teal": 2479, - "source": 612, + "teal": 2483, + "source": 617, "errorMessage": "global state value does not exist: AppID.fromUint64(pool1AppID).globalState('lastPayout')", "pc": [ 2411 ] }, { - "teal": 2480, - "source": 612, + "teal": 2484, + "source": 617, "pc": [ 2412, 2413 ] }, { - "teal": 2481, - "source": 612, + "teal": 2485, + "source": 617, "pc": [ 2414 ] }, { - "teal": 2482, - "source": 612, + "teal": 2486, + "source": 617, "pc": [ 2415, 2416, @@ -11899,68 +11914,68 @@ ] }, { - "teal": 2487, - "source": 613, + "teal": 2491, + "source": 618, "pc": [ 2418, 2419 ] }, { - "teal": 2488, - "source": 613, + "teal": 2492, + "source": 618, "pc": [ 2420, 2421 ] }, { - "teal": 2489, - "source": 613, + "teal": 2493, + "source": 618, "pc": [ 2422 ] }, { - "teal": 2490, - "source": 613, + "teal": 2494, + "source": 618, "pc": [ 2423, 2424 ] }, { - "teal": 2491, - "source": 613, + "teal": 2495, + "source": 618, "pc": [ 2425 ] }, { - "teal": 2492, - "source": 613, + "teal": 2496, + "source": 618, "pc": [ 2426 ] }, { - "teal": 2493, - "source": 613, + "teal": 2497, + "source": 618, "pc": [ 2427, 2428 ] }, { - "teal": 2494, - "source": 613, + "teal": 2498, + "source": 618, "pc": [ 2429 ] }, { - "teal": 2495, - "source": 613, + "teal": 2499, + "source": 618, "pc": [ 2430, 2431, @@ -11968,8 +11983,8 @@ ] }, { - "teal": 2500, - "source": 615, + "teal": 2504, + "source": 620, "pc": [ 2433, 2434, @@ -11977,174 +11992,174 @@ ] }, { - "teal": 2501, - "source": 615, + "teal": 2505, + "source": 620, "pc": [ 2436, 2437 ] }, { - "teal": 2502, - "source": 615, + "teal": 2506, + "source": 620, "pc": [ 2438 ] }, { - "teal": 2503, - "source": 615, + "teal": 2507, + "source": 620, "pc": [ 2439, 2440 ] }, { - "teal": 2504, - "source": 615, + "teal": 2508, + "source": 620, "pc": [ 2441 ] }, { - "teal": 2505, - "source": 615, + "teal": 2509, + "source": 620, "pc": [ 2442 ] }, { - "teal": 2506, - "source": 615, + "teal": 2510, + "source": 620, "pc": [ 2443, 2444 ] }, { - "teal": 2507, - "source": 615, + "teal": 2511, + "source": 620, "pc": [ 2445 ] }, { - "teal": 2508, - "source": 615, + "teal": 2512, + "source": 620, "pc": [ 2446 ] }, { - "teal": 2509, - "source": 615, + "teal": 2513, + "source": 620, "pc": [ 2447, 2448 ] }, { - "teal": 2513, - "source": 616, + "teal": 2517, + "source": 621, "pc": [ 2449, 2450 ] }, { - "teal": 2514, - "source": 616, + "teal": 2518, + "source": 621, "pc": [ 2451, 2452 ] }, { - "teal": 2515, - "source": 616, + "teal": 2519, + "source": 621, "pc": [ 2453, 2454 ] }, { - "teal": 2516, - "source": 616, + "teal": 2520, + "source": 621, "pc": [ 2455 ] }, { - "teal": 2517, - "source": 616, + "teal": 2521, + "source": 621, "pc": [ 2456 ] }, { - "teal": 2518, - "source": 616, + "teal": 2522, + "source": 621, "pc": [ 2457, 2458 ] }, { - "teal": 2523, - "source": 618, + "teal": 2527, + "source": 623, "pc": [ 2459, 2460 ] }, { - "teal": 2524, - "source": 618, + "teal": 2528, + "source": 623, "pc": [ 2461, 2462 ] }, { - "teal": 2525, - "source": 618, + "teal": 2529, + "source": 623, "pc": [ 2463, 2464 ] }, { - "teal": 2526, - "source": 618, + "teal": 2530, + "source": 623, "pc": [ 2465 ] }, { - "teal": 2527, - "source": 618, + "teal": 2531, + "source": 623, "pc": [ 2466 ] }, { - "teal": 2528, - "source": 618, + "teal": 2532, + "source": 623, "pc": [ 2467, 2468 ] }, { - "teal": 2529, - "source": 618, + "teal": 2533, + "source": 623, "pc": [ 2469 ] }, { - "teal": 2530, - "source": 618, + "teal": 2534, + "source": 623, "pc": [ 2470, 2471, @@ -12152,68 +12167,68 @@ ] }, { - "teal": 2535, - "source": 619, + "teal": 2539, + "source": 624, "pc": [ 2473, 2474 ] }, { - "teal": 2536, - "source": 619, + "teal": 2540, + "source": 624, "pc": [ 2475, 2476 ] }, { - "teal": 2537, - "source": 619, + "teal": 2541, + "source": 624, "pc": [ 2477 ] }, { - "teal": 2538, - "source": 619, + "teal": 2542, + "source": 624, "pc": [ 2478, 2479 ] }, { - "teal": 2539, - "source": 619, + "teal": 2543, + "source": 624, "pc": [ 2480 ] }, { - "teal": 2540, - "source": 619, + "teal": 2544, + "source": 624, "pc": [ 2481 ] }, { - "teal": 2541, - "source": 619, + "teal": 2545, + "source": 624, "pc": [ 2482, 2483 ] }, { - "teal": 2542, - "source": 619, + "teal": 2546, + "source": 624, "pc": [ 2484 ] }, { - "teal": 2543, - "source": 619, + "teal": 2547, + "source": 624, "pc": [ 2485, 2486, @@ -12221,262 +12236,262 @@ ] }, { - "teal": 2550, - "source": 622, + "teal": 2554, + "source": 627, "pc": [ 2488, 2489 ] }, { - "teal": 2551, - "source": 622, + "teal": 2555, + "source": 627, "pc": [ 2490, 2491 ] }, { - "teal": 2552, - "source": 622, + "teal": 2556, + "source": 627, "pc": [ 2492 ] }, { - "teal": 2553, - "source": 622, + "teal": 2557, + "source": 627, "pc": [ 2493 ] }, { - "teal": 2554, - "source": 622, + "teal": 2558, + "source": 627, "pc": [ 2494, 2495 ] }, { - "teal": 2555, - "source": 622, + "teal": 2559, + "source": 627, "pc": [ 2496 ] }, { - "teal": 2556, - "source": 622, + "teal": 2560, + "source": 627, "pc": [ 2497 ] }, { - "teal": 2557, - "source": 622, + "teal": 2561, + "source": 627, "pc": [ 2498, 2499 ] }, { - "teal": 2558, - "source": 622, + "teal": 2562, + "source": 627, "pc": [ 2500 ] }, { - "teal": 2562, - "source": 624, + "teal": 2566, + "source": 629, "pc": [ 2501, 2502 ] }, { - "teal": 2563, - "source": 624, + "teal": 2567, + "source": 629, "pc": [ 2503, 2504 ] }, { - "teal": 2564, - "source": 624, + "teal": 2568, + "source": 629, "pc": [ 2505 ] }, { - "teal": 2565, - "source": 624, + "teal": 2569, + "source": 629, "pc": [ 2506, 2507 ] }, { - "teal": 2566, - "source": 624, + "teal": 2570, + "source": 629, "pc": [ 2508 ] }, { - "teal": 2567, - "source": 624, + "teal": 2571, + "source": 629, "pc": [ 2509 ] }, { - "teal": 2568, - "source": 624, + "teal": 2572, + "source": 629, "pc": [ 2510, 2511 ] }, { - "teal": 2569, - "source": 624, + "teal": 2573, + "source": 629, "pc": [ 2512 ] }, { - "teal": 2570, - "source": 624, + "teal": 2574, + "source": 629, "pc": [ 2513 ] }, { - "teal": 2571, - "source": 624, + "teal": 2575, + "source": 629, "pc": [ 2514, 2515 ] }, { - "teal": 2575, - "source": 625, + "teal": 2579, + "source": 630, "pc": [ 2516, 2517 ] }, { - "teal": 2576, - "source": 625, + "teal": 2580, + "source": 630, "pc": [ 2518 ] }, { - "teal": 2577, - "source": 625, + "teal": 2581, + "source": 630, "pc": [ 2519 ] }, { - "teal": 2578, - "source": 625, + "teal": 2582, + "source": 630, "pc": [ 2520, 2521 ] }, { - "teal": 2579, - "source": 625, + "teal": 2583, + "source": 630, "pc": [ 2522 ] }, { - "teal": 2580, - "source": 625, + "teal": 2584, + "source": 630, "pc": [ 2523 ] }, { - "teal": 2581, - "source": 625, + "teal": 2585, + "source": 630, "pc": [ 2524, 2525 ] }, { - "teal": 2582, - "source": 625, + "teal": 2586, + "source": 630, "pc": [ 2526 ] }, { - "teal": 2583, - "source": 625, + "teal": 2587, + "source": 630, "pc": [ 2527 ] }, { - "teal": 2584, - "source": 625, + "teal": 2588, + "source": 630, "pc": [ 2528, 2529 ] }, { - "teal": 2588, - "source": 626, + "teal": 2592, + "source": 631, "pc": [ 2530 ] }, { - "teal": 2589, - "source": 626, + "teal": 2593, + "source": 631, "pc": [ 2531, 2532 ] }, { - "teal": 2594, - "source": 626, + "teal": 2598, + "source": 631, "pc": [ 2533, 2534 ] }, { - "teal": 2595, - "source": 626, + "teal": 2599, + "source": 631, "pc": [ 2535, 2536 ] }, { - "teal": 2596, - "source": 626, + "teal": 2600, + "source": 631, "pc": [ 2537 ] }, { - "teal": 2597, - "source": 626, + "teal": 2601, + "source": 631, "pc": [ 2538, 2539, @@ -12484,326 +12499,326 @@ ] }, { - "teal": 2604, - "source": 632, + "teal": 2608, + "source": 637, "pc": [ 2541, 2542 ] }, { - "teal": 2605, - "source": 632, + "teal": 2609, + "source": 637, "pc": [ 2543, 2544 ] }, { - "teal": 2606, - "source": 632, + "teal": 2610, + "source": 637, "pc": [ 2545, 2546 ] }, { - "teal": 2607, - "source": 632, + "teal": 2611, + "source": 637, "pc": [ 2547 ] }, { - "teal": 2608, - "source": 632, + "teal": 2612, + "source": 637, "pc": [ 2548 ] }, { - "teal": 2609, - "source": 632, + "teal": 2613, + "source": 637, "pc": [ 2549, 2550 ] }, { - "teal": 2610, - "source": 632, + "teal": 2614, + "source": 637, "pc": [ 2551 ] }, { - "teal": 2611, - "source": 632, + "teal": 2615, + "source": 637, "pc": [ 2552 ] }, { - "teal": 2612, - "source": 632, + "teal": 2616, + "source": 637, "pc": [ 2553 ] }, { - "teal": 2613, - "source": 632, + "teal": 2617, + "source": 637, "pc": [ 2554, 2555 ] }, { - "teal": 2614, - "source": 632, + "teal": 2618, + "source": 637, "pc": [ 2556 ] }, { - "teal": 2615, - "source": 632, + "teal": 2619, + "source": 637, "pc": [ 2557 ] }, { - "teal": 2616, - "source": 632, + "teal": 2620, + "source": 637, "pc": [ 2558, 2559 ] }, { - "teal": 2617, - "source": 632, + "teal": 2621, + "source": 637, "pc": [ 2560 ] }, { - "teal": 2618, - "source": 632, + "teal": 2622, + "source": 637, "pc": [ 2561 ] }, { - "teal": 2619, - "source": 632, + "teal": 2623, + "source": 637, "pc": [ 2562, 2563 ] }, { - "teal": 2620, - "source": 631, + "teal": 2624, + "source": 636, "pc": [ 2564 ] }, { - "teal": 2621, - "source": 631, + "teal": 2625, + "source": 636, "pc": [ 2565 ] }, { - "teal": 2622, - "source": 633, + "teal": 2626, + "source": 638, "pc": [ 2566, 2567 ] }, { - "teal": 2623, - "source": 631, + "teal": 2627, + "source": 636, "pc": [ 2568 ] }, { - "teal": 2624, - "source": 631, + "teal": 2628, + "source": 636, "pc": [ 2569 ] }, { - "teal": 2625, - "source": 631, + "teal": 2629, + "source": 636, "pc": [ 2570 ] }, { - "teal": 2626, - "source": 631, + "teal": 2630, + "source": 636, "pc": [ 2571 ] }, { - "teal": 2627, - "source": 631, + "teal": 2631, + "source": 636, "pc": [ 2572 ] }, { - "teal": 2630, - "source": 631, + "teal": 2634, + "source": 636, "errorMessage": "wideRatio failed", "pc": [ 2573 ] }, { - "teal": 2631, - "source": 631, + "teal": 2635, + "source": 636, "pc": [ 2574, 2575 ] }, { - "teal": 2635, - "source": 635, + "teal": 2639, + "source": 640, "pc": [ 2576, 2577 ] }, { - "teal": 2636, - "source": 635, + "teal": 2640, + "source": 640, "pc": [ 2578, 2579 ] }, { - "teal": 2637, - "source": 635, + "teal": 2641, + "source": 640, "pc": [ 2580 ] }, { - "teal": 2638, - "source": 635, + "teal": 2642, + "source": 640, "pc": [ 2581 ] }, { - "teal": 2639, - "source": 635, + "teal": 2643, + "source": 640, "pc": [ 2582 ] }, { - "teal": 2640, - "source": 635, + "teal": 2644, + "source": 640, "pc": [ 2583, 2584 ] }, { - "teal": 2641, - "source": 635, + "teal": 2645, + "source": 640, "pc": [ 2585 ] }, { - "teal": 2642, - "source": 635, + "teal": 2646, + "source": 640, "pc": [ 2586 ] }, { - "teal": 2643, - "source": 635, + "teal": 2647, + "source": 640, "pc": [ 2587, 2588 ] }, { - "teal": 2644, - "source": 635, + "teal": 2648, + "source": 640, "pc": [ 2589 ] }, { - "teal": 2645, - "source": 635, + "teal": 2649, + "source": 640, "pc": [ 2590 ] }, { - "teal": 2646, - "source": 635, + "teal": 2650, + "source": 640, "pc": [ 2591, 2592 ] }, { - "teal": 2647, - "source": 635, + "teal": 2651, + "source": 640, "pc": [ 2593 ] }, { - "teal": 2652, - "source": 626, + "teal": 2656, + "source": 631, "pc": [ 2594, 2595 ] }, { - "teal": 2653, - "source": 626, + "teal": 2657, + "source": 631, "pc": [ 2596 ] }, { - "teal": 2654, - "source": 626, + "teal": 2658, + "source": 631, "pc": [ 2597 ] }, { - "teal": 2655, - "source": 626, + "teal": 2659, + "source": 631, "pc": [ 2598, 2599 ] }, { - "teal": 2656, - "source": 626, + "teal": 2660, + "source": 631, "pc": [ 2600, 2601, @@ -12811,91 +12826,91 @@ ] }, { - "teal": 2661, - "source": 637, + "teal": 2665, + "source": 642, "pc": [ 2603, 2604 ] }, { - "teal": 2662, - "source": 637, + "teal": 2666, + "source": 642, "pc": [ 2605, 2606 ] }, { - "teal": 2663, - "source": 637, + "teal": 2667, + "source": 642, "pc": [ 2607 ] }, { - "teal": 2664, - "source": 637, + "teal": 2668, + "source": 642, "pc": [ 2608, 2609 ] }, { - "teal": 2665, - "source": 637, + "teal": 2669, + "source": 642, "pc": [ 2610 ] }, { - "teal": 2666, - "source": 637, + "teal": 2670, + "source": 642, "pc": [ 2611 ] }, { - "teal": 2667, - "source": 637, + "teal": 2671, + "source": 642, "pc": [ 2612, 2613 ] }, { - "teal": 2668, - "source": 637, + "teal": 2672, + "source": 642, "pc": [ 2614 ] }, { - "teal": 2672, - "source": 596, + "teal": 2676, + "source": 601, "pc": [ 2615, 2616 ] }, { - "teal": 2675, - "source": 596, + "teal": 2679, + "source": 601, "pc": [ 2617, 2618 ] }, { - "teal": 2676, - "source": 596, + "teal": 2680, + "source": 601, "pc": [ 2619 ] }, { - "teal": 2681, - "source": 656, + "teal": 2685, + "source": 661, "pc": [ 2620, 2621, @@ -12903,15 +12918,15 @@ ] }, { - "teal": 2682, - "source": 656, + "teal": 2686, + "source": 661, "pc": [ 2623 ] }, { - "teal": 2685, - "source": 655, + "teal": 2689, + "source": 660, "pc": [ 2624, 2625, @@ -12919,15 +12934,15 @@ ] }, { - "teal": 2686, - "source": 655, + "teal": 2690, + "source": 660, "pc": [ 2627 ] }, { - "teal": 2689, - "source": 654, + "teal": 2693, + "source": 659, "pc": [ 2628, 2629, @@ -12935,15 +12950,15 @@ ] }, { - "teal": 2690, - "source": 654, + "teal": 2694, + "source": 659, "pc": [ 2631 ] }, { - "teal": 2693, - "source": 653, + "teal": 2697, + "source": 658, "pc": [ 2632, 2633, @@ -12951,15 +12966,15 @@ ] }, { - "teal": 2694, - "source": 653, + "teal": 2698, + "source": 658, "pc": [ 2635 ] }, { - "teal": 2697, - "source": 652, + "teal": 2701, + "source": 657, "pc": [ 2636, 2637, @@ -12967,44 +12982,44 @@ ] }, { - "teal": 2698, - "source": 652, + "teal": 2702, + "source": 657, "pc": [ 2639 ] }, { - "teal": 2699, - "source": 652, + "teal": 2703, + "source": 657, "pc": [ 2640 ] }, { - "teal": 2700, - "source": 652, + "teal": 2704, + "source": 657, "pc": [ 2641 ] }, { - "teal": 2701, - "source": 652, + "teal": 2705, + "source": 657, "pc": [ 2642 ] }, { - "teal": 2704, - "source": 652, + "teal": 2708, + "source": 657, "errorMessage": "argument 4 (poolKey) for stakeUpdatedViaRewards must be a (uint64,uint64,uint64)", "pc": [ 2643 ] }, { - "teal": 2707, - "source": 651, + "teal": 2711, + "source": 656, "pc": [ 2644, 2645, @@ -13012,22 +13027,22 @@ ] }, { - "teal": 2708, - "source": 651, + "teal": 2712, + "source": 656, "pc": [ 2647 ] }, { - "teal": 2709, - "source": 651, + "teal": 2713, + "source": 656, "pc": [ 2648 ] }, { - "teal": 2723, - "source": 651, + "teal": 2727, + "source": 656, "pc": [ 2649, 2650, @@ -13035,16 +13050,16 @@ ] }, { - "teal": 2727, - "source": 658, + "teal": 2731, + "source": 663, "pc": [ 2652, 2653 ] }, { - "teal": 2728, - "source": 658, + "teal": 2732, + "source": 663, "pc": [ 2654, 2655, @@ -13052,24 +13067,24 @@ ] }, { - "teal": 2732, - "source": 661, + "teal": 2736, + "source": 666, "pc": [ 2657, 2658 ] }, { - "teal": 2733, - "source": 661, + "teal": 2737, + "source": 666, "pc": [ 2659, 2660 ] }, { - "teal": 2734, - "source": 661, + "teal": 2738, + "source": 666, "pc": [ 2661, 2662, @@ -13077,82 +13092,82 @@ ] }, { - "teal": 2735, - "source": 661, + "teal": 2739, + "source": 666, "pc": [ 2664 ] }, { - "teal": 2736, - "source": 661, + "teal": 2740, + "source": 666, "pc": [ 2665 ] }, { - "teal": 2737, - "source": 661, + "teal": 2741, + "source": 666, "pc": [ 2666 ] }, { - "teal": 2738, - "source": 661, + "teal": 2742, + "source": 666, "pc": [ 2667, 2668 ] }, { - "teal": 2739, - "source": 661, + "teal": 2743, + "source": 666, "pc": [ 2669 ] }, { - "teal": 2740, - "source": 661, + "teal": 2744, + "source": 666, "pc": [ 2670 ] }, { - "teal": 2741, - "source": 661, + "teal": 2745, + "source": 666, "pc": [ 2671, 2672 ] }, { - "teal": 2742, - "source": 661, + "teal": 2746, + "source": 666, "pc": [ 2673 ] }, { - "teal": 2743, - "source": 661, + "teal": 2747, + "source": 666, "pc": [ 2674, 2675 ] }, { - "teal": 2744, - "source": 661, + "teal": 2748, + "source": 666, "pc": [ 2676, 2677 ] }, { - "teal": 2745, - "source": 661, + "teal": 2749, + "source": 666, "pc": [ 2678, 2679, @@ -13160,88 +13175,88 @@ ] }, { - "teal": 2746, - "source": 661, + "teal": 2750, + "source": 666, "pc": [ 2681 ] }, { - "teal": 2747, - "source": 661, + "teal": 2751, + "source": 666, "pc": [ 2682 ] }, { - "teal": 2748, - "source": 661, + "teal": 2752, + "source": 666, "pc": [ 2683 ] }, { - "teal": 2749, - "source": 661, + "teal": 2753, + "source": 666, "pc": [ 2684, 2685 ] }, { - "teal": 2750, - "source": 661, + "teal": 2754, + "source": 666, "pc": [ 2686 ] }, { - "teal": 2751, - "source": 661, + "teal": 2755, + "source": 666, "pc": [ 2687 ] }, { - "teal": 2752, - "source": 661, + "teal": 2756, + "source": 666, "pc": [ 2688, 2689 ] }, { - "teal": 2753, - "source": 661, + "teal": 2757, + "source": 666, "pc": [ 2690 ] }, { - "teal": 2754, - "source": 661, + "teal": 2758, + "source": 666, "pc": [ 2691 ] }, { - "teal": 2755, - "source": 661, + "teal": 2759, + "source": 666, "pc": [ 2692 ] }, { - "teal": 2756, - "source": 661, + "teal": 2760, + "source": 666, "pc": [ 2693, 2694 ] }, { - "teal": 2757, - "source": 661, + "teal": 2761, + "source": 666, "pc": [ 2695, 2696, @@ -13249,88 +13264,88 @@ ] }, { - "teal": 2758, - "source": 661, + "teal": 2762, + "source": 666, "pc": [ 2698 ] }, { - "teal": 2759, - "source": 661, + "teal": 2763, + "source": 666, "pc": [ 2699 ] }, { - "teal": 2760, - "source": 661, + "teal": 2764, + "source": 666, "pc": [ 2700 ] }, { - "teal": 2761, - "source": 661, + "teal": 2765, + "source": 666, "pc": [ 2701, 2702 ] }, { - "teal": 2762, - "source": 661, + "teal": 2766, + "source": 666, "pc": [ 2703 ] }, { - "teal": 2763, - "source": 661, + "teal": 2767, + "source": 666, "pc": [ 2704 ] }, { - "teal": 2764, - "source": 661, + "teal": 2768, + "source": 666, "pc": [ 2705, 2706 ] }, { - "teal": 2765, - "source": 661, + "teal": 2769, + "source": 666, "pc": [ 2707 ] }, { - "teal": 2766, - "source": 661, + "teal": 2770, + "source": 666, "pc": [ 2708 ] }, { - "teal": 2767, - "source": 661, + "teal": 2771, + "source": 666, "pc": [ 2709 ] }, { - "teal": 2768, - "source": 661, + "teal": 2772, + "source": 666, "pc": [ 2710, 2711 ] }, { - "teal": 2769, - "source": 661, + "teal": 2773, + "source": 666, "pc": [ 2712, 2713, @@ -13338,81 +13353,81 @@ ] }, { - "teal": 2770, - "source": 661, + "teal": 2774, + "source": 666, "pc": [ 2715 ] }, { - "teal": 2771, - "source": 661, + "teal": 2775, + "source": 666, "pc": [ 2716 ] }, { - "teal": 2772, - "source": 661, + "teal": 2776, + "source": 666, "pc": [ 2717 ] }, { - "teal": 2773, - "source": 661, + "teal": 2777, + "source": 666, "pc": [ 2718, 2719 ] }, { - "teal": 2774, - "source": 661, + "teal": 2778, + "source": 666, "pc": [ 2720 ] }, { - "teal": 2778, - "source": 662, + "teal": 2782, + "source": 667, "pc": [ 2721, 2722 ] }, { - "teal": 2779, - "source": 662, + "teal": 2783, + "source": 667, "pc": [ 2723 ] }, { - "teal": 2780, - "source": 662, + "teal": 2784, + "source": 667, "pc": [ 2724 ] }, { - "teal": 2781, - "source": 662, + "teal": 2785, + "source": 667, "pc": [ 2725 ] }, { - "teal": 2782, - "source": 662, + "teal": 2786, + "source": 667, "pc": [ 2726, 2727 ] }, { - "teal": 2783, - "source": 662, + "teal": 2787, + "source": 667, "pc": [ 2728, 2729, @@ -13420,88 +13435,88 @@ ] }, { - "teal": 2784, - "source": 662, + "teal": 2788, + "source": 667, "pc": [ 2731 ] }, { - "teal": 2785, - "source": 662, + "teal": 2789, + "source": 667, "pc": [ 2732 ] }, { - "teal": 2786, - "source": 662, + "teal": 2790, + "source": 667, "pc": [ 2733 ] }, { - "teal": 2787, - "source": 662, + "teal": 2791, + "source": 667, "pc": [ 2734, 2735 ] }, { - "teal": 2788, - "source": 662, + "teal": 2792, + "source": 667, "pc": [ 2736 ] }, { - "teal": 2789, - "source": 662, + "teal": 2793, + "source": 667, "pc": [ 2737 ] }, { - "teal": 2790, - "source": 662, + "teal": 2794, + "source": 667, "pc": [ 2738, 2739 ] }, { - "teal": 2791, - "source": 662, + "teal": 2795, + "source": 667, "pc": [ 2740 ] }, { - "teal": 2792, - "source": 662, + "teal": 2796, + "source": 667, "pc": [ 2741 ] }, { - "teal": 2793, - "source": 662, + "teal": 2797, + "source": 667, "pc": [ 2742 ] }, { - "teal": 2794, - "source": 662, + "teal": 2798, + "source": 667, "pc": [ 2743, 2744 ] }, { - "teal": 2795, - "source": 662, + "teal": 2799, + "source": 667, "pc": [ 2745, 2746, @@ -13509,81 +13524,81 @@ ] }, { - "teal": 2796, - "source": 662, + "teal": 2800, + "source": 667, "pc": [ 2748 ] }, { - "teal": 2797, - "source": 662, + "teal": 2801, + "source": 667, "pc": [ 2749 ] }, { - "teal": 2798, - "source": 662, + "teal": 2802, + "source": 667, "pc": [ 2750 ] }, { - "teal": 2799, - "source": 662, + "teal": 2803, + "source": 667, "pc": [ 2751, 2752 ] }, { - "teal": 2800, - "source": 662, + "teal": 2804, + "source": 667, "pc": [ 2753 ] }, { - "teal": 2804, - "source": 663, + "teal": 2808, + "source": 668, "pc": [ 2754, 2755 ] }, { - "teal": 2805, - "source": 663, + "teal": 2809, + "source": 668, "pc": [ 2756 ] }, { - "teal": 2806, - "source": 663, + "teal": 2810, + "source": 668, "pc": [ 2757 ] }, { - "teal": 2807, - "source": 663, + "teal": 2811, + "source": 668, "pc": [ 2758 ] }, { - "teal": 2808, - "source": 663, + "teal": 2812, + "source": 668, "pc": [ 2759, 2760 ] }, { - "teal": 2809, - "source": 663, + "teal": 2813, + "source": 668, "pc": [ 2761, 2762, @@ -13591,88 +13606,88 @@ ] }, { - "teal": 2810, - "source": 663, + "teal": 2814, + "source": 668, "pc": [ 2764 ] }, { - "teal": 2811, - "source": 663, + "teal": 2815, + "source": 668, "pc": [ 2765 ] }, { - "teal": 2812, - "source": 663, + "teal": 2816, + "source": 668, "pc": [ 2766 ] }, { - "teal": 2813, - "source": 663, + "teal": 2817, + "source": 668, "pc": [ 2767, 2768 ] }, { - "teal": 2814, - "source": 663, + "teal": 2818, + "source": 668, "pc": [ 2769 ] }, { - "teal": 2815, - "source": 663, + "teal": 2819, + "source": 668, "pc": [ 2770 ] }, { - "teal": 2816, - "source": 663, + "teal": 2820, + "source": 668, "pc": [ 2771, 2772 ] }, { - "teal": 2817, - "source": 663, + "teal": 2821, + "source": 668, "pc": [ 2773 ] }, { - "teal": 2818, - "source": 663, + "teal": 2822, + "source": 668, "pc": [ 2774 ] }, { - "teal": 2819, - "source": 663, + "teal": 2823, + "source": 668, "pc": [ 2775 ] }, { - "teal": 2820, - "source": 663, + "teal": 2824, + "source": 668, "pc": [ 2776, 2777 ] }, { - "teal": 2821, - "source": 663, + "teal": 2825, + "source": 668, "pc": [ 2778, 2779, @@ -13680,104 +13695,104 @@ ] }, { - "teal": 2822, - "source": 663, + "teal": 2826, + "source": 668, "pc": [ 2781 ] }, { - "teal": 2823, - "source": 663, + "teal": 2827, + "source": 668, "pc": [ 2782 ] }, { - "teal": 2824, - "source": 663, + "teal": 2828, + "source": 668, "pc": [ 2783 ] }, { - "teal": 2825, - "source": 663, + "teal": 2829, + "source": 668, "pc": [ 2784, 2785 ] }, { - "teal": 2826, - "source": 663, + "teal": 2830, + "source": 668, "pc": [ 2786 ] }, { - "teal": 2830, - "source": 665, + "teal": 2834, + "source": 670, "pc": [ 2787, 2788 ] }, { - "teal": 2831, - "source": 665, + "teal": 2835, + "source": 670, "pc": [ 2789 ] }, { - "teal": 2832, - "source": 665, + "teal": 2836, + "source": 670, "pc": [ 2790, 2791 ] }, { - "teal": 2833, - "source": 665, + "teal": 2837, + "source": 670, "pc": [ 2792 ] }, { - "teal": 2834, - "source": 665, + "teal": 2838, + "source": 670, "pc": [ 2793, 2794 ] }, { - "teal": 2835, - "source": 665, + "teal": 2839, + "source": 670, "pc": [ 2795 ] }, { - "teal": 2836, - "source": 665, + "teal": 2840, + "source": 670, "pc": [ 2796 ] }, { - "teal": 2840, - "source": 668, + "teal": 2844, + "source": 673, "pc": [ 2797, 2798 ] }, { - "teal": 2841, - "source": 668, + "teal": 2845, + "source": 673, "pc": [ 2799, 2800, @@ -13785,15 +13800,15 @@ ] }, { - "teal": 2842, - "source": 668, + "teal": 2846, + "source": 673, "pc": [ 2802 ] }, { - "teal": 2843, - "source": 668, + "teal": 2847, + "source": 673, "pc": [ 2803, 2804, @@ -13801,8 +13816,8 @@ ] }, { - "teal": 2855, - "source": 670, + "teal": 2859, + "source": 675, "pc": [ 2806, 2807, @@ -13813,16 +13828,16 @@ ] }, { - "teal": 2856, - "source": 671, + "teal": 2860, + "source": 676, "pc": [ 2812, 2813 ] }, { - "teal": 2857, - "source": 671, + "teal": 2861, + "source": 676, "pc": [ 2814, 2815, @@ -13830,30 +13845,30 @@ ] }, { - "teal": 2858, - "source": 671, + "teal": 2862, + "source": 676, "pc": [ 2817 ] }, { - "teal": 2859, - "source": 671, + "teal": 2863, + "source": 676, "pc": [ 2818 ] }, { - "teal": 2860, - "source": 672, + "teal": 2864, + "source": 677, "pc": [ 2819, 2820 ] }, { - "teal": 2861, - "source": 672, + "teal": 2865, + "source": 677, "pc": [ 2821, 2822, @@ -13861,59 +13876,59 @@ ] }, { - "teal": 2862, - "source": 672, + "teal": 2866, + "source": 677, "pc": [ 2824 ] }, { - "teal": 2863, - "source": 672, + "teal": 2867, + "source": 677, "pc": [ 2825 ] }, { - "teal": 2864, - "source": 672, + "teal": 2868, + "source": 677, "pc": [ 2826 ] }, { - "teal": 2865, - "source": 672, + "teal": 2869, + "source": 677, "pc": [ 2827 ] }, { - "teal": 2866, - "source": 672, + "teal": 2870, + "source": 677, "pc": [ 2828, 2829 ] }, { - "teal": 2867, - "source": 672, + "teal": 2871, + "source": 677, "pc": [ 2830 ] }, { - "teal": 2870, - "source": 672, + "teal": 2874, + "source": 677, "errorMessage": "poolKey.poolId as uint16 overflowed 16 bits", "pc": [ 2831 ] }, { - "teal": 2871, - "source": 672, + "teal": 2875, + "source": 677, "pc": [ 2832, 2833, @@ -13921,23 +13936,23 @@ ] }, { - "teal": 2872, - "source": 672, + "teal": 2876, + "source": 677, "pc": [ 2835 ] }, { - "teal": 2873, - "source": 673, + "teal": 2877, + "source": 678, "pc": [ 2836, 2837 ] }, { - "teal": 2874, - "source": 673, + "teal": 2878, + "source": 678, "pc": [ 2838, 2839, @@ -13945,138 +13960,138 @@ ] }, { - "teal": 2875, - "source": 673, + "teal": 2879, + "source": 678, "pc": [ 2841 ] }, { - "teal": 2876, - "source": 673, + "teal": 2880, + "source": 678, "pc": [ 2842 ] }, { - "teal": 2877, - "source": 673, + "teal": 2881, + "source": 678, "pc": [ 2843 ] }, { - "teal": 2878, - "source": 677, + "teal": 2882, + "source": 682, "pc": [ 2844, 2845 ] }, { - "teal": 2879, - "source": 677, + "teal": 2883, + "source": 682, "pc": [ 2846 ] }, { - "teal": 2880, - "source": 677, + "teal": 2884, + "source": 682, "pc": [ 2847 ] }, { - "teal": 2881, - "source": 676, + "teal": 2885, + "source": 681, "pc": [ 2848, 2849 ] }, { - "teal": 2882, - "source": 676, + "teal": 2886, + "source": 681, "pc": [ 2850 ] }, { - "teal": 2883, - "source": 676, + "teal": 2887, + "source": 681, "pc": [ 2851 ] }, { - "teal": 2884, - "source": 674, + "teal": 2888, + "source": 679, "pc": [ 2852, 2853 ] }, { - "teal": 2885, - "source": 674, + "teal": 2889, + "source": 679, "pc": [ 2854 ] }, { - "teal": 2886, - "source": 674, + "teal": 2890, + "source": 679, "pc": [ 2855 ] }, { - "teal": 2887, - "source": 675, + "teal": 2891, + "source": 680, "pc": [ 2856, 2857 ] }, { - "teal": 2888, - "source": 675, + "teal": 2892, + "source": 680, "pc": [ 2858 ] }, { - "teal": 2889, - "source": 675, + "teal": 2893, + "source": 680, "pc": [ 2859 ] }, { - "teal": 2890, - "source": 670, + "teal": 2894, + "source": 675, "pc": [ 2860 ] }, { - "teal": 2891, - "source": 670, + "teal": 2895, + "source": 675, "pc": [ 2861 ] }, { - "teal": 2892, - "source": 651, + "teal": 2896, + "source": 656, "pc": [ 2862 ] }, { - "teal": 2897, - "source": 698, + "teal": 2901, + "source": 703, "pc": [ 2863, 2864, @@ -14084,58 +14099,58 @@ ] }, { - "teal": 2898, - "source": 698, + "teal": 2902, + "source": 703, "pc": [ 2866 ] }, { - "teal": 2899, - "source": 698, + "teal": 2903, + "source": 703, "pc": [ 2867 ] }, { - "teal": 2900, - "source": 698, + "teal": 2904, + "source": 703, "pc": [ 2868 ] }, { - "teal": 2901, - "source": 698, + "teal": 2905, + "source": 703, "pc": [ 2869 ] }, { - "teal": 2904, - "source": 698, + "teal": 2908, + "source": 703, "errorMessage": "argument 0 (stakerRemoved) for stakeRemoved must be a bool", "pc": [ 2870 ] }, { - "teal": 2905, - "source": 698, + "teal": 2909, + "source": 703, "pc": [ 2871 ] }, { - "teal": 2906, - "source": 698, + "teal": 2910, + "source": 703, "pc": [ 2872 ] }, { - "teal": 2909, - "source": 697, + "teal": 2913, + "source": 702, "pc": [ 2873, 2874, @@ -14143,15 +14158,15 @@ ] }, { - "teal": 2910, - "source": 697, + "teal": 2914, + "source": 702, "pc": [ 2876 ] }, { - "teal": 2913, - "source": 696, + "teal": 2917, + "source": 701, "pc": [ 2877, 2878, @@ -14159,15 +14174,15 @@ ] }, { - "teal": 2914, - "source": 696, + "teal": 2918, + "source": 701, "pc": [ 2880 ] }, { - "teal": 2917, - "source": 695, + "teal": 2921, + "source": 700, "pc": [ 2881, 2882, @@ -14175,45 +14190,45 @@ ] }, { - "teal": 2918, - "source": 695, + "teal": 2922, + "source": 700, "pc": [ 2884 ] }, { - "teal": 2919, - "source": 695, + "teal": 2923, + "source": 700, "pc": [ 2885 ] }, { - "teal": 2920, - "source": 695, + "teal": 2924, + "source": 700, "pc": [ 2886, 2887 ] }, { - "teal": 2921, - "source": 695, + "teal": 2925, + "source": 700, "pc": [ 2888 ] }, { - "teal": 2924, - "source": 695, + "teal": 2928, + "source": 700, "errorMessage": "argument 3 (staker) for stakeRemoved must be a address", "pc": [ 2889 ] }, { - "teal": 2927, - "source": 694, + "teal": 2931, + "source": 699, "pc": [ 2890, 2891, @@ -14221,44 +14236,44 @@ ] }, { - "teal": 2928, - "source": 694, + "teal": 2932, + "source": 699, "pc": [ 2893 ] }, { - "teal": 2929, - "source": 694, + "teal": 2933, + "source": 699, "pc": [ 2894 ] }, { - "teal": 2930, - "source": 694, + "teal": 2934, + "source": 699, "pc": [ 2895 ] }, { - "teal": 2931, - "source": 694, + "teal": 2935, + "source": 699, "pc": [ 2896 ] }, { - "teal": 2934, - "source": 694, + "teal": 2938, + "source": 699, "errorMessage": "argument 4 (poolKey) for stakeRemoved must be a (uint64,uint64,uint64)", "pc": [ 2897 ] }, { - "teal": 2937, - "source": 693, + "teal": 2941, + "source": 698, "pc": [ 2898, 2899, @@ -14266,22 +14281,22 @@ ] }, { - "teal": 2938, - "source": 693, + "teal": 2942, + "source": 698, "pc": [ 2901 ] }, { - "teal": 2939, - "source": 693, + "teal": 2943, + "source": 698, "pc": [ 2902 ] }, { - "teal": 2954, - "source": 693, + "teal": 2958, + "source": 698, "pc": [ 2903, 2904, @@ -14289,46 +14304,46 @@ ] }, { - "teal": 2957, - "source": 693, + "teal": 2961, + "source": 698, "pc": [ 2906 ] }, { - "teal": 2958, - "source": 693, + "teal": 2962, + "source": 698, "pc": [ 2907, 2908 ] }, { - "teal": 2963, - "source": 700, + "teal": 2967, + "source": 705, "pc": [ 2909, 2910 ] }, { - "teal": 2964, - "source": 700, + "teal": 2968, + "source": 705, "pc": [ 2911, 2912 ] }, { - "teal": 2965, - "source": 700, + "teal": 2969, + "source": 705, "pc": [ 2913 ] }, { - "teal": 2966, - "source": 700, + "teal": 2970, + "source": 705, "pc": [ 2914, 2915, @@ -14336,108 +14351,108 @@ ] }, { - "teal": 2971, - "source": 701, + "teal": 2975, + "source": 706, "pc": [ 2917 ] }, { - "teal": 2972, - "source": 701, + "teal": 2976, + "source": 706, "pc": [ 2918, 2919 ] }, { - "teal": 2973, - "source": 701, + "teal": 2977, + "source": 706, "pc": [ 2920, 2921 ] }, { - "teal": 2974, - "source": 701, + "teal": 2978, + "source": 706, "pc": [ 2922 ] }, { - "teal": 2975, - "source": 701, + "teal": 2979, + "source": 706, "pc": [ 2923, 2924 ] }, { - "teal": 2976, - "source": 701, + "teal": 2980, + "source": 706, "pc": [ 2925, 2926 ] }, { - "teal": 2977, - "source": 701, + "teal": 2981, + "source": 706, "pc": [ 2927 ] }, { - "teal": 2978, - "source": 701, + "teal": 2982, + "source": 706, "pc": [ 2928, 2929 ] }, { - "teal": 2979, - "source": 701, + "teal": 2983, + "source": 706, "pc": [ 2930, 2931 ] }, { - "teal": 2980, - "source": 701, + "teal": 2984, + "source": 706, "pc": [ 2932, 2933 ] }, { - "teal": 2981, - "source": 701, + "teal": 2985, + "source": 706, "pc": [ 2934, 2935 ] }, { - "teal": 2982, - "source": 701, + "teal": 2986, + "source": 706, "pc": [ 2936 ] }, { - "teal": 2987, - "source": 703, + "teal": 2991, + "source": 708, "pc": [ 2937, 2938 ] }, { - "teal": 2988, - "source": 703, + "teal": 2992, + "source": 708, "pc": [ 2939, 2940, @@ -14445,37 +14460,37 @@ ] }, { - "teal": 2992, - "source": 707, + "teal": 2996, + "source": 712, "pc": [ 2942, 2943 ] }, { - "teal": 2993, - "source": 707, + "teal": 2997, + "source": 712, "pc": [ 2944 ] }, { - "teal": 2994, - "source": 707, + "teal": 2998, + "source": 712, "pc": [ 2945 ] }, { - "teal": 2995, - "source": 707, + "teal": 2999, + "source": 712, "pc": [ 2946 ] }, { - "teal": 2996, - "source": 707, + "teal": 3000, + "source": 712, "pc": [ 2947, 2948, @@ -14483,61 +14498,61 @@ ] }, { - "teal": 2997, - "source": 707, + "teal": 3001, + "source": 712, "pc": [ 2950, 2951 ] }, { - "teal": 2998, - "source": 707, + "teal": 3002, + "source": 712, "pc": [ 2952 ] }, { - "teal": 2999, - "source": 707, + "teal": 3003, + "source": 712, "pc": [ 2953 ] }, { - "teal": 3000, - "source": 707, + "teal": 3004, + "source": 712, "pc": [ 2954 ] }, { - "teal": 3004, - "source": 707, + "teal": 3008, + "source": 712, "errorMessage": "should only be called if algo or reward was removed", "pc": [ 2955 ] }, { - "teal": 3008, - "source": 710, + "teal": 3012, + "source": 715, "pc": [ 2956, 2957 ] }, { - "teal": 3009, - "source": 710, + "teal": 3013, + "source": 715, "pc": [ 2958, 2959 ] }, { - "teal": 3010, - "source": 710, + "teal": 3014, + "source": 715, "pc": [ 2960, 2961, @@ -14545,82 +14560,82 @@ ] }, { - "teal": 3011, - "source": 710, + "teal": 3015, + "source": 715, "pc": [ 2963 ] }, { - "teal": 3012, - "source": 710, + "teal": 3016, + "source": 715, "pc": [ 2964 ] }, { - "teal": 3013, - "source": 710, + "teal": 3017, + "source": 715, "pc": [ 2965 ] }, { - "teal": 3014, - "source": 710, + "teal": 3018, + "source": 715, "pc": [ 2966, 2967 ] }, { - "teal": 3015, - "source": 710, + "teal": 3019, + "source": 715, "pc": [ 2968 ] }, { - "teal": 3016, - "source": 710, + "teal": 3020, + "source": 715, "pc": [ 2969 ] }, { - "teal": 3017, - "source": 710, + "teal": 3021, + "source": 715, "pc": [ 2970, 2971 ] }, { - "teal": 3018, - "source": 710, + "teal": 3022, + "source": 715, "pc": [ 2972 ] }, { - "teal": 3019, - "source": 710, + "teal": 3023, + "source": 715, "pc": [ 2973, 2974 ] }, { - "teal": 3020, - "source": 710, + "teal": 3024, + "source": 715, "pc": [ 2975, 2976 ] }, { - "teal": 3021, - "source": 710, + "teal": 3025, + "source": 715, "pc": [ 2977, 2978, @@ -14628,88 +14643,88 @@ ] }, { - "teal": 3022, - "source": 710, + "teal": 3026, + "source": 715, "pc": [ 2980 ] }, { - "teal": 3023, - "source": 710, + "teal": 3027, + "source": 715, "pc": [ 2981 ] }, { - "teal": 3024, - "source": 710, + "teal": 3028, + "source": 715, "pc": [ 2982 ] }, { - "teal": 3025, - "source": 710, + "teal": 3029, + "source": 715, "pc": [ 2983, 2984 ] }, { - "teal": 3026, - "source": 710, + "teal": 3030, + "source": 715, "pc": [ 2985 ] }, { - "teal": 3027, - "source": 710, + "teal": 3031, + "source": 715, "pc": [ 2986 ] }, { - "teal": 3028, - "source": 710, + "teal": 3032, + "source": 715, "pc": [ 2987, 2988 ] }, { - "teal": 3029, - "source": 710, + "teal": 3033, + "source": 715, "pc": [ 2989 ] }, { - "teal": 3030, - "source": 710, + "teal": 3034, + "source": 715, "pc": [ 2990 ] }, { - "teal": 3031, - "source": 710, + "teal": 3035, + "source": 715, "pc": [ 2991 ] }, { - "teal": 3032, - "source": 710, + "teal": 3036, + "source": 715, "pc": [ 2992, 2993 ] }, { - "teal": 3033, - "source": 710, + "teal": 3037, + "source": 715, "pc": [ 2994, 2995, @@ -14717,88 +14732,88 @@ ] }, { - "teal": 3034, - "source": 710, + "teal": 3038, + "source": 715, "pc": [ 2997 ] }, { - "teal": 3035, - "source": 710, + "teal": 3039, + "source": 715, "pc": [ 2998 ] }, { - "teal": 3036, - "source": 710, + "teal": 3040, + "source": 715, "pc": [ 2999 ] }, { - "teal": 3037, - "source": 710, + "teal": 3041, + "source": 715, "pc": [ 3000, 3001 ] }, { - "teal": 3038, - "source": 710, + "teal": 3042, + "source": 715, "pc": [ 3002 ] }, { - "teal": 3039, - "source": 710, + "teal": 3043, + "source": 715, "pc": [ 3003 ] }, { - "teal": 3040, - "source": 710, + "teal": 3044, + "source": 715, "pc": [ 3004, 3005 ] }, { - "teal": 3041, - "source": 710, + "teal": 3045, + "source": 715, "pc": [ 3006 ] }, { - "teal": 3042, - "source": 710, + "teal": 3046, + "source": 715, "pc": [ 3007 ] }, { - "teal": 3043, - "source": 710, + "teal": 3047, + "source": 715, "pc": [ 3008 ] }, { - "teal": 3044, - "source": 710, + "teal": 3048, + "source": 715, "pc": [ 3009, 3010 ] }, { - "teal": 3045, - "source": 710, + "teal": 3049, + "source": 715, "pc": [ 3011, 3012, @@ -14806,81 +14821,81 @@ ] }, { - "teal": 3046, - "source": 710, + "teal": 3050, + "source": 715, "pc": [ 3014 ] }, { - "teal": 3047, - "source": 710, + "teal": 3051, + "source": 715, "pc": [ 3015 ] }, { - "teal": 3048, - "source": 710, + "teal": 3052, + "source": 715, "pc": [ 3016 ] }, { - "teal": 3049, - "source": 710, + "teal": 3053, + "source": 715, "pc": [ 3017, 3018 ] }, { - "teal": 3050, - "source": 710, + "teal": 3054, + "source": 715, "pc": [ 3019 ] }, { - "teal": 3054, - "source": 711, + "teal": 3058, + "source": 716, "pc": [ 3020, 3021 ] }, { - "teal": 3055, - "source": 711, + "teal": 3059, + "source": 716, "pc": [ 3022 ] }, { - "teal": 3056, - "source": 711, + "teal": 3060, + "source": 716, "pc": [ 3023 ] }, { - "teal": 3057, - "source": 711, + "teal": 3061, + "source": 716, "pc": [ 3024 ] }, { - "teal": 3058, - "source": 711, + "teal": 3062, + "source": 716, "pc": [ 3025, 3026 ] }, { - "teal": 3059, - "source": 711, + "teal": 3063, + "source": 716, "pc": [ 3027, 3028, @@ -14888,88 +14903,88 @@ ] }, { - "teal": 3060, - "source": 711, + "teal": 3064, + "source": 716, "pc": [ 3030 ] }, { - "teal": 3061, - "source": 711, + "teal": 3065, + "source": 716, "pc": [ 3031 ] }, { - "teal": 3062, - "source": 711, + "teal": 3066, + "source": 716, "pc": [ 3032 ] }, { - "teal": 3063, - "source": 711, + "teal": 3067, + "source": 716, "pc": [ 3033, 3034 ] }, { - "teal": 3064, - "source": 711, + "teal": 3068, + "source": 716, "pc": [ 3035 ] }, { - "teal": 3065, - "source": 711, + "teal": 3069, + "source": 716, "pc": [ 3036 ] }, { - "teal": 3066, - "source": 711, + "teal": 3070, + "source": 716, "pc": [ 3037, 3038 ] }, { - "teal": 3067, - "source": 711, + "teal": 3071, + "source": 716, "pc": [ 3039 ] }, { - "teal": 3068, - "source": 711, + "teal": 3072, + "source": 716, "pc": [ 3040 ] }, { - "teal": 3069, - "source": 711, + "teal": 3073, + "source": 716, "pc": [ 3041 ] }, { - "teal": 3070, - "source": 711, + "teal": 3074, + "source": 716, "pc": [ 3042, 3043 ] }, { - "teal": 3071, - "source": 711, + "teal": 3075, + "source": 716, "pc": [ 3044, 3045, @@ -14977,118 +14992,118 @@ ] }, { - "teal": 3072, - "source": 711, + "teal": 3076, + "source": 716, "pc": [ 3047 ] }, { - "teal": 3073, - "source": 711, + "teal": 3077, + "source": 716, "pc": [ 3048 ] }, { - "teal": 3074, - "source": 711, + "teal": 3078, + "source": 716, "pc": [ 3049 ] }, { - "teal": 3075, - "source": 711, + "teal": 3079, + "source": 716, "pc": [ 3050, 3051 ] }, { - "teal": 3076, - "source": 711, + "teal": 3080, + "source": 716, "pc": [ 3052 ] }, { - "teal": 3080, - "source": 712, + "teal": 3084, + "source": 717, "pc": [ 3053, 3054 ] }, { - "teal": 3081, - "source": 712, + "teal": 3085, + "source": 717, "pc": [ 3055 ] }, { - "teal": 3082, - "source": 712, + "teal": 3086, + "source": 717, "pc": [ 3056, 3057 ] }, { - "teal": 3083, - "source": 712, + "teal": 3087, + "source": 717, "pc": [ 3058 ] }, { - "teal": 3084, - "source": 712, + "teal": 3088, + "source": 717, "pc": [ 3059, 3060 ] }, { - "teal": 3085, - "source": 712, + "teal": 3089, + "source": 717, "pc": [ 3061 ] }, { - "teal": 3086, - "source": 712, + "teal": 3090, + "source": 717, "pc": [ 3062 ] }, { - "teal": 3091, - "source": 714, + "teal": 3095, + "source": 719, "pc": [ 3063, 3064 ] }, { - "teal": 3092, - "source": 714, + "teal": 3096, + "source": 719, "pc": [ 3065 ] }, { - "teal": 3093, - "source": 714, + "teal": 3097, + "source": 719, "pc": [ 3066 ] }, { - "teal": 3094, - "source": 714, + "teal": 3098, + "source": 719, "pc": [ 3067, 3068, @@ -15096,38 +15111,38 @@ ] }, { - "teal": 3099, - "source": 715, + "teal": 3103, + "source": 720, "pc": [ 3070, 3071 ] }, { - "teal": 3100, - "source": 715, + "teal": 3104, + "source": 720, "pc": [ 3072 ] }, { - "teal": 3101, - "source": 715, + "teal": 3105, + "source": 720, "pc": [ 3073 ] }, { - "teal": 3102, - "source": 715, + "teal": 3106, + "source": 720, "pc": [ 3074, 3075 ] }, { - "teal": 3103, - "source": 715, + "teal": 3107, + "source": 720, "pc": [ 3076, 3077, @@ -15135,119 +15150,119 @@ ] }, { - "teal": 3104, - "source": 715, + "teal": 3108, + "source": 720, "pc": [ 3079 ] }, { - "teal": 3105, - "source": 715, + "teal": 3109, + "source": 720, "pc": [ 3080 ] }, { - "teal": 3106, - "source": 715, + "teal": 3110, + "source": 720, "pc": [ 3081 ] }, { - "teal": 3107, - "source": 715, + "teal": 3111, + "source": 720, "pc": [ 3082, 3083 ] }, { - "teal": 3108, - "source": 715, + "teal": 3112, + "source": 720, "pc": [ 3084 ] }, { - "teal": 3109, - "source": 715, + "teal": 3113, + "source": 720, "pc": [ 3085 ] }, { - "teal": 3110, - "source": 715, + "teal": 3114, + "source": 720, "pc": [ 3086, 3087 ] }, { - "teal": 3114, - "source": 716, + "teal": 3118, + "source": 721, "pc": [ 3088, 3089 ] }, { - "teal": 3115, - "source": 716, + "teal": 3119, + "source": 721, "pc": [ 3090 ] }, { - "teal": 3116, - "source": 716, + "teal": 3120, + "source": 721, "pc": [ 3091 ] }, { - "teal": 3119, - "source": 716, + "teal": 3123, + "source": 721, "errorMessage": "rewardRemoved can't be set if validator doesn't have reward token!", "pc": [ 3092 ] }, { - "teal": 3126, - "source": 718, + "teal": 3130, + "source": 723, "pc": [ 3093, 3094 ] }, { - "teal": 3127, - "source": 718, + "teal": 3131, + "source": 723, "pc": [ 3095 ] }, { - "teal": 3128, - "source": 718, + "teal": 3132, + "source": 723, "pc": [ 3096 ] }, { - "teal": 3129, - "source": 718, + "teal": 3133, + "source": 723, "pc": [ 3097, 3098 ] }, { - "teal": 3130, - "source": 718, + "teal": 3134, + "source": 723, "pc": [ 3099, 3100, @@ -15255,111 +15270,111 @@ ] }, { - "teal": 3131, - "source": 718, + "teal": 3135, + "source": 723, "pc": [ 3102 ] }, { - "teal": 3132, - "source": 718, + "teal": 3136, + "source": 723, "pc": [ 3103 ] }, { - "teal": 3133, - "source": 718, + "teal": 3137, + "source": 723, "pc": [ 3104 ] }, { - "teal": 3134, - "source": 718, + "teal": 3138, + "source": 723, "pc": [ 3105, 3106 ] }, { - "teal": 3135, - "source": 718, + "teal": 3139, + "source": 723, "pc": [ 3107 ] }, { - "teal": 3136, - "source": 718, + "teal": 3140, + "source": 723, "pc": [ 3108 ] }, { - "teal": 3137, - "source": 718, + "teal": 3141, + "source": 723, "pc": [ 3109, 3110 ] }, { - "teal": 3138, - "source": 718, + "teal": 3142, + "source": 723, "pc": [ 3111 ] }, { - "teal": 3141, - "source": 717, + "teal": 3145, + "source": 722, "errorMessage": "reward being removed must be covered by hold back amount", "pc": [ 3112 ] }, { - "teal": 3145, - "source": 723, + "teal": 3149, + "source": 728, "pc": [ 3113, 3114 ] }, { - "teal": 3146, - "source": 723, + "teal": 3150, + "source": 728, "pc": [ 3115 ] }, { - "teal": 3147, - "source": 723, + "teal": 3151, + "source": 728, "pc": [ 3116 ] }, { - "teal": 3148, - "source": 723, + "teal": 3152, + "source": 728, "pc": [ 3117 ] }, { - "teal": 3149, - "source": 723, + "teal": 3153, + "source": 728, "pc": [ 3118, 3119 ] }, { - "teal": 3150, - "source": 723, + "teal": 3154, + "source": 728, "pc": [ 3120, 3121, @@ -15367,88 +15382,88 @@ ] }, { - "teal": 3151, - "source": 723, + "teal": 3155, + "source": 728, "pc": [ 3123 ] }, { - "teal": 3152, - "source": 723, + "teal": 3156, + "source": 728, "pc": [ 3124 ] }, { - "teal": 3153, - "source": 723, + "teal": 3157, + "source": 728, "pc": [ 3125 ] }, { - "teal": 3154, - "source": 723, + "teal": 3158, + "source": 728, "pc": [ 3126, 3127 ] }, { - "teal": 3155, - "source": 723, + "teal": 3159, + "source": 728, "pc": [ 3128 ] }, { - "teal": 3156, - "source": 723, + "teal": 3160, + "source": 728, "pc": [ 3129 ] }, { - "teal": 3157, - "source": 723, + "teal": 3161, + "source": 728, "pc": [ 3130, 3131 ] }, { - "teal": 3158, - "source": 723, + "teal": 3162, + "source": 728, "pc": [ 3132 ] }, { - "teal": 3159, - "source": 723, + "teal": 3163, + "source": 728, "pc": [ 3133 ] }, { - "teal": 3160, - "source": 723, + "teal": 3164, + "source": 728, "pc": [ 3134 ] }, { - "teal": 3161, - "source": 723, + "teal": 3165, + "source": 728, "pc": [ 3135, 3136 ] }, { - "teal": 3162, - "source": 723, + "teal": 3166, + "source": 728, "pc": [ 3137, 3138, @@ -15456,52 +15471,52 @@ ] }, { - "teal": 3163, - "source": 723, + "teal": 3167, + "source": 728, "pc": [ 3140 ] }, { - "teal": 3164, - "source": 723, + "teal": 3168, + "source": 728, "pc": [ 3141 ] }, { - "teal": 3165, - "source": 723, + "teal": 3169, + "source": 728, "pc": [ 3142 ] }, { - "teal": 3166, - "source": 723, + "teal": 3170, + "source": 728, "pc": [ 3143, 3144 ] }, { - "teal": 3167, - "source": 723, + "teal": 3171, + "source": 728, "pc": [ 3145 ] }, { - "teal": 3172, - "source": 728, + "teal": 3176, + "source": 733, "pc": [ 3146, 3147 ] }, { - "teal": 3173, - "source": 728, + "teal": 3177, + "source": 733, "pc": [ 3148, 3149, @@ -15509,29 +15524,29 @@ ] }, { - "teal": 3174, - "source": 728, + "teal": 3178, + "source": 733, "pc": [ 3151 ] }, { - "teal": 3175, - "source": 728, + "teal": 3179, + "source": 733, "pc": [ 3152 ] }, { - "teal": 3176, - "source": 728, + "teal": 3180, + "source": 733, "pc": [ 3153 ] }, { - "teal": 3177, - "source": 728, + "teal": 3181, + "source": 733, "pc": [ 3154, 3155, @@ -15539,77 +15554,77 @@ ] }, { - "teal": 3185, - "source": 729, + "teal": 3189, + "source": 734, "pc": [ 3157 ] }, { - "teal": 3186, - "source": 729, + "teal": 3190, + "source": 734, "pc": [ 3158, 3159 ] }, { - "teal": 3187, - "source": 729, + "teal": 3191, + "source": 734, "pc": [ 3160, 3161 ] }, { - "teal": 3188, - "source": 729, + "teal": 3192, + "source": 734, "pc": [ 3162, 3163 ] }, { - "teal": 3189, - "source": 729, + "teal": 3193, + "source": 734, "pc": [ 3164, 3165 ] }, { - "teal": 3193, - "source": 730, + "teal": 3197, + "source": 735, "pc": [ 3166, 3167 ] }, { - "teal": 3194, - "source": 730, + "teal": 3198, + "source": 735, "pc": [ 3168 ] }, { - "teal": 3195, - "source": 730, + "teal": 3199, + "source": 735, "pc": [ 3169 ] }, { - "teal": 3196, - "source": 730, + "teal": 3200, + "source": 735, "pc": [ 3170, 3171 ] }, { - "teal": 3197, - "source": 730, + "teal": 3201, + "source": 735, "pc": [ 3172, 3173, @@ -15617,159 +15632,159 @@ ] }, { - "teal": 3198, - "source": 730, + "teal": 3202, + "source": 735, "pc": [ 3175 ] }, { - "teal": 3199, - "source": 730, + "teal": 3203, + "source": 735, "pc": [ 3176 ] }, { - "teal": 3200, - "source": 730, + "teal": 3204, + "source": 735, "pc": [ 3177 ] }, { - "teal": 3201, - "source": 730, + "teal": 3205, + "source": 735, "pc": [ 3178, 3179 ] }, { - "teal": 3202, - "source": 730, + "teal": 3206, + "source": 735, "pc": [ 3180 ] }, { - "teal": 3203, - "source": 730, + "teal": 3207, + "source": 735, "pc": [ 3181 ] }, { - "teal": 3204, - "source": 730, + "teal": 3208, + "source": 735, "pc": [ 3182, 3183 ] }, { - "teal": 3208, - "source": 731, + "teal": 3212, + "source": 736, "pc": [ 3184, 3185 ] }, { - "teal": 3209, - "source": 731, + "teal": 3213, + "source": 736, "pc": [ 3186, 3187 ] }, { - "teal": 3210, - "source": 731, + "teal": 3214, + "source": 736, "pc": [ 3188, 3189 ] }, { - "teal": 3211, - "source": 731, + "teal": 3215, + "source": 736, "pc": [ 3190 ] }, { - "teal": 3212, - "source": 731, + "teal": 3216, + "source": 736, "pc": [ 3191, 3192 ] }, { - "teal": 3213, - "source": 731, + "teal": 3217, + "source": 736, "pc": [ 3193, 3194 ] }, { - "teal": 3214, - "source": 731, + "teal": 3218, + "source": 736, "pc": [ 3195 ] }, { - "teal": 3215, - "source": 731, + "teal": 3219, + "source": 736, "pc": [ 3196, 3197 ] }, { - "teal": 3218, - "source": 729, + "teal": 3222, + "source": 734, "pc": [ 3198 ] }, { - "teal": 3219, - "source": 729, + "teal": 3223, + "source": 734, "pc": [ 3199, 3200 ] }, { - "teal": 3222, - "source": 729, + "teal": 3226, + "source": 734, "pc": [ 3201 ] }, { - "teal": 3235, - "source": 734, + "teal": 3239, + "source": 739, "pc": [ 3202, 3203 ] }, { - "teal": 3236, - "source": 735, + "teal": 3240, + "source": 740, "pc": [ 3204, 3205 ] }, { - "teal": 3237, - "source": 735, + "teal": 3241, + "source": 740, "pc": [ 3206, 3207, @@ -15777,30 +15792,30 @@ ] }, { - "teal": 3238, - "source": 735, + "teal": 3242, + "source": 740, "pc": [ 3209 ] }, { - "teal": 3239, - "source": 735, + "teal": 3243, + "source": 740, "pc": [ 3210 ] }, { - "teal": 3240, - "source": 736, + "teal": 3244, + "source": 741, "pc": [ 3211, 3212 ] }, { - "teal": 3241, - "source": 736, + "teal": 3245, + "source": 741, "pc": [ 3213, 3214, @@ -15808,59 +15823,59 @@ ] }, { - "teal": 3242, - "source": 736, + "teal": 3246, + "source": 741, "pc": [ 3216 ] }, { - "teal": 3243, - "source": 736, + "teal": 3247, + "source": 741, "pc": [ 3217 ] }, { - "teal": 3244, - "source": 736, + "teal": 3248, + "source": 741, "pc": [ 3218 ] }, { - "teal": 3245, - "source": 736, + "teal": 3249, + "source": 741, "pc": [ 3219 ] }, { - "teal": 3246, - "source": 736, + "teal": 3250, + "source": 741, "pc": [ 3220, 3221 ] }, { - "teal": 3247, - "source": 736, + "teal": 3251, + "source": 741, "pc": [ 3222 ] }, { - "teal": 3250, - "source": 736, + "teal": 3254, + "source": 741, "errorMessage": "poolKey.poolId as uint16 overflowed 16 bits", "pc": [ 3223 ] }, { - "teal": 3251, - "source": 736, + "teal": 3255, + "source": 741, "pc": [ 3224, 3225, @@ -15868,23 +15883,23 @@ ] }, { - "teal": 3252, - "source": 736, + "teal": 3256, + "source": 741, "pc": [ 3227 ] }, { - "teal": 3253, - "source": 737, + "teal": 3257, + "source": 742, "pc": [ 3228, 3229 ] }, { - "teal": 3254, - "source": 737, + "teal": 3258, + "source": 742, "pc": [ 3230, 3231, @@ -15892,124 +15907,124 @@ ] }, { - "teal": 3255, - "source": 737, + "teal": 3259, + "source": 742, "pc": [ 3233 ] }, { - "teal": 3256, - "source": 737, + "teal": 3260, + "source": 742, "pc": [ 3234 ] }, { - "teal": 3257, - "source": 737, + "teal": 3261, + "source": 742, "pc": [ 3235 ] }, { - "teal": 3258, - "source": 738, + "teal": 3262, + "source": 743, "pc": [ 3236, 3237 ] }, { - "teal": 3259, - "source": 738, + "teal": 3263, + "source": 743, "pc": [ 3238 ] }, { - "teal": 3260, - "source": 739, + "teal": 3264, + "source": 744, "pc": [ 3239, 3240 ] }, { - "teal": 3261, - "source": 739, + "teal": 3265, + "source": 744, "pc": [ 3241 ] }, { - "teal": 3262, - "source": 739, + "teal": 3266, + "source": 744, "pc": [ 3242 ] }, { - "teal": 3263, - "source": 741, + "teal": 3267, + "source": 746, "pc": [ 3243, 3244 ] }, { - "teal": 3264, - "source": 741, + "teal": 3268, + "source": 746, "pc": [ 3245 ] }, { - "teal": 3265, - "source": 741, + "teal": 3269, + "source": 746, "pc": [ 3246 ] }, { - "teal": 3266, - "source": 740, + "teal": 3270, + "source": 745, "pc": [ 3247, 3248 ] }, { - "teal": 3267, - "source": 740, + "teal": 3271, + "source": 745, "pc": [ 3249 ] }, { - "teal": 3268, - "source": 740, + "teal": 3272, + "source": 745, "pc": [ 3250 ] }, { - "teal": 3269, - "source": 734, + "teal": 3273, + "source": 739, "pc": [ 3251 ] }, { - "teal": 3270, - "source": 734, + "teal": 3274, + "source": 739, "pc": [ 3252 ] }, { - "teal": 3271, - "source": 714, + "teal": 3275, + "source": 719, "pc": [ 3253, 3254, @@ -16017,24 +16032,24 @@ ] }, { - "teal": 3285, - "source": 744, + "teal": 3289, + "source": 749, "pc": [ 3256, 3257 ] }, { - "teal": 3286, - "source": 745, + "teal": 3290, + "source": 750, "pc": [ 3258, 3259 ] }, { - "teal": 3287, - "source": 745, + "teal": 3291, + "source": 750, "pc": [ 3260, 3261, @@ -16042,30 +16057,30 @@ ] }, { - "teal": 3288, - "source": 745, + "teal": 3292, + "source": 750, "pc": [ 3263 ] }, { - "teal": 3289, - "source": 745, + "teal": 3293, + "source": 750, "pc": [ 3264 ] }, { - "teal": 3290, - "source": 746, + "teal": 3294, + "source": 751, "pc": [ 3265, 3266 ] }, { - "teal": 3291, - "source": 746, + "teal": 3295, + "source": 751, "pc": [ 3267, 3268, @@ -16073,59 +16088,59 @@ ] }, { - "teal": 3292, - "source": 746, + "teal": 3296, + "source": 751, "pc": [ 3270 ] }, { - "teal": 3293, - "source": 746, + "teal": 3297, + "source": 751, "pc": [ 3271 ] }, { - "teal": 3294, - "source": 746, + "teal": 3298, + "source": 751, "pc": [ 3272 ] }, { - "teal": 3295, - "source": 746, + "teal": 3299, + "source": 751, "pc": [ 3273 ] }, { - "teal": 3296, - "source": 746, + "teal": 3300, + "source": 751, "pc": [ 3274, 3275 ] }, { - "teal": 3297, - "source": 746, + "teal": 3301, + "source": 751, "pc": [ 3276 ] }, { - "teal": 3300, - "source": 746, + "teal": 3304, + "source": 751, "errorMessage": "poolKey.poolId as uint16 overflowed 16 bits", "pc": [ 3277 ] }, { - "teal": 3301, - "source": 746, + "teal": 3305, + "source": 751, "pc": [ 3278, 3279, @@ -16133,23 +16148,23 @@ ] }, { - "teal": 3302, - "source": 746, + "teal": 3306, + "source": 751, "pc": [ 3281 ] }, { - "teal": 3303, - "source": 747, + "teal": 3307, + "source": 752, "pc": [ 3282, 3283 ] }, { - "teal": 3304, - "source": 747, + "teal": 3308, + "source": 752, "pc": [ 3284, 3285, @@ -16157,118 +16172,118 @@ ] }, { - "teal": 3305, - "source": 747, + "teal": 3309, + "source": 752, "pc": [ 3287 ] }, { - "teal": 3306, - "source": 747, + "teal": 3310, + "source": 752, "pc": [ 3288 ] }, { - "teal": 3307, - "source": 747, + "teal": 3311, + "source": 752, "pc": [ 3289 ] }, { - "teal": 3308, - "source": 748, + "teal": 3312, + "source": 753, "pc": [ 3290, 3291 ] }, { - "teal": 3309, - "source": 748, + "teal": 3313, + "source": 753, "pc": [ 3292 ] }, { - "teal": 3310, - "source": 749, + "teal": 3314, + "source": 754, "pc": [ 3293, 3294 ] }, { - "teal": 3311, - "source": 749, + "teal": 3315, + "source": 754, "pc": [ 3295 ] }, { - "teal": 3312, - "source": 749, + "teal": 3316, + "source": 754, "pc": [ 3296 ] }, { - "teal": 3313, - "source": 752, + "teal": 3317, + "source": 757, "pc": [ 3297, 3298 ] }, { - "teal": 3314, - "source": 752, + "teal": 3318, + "source": 757, "pc": [ 3299 ] }, { - "teal": 3315, - "source": 751, + "teal": 3319, + "source": 756, "pc": [ 3300, 3301 ] }, { - "teal": 3316, - "source": 751, + "teal": 3320, + "source": 756, "pc": [ 3302 ] }, { - "teal": 3317, - "source": 744, + "teal": 3321, + "source": 749, "pc": [ 3303 ] }, { - "teal": 3318, - "source": 744, + "teal": 3322, + "source": 749, "pc": [ 3304 ] }, { - "teal": 3324, - "source": 756, + "teal": 3328, + "source": 761, "pc": [ 3305, 3306 ] }, { - "teal": 3325, - "source": 756, + "teal": 3329, + "source": 761, "pc": [ 3307, 3308, @@ -16276,24 +16291,24 @@ ] }, { - "teal": 3330, - "source": 758, + "teal": 3334, + "source": 763, "pc": [ 3310, 3311 ] }, { - "teal": 3331, - "source": 758, + "teal": 3335, + "source": 763, "pc": [ 3312, 3313 ] }, { - "teal": 3332, - "source": 758, + "teal": 3336, + "source": 763, "pc": [ 3314, 3315, @@ -16301,81 +16316,81 @@ ] }, { - "teal": 3333, - "source": 758, + "teal": 3337, + "source": 763, "pc": [ 3317 ] }, { - "teal": 3334, - "source": 758, + "teal": 3338, + "source": 763, "pc": [ 3318 ] }, { - "teal": 3335, - "source": 758, + "teal": 3339, + "source": 763, "pc": [ 3319 ] }, { - "teal": 3336, - "source": 758, + "teal": 3340, + "source": 763, "pc": [ 3320, 3321 ] }, { - "teal": 3337, - "source": 758, + "teal": 3341, + "source": 763, "pc": [ 3322 ] }, { - "teal": 3338, - "source": 758, + "teal": 3342, + "source": 763, "pc": [ 3323 ] }, { - "teal": 3339, - "source": 758, + "teal": 3343, + "source": 763, "pc": [ 3324 ] }, { - "teal": 3340, - "source": 758, + "teal": 3344, + "source": 763, "pc": [ 3325 ] }, { - "teal": 3341, - "source": 758, + "teal": 3345, + "source": 763, "pc": [ 3326, 3327 ] }, { - "teal": 3342, - "source": 758, + "teal": 3346, + "source": 763, "pc": [ 3328, 3329 ] }, { - "teal": 3343, - "source": 758, + "teal": 3347, + "source": 763, "pc": [ 3330, 3331, @@ -16383,88 +16398,88 @@ ] }, { - "teal": 3344, - "source": 758, + "teal": 3348, + "source": 763, "pc": [ 3333 ] }, { - "teal": 3345, - "source": 758, + "teal": 3349, + "source": 763, "pc": [ 3334 ] }, { - "teal": 3346, - "source": 758, + "teal": 3350, + "source": 763, "pc": [ 3335 ] }, { - "teal": 3347, - "source": 758, + "teal": 3351, + "source": 763, "pc": [ 3336, 3337 ] }, { - "teal": 3348, - "source": 758, + "teal": 3352, + "source": 763, "pc": [ 3338 ] }, { - "teal": 3349, - "source": 758, + "teal": 3353, + "source": 763, "pc": [ 3339 ] }, { - "teal": 3350, - "source": 758, + "teal": 3354, + "source": 763, "pc": [ 3340 ] }, { - "teal": 3351, - "source": 758, + "teal": 3355, + "source": 763, "pc": [ 3341 ] }, { - "teal": 3352, - "source": 758, + "teal": 3356, + "source": 763, "pc": [ 3342, 3343 ] }, { - "teal": 3353, - "source": 758, + "teal": 3357, + "source": 763, "pc": [ 3344 ] }, { - "teal": 3354, - "source": 758, + "teal": 3358, + "source": 763, "pc": [ 3345, 3346 ] }, { - "teal": 3355, - "source": 758, + "teal": 3359, + "source": 763, "pc": [ 3347, 3348, @@ -16472,72 +16487,72 @@ ] }, { - "teal": 3356, - "source": 758, + "teal": 3360, + "source": 763, "pc": [ 3350 ] }, { - "teal": 3357, - "source": 758, + "teal": 3361, + "source": 763, "pc": [ 3351 ] }, { - "teal": 3358, - "source": 758, + "teal": 3362, + "source": 763, "pc": [ 3352 ] }, { - "teal": 3359, - "source": 758, + "teal": 3363, + "source": 763, "pc": [ 3353, 3354 ] }, { - "teal": 3360, - "source": 758, + "teal": 3364, + "source": 763, "pc": [ 3355 ] }, { - "teal": 3361, - "source": 758, + "teal": 3365, + "source": 763, "pc": [ 3356 ] }, { - "teal": 3362, - "source": 758, + "teal": 3366, + "source": 763, "pc": [ 3357 ] }, { - "teal": 3363, - "source": 758, + "teal": 3367, + "source": 763, "pc": [ 3358 ] }, { - "teal": 3364, - "source": 758, + "teal": 3368, + "source": 763, "pc": [ 3359 ] }, { - "teal": 3365, - "source": 758, + "teal": 3369, + "source": 763, "pc": [ 3360, 3361, @@ -16545,23 +16560,23 @@ ] }, { - "teal": 3366, - "source": 758, + "teal": 3370, + "source": 763, "pc": [ 3363 ] }, { - "teal": 3367, - "source": 758, + "teal": 3371, + "source": 763, "pc": [ 3364, 3365 ] }, { - "teal": 3368, - "source": 758, + "teal": 3372, + "source": 763, "pc": [ 3366, 3367, @@ -16569,52 +16584,52 @@ ] }, { - "teal": 3369, - "source": 758, + "teal": 3373, + "source": 763, "pc": [ 3369 ] }, { - "teal": 3370, - "source": 758, + "teal": 3374, + "source": 763, "pc": [ 3370 ] }, { - "teal": 3371, - "source": 758, + "teal": 3375, + "source": 763, "pc": [ 3371 ] }, { - "teal": 3372, - "source": 758, + "teal": 3376, + "source": 763, "pc": [ 3372, 3373 ] }, { - "teal": 3373, - "source": 758, + "teal": 3377, + "source": 763, "pc": [ 3374 ] }, { - "teal": 3381, - "source": 761, + "teal": 3385, + "source": 766, "pc": [ 3375, 3376 ] }, { - "teal": 3382, - "source": 761, + "teal": 3386, + "source": 766, "pc": [ 3377, 3378, @@ -16622,30 +16637,30 @@ ] }, { - "teal": 3383, - "source": 761, + "teal": 3387, + "source": 766, "pc": [ 3380 ] }, { - "teal": 3384, - "source": 761, + "teal": 3388, + "source": 766, "pc": [ 3381 ] }, { - "teal": 3385, - "source": 762, + "teal": 3389, + "source": 767, "pc": [ 3382, 3383 ] }, { - "teal": 3386, - "source": 762, + "teal": 3390, + "source": 767, "pc": [ 3384, 3385, @@ -16653,37 +16668,37 @@ ] }, { - "teal": 3387, - "source": 762, + "teal": 3391, + "source": 767, "pc": [ 3387 ] }, { - "teal": 3388, - "source": 762, + "teal": 3392, + "source": 767, "pc": [ 3388 ] }, { - "teal": 3389, - "source": 762, + "teal": 3393, + "source": 767, "pc": [ 3389 ] }, { - "teal": 3390, - "source": 763, + "teal": 3394, + "source": 768, "pc": [ 3390, 3391 ] }, { - "teal": 3391, - "source": 763, + "teal": 3395, + "source": 768, "pc": [ 3392, 3393, @@ -16691,37 +16706,37 @@ ] }, { - "teal": 3392, - "source": 763, + "teal": 3396, + "source": 768, "pc": [ 3395 ] }, { - "teal": 3393, - "source": 763, + "teal": 3397, + "source": 768, "pc": [ 3396 ] }, { - "teal": 3394, - "source": 763, + "teal": 3398, + "source": 768, "pc": [ 3397 ] }, { - "teal": 3395, - "source": 760, + "teal": 3399, + "source": 765, "pc": [ 3398, 3399 ] }, { - "teal": 3396, - "source": 760, + "teal": 3400, + "source": 765, "pc": [ 3400, 3401, @@ -16729,116 +16744,116 @@ ] }, { - "teal": 3397, - "source": 760, + "teal": 3401, + "source": 765, "pc": [ 3403, 3404 ] }, { - "teal": 3401, - "source": 765, + "teal": 3405, + "source": 770, "pc": [ 3405, 3406 ] }, { - "teal": 3402, - "source": 765, + "teal": 3406, + "source": 770, "pc": [ 3407, 3408 ] }, { - "teal": 3403, - "source": 765, + "teal": 3407, + "source": 770, "pc": [ 3409, 3410 ] }, { - "teal": 3404, - "source": 765, + "teal": 3408, + "source": 770, "pc": [ 3411 ] }, { - "teal": 3405, - "source": 765, + "teal": 3409, + "source": 770, "pc": [ 3412 ] }, { - "teal": 3406, - "source": 765, + "teal": 3410, + "source": 770, "pc": [ 3413, 3414 ] }, { - "teal": 3410, - "source": 766, + "teal": 3414, + "source": 771, "pc": [ 3415, 3416 ] }, { - "teal": 3411, - "source": 766, + "teal": 3415, + "source": 771, "pc": [ 3417, 3418 ] }, { - "teal": 3412, - "source": 766, + "teal": 3416, + "source": 771, "pc": [ 3419, 3420 ] }, { - "teal": 3413, - "source": 766, + "teal": 3417, + "source": 771, "pc": [ 3421 ] }, { - "teal": 3414, - "source": 766, + "teal": 3418, + "source": 771, "pc": [ 3422 ] }, { - "teal": 3415, - "source": 766, + "teal": 3419, + "source": 771, "pc": [ 3423, 3424 ] }, { - "teal": 3420, - "source": 768, + "teal": 3424, + "source": 773, "pc": [ 3425, 3426 ] }, { - "teal": 3421, - "source": 768, + "teal": 3425, + "source": 773, "pc": [ 3427, 3428, @@ -16846,45 +16861,45 @@ ] }, { - "teal": 3426, - "source": 769, + "teal": 3430, + "source": 774, "pc": [ 3430, 3431 ] }, { - "teal": 3427, - "source": 769, + "teal": 3431, + "source": 774, "pc": [ 3432 ] }, { - "teal": 3428, - "source": 769, + "teal": 3432, + "source": 774, "pc": [ 3433 ] }, { - "teal": 3429, - "source": 769, + "teal": 3433, + "source": 774, "pc": [ 3434 ] }, { - "teal": 3430, - "source": 769, + "teal": 3434, + "source": 774, "pc": [ 3435, 3436 ] }, { - "teal": 3431, - "source": 769, + "teal": 3435, + "source": 774, "pc": [ 3437, 3438, @@ -16892,87 +16907,87 @@ ] }, { - "teal": 3432, - "source": 769, + "teal": 3436, + "source": 774, "pc": [ 3440 ] }, { - "teal": 3433, - "source": 769, + "teal": 3437, + "source": 774, "pc": [ 3441 ] }, { - "teal": 3434, - "source": 769, + "teal": 3438, + "source": 774, "pc": [ 3442 ] }, { - "teal": 3435, - "source": 769, + "teal": 3439, + "source": 774, "pc": [ 3443, 3444 ] }, { - "teal": 3436, - "source": 769, + "teal": 3440, + "source": 774, "pc": [ 3445 ] }, { - "teal": 3437, - "source": 769, + "teal": 3441, + "source": 774, "pc": [ 3446 ] }, { - "teal": 3438, - "source": 769, + "teal": 3442, + "source": 774, "pc": [ 3447 ] }, { - "teal": 3439, - "source": 769, + "teal": 3443, + "source": 774, "pc": [ 3448 ] }, { - "teal": 3440, - "source": 769, + "teal": 3444, + "source": 774, "pc": [ 3449 ] }, { - "teal": 3441, - "source": 769, + "teal": 3445, + "source": 774, "pc": [ 3450 ] }, { - "teal": 3442, - "source": 769, + "teal": 3446, + "source": 774, "pc": [ 3451, 3452 ] }, { - "teal": 3443, - "source": 769, + "teal": 3447, + "source": 774, "pc": [ 3453, 3454, @@ -16980,52 +16995,52 @@ ] }, { - "teal": 3444, - "source": 769, + "teal": 3448, + "source": 774, "pc": [ 3456 ] }, { - "teal": 3445, - "source": 769, + "teal": 3449, + "source": 774, "pc": [ 3457 ] }, { - "teal": 3446, - "source": 769, + "teal": 3450, + "source": 774, "pc": [ 3458 ] }, { - "teal": 3447, - "source": 769, + "teal": 3451, + "source": 774, "pc": [ 3459, 3460 ] }, { - "teal": 3448, - "source": 769, + "teal": 3452, + "source": 774, "pc": [ 3461 ] }, { - "teal": 3454, - "source": 772, + "teal": 3458, + "source": 777, "pc": [ 3462, 3463 ] }, { - "teal": 3455, - "source": 772, + "teal": 3459, + "source": 777, "pc": [ 3464, 3465, @@ -17033,73 +17048,73 @@ ] }, { - "teal": 3460, - "source": 773, + "teal": 3464, + "source": 778, "pc": [ 3467, 3468 ] }, { - "teal": 3461, - "source": 773, + "teal": 3465, + "source": 778, "pc": [ 3469 ] }, { - "teal": 3462, - "source": 773, + "teal": 3466, + "source": 778, "pc": [ 3470 ] }, { - "teal": 3463, - "source": 773, + "teal": 3467, + "source": 778, "pc": [ 3471 ] }, { - "teal": 3464, - "source": 773, + "teal": 3468, + "source": 778, "pc": [ 3472, 3473 ] }, { - "teal": 3465, - "source": 773, + "teal": 3469, + "source": 778, "pc": [ 3474 ] }, { - "teal": 3466, - "source": 773, + "teal": 3470, + "source": 778, "pc": [ 3475 ] }, { - "teal": 3471, - "source": 693, + "teal": 3475, + "source": 698, "pc": [ 3476 ] }, { - "teal": 3476, - "source": 789, + "teal": 3480, + "source": 794, "pc": [ 3477 ] }, { - "teal": 3479, - "source": 792, + "teal": 3483, + "source": 798, "pc": [ 3478, 3479, @@ -17107,15 +17122,15 @@ ] }, { - "teal": 3480, - "source": 792, + "teal": 3484, + "source": 798, "pc": [ 3481 ] }, { - "teal": 3483, - "source": 791, + "teal": 3487, + "source": 797, "pc": [ 3482, 3483, @@ -17123,45 +17138,45 @@ ] }, { - "teal": 3484, - "source": 791, + "teal": 3488, + "source": 797, "pc": [ 3485 ] }, { - "teal": 3485, - "source": 791, + "teal": 3489, + "source": 797, "pc": [ 3486 ] }, { - "teal": 3486, - "source": 791, + "teal": 3490, + "source": 797, "pc": [ 3487, 3488 ] }, { - "teal": 3487, - "source": 791, + "teal": 3491, + "source": 797, "pc": [ 3489 ] }, { - "teal": 3490, - "source": 791, + "teal": 3494, + "source": 797, "errorMessage": "argument 1 (staker) for findPoolForStaker must be a address", "pc": [ 3490 ] }, { - "teal": 3493, - "source": 790, + "teal": 3497, + "source": 796, "pc": [ 3491, 3492, @@ -17169,15 +17184,15 @@ ] }, { - "teal": 3494, - "source": 790, + "teal": 3498, + "source": 796, "pc": [ 3494 ] }, { - "teal": 3497, - "source": 789, + "teal": 3501, + "source": 794, "pc": [ 3495, 3496, @@ -17185,36 +17200,36 @@ ] }, { - "teal": 3498, - "source": 789, + "teal": 3502, + "source": 794, "pc": [ 3498 ] }, { - "teal": 3499, - "source": 789, + "teal": 3503, + "source": 794, "pc": [ 3499 ] }, { - "teal": 3500, - "source": 789, + "teal": 3504, + "source": 794, "pc": [ 3500 ] }, { - "teal": 3501, - "source": 789, + "teal": 3505, + "source": 794, "pc": [ 3501 ] }, { - "teal": 3515, - "source": 789, + "teal": 3519, + "source": 794, "pc": [ 3502, 3503, @@ -17222,61 +17237,61 @@ ] }, { - "teal": 3518, - "source": 789, + "teal": 3522, + "source": 794, "pc": [ 3505 ] }, { - "teal": 3519, - "source": 789, + "teal": 3523, + "source": 794, "pc": [ 3506, 3507 ] }, { - "teal": 3523, - "source": 794, + "teal": 3527, + "source": 800, "pc": [ 3508 ] }, { - "teal": 3524, - "source": 794, + "teal": 3528, + "source": 800, "pc": [ 3509, 3510 ] }, { - "teal": 3528, - "source": 795, + "teal": 3532, + "source": 801, "pc": [ 3511 ] }, { - "teal": 3529, - "source": 795, + "teal": 3533, + "source": 801, "pc": [ 3512, 3513 ] }, { - "teal": 3533, - "source": 803, + "teal": 3537, + "source": 809, "pc": [ 3514, 3515 ] }, { - "teal": 3534, - "source": 803, + "teal": 3538, + "source": 809, "pc": [ 3516, 3517, @@ -17284,59 +17299,59 @@ ] }, { - "teal": 3535, - "source": 803, + "teal": 3539, + "source": 809, "pc": [ 3519, 3520 ] }, { - "teal": 3540, - "source": 806, + "teal": 3544, + "source": 812, "pc": [ 3521 ] }, { - "teal": 3541, - "source": 806, + "teal": 3545, + "source": 812, "pc": [ 3522, 3523 ] }, { - "teal": 3542, - "source": 806, + "teal": 3546, + "source": 812, "pc": [ 3524 ] }, { - "teal": 3543, - "source": 806, + "teal": 3547, + "source": 812, "pc": [ 3525 ] }, { - "teal": 3544, - "source": 806, + "teal": 3548, + "source": 812, "pc": [ 3526 ] }, { - "teal": 3545, - "source": 806, + "teal": 3549, + "source": 812, "pc": [ 3527 ] }, { - "teal": 3546, - "source": 806, + "teal": 3550, + "source": 812, "pc": [ 3528, 3529, @@ -17344,120 +17359,120 @@ ] }, { - "teal": 3551, - "source": 807, + "teal": 3555, + "source": 813, "pc": [ 3531 ] }, { - "teal": 3552, - "source": 807, + "teal": 3556, + "source": 813, "pc": [ 3532, 3533 ] }, { - "teal": 3553, - "source": 807, + "teal": 3557, + "source": 813, "pc": [ 3534 ] }, { - "teal": 3554, - "source": 807, + "teal": 3558, + "source": 813, "pc": [ 3535 ] }, { - "teal": 3557, - "source": 807, + "teal": 3561, + "source": 813, "errorMessage": "box value does not exist: this.stakerPoolSet(staker).value", "pc": [ 3536 ] }, { - "teal": 3558, - "source": 807, + "teal": 3562, + "source": 813, "pc": [ 3537, 3538 ] }, { - "teal": 3562, - "source": 808, + "teal": 3566, + "source": 814, "pc": [ 3539, 3540 ] }, { - "teal": 3563, - "source": 808, + "teal": 3567, + "source": 814, "pc": [ 3541 ] }, { - "teal": 3564, - "source": 808, + "teal": 3568, + "source": 814, "pc": [ 3542 ] }, { - "teal": 3565, - "source": 808, + "teal": 3569, + "source": 814, "pc": [ 3543 ] }, { - "teal": 3569, - "source": 809, + "teal": 3573, + "source": 815, "pc": [ 3544 ] }, { - "teal": 3570, - "source": 809, + "teal": 3574, + "source": 815, "pc": [ 3545, 3546 ] }, { - "teal": 3575, - "source": 809, + "teal": 3579, + "source": 815, "pc": [ 3547, 3548 ] }, { - "teal": 3576, - "source": 809, + "teal": 3580, + "source": 815, "pc": [ 3549, 3550 ] }, { - "teal": 3577, - "source": 809, + "teal": 3581, + "source": 815, "pc": [ 3551 ] }, { - "teal": 3578, - "source": 809, + "teal": 3582, + "source": 815, "pc": [ 3552, 3553, @@ -17465,31 +17480,31 @@ ] }, { - "teal": 3583, - "source": 810, + "teal": 3587, + "source": 816, "pc": [ 3555, 3556 ] }, { - "teal": 3584, - "source": 810, + "teal": 3588, + "source": 816, "pc": [ 3557, 3558 ] }, { - "teal": 3585, - "source": 810, + "teal": 3589, + "source": 816, "pc": [ 3559 ] }, { - "teal": 3586, - "source": 810, + "teal": 3590, + "source": 816, "pc": [ 3560, 3561, @@ -17497,179 +17512,179 @@ ] }, { - "teal": 3591, - "source": 811, + "teal": 3595, + "source": 817, "pc": [ 3563 ] }, { - "teal": 3592, - "source": 811, + "teal": 3596, + "source": 817, "pc": [ 3564, 3565 ] }, { - "teal": 3593, - "source": 811, + "teal": 3597, + "source": 817, "pc": [ 3566, 3567 ] }, { - "teal": 3594, - "source": 811, + "teal": 3598, + "source": 817, "pc": [ 3568 ] }, { - "teal": 3595, - "source": 811, + "teal": 3599, + "source": 817, "pc": [ 3569, 3570 ] }, { - "teal": 3596, - "source": 811, + "teal": 3600, + "source": 817, "pc": [ 3571, 3572 ] }, { - "teal": 3597, - "source": 811, + "teal": 3601, + "source": 817, "pc": [ 3573 ] }, { - "teal": 3598, - "source": 811, + "teal": 3602, + "source": 817, "pc": [ 3574, 3575 ] }, { - "teal": 3599, - "source": 811, + "teal": 3603, + "source": 817, "pc": [ 3576, 3577 ] }, { - "teal": 3600, - "source": 811, + "teal": 3604, + "source": 817, "pc": [ 3578, 3579 ] }, { - "teal": 3601, - "source": 811, + "teal": 3605, + "source": 817, "pc": [ 3580, 3581 ] }, { - "teal": 3602, - "source": 811, + "teal": 3606, + "source": 817, "pc": [ 3582 ] }, { - "teal": 3608, - "source": 813, + "teal": 3612, + "source": 819, "pc": [ 3583, 3584 ] }, { - "teal": 3609, - "source": 813, + "teal": 3613, + "source": 819, "pc": [ 3585, 3586 ] }, { - "teal": 3610, - "source": 813, + "teal": 3614, + "source": 819, "pc": [ 3587 ] }, { - "teal": 3611, - "source": 813, + "teal": 3615, + "source": 819, "pc": [ 3588 ] }, { - "teal": 3612, - "source": 813, + "teal": 3616, + "source": 819, "pc": [ 3589 ] }, { - "teal": 3613, - "source": 813, + "teal": 3617, + "source": 819, "pc": [ 3590 ] }, { - "teal": 3614, - "source": 813, + "teal": 3618, + "source": 819, "pc": [ 3591 ] }, { - "teal": 3615, - "source": 813, + "teal": 3619, + "source": 819, "pc": [ 3592 ] }, { - "teal": 3616, - "source": 813, + "teal": 3620, + "source": 819, "pc": [ 3593 ] }, { - "teal": 3617, - "source": 813, + "teal": 3621, + "source": 819, "pc": [ 3594 ] }, { - "teal": 3618, - "source": 813, + "teal": 3622, + "source": 819, "pc": [ 3595 ] }, { - "teal": 3619, - "source": 813, + "teal": 3623, + "source": 819, "pc": [ 3596, 3597, @@ -17677,8 +17692,8 @@ ] }, { - "teal": 3622, - "source": 814, + "teal": 3626, + "source": 820, "pc": [ 3599, 3600, @@ -17686,103 +17701,103 @@ ] }, { - "teal": 3627, - "source": 816, + "teal": 3631, + "source": 822, "pc": [ 3602 ] }, { - "teal": 3628, - "source": 816, + "teal": 3632, + "source": 822, "pc": [ 3603, 3604 ] }, { - "teal": 3633, - "source": 817, + "teal": 3637, + "source": 823, "pc": [ 3605, 3606 ] }, { - "teal": 3634, - "source": 817, + "teal": 3638, + "source": 823, "pc": [ 3607, 3608 ] }, { - "teal": 3635, - "source": 817, + "teal": 3639, + "source": 823, "pc": [ 3609 ] }, { - "teal": 3636, - "source": 817, + "teal": 3640, + "source": 823, "pc": [ 3610 ] }, { - "teal": 3637, - "source": 817, + "teal": 3641, + "source": 823, "pc": [ 3611 ] }, { - "teal": 3638, - "source": 817, + "teal": 3642, + "source": 823, "pc": [ 3612 ] }, { - "teal": 3639, - "source": 817, + "teal": 3643, + "source": 823, "pc": [ 3613 ] }, { - "teal": 3640, - "source": 817, + "teal": 3644, + "source": 823, "pc": [ 3614 ] }, { - "teal": 3641, - "source": 817, + "teal": 3645, + "source": 823, "pc": [ 3615 ] }, { - "teal": 3642, - "source": 817, + "teal": 3646, + "source": 823, "pc": [ 3616, 3617 ] }, { - "teal": 3643, - "source": 817, + "teal": 3647, + "source": 823, "pc": [ 3618 ] }, { - "teal": 3644, - "source": 817, + "teal": 3648, + "source": 823, "pc": [ 3619, 3620, @@ -17790,235 +17805,235 @@ ] }, { - "teal": 3649, - "source": 819, + "teal": 3653, + "source": 825, "pc": [ 3622 ] }, { - "teal": 3650, - "source": 819, + "teal": 3654, + "source": 825, "pc": [ 3623, 3624 ] }, { - "teal": 3657, - "source": 821, + "teal": 3661, + "source": 827, "pc": [ 3625, 3626 ] }, { - "teal": 3658, - "source": 821, + "teal": 3662, + "source": 827, "pc": [ 3627, 3628 ] }, { - "teal": 3659, - "source": 821, + "teal": 3663, + "source": 827, "pc": [ 3629, 3630 ] }, { - "teal": 3660, - "source": 821, + "teal": 3664, + "source": 827, "pc": [ 3631 ] }, { - "teal": 3661, - "source": 821, + "teal": 3665, + "source": 827, "pc": [ 3632 ] }, { - "teal": 3662, - "source": 821, + "teal": 3666, + "source": 827, "pc": [ 3633 ] }, { - "teal": 3663, - "source": 821, + "teal": 3667, + "source": 827, "pc": [ 3634 ] }, { - "teal": 3664, - "source": 821, + "teal": 3668, + "source": 827, "pc": [ 3635 ] }, { - "teal": 3665, - "source": 821, + "teal": 3669, + "source": 827, "pc": [ 3636 ] }, { - "teal": 3666, - "source": 821, + "teal": 3670, + "source": 827, "pc": [ 3637 ] }, { - "teal": 3667, - "source": 821, + "teal": 3671, + "source": 827, "pc": [ 3638 ] }, { - "teal": 3668, - "source": 821, + "teal": 3672, + "source": 827, "pc": [ 3639 ] }, { - "teal": 3669, - "source": 821, + "teal": 3673, + "source": 827, "pc": [ 3640, 3641 ] }, { - "teal": 3670, - "source": 821, + "teal": 3674, + "source": 827, "pc": [ 3642 ] }, { - "teal": 3671, - "source": 821, + "teal": 3675, + "source": 827, "pc": [ 3643 ] }, { - "teal": 3672, - "source": 821, + "teal": 3676, + "source": 827, "pc": [ 3644, 3645 ] }, { - "teal": 3673, - "source": 821, + "teal": 3677, + "source": 827, "pc": [ 3646 ] }, { - "teal": 3674, - "source": 821, + "teal": 3678, + "source": 827, "pc": [ 3647 ] }, { - "teal": 3675, - "source": 821, + "teal": 3679, + "source": 827, "pc": [ 3648 ] }, { - "teal": 3676, - "source": 821, + "teal": 3680, + "source": 827, "pc": [ 3649, 3650 ] }, { - "teal": 3677, - "source": 821, + "teal": 3681, + "source": 827, "pc": [ 3651 ] }, { - "teal": 3678, - "source": 821, + "teal": 3682, + "source": 827, "pc": [ 3652 ] }, { - "teal": 3679, - "source": 821, + "teal": 3683, + "source": 827, "pc": [ 3653, 3654 ] }, { - "teal": 3680, - "source": 821, + "teal": 3684, + "source": 827, "pc": [ 3655 ] }, { - "teal": 3681, - "source": 821, + "teal": 3685, + "source": 827, "pc": [ 3656 ] }, { - "teal": 3682, - "source": 822, + "teal": 3686, + "source": 828, "pc": [ 3657, 3658 ] }, { - "teal": 3683, - "source": 821, + "teal": 3687, + "source": 827, "pc": [ 3659 ] }, { - "teal": 3684, - "source": 823, + "teal": 3688, + "source": 829, "pc": [ 3660, 3661 ] }, { - "teal": 3685, - "source": 822, + "teal": 3689, + "source": 828, "pc": [ 3662 ] }, { - "teal": 3686, - "source": 820, + "teal": 3690, + "source": 826, "pc": [ 3663, 3664, @@ -18026,111 +18041,111 @@ ] }, { - "teal": 3691, - "source": 825, + "teal": 3695, + "source": 831, "pc": [ 3666, 3667 ] }, { - "teal": 3692, - "source": 825, + "teal": 3696, + "source": 831, "pc": [ 3668, 3669 ] }, { - "teal": 3693, - "source": 825, + "teal": 3697, + "source": 831, "pc": [ 3670 ] }, { - "teal": 3694, - "source": 825, + "teal": 3698, + "source": 831, "pc": [ 3671 ] }, { - "teal": 3695, - "source": 825, + "teal": 3699, + "source": 831, "pc": [ 3672 ] }, { - "teal": 3696, - "source": 825, + "teal": 3700, + "source": 831, "pc": [ 3673 ] }, { - "teal": 3697, - "source": 825, + "teal": 3701, + "source": 831, "pc": [ 3674, 3675 ] }, { - "teal": 3698, - "source": 825, + "teal": 3702, + "source": 831, "pc": [ 3676 ] }, { - "teal": 3699, - "source": 825, + "teal": 3703, + "source": 831, "pc": [ 3677, 3678 ] }, { - "teal": 3700, - "source": 825, + "teal": 3704, + "source": 831, "pc": [ 3679 ] }, { - "teal": 3701, - "source": 825, + "teal": 3705, + "source": 831, "pc": [ 3680 ] }, { - "teal": 3702, - "source": 825, + "teal": 3706, + "source": 831, "pc": [ 3681, 3682 ] }, { - "teal": 3703, - "source": 825, + "teal": 3707, + "source": 831, "pc": [ 3683 ] }, { - "teal": 3704, - "source": 825, + "teal": 3708, + "source": 831, "pc": [ 3684 ] }, { - "teal": 3705, - "source": 825, + "teal": 3709, + "source": 831, "pc": [ 3685, 3686, @@ -18138,38 +18153,38 @@ ] }, { - "teal": 3714, - "source": 809, + "teal": 3718, + "source": 815, "pc": [ 3688, 3689 ] }, { - "teal": 3715, - "source": 809, + "teal": 3719, + "source": 815, "pc": [ 3690 ] }, { - "teal": 3716, - "source": 809, + "teal": 3720, + "source": 815, "pc": [ 3691 ] }, { - "teal": 3717, - "source": 809, + "teal": 3721, + "source": 815, "pc": [ 3692, 3693 ] }, { - "teal": 3718, - "source": 809, + "teal": 3722, + "source": 815, "pc": [ 3694, 3695, @@ -18177,278 +18192,278 @@ ] }, { - "teal": 3728, - "source": 833, + "teal": 3732, + "source": 839, "pc": [ 3697, 3698 ] }, { - "teal": 3729, - "source": 833, + "teal": 3733, + "source": 839, "pc": [ 3699, 3700 ] }, { - "teal": 3730, - "source": 833, + "teal": 3734, + "source": 839, "pc": [ 3701 ] }, { - "teal": 3731, - "source": 833, + "teal": 3735, + "source": 839, "pc": [ 3702 ] }, { - "teal": 3732, - "source": 833, + "teal": 3736, + "source": 839, "pc": [ 3703, 3704 ] }, { - "teal": 3733, - "source": 833, + "teal": 3737, + "source": 839, "pc": [ 3705 ] }, { - "teal": 3734, - "source": 833, + "teal": 3738, + "source": 839, "pc": [ 3706 ] }, { - "teal": 3735, - "source": 833, + "teal": 3739, + "source": 839, "pc": [ 3707, 3708 ] }, { - "teal": 3736, - "source": 833, + "teal": 3740, + "source": 839, "pc": [ 3709 ] }, { - "teal": 3737, - "source": 833, + "teal": 3741, + "source": 839, "pc": [ 3710 ] }, { - "teal": 3738, - "source": 833, + "teal": 3742, + "source": 839, "pc": [ 3711 ] }, { - "teal": 3741, - "source": 832, + "teal": 3745, + "source": 838, "errorMessage": "must stake at least the minimum for this pool", "pc": [ 3712 ] }, { - "teal": 3745, - "source": 838, + "teal": 3749, + "source": 844, "pc": [ 3713, 3714 ] }, { - "teal": 3746, - "source": 838, + "teal": 3750, + "source": 844, "pc": [ 3715, 3716 ] }, { - "teal": 3747, - "source": 838, + "teal": 3751, + "source": 844, "pc": [ 3717 ] }, { - "teal": 3748, - "source": 838, + "teal": 3752, + "source": 844, "pc": [ 3718, 3719 ] }, { - "teal": 3749, - "source": 838, + "teal": 3753, + "source": 844, "pc": [ 3720 ] }, { - "teal": 3750, - "source": 838, + "teal": 3754, + "source": 844, "pc": [ 3721 ] }, { - "teal": 3751, - "source": 838, + "teal": 3755, + "source": 844, "pc": [ 3722, 3723 ] }, { - "teal": 3752, - "source": 838, + "teal": 3756, + "source": 844, "pc": [ 3724 ] }, { - "teal": 3753, - "source": 838, + "teal": 3757, + "source": 844, "pc": [ 3725, 3726 ] }, { - "teal": 3757, - "source": 839, + "teal": 3761, + "source": 845, "pc": [ 3727, 3728 ] }, { - "teal": 3758, - "source": 839, + "teal": 3762, + "source": 845, "pc": [ 3729, 3730 ] }, { - "teal": 3759, - "source": 839, + "teal": 3763, + "source": 845, "pc": [ 3731 ] }, { - "teal": 3760, - "source": 839, + "teal": 3764, + "source": 845, "pc": [ 3732, 3733 ] }, { - "teal": 3761, - "source": 839, + "teal": 3765, + "source": 845, "pc": [ 3734 ] }, { - "teal": 3762, - "source": 839, + "teal": 3766, + "source": 845, "pc": [ 3735 ] }, { - "teal": 3763, - "source": 839, + "teal": 3767, + "source": 845, "pc": [ 3736, 3737 ] }, { - "teal": 3764, - "source": 839, + "teal": 3768, + "source": 845, "pc": [ 3738 ] }, { - "teal": 3765, - "source": 839, + "teal": 3769, + "source": 845, "pc": [ 3739 ] }, { - "teal": 3766, - "source": 839, + "teal": 3770, + "source": 845, "pc": [ 3740, 3741 ] }, { - "teal": 3770, - "source": 840, + "teal": 3774, + "source": 846, "pc": [ 3742 ] }, { - "teal": 3771, - "source": 840, + "teal": 3775, + "source": 846, "pc": [ 3743, 3744 ] }, { - "teal": 3776, - "source": 840, + "teal": 3780, + "source": 846, "pc": [ 3745, 3746 ] }, { - "teal": 3777, - "source": 840, + "teal": 3781, + "source": 846, "pc": [ 3747, 3748 ] }, { - "teal": 3778, - "source": 840, + "teal": 3782, + "source": 846, "pc": [ 3749 ] }, { - "teal": 3779, - "source": 840, + "teal": 3783, + "source": 846, "pc": [ 3750, 3751, @@ -18456,105 +18471,105 @@ ] }, { - "teal": 3784, - "source": 841, + "teal": 3788, + "source": 847, "pc": [ 3753, 3754 ] }, { - "teal": 3785, - "source": 841, + "teal": 3789, + "source": 847, "pc": [ 3755, 3756 ] }, { - "teal": 3786, - "source": 841, + "teal": 3790, + "source": 847, "pc": [ 3757, 3758 ] }, { - "teal": 3787, - "source": 841, + "teal": 3791, + "source": 847, "pc": [ 3759 ] }, { - "teal": 3788, - "source": 841, + "teal": 3792, + "source": 847, "pc": [ 3760, 3761 ] }, { - "teal": 3789, - "source": 841, + "teal": 3793, + "source": 847, "pc": [ 3762 ] }, { - "teal": 3790, - "source": 841, + "teal": 3794, + "source": 847, "pc": [ 3763 ] }, { - "teal": 3791, - "source": 841, + "teal": 3795, + "source": 847, "pc": [ 3764 ] }, { - "teal": 3792, - "source": 841, + "teal": 3796, + "source": 847, "pc": [ 3765 ] }, { - "teal": 3793, - "source": 841, + "teal": 3797, + "source": 847, "pc": [ 3766, 3767 ] }, { - "teal": 3794, - "source": 841, + "teal": 3798, + "source": 847, "pc": [ 3768 ] }, { - "teal": 3795, - "source": 841, + "teal": 3799, + "source": 847, "pc": [ 3769, 3770 ] }, { - "teal": 3796, - "source": 841, + "teal": 3800, + "source": 847, "pc": [ 3771 ] }, { - "teal": 3797, - "source": 841, + "teal": 3801, + "source": 847, "pc": [ 3772, 3773, @@ -18562,198 +18577,198 @@ ] }, { - "teal": 3806, - "source": 843, + "teal": 3810, + "source": 849, "pc": [ 3775, 3776 ] }, { - "teal": 3807, - "source": 843, + "teal": 3811, + "source": 849, "pc": [ 3777 ] }, { - "teal": 3808, - "source": 843, + "teal": 3812, + "source": 849, "pc": [ 3778, 3779 ] }, { - "teal": 3809, - "source": 843, + "teal": 3813, + "source": 849, "pc": [ 3780 ] }, { - "teal": 3810, - "source": 843, + "teal": 3814, + "source": 849, "pc": [ 3781 ] }, { - "teal": 3811, - "source": 843, + "teal": 3815, + "source": 849, "pc": [ 3782 ] }, { - "teal": 3812, - "source": 843, + "teal": 3816, + "source": 849, "pc": [ 3783 ] }, { - "teal": 3813, - "source": 843, + "teal": 3817, + "source": 849, "pc": [ 3784, 3785 ] }, { - "teal": 3814, - "source": 843, + "teal": 3818, + "source": 849, "pc": [ 3786, 3787 ] }, { - "teal": 3815, - "source": 843, + "teal": 3819, + "source": 849, "pc": [ 3788, 3789 ] }, { - "teal": 3816, - "source": 843, + "teal": 3820, + "source": 849, "pc": [ 3790 ] }, { - "teal": 3817, - "source": 843, + "teal": 3821, + "source": 849, "pc": [ 3791 ] }, { - "teal": 3818, - "source": 843, + "teal": 3822, + "source": 849, "pc": [ 3792 ] }, { - "teal": 3819, - "source": 843, + "teal": 3823, + "source": 849, "pc": [ 3793 ] }, { - "teal": 3820, - "source": 843, + "teal": 3824, + "source": 849, "pc": [ 3794 ] }, { - "teal": 3821, - "source": 843, + "teal": 3825, + "source": 849, "pc": [ 3795 ] }, { - "teal": 3822, - "source": 843, + "teal": 3826, + "source": 849, "pc": [ 3796 ] }, { - "teal": 3823, - "source": 843, + "teal": 3827, + "source": 849, "pc": [ 3797 ] }, { - "teal": 3824, - "source": 844, + "teal": 3828, + "source": 850, "pc": [ 3798, 3799 ] }, { - "teal": 3825, - "source": 844, + "teal": 3829, + "source": 850, "pc": [ 3800 ] }, { - "teal": 3826, - "source": 844, + "teal": 3830, + "source": 850, "pc": [ 3801, 3802 ] }, { - "teal": 3827, - "source": 844, + "teal": 3831, + "source": 850, "pc": [ 3803 ] }, { - "teal": 3828, - "source": 845, + "teal": 3832, + "source": 851, "pc": [ 3804 ] }, { - "teal": 3829, - "source": 845, + "teal": 3833, + "source": 851, "pc": [ 3805, 3806 ] }, { - "teal": 3830, - "source": 845, + "teal": 3834, + "source": 851, "pc": [ 3807 ] }, { - "teal": 3831, - "source": 842, + "teal": 3835, + "source": 848, "pc": [ 3808 ] }, { - "teal": 3832, - "source": 842, + "teal": 3836, + "source": 848, "pc": [ 3809, 3810, @@ -18761,38 +18776,38 @@ ] }, { - "teal": 3839, - "source": 840, + "teal": 3843, + "source": 846, "pc": [ 3812, 3813 ] }, { - "teal": 3840, - "source": 840, + "teal": 3844, + "source": 846, "pc": [ 3814 ] }, { - "teal": 3841, - "source": 840, + "teal": 3845, + "source": 846, "pc": [ 3815 ] }, { - "teal": 3842, - "source": 840, + "teal": 3846, + "source": 846, "pc": [ 3816, 3817 ] }, { - "teal": 3843, - "source": 840, + "teal": 3847, + "source": 846, "pc": [ 3818, 3819, @@ -18800,135 +18815,135 @@ ] }, { - "teal": 3848, - "source": 850, + "teal": 3852, + "source": 856, "pc": [ 3821, 3822 ] }, { - "teal": 3849, - "source": 850, + "teal": 3853, + "source": 856, "pc": [ 3823 ] }, { - "teal": 3850, - "source": 850, + "teal": 3854, + "source": 856, "pc": [ 3824, 3825 ] }, { - "teal": 3851, - "source": 850, + "teal": 3855, + "source": 856, "pc": [ 3826 ] }, { - "teal": 3852, - "source": 850, + "teal": 3856, + "source": 856, "pc": [ 3827, 3828 ] }, { - "teal": 3853, - "source": 850, + "teal": 3857, + "source": 856, "pc": [ 3829 ] }, { - "teal": 3854, - "source": 850, + "teal": 3858, + "source": 856, "pc": [ 3830, 3831 ] }, { - "teal": 3855, - "source": 850, + "teal": 3859, + "source": 856, "pc": [ 3832 ] }, { - "teal": 3856, - "source": 850, + "teal": 3860, + "source": 856, "pc": [ 3833, 3834 ] }, { - "teal": 3857, - "source": 850, + "teal": 3861, + "source": 856, "pc": [ 3835 ] }, { - "teal": 3858, - "source": 850, + "teal": 3862, + "source": 856, "pc": [ 3836 ] }, { - "teal": 3859, - "source": 850, + "teal": 3863, + "source": 856, "pc": [ 3837, 3838 ] }, { - "teal": 3860, - "source": 850, + "teal": 3864, + "source": 856, "pc": [ 3839 ] }, { - "teal": 3861, - "source": 850, + "teal": 3865, + "source": 856, "pc": [ 3840 ] }, { - "teal": 3865, - "source": 789, + "teal": 3869, + "source": 794, "pc": [ 3841, 3842 ] }, { - "teal": 3868, - "source": 789, + "teal": 3872, + "source": 794, "pc": [ 3843, 3844 ] }, { - "teal": 3869, - "source": 789, + "teal": 3873, + "source": 794, "pc": [ 3845 ] }, { - "teal": 3874, - "source": 864, + "teal": 3878, + "source": 870, "pc": [ 3846, 3847, @@ -18936,15 +18951,15 @@ ] }, { - "teal": 3875, - "source": 864, + "teal": 3879, + "source": 870, "pc": [ 3849 ] }, { - "teal": 3878, - "source": 864, + "teal": 3882, + "source": 870, "pc": [ 3850, 3851, @@ -18952,15 +18967,15 @@ ] }, { - "teal": 3879, - "source": 864, + "teal": 3883, + "source": 870, "pc": [ 3853 ] }, { - "teal": 3882, - "source": 864, + "teal": 3886, + "source": 870, "pc": [ 3854, 3855, @@ -18968,15 +18983,15 @@ ] }, { - "teal": 3883, - "source": 864, + "teal": 3887, + "source": 870, "pc": [ 3857 ] }, { - "teal": 3886, - "source": 864, + "teal": 3890, + "source": 870, "pc": [ 3858, 3859, @@ -18984,22 +18999,22 @@ ] }, { - "teal": 3887, - "source": 864, + "teal": 3891, + "source": 870, "pc": [ 3861 ] }, { - "teal": 3888, - "source": 864, + "teal": 3892, + "source": 870, "pc": [ 3862 ] }, { - "teal": 3902, - "source": 864, + "teal": 3906, + "source": 870, "pc": [ 3863, 3864, @@ -19007,31 +19022,31 @@ ] }, { - "teal": 3905, - "source": 864, + "teal": 3909, + "source": 870, "pc": [ 3866 ] }, { - "teal": 3906, - "source": 864, + "teal": 3910, + "source": 870, "pc": [ 3867, 3868 ] }, { - "teal": 3910, - "source": 865, + "teal": 3914, + "source": 871, "pc": [ 3869, 3870 ] }, { - "teal": 3911, - "source": 865, + "teal": 3915, + "source": 871, "pc": [ 3871, 3872, @@ -19039,105 +19054,105 @@ ] }, { - "teal": 3915, - "source": 867, + "teal": 3919, + "source": 873, "pc": [ 3874, 3875 ] }, { - "teal": 3916, - "source": 867, + "teal": 3920, + "source": 873, "pc": [ 3876, 3877 ] }, { - "teal": 3917, - "source": 867, + "teal": 3921, + "source": 873, "pc": [ 3878 ] }, { - "teal": 3918, - "source": 867, + "teal": 3922, + "source": 873, "pc": [ 3879, 3880 ] }, { - "teal": 3919, - "source": 867, + "teal": 3923, + "source": 873, "pc": [ 3881 ] }, { - "teal": 3920, - "source": 867, + "teal": 3924, + "source": 873, "pc": [ 3882 ] }, { - "teal": 3921, - "source": 867, + "teal": 3925, + "source": 873, "pc": [ 3883, 3884 ] }, { - "teal": 3922, - "source": 867, + "teal": 3926, + "source": 873, "pc": [ 3885 ] }, { - "teal": 3923, - "source": 867, + "teal": 3927, + "source": 873, "pc": [ 3886, 3887 ] }, { - "teal": 3927, - "source": 868, + "teal": 3931, + "source": 874, "pc": [ 3888, 3889 ] }, { - "teal": 3928, - "source": 868, + "teal": 3932, + "source": 874, "pc": [ 3890 ] }, { - "teal": 3929, - "source": 868, + "teal": 3933, + "source": 874, "pc": [ 3891 ] }, { - "teal": 3930, - "source": 868, + "teal": 3934, + "source": 874, "pc": [ 3892 ] }, { - "teal": 3931, - "source": 868, + "teal": 3935, + "source": 874, "pc": [ 3893, 3894, @@ -19145,82 +19160,82 @@ ] }, { - "teal": 3932, - "source": 868, + "teal": 3936, + "source": 874, "pc": [ 3896, 3897 ] }, { - "teal": 3933, - "source": 868, + "teal": 3937, + "source": 874, "pc": [ 3898 ] }, { - "teal": 3934, - "source": 868, + "teal": 3938, + "source": 874, "pc": [ 3899 ] }, { - "teal": 3935, - "source": 868, + "teal": 3939, + "source": 874, "pc": [ 3900 ] }, { - "teal": 3939, - "source": 868, + "teal": 3943, + "source": 874, "errorMessage": "node number out of allowable range", "pc": [ 3901 ] }, { - "teal": 3943, - "source": 870, + "teal": 3947, + "source": 876, "pc": [ 3902 ] }, { - "teal": 3944, - "source": 870, + "teal": 3948, + "source": 876, "pc": [ 3903, 3904 ] }, { - "teal": 3949, - "source": 870, + "teal": 3953, + "source": 876, "pc": [ 3905, 3906 ] }, { - "teal": 3950, - "source": 870, + "teal": 3954, + "source": 876, "pc": [ 3907 ] }, { - "teal": 3951, - "source": 870, + "teal": 3955, + "source": 876, "pc": [ 3908 ] }, { - "teal": 3952, - "source": 870, + "teal": 3956, + "source": 876, "pc": [ 3909, 3910, @@ -19228,46 +19243,46 @@ ] }, { - "teal": 3956, - "source": 871, + "teal": 3960, + "source": 877, "pc": [ 3912 ] }, { - "teal": 3957, - "source": 871, + "teal": 3961, + "source": 877, "pc": [ 3913, 3914 ] }, { - "teal": 3962, - "source": 871, + "teal": 3966, + "source": 877, "pc": [ 3915, 3916 ] }, { - "teal": 3963, - "source": 871, + "teal": 3967, + "source": 877, "pc": [ 3917, 3918 ] }, { - "teal": 3964, - "source": 871, + "teal": 3968, + "source": 877, "pc": [ 3919 ] }, { - "teal": 3965, - "source": 871, + "teal": 3969, + "source": 877, "pc": [ 3920, 3921, @@ -19275,131 +19290,131 @@ ] }, { - "teal": 3970, - "source": 872, + "teal": 3974, + "source": 878, "pc": [ 3923, 3924 ] }, { - "teal": 3971, - "source": 872, + "teal": 3975, + "source": 878, "pc": [ 3925 ] }, { - "teal": 3972, - "source": 872, + "teal": 3976, + "source": 878, "pc": [ 3926, 3927 ] }, { - "teal": 3973, - "source": 872, + "teal": 3977, + "source": 878, "pc": [ 3928 ] }, { - "teal": 3974, - "source": 872, + "teal": 3978, + "source": 878, "pc": [ 3929 ] }, { - "teal": 3975, - "source": 872, + "teal": 3979, + "source": 878, "pc": [ 3930 ] }, { - "teal": 3976, - "source": 872, + "teal": 3980, + "source": 878, "pc": [ 3931 ] }, { - "teal": 3977, - "source": 872, + "teal": 3981, + "source": 878, "pc": [ 3932 ] }, { - "teal": 3978, - "source": 872, + "teal": 3982, + "source": 878, "pc": [ 3933, 3934 ] }, { - "teal": 3979, - "source": 872, + "teal": 3983, + "source": 878, "pc": [ 3935 ] }, { - "teal": 3980, - "source": 872, + "teal": 3984, + "source": 878, "pc": [ 3936 ] }, { - "teal": 3981, - "source": 872, + "teal": 3985, + "source": 878, "pc": [ 3937 ] }, { - "teal": 3982, - "source": 872, + "teal": 3986, + "source": 878, "pc": [ 3938 ] }, { - "teal": 3983, - "source": 872, + "teal": 3987, + "source": 878, "pc": [ 3939 ] }, { - "teal": 3984, - "source": 872, + "teal": 3988, + "source": 878, "pc": [ 3940 ] }, { - "teal": 3985, - "source": 872, + "teal": 3989, + "source": 878, "pc": [ 3941, 3942 ] }, { - "teal": 3986, - "source": 872, + "teal": 3990, + "source": 878, "pc": [ 3943 ] }, { - "teal": 3987, - "source": 872, + "teal": 3991, + "source": 878, "pc": [ 3944, 3945, @@ -19407,208 +19422,208 @@ ] }, { - "teal": 3992, - "source": 873, + "teal": 3996, + "source": 879, "pc": [ 3947, 3948 ] }, { - "teal": 3993, - "source": 873, + "teal": 3997, + "source": 879, "pc": [ 3949 ] }, { - "teal": 3994, - "source": 873, + "teal": 3998, + "source": 879, "pc": [ 3950 ] }, { - "teal": 3995, - "source": 873, + "teal": 3999, + "source": 879, "pc": [ 3951, 3952 ] }, { - "teal": 3996, - "source": 873, + "teal": 4000, + "source": 879, "pc": [ 3953 ] }, { - "teal": 3999, - "source": 873, + "teal": 4003, + "source": 879, "errorMessage": "can't move to same node", "pc": [ 3954 ] }, { - "teal": 4003, - "source": 875, + "teal": 4007, + "source": 881, "pc": [ 3955, 3956 ] }, { - "teal": 4004, - "source": 875, + "teal": 4008, + "source": 881, "pc": [ 3957, 3958 ] }, { - "teal": 4005, - "source": 875, + "teal": 4009, + "source": 881, "pc": [ 3959 ] }, { - "teal": 4006, - "source": 875, + "teal": 4010, + "source": 881, "pc": [ 3960 ] }, { - "teal": 4007, - "source": 875, + "teal": 4011, + "source": 881, "pc": [ 3961 ] }, { - "teal": 4008, - "source": 875, + "teal": 4012, + "source": 881, "pc": [ 3962 ] }, { - "teal": 4009, - "source": 875, + "teal": 4013, + "source": 881, "pc": [ 3963 ] }, { - "teal": 4010, - "source": 875, + "teal": 4014, + "source": 881, "pc": [ 3964, 3965 ] }, { - "teal": 4011, - "source": 875, + "teal": 4015, + "source": 881, "pc": [ 3966 ] }, { - "teal": 4012, - "source": 875, + "teal": 4016, + "source": 881, "pc": [ 3967 ] }, { - "teal": 4013, - "source": 875, + "teal": 4017, + "source": 881, "pc": [ 3968 ] }, { - "teal": 4014, - "source": 875, + "teal": 4018, + "source": 881, "pc": [ 3969, 3970 ] }, { - "teal": 4015, - "source": 875, + "teal": 4019, + "source": 881, "pc": [ 3971 ] }, { - "teal": 4016, - "source": 875, + "teal": 4020, + "source": 881, "pc": [ 3972, 3973 ] }, { - "teal": 4017, - "source": 875, + "teal": 4021, + "source": 881, "pc": [ 3974 ] }, { - "teal": 4018, - "source": 875, + "teal": 4022, + "source": 881, "pc": [ 3975 ] }, { - "teal": 4019, - "source": 875, + "teal": 4023, + "source": 881, "pc": [ 3976, 3977 ] }, { - "teal": 4020, - "source": 875, + "teal": 4024, + "source": 881, "pc": [ 3978 ] }, { - "teal": 4026, - "source": 878, + "teal": 4030, + "source": 884, "pc": [ 3979 ] }, { - "teal": 4027, - "source": 878, + "teal": 4031, + "source": 884, "pc": [ 3980, 3981 ] }, { - "teal": 4028, - "source": 878, + "teal": 4032, + "source": 884, "pc": [ 3982, 3983 ] }, { - "teal": 4029, - "source": 878, + "teal": 4033, + "source": 884, "pc": [ 3984, 3985, @@ -19619,78 +19634,78 @@ ] }, { - "teal": 4030, - "source": 878, + "teal": 4034, + "source": 884, "pc": [ 3990, 3991 ] }, { - "teal": 4034, - "source": 879, + "teal": 4038, + "source": 885, "pc": [ 3992, 3993 ] }, { - "teal": 4035, - "source": 879, + "teal": 4039, + "source": 885, "pc": [ 3994, 3995 ] }, { - "teal": 4038, - "source": 878, + "teal": 4042, + "source": 884, "pc": [ 3996 ] }, { - "teal": 4039, - "source": 878, + "teal": 4043, + "source": 884, "pc": [ 3997, 3998 ] }, { - "teal": 4042, - "source": 878, + "teal": 4046, + "source": 884, "pc": [ 3999 ] }, { - "teal": 4046, - "source": 883, + "teal": 4050, + "source": 889, "pc": [ 4000, 4001 ] }, { - "teal": 4047, - "source": 883, + "teal": 4051, + "source": 889, "pc": [ 4002, 4003 ] }, { - "teal": 4048, - "source": 883, + "teal": 4052, + "source": 889, "pc": [ 4004, 4005 ] }, { - "teal": 4049, - "source": 883, + "teal": 4053, + "source": 889, "pc": [ 4006, 4007, @@ -19698,45 +19713,45 @@ ] }, { - "teal": 4053, - "source": 884, + "teal": 4057, + "source": 890, "pc": [ 4009 ] }, { - "teal": 4060, - "source": 871, + "teal": 4064, + "source": 877, "pc": [ 4010, 4011 ] }, { - "teal": 4061, - "source": 871, + "teal": 4065, + "source": 877, "pc": [ 4012 ] }, { - "teal": 4062, - "source": 871, + "teal": 4066, + "source": 877, "pc": [ 4013 ] }, { - "teal": 4063, - "source": 871, + "teal": 4067, + "source": 877, "pc": [ 4014, 4015 ] }, { - "teal": 4064, - "source": 871, + "teal": 4068, + "source": 877, "pc": [ 4016, 4017, @@ -19744,38 +19759,38 @@ ] }, { - "teal": 4071, - "source": 870, + "teal": 4075, + "source": 876, "pc": [ 4019, 4020 ] }, { - "teal": 4072, - "source": 870, + "teal": 4076, + "source": 876, "pc": [ 4021 ] }, { - "teal": 4073, - "source": 870, + "teal": 4077, + "source": 876, "pc": [ 4022 ] }, { - "teal": 4074, - "source": 870, + "teal": 4078, + "source": 876, "pc": [ 4023, 4024 ] }, { - "teal": 4075, - "source": 870, + "teal": 4079, + "source": 876, "pc": [ 4025, 4026, @@ -19783,30 +19798,30 @@ ] }, { - "teal": 4079, - "source": 888, + "teal": 4083, + "source": 894, "errorMessage": "couldn't find pool app id in nodes to move", "pc": [ 4028 ] }, { - "teal": 4080, - "source": 864, + "teal": 4084, + "source": 870, "pc": [ 4029 ] }, { - "teal": 4085, - "source": 902, + "teal": 4089, + "source": 908, "pc": [ 4030 ] }, { - "teal": 4088, - "source": 902, + "teal": 4092, + "source": 908, "pc": [ 4031, 4032, @@ -19814,45 +19829,45 @@ ] }, { - "teal": 4089, - "source": 902, + "teal": 4093, + "source": 908, "pc": [ 4034 ] }, { - "teal": 4090, - "source": 902, + "teal": 4094, + "source": 908, "pc": [ 4035 ] }, { - "teal": 4091, - "source": 902, + "teal": 4095, + "source": 908, "pc": [ 4036, 4037 ] }, { - "teal": 4092, - "source": 902, + "teal": 4096, + "source": 908, "pc": [ 4038 ] }, { - "teal": 4095, - "source": 902, + "teal": 4099, + "source": 908, "errorMessage": "argument 0 (receiver) for emptyTokenRewards must be a address", "pc": [ 4039 ] }, { - "teal": 4098, - "source": 902, + "teal": 4102, + "source": 908, "pc": [ 4040, 4041, @@ -19860,15 +19875,15 @@ ] }, { - "teal": 4099, - "source": 902, + "teal": 4103, + "source": 908, "pc": [ 4043 ] }, { - "teal": 4102, - "source": 902, + "teal": 4106, + "source": 908, "pc": [ 4044, 4045, @@ -19876,43 +19891,43 @@ ] }, { - "teal": 4103, - "source": 902, + "teal": 4107, + "source": 908, "pc": [ 4047 ] }, { - "teal": 4104, - "source": 902, + "teal": 4108, + "source": 908, "pc": [ 4048 ] }, { - "teal": 4105, - "source": 902, + "teal": 4109, + "source": 908, "pc": [ 4049 ] }, { - "teal": 4106, - "source": 902, + "teal": 4110, + "source": 908, "pc": [ 4050 ] }, { - "teal": 4107, - "source": 902, + "teal": 4111, + "source": 908, "pc": [ 4051 ] }, { - "teal": 4121, - "source": 902, + "teal": 4125, + "source": 908, "pc": [ 4052, 4053, @@ -19920,31 +19935,31 @@ ] }, { - "teal": 4124, - "source": 902, + "teal": 4128, + "source": 908, "pc": [ 4055 ] }, { - "teal": 4125, - "source": 902, + "teal": 4129, + "source": 908, "pc": [ 4056, 4057 ] }, { - "teal": 4129, - "source": 903, + "teal": 4133, + "source": 909, "pc": [ 4058, 4059 ] }, { - "teal": 4130, - "source": 903, + "teal": 4134, + "source": 909, "pc": [ 4060, 4061, @@ -19952,568 +19967,568 @@ ] }, { - "teal": 4134, - "source": 904, + "teal": 4138, + "source": 910, "pc": [ 4063, 4064 ] }, { - "teal": 4135, - "source": 904, + "teal": 4139, + "source": 910, "pc": [ 4065 ] }, { - "teal": 4136, - "source": 904, + "teal": 4140, + "source": 910, "pc": [ 4066 ] }, { - "teal": 4137, - "source": 904, + "teal": 4141, + "source": 910, "pc": [ 4067, 4068 ] }, { - "teal": 4138, - "source": 904, + "teal": 4142, + "source": 910, "pc": [ 4069 ] }, { - "teal": 4139, - "source": 904, + "teal": 4143, + "source": 910, "pc": [ 4070 ] }, { - "teal": 4140, - "source": 904, + "teal": 4144, + "source": 910, "pc": [ 4071, 4072 ] }, { - "teal": 4141, - "source": 904, + "teal": 4145, + "source": 910, "pc": [ 4073 ] }, { - "teal": 4142, - "source": 904, + "teal": 4146, + "source": 910, "pc": [ 4074 ] }, { - "teal": 4143, - "source": 904, + "teal": 4147, + "source": 910, "pc": [ 4075, 4076 ] }, { - "teal": 4147, - "source": 905, + "teal": 4151, + "source": 911, "pc": [ 4077, 4078 ] }, { - "teal": 4148, - "source": 905, + "teal": 4152, + "source": 911, "pc": [ 4079 ] }, { - "teal": 4149, - "source": 905, + "teal": 4153, + "source": 911, "pc": [ 4080 ] }, { - "teal": 4150, - "source": 905, + "teal": 4154, + "source": 911, "pc": [ 4081, 4082 ] }, { - "teal": 4151, - "source": 905, + "teal": 4155, + "source": 911, "pc": [ 4083 ] }, { - "teal": 4152, - "source": 905, + "teal": 4156, + "source": 911, "pc": [ 4084 ] }, { - "teal": 4153, - "source": 905, + "teal": 4157, + "source": 911, "pc": [ 4085, 4086 ] }, { - "teal": 4154, - "source": 905, + "teal": 4158, + "source": 911, "pc": [ 4087 ] }, { - "teal": 4155, - "source": 905, + "teal": 4159, + "source": 911, "pc": [ 4088 ] }, { - "teal": 4156, - "source": 905, + "teal": 4160, + "source": 911, "pc": [ 4089, 4090 ] }, { - "teal": 4160, - "source": 906, + "teal": 4164, + "source": 912, "pc": [ 4091, 4092 ] }, { - "teal": 4161, - "source": 906, + "teal": 4165, + "source": 912, "pc": [ 4093 ] }, { - "teal": 4162, - "source": 906, + "teal": 4166, + "source": 912, "pc": [ 4094 ] }, { - "teal": 4165, - "source": 906, + "teal": 4169, + "source": 912, "errorMessage": "this validator doesn't have a reward token defined", "pc": [ 4095 ] }, { - "teal": 4169, - "source": 907, + "teal": 4173, + "source": 913, "pc": [ 4096, 4097 ] }, { - "teal": 4170, - "source": 907, + "teal": 4174, + "source": 913, "pc": [ 4098 ] }, { - "teal": 4171, - "source": 907, + "teal": 4175, + "source": 913, "pc": [ 4099 ] }, { - "teal": 4172, - "source": 907, + "teal": 4176, + "source": 913, "pc": [ 4100, 4101 ] }, { - "teal": 4173, - "source": 907, + "teal": 4177, + "source": 913, "pc": [ 4102 ] }, { - "teal": 4174, - "source": 907, + "teal": 4178, + "source": 913, "pc": [ 4103 ] }, { - "teal": 4175, - "source": 907, + "teal": 4179, + "source": 913, "pc": [ 4104, 4105 ] }, { - "teal": 4176, - "source": 907, + "teal": 4180, + "source": 913, "pc": [ 4106 ] }, { - "teal": 4177, - "source": 907, + "teal": 4181, + "source": 913, "pc": [ 4107 ] }, { - "teal": 4178, - "source": 907, + "teal": 4182, + "source": 913, "pc": [ 4108, 4109 ] }, { - "teal": 4183, - "source": 910, + "teal": 4187, + "source": 916, "pc": [ 4110, 4111 ] }, { - "teal": 4184, - "source": 910, + "teal": 4188, + "source": 916, "pc": [ 4112, 4113 ] }, { - "teal": 4185, - "source": 910, + "teal": 4189, + "source": 916, "pc": [ 4114 ] }, { - "teal": 4186, - "source": 910, + "teal": 4190, + "source": 916, "pc": [ 4115, 4116 ] }, { - "teal": 4187, - "source": 910, + "teal": 4191, + "source": 916, "pc": [ 4117, 4118 ] }, { - "teal": 4188, - "source": 910, + "teal": 4192, + "source": 916, "pc": [ 4119 ] }, { - "teal": 4189, - "source": 910, + "teal": 4193, + "source": 916, "pc": [ 4120, 4121 ] }, { - "teal": 4190, - "source": 910, + "teal": 4194, + "source": 916, "pc": [ 4122 ] }, { - "teal": 4191, - "source": 909, + "teal": 4195, + "source": 915, "pc": [ 4123, 4124 ] }, { - "teal": 4198, - "source": 913, + "teal": 4202, + "source": 919, "pc": [ 4125 ] }, { - "teal": 4199, - "source": 913, + "teal": 4203, + "source": 919, "pc": [ 4126, 4127 ] }, { - "teal": 4200, - "source": 913, + "teal": 4204, + "source": 919, "pc": [ 4128, 4129 ] }, { - "teal": 4201, - "source": 913, + "teal": 4205, + "source": 919, "pc": [ 4130, 4131 ] }, { - "teal": 4202, - "source": 913, + "teal": 4206, + "source": 919, "pc": [ 4132, 4133 ] }, { - "teal": 4206, - "source": 914, + "teal": 4210, + "source": 920, "pc": [ 4134, 4135 ] }, { - "teal": 4207, - "source": 914, + "teal": 4211, + "source": 920, "pc": [ 4136, 4137 ] }, { - "teal": 4211, - "source": 915, + "teal": 4215, + "source": 921, "pc": [ 4138, 4139 ] }, { - "teal": 4212, - "source": 915, + "teal": 4216, + "source": 921, "pc": [ 4140, 4141 ] }, { - "teal": 4213, - "source": 915, + "teal": 4217, + "source": 921, "pc": [ 4142, 4143 ] }, { - "teal": 4214, - "source": 915, + "teal": 4218, + "source": 921, "pc": [ 4144 ] }, { - "teal": 4215, - "source": 915, + "teal": 4219, + "source": 921, "pc": [ 4145, 4146 ] }, { - "teal": 4216, - "source": 915, + "teal": 4220, + "source": 921, "pc": [ 4147, 4148 ] }, { - "teal": 4217, - "source": 915, + "teal": 4221, + "source": 921, "pc": [ 4149 ] }, { - "teal": 4218, - "source": 915, + "teal": 4222, + "source": 921, "pc": [ 4150, 4151 ] }, { - "teal": 4221, - "source": 913, + "teal": 4225, + "source": 919, "pc": [ 4152 ] }, { - "teal": 4222, - "source": 913, + "teal": 4226, + "source": 919, "pc": [ 4153, 4154 ] }, { - "teal": 4225, - "source": 913, + "teal": 4229, + "source": 919, "pc": [ 4155 ] }, { - "teal": 4232, - "source": 918, + "teal": 4236, + "source": 924, "pc": [ 4156, 4157 ] }, { - "teal": 4233, - "source": 918, + "teal": 4237, + "source": 924, "pc": [ 4158, 4159 ] }, { - "teal": 4234, - "source": 918, + "teal": 4238, + "source": 924, "pc": [ 4160 ] }, { - "teal": 4235, - "source": 918, + "teal": 4239, + "source": 924, "pc": [ 4161, 4162 ] }, { - "teal": 4236, - "source": 918, + "teal": 4240, + "source": 924, "pc": [ 4163, 4164 ] }, { - "teal": 4237, - "source": 918, + "teal": 4241, + "source": 924, "pc": [ 4165 ] }, { - "teal": 4238, - "source": 918, + "teal": 4242, + "source": 924, "pc": [ 4166, 4167 ] }, { - "teal": 4239, - "source": 918, + "teal": 4243, + "source": 924, "pc": [ 4168 ] }, { - "teal": 4242, - "source": 917, + "teal": 4246, + "source": 923, "errorMessage": "balance of remaining reward tokens should match the held back amount", "pc": [ 4169 ] }, { - "teal": 4246, - "source": 921, + "teal": 4250, + "source": 927, "pc": [ 4170, 4171 ] }, { - "teal": 4249, - "source": 902, + "teal": 4253, + "source": 908, "pc": [ 4172, 4173 ] }, { - "teal": 4252, - "source": 902, + "teal": 4256, + "source": 908, "pc": [ 4174, 4175 ] }, { - "teal": 4253, - "source": 902, + "teal": 4257, + "source": 908, "pc": [ 4176 ] }, { - "teal": 4257, - "source": 1013, + "teal": 4261, + "source": 1019, "pc": [ 4177, 4178, @@ -20521,97 +20536,97 @@ ] }, { - "teal": 4264, - "source": 1015, + "teal": 4268, + "source": 1021, "pc": [ 4180, 4181 ] }, { - "teal": 4265, - "source": 1015, + "teal": 4269, + "source": 1021, "pc": [ 4182 ] }, { - "teal": 4266, - "source": 1015, + "teal": 4270, + "source": 1021, "pc": [ 4183, 4184 ] }, { - "teal": 4267, - "source": 1015, + "teal": 4271, + "source": 1021, "pc": [ 4185 ] }, { - "teal": 4268, - "source": 1015, + "teal": 4272, + "source": 1021, "pc": [ 4186, 4187 ] }, { - "teal": 4269, - "source": 1015, + "teal": 4273, + "source": 1021, "pc": [ 4188 ] }, { - "teal": 4270, - "source": 1015, + "teal": 4274, + "source": 1021, "pc": [ 4189 ] }, { - "teal": 4271, - "source": 1015, + "teal": 4275, + "source": 1021, "pc": [ 4190, 4191 ] }, { - "teal": 4272, - "source": 1015, + "teal": 4276, + "source": 1021, "pc": [ 4192 ] }, { - "teal": 4273, - "source": 1015, + "teal": 4277, + "source": 1021, "pc": [ 4193 ] }, { - "teal": 4276, - "source": 1014, + "teal": 4280, + "source": 1020, "errorMessage": "can only be called by validator owner", "pc": [ 4194 ] }, { - "teal": 4277, - "source": 1013, + "teal": 4281, + "source": 1019, "pc": [ 4195 ] }, { - "teal": 4281, - "source": 1020, + "teal": 4285, + "source": 1026, "pc": [ 4196, 4197, @@ -20619,89 +20634,89 @@ ] }, { - "teal": 4289, - "source": 1022, + "teal": 4293, + "source": 1028, "pc": [ 4199, 4200 ] }, { - "teal": 4290, - "source": 1022, + "teal": 4294, + "source": 1028, "pc": [ 4201 ] }, { - "teal": 4291, - "source": 1022, + "teal": 4295, + "source": 1028, "pc": [ 4202, 4203 ] }, { - "teal": 4292, - "source": 1022, + "teal": 4296, + "source": 1028, "pc": [ 4204 ] }, { - "teal": 4293, - "source": 1022, + "teal": 4297, + "source": 1028, "pc": [ 4205, 4206 ] }, { - "teal": 4294, - "source": 1022, + "teal": 4298, + "source": 1028, "pc": [ 4207 ] }, { - "teal": 4295, - "source": 1022, + "teal": 4299, + "source": 1028, "pc": [ 4208 ] }, { - "teal": 4296, - "source": 1022, + "teal": 4300, + "source": 1028, "pc": [ 4209, 4210 ] }, { - "teal": 4297, - "source": 1022, + "teal": 4301, + "source": 1028, "pc": [ 4211 ] }, { - "teal": 4298, - "source": 1022, + "teal": 4302, + "source": 1028, "pc": [ 4212 ] }, { - "teal": 4299, - "source": 1022, + "teal": 4303, + "source": 1028, "pc": [ 4213 ] }, { - "teal": 4300, - "source": 1022, + "teal": 4304, + "source": 1028, "pc": [ 4214, 4215, @@ -20709,105 +20724,105 @@ ] }, { - "teal": 4301, - "source": 1023, + "teal": 4305, + "source": 1029, "pc": [ 4217, 4218 ] }, { - "teal": 4302, - "source": 1023, + "teal": 4306, + "source": 1029, "pc": [ 4219, 4220 ] }, { - "teal": 4303, - "source": 1023, + "teal": 4307, + "source": 1029, "pc": [ 4221, 4222 ] }, { - "teal": 4304, - "source": 1023, + "teal": 4308, + "source": 1029, "pc": [ 4223 ] }, { - "teal": 4305, - "source": 1023, + "teal": 4309, + "source": 1029, "pc": [ 4224, 4225 ] }, { - "teal": 4306, - "source": 1023, + "teal": 4310, + "source": 1029, "pc": [ 4226 ] }, { - "teal": 4307, - "source": 1023, + "teal": 4311, + "source": 1029, "pc": [ 4227 ] }, { - "teal": 4308, - "source": 1023, + "teal": 4312, + "source": 1029, "pc": [ 4228, 4229 ] }, { - "teal": 4309, - "source": 1023, + "teal": 4313, + "source": 1029, "pc": [ 4230 ] }, { - "teal": 4310, - "source": 1023, + "teal": 4314, + "source": 1029, "pc": [ 4231 ] }, { - "teal": 4311, - "source": 1022, + "teal": 4315, + "source": 1028, "pc": [ 4232 ] }, { - "teal": 4315, - "source": 1021, + "teal": 4319, + "source": 1027, "errorMessage": "can only be called by owner or manager of validator", "pc": [ 4233 ] }, { - "teal": 4316, - "source": 1020, + "teal": 4320, + "source": 1026, "pc": [ 4234 ] }, { - "teal": 4324, - "source": 1033, + "teal": 4328, + "source": 1039, "pc": [ 4235, 4236, @@ -20815,23 +20830,23 @@ ] }, { - "teal": 4328, - "source": 1034, + "teal": 4332, + "source": 1040, "pc": [ 4238 ] }, { - "teal": 4329, - "source": 1034, + "teal": 4333, + "source": 1040, "pc": [ 4239, 4240 ] }, { - "teal": 4330, - "source": 1034, + "teal": 4334, + "source": 1040, "pc": [ 4241, 4242, @@ -20839,66 +20854,66 @@ ] }, { - "teal": 4331, - "source": 1034, + "teal": 4335, + "source": 1040, "pc": [ 4244 ] }, { - "teal": 4332, - "source": 1034, + "teal": 4336, + "source": 1040, "pc": [ 4245 ] }, { - "teal": 4333, - "source": 1034, + "teal": 4337, + "source": 1040, "pc": [ 4246 ] }, { - "teal": 4334, - "source": 1034, + "teal": 4338, + "source": 1040, "pc": [ 4247 ] }, { - "teal": 4335, - "source": 1034, + "teal": 4339, + "source": 1040, "pc": [ 4248 ] }, { - "teal": 4336, - "source": 1034, + "teal": 4340, + "source": 1040, "pc": [ 4249 ] }, { - "teal": 4339, - "source": 1034, + "teal": 4343, + "source": 1040, "errorMessage": "the specified validator id isn't valid", "pc": [ 4250 ] }, { - "teal": 4343, - "source": 1035, + "teal": 4347, + "source": 1041, "pc": [ 4251, 4252 ] }, { - "teal": 4344, - "source": 1035, + "teal": 4348, + "source": 1041, "pc": [ 4253, 4254, @@ -20906,45 +20921,45 @@ ] }, { - "teal": 4345, - "source": 1035, + "teal": 4349, + "source": 1041, "pc": [ 4256 ] }, { - "teal": 4346, + "teal": 4350, "source": 58, "pc": [ 4257 ] }, { - "teal": 4347, - "source": 1035, + "teal": 4351, + "source": 1041, "pc": [ 4258 ] }, { - "teal": 4350, - "source": 1035, + "teal": 4354, + "source": 1041, "errorMessage": "pool id not in valid range", "pc": [ 4259 ] }, { - "teal": 4357, - "source": 1037, + "teal": 4361, + "source": 1043, "pc": [ 4260, 4261 ] }, { - "teal": 4358, - "source": 1037, + "teal": 4362, + "source": 1043, "pc": [ 4262, 4263, @@ -20952,36 +20967,36 @@ ] }, { - "teal": 4359, - "source": 1037, + "teal": 4363, + "source": 1043, "pc": [ 4265 ] }, { - "teal": 4360, - "source": 1037, + "teal": 4364, + "source": 1043, "pc": [ 4266 ] }, { - "teal": 4361, - "source": 1037, + "teal": 4365, + "source": 1043, "pc": [ 4267 ] }, { - "teal": 4362, - "source": 1037, + "teal": 4366, + "source": 1043, "pc": [ 4268 ] }, { - "teal": 4363, - "source": 1037, + "teal": 4367, + "source": 1043, "pc": [ 4269, 4270, @@ -20989,16 +21004,16 @@ ] }, { - "teal": 4364, - "source": 1037, + "teal": 4368, + "source": 1043, "pc": [ 4272, 4273 ] }, { - "teal": 4365, - "source": 1037, + "teal": 4369, + "source": 1043, "pc": [ 4274, 4275, @@ -21006,46 +21021,46 @@ ] }, { - "teal": 4366, - "source": 1037, + "teal": 4370, + "source": 1043, "pc": [ 4277 ] }, { - "teal": 4367, - "source": 1037, + "teal": 4371, + "source": 1043, "pc": [ 4278, 4279 ] }, { - "teal": 4368, - "source": 1037, + "teal": 4372, + "source": 1043, "pc": [ 4280, 4281 ] }, { - "teal": 4369, - "source": 1037, + "teal": 4373, + "source": 1043, "pc": [ 4282 ] }, { - "teal": 4370, - "source": 1037, + "teal": 4374, + "source": 1043, "pc": [ 4283, 4284 ] }, { - "teal": 4371, - "source": 1037, + "teal": 4375, + "source": 1043, "pc": [ 4285, 4286, @@ -21053,81 +21068,81 @@ ] }, { - "teal": 4372, - "source": 1037, + "teal": 4376, + "source": 1043, "pc": [ 4288 ] }, { - "teal": 4373, - "source": 1037, + "teal": 4377, + "source": 1043, "pc": [ 4289 ] }, { - "teal": 4374, - "source": 1037, + "teal": 4378, + "source": 1043, "pc": [ 4290 ] }, { - "teal": 4375, - "source": 1037, + "teal": 4379, + "source": 1043, "pc": [ 4291, 4292 ] }, { - "teal": 4376, - "source": 1037, + "teal": 4380, + "source": 1043, "pc": [ 4293 ] }, { - "teal": 4377, - "source": 1037, + "teal": 4381, + "source": 1043, "pc": [ 4294 ] }, { - "teal": 4378, - "source": 1037, + "teal": 4382, + "source": 1043, "pc": [ 4295 ] }, { - "teal": 4379, - "source": 1037, + "teal": 4383, + "source": 1043, "pc": [ 4296 ] }, { - "teal": 4383, - "source": 1036, + "teal": 4387, + "source": 1042, "errorMessage": "pool id outside of range of pools created for this validator", "pc": [ 4297 ] }, { - "teal": 4390, - "source": 1043, + "teal": 4394, + "source": 1049, "pc": [ 4298, 4299 ] }, { - "teal": 4391, - "source": 1043, + "teal": 4395, + "source": 1049, "pc": [ 4300, 4301, @@ -21135,31 +21150,31 @@ ] }, { - "teal": 4392, - "source": 1043, + "teal": 4396, + "source": 1049, "pc": [ 4303 ] }, { - "teal": 4393, - "source": 1043, + "teal": 4397, + "source": 1049, "pc": [ 4304, 4305 ] }, { - "teal": 4394, - "source": 1043, + "teal": 4398, + "source": 1049, "pc": [ 4306, 4307 ] }, { - "teal": 4395, - "source": 1043, + "teal": 4399, + "source": 1049, "pc": [ 4308, 4309, @@ -21167,87 +21182,87 @@ ] }, { - "teal": 4396, - "source": 1043, + "teal": 4400, + "source": 1049, "pc": [ 4311 ] }, { - "teal": 4397, - "source": 1043, + "teal": 4401, + "source": 1049, "pc": [ 4312 ] }, { - "teal": 4398, - "source": 1043, + "teal": 4402, + "source": 1049, "pc": [ 4313 ] }, { - "teal": 4399, - "source": 1043, + "teal": 4403, + "source": 1049, "pc": [ 4314, 4315 ] }, { - "teal": 4400, - "source": 1043, + "teal": 4404, + "source": 1049, "pc": [ 4316 ] }, { - "teal": 4401, - "source": 1043, + "teal": 4405, + "source": 1049, "pc": [ 4317 ] }, { - "teal": 4402, - "source": 1043, + "teal": 4406, + "source": 1049, "pc": [ 4318 ] }, { - "teal": 4403, - "source": 1043, + "teal": 4407, + "source": 1049, "pc": [ 4319 ] }, { - "teal": 4404, - "source": 1043, + "teal": 4408, + "source": 1049, "pc": [ 4320 ] }, { - "teal": 4405, - "source": 1043, + "teal": 4409, + "source": 1049, "pc": [ 4321 ] }, { - "teal": 4406, - "source": 1043, + "teal": 4410, + "source": 1049, "pc": [ 4322, 4323 ] }, { - "teal": 4407, - "source": 1043, + "teal": 4411, + "source": 1049, "pc": [ 4324, 4325, @@ -21255,82 +21270,82 @@ ] }, { - "teal": 4408, - "source": 1043, + "teal": 4412, + "source": 1049, "pc": [ 4327 ] }, { - "teal": 4409, - "source": 1043, + "teal": 4413, + "source": 1049, "pc": [ 4328 ] }, { - "teal": 4410, - "source": 1043, + "teal": 4414, + "source": 1049, "pc": [ 4329 ] }, { - "teal": 4411, - "source": 1043, + "teal": 4415, + "source": 1049, "pc": [ 4330, 4331 ] }, { - "teal": 4412, - "source": 1043, + "teal": 4416, + "source": 1049, "pc": [ 4332 ] }, { - "teal": 4413, - "source": 1043, + "teal": 4417, + "source": 1049, "pc": [ 4333 ] }, { - "teal": 4414, - "source": 1043, + "teal": 4418, + "source": 1049, "pc": [ 4334 ] }, { - "teal": 4417, - "source": 1042, + "teal": 4421, + "source": 1048, "errorMessage": "The passed in app id doesn't match the passed in ids", "pc": [ 4335 ] }, { - "teal": 4421, - "source": 1047, + "teal": 4425, + "source": 1053, "pc": [ 4336, 4337 ] }, { - "teal": 4422, - "source": 1047, + "teal": 4426, + "source": 1053, "pc": [ 4338, 4339 ] }, { - "teal": 4423, - "source": 1047, + "teal": 4427, + "source": 1053, "pc": [ 4340, 4341, @@ -21338,52 +21353,52 @@ ] }, { - "teal": 4424, - "source": 1047, + "teal": 4428, + "source": 1053, "pc": [ 4343 ] }, { - "teal": 4425, - "source": 1047, + "teal": 4429, + "source": 1053, "pc": [ 4344, 4345 ] }, { - "teal": 4426, - "source": 1047, + "teal": 4430, + "source": 1053, "pc": [ 4346 ] }, { - "teal": 4427, - "source": 1047, + "teal": 4431, + "source": 1053, "pc": [ 4347 ] }, { - "teal": 4428, - "source": 1047, + "teal": 4432, + "source": 1053, "pc": [ 4348 ] }, { - "teal": 4432, - "source": 1049, + "teal": 4436, + "source": 1055, "pc": [ 4349, 4350 ] }, { - "teal": 4433, - "source": 1049, + "teal": 4437, + "source": 1055, "pc": [ 4351, 4352, @@ -21391,23 +21406,23 @@ ] }, { - "teal": 4434, - "source": 1049, + "teal": 4438, + "source": 1055, "pc": [ 4354 ] }, { - "teal": 4435, - "source": 1049, + "teal": 4439, + "source": 1055, "pc": [ 4355, 4356 ] }, { - "teal": 4436, - "source": 1049, + "teal": 4440, + "source": 1055, "pc": [ 4357, 4358, @@ -21415,15 +21430,15 @@ ] }, { - "teal": 4437, - "source": 1049, + "teal": 4441, + "source": 1055, "pc": [ 4360 ] }, { - "teal": 4438, - "source": 1049, + "teal": 4442, + "source": 1055, "pc": [ 4361, 4362, @@ -21441,45 +21456,45 @@ ] }, { - "teal": 4439, - "source": 1049, + "teal": 4443, + "source": 1055, "pc": [ 4374 ] }, { - "teal": 4442, - "source": 1049, + "teal": 4446, + "source": 1055, "errorMessage": "global state value does not exist: AppID.fromUint64(poolKey.poolAppId).globalState('validatorId')", "pc": [ 4375 ] }, { - "teal": 4443, - "source": 1049, + "teal": 4447, + "source": 1055, "pc": [ 4376 ] }, { - "teal": 4444, - "source": 1049, + "teal": 4448, + "source": 1055, "pc": [ 4377 ] }, { - "teal": 4448, - "source": 1050, + "teal": 4452, + "source": 1056, "pc": [ 4378, 4379 ] }, { - "teal": 4449, - "source": 1050, + "teal": 4453, + "source": 1056, "pc": [ 4380, 4381, @@ -21487,23 +21502,23 @@ ] }, { - "teal": 4450, - "source": 1050, + "teal": 4454, + "source": 1056, "pc": [ 4383 ] }, { - "teal": 4451, - "source": 1050, + "teal": 4455, + "source": 1056, "pc": [ 4384, 4385 ] }, { - "teal": 4452, - "source": 1050, + "teal": 4456, + "source": 1056, "pc": [ 4386, 4387, @@ -21511,15 +21526,15 @@ ] }, { - "teal": 4453, - "source": 1050, + "teal": 4457, + "source": 1056, "pc": [ 4389 ] }, { - "teal": 4454, - "source": 1050, + "teal": 4458, + "source": 1056, "pc": [ 4390, 4391, @@ -21532,44 +21547,44 @@ ] }, { - "teal": 4455, - "source": 1050, + "teal": 4459, + "source": 1056, "pc": [ 4398 ] }, { - "teal": 4458, - "source": 1050, + "teal": 4462, + "source": 1056, "errorMessage": "global state value does not exist: AppID.fromUint64(poolKey.poolAppId).globalState('poolId')", "pc": [ 4399 ] }, { - "teal": 4459, - "source": 1050, + "teal": 4463, + "source": 1056, "pc": [ 4400 ] }, { - "teal": 4460, - "source": 1050, + "teal": 4464, + "source": 1056, "pc": [ 4401 ] }, { - "teal": 4461, - "source": 1033, + "teal": 4465, + "source": 1039, "pc": [ 4402 ] }, { - "teal": 4470, - "source": 1059, + "teal": 4474, + "source": 1065, "pc": [ 4403, 4404, @@ -21577,139 +21592,139 @@ ] }, { - "teal": 4473, - "source": 1059, + "teal": 4477, + "source": 1065, "pc": [ 4406 ] }, { - "teal": 4474, - "source": 1059, + "teal": 4478, + "source": 1065, "pc": [ 4407 ] }, { - "teal": 4478, - "source": 1060, + "teal": 4482, + "source": 1066, "pc": [ 4408 ] }, { - "teal": 4479, - "source": 1060, + "teal": 4483, + "source": 1066, "pc": [ 4409, 4410 ] }, { - "teal": 4480, - "source": 1060, + "teal": 4484, + "source": 1066, "pc": [ 4411 ] }, { - "teal": 4481, - "source": 1060, + "teal": 4485, + "source": 1066, "pc": [ 4412 ] }, { - "teal": 4482, - "source": 1060, + "teal": 4486, + "source": 1066, "pc": [ 4413, 4414 ] }, { - "teal": 4487, - "source": 1061, + "teal": 4491, + "source": 1067, "pc": [ 4415, 4416 ] }, { - "teal": 4488, - "source": 1061, + "teal": 4492, + "source": 1067, "pc": [ 4417 ] }, { - "teal": 4489, - "source": 1060, + "teal": 4493, + "source": 1066, "pc": [ 4418 ] }, { - "teal": 4490, - "source": 1060, + "teal": 4494, + "source": 1066, "pc": [ 4419, 4420 ] }, { - "teal": 4491, - "source": 1060, + "teal": 4495, + "source": 1066, "pc": [ 4421 ] }, { - "teal": 4492, - "source": 1060, + "teal": 4496, + "source": 1066, "pc": [ 4422 ] }, { - "teal": 4493, - "source": 1060, + "teal": 4497, + "source": 1066, "pc": [ 4423, 4424 ] }, { - "teal": 4494, - "source": 1060, + "teal": 4498, + "source": 1066, "pc": [ 4425 ] }, { - "teal": 4495, - "source": 1061, + "teal": 4499, + "source": 1067, "pc": [ 4426 ] }, { - "teal": 4496, - "source": 1061, + "teal": 4500, + "source": 1067, "pc": [ 4427 ] }, { - "teal": 4497, - "source": 1061, + "teal": 4501, + "source": 1067, "pc": [ 4428 ] }, { - "teal": 4498, - "source": 1061, + "teal": 4502, + "source": 1067, "pc": [ 4429, 4430, @@ -21717,186 +21732,186 @@ ] }, { - "teal": 4503, - "source": 1064, + "teal": 4507, + "source": 1070, "pc": [ 4432, 4433 ] }, { - "teal": 4504, - "source": 1064, + "teal": 4508, + "source": 1070, "pc": [ 4434 ] }, { - "teal": 4505, - "source": 1060, + "teal": 4509, + "source": 1066, "pc": [ 4435 ] }, { - "teal": 4506, - "source": 1060, + "teal": 4510, + "source": 1066, "pc": [ 4436, 4437 ] }, { - "teal": 4507, - "source": 1060, + "teal": 4511, + "source": 1066, "pc": [ 4438 ] }, { - "teal": 4508, - "source": 1060, + "teal": 4512, + "source": 1066, "pc": [ 4439 ] }, { - "teal": 4509, - "source": 1060, + "teal": 4513, + "source": 1066, "pc": [ 4440, 4441 ] }, { - "teal": 4510, - "source": 1060, + "teal": 4514, + "source": 1066, "pc": [ 4442 ] }, { - "teal": 4511, - "source": 1064, + "teal": 4515, + "source": 1070, "pc": [ 4443 ] }, { - "teal": 4512, - "source": 1064, + "teal": 4516, + "source": 1070, "pc": [ 4444, 4445 ] }, { - "teal": 4513, - "source": 1064, + "teal": 4517, + "source": 1070, "pc": [ 4446 ] }, { - "teal": 4516, - "source": 1064, + "teal": 4520, + "source": 1070, "errorMessage": "global state value does not exist: AppID.fromUint64(validatorConfig.nfdForInfo).globalState('i.owner.a')", "pc": [ 4447 ] }, { - "teal": 4517, - "source": 1064, + "teal": 4521, + "source": 1070, "pc": [ 4448, 4449 ] }, { - "teal": 4522, - "source": 1066, + "teal": 4526, + "source": 1072, "pc": [ 4450 ] }, { - "teal": 4523, - "source": 1066, + "teal": 4527, + "source": 1072, "pc": [ 4451, 4452 ] }, { - "teal": 4524, - "source": 1060, + "teal": 4528, + "source": 1066, "pc": [ 4453 ] }, { - "teal": 4525, - "source": 1060, + "teal": 4529, + "source": 1066, "pc": [ 4454, 4455 ] }, { - "teal": 4526, - "source": 1060, + "teal": 4530, + "source": 1066, "pc": [ 4456 ] }, { - "teal": 4527, - "source": 1060, + "teal": 4531, + "source": 1066, "pc": [ 4457 ] }, { - "teal": 4528, - "source": 1060, + "teal": 4532, + "source": 1066, "pc": [ 4458, 4459 ] }, { - "teal": 4529, - "source": 1060, + "teal": 4533, + "source": 1066, "pc": [ 4460 ] }, { - "teal": 4530, - "source": 1066, + "teal": 4534, + "source": 1072, "pc": [ 4461, 4462 ] }, { - "teal": 4531, - "source": 1066, + "teal": 4535, + "source": 1072, "pc": [ 4463 ] }, { - "teal": 4532, - "source": 1066, + "teal": 4536, + "source": 1072, "pc": [ 4464 ] }, { - "teal": 4533, - "source": 1066, + "teal": 4537, + "source": 1072, "pc": [ 4465, 4466, @@ -21904,90 +21919,90 @@ ] }, { - "teal": 4534, - "source": 1066, + "teal": 4538, + "source": 1072, "pc": [ 4468, 4469 ] }, { - "teal": 4535, - "source": 1066, + "teal": 4539, + "source": 1072, "pc": [ 4470, 4471 ] }, { - "teal": 4536, - "source": 1060, + "teal": 4540, + "source": 1066, "pc": [ 4472 ] }, { - "teal": 4537, - "source": 1060, + "teal": 4541, + "source": 1066, "pc": [ 4473, 4474 ] }, { - "teal": 4538, - "source": 1060, + "teal": 4542, + "source": 1066, "pc": [ 4475 ] }, { - "teal": 4539, - "source": 1060, + "teal": 4543, + "source": 1066, "pc": [ 4476 ] }, { - "teal": 4540, - "source": 1060, + "teal": 4544, + "source": 1066, "pc": [ 4477, 4478 ] }, { - "teal": 4541, - "source": 1060, + "teal": 4545, + "source": 1066, "pc": [ 4479 ] }, { - "teal": 4542, - "source": 1066, + "teal": 4546, + "source": 1072, "pc": [ 4480, 4481 ] }, { - "teal": 4543, - "source": 1066, + "teal": 4547, + "source": 1072, "pc": [ 4482 ] }, { - "teal": 4544, - "source": 1066, + "teal": 4548, + "source": 1072, "pc": [ 4483 ] }, { - "teal": 4547, - "source": 1066, + "teal": 4551, + "source": 1072, "pc": [ 4484, 4485, @@ -21995,75 +22010,75 @@ ] }, { - "teal": 4552, - "source": 1068, + "teal": 4556, + "source": 1074, "pc": [ 4487, 4488 ] }, { - "teal": 4553, - "source": 1068, + "teal": 4557, + "source": 1074, "pc": [ 4489, 4490 ] }, { - "teal": 4554, - "source": 1068, + "teal": 4558, + "source": 1074, "pc": [ 4491 ] }, { - "teal": 4555, - "source": 1068, + "teal": 4559, + "source": 1074, "pc": [ 4492, 4493 ] }, { - "teal": 4556, - "source": 1068, + "teal": 4560, + "source": 1074, "pc": [ 4494 ] }, { - "teal": 4557, - "source": 1068, + "teal": 4561, + "source": 1074, "pc": [ 4495 ] }, { - "teal": 4558, - "source": 1068, + "teal": 4562, + "source": 1074, "pc": [ 4496, 4497 ] }, { - "teal": 4559, - "source": 1068, + "teal": 4563, + "source": 1074, "pc": [ 4498 ] }, { - "teal": 4564, - "source": 1059, + "teal": 4568, + "source": 1065, "pc": [ 4499 ] }, { - "teal": 4568, - "source": 1073, + "teal": 4572, + "source": 1079, "pc": [ 4500, 4501, @@ -22071,16 +22086,16 @@ ] }, { - "teal": 4572, - "source": 1075, + "teal": 4576, + "source": 1081, "pc": [ 4503, 4504 ] }, { - "teal": 4573, - "source": 1075, + "teal": 4577, + "source": 1081, "pc": [ 4505, 4506, @@ -22088,38 +22103,38 @@ ] }, { - "teal": 4574, - "source": 1075, + "teal": 4578, + "source": 1081, "pc": [ 4508, 4509 ] }, { - "teal": 4575, - "source": 1075, + "teal": 4579, + "source": 1081, "pc": [ 4510 ] }, { - "teal": 4576, - "source": 1075, + "teal": 4580, + "source": 1081, "pc": [ 4511 ] }, { - "teal": 4580, - "source": 1076, + "teal": 4584, + "source": 1082, "pc": [ 4512, 4513 ] }, { - "teal": 4581, - "source": 1076, + "teal": 4585, + "source": 1082, "pc": [ 4514, 4515, @@ -22127,46 +22142,46 @@ ] }, { - "teal": 4582, - "source": 1076, + "teal": 4586, + "source": 1082, "pc": [ 4517, 4518 ] }, { - "teal": 4583, - "source": 1076, + "teal": 4587, + "source": 1082, "pc": [ 4519 ] }, { - "teal": 4584, - "source": 1076, + "teal": 4588, + "source": 1082, "pc": [ 4520 ] }, { - "teal": 4588, - "source": 1077, + "teal": 4592, + "source": 1083, "pc": [ 4521, 4522 ] }, { - "teal": 4589, - "source": 1077, + "teal": 4593, + "source": 1083, "pc": [ 4523, 4524 ] }, { - "teal": 4590, - "source": 1077, + "teal": 4594, + "source": 1083, "pc": [ 4525, 4526, @@ -22174,31 +22189,31 @@ ] }, { - "teal": 4591, - "source": 1077, + "teal": 4595, + "source": 1083, "pc": [ 4528 ] }, { - "teal": 4594, - "source": 1077, + "teal": 4598, + "source": 1083, "errorMessage": "sender must be owner to add new validator", "pc": [ 4529 ] }, { - "teal": 4601, - "source": 1080, + "teal": 4605, + "source": 1086, "pc": [ 4530, 4531 ] }, { - "teal": 4602, - "source": 1080, + "teal": 4606, + "source": 1086, "pc": [ 4532, 4533, @@ -22206,36 +22221,36 @@ ] }, { - "teal": 4603, - "source": 1080, + "teal": 4607, + "source": 1086, "pc": [ 4535 ] }, { - "teal": 4604, - "source": 1080, + "teal": 4608, + "source": 1086, "pc": [ 4536 ] }, { - "teal": 4605, - "source": 1080, + "teal": 4609, + "source": 1086, "pc": [ 4537 ] }, { - "teal": 4606, - "source": 1080, + "teal": 4610, + "source": 1086, "pc": [ 4538 ] }, { - "teal": 4607, - "source": 1080, + "teal": 4611, + "source": 1086, "pc": [ 4539, 4540, @@ -22243,16 +22258,16 @@ ] }, { - "teal": 4608, - "source": 1080, + "teal": 4612, + "source": 1086, "pc": [ 4542, 4543 ] }, { - "teal": 4609, - "source": 1080, + "teal": 4613, + "source": 1086, "pc": [ 4544, 4545, @@ -22260,53 +22275,53 @@ ] }, { - "teal": 4610, - "source": 1080, + "teal": 4614, + "source": 1086, "pc": [ 4547 ] }, { - "teal": 4611, - "source": 1080, + "teal": 4615, + "source": 1086, "pc": [ 4548, 4549 ] }, { - "teal": 4612, - "source": 1080, + "teal": 4616, + "source": 1086, "pc": [ 4550 ] }, { - "teal": 4613, - "source": 1080, + "teal": 4617, + "source": 1086, "pc": [ 4551 ] }, { - "teal": 4617, - "source": 1079, + "teal": 4621, + "source": 1085, "errorMessage": "gating type not valid", "pc": [ 4552 ] }, { - "teal": 4624, - "source": 1084, + "teal": 4628, + "source": 1090, "pc": [ 4553, 4554 ] }, { - "teal": 4625, - "source": 1084, + "teal": 4629, + "source": 1090, "pc": [ 4555, 4556, @@ -22314,36 +22329,36 @@ ] }, { - "teal": 4626, - "source": 1084, + "teal": 4630, + "source": 1090, "pc": [ 4558 ] }, { - "teal": 4627, - "source": 1084, + "teal": 4631, + "source": 1090, "pc": [ 4559 ] }, { - "teal": 4628, - "source": 1084, + "teal": 4632, + "source": 1090, "pc": [ 4560 ] }, { - "teal": 4629, - "source": 1084, + "teal": 4633, + "source": 1090, "pc": [ 4561 ] }, { - "teal": 4630, - "source": 1084, + "teal": 4634, + "source": 1090, "pc": [ 4562, 4563, @@ -22351,16 +22366,16 @@ ] }, { - "teal": 4631, - "source": 1084, + "teal": 4635, + "source": 1090, "pc": [ 4565, 4566 ] }, { - "teal": 4632, - "source": 1084, + "teal": 4636, + "source": 1090, "pc": [ 4567, 4568, @@ -22368,53 +22383,53 @@ ] }, { - "teal": 4633, - "source": 1084, + "teal": 4637, + "source": 1090, "pc": [ 4570 ] }, { - "teal": 4634, - "source": 1084, + "teal": 4638, + "source": 1090, "pc": [ 4571, 4572 ] }, { - "teal": 4635, - "source": 1084, + "teal": 4639, + "source": 1090, "pc": [ 4573 ] }, { - "teal": 4636, - "source": 1084, + "teal": 4640, + "source": 1090, "pc": [ 4574 ] }, { - "teal": 4640, - "source": 1083, + "teal": 4644, + "source": 1089, "errorMessage": "epoch length not in allowable range", "pc": [ 4575 ] }, { - "teal": 4647, - "source": 1088, + "teal": 4651, + "source": 1094, "pc": [ 4576, 4577 ] }, { - "teal": 4648, - "source": 1088, + "teal": 4652, + "source": 1094, "pc": [ 4578, 4579, @@ -22422,36 +22437,36 @@ ] }, { - "teal": 4649, - "source": 1088, + "teal": 4653, + "source": 1094, "pc": [ 4581 ] }, { - "teal": 4650, - "source": 1088, + "teal": 4654, + "source": 1094, "pc": [ 4582 ] }, { - "teal": 4651, - "source": 1088, + "teal": 4655, + "source": 1094, "pc": [ 4583 ] }, { - "teal": 4652, - "source": 1088, + "teal": 4656, + "source": 1094, "pc": [ 4584 ] }, { - "teal": 4653, - "source": 1088, + "teal": 4657, + "source": 1094, "pc": [ 4585, 4586, @@ -22459,16 +22474,16 @@ ] }, { - "teal": 4654, - "source": 1088, + "teal": 4658, + "source": 1094, "pc": [ 4588, 4589 ] }, { - "teal": 4655, - "source": 1088, + "teal": 4659, + "source": 1094, "pc": [ 4590, 4591, @@ -22476,53 +22491,53 @@ ] }, { - "teal": 4656, - "source": 1088, + "teal": 4660, + "source": 1094, "pc": [ 4593 ] }, { - "teal": 4657, - "source": 1088, + "teal": 4661, + "source": 1094, "pc": [ 4594, 4595 ] }, { - "teal": 4658, - "source": 1088, + "teal": 4662, + "source": 1094, "pc": [ 4596 ] }, { - "teal": 4659, - "source": 1088, + "teal": 4663, + "source": 1094, "pc": [ 4597 ] }, { - "teal": 4663, - "source": 1087, + "teal": 4667, + "source": 1093, "errorMessage": "commission percentage not valid", "pc": [ 4598 ] }, { - "teal": 4668, - "source": 1091, + "teal": 4672, + "source": 1097, "pc": [ 4599, 4600 ] }, { - "teal": 4669, - "source": 1091, + "teal": 4673, + "source": 1097, "pc": [ 4601, 4602, @@ -22530,29 +22545,29 @@ ] }, { - "teal": 4670, - "source": 1091, + "teal": 4674, + "source": 1097, "pc": [ 4604 ] }, { - "teal": 4671, - "source": 1091, + "teal": 4675, + "source": 1097, "pc": [ 4605 ] }, { - "teal": 4672, - "source": 1091, + "teal": 4676, + "source": 1097, "pc": [ 4606 ] }, { - "teal": 4673, - "source": 1091, + "teal": 4677, + "source": 1097, "pc": [ 4607, 4608, @@ -22560,16 +22575,16 @@ ] }, { - "teal": 4681, - "source": 1093, + "teal": 4685, + "source": 1099, "pc": [ 4610, 4611 ] }, { - "teal": 4682, - "source": 1093, + "teal": 4686, + "source": 1099, "pc": [ 4612, 4613, @@ -22577,39 +22592,39 @@ ] }, { - "teal": 4683, - "source": 1093, + "teal": 4687, + "source": 1099, "pc": [ 4615, 4616 ] }, { - "teal": 4684, - "source": 1093, + "teal": 4688, + "source": 1099, "pc": [ 4617 ] }, { - "teal": 4687, - "source": 1092, + "teal": 4691, + "source": 1098, "errorMessage": "validatorCommissionAddress must be set if percent to validator is not 0", "pc": [ 4618 ] }, { - "teal": 4692, - "source": 1097, + "teal": 4696, + "source": 1103, "pc": [ 4619, 4620 ] }, { - "teal": 4693, - "source": 1097, + "teal": 4697, + "source": 1103, "pc": [ 4621, 4622, @@ -22617,46 +22632,46 @@ ] }, { - "teal": 4694, - "source": 1097, + "teal": 4698, + "source": 1103, "pc": [ 4624 ] }, { - "teal": 4695, - "source": 1097, + "teal": 4699, + "source": 1103, "pc": [ 4625, 4626 ] }, { - "teal": 4696, - "source": 1097, + "teal": 4700, + "source": 1103, "pc": [ 4627 ] }, { - "teal": 4699, - "source": 1097, + "teal": 4703, + "source": 1103, "errorMessage": "staking pool must have minimum entry of 1 algo", "pc": [ 4628 ] }, { - "teal": 4706, - "source": 1100, + "teal": 4710, + "source": 1106, "pc": [ 4629, 4630 ] }, { - "teal": 4707, - "source": 1100, + "teal": 4711, + "source": 1106, "pc": [ 4631, 4632, @@ -22664,36 +22679,36 @@ ] }, { - "teal": 4708, - "source": 1100, + "teal": 4712, + "source": 1106, "pc": [ 4634 ] }, { - "teal": 4709, - "source": 1100, + "teal": 4713, + "source": 1106, "pc": [ 4635 ] }, { - "teal": 4710, - "source": 1100, + "teal": 4714, + "source": 1106, "pc": [ 4636 ] }, { - "teal": 4711, - "source": 1100, + "teal": 4715, + "source": 1106, "pc": [ 4637 ] }, { - "teal": 4712, - "source": 1100, + "teal": 4716, + "source": 1106, "pc": [ 4638, 4639, @@ -22701,16 +22716,16 @@ ] }, { - "teal": 4713, - "source": 1100, + "teal": 4717, + "source": 1106, "pc": [ 4641, 4642 ] }, { - "teal": 4714, - "source": 1100, + "teal": 4718, + "source": 1106, "pc": [ 4643, 4644, @@ -22718,53 +22733,53 @@ ] }, { - "teal": 4715, - "source": 1100, + "teal": 4719, + "source": 1106, "pc": [ 4646 ] }, { - "teal": 4716, - "source": 1100, + "teal": 4720, + "source": 1106, "pc": [ 4647, 4648 ] }, { - "teal": 4717, - "source": 1100, + "teal": 4721, + "source": 1106, "pc": [ 4649 ] }, { - "teal": 4718, - "source": 1100, + "teal": 4722, + "source": 1106, "pc": [ 4650 ] }, { - "teal": 4722, - "source": 1099, + "teal": 4726, + "source": 1105, "errorMessage": "number of pools per node must be be between 1 and the maximum allowed number", "pc": [ 4651 ] }, { - "teal": 4727, - "source": 1103, + "teal": 4731, + "source": 1109, "pc": [ 4652, 4653 ] }, { - "teal": 4728, - "source": 1103, + "teal": 4732, + "source": 1109, "pc": [ 4654, 4655, @@ -22772,29 +22787,29 @@ ] }, { - "teal": 4729, - "source": 1103, + "teal": 4733, + "source": 1109, "pc": [ 4657 ] }, { - "teal": 4730, - "source": 1103, + "teal": 4734, + "source": 1109, "pc": [ 4658 ] }, { - "teal": 4731, - "source": 1103, + "teal": 4735, + "source": 1109, "pc": [ 4659 ] }, { - "teal": 4732, - "source": 1103, + "teal": 4736, + "source": 1109, "pc": [ 4660, 4661, @@ -22802,16 +22817,16 @@ ] }, { - "teal": 4737, - "source": 1104, + "teal": 4741, + "source": 1110, "pc": [ 4663, 4664 ] }, { - "teal": 4738, - "source": 1104, + "teal": 4742, + "source": 1110, "pc": [ 4665, 4666, @@ -22819,45 +22834,45 @@ ] }, { - "teal": 4739, - "source": 1104, + "teal": 4743, + "source": 1110, "pc": [ 4668 ] }, { - "teal": 4740, - "source": 1104, + "teal": 4744, + "source": 1110, "pc": [ 4669, 4670 ] }, { - "teal": 4741, - "source": 1104, + "teal": 4745, + "source": 1110, "pc": [ 4671 ] }, { - "teal": 4744, - "source": 1104, + "teal": 4748, + "source": 1110, "errorMessage": "sunsettingOn must be later than now if set", "pc": [ 4672 ] }, { - "teal": 4747, - "source": 1073, + "teal": 4751, + "source": 1079, "pc": [ 4673 ] }, { - "teal": 4761, - "source": 1119, + "teal": 4765, + "source": 1125, "pc": [ 4674, 4675, @@ -22865,39 +22880,39 @@ ] }, { - "teal": 4764, - "source": 1119, + "teal": 4768, + "source": 1125, "pc": [ 4677 ] }, { - "teal": 4765, - "source": 1119, + "teal": 4769, + "source": 1125, "pc": [ 4678, 4679 ] }, { - "teal": 4769, - "source": 1126, + "teal": 4773, + "source": 1132, "pc": [ 4680, 4681 ] }, { - "teal": 4770, - "source": 1126, + "teal": 4774, + "source": 1132, "pc": [ 4682, 4683 ] }, { - "teal": 4771, - "source": 1126, + "teal": 4775, + "source": 1132, "pc": [ 4684, 4685, @@ -22905,87 +22920,87 @@ ] }, { - "teal": 4772, - "source": 1126, + "teal": 4776, + "source": 1132, "pc": [ 4687 ] }, { - "teal": 4773, - "source": 1126, + "teal": 4777, + "source": 1132, "pc": [ 4688 ] }, { - "teal": 4774, - "source": 1126, + "teal": 4778, + "source": 1132, "pc": [ 4689 ] }, { - "teal": 4775, - "source": 1126, + "teal": 4779, + "source": 1132, "pc": [ 4690, 4691 ] }, { - "teal": 4776, - "source": 1126, + "teal": 4780, + "source": 1132, "pc": [ 4692 ] }, { - "teal": 4777, - "source": 1126, + "teal": 4781, + "source": 1132, "pc": [ 4693 ] }, { - "teal": 4778, - "source": 1126, + "teal": 4782, + "source": 1132, "pc": [ 4694 ] }, { - "teal": 4779, - "source": 1126, + "teal": 4783, + "source": 1132, "pc": [ 4695 ] }, { - "teal": 4780, - "source": 1126, + "teal": 4784, + "source": 1132, "pc": [ 4696 ] }, { - "teal": 4781, - "source": 1126, + "teal": 4785, + "source": 1132, "pc": [ 4697 ] }, { - "teal": 4782, - "source": 1126, + "teal": 4786, + "source": 1132, "pc": [ 4698, 4699 ] }, { - "teal": 4783, - "source": 1126, + "teal": 4787, + "source": 1132, "pc": [ 4700, 4701, @@ -22993,189 +23008,189 @@ ] }, { - "teal": 4784, - "source": 1126, + "teal": 4788, + "source": 1132, "pc": [ 4703 ] }, { - "teal": 4785, - "source": 1126, + "teal": 4789, + "source": 1132, "pc": [ 4704 ] }, { - "teal": 4786, - "source": 1126, + "teal": 4790, + "source": 1132, "pc": [ 4705 ] }, { - "teal": 4787, - "source": 1126, + "teal": 4791, + "source": 1132, "pc": [ 4706, 4707 ] }, { - "teal": 4788, - "source": 1126, + "teal": 4792, + "source": 1132, "pc": [ 4708 ] }, { - "teal": 4789, - "source": 1126, + "teal": 4793, + "source": 1132, "pc": [ 4709 ] }, { - "teal": 4790, - "source": 1126, + "teal": 4794, + "source": 1132, "pc": [ 4710, 4711 ] }, { - "teal": 4803, - "source": 1135, + "teal": 4807, + "source": 1141, "pc": [ 4712 ] }, { - "teal": 4804, - "source": 1135, + "teal": 4808, + "source": 1141, "pc": [ 4713 ] }, { - "teal": 4805, - "source": 1135, + "teal": 4809, + "source": 1141, "pc": [ 4714, 4715 ] }, { - "teal": 4809, - "source": 1135, + "teal": 4813, + "source": 1141, "pc": [ 4716, 4717 ] }, { - "teal": 4810, - "source": 1135, + "teal": 4814, + "source": 1141, "pc": [ 4718, 4719 ] }, { - "teal": 4811, - "source": 1135, + "teal": 4815, + "source": 1141, "pc": [ 4720, 4721 ] }, { - "teal": 4812, - "source": 1135, + "teal": 4816, + "source": 1141, "pc": [ 4722 ] }, { - "teal": 4813, - "source": 1135, + "teal": 4817, + "source": 1141, "pc": [ 4723, 4724 ] }, { - "teal": 4817, - "source": 1135, + "teal": 4821, + "source": 1141, "pc": [ 4725, 4726 ] }, { - "teal": 4818, - "source": 1135, + "teal": 4822, + "source": 1141, "pc": [ 4727, 4728 ] }, { - "teal": 4819, - "source": 1135, + "teal": 4823, + "source": 1141, "pc": [ 4729 ] }, { - "teal": 4820, - "source": 1135, + "teal": 4824, + "source": 1141, "pc": [ 4730, 4731 ] }, { - "teal": 4823, - "source": 1135, + "teal": 4827, + "source": 1141, "pc": [ 4732 ] }, { - "teal": 4824, - "source": 1135, + "teal": 4828, + "source": 1141, "pc": [ 4733, 4734 ] }, { - "teal": 4825, - "source": 1130, + "teal": 4829, + "source": 1136, "pc": [ 4735 ] }, { - "teal": 4826, - "source": 1130, + "teal": 4830, + "source": 1136, "pc": [ 4736, 4737 ] }, { - "teal": 4827, - "source": 1130, + "teal": 4831, + "source": 1136, "pc": [ 4738, 4739 ] }, { - "teal": 4828, - "source": 1130, + "teal": 4832, + "source": 1136, "pc": [ 4740, 4741, @@ -23186,108 +23201,108 @@ ] }, { - "teal": 4829, - "source": 1130, + "teal": 4833, + "source": 1136, "pc": [ 4746, 4747 ] }, { - "teal": 4833, - "source": 1131, + "teal": 4837, + "source": 1137, "pc": [ 4748, 4749 ] }, { - "teal": 4834, - "source": 1131, + "teal": 4838, + "source": 1137, "pc": [ 4750, 4751 ] }, { - "teal": 4844, - "source": 1137, + "teal": 4848, + "source": 1143, "pc": [ 4752, 4753 ] }, { - "teal": 4845, - "source": 1137, + "teal": 4849, + "source": 1143, "pc": [ 4754, 4755 ] }, { - "teal": 4846, - "source": 1137, + "teal": 4850, + "source": 1143, "pc": [ 4756, 4757 ] }, { - "teal": 4849, - "source": 1130, + "teal": 4853, + "source": 1136, "pc": [ 4758 ] }, { - "teal": 4850, - "source": 1130, + "teal": 4854, + "source": 1136, "pc": [ 4759, 4760 ] }, { - "teal": 4853, - "source": 1130, + "teal": 4857, + "source": 1136, "pc": [ 4761 ] }, { - "teal": 4854, - "source": 1130, + "teal": 4858, + "source": 1136, "pc": [ 4762, 4763 ] }, { - "teal": 4855, - "source": 1130, + "teal": 4859, + "source": 1136, "pc": [ 4764 ] }, { - "teal": 4856, - "source": 1130, + "teal": 4860, + "source": 1136, "pc": [ 4765 ] }, { - "teal": 4857, - "source": 1130, + "teal": 4861, + "source": 1136, "pc": [ 4766, 4767 ] }, { - "teal": 4858, - "source": 1130, + "teal": 4862, + "source": 1136, "pc": [ 4768, 4769, @@ -23295,23 +23310,23 @@ ] }, { - "teal": 4859, - "source": 1130, + "teal": 4863, + "source": 1136, "pc": [ 4771 ] }, { - "teal": 4864, - "source": 1140, + "teal": 4868, + "source": 1146, "pc": [ 4772, 4773 ] }, { - "teal": 4865, - "source": 1140, + "teal": 4869, + "source": 1146, "pc": [ 4774, 4775, @@ -23319,15 +23334,15 @@ ] }, { - "teal": 4866, - "source": 1140, + "teal": 4870, + "source": 1146, "pc": [ 4777 ] }, { - "teal": 4867, - "source": 1140, + "teal": 4871, + "source": 1146, "pc": [ 4778, 4779, @@ -23335,194 +23350,194 @@ ] }, { - "teal": 4872, - "source": 1141, + "teal": 4876, + "source": 1147, "pc": [ 4781 ] }, { - "teal": 4873, - "source": 1141, + "teal": 4877, + "source": 1147, "pc": [ 4782, 4783 ] }, { - "teal": 4874, - "source": 1141, + "teal": 4878, + "source": 1147, "pc": [ 4784, 4785 ] }, { - "teal": 4875, - "source": 1141, + "teal": 4879, + "source": 1147, "pc": [ 4786 ] }, { - "teal": 4876, - "source": 1141, + "teal": 4880, + "source": 1147, "pc": [ 4787, 4788 ] }, { - "teal": 4877, - "source": 1141, + "teal": 4881, + "source": 1147, "pc": [ 4789, 4790 ] }, { - "teal": 4878, - "source": 1141, + "teal": 4882, + "source": 1147, "pc": [ 4791 ] }, { - "teal": 4879, - "source": 1141, + "teal": 4883, + "source": 1147, "pc": [ 4792, 4793 ] }, { - "teal": 4880, - "source": 1141, + "teal": 4884, + "source": 1147, "pc": [ 4794, 4795 ] }, { - "teal": 4881, - "source": 1141, + "teal": 4885, + "source": 1147, "pc": [ 4796, 4797 ] }, { - "teal": 4882, - "source": 1141, + "teal": 4886, + "source": 1147, "pc": [ 4798, 4799 ] }, { - "teal": 4883, - "source": 1141, + "teal": 4887, + "source": 1147, "pc": [ 4800 ] }, { - "teal": 4888, - "source": 1145, + "teal": 4892, + "source": 1151, "pc": [ 4801, 4802 ] }, { - "teal": 4889, - "source": 1145, + "teal": 4893, + "source": 1151, "pc": [ 4803, 4804 ] }, { - "teal": 4890, - "source": 1145, + "teal": 4894, + "source": 1151, "pc": [ 4805 ] }, { - "teal": 4893, - "source": 1145, + "teal": 4897, + "source": 1151, "errorMessage": "global state value does not exist: AppID.fromUint64(poolAppId).globalState('numStakers')", "pc": [ 4806 ] }, { - "teal": 4894, - "source": 1145, + "teal": 4898, + "source": 1151, "pc": [ 4807, 4808 ] }, { - "teal": 4898, - "source": 1146, + "teal": 4902, + "source": 1152, "pc": [ 4809, 4810 ] }, { - "teal": 4899, - "source": 1146, + "teal": 4903, + "source": 1152, "pc": [ 4811, 4812 ] }, { - "teal": 4900, - "source": 1146, + "teal": 4904, + "source": 1152, "pc": [ 4813 ] }, { - "teal": 4903, - "source": 1146, + "teal": 4907, + "source": 1152, "errorMessage": "global state value does not exist: AppID.fromUint64(poolAppId).globalState('staked')", "pc": [ 4814 ] }, { - "teal": 4904, - "source": 1146, + "teal": 4908, + "source": 1152, "pc": [ 4815, 4816 ] }, { - "teal": 4908, - "source": 1147, + "teal": 4912, + "source": 1153, "pc": [ 4817, 4818 ] }, { - "teal": 4909, - "source": 1147, + "teal": 4913, + "source": 1153, "pc": [ 4819, 4820 ] }, { - "teal": 4910, - "source": 1147, + "teal": 4914, + "source": 1153, "pc": [ 4821, 4822, @@ -23530,80 +23545,80 @@ ] }, { - "teal": 4911, - "source": 1147, + "teal": 4915, + "source": 1153, "pc": [ 4824 ] }, { - "teal": 4912, - "source": 1147, + "teal": 4916, + "source": 1153, "pc": [ 4825 ] }, { - "teal": 4913, - "source": 1147, + "teal": 4917, + "source": 1153, "pc": [ 4826 ] }, { - "teal": 4914, - "source": 1147, + "teal": 4918, + "source": 1153, "pc": [ 4827, 4828 ] }, { - "teal": 4915, - "source": 1147, + "teal": 4919, + "source": 1153, "pc": [ 4829 ] }, { - "teal": 4916, - "source": 1147, + "teal": 4920, + "source": 1153, "pc": [ 4830 ] }, { - "teal": 4917, - "source": 1147, + "teal": 4921, + "source": 1153, "pc": [ 4831 ] }, { - "teal": 4918, - "source": 1147, + "teal": 4922, + "source": 1153, "pc": [ 4832 ] }, { - "teal": 4919, - "source": 1147, + "teal": 4923, + "source": 1153, "pc": [ 4833, 4834 ] }, { - "teal": 4920, - "source": 1147, + "teal": 4924, + "source": 1153, "pc": [ 4835 ] }, { - "teal": 4921, - "source": 1147, + "teal": 4925, + "source": 1153, "pc": [ 4836, 4837, @@ -23611,23 +23626,23 @@ ] }, { - "teal": 4922, - "source": 1147, + "teal": 4926, + "source": 1153, "pc": [ 4839 ] }, { - "teal": 4923, - "source": 1147, + "teal": 4927, + "source": 1153, "pc": [ 4840, 4841 ] }, { - "teal": 4924, - "source": 1147, + "teal": 4928, + "source": 1153, "pc": [ 4842, 4843, @@ -23635,60 +23650,60 @@ ] }, { - "teal": 4925, - "source": 1147, + "teal": 4929, + "source": 1153, "pc": [ 4845 ] }, { - "teal": 4926, - "source": 1147, + "teal": 4930, + "source": 1153, "pc": [ 4846 ] }, { - "teal": 4927, - "source": 1147, + "teal": 4931, + "source": 1153, "pc": [ 4847 ] }, { - "teal": 4928, - "source": 1147, + "teal": 4932, + "source": 1153, "pc": [ 4848, 4849 ] }, { - "teal": 4929, - "source": 1147, + "teal": 4933, + "source": 1153, "pc": [ 4850 ] }, { - "teal": 4933, - "source": 1148, + "teal": 4937, + "source": 1154, "pc": [ 4851, 4852 ] }, { - "teal": 4934, - "source": 1148, + "teal": 4938, + "source": 1154, "pc": [ 4853, 4854 ] }, { - "teal": 4935, - "source": 1148, + "teal": 4939, + "source": 1154, "pc": [ 4855, 4856, @@ -23696,96 +23711,96 @@ ] }, { - "teal": 4936, - "source": 1148, + "teal": 4940, + "source": 1154, "pc": [ 4858 ] }, { - "teal": 4937, - "source": 1148, + "teal": 4941, + "source": 1154, "pc": [ 4859 ] }, { - "teal": 4938, - "source": 1148, + "teal": 4942, + "source": 1154, "pc": [ 4860 ] }, { - "teal": 4939, - "source": 1148, + "teal": 4943, + "source": 1154, "pc": [ 4861, 4862 ] }, { - "teal": 4940, - "source": 1148, + "teal": 4944, + "source": 1154, "pc": [ 4863 ] }, { - "teal": 4941, - "source": 1148, + "teal": 4945, + "source": 1154, "pc": [ 4864 ] }, { - "teal": 4942, - "source": 1148, + "teal": 4946, + "source": 1154, "pc": [ 4865, 4866 ] }, { - "teal": 4943, - "source": 1148, + "teal": 4947, + "source": 1154, "pc": [ 4867 ] }, { - "teal": 4944, - "source": 1148, + "teal": 4948, + "source": 1154, "pc": [ 4868, 4869 ] }, { - "teal": 4945, - "source": 1148, + "teal": 4949, + "source": 1154, "pc": [ 4870 ] }, { - "teal": 4946, - "source": 1148, + "teal": 4950, + "source": 1154, "pc": [ 4871 ] }, { - "teal": 4947, - "source": 1148, + "teal": 4951, + "source": 1154, "pc": [ 4872, 4873 ] }, { - "teal": 4948, - "source": 1148, + "teal": 4952, + "source": 1154, "pc": [ 4874, 4875, @@ -23793,52 +23808,52 @@ ] }, { - "teal": 4949, - "source": 1148, + "teal": 4953, + "source": 1154, "pc": [ 4877 ] }, { - "teal": 4950, - "source": 1148, + "teal": 4954, + "source": 1154, "pc": [ 4878 ] }, { - "teal": 4951, - "source": 1148, + "teal": 4955, + "source": 1154, "pc": [ 4879 ] }, { - "teal": 4952, - "source": 1148, + "teal": 4956, + "source": 1154, "pc": [ 4880, 4881 ] }, { - "teal": 4953, - "source": 1148, + "teal": 4957, + "source": 1154, "pc": [ 4882 ] }, { - "teal": 4958, - "source": 1151, + "teal": 4962, + "source": 1157, "pc": [ 4883, 4884 ] }, { - "teal": 4959, - "source": 1151, + "teal": 4963, + "source": 1157, "pc": [ 4885, 4886, @@ -23846,45 +23861,45 @@ ] }, { - "teal": 4964, - "source": 1152, + "teal": 4968, + "source": 1158, "pc": [ 4888, 4889 ] }, { - "teal": 4965, - "source": 1152, + "teal": 4969, + "source": 1158, "pc": [ 4890 ] }, { - "teal": 4966, - "source": 1152, + "teal": 4970, + "source": 1158, "pc": [ 4891 ] }, { - "teal": 4967, - "source": 1152, + "teal": 4971, + "source": 1158, "pc": [ 4892 ] }, { - "teal": 4968, - "source": 1152, + "teal": 4972, + "source": 1158, "pc": [ 4893, 4894 ] }, { - "teal": 4969, - "source": 1152, + "teal": 4973, + "source": 1158, "pc": [ 4895, 4896, @@ -23892,87 +23907,87 @@ ] }, { - "teal": 4970, - "source": 1152, + "teal": 4974, + "source": 1158, "pc": [ 4898 ] }, { - "teal": 4971, - "source": 1152, + "teal": 4975, + "source": 1158, "pc": [ 4899 ] }, { - "teal": 4972, - "source": 1152, + "teal": 4976, + "source": 1158, "pc": [ 4900 ] }, { - "teal": 4973, - "source": 1152, + "teal": 4977, + "source": 1158, "pc": [ 4901, 4902 ] }, { - "teal": 4974, - "source": 1152, + "teal": 4978, + "source": 1158, "pc": [ 4903 ] }, { - "teal": 4975, - "source": 1152, + "teal": 4979, + "source": 1158, "pc": [ 4904 ] }, { - "teal": 4976, - "source": 1152, + "teal": 4980, + "source": 1158, "pc": [ 4905 ] }, { - "teal": 4977, - "source": 1152, + "teal": 4981, + "source": 1158, "pc": [ 4906 ] }, { - "teal": 4978, - "source": 1152, + "teal": 4982, + "source": 1158, "pc": [ 4907 ] }, { - "teal": 4979, - "source": 1152, + "teal": 4983, + "source": 1158, "pc": [ 4908 ] }, { - "teal": 4980, - "source": 1152, + "teal": 4984, + "source": 1158, "pc": [ 4909, 4910 ] }, { - "teal": 4981, - "source": 1152, + "teal": 4985, + "source": 1158, "pc": [ 4911, 4912, @@ -23980,52 +23995,52 @@ ] }, { - "teal": 4982, - "source": 1152, + "teal": 4986, + "source": 1158, "pc": [ 4914 ] }, { - "teal": 4983, - "source": 1152, + "teal": 4987, + "source": 1158, "pc": [ 4915 ] }, { - "teal": 4984, - "source": 1152, + "teal": 4988, + "source": 1158, "pc": [ 4916 ] }, { - "teal": 4985, - "source": 1152, + "teal": 4989, + "source": 1158, "pc": [ 4917, 4918 ] }, { - "teal": 4986, - "source": 1152, + "teal": 4990, + "source": 1158, "pc": [ 4919 ] }, { - "teal": 4992, - "source": 1154, + "teal": 4996, + "source": 1160, "pc": [ 4920, 4921 ] }, { - "teal": 4993, - "source": 1154, + "teal": 4997, + "source": 1160, "pc": [ 4922, 4923, @@ -24033,96 +24048,96 @@ ] }, { - "teal": 4998, - "source": 1155, + "teal": 5002, + "source": 1161, "pc": [ 4925, 4926 ] }, { - "teal": 4999, - "source": 1155, + "teal": 5003, + "source": 1161, "pc": [ 4927 ] }, { - "teal": 5000, - "source": 1155, + "teal": 5004, + "source": 1161, "pc": [ 4928 ] }, { - "teal": 5001, - "source": 1155, + "teal": 5005, + "source": 1161, "pc": [ 4929 ] }, { - "teal": 5002, - "source": 1155, + "teal": 5006, + "source": 1161, "pc": [ 4930, 4931 ] }, { - "teal": 5003, - "source": 1155, + "teal": 5007, + "source": 1161, "pc": [ 4932 ] }, { - "teal": 5004, - "source": 1155, + "teal": 5008, + "source": 1161, "pc": [ 4933 ] }, { - "teal": 5009, - "source": 1157, + "teal": 5013, + "source": 1163, "pc": [ 4934, 4935 ] }, { - "teal": 5010, - "source": 1157, + "teal": 5014, + "source": 1163, "pc": [ 4936 ] }, { - "teal": 5011, - "source": 1157, + "teal": 5015, + "source": 1163, "pc": [ 4937 ] }, { - "teal": 5012, - "source": 1157, + "teal": 5016, + "source": 1163, "pc": [ 4938 ] }, { - "teal": 5013, - "source": 1157, + "teal": 5017, + "source": 1163, "pc": [ 4939, 4940 ] }, { - "teal": 5014, - "source": 1157, + "teal": 5018, + "source": 1163, "pc": [ 4941, 4942, @@ -24130,111 +24145,111 @@ ] }, { - "teal": 5015, - "source": 1157, + "teal": 5019, + "source": 1163, "pc": [ 4944 ] }, { - "teal": 5016, - "source": 1157, + "teal": 5020, + "source": 1163, "pc": [ 4945 ] }, { - "teal": 5017, - "source": 1157, + "teal": 5021, + "source": 1163, "pc": [ 4946 ] }, { - "teal": 5018, - "source": 1157, + "teal": 5022, + "source": 1163, "pc": [ 4947, 4948 ] }, { - "teal": 5019, - "source": 1157, + "teal": 5023, + "source": 1163, "pc": [ 4949 ] }, { - "teal": 5020, - "source": 1157, + "teal": 5024, + "source": 1163, "pc": [ 4950 ] }, { - "teal": 5021, - "source": 1157, + "teal": 5025, + "source": 1163, "pc": [ 4951, 4952 ] }, { - "teal": 5022, - "source": 1157, + "teal": 5026, + "source": 1163, "pc": [ 4953, 4954 ] }, { - "teal": 5023, - "source": 1157, + "teal": 5027, + "source": 1163, "pc": [ 4955, 4956 ] }, { - "teal": 5024, - "source": 1157, + "teal": 5028, + "source": 1163, "pc": [ 4957 ] }, { - "teal": 5025, - "source": 1157, + "teal": 5029, + "source": 1163, "pc": [ 4958 ] }, { - "teal": 5026, - "source": 1157, + "teal": 5030, + "source": 1163, "pc": [ 4959 ] }, { - "teal": 5027, - "source": 1157, + "teal": 5031, + "source": 1163, "pc": [ 4960 ] }, { - "teal": 5028, - "source": 1157, + "teal": 5032, + "source": 1163, "pc": [ 4961, 4962 ] }, { - "teal": 5029, - "source": 1157, + "teal": 5033, + "source": 1163, "pc": [ 4963, 4964, @@ -24242,126 +24257,126 @@ ] }, { - "teal": 5030, - "source": 1157, + "teal": 5034, + "source": 1163, "pc": [ 4966 ] }, { - "teal": 5031, - "source": 1157, + "teal": 5035, + "source": 1163, "pc": [ 4967 ] }, { - "teal": 5032, - "source": 1157, + "teal": 5036, + "source": 1163, "pc": [ 4968 ] }, { - "teal": 5033, - "source": 1157, + "teal": 5037, + "source": 1163, "pc": [ 4969, 4970 ] }, { - "teal": 5034, - "source": 1157, + "teal": 5038, + "source": 1163, "pc": [ 4971 ] }, { - "teal": 5038, - "source": 1158, + "teal": 5042, + "source": 1164, "pc": [ 4972, 4973 ] }, { - "teal": 5039, - "source": 1158, + "teal": 5043, + "source": 1164, "pc": [ 4974 ] }, { - "teal": 5040, - "source": 1158, + "teal": 5044, + "source": 1164, "pc": [ 4975, 4976 ] }, { - "teal": 5041, - "source": 1158, + "teal": 5045, + "source": 1164, "pc": [ 4977, 4978 ] }, { - "teal": 5042, - "source": 1158, + "teal": 5046, + "source": 1164, "pc": [ 4979, 4980 ] }, { - "teal": 5043, - "source": 1158, + "teal": 5047, + "source": 1164, "pc": [ 4981 ] }, { - "teal": 5044, - "source": 1158, + "teal": 5048, + "source": 1164, "pc": [ 4982 ] }, { - "teal": 5045, - "source": 1158, + "teal": 5049, + "source": 1164, "pc": [ 4983, 4984 ] }, { - "teal": 5046, - "source": 1158, + "teal": 5050, + "source": 1164, "pc": [ 4985 ] }, { - "teal": 5047, - "source": 1158, + "teal": 5051, + "source": 1164, "pc": [ 4986 ] }, { - "teal": 5048, - "source": 1119, + "teal": 5052, + "source": 1125, "pc": [ 4987 ] }, { - "teal": 5052, - "source": 1161, + "teal": 5056, + "source": 1167, "pc": [ 4988, 4989, @@ -24369,171 +24384,171 @@ ] }, { - "teal": 5055, - "source": 1161, + "teal": 5059, + "source": 1167, "pc": [ 4991 ] }, { - "teal": 5056, - "source": 1161, + "teal": 5060, + "source": 1167, "pc": [ 4992, 4993 ] }, { - "teal": 5060, - "source": 1162, + "teal": 5064, + "source": 1168, "pc": [ 4994 ] }, { - "teal": 5061, - "source": 1162, + "teal": 5065, + "source": 1168, "pc": [ 4995, 4996 ] }, { - "teal": 5062, - "source": 1162, + "teal": 5066, + "source": 1168, "pc": [ 4997 ] }, { - "teal": 5063, - "source": 1162, + "teal": 5067, + "source": 1168, "pc": [ 4998 ] }, { - "teal": 5064, - "source": 1162, + "teal": 5068, + "source": 1168, "pc": [ 4999 ] }, { - "teal": 5065, - "source": 1162, + "teal": 5069, + "source": 1168, "pc": [ 5000 ] }, { - "teal": 5066, - "source": 1162, + "teal": 5070, + "source": 1168, "pc": [ 5001 ] }, { - "teal": 5070, - "source": 1164, + "teal": 5074, + "source": 1170, "pc": [ 5002 ] }, { - "teal": 5071, - "source": 1164, + "teal": 5075, + "source": 1170, "pc": [ 5003, 5004 ] }, { - "teal": 5072, - "source": 1164, + "teal": 5076, + "source": 1170, "pc": [ 5005 ] }, { - "teal": 5073, - "source": 1164, + "teal": 5077, + "source": 1170, "pc": [ 5006 ] }, - { - "teal": 5076, - "source": 1164, + { + "teal": 5080, + "source": 1170, "errorMessage": "box value does not exist: this.stakerPoolSet(staker).value", "pc": [ 5007 ] }, { - "teal": 5077, - "source": 1164, + "teal": 5081, + "source": 1170, "pc": [ 5008, 5009 ] }, { - "teal": 5081, - "source": 1165, + "teal": 5085, + "source": 1171, "pc": [ 5010 ] }, { - "teal": 5082, - "source": 1165, + "teal": 5086, + "source": 1171, "pc": [ 5011, 5012 ] }, { - "teal": 5086, - "source": 1166, + "teal": 5090, + "source": 1172, "pc": [ 5013 ] }, { - "teal": 5087, - "source": 1166, + "teal": 5091, + "source": 1172, "pc": [ 5014, 5015 ] }, { - "teal": 5092, - "source": 1166, + "teal": 5096, + "source": 1172, "pc": [ 5016, 5017 ] }, { - "teal": 5093, - "source": 1166, + "teal": 5097, + "source": 1172, "pc": [ 5018, 5019 ] }, { - "teal": 5094, - "source": 1166, + "teal": 5098, + "source": 1172, "pc": [ 5020 ] }, { - "teal": 5095, - "source": 1166, + "teal": 5099, + "source": 1172, "pc": [ 5021, 5022, @@ -24541,67 +24556,67 @@ ] }, { - "teal": 5100, - "source": 1167, + "teal": 5104, + "source": 1173, "pc": [ 5024, 5025 ] }, { - "teal": 5101, - "source": 1167, + "teal": 5105, + "source": 1173, "pc": [ 5026, 5027 ] }, { - "teal": 5102, - "source": 1167, + "teal": 5106, + "source": 1173, "pc": [ 5028 ] }, { - "teal": 5103, - "source": 1167, + "teal": 5107, + "source": 1173, "pc": [ 5029 ] }, { - "teal": 5104, - "source": 1167, + "teal": 5108, + "source": 1173, "pc": [ 5030 ] }, { - "teal": 5105, - "source": 1167, + "teal": 5109, + "source": 1173, "pc": [ 5031 ] }, { - "teal": 5106, - "source": 1167, + "teal": 5110, + "source": 1173, "pc": [ 5032, 5033 ] }, { - "teal": 5107, - "source": 1167, + "teal": 5111, + "source": 1173, "pc": [ 5034 ] }, { - "teal": 5108, - "source": 1167, + "teal": 5112, + "source": 1173, "pc": [ 5035, 5036, @@ -24609,44 +24624,44 @@ ] }, { - "teal": 5113, - "source": 1169, + "teal": 5117, + "source": 1175, "pc": [ 5038 ] }, { - "teal": 5119, - "source": 1171, + "teal": 5123, + "source": 1177, "pc": [ 5039, 5040 ] }, { - "teal": 5120, - "source": 1171, + "teal": 5124, + "source": 1177, "pc": [ 5041 ] }, { - "teal": 5121, - "source": 1171, + "teal": 5125, + "source": 1177, "pc": [ 5042 ] }, { - "teal": 5122, - "source": 1171, + "teal": 5126, + "source": 1177, "pc": [ 5043 ] }, { - "teal": 5123, - "source": 1171, + "teal": 5127, + "source": 1177, "pc": [ 5044, 5045, @@ -24654,94 +24669,94 @@ ] }, { - "teal": 5124, - "source": 1171, + "teal": 5128, + "source": 1177, "pc": [ 5047, 5048 ] }, { - "teal": 5125, - "source": 1171, + "teal": 5129, + "source": 1177, "pc": [ 5049, 5050 ] }, { - "teal": 5126, - "source": 1171, + "teal": 5130, + "source": 1177, "pc": [ 5051 ] }, { - "teal": 5127, - "source": 1171, + "teal": 5131, + "source": 1177, "pc": [ 5052 ] }, { - "teal": 5128, - "source": 1171, + "teal": 5132, + "source": 1177, "pc": [ 5053 ] }, { - "teal": 5129, - "source": 1171, + "teal": 5133, + "source": 1177, "pc": [ 5054 ] }, { - "teal": 5130, - "source": 1171, + "teal": 5134, + "source": 1177, "pc": [ 5055 ] }, { - "teal": 5131, - "source": 1171, + "teal": 5135, + "source": 1177, "pc": [ 5056 ] }, { - "teal": 5132, - "source": 1171, + "teal": 5136, + "source": 1177, "pc": [ 5057 ] }, { - "teal": 5133, - "source": 1171, + "teal": 5137, + "source": 1177, "pc": [ 5058 ] }, { - "teal": 5134, - "source": 1171, + "teal": 5138, + "source": 1177, "pc": [ 5059 ] }, { - "teal": 5135, - "source": 1171, + "teal": 5139, + "source": 1177, "pc": [ 5060 ] }, { - "teal": 5138, - "source": 1171, + "teal": 5142, + "source": 1177, "pc": [ 5061, 5062, @@ -24749,68 +24764,68 @@ ] }, { - "teal": 5143, - "source": 1172, + "teal": 5147, + "source": 1178, "pc": [ 5064, 5065 ] }, { - "teal": 5144, - "source": 1172, + "teal": 5148, + "source": 1178, "pc": [ 5066 ] }, { - "teal": 5145, - "source": 1172, + "teal": 5149, + "source": 1178, "pc": [ 5067 ] }, { - "teal": 5146, - "source": 1172, + "teal": 5150, + "source": 1178, "pc": [ 5068, 5069 ] }, { - "teal": 5153, - "source": 1166, + "teal": 5157, + "source": 1172, "pc": [ 5070, 5071 ] }, { - "teal": 5154, - "source": 1166, + "teal": 5158, + "source": 1172, "pc": [ 5072 ] }, { - "teal": 5155, - "source": 1166, + "teal": 5159, + "source": 1172, "pc": [ 5073 ] }, { - "teal": 5156, - "source": 1166, + "teal": 5160, + "source": 1172, "pc": [ 5074, 5075 ] }, { - "teal": 5157, - "source": 1166, + "teal": 5161, + "source": 1172, "pc": [ 5076, 5077, @@ -24818,30 +24833,30 @@ ] }, { - "teal": 5163, - "source": 1175, + "teal": 5167, + "source": 1181, "pc": [ 5079, 5080 ] }, { - "teal": 5164, - "source": 1175, + "teal": 5168, + "source": 1181, "pc": [ 5081 ] }, { - "teal": 5165, - "source": 1175, + "teal": 5169, + "source": 1181, "pc": [ 5082 ] }, { - "teal": 5166, - "source": 1175, + "teal": 5170, + "source": 1181, "pc": [ 5083, 5084, @@ -24849,104 +24864,104 @@ ] }, { - "teal": 5170, - "source": 1176, + "teal": 5174, + "source": 1182, "errorMessage": "No empty slot available in the staker pool set", "pc": [ 5086 ] }, { - "teal": 5175, - "source": 1178, + "teal": 5179, + "source": 1184, "pc": [ 5087, 5088 ] }, { - "teal": 5176, - "source": 1178, + "teal": 5180, + "source": 1184, "pc": [ 5089 ] }, { - "teal": 5177, - "source": 1178, + "teal": 5181, + "source": 1184, "pc": [ 5090 ] }, { - "teal": 5178, - "source": 1178, + "teal": 5182, + "source": 1184, "pc": [ 5091 ] }, { - "teal": 5179, - "source": 1178, + "teal": 5183, + "source": 1184, "pc": [ 5092 ] }, { - "teal": 5180, - "source": 1178, + "teal": 5184, + "source": 1184, "pc": [ 5093, 5094 ] }, { - "teal": 5181, - "source": 1178, + "teal": 5185, + "source": 1184, "pc": [ 5095 ] }, { - "teal": 5182, - "source": 1178, + "teal": 5186, + "source": 1184, "pc": [ 5096, 5097 ] }, { - "teal": 5183, - "source": 1178, + "teal": 5187, + "source": 1184, "pc": [ 5098 ] }, { - "teal": 5184, - "source": 1178, + "teal": 5188, + "source": 1184, "pc": [ 5099, 5100 ] }, { - "teal": 5185, - "source": 1178, + "teal": 5189, + "source": 1184, "pc": [ 5101 ] }, { - "teal": 5186, - "source": 1161, + "teal": 5190, + "source": 1167, "pc": [ 5102 ] }, { - "teal": 5197, - "source": 1189, + "teal": 5201, + "source": 1195, "pc": [ 5103, 5104, @@ -24954,151 +24969,151 @@ ] }, { - "teal": 5200, - "source": 1189, + "teal": 5204, + "source": 1195, "pc": [ 5106 ] }, { - "teal": 5201, - "source": 1189, + "teal": 5205, + "source": 1195, "pc": [ 5107, 5108 ] }, { - "teal": 5205, - "source": 1191, + "teal": 5209, + "source": 1197, "pc": [ 5109 ] }, { - "teal": 5206, - "source": 1191, + "teal": 5210, + "source": 1197, "pc": [ 5110, 5111 ] }, { - "teal": 5210, - "source": 1192, + "teal": 5214, + "source": 1198, "pc": [ 5112 ] }, { - "teal": 5211, - "source": 1192, + "teal": 5215, + "source": 1198, "pc": [ 5113, 5114 ] }, { - "teal": 5215, - "source": 1193, + "teal": 5219, + "source": 1199, "pc": [ 5115 ] }, { - "teal": 5216, - "source": 1193, + "teal": 5220, + "source": 1199, "pc": [ 5116, 5117 ] }, { - "teal": 5220, - "source": 1195, + "teal": 5224, + "source": 1201, "pc": [ 5118 ] }, { - "teal": 5221, - "source": 1195, + "teal": 5225, + "source": 1201, "pc": [ 5119, 5120 ] }, { - "teal": 5222, - "source": 1195, + "teal": 5226, + "source": 1201, "pc": [ 5121 ] }, { - "teal": 5223, - "source": 1195, + "teal": 5227, + "source": 1201, "pc": [ 5122 ] }, { - "teal": 5226, - "source": 1195, + "teal": 5230, + "source": 1201, "errorMessage": "box value does not exist: this.stakerPoolSet(staker).value", "pc": [ 5123 ] }, { - "teal": 5227, - "source": 1195, + "teal": 5231, + "source": 1201, "pc": [ 5124, 5125 ] }, { - "teal": 5231, - "source": 1196, + "teal": 5235, + "source": 1202, "pc": [ 5126 ] }, { - "teal": 5232, - "source": 1196, + "teal": 5236, + "source": 1202, "pc": [ 5127, 5128 ] }, { - "teal": 5237, - "source": 1196, + "teal": 5241, + "source": 1202, "pc": [ 5129, 5130 ] }, { - "teal": 5238, - "source": 1196, + "teal": 5242, + "source": 1202, "pc": [ 5131, 5132 ] }, { - "teal": 5239, - "source": 1196, + "teal": 5243, + "source": 1202, "pc": [ 5133 ] }, { - "teal": 5240, - "source": 1196, + "teal": 5244, + "source": 1202, "pc": [ 5134, 5135, @@ -25106,87 +25121,87 @@ ] }, { - "teal": 5245, - "source": 1197, + "teal": 5249, + "source": 1203, "pc": [ 5137, 5138 ] }, { - "teal": 5246, - "source": 1197, + "teal": 5250, + "source": 1203, "pc": [ 5139, 5140 ] }, { - "teal": 5247, - "source": 1197, + "teal": 5251, + "source": 1203, "pc": [ 5141 ] }, { - "teal": 5248, - "source": 1197, + "teal": 5252, + "source": 1203, "pc": [ 5142 ] }, { - "teal": 5249, - "source": 1197, + "teal": 5253, + "source": 1203, "pc": [ 5143 ] }, { - "teal": 5250, - "source": 1197, + "teal": 5254, + "source": 1203, "pc": [ 5144 ] }, { - "teal": 5251, - "source": 1197, + "teal": 5255, + "source": 1203, "pc": [ 5145 ] }, { - "teal": 5252, - "source": 1197, + "teal": 5256, + "source": 1203, "pc": [ 5146 ] }, { - "teal": 5253, - "source": 1197, + "teal": 5257, + "source": 1203, "pc": [ 5147 ] }, { - "teal": 5254, - "source": 1197, + "teal": 5258, + "source": 1203, "pc": [ 5148 ] }, { - "teal": 5255, - "source": 1197, + "teal": 5259, + "source": 1203, "pc": [ 5149 ] }, { - "teal": 5256, - "source": 1197, + "teal": 5260, + "source": 1203, "pc": [ 5150, 5151, @@ -25194,8 +25209,8 @@ ] }, { - "teal": 5259, - "source": 1198, + "teal": 5263, + "source": 1204, "pc": [ 5153, 5154, @@ -25203,111 +25218,111 @@ ] }, { - "teal": 5264, - "source": 1200, + "teal": 5268, + "source": 1206, "pc": [ 5156, 5157 ] }, { - "teal": 5265, - "source": 1200, + "teal": 5269, + "source": 1206, "pc": [ 5158 ] }, { - "teal": 5266, - "source": 1200, + "teal": 5270, + "source": 1206, "pc": [ 5159 ] }, { - "teal": 5267, - "source": 1200, + "teal": 5271, + "source": 1206, "pc": [ 5160, 5161 ] }, { - "teal": 5272, - "source": 1201, + "teal": 5276, + "source": 1207, "pc": [ 5162, 5163 ] }, { - "teal": 5273, - "source": 1201, + "teal": 5277, + "source": 1207, "pc": [ 5164, 5165 ] }, { - "teal": 5274, - "source": 1201, + "teal": 5278, + "source": 1207, "pc": [ 5166 ] }, { - "teal": 5275, - "source": 1201, + "teal": 5279, + "source": 1207, "pc": [ 5167 ] }, { - "teal": 5276, - "source": 1201, + "teal": 5280, + "source": 1207, "pc": [ 5168 ] }, { - "teal": 5277, - "source": 1201, + "teal": 5281, + "source": 1207, "pc": [ 5169 ] }, { - "teal": 5278, - "source": 1201, + "teal": 5282, + "source": 1207, "pc": [ 5170 ] }, { - "teal": 5279, - "source": 1201, + "teal": 5283, + "source": 1207, "pc": [ 5171 ] }, { - "teal": 5280, - "source": 1201, + "teal": 5284, + "source": 1207, "pc": [ 5172 ] }, { - "teal": 5281, - "source": 1201, + "teal": 5285, + "source": 1207, "pc": [ 5173, 5174 ] }, { - "teal": 5282, - "source": 1201, + "teal": 5286, + "source": 1207, "pc": [ 5175, 5176, @@ -25315,22 +25330,22 @@ ] }, { - "teal": 5283, - "source": 1201, + "teal": 5287, + "source": 1207, "pc": [ 5178 ] }, { - "teal": 5284, - "source": 1201, + "teal": 5288, + "source": 1207, "pc": [ 5179 ] }, { - "teal": 5285, - "source": 1201, + "teal": 5289, + "source": 1207, "pc": [ 5180, 5181, @@ -25338,67 +25353,67 @@ ] }, { - "teal": 5291, - "source": 1202, + "teal": 5295, + "source": 1208, "pc": [ 5183, 5184 ] }, { - "teal": 5292, - "source": 1202, + "teal": 5296, + "source": 1208, "pc": [ 5185, 5186 ] }, { - "teal": 5293, - "source": 1202, + "teal": 5297, + "source": 1208, "pc": [ 5187 ] }, { - "teal": 5294, - "source": 1202, + "teal": 5298, + "source": 1208, "pc": [ 5188 ] }, { - "teal": 5295, - "source": 1202, + "teal": 5299, + "source": 1208, "pc": [ 5189 ] }, { - "teal": 5296, - "source": 1202, + "teal": 5300, + "source": 1208, "pc": [ 5190 ] }, { - "teal": 5297, - "source": 1202, + "teal": 5301, + "source": 1208, "pc": [ 5191, 5192 ] }, { - "teal": 5298, - "source": 1202, + "teal": 5302, + "source": 1208, "pc": [ 5193 ] }, { - "teal": 5299, - "source": 1202, + "teal": 5303, + "source": 1208, "pc": [ 5194, 5195, @@ -25406,45 +25421,45 @@ ] }, { - "teal": 5304, - "source": 1203, + "teal": 5308, + "source": 1209, "pc": [ 5197 ] }, { - "teal": 5305, - "source": 1203, + "teal": 5309, + "source": 1209, "pc": [ 5198, 5199 ] }, { - "teal": 5309, - "source": 1205, + "teal": 5313, + "source": 1211, "pc": [ 5200, 5201 ] }, { - "teal": 5310, - "source": 1205, + "teal": 5314, + "source": 1211, "pc": [ 5202 ] }, { - "teal": 5311, - "source": 1205, + "teal": 5315, + "source": 1211, "pc": [ 5203 ] }, { - "teal": 5312, - "source": 1205, + "teal": 5316, + "source": 1211, "pc": [ 5204, 5205, @@ -25475,45 +25490,45 @@ ] }, { - "teal": 5313, - "source": 1205, + "teal": 5317, + "source": 1211, "pc": [ 5230 ] }, { - "teal": 5314, - "source": 1205, + "teal": 5318, + "source": 1211, "pc": [ 5231, 5232 ] }, { - "teal": 5315, - "source": 1205, + "teal": 5319, + "source": 1211, "pc": [ 5233 ] }, { - "teal": 5316, - "source": 1205, + "teal": 5320, + "source": 1211, "pc": [ 5234, 5235 ] }, { - "teal": 5317, - "source": 1205, + "teal": 5321, + "source": 1211, "pc": [ 5236 ] }, { - "teal": 5318, - "source": 1202, + "teal": 5322, + "source": 1208, "pc": [ 5237, 5238, @@ -25521,68 +25536,68 @@ ] }, { - "teal": 5323, - "source": 1207, + "teal": 5327, + "source": 1213, "pc": [ 5240, 5241 ] }, { - "teal": 5324, - "source": 1207, + "teal": 5328, + "source": 1213, "pc": [ 5242 ] }, { - "teal": 5325, - "source": 1207, + "teal": 5329, + "source": 1213, "pc": [ 5243 ] }, { - "teal": 5326, - "source": 1207, + "teal": 5330, + "source": 1213, "pc": [ 5244, 5245 ] }, { - "teal": 5335, - "source": 1196, + "teal": 5339, + "source": 1202, "pc": [ 5246, 5247 ] }, { - "teal": 5336, - "source": 1196, + "teal": 5340, + "source": 1202, "pc": [ 5248 ] }, { - "teal": 5337, - "source": 1196, + "teal": 5341, + "source": 1202, "pc": [ 5249 ] }, { - "teal": 5338, - "source": 1196, + "teal": 5342, + "source": 1202, "pc": [ 5250, 5251 ] }, { - "teal": 5339, - "source": 1196, + "teal": 5343, + "source": 1202, "pc": [ 5252, 5253, @@ -25590,23 +25605,23 @@ ] }, { - "teal": 5345, - "source": 1211, + "teal": 5349, + "source": 1217, "pc": [ 5255, 5256 ] }, { - "teal": 5346, - "source": 1211, + "teal": 5350, + "source": 1217, "pc": [ 5257 ] }, { - "teal": 5347, - "source": 1211, + "teal": 5351, + "source": 1217, "pc": [ 5258, 5259, @@ -25614,119 +25629,119 @@ ] }, { - "teal": 5351, - "source": 1212, + "teal": 5355, + "source": 1218, "errorMessage": "No matching slot found when told to remove a pool from the stakers set", "pc": [ 5261 ] }, { - "teal": 5356, - "source": 1215, + "teal": 5360, + "source": 1221, "pc": [ 5262, 5263 ] }, { - "teal": 5357, - "source": 1215, + "teal": 5361, + "source": 1221, "pc": [ 5264 ] }, { - "teal": 5358, - "source": 1215, + "teal": 5362, + "source": 1221, "pc": [ 5265, 5266 ] }, { - "teal": 5359, - "source": 1215, + "teal": 5363, + "source": 1221, "pc": [ 5267 ] }, { - "teal": 5360, - "source": 1215, + "teal": 5364, + "source": 1221, "pc": [ 5268 ] }, { - "teal": 5361, - "source": 1215, + "teal": 5365, + "source": 1221, "pc": [ 5269 ] }, { - "teal": 5362, - "source": 1215, + "teal": 5366, + "source": 1221, "pc": [ 5270 ] }, { - "teal": 5363, - "source": 1215, + "teal": 5367, + "source": 1221, "pc": [ 5271, 5272 ] }, { - "teal": 5364, - "source": 1215, + "teal": 5368, + "source": 1221, "pc": [ 5273 ] }, { - "teal": 5365, - "source": 1215, + "teal": 5369, + "source": 1221, "pc": [ 5274 ] }, { - "teal": 5366, - "source": 1215, + "teal": 5370, + "source": 1221, "pc": [ 5275 ] }, { - "teal": 5369, - "source": 1189, + "teal": 5373, + "source": 1195, "pc": [ 5276, 5277 ] }, { - "teal": 5372, - "source": 1189, + "teal": 5376, + "source": 1195, "pc": [ 5278, 5279 ] }, { - "teal": 5373, - "source": 1189, + "teal": 5377, + "source": 1195, "pc": [ 5280 ] }, { - "teal": 5377, - "source": 1218, + "teal": 5381, + "source": 1224, "pc": [ 5281, 5282, @@ -25734,91 +25749,91 @@ ] }, { - "teal": 5380, - "source": 1218, + "teal": 5384, + "source": 1224, "pc": [ 5284 ] }, { - "teal": 5381, - "source": 1218, + "teal": 5385, + "source": 1224, "pc": [ 5285, 5286 ] }, { - "teal": 5385, - "source": 1219, + "teal": 5389, + "source": 1225, "pc": [ 5287, 5288 ] }, { - "teal": 5386, - "source": 1219, + "teal": 5390, + "source": 1225, "pc": [ 5289, 5290 ] }, { - "teal": 5387, - "source": 1219, + "teal": 5391, + "source": 1225, "pc": [ 5291 ] }, { - "teal": 5388, - "source": 1219, + "teal": 5392, + "source": 1225, "pc": [ 5292, 5293 ] }, { - "teal": 5389, - "source": 1219, + "teal": 5393, + "source": 1225, "pc": [ 5294 ] }, { - "teal": 5390, - "source": 1219, + "teal": 5394, + "source": 1225, "pc": [ 5295 ] }, { - "teal": 5391, - "source": 1219, + "teal": 5395, + "source": 1225, "pc": [ 5296, 5297 ] }, { - "teal": 5392, - "source": 1219, + "teal": 5396, + "source": 1225, "pc": [ 5298 ] }, { - "teal": 5393, - "source": 1219, + "teal": 5397, + "source": 1225, "pc": [ 5299, 5300 ] }, { - "teal": 5397, - "source": 1220, + "teal": 5401, + "source": 1226, "pc": [ 5301, 5302, @@ -25826,103 +25841,103 @@ ] }, { - "teal": 5398, - "source": 1220, + "teal": 5402, + "source": 1226, "pc": [ 5304 ] }, { - "teal": 5399, - "source": 1220, + "teal": 5403, + "source": 1226, "pc": [ 5305 ] }, { - "teal": 5400, - "source": 1220, + "teal": 5404, + "source": 1226, "pc": [ 5306, 5307 ] }, { - "teal": 5401, - "source": 1220, + "teal": 5405, + "source": 1226, "pc": [ 5308 ] }, { - "teal": 5402, - "source": 1220, + "teal": 5406, + "source": 1226, "pc": [ 5309 ] }, { - "teal": 5403, - "source": 1220, + "teal": 5407, + "source": 1226, "pc": [ 5310, 5311 ] }, { - "teal": 5404, - "source": 1220, + "teal": 5408, + "source": 1226, "pc": [ 5312 ] }, { - "teal": 5405, - "source": 1220, + "teal": 5409, + "source": 1226, "pc": [ 5313 ] }, { - "teal": 5406, - "source": 1220, + "teal": 5410, + "source": 1226, "pc": [ 5314, 5315 ] }, { - "teal": 5410, - "source": 1222, + "teal": 5414, + "source": 1228, "pc": [ 5316, 5317 ] }, { - "teal": 5411, - "source": 1222, + "teal": 5415, + "source": 1228, "pc": [ 5318 ] }, { - "teal": 5412, - "source": 1222, + "teal": 5416, + "source": 1228, "pc": [ 5319 ] }, { - "teal": 5413, - "source": 1222, + "teal": 5417, + "source": 1228, "pc": [ 5320 ] }, { - "teal": 5414, - "source": 1222, + "teal": 5418, + "source": 1228, "pc": [ 5321, 5322, @@ -25930,83 +25945,83 @@ ] }, { - "teal": 5415, - "source": 1222, + "teal": 5419, + "source": 1228, "pc": [ 5324, 5325 ] }, { - "teal": 5416, - "source": 1222, + "teal": 5420, + "source": 1228, "pc": [ 5326 ] }, { - "teal": 5417, - "source": 1222, + "teal": 5421, + "source": 1228, "pc": [ 5327 ] }, { - "teal": 5418, - "source": 1222, + "teal": 5422, + "source": 1228, "pc": [ 5328 ] }, { - "teal": 5422, - "source": 1222, + "teal": 5426, + "source": 1228, "errorMessage": "node number not in valid range", "pc": [ 5329 ] }, { - "teal": 5426, - "source": 1224, + "teal": 5430, + "source": 1230, "pc": [ 5330 ] }, { - "teal": 5427, - "source": 1224, + "teal": 5431, + "source": 1230, "pc": [ 5331, 5332 ] }, { - "teal": 5432, - "source": 1224, + "teal": 5436, + "source": 1230, "pc": [ 5333, 5334 ] }, { - "teal": 5433, - "source": 1224, + "teal": 5437, + "source": 1230, "pc": [ 5335, 5336 ] }, { - "teal": 5434, - "source": 1224, + "teal": 5438, + "source": 1230, "pc": [ 5337 ] }, { - "teal": 5435, - "source": 1224, + "teal": 5439, + "source": 1230, "pc": [ 5338, 5339, @@ -26014,144 +26029,144 @@ ] }, { - "teal": 5440, - "source": 1225, + "teal": 5444, + "source": 1231, "pc": [ 5341, 5342 ] }, { - "teal": 5441, - "source": 1225, + "teal": 5445, + "source": 1231, "pc": [ 5343 ] }, { - "teal": 5442, - "source": 1225, + "teal": 5446, + "source": 1231, "pc": [ 5344, 5345 ] }, { - "teal": 5443, - "source": 1225, + "teal": 5447, + "source": 1231, "pc": [ 5346 ] }, { - "teal": 5444, - "source": 1225, + "teal": 5448, + "source": 1231, "pc": [ 5347 ] }, { - "teal": 5445, - "source": 1225, + "teal": 5449, + "source": 1231, "pc": [ 5348 ] }, { - "teal": 5446, - "source": 1225, + "teal": 5450, + "source": 1231, "pc": [ 5349 ] }, { - "teal": 5447, - "source": 1225, + "teal": 5451, + "source": 1231, "pc": [ 5350 ] }, { - "teal": 5448, - "source": 1225, + "teal": 5452, + "source": 1231, "pc": [ 5351 ] }, { - "teal": 5449, - "source": 1225, + "teal": 5453, + "source": 1231, "pc": [ 5352 ] }, { - "teal": 5450, - "source": 1225, + "teal": 5454, + "source": 1231, "pc": [ 5353, 5354 ] }, { - "teal": 5451, - "source": 1225, + "teal": 5455, + "source": 1231, "pc": [ 5355 ] }, { - "teal": 5452, - "source": 1225, + "teal": 5456, + "source": 1231, "pc": [ 5356 ] }, { - "teal": 5453, - "source": 1225, + "teal": 5457, + "source": 1231, "pc": [ 5357 ] }, { - "teal": 5454, - "source": 1225, + "teal": 5458, + "source": 1231, "pc": [ 5358 ] }, { - "teal": 5455, - "source": 1225, + "teal": 5459, + "source": 1231, "pc": [ 5359 ] }, { - "teal": 5456, - "source": 1225, + "teal": 5460, + "source": 1231, "pc": [ 5360 ] }, { - "teal": 5457, - "source": 1225, + "teal": 5461, + "source": 1231, "pc": [ 5361 ] }, { - "teal": 5458, - "source": 1225, + "teal": 5462, + "source": 1231, "pc": [ 5362 ] }, { - "teal": 5459, - "source": 1225, + "teal": 5463, + "source": 1231, "pc": [ 5363, 5364, @@ -26159,198 +26174,198 @@ ] }, { - "teal": 5464, - "source": 1227, + "teal": 5468, + "source": 1233, "pc": [ 5366, 5367 ] }, { - "teal": 5465, - "source": 1227, + "teal": 5469, + "source": 1233, "pc": [ 5368, 5369 ] }, { - "teal": 5466, - "source": 1227, + "teal": 5470, + "source": 1233, "pc": [ 5370 ] }, { - "teal": 5467, - "source": 1227, + "teal": 5471, + "source": 1233, "pc": [ 5371 ] }, { - "teal": 5468, - "source": 1227, + "teal": 5472, + "source": 1233, "pc": [ 5372 ] }, { - "teal": 5469, - "source": 1227, + "teal": 5473, + "source": 1233, "pc": [ 5373 ] }, { - "teal": 5470, - "source": 1227, + "teal": 5474, + "source": 1233, "pc": [ 5374 ] }, { - "teal": 5471, - "source": 1227, + "teal": 5475, + "source": 1233, "pc": [ 5375 ] }, { - "teal": 5472, - "source": 1227, + "teal": 5476, + "source": 1233, "pc": [ 5376 ] }, { - "teal": 5473, - "source": 1227, + "teal": 5477, + "source": 1233, "pc": [ 5377, 5378 ] }, { - "teal": 5474, - "source": 1227, + "teal": 5478, + "source": 1233, "pc": [ 5379 ] }, { - "teal": 5475, - "source": 1227, + "teal": 5479, + "source": 1233, "pc": [ 5380 ] }, { - "teal": 5476, - "source": 1227, + "teal": 5480, + "source": 1233, "pc": [ 5381 ] }, { - "teal": 5477, - "source": 1227, + "teal": 5481, + "source": 1233, "pc": [ 5382, 5383 ] }, { - "teal": 5478, - "source": 1227, + "teal": 5482, + "source": 1233, "pc": [ 5384 ] }, { - "teal": 5479, - "source": 1227, + "teal": 5483, + "source": 1233, "pc": [ 5385 ] }, { - "teal": 5480, - "source": 1227, + "teal": 5484, + "source": 1233, "pc": [ 5386, 5387 ] }, { - "teal": 5481, - "source": 1227, + "teal": 5485, + "source": 1233, "pc": [ 5388 ] }, { - "teal": 5482, - "source": 1227, + "teal": 5486, + "source": 1233, "pc": [ 5389 ] }, { - "teal": 5483, - "source": 1227, + "teal": 5487, + "source": 1233, "pc": [ 5390, 5391 ] }, { - "teal": 5484, - "source": 1227, + "teal": 5488, + "source": 1233, "pc": [ 5392 ] }, { - "teal": 5488, - "source": 1228, + "teal": 5492, + "source": 1234, "pc": [ 5393 ] }, { - "teal": 5495, - "source": 1224, + "teal": 5499, + "source": 1230, "pc": [ 5394, 5395 ] }, { - "teal": 5496, - "source": 1224, + "teal": 5500, + "source": 1230, "pc": [ 5396 ] }, { - "teal": 5497, - "source": 1224, + "teal": 5501, + "source": 1230, "pc": [ 5397 ] }, { - "teal": 5498, - "source": 1224, + "teal": 5502, + "source": 1230, "pc": [ 5398, 5399 ] }, { - "teal": 5499, - "source": 1224, + "teal": 5503, + "source": 1230, "pc": [ 5400, 5401, @@ -26358,23 +26373,23 @@ ] }, { - "teal": 5503, - "source": 1231, + "teal": 5507, + "source": 1237, "errorMessage": "no available space in specified node for this pool", "pc": [ 5403 ] }, { - "teal": 5504, - "source": 1218, + "teal": 5508, + "source": 1224, "pc": [ 5404 ] }, { - "teal": 5514, - "source": 1241, + "teal": 5518, + "source": 1247, "pc": [ 5405, 5406, @@ -26382,119 +26397,119 @@ ] }, { - "teal": 5517, - "source": 1241, + "teal": 5521, + "source": 1247, "pc": [ 5408 ] }, { - "teal": 5518, - "source": 1241, + "teal": 5522, + "source": 1247, "pc": [ 5409, 5410 ] }, { - "teal": 5522, - "source": 1242, + "teal": 5526, + "source": 1248, "pc": [ 5411, 5412 ] }, { - "teal": 5523, - "source": 1242, + "teal": 5527, + "source": 1248, "pc": [ 5413 ] }, { - "teal": 5524, - "source": 1242, + "teal": 5528, + "source": 1248, "pc": [ 5414 ] }, { - "teal": 5525, - "source": 1242, + "teal": 5529, + "source": 1248, "pc": [ 5415, 5416 ] }, { - "teal": 5526, - "source": 1242, + "teal": 5530, + "source": 1248, "pc": [ 5417 ] }, { - "teal": 5527, - "source": 1242, + "teal": 5531, + "source": 1248, "pc": [ 5418 ] }, { - "teal": 5528, - "source": 1242, + "teal": 5532, + "source": 1248, "pc": [ 5419, 5420 ] }, { - "teal": 5529, - "source": 1242, + "teal": 5533, + "source": 1248, "pc": [ 5421 ] }, { - "teal": 5530, - "source": 1242, + "teal": 5534, + "source": 1248, "pc": [ 5422 ] }, { - "teal": 5531, - "source": 1242, + "teal": 5535, + "source": 1248, "pc": [ 5423, 5424 ] }, { - "teal": 5536, - "source": 1243, + "teal": 5540, + "source": 1249, "pc": [ 5425, 5426 ] }, { - "teal": 5537, - "source": 1243, + "teal": 5541, + "source": 1249, "pc": [ 5427 ] }, { - "teal": 5538, - "source": 1243, + "teal": 5542, + "source": 1249, "pc": [ 5428 ] }, { - "teal": 5539, - "source": 1243, + "teal": 5543, + "source": 1249, "pc": [ 5429, 5430, @@ -26502,127 +26517,127 @@ ] }, { - "teal": 5544, - "source": 1244, + "teal": 5548, + "source": 1250, "pc": [ 5432 ] }, { - "teal": 5549, - "source": 1246, + "teal": 5553, + "source": 1252, "pc": [ 5433, 5434 ] }, { - "teal": 5550, - "source": 1246, + "teal": 5554, + "source": 1252, "pc": [ 5435, 5436 ] }, { - "teal": 5554, - "source": 1247, + "teal": 5558, + "source": 1253, "pc": [ 5437 ] }, { - "teal": 5555, - "source": 1247, + "teal": 5559, + "source": 1253, "pc": [ 5438, 5439 ] }, { - "teal": 5556, - "source": 1247, + "teal": 5560, + "source": 1253, "pc": [ 5440 ] }, { - "teal": 5557, - "source": 1247, + "teal": 5561, + "source": 1253, "pc": [ 5441, 5442 ] }, { - "teal": 5558, - "source": 1247, + "teal": 5562, + "source": 1253, "pc": [ 5443 ] }, { - "teal": 5559, - "source": 1247, + "teal": 5563, + "source": 1253, "pc": [ 5444 ] }, { - "teal": 5560, - "source": 1247, + "teal": 5564, + "source": 1253, "pc": [ 5445, 5446 ] }, { - "teal": 5561, - "source": 1247, + "teal": 5565, + "source": 1253, "pc": [ 5447 ] }, { - "teal": 5562, - "source": 1247, + "teal": 5566, + "source": 1253, "pc": [ 5448, 5449 ] }, { - "teal": 5569, - "source": 1251, + "teal": 5573, + "source": 1257, "pc": [ 5450, 5451 ] }, { - "teal": 5570, - "source": 1251, + "teal": 5574, + "source": 1257, "pc": [ 5452 ] }, { - "teal": 5571, - "source": 1251, + "teal": 5575, + "source": 1257, "pc": [ 5453 ] }, { - "teal": 5572, - "source": 1251, + "teal": 5576, + "source": 1257, "pc": [ 5454 ] }, { - "teal": 5573, - "source": 1251, + "teal": 5577, + "source": 1257, "pc": [ 5455, 5456, @@ -26630,45 +26645,45 @@ ] }, { - "teal": 5574, - "source": 1252, + "teal": 5578, + "source": 1258, "pc": [ 5458, 5459 ] }, { - "teal": 5575, - "source": 1252, + "teal": 5579, + "source": 1258, "pc": [ 5460, 5461 ] }, { - "teal": 5576, - "source": 1252, + "teal": 5580, + "source": 1258, "pc": [ 5462 ] }, { - "teal": 5577, - "source": 1251, + "teal": 5581, + "source": 1257, "pc": [ 5463 ] }, { - "teal": 5580, - "source": 1252, + "teal": 5584, + "source": 1258, "pc": [ 5464 ] }, { - "teal": 5581, - "source": 1252, + "teal": 5585, + "source": 1258, "pc": [ 5465, 5466, @@ -26676,38 +26691,38 @@ ] }, { - "teal": 5582, - "source": 1253, + "teal": 5586, + "source": 1259, "pc": [ 5468, 5469 ] }, { - "teal": 5583, - "source": 1253, + "teal": 5587, + "source": 1259, "pc": [ 5470, 5471 ] }, { - "teal": 5584, - "source": 1253, + "teal": 5588, + "source": 1259, "pc": [ 5472 ] }, { - "teal": 5585, - "source": 1252, + "teal": 5589, + "source": 1258, "pc": [ 5473 ] }, { - "teal": 5588, - "source": 1250, + "teal": 5592, + "source": 1256, "pc": [ 5474, 5475, @@ -26715,133 +26730,133 @@ ] }, { - "teal": 5593, - "source": 1255, + "teal": 5597, + "source": 1261, "pc": [ 5477, 5478 ] }, { - "teal": 5594, - "source": 1255, + "teal": 5598, + "source": 1261, "pc": [ 5479 ] }, { - "teal": 5595, - "source": 1255, + "teal": 5599, + "source": 1261, "pc": [ 5480 ] }, { - "teal": 5596, - "source": 1255, + "teal": 5600, + "source": 1261, "pc": [ 5481 ] }, { - "teal": 5600, - "source": 1256, + "teal": 5604, + "source": 1262, "pc": [ 5482, 5483 ] }, { - "teal": 5601, - "source": 1256, + "teal": 5605, + "source": 1262, "pc": [ 5484 ] }, { - "teal": 5602, - "source": 1256, + "teal": 5606, + "source": 1262, "pc": [ 5485 ] }, { - "teal": 5603, - "source": 1256, + "teal": 5607, + "source": 1262, "pc": [ 5486, 5487 ] }, { - "teal": 5604, - "source": 1256, + "teal": 5608, + "source": 1262, "pc": [ 5488 ] }, { - "teal": 5605, - "source": 1256, + "teal": 5609, + "source": 1262, "pc": [ 5489 ] }, { - "teal": 5606, - "source": 1256, + "teal": 5610, + "source": 1262, "pc": [ 5490, 5491 ] }, { - "teal": 5607, - "source": 1256, + "teal": 5611, + "source": 1262, "pc": [ 5492 ] }, { - "teal": 5608, - "source": 1256, + "teal": 5612, + "source": 1262, "pc": [ 5493 ] }, { - "teal": 5609, - "source": 1256, + "teal": 5613, + "source": 1262, "pc": [ 5494, 5495 ] }, { - "teal": 5614, - "source": 1257, + "teal": 5618, + "source": 1263, "pc": [ 5496, 5497 ] }, { - "teal": 5615, - "source": 1257, + "teal": 5619, + "source": 1263, "pc": [ 5498 ] }, { - "teal": 5616, - "source": 1257, + "teal": 5620, + "source": 1263, "pc": [ 5499 ] }, { - "teal": 5617, - "source": 1257, + "teal": 5621, + "source": 1263, "pc": [ 5500, 5501, @@ -26849,99 +26864,99 @@ ] }, { - "teal": 5622, - "source": 1258, + "teal": 5626, + "source": 1264, "pc": [ 5503 ] }, { - "teal": 5623, - "source": 1258, + "teal": 5627, + "source": 1264, "pc": [ 5504, 5505 ] }, { - "teal": 5631, - "source": 1261, + "teal": 5635, + "source": 1267, "pc": [ 5506, 5507 ] }, { - "teal": 5632, - "source": 1261, + "teal": 5636, + "source": 1267, "pc": [ 5508, 5509 ] }, { - "teal": 5633, - "source": 1261, + "teal": 5637, + "source": 1267, "pc": [ 5510, 5511 ] }, { - "teal": 5634, - "source": 1261, + "teal": 5638, + "source": 1267, "pc": [ 5512 ] }, { - "teal": 5635, - "source": 1261, + "teal": 5639, + "source": 1267, "pc": [ 5513, 5514 ] }, { - "teal": 5636, - "source": 1261, + "teal": 5640, + "source": 1267, "pc": [ 5515 ] }, { - "teal": 5639, - "source": 1260, + "teal": 5643, + "source": 1266, "errorMessage": "must have required minimum balance of validator defined token to add stake", "pc": [ 5516 ] }, { - "teal": 5645, - "source": 1265, + "teal": 5649, + "source": 1271, "pc": [ 5517, 5518 ] }, { - "teal": 5646, - "source": 1265, + "teal": 5650, + "source": 1271, "pc": [ 5519 ] }, { - "teal": 5647, - "source": 1265, + "teal": 5651, + "source": 1271, "pc": [ 5520 ] }, { - "teal": 5648, - "source": 1265, + "teal": 5652, + "source": 1271, "pc": [ 5521, 5522, @@ -26949,39 +26964,39 @@ ] }, { - "teal": 5656, - "source": 1267, + "teal": 5660, + "source": 1273, "pc": [ 5524, 5525 ] }, { - "teal": 5657, - "source": 1267, + "teal": 5661, + "source": 1273, "pc": [ 5526, 5527 ] }, { - "teal": 5658, - "source": 1267, + "teal": 5662, + "source": 1273, "pc": [ 5528 ] }, { - "teal": 5659, - "source": 1267, + "teal": 5663, + "source": 1273, "pc": [ 5529, 5530 ] }, { - "teal": 5660, - "source": 1267, + "teal": 5664, + "source": 1273, "pc": [ 5531, 5532, @@ -26989,46 +27004,46 @@ ] }, { - "teal": 5661, - "source": 1267, + "teal": 5665, + "source": 1273, "pc": [ 5534 ] }, { - "teal": 5664, - "source": 1266, + "teal": 5668, + "source": 1272, "errorMessage": "specified asset must be created by creator that the validator defined as a requirement to stake", "pc": [ 5535 ] }, { - "teal": 5670, - "source": 1271, + "teal": 5674, + "source": 1277, "pc": [ 5536, 5537 ] }, { - "teal": 5671, - "source": 1271, + "teal": 5675, + "source": 1277, "pc": [ 5538, 5539 ] }, { - "teal": 5672, - "source": 1271, + "teal": 5676, + "source": 1277, "pc": [ 5540 ] }, { - "teal": 5673, - "source": 1271, + "teal": 5677, + "source": 1277, "pc": [ 5541, 5542, @@ -27036,31 +27051,31 @@ ] }, { - "teal": 5678, - "source": 1272, + "teal": 5682, + "source": 1278, "pc": [ 5544 ] }, { - "teal": 5679, - "source": 1272, + "teal": 5683, + "source": 1278, "pc": [ 5545, 5546 ] }, { - "teal": 5683, - "source": 1273, + "teal": 5687, + "source": 1279, "pc": [ 5547, 5548 ] }, { - "teal": 5684, - "source": 1273, + "teal": 5688, + "source": 1279, "pc": [ 5549, 5550, @@ -27068,23 +27083,23 @@ ] }, { - "teal": 5685, - "source": 1273, + "teal": 5689, + "source": 1279, "pc": [ 5552 ] }, { - "teal": 5686, - "source": 1273, + "teal": 5690, + "source": 1279, "pc": [ 5553, 5554 ] }, { - "teal": 5687, - "source": 1273, + "teal": 5691, + "source": 1279, "pc": [ 5555, 5556, @@ -27092,61 +27107,61 @@ ] }, { - "teal": 5688, - "source": 1273, + "teal": 5692, + "source": 1279, "pc": [ 5558 ] }, { - "teal": 5689, - "source": 1273, + "teal": 5693, + "source": 1279, "pc": [ 5559, 5560 ] }, { - "teal": 5690, - "source": 1273, + "teal": 5694, + "source": 1279, "pc": [ 5561 ] }, { - "teal": 5691, - "source": 1273, + "teal": 5695, + "source": 1279, "pc": [ 5562, 5563 ] }, { - "teal": 5697, - "source": 1274, + "teal": 5701, + "source": 1280, "pc": [ 5564, 5565 ] }, { - "teal": 5698, - "source": 1274, + "teal": 5702, + "source": 1280, "pc": [ 5566, 5567 ] }, { - "teal": 5699, - "source": 1274, + "teal": 5703, + "source": 1280, "pc": [ 5568 ] }, { - "teal": 5700, - "source": 1274, + "teal": 5704, + "source": 1280, "pc": [ 5569, 5570, @@ -27154,23 +27169,23 @@ ] }, { - "teal": 5705, - "source": 1275, + "teal": 5709, + "source": 1281, "pc": [ 5572 ] }, { - "teal": 5706, - "source": 1275, + "teal": 5710, + "source": 1281, "pc": [ 5573, 5574 ] }, { - "teal": 5707, - "source": 1276, + "teal": 5711, + "source": 1282, "pc": [ 5575, 5576, @@ -27178,52 +27193,52 @@ ] }, { - "teal": 5713, - "source": 1273, + "teal": 5717, + "source": 1279, "pc": [ 5578, 5579 ] }, { - "teal": 5714, - "source": 1273, + "teal": 5718, + "source": 1279, "pc": [ 5580 ] }, { - "teal": 5715, - "source": 1273, + "teal": 5719, + "source": 1279, "pc": [ 5581 ] }, { - "teal": 5716, - "source": 1273, + "teal": 5720, + "source": 1279, "pc": [ 5582 ] }, { - "teal": 5717, - "source": 1273, + "teal": 5721, + "source": 1279, "pc": [ 5583, 5584 ] }, { - "teal": 5718, - "source": 1273, + "teal": 5722, + "source": 1279, "pc": [ 5585 ] }, { - "teal": 5719, - "source": 1273, + "teal": 5723, + "source": 1279, "pc": [ 5586, 5587, @@ -27231,61 +27246,61 @@ ] }, { - "teal": 5720, - "source": 1273, + "teal": 5724, + "source": 1279, "pc": [ 5589, 5590 ] }, { - "teal": 5721, - "source": 1273, + "teal": 5725, + "source": 1279, "pc": [ 5591, 5592 ] }, { - "teal": 5722, - "source": 1273, + "teal": 5726, + "source": 1279, "pc": [ 5593, 5594 ] }, { - "teal": 5723, - "source": 1273, + "teal": 5727, + "source": 1279, "pc": [ 5595 ] }, { - "teal": 5724, - "source": 1273, + "teal": 5728, + "source": 1279, "pc": [ 5596 ] }, { - "teal": 5725, - "source": 1273, + "teal": 5729, + "source": 1279, "pc": [ 5597 ] }, { - "teal": 5726, - "source": 1273, + "teal": 5730, + "source": 1279, "pc": [ 5598, 5599 ] }, { - "teal": 5727, - "source": 1273, + "teal": 5731, + "source": 1279, "pc": [ 5600, 5601, @@ -27293,47 +27308,47 @@ ] }, { - "teal": 5732, - "source": 1279, + "teal": 5736, + "source": 1285, "pc": [ 5603, 5604 ] }, { - "teal": 5735, - "source": 1279, + "teal": 5739, + "source": 1285, "errorMessage": "specified asset must be identical to the asset id defined as a requirement to stake", "pc": [ 5605 ] }, { - "teal": 5741, - "source": 1281, + "teal": 5745, + "source": 1287, "pc": [ 5606, 5607 ] }, { - "teal": 5742, - "source": 1281, + "teal": 5746, + "source": 1287, "pc": [ 5608, 5609 ] }, { - "teal": 5743, - "source": 1281, + "teal": 5747, + "source": 1287, "pc": [ 5610 ] }, { - "teal": 5744, - "source": 1281, + "teal": 5748, + "source": 1287, "pc": [ 5611, 5612, @@ -27341,39 +27356,39 @@ ] }, { - "teal": 5752, - "source": 1285, + "teal": 5756, + "source": 1291, "pc": [ 5614, 5615 ] }, { - "teal": 5753, - "source": 1285, + "teal": 5757, + "source": 1291, "pc": [ 5616, 5617 ] }, { - "teal": 5754, - "source": 1285, + "teal": 5758, + "source": 1291, "pc": [ 5618 ] }, { - "teal": 5755, - "source": 1285, + "teal": 5759, + "source": 1291, "pc": [ 5619, 5620 ] }, { - "teal": 5756, - "source": 1285, + "teal": 5760, + "source": 1291, "pc": [ 5621, 5622, @@ -27381,15 +27396,15 @@ ] }, { - "teal": 5757, - "source": 1285, + "teal": 5761, + "source": 1291, "pc": [ 5624 ] }, { - "teal": 5758, - "source": 1285, + "teal": 5762, + "source": 1291, "pc": [ 5625, 5626, @@ -27397,39 +27412,39 @@ ] }, { - "teal": 5761, - "source": 1284, + "teal": 5765, + "source": 1290, "errorMessage": "specified asset must be created by creator that is one of the linked addresses in an nfd", "pc": [ 5628 ] }, { - "teal": 5767, - "source": 1289, + "teal": 5771, + "source": 1295, "pc": [ 5629, 5630 ] }, { - "teal": 5768, - "source": 1289, + "teal": 5772, + "source": 1295, "pc": [ 5631, 5632 ] }, { - "teal": 5769, - "source": 1289, + "teal": 5773, + "source": 1295, "pc": [ 5633 ] }, { - "teal": 5770, - "source": 1289, + "teal": 5774, + "source": 1295, "pc": [ 5634, 5635, @@ -27437,32 +27452,32 @@ ] }, { - "teal": 5775, - "source": 1291, + "teal": 5779, + "source": 1297, "pc": [ 5637, 5638 ] }, { - "teal": 5776, - "source": 1291, + "teal": 5780, + "source": 1297, "pc": [ 5639, 5640 ] }, { - "teal": 5780, - "source": 1292, + "teal": 5784, + "source": 1298, "pc": [ 5641, 5642 ] }, { - "teal": 5781, - "source": 1292, + "teal": 5785, + "source": 1298, "pc": [ 5643, 5644, @@ -27470,69 +27485,69 @@ ] }, { - "teal": 5784, - "source": 1292, + "teal": 5788, + "source": 1298, "errorMessage": "provided NFD must be valid", "pc": [ 5646 ] }, { - "teal": 5792, - "source": 1296, + "teal": 5796, + "source": 1302, "pc": [ 5647, 5648 ] }, { - "teal": 5793, - "source": 1296, + "teal": 5797, + "source": 1302, "pc": [ 5649, 5650 ] }, { - "teal": 5794, - "source": 1296, + "teal": 5798, + "source": 1302, "pc": [ 5651 ] }, { - "teal": 5797, - "source": 1296, + "teal": 5801, + "source": 1302, "errorMessage": "global state value does not exist: AppID.fromUint64(userOfferedNFDAppID).globalState('i.owner.a')", "pc": [ 5652 ] }, { - "teal": 5798, - "source": 1297, + "teal": 5802, + "source": 1303, "pc": [ 5653, 5654 ] }, { - "teal": 5799, - "source": 1296, + "teal": 5803, + "source": 1302, "pc": [ 5655 ] }, { - "teal": 5800, - "source": 1297, + "teal": 5804, + "source": 1303, "pc": [ 5656 ] }, { - "teal": 5801, - "source": 1297, + "teal": 5805, + "source": 1303, "pc": [ 5657, 5658, @@ -27540,24 +27555,24 @@ ] }, { - "teal": 5802, - "source": 1297, + "teal": 5806, + "source": 1303, "pc": [ 5660, 5661 ] }, { - "teal": 5803, - "source": 1297, + "teal": 5807, + "source": 1303, "pc": [ 5662, 5663 ] }, { - "teal": 5804, - "source": 1297, + "teal": 5808, + "source": 1303, "pc": [ 5664, 5665, @@ -27565,31 +27580,31 @@ ] }, { - "teal": 5805, - "source": 1297, + "teal": 5809, + "source": 1303, "pc": [ 5667 ] }, { - "teal": 5809, - "source": 1295, + "teal": 5813, + "source": 1301, "errorMessage": "provided nfd for entry isn't owned or linked to the staker", "pc": [ 5668 ] }, { - "teal": 5817, - "source": 1303, + "teal": 5821, + "source": 1309, "pc": [ 5669, 5670 ] }, { - "teal": 5818, - "source": 1303, + "teal": 5822, + "source": 1309, "pc": [ 5671, 5672, @@ -27609,38 +27624,38 @@ ] }, { - "teal": 5819, - "source": 1303, + "teal": 5823, + "source": 1309, "pc": [ 5686 ] }, { - "teal": 5822, - "source": 1303, + "teal": 5826, + "source": 1309, "errorMessage": "global state value does not exist: AppID.fromUint64(userOfferedNFDAppID).globalState('i.parentAppID')", "pc": [ 5687 ] }, { - "teal": 5823, - "source": 1303, + "teal": 5827, + "source": 1309, "pc": [ 5688 ] }, { - "teal": 5824, - "source": 1304, + "teal": 5828, + "source": 1310, "pc": [ 5689, 5690 ] }, { - "teal": 5825, - "source": 1304, + "teal": 5829, + "source": 1310, "pc": [ 5691, 5692, @@ -27648,37 +27663,37 @@ ] }, { - "teal": 5826, - "source": 1304, + "teal": 5830, + "source": 1310, "pc": [ 5694 ] }, { - "teal": 5827, - "source": 1303, + "teal": 5831, + "source": 1309, "pc": [ 5695 ] }, { - "teal": 5830, - "source": 1302, + "teal": 5834, + "source": 1308, "errorMessage": "specified nfd must be a segment of the nfd the validator specified as a requirement", "pc": [ 5696 ] }, { - "teal": 5833, - "source": 1241, + "teal": 5837, + "source": 1247, "pc": [ 5697 ] }, { - "teal": 5845, - "source": 1319, + "teal": 5849, + "source": 1325, "pc": [ 5698, 5699, @@ -27686,23 +27701,23 @@ ] }, { - "teal": 5848, - "source": 1319, + "teal": 5852, + "source": 1325, "pc": [ 5701 ] }, { - "teal": 5852, - "source": 1321, + "teal": 5856, + "source": 1327, "pc": [ 5702, 5703 ] }, { - "teal": 5853, - "source": 1321, + "teal": 5857, + "source": 1327, "pc": [ 5704, 5705, @@ -27715,54 +27730,54 @@ ] }, { - "teal": 5854, - "source": 1321, + "teal": 5858, + "source": 1327, "pc": [ 5712 ] }, { - "teal": 5857, - "source": 1321, + "teal": 5861, + "source": 1327, "errorMessage": "global state value does not exist: AppID.fromUint64(nfdAppID).globalState('i.name')", "pc": [ 5713 ] }, { - "teal": 5858, - "source": 1321, + "teal": 5862, + "source": 1327, "pc": [ 5714, 5715 ] }, { - "teal": 5866, - "source": 1323, + "teal": 5870, + "source": 1329, "pc": [ 5716 ] }, { - "teal": 5867, - "source": 1323, + "teal": 5871, + "source": 1329, "pc": [ 5717, 5718 ] }, { - "teal": 5868, - "source": 1323, + "teal": 5872, + "source": 1329, "pc": [ 5719, 5720 ] }, { - "teal": 5869, - "source": 1325, + "teal": 5873, + "source": 1331, "pc": [ 5721, 5722, @@ -27773,61 +27788,61 @@ ] }, { - "teal": 5870, - "source": 1325, + "teal": 5874, + "source": 1331, "pc": [ 5727, 5728 ] }, { - "teal": 5874, - "source": 1324, + "teal": 5878, + "source": 1330, "pc": [ 5729, 5730 ] }, { - "teal": 5875, - "source": 1324, + "teal": 5879, + "source": 1330, "pc": [ 5731, 5732 ] }, { - "teal": 5879, - "source": 1326, + "teal": 5883, + "source": 1332, "pc": [ 5733, 5734 ] }, { - "teal": 5880, - "source": 1326, + "teal": 5884, + "source": 1332, "pc": [ 5735 ] }, { - "teal": 5881, - "source": 1326, + "teal": 5885, + "source": 1332, "pc": [ 5736 ] }, { - "teal": 5882, - "source": 1326, + "teal": 5886, + "source": 1332, "pc": [ 5737 ] }, { - "teal": 5883, - "source": 1326, + "teal": 5887, + "source": 1332, "pc": [ 5738, 5739, @@ -27835,105 +27850,105 @@ ] }, { - "teal": 5884, - "source": 1326, + "teal": 5888, + "source": 1332, "pc": [ 5741 ] }, { - "teal": 5885, - "source": 1326, + "teal": 5889, + "source": 1332, "pc": [ 5742 ] }, { - "teal": 5886, - "source": 1326, + "teal": 5890, + "source": 1332, "pc": [ 5743, 5744 ] }, { - "teal": 5887, - "source": 1326, + "teal": 5891, + "source": 1332, "pc": [ 5745, 5746 ] }, { - "teal": 5888, - "source": 1326, + "teal": 5892, + "source": 1332, "pc": [ 5747 ] }, { - "teal": 5889, - "source": 1326, + "teal": 5893, + "source": 1332, "pc": [ 5748, 5749 ] }, { - "teal": 5892, - "source": 1323, + "teal": 5896, + "source": 1329, "pc": [ 5750 ] }, { - "teal": 5893, - "source": 1323, + "teal": 5897, + "source": 1329, "pc": [ 5751, 5752 ] }, { - "teal": 5896, - "source": 1323, + "teal": 5900, + "source": 1329, "pc": [ 5753 ] }, { - "teal": 5897, - "source": 1323, + "teal": 5901, + "source": 1329, "pc": [ 5754, 5755 ] }, { - "teal": 5898, - "source": 1323, + "teal": 5902, + "source": 1329, "pc": [ 5756 ] }, { - "teal": 5899, - "source": 1323, + "teal": 5903, + "source": 1329, "pc": [ 5757 ] }, { - "teal": 5900, - "source": 1323, + "teal": 5904, + "source": 1329, "pc": [ 5758, 5759 ] }, { - "teal": 5901, - "source": 1323, + "teal": 5905, + "source": 1329, "pc": [ 5760, 5761, @@ -27941,37 +27956,37 @@ ] }, { - "teal": 5902, - "source": 1323, + "teal": 5906, + "source": 1329, "pc": [ 5763 ] }, { - "teal": 5903, - "source": 1323, + "teal": 5907, + "source": 1329, "pc": [ 5764 ] }, { - "teal": 5906, - "source": 1319, + "teal": 5910, + "source": 1325, "pc": [ 5765, 5766 ] }, { - "teal": 5907, - "source": 1319, + "teal": 5911, + "source": 1325, "pc": [ 5767 ] }, { - "teal": 5918, - "source": 1338, + "teal": 5922, + "source": 1344, "pc": [ 5768, 5769, @@ -27979,62 +27994,62 @@ ] }, { - "teal": 5921, - "source": 1338, + "teal": 5925, + "source": 1344, "pc": [ 5771 ] }, { - "teal": 5922, - "source": 1338, + "teal": 5926, + "source": 1344, "pc": [ 5772, 5773 ] }, { - "teal": 5929, - "source": 1339, + "teal": 5933, + "source": 1345, "pc": [ 5774 ] }, { - "teal": 5930, - "source": 1339, + "teal": 5934, + "source": 1345, "pc": [ 5775, 5776 ] }, { - "teal": 5931, - "source": 1339, + "teal": 5935, + "source": 1345, "pc": [ 5777, 5778 ] }, { - "teal": 5935, - "source": 1340, + "teal": 5939, + "source": 1346, "pc": [ 5779, 5780 ] }, { - "teal": 5936, - "source": 1340, + "teal": 5940, + "source": 1346, "pc": [ 5781, 5782 ] }, { - "teal": 5940, - "source": 1341, + "teal": 5944, + "source": 1347, "pc": [ 5783, 5784, @@ -28054,16 +28069,16 @@ ] }, { - "teal": 5941, - "source": 1341, + "teal": 5945, + "source": 1347, "pc": [ 5798, 5799 ] }, { - "teal": 5942, - "source": 1341, + "teal": 5946, + "source": 1347, "pc": [ 5800, 5801, @@ -28083,99 +28098,99 @@ ] }, { - "teal": 5943, - "source": 1341, + "teal": 5947, + "source": 1347, "pc": [ 5815, 5816 ] }, { - "teal": 5946, - "source": 1339, + "teal": 5950, + "source": 1345, "pc": [ 5817 ] }, { - "teal": 5947, - "source": 1339, + "teal": 5951, + "source": 1345, "pc": [ 5818, 5819 ] }, { - "teal": 5950, - "source": 1339, + "teal": 5954, + "source": 1345, "pc": [ 5820 ] }, { - "teal": 5954, - "source": 1343, + "teal": 5958, + "source": 1349, "pc": [ 5821, 5822 ] }, { - "teal": 5955, - "source": 1343, + "teal": 5959, + "source": 1349, "pc": [ 5823, 5824 ] }, { - "teal": 5959, - "source": 1344, + "teal": 5963, + "source": 1350, "pc": [ 5825 ] }, { - "teal": 5960, - "source": 1344, + "teal": 5964, + "source": 1350, "pc": [ 5826, 5827 ] }, { - "teal": 5965, - "source": 1344, + "teal": 5969, + "source": 1350, "pc": [ 5828, 5829 ] }, { - "teal": 5966, - "source": 1344, + "teal": 5970, + "source": 1350, "pc": [ 5830, 5831 ] }, { - "teal": 5967, - "source": 1344, + "teal": 5971, + "source": 1350, "pc": [ 5832 ] }, { - "teal": 5968, - "source": 1344, + "teal": 5972, + "source": 1350, "pc": [ 5833 ] }, { - "teal": 5969, - "source": 1344, + "teal": 5973, + "source": 1350, "pc": [ 5834, 5835, @@ -28183,116 +28198,116 @@ ] }, { - "teal": 5973, - "source": 1345, + "teal": 5977, + "source": 1351, "pc": [ 5837, 5838 ] }, { - "teal": 5974, - "source": 1345, + "teal": 5978, + "source": 1351, "pc": [ 5839, 5840 ] }, { - "teal": 5975, - "source": 1345, + "teal": 5979, + "source": 1351, "pc": [ 5841, 5842 ] }, { - "teal": 5976, - "source": 1345, + "teal": 5980, + "source": 1351, "pc": [ 5843 ] }, { - "teal": 5977, - "source": 1345, + "teal": 5981, + "source": 1351, "pc": [ 5844, 5845 ] }, { - "teal": 5982, - "source": 1346, + "teal": 5986, + "source": 1352, "pc": [ 5846, 5847 ] }, { - "teal": 5983, - "source": 1346, + "teal": 5987, + "source": 1352, "pc": [ 5848, 5849 ] }, { - "teal": 5984, - "source": 1346, + "teal": 5988, + "source": 1352, "pc": [ 5850 ] }, { - "teal": 5985, - "source": 1346, + "teal": 5989, + "source": 1352, "pc": [ 5851 ] }, { - "teal": 5986, - "source": 1346, + "teal": 5990, + "source": 1352, "pc": [ 5852, 5853, 5854 ] }, - { - "teal": 5987, - "source": 1346, + { + "teal": 5991, + "source": 1352, "pc": [ 5855, 5856 ] }, { - "teal": 5988, - "source": 1346, + "teal": 5992, + "source": 1352, "pc": [ 5857, 5858 ] }, { - "teal": 5989, - "source": 1346, + "teal": 5993, + "source": 1352, "pc": [ 5859 ] }, { - "teal": 5990, - "source": 1346, + "teal": 5994, + "source": 1352, "pc": [ 5860 ] }, { - "teal": 5993, - "source": 1346, + "teal": 5997, + "source": 1352, "pc": [ 5861, 5862, @@ -28300,15 +28315,15 @@ ] }, { - "teal": 5998, - "source": 1347, + "teal": 6002, + "source": 1353, "pc": [ 5864 ] }, { - "teal": 5999, - "source": 1347, + "teal": 6003, + "source": 1353, "pc": [ 5865, 5866, @@ -28316,39 +28331,39 @@ ] }, { - "teal": 6006, - "source": 1344, + "teal": 6010, + "source": 1350, "pc": [ 5868, 5869 ] }, { - "teal": 6007, - "source": 1344, + "teal": 6011, + "source": 1350, "pc": [ 5870, 5871 ] }, { - "teal": 6008, - "source": 1344, + "teal": 6012, + "source": 1350, "pc": [ 5872 ] }, { - "teal": 6009, - "source": 1344, + "teal": 6013, + "source": 1350, "pc": [ 5873, 5874 ] }, { - "teal": 6010, - "source": 1344, + "teal": 6014, + "source": 1350, "pc": [ 5875, 5876, @@ -28356,38 +28371,38 @@ ] }, { - "teal": 6015, - "source": 1350, + "teal": 6019, + "source": 1356, "pc": [ 5878 ] }, { - "teal": 6019, - "source": 1338, + "teal": 6023, + "source": 1344, "pc": [ 5879, 5880 ] }, { - "teal": 6022, - "source": 1338, + "teal": 6026, + "source": 1344, "pc": [ 5881, 5882 ] }, { - "teal": 6023, - "source": 1338, + "teal": 6027, + "source": 1344, "pc": [ 5883 ] }, { - "teal": 6031, - "source": 1358, + "teal": 6035, + "source": 1364, "pc": [ 5884, 5885, @@ -28395,15 +28410,15 @@ ] }, { - "teal": 6034, - "source": 1358, + "teal": 6038, + "source": 1364, "pc": [ 5887 ] }, { - "teal": 6038, - "source": 1359, + "teal": 6042, + "source": 1365, "pc": [ 5888, 5889, @@ -28411,112 +28426,112 @@ ] }, { - "teal": 6039, - "source": 1359, + "teal": 6043, + "source": 1365, "pc": [ 5891, 5892 ] }, { - "teal": 6043, - "source": 1361, + "teal": 6047, + "source": 1367, "pc": [ 5893, 5894 ] }, { - "teal": 6044, - "source": 1361, + "teal": 6048, + "source": 1367, "pc": [ 5895, 5896 ] }, { - "teal": 6045, - "source": 1361, + "teal": 6049, + "source": 1367, "pc": [ 5897 ] }, { - "teal": 6046, - "source": 1361, + "teal": 6050, + "source": 1367, "pc": [ 5898 ] }, { - "teal": 6047, - "source": 1361, + "teal": 6051, + "source": 1367, "pc": [ 5899, 5900 ] }, { - "teal": 6048, - "source": 1361, + "teal": 6052, + "source": 1367, "pc": [ 5901 ] }, { - "teal": 6049, - "source": 1361, + "teal": 6053, + "source": 1367, "pc": [ 5902 ] }, { - "teal": 6050, - "source": 1361, + "teal": 6054, + "source": 1367, "pc": [ 5903 ] }, { - "teal": 6051, - "source": 1361, + "teal": 6055, + "source": 1367, "pc": [ 5904 ] }, { - "teal": 6052, - "source": 1361, + "teal": 6056, + "source": 1367, "pc": [ 5905 ] }, { - "teal": 6055, - "source": 1361, + "teal": 6059, + "source": 1367, "errorMessage": "wideRatio failed", "pc": [ 5906 ] }, { - "teal": 6058, - "source": 1358, + "teal": 6062, + "source": 1364, "pc": [ 5907, 5908 ] }, { - "teal": 6059, - "source": 1358, + "teal": 6063, + "source": 1364, "pc": [ 5909 ] }, { - "teal": 6066, - "source": 1368, + "teal": 6070, + "source": 1374, "pc": [ 5910, 5911, @@ -28524,15 +28539,15 @@ ] }, { - "teal": 6069, - "source": 1368, + "teal": 6073, + "source": 1374, "pc": [ 5913 ] }, { - "teal": 6073, - "source": 1369, + "teal": 6077, + "source": 1375, "pc": [ 5914, 5915, @@ -28540,24 +28555,24 @@ ] }, { - "teal": 6074, - "source": 1369, + "teal": 6078, + "source": 1375, "pc": [ 5917, 5918 ] }, { - "teal": 6078, - "source": 1371, + "teal": 6082, + "source": 1377, "pc": [ 5919, 5920 ] }, { - "teal": 6079, - "source": 1371, + "teal": 6083, + "source": 1377, "pc": [ 5921, 5922, @@ -28565,88 +28580,88 @@ ] }, { - "teal": 6080, - "source": 1371, + "teal": 6084, + "source": 1377, "pc": [ 5924 ] }, { - "teal": 6081, - "source": 1371, + "teal": 6085, + "source": 1377, "pc": [ 5925 ] }, { - "teal": 6082, - "source": 1371, + "teal": 6086, + "source": 1377, "pc": [ 5926, 5927 ] }, { - "teal": 6083, - "source": 1371, + "teal": 6087, + "source": 1377, "pc": [ 5928 ] }, { - "teal": 6084, - "source": 1371, + "teal": 6088, + "source": 1377, "pc": [ 5929 ] }, { - "teal": 6085, - "source": 1371, + "teal": 6089, + "source": 1377, "pc": [ 5930 ] }, { - "teal": 6086, - "source": 1371, + "teal": 6090, + "source": 1377, "pc": [ 5931 ] }, { - "teal": 6087, - "source": 1371, + "teal": 6091, + "source": 1377, "pc": [ 5932 ] }, { - "teal": 6090, - "source": 1371, + "teal": 6094, + "source": 1377, "errorMessage": "wideRatio failed", "pc": [ 5933 ] }, { - "teal": 6093, - "source": 1368, + "teal": 6097, + "source": 1374, "pc": [ 5934, 5935 ] }, { - "teal": 6094, - "source": 1368, + "teal": 6098, + "source": 1374, "pc": [ 5936 ] }, { - "teal": 6100, - "source": 1377, + "teal": 6104, + "source": 1383, "pc": [ 5937, 5938, @@ -28654,23 +28669,23 @@ ] }, { - "teal": 6104, - "source": 1378, + "teal": 6108, + "source": 1384, "pc": [ 5940, 5941 ] }, { - "teal": 6105, - "source": 1377, + "teal": 6109, + "source": 1383, "pc": [ 5942 ] }, { - "teal": 6109, - "source": 1381, + "teal": 6113, + "source": 1387, "pc": [ 5943, 5944, @@ -28678,22 +28693,22 @@ ] }, { - "teal": 6113, - "source": 1382, + "teal": 6117, + "source": 1388, "pc": [ 5946 ] }, { - "teal": 6114, - "source": 1381, + "teal": 6118, + "source": 1387, "pc": [ 5947 ] }, { - "teal": 6118, - "source": 1385, + "teal": 6122, + "source": 1391, "pc": [ 5948, 5949, @@ -28701,376 +28716,376 @@ ] }, { - "teal": 6121, - "source": 1385, + "teal": 6125, + "source": 1391, "pc": [ 5951 ] }, { - "teal": 6125, - "source": 1394, + "teal": 6129, + "source": 1400, "pc": [ 5952, 5953 ] }, { - "teal": 6126, - "source": 1394, + "teal": 6130, + "source": 1400, "pc": [ 5954, 5955 ] }, { - "teal": 6130, - "source": 1395, + "teal": 6134, + "source": 1401, "pc": [ 5956, 5957 ] }, { - "teal": 6131, - "source": 1395, + "teal": 6135, + "source": 1401, "pc": [ 5958, 5959 ] }, { - "teal": 6132, - "source": 1395, + "teal": 6136, + "source": 1401, "pc": [ 5960, 5961 ] }, { - "teal": 6133, - "source": 1395, + "teal": 6137, + "source": 1401, "pc": [ 5962 ] }, { - "teal": 6134, - "source": 1395, + "teal": 6138, + "source": 1401, "pc": [ 5963 ] }, { - "teal": 6135, - "source": 1395, + "teal": 6139, + "source": 1401, "pc": [ 5964, 5965 ] }, { - "teal": 6139, - "source": 1396, + "teal": 6143, + "source": 1402, "pc": [ 5966, 5967 ] }, { - "teal": 6140, - "source": 1396, + "teal": 6144, + "source": 1402, "pc": [ 5968, 5969 ] }, { - "teal": 6141, - "source": 1396, + "teal": 6145, + "source": 1402, "pc": [ 5970, 5971 ] }, { - "teal": 6142, - "source": 1396, + "teal": 6146, + "source": 1402, "pc": [ 5972 ] }, { - "teal": 6143, - "source": 1396, + "teal": 6147, + "source": 1402, "pc": [ 5973 ] }, { - "teal": 6144, - "source": 1396, + "teal": 6148, + "source": 1402, "pc": [ 5974, 5975 ] }, { - "teal": 6148, - "source": 1397, + "teal": 6152, + "source": 1403, "pc": [ 5976, 5977 ] }, { - "teal": 6149, - "source": 1397, + "teal": 6153, + "source": 1403, "pc": [ 5978, 5979 ] }, { - "teal": 6150, - "source": 1397, + "teal": 6154, + "source": 1403, "pc": [ 5980, 5981 ] }, { - "teal": 6151, - "source": 1397, + "teal": 6155, + "source": 1403, "pc": [ 5982 ] }, { - "teal": 6152, - "source": 1397, + "teal": 6156, + "source": 1403, "pc": [ 5983 ] }, { - "teal": 6153, - "source": 1397, + "teal": 6157, + "source": 1403, "pc": [ 5984, 5985 ] }, { - "teal": 6157, - "source": 1398, + "teal": 6161, + "source": 1404, "pc": [ 5986, 5987 ] }, { - "teal": 6158, - "source": 1398, + "teal": 6162, + "source": 1404, "pc": [ 5988, 5989 ] }, { - "teal": 6159, - "source": 1398, + "teal": 6163, + "source": 1404, "pc": [ 5990, 5991 ] }, { - "teal": 6160, - "source": 1398, + "teal": 6164, + "source": 1404, "pc": [ 5992 ] }, { - "teal": 6161, - "source": 1398, + "teal": 6165, + "source": 1404, "pc": [ 5993 ] }, { - "teal": 6162, - "source": 1398, + "teal": 6166, + "source": 1404, "pc": [ 5994, 5995 ] }, { - "teal": 6166, - "source": 1399, + "teal": 6170, + "source": 1405, "pc": [ 5996, 5997 ] }, { - "teal": 6167, - "source": 1399, + "teal": 6171, + "source": 1405, "pc": [ 5998, 5999 ] }, { - "teal": 6168, - "source": 1399, + "teal": 6172, + "source": 1405, "pc": [ 6000, 6001 ] }, { - "teal": 6169, - "source": 1399, + "teal": 6173, + "source": 1405, "pc": [ 6002 ] }, { - "teal": 6170, - "source": 1399, + "teal": 6174, + "source": 1405, "pc": [ 6003 ] }, { - "teal": 6171, - "source": 1399, + "teal": 6175, + "source": 1405, "pc": [ 6004, 6005 ] }, { - "teal": 6175, - "source": 1400, + "teal": 6179, + "source": 1406, "pc": [ 6006, 6007 ] }, { - "teal": 6176, - "source": 1400, + "teal": 6180, + "source": 1406, "pc": [ 6008, 6009 ] }, { - "teal": 6177, - "source": 1400, + "teal": 6181, + "source": 1406, "pc": [ 6010, 6011 ] }, { - "teal": 6178, - "source": 1400, + "teal": 6182, + "source": 1406, "pc": [ 6012 ] }, { - "teal": 6179, - "source": 1400, + "teal": 6183, + "source": 1406, "pc": [ 6013 ] }, { - "teal": 6180, - "source": 1400, + "teal": 6184, + "source": 1406, "pc": [ 6014, 6015 ] }, { - "teal": 6184, - "source": 1401, + "teal": 6188, + "source": 1407, "pc": [ 6016, 6017 ] }, { - "teal": 6185, - "source": 1401, + "teal": 6189, + "source": 1407, "pc": [ 6018, 6019 ] }, { - "teal": 6186, - "source": 1401, + "teal": 6190, + "source": 1407, "pc": [ 6020, 6021 ] }, { - "teal": 6187, - "source": 1401, + "teal": 6191, + "source": 1407, "pc": [ 6022 ] }, { - "teal": 6188, - "source": 1401, + "teal": 6192, + "source": 1407, "pc": [ 6023 ] }, { - "teal": 6189, - "source": 1401, + "teal": 6193, + "source": 1407, "pc": [ 6024, 6025 ] }, { - "teal": 6193, - "source": 1402, + "teal": 6197, + "source": 1408, "pc": [ 6026, 6027 ] }, { - "teal": 6196, - "source": 1385, + "teal": 6200, + "source": 1391, "pc": [ 6028, 6029 ] }, { - "teal": 6197, - "source": 1385, + "teal": 6201, + "source": 1391, "pc": [ 6030 ] }, { - "teal": 6201, - "source": 1405, + "teal": 6205, + "source": 1411, "pc": [ 6031, 6032, @@ -29078,8 +29093,8 @@ ] }, { - "teal": 6205, - "source": 1409, + "teal": 6209, + "source": 1415, "pc": [ 6034, 6035, @@ -29087,16 +29102,16 @@ ] }, { - "teal": 6206, - "source": 1409, + "teal": 6210, + "source": 1415, "pc": [ 6037, 6038 ] }, { - "teal": 6207, - "source": 1409, + "teal": 6211, + "source": 1415, "pc": [ 6039, 6040, @@ -29104,28 +29119,28 @@ ] }, { - "teal": 6208, - "source": 1409, + "teal": 6212, + "source": 1415, "pc": [ 6042 ] }, { - "teal": 6209, - "source": 1409, + "teal": 6213, + "source": 1415, "pc": [ 6043 ] }, { - "teal": 6210, - "source": 1405, + "teal": 6214, + "source": 1411, "pc": [ 6044 ] }, { - "teal": 6213, + "teal": 6217, "source": 50, "pc": [ 6045, @@ -29137,7 +29152,7 @@ ] }, { - "teal": 6214, + "teal": 6218, "source": 50, "pc": [ 6051, @@ -29146,7 +29161,7 @@ ] }, { - "teal": 6215, + "teal": 6219, "source": 50, "pc": [ 6054, @@ -29156,7 +29171,7 @@ ] }, { - "teal": 6218, + "teal": 6222, "source": 50, "errorMessage": "this contract does not implement the given ABI method for create NoOp", "pc": [ @@ -29164,7 +29179,7 @@ ] }, { - "teal": 6221, + "teal": 6225, "source": 50, "pc": [ 6059, @@ -29176,7 +29191,7 @@ ] }, { - "teal": 6222, + "teal": 6226, "source": 50, "pc": [ 6065, @@ -29188,7 +29203,7 @@ ] }, { - "teal": 6223, + "teal": 6227, "source": 50, "pc": [ 6071, @@ -29200,7 +29215,7 @@ ] }, { - "teal": 6224, + "teal": 6228, "source": 50, "pc": [ 6077, @@ -29212,7 +29227,7 @@ ] }, { - "teal": 6225, + "teal": 6229, "source": 50, "pc": [ 6083, @@ -29224,7 +29239,7 @@ ] }, { - "teal": 6226, + "teal": 6230, "source": 50, "pc": [ 6089, @@ -29236,7 +29251,7 @@ ] }, { - "teal": 6227, + "teal": 6231, "source": 50, "pc": [ 6095, @@ -29248,7 +29263,7 @@ ] }, { - "teal": 6228, + "teal": 6232, "source": 50, "pc": [ 6101, @@ -29260,7 +29275,7 @@ ] }, { - "teal": 6229, + "teal": 6233, "source": 50, "pc": [ 6107, @@ -29272,7 +29287,7 @@ ] }, { - "teal": 6230, + "teal": 6234, "source": 50, "pc": [ 6113, @@ -29284,7 +29299,7 @@ ] }, { - "teal": 6231, + "teal": 6235, "source": 50, "pc": [ 6119, @@ -29296,7 +29311,7 @@ ] }, { - "teal": 6232, + "teal": 6236, "source": 50, "pc": [ 6125, @@ -29308,7 +29323,7 @@ ] }, { - "teal": 6233, + "teal": 6237, "source": 50, "pc": [ 6131, @@ -29320,7 +29335,7 @@ ] }, { - "teal": 6234, + "teal": 6238, "source": 50, "pc": [ 6137, @@ -29332,7 +29347,7 @@ ] }, { - "teal": 6235, + "teal": 6239, "source": 50, "pc": [ 6143, @@ -29344,7 +29359,7 @@ ] }, { - "teal": 6236, + "teal": 6240, "source": 50, "pc": [ 6149, @@ -29356,7 +29371,7 @@ ] }, { - "teal": 6237, + "teal": 6241, "source": 50, "pc": [ 6155, @@ -29368,7 +29383,7 @@ ] }, { - "teal": 6238, + "teal": 6242, "source": 50, "pc": [ 6161, @@ -29380,7 +29395,7 @@ ] }, { - "teal": 6239, + "teal": 6243, "source": 50, "pc": [ 6167, @@ -29392,7 +29407,7 @@ ] }, { - "teal": 6240, + "teal": 6244, "source": 50, "pc": [ 6173, @@ -29404,7 +29419,7 @@ ] }, { - "teal": 6241, + "teal": 6245, "source": 50, "pc": [ 6179, @@ -29416,7 +29431,7 @@ ] }, { - "teal": 6242, + "teal": 6246, "source": 50, "pc": [ 6185, @@ -29428,7 +29443,7 @@ ] }, { - "teal": 6243, + "teal": 6247, "source": 50, "pc": [ 6191, @@ -29440,7 +29455,7 @@ ] }, { - "teal": 6244, + "teal": 6248, "source": 50, "pc": [ 6197, @@ -29452,7 +29467,7 @@ ] }, { - "teal": 6245, + "teal": 6249, "source": 50, "pc": [ 6203, @@ -29464,7 +29479,7 @@ ] }, { - "teal": 6246, + "teal": 6250, "source": 50, "pc": [ 6209, @@ -29476,7 +29491,7 @@ ] }, { - "teal": 6247, + "teal": 6251, "source": 50, "pc": [ 6215, @@ -29488,7 +29503,7 @@ ] }, { - "teal": 6248, + "teal": 6252, "source": 50, "pc": [ 6221, @@ -29500,7 +29515,7 @@ ] }, { - "teal": 6249, + "teal": 6253, "source": 50, "pc": [ 6227, @@ -29512,7 +29527,7 @@ ] }, { - "teal": 6250, + "teal": 6254, "source": 50, "pc": [ 6233, @@ -29524,7 +29539,7 @@ ] }, { - "teal": 6251, + "teal": 6255, "source": 50, "pc": [ 6239, @@ -29536,7 +29551,7 @@ ] }, { - "teal": 6252, + "teal": 6256, "source": 50, "pc": [ 6245, @@ -29548,7 +29563,7 @@ ] }, { - "teal": 6253, + "teal": 6257, "source": 50, "pc": [ 6251, @@ -29560,7 +29575,7 @@ ] }, { - "teal": 6254, + "teal": 6258, "source": 50, "pc": [ 6257, @@ -29569,7 +29584,7 @@ ] }, { - "teal": 6255, + "teal": 6259, "source": 50, "pc": [ 6260, @@ -29643,7 +29658,7 @@ ] }, { - "teal": 6258, + "teal": 6262, "source": 50, "errorMessage": "this contract does not implement the given ABI method for call NoOp", "pc": [ @@ -29654,7 +29669,7 @@ "clear": [] }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCgovLyBUaGlzIFRFQUwgd2FzIGdlbmVyYXRlZCBieSBURUFMU2NyaXB0IHYwLjEwMy4wCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbGdvcmFuZGZvdW5kYXRpb24vVEVBTFNjcmlwdAoKLy8gVGhpcyBjb250cmFjdCBpcyBjb21wbGlhbnQgd2l0aCBhbmQvb3IgaW1wbGVtZW50cyB0aGUgZm9sbG93aW5nIEFSQ3M6IFsgQVJDNCBdCgovLyBUaGUgZm9sbG93aW5nIGxpbmVzIG9mIFRFQUwgYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0ZW1wbGF0ZSB2YXJpYWJsZXMgaW4gc2NyYXRjaCBzbG90cwpwdXNoYnl0ZXMgVE1QTF9uZmRSZWdpc3RyeUFwcElkCmJ0b2kKc3RvcmUgMjAwCgovLyBUaGUgZm9sbG93aW5nIHRlbiBsaW5lcyBvZiBURUFMIGhhbmRsZSBpbml0aWFsIHByb2dyYW0gZmxvdwovLyBUaGlzIHBhdHRlcm4gaXMgdXNlZCB0byBtYWtlIGl0IGVhc3kgZm9yIGFueW9uZSB0byBwYXJzZSB0aGUgc3RhcnQgb2YgdGhlIHByb2dyYW0gYW5kIGRldGVybWluZSBpZiBhIHNwZWNpZmljIGFjdGlvbiBpcyBhbGxvd2VkCi8vIEhlcmUsIGFjdGlvbiByZWZlcnMgdG8gdGhlIE9uQ29tcGxldGUgaW4gY29tYmluYXRpb24gd2l0aCB3aGV0aGVyIHRoZSBhcHAgaXMgYmVpbmcgY3JlYXRlZCBvciBjYWxsZWQKLy8gRXZlcnkgcG9zc2libGUgYWN0aW9uIGZvciB0aGlzIGNvbnRyYWN0IGlzIHJlcHJlc2VudGVkIGluIHRoZSBzd2l0Y2ggc3RhdGVtZW50Ci8vIElmIHRoZSBhY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIGluIHRoZSBjb250cmFjdCwgaXRzIHJlc3BlY3RpdmUgYnJhbmNoIHdpbGwgYmUgIipOT1RfSU1QTEVNRU5URUQiIHdoaWNoIGp1c3QgY29udGFpbnMgImVyciIKdHhuIEFwcGxpY2F0aW9uSUQKIQppbnQgNgoqCnR4biBPbkNvbXBsZXRpb24KKwpzd2l0Y2ggKmNhbGxfTm9PcCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKmNyZWF0ZV9Ob09wICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRAoKKk5PVF9JTVBMRU1FTlRFRDoKCS8vIFRoZSByZXF1ZXN0ZWQgYWN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIGNvbnRyYWN0LiBBcmUgeW91IHVzaW5nIHRoZSBjb3JyZWN0IE9uQ29tcGxldGU/IERpZCB5b3Ugc2V0IHlvdXIgYXBwIElEPwoJZXJyCgovLyBjcmVhdGVBcHBsaWNhdGlvbigpdm9pZAoqYWJpX3JvdXRlX2NyZWF0ZUFwcGxpY2F0aW9uOgoJLy8gZXhlY3V0ZSBjcmVhdGVBcHBsaWNhdGlvbigpdm9pZAoJY2FsbHN1YiBjcmVhdGVBcHBsaWNhdGlvbgoJaW50IDEKCXJldHVybgoKLy8gY3JlYXRlQXBwbGljYXRpb24oKTogdm9pZApjcmVhdGVBcHBsaWNhdGlvbjoKCXByb3RvIDAgMAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyCgkvLyB0aGlzLnN0YWtpbmdQb29sSW5pdGlhbGl6ZWQudmFsdWUgPSBmYWxzZQoJYnl0ZSAweDY5NmU2OTc0IC8vICJpbml0IgoJaW50IDAKCWJ5dGUgMHgwMAoJaW50IDAKCXVuY292ZXIgMgoJc2V0Yml0CglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgzCgkvLyB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgPSAwCglieXRlIDB4NmU3NTZkNTYgLy8gIm51bVYiCglpbnQgMAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NAoJLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlID0gMAoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJaW50IDAKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODUKCS8vIHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlID0gMAoJYnl0ZSAweDczNzQ2MTZiNjU2NCAvLyAic3Rha2VkIgoJaW50IDAKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIGluaXRTdGFraW5nQ29udHJhY3QodWludDY0KXZvaWQKKmFiaV9yb3V0ZV9pbml0U3Rha2luZ0NvbnRyYWN0OgoJLy8gYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBpbml0U3Rha2luZ0NvbnRyYWN0KHVpbnQ2NCl2b2lkCgljYWxsc3ViIGluaXRTdGFraW5nQ29udHJhY3QKCWludCAxCglyZXR1cm4KCi8vIGluaXRTdGFraW5nQ29udHJhY3QoYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0KTogdm9pZAppbml0U3Rha2luZ0NvbnRyYWN0OgoJcHJvdG8gMSAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTAKCS8vIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uY3JlYXRlKGFwcHJvdmFsUHJvZ3JhbVNpemUpCglieXRlIDB4NzA2ZjZmNmM1NDY1NmQ3MDZjNjE3NDY1NDE3MDcwNzI2Zjc2NjE2YzQyNzk3NDY1NzMgLy8gInBvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMiCglmcmFtZV9kaWcgLTEgLy8gYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0Cglib3hfY3JlYXRlCglwb3AKCXJldHN1YgoKLy8gbG9hZFN0YWtpbmdDb250cmFjdERhdGEodWludDY0LGJ5dGVbXSl2b2lkCiphYmlfcm91dGVfbG9hZFN0YWtpbmdDb250cmFjdERhdGE6CgkvLyBkYXRhOiBieXRlW10KCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWV4dHJhY3QgMiAwCgoJLy8gb2Zmc2V0OiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGxvYWRTdGFraW5nQ29udHJhY3REYXRhKHVpbnQ2NCxieXRlW10pdm9pZAoJY2FsbHN1YiBsb2FkU3Rha2luZ0NvbnRyYWN0RGF0YQoJaW50IDEKCXJldHVybgoKLy8gbG9hZFN0YWtpbmdDb250cmFjdERhdGEob2Zmc2V0OiB1aW50NjQsIGRhdGE6IGJ5dGVzKTogdm9pZApsb2FkU3Rha2luZ0NvbnRyYWN0RGF0YToKCXByb3RvIDIgMAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk0CgkvLyBhc3NlcnQoIXRoaXMuc3Rha2luZ1Bvb2xJbml0aWFsaXplZC52YWx1ZSkKCWJ5dGUgMHg2OTZlNjk3NCAvLyAiaW5pdCIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMAoJZ2V0Yml0CgkhCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5NQoJLy8gdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5yZXBsYWNlKG9mZnNldCwgZGF0YSkKCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWZyYW1lX2RpZyAtMSAvLyBvZmZzZXQ6IHVpbnQ2NAoJZnJhbWVfZGlnIC0yIC8vIGRhdGE6IGJ5dGVzCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdCgpdm9pZAoqYWJpX3JvdXRlX2ZpbmFsaXplU3Rha2luZ0NvbnRyYWN0OgoJLy8gZXhlY3V0ZSBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdCgpdm9pZAoJY2FsbHN1YiBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdAoJaW50IDEKCXJldHVybgoKLy8gZmluYWxpemVTdGFraW5nQ29udHJhY3QoKTogdm9pZApmaW5hbGl6ZVN0YWtpbmdDb250cmFjdDoKCXByb3RvIDAgMAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk5CgkvLyB0aGlzLnN0YWtpbmdQb29sSW5pdGlhbGl6ZWQudmFsdWUgPSB0cnVlCglieXRlIDB4Njk2ZTY5NzQgLy8gImluaXQiCglpbnQgMQoJYnl0ZSAweDAwCglpbnQgMAoJdW5jb3ZlciAyCglzZXRiaXQKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIGdhcygpdm9pZAoqYWJpX3JvdXRlX2dhczoKCS8vIGV4ZWN1dGUgZ2FzKCl2b2lkCgljYWxsc3ViIGdhcwoJaW50IDEKCXJldHVybgoKLy8gZ2FzKCk6IHZvaWQKLy8KLy8gZ2FzIGlzIGEgZHVtbXkgbm8tb3AgY2FsbCB0aGF0IGNhbiBiZSB1c2VkIHRvIHBvb2wtdXAgcmVzb3VyY2UgcmVmZXJlbmNlcyBhbmQgb3Bjb2RlIGNvc3QKZ2FzOgoJcHJvdG8gMCAwCglyZXRzdWIKCi8vIGdldE1ickFtb3VudHMoKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0TWJyQW1vdW50czoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXRNYnJBbW91bnRzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0TWJyQW1vdW50cygpOiBNYnJBbW91bnRzCi8vCi8vIFJldHVybnMgdGhlIE1CUiBhbW91bnRzIG5lZWRlZCBmb3IgdmFyaW91cyBhY3Rpb25zOgovLyBbCi8vIGFkZFZhbGlkYXRvck1icjogdWludDY0IC0gbWJyIG5lZWRlZCB0byBhZGQgYSBuZXcgdmFsaWRhdG9yIC0gcGFpZCB0byB2YWxpZGF0b3IgY29udHJhY3QKLy8gYWRkUG9vbE1icjogdWludDY0IC0gbWJyIG5lZWRlZCB0byBhZGQgYSBuZXcgcG9vbCAtIHBhaWQgdG8gdmFsaWRhdG9yCi8vIHBvb2xJbml0TWJyOiB1aW50NjQgLSBtYnIgbmVlZGVkIHRvIGluaXRTdG9yYWdlKCkgb2YgcG9vbCAtIHBhaWQgdG8gcG9vbCBpdHNlbGYKLy8gYWRkU3Rha2VyTWJyOiB1aW50NjQgLSBtYnIgc3Rha2VyIG5lZWRzIHRvIGFkZCB0byBmaXJzdCBzdGFraW5nIHBheW1lbnQgKHN0YXlzIHcvIHZhbGlkYXRvcikKLy8gXQpnZXRNYnJBbW91bnRzOgoJcHJvdG8gMCAxCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5CgkvLyByZXR1cm4gewoJLy8gICAgICAgICAgICAgYWRkVmFsaWRhdG9yTWJyOiB0aGlzLmNvc3RGb3JCb3hTdG9yYWdlKDEgLyogdiBwcmVmaXggKi8gKyBsZW48VmFsaWRhdG9ySWRUeXBlPigpICsgbGVuPFZhbGlkYXRvckluZm8+KCkpLAoJLy8gICAgICAgICAgICAgYWRkUG9vbE1icjogdGhpcy5taW5CYWxhbmNlRm9yQWNjb3VudCgKCS8vICAgICAgICAgICAgICAgICAxLAoJLy8gICAgICAgICAgICAgICAgIC8vIHdlIGNvdWxkIGNhbGN1bGF0ZSB0aGlzIGRpcmVjdGx5IGJ5IHJlZmVyZW5jaW5nIHRoZSBzaXplIG9mIHN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtIGJ1dCBpdCB3b3VsZAoJLy8gICAgICAgICAgICAgICAgIC8vIG1lYW4gb3VyIGNhbGxlcnMgd291bGQgaGF2ZSB0byByZWZlcmVuY2UgdGhlIGJveCBBTkQgYnV5IHVwIGkvbyAtIHNvIGp1c3QgZ28gbWF4IG9uIGV4dHJhIHBhZ2VzCgkvLyAgICAgICAgICAgICAgICAgMywKCS8vICAgICAgICAgICAgICAgICAwLAoJLy8gICAgICAgICAgICAgICAgIDAsCgkvLyAgICAgICAgICAgICAgICAgMCwKCS8vICAgICAgICAgICAgICAgICBTdGFraW5nUG9vbC5zY2hlbWEuZ2xvYmFsLm51bVVpbnQsCgkvLyAgICAgICAgICAgICAgICAgU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1CeXRlU2xpY2UsCgkvLyAgICAgICAgICAgICApLAoJLy8gICAgICAgICAgICAgcG9vbEluaXRNYnI6CgkvLyAgICAgICAgICAgICAgICAgQUxHT1JBTkRfQUNDT1VOVF9NSU5fQkFMQU5DRSArCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5jb3N0Rm9yQm94U3RvcmFnZSg3IC8qICdzdGFrZXJzJyBuYW1lICovICsgbGVuPFN0YWtlZEluZm8+KCkgKiBNQVhfU1RBS0VSU19QRVJfUE9PTCksCgkvLyAgICAgICAgICAgICBhZGRTdGFrZXJNYnI6CgkvLyAgICAgICAgICAgICAgICAgLy8gaG93IG11Y2ggdG8gY2hhcmdlIGZvciBmaXJzdCB0aW1lIGEgc3Rha2VyIGFkZHMgc3Rha2UgLSBzaW5jZSB3ZSBhZGQgYSB0cmFja2luZyBib3ggcGVyIHN0YWtlcgoJLy8gICAgICAgICAgICAgICAgIHRoaXMuY29zdEZvckJveFN0b3JhZ2UoCgkvLyAgICAgICAgICAgICAgICAgICAgIDMgLyogJ3NwcycgcHJlZml4ICovICsgbGVuPEFkZHJlc3M+KCkgKyBsZW48VmFsaWRhdG9yUG9vbEtleT4oKSAqIE1BWF9QT09MU19QRVJfU1RBS0VSLAoJLy8gICAgICAgICAgICAgICAgICksIC8vIHNpemUgb2Yga2V5ICsgYWxsIHZhbHVlcwoJLy8gICAgICAgICB9CglpbnQgMTEwMQoJY2FsbHN1YiBjb3N0Rm9yQm94U3RvcmFnZQoJaXRvYgoJaW50IDMKCWludCAxMQoJaW50IDAKCWR1cG4gMgoJaW50IDMKCWludCAxCgljYWxsc3ViIG1pbkJhbGFuY2VGb3JBY2NvdW50CglpdG9iCgljb25jYXQKCWludCAxMDAwMDAKCWludCAxMjgwNwoJY2FsbHN1YiBjb3N0Rm9yQm94U3RvcmFnZQoJKwoJaXRvYgoJY29uY2F0CglpbnQgMTc5CgljYWxsc3ViIGNvc3RGb3JCb3hTdG9yYWdlCglpdG9iCgljb25jYXQKCXJldHN1YgoKLy8gZ2V0UHJvdG9jb2xDb25zdHJhaW50cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0UHJvdG9jb2xDb25zdHJhaW50czoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXRQcm90b2NvbENvbnN0cmFpbnRzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWNhbGxzdWIgZ2V0UHJvdG9jb2xDb25zdHJhaW50cwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFByb3RvY29sQ29uc3RyYWludHMoKTogQ29uc3RyYWludHMKLy8KLy8gUmV0dXJucyB0aGUgcHJvdG9jb2wgY29uc3RyYWludHMgc28gdGhhdCBVSXMgY2FuIGxpbWl0IHdoYXQgdXNlcnMgc3BlY2lmeSBmb3IgdmFsaWRhdG9yIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KZ2V0UHJvdG9jb2xDb25zdHJhaW50czoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0NwoJLy8gcmV0dXJuIHsKCS8vICAgICAgICAgICAgIGVwb2NoUGF5b3V0Um91bmRzTWluOiBNSU5fRVBPQ0hfTEVOR1RILAoJLy8gICAgICAgICAgICAgZXBvY2hQYXlvdXRSb3VuZHNNYXg6IE1BWF9FUE9DSF9MRU5HVEgsCgkvLyAgICAgICAgICAgICBtaW5QY3RUb1ZhbGlkYXRvcldGb3VyRGVjaW1hbHM6IE1JTl9QQ1RfVE9fVkFMSURBVE9SLAoJLy8gICAgICAgICAgICAgbWF4UGN0VG9WYWxpZGF0b3JXRm91ckRlY2ltYWxzOiBNQVhfUENUX1RPX1ZBTElEQVRPUiwKCS8vICAgICAgICAgICAgIG1pbkVudHJ5U3Rha2U6IE1JTl9BTEdPX1NUQUtFX1BFUl9QT09MLAoJLy8gICAgICAgICAgICAgbWF4QWxnb1BlclBvb2w6IHRoaXMubWF4QWxnb0FsbG93ZWRQZXJQb29sKCksCgkvLyAgICAgICAgICAgICBtYXhBbGdvUGVyVmFsaWRhdG9yOiB0aGlzLm1heEFsbG93ZWRTdGFrZSgpLAoJLy8gICAgICAgICAgICAgYW10Q29uc2lkZXJlZFNhdHVyYXRlZDogdGhpcy5hbGdvU2F0dXJhdGlvbkxldmVsKCksCgkvLyAgICAgICAgICAgICBtYXhOb2RlczogTUFYX05PREVTLAoJLy8gICAgICAgICAgICAgbWF4UG9vbHNQZXJOb2RlOiBNQVhfUE9PTFNfUEVSX05PREUsCgkvLyAgICAgICAgICAgICBtYXhTdGFrZXJzUGVyUG9vbDogTUFYX1NUQUtFUlNfUEVSX1BPT0wsCgkvLyAgICAgICAgIH0KCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDBmNDI0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGY0MjQwMDAwMDAwMDAwMDBmNDI0MAoJY2FsbHN1YiBtYXhBbGdvQWxsb3dlZFBlclBvb2wKCWl0b2IKCWNvbmNhdAoJY2FsbHN1YiBtYXhBbGxvd2VkU3Rha2UKCWl0b2IKCWNvbmNhdAoJY2FsbHN1YiBhbGdvU2F0dXJhdGlvbkxldmVsCglpdG9iCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDA4Cgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAzCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMGM4Cgljb25jYXQKCXJldHN1YgoKLy8gZ2V0TnVtVmFsaWRhdG9ycygpdWludDY0CiphYmlfcm91dGVfZ2V0TnVtVmFsaWRhdG9yczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXROdW1WYWxpZGF0b3JzKCl1aW50NjQKCWNhbGxzdWIgZ2V0TnVtVmFsaWRhdG9ycwoJaXRvYgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldE51bVZhbGlkYXRvcnMoKTogdWludDY0Ci8vCi8vIFJldHVybnMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHZhbGlkYXRvcnMKZ2V0TnVtVmFsaWRhdG9yczoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE2NwoJLy8gcmV0dXJuIHRoaXMubnVtVmFsaWRhdG9ycy52YWx1ZQoJYnl0ZSAweDZlNzU2ZDU2IC8vICJudW1WIgoJYXBwX2dsb2JhbF9nZXQKCXJldHN1YgoKLy8gZ2V0VmFsaWRhdG9yQ29uZmlnKHVpbnQ2NCkodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKKmFiaV9yb3V0ZV9nZXRWYWxpZGF0b3JDb25maWc6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFZhbGlkYXRvckNvbmZpZyh1aW50NjQpKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCgljYWxsc3ViIGdldFZhbGlkYXRvckNvbmZpZwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvckNvbmZpZyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogVmFsaWRhdG9yQ29uZmlnCmdldFZhbGlkYXRvckNvbmZpZzoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE3MgoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnCglpbnQgMAoJaW50IDI0MgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCXJldHN1YgoKLy8gZ2V0VmFsaWRhdG9yU3RhdGUodWludDY0KSh1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0VmFsaWRhdG9yU3RhdGU6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFZhbGlkYXRvclN0YXRlKHVpbnQ2NCkodWludDE2LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBnZXRWYWxpZGF0b3JTdGF0ZQoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvclN0YXRlKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBWYWxpZGF0b3JDdXJTdGF0ZQpnZXRWYWxpZGF0b3JTdGF0ZToKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE3NwoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUKCWludCAyNDIgLy8gaGVhZE9mZnNldAoJaW50IDI2CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpCiphYmlfcm91dGVfZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpCgljYWxsc3ViIGdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcih2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogW0FkZHJlc3MsIEFkZHJlc3NdCmdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcjoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE4MgoJLy8gcmV0dXJuIFsKCS8vICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLAoJLy8gICAgICAgICAgICAgdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWFuYWdlciwKCS8vICAgICAgICAgXQoJaW50IDgKCWludCAzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWludCA0MAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJY29uY2F0CglyZXRzdWIKCi8vIGdldFBvb2xzKHVpbnQ2NCkodWludDY0LHVpbnQxNix1aW50NjQpW10KKmFiaV9yb3V0ZV9nZXRQb29sczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0UG9vbHModWludDY0KSh1aW50NjQsdWludDE2LHVpbnQ2NClbXQoJY2FsbHN1YiBnZXRQb29scwoJZHVwCglsZW4KCWludCAxOAoJLwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFBvb2xzKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBQb29sSW5mb1tdCi8vCi8vIFJldHVybiBsaXN0IG9mIGFsbCBwb29scyBmb3IgdGhpcyB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWxpZGF0b3JJZAovLyBAcmV0dXJuIHtQb29sSW5mb1tdfSAtIGFycmF5IG9mIHBvb2xzCi8vIE5vdCBjYWxsYWJsZSBmcm9tIG90aGVyIGNvbnRyYWN0cyBiZWNhdXNlID4xSyByZXR1cm4gYnV0IGNhbiBiZSBjYWxsZWQgdy8gc2ltdWxhdGUgd2hpY2ggYnVtcHMgbG9nIHJldHVybnMKZ2V0UG9vbHM6Cglwcm90byAxIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiAyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk2CgkvLyByZXREYXRhOiBQb29sSW5mb1tdID0gW10KCWJ5dGUgMHgKCWZyYW1lX2J1cnkgMCAvLyByZXREYXRhOiBQb29sSW5mb1tdCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk3CgkvLyBwb29sU2V0ID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29scykKCWludCAyNjggLy8gaGVhZE9mZnNldAoJaW50IDQzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWZyYW1lX2J1cnkgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE5OAoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBwb29sU2V0Lmxlbmd0aDsgaSArPSAxKQoJaW50IDAKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCipmb3JfMDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE5OAoJLy8gaSA8IHBvb2xTZXQubGVuZ3RoCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCAyNAoJPAoJYnogKmZvcl8wX2VuZAoKCS8vICppZjBfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxOTkKCS8vIHBvb2xTZXRbaV0ucG9vbEFwcElkID09PSAwCglmcmFtZV9kaWcgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWYwX2VuZAoKCS8vICppZjBfY29uc2VxdWVudAoJYiAqZm9yXzBfZW5kCgoqaWYwX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIwMwoJLy8gcmV0RGF0YS5wdXNoKHBvb2xTZXRbaV0pCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBQb29sSW5mb1tdCglmcmFtZV9kaWcgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDE4CglleHRyYWN0MwoJY29uY2F0CglmcmFtZV9idXJ5IDAgLy8gcmV0RGF0YTogUG9vbEluZm9bXQoKKmZvcl8wX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk4CgkvLyBpICs9IDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCWIgKmZvcl8wCgoqZm9yXzBfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjA1CgkvLyByZXR1cm4gcmV0RGF0YQoJZnJhbWVfZGlnIDAgLy8gcmV0RGF0YTogUG9vbEluZm9bXQoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDIKCXJldHN1YgoKLy8gZ2V0UG9vbEFwcElkKHVpbnQ2NCx1aW50NjQpdWludDY0CiphYmlfcm91dGVfZ2V0UG9vbEFwcElkOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBwb29sSWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJYnRvaQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFBvb2xBcHBJZCh1aW50NjQsdWludDY0KXVpbnQ2NAoJY2FsbHN1YiBnZXRQb29sQXBwSWQKCWl0b2IKCWNvbmNhdAoJbG9nCglpbnQgMQoJcmV0dXJuCgovLyBnZXRQb29sQXBwSWQodmFsaWRhdG9ySWQ6IHVpbnQ2NCwgcG9vbElkOiB1aW50NjQpOiB1aW50NjQKZ2V0UG9vbEFwcElkOgoJcHJvdG8gMiAxCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjEzCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBwb29sSWQgIT09IDAgJiYgcG9vbElkIDw9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHMubGVuZ3RoLAoJLy8gICAgICAgICAgICAgJ3Bvb2wgaWQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIG51bWJlciBvZiBwb29scyBmb3IgdGhpcyB2YWxpZGF0b3InLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTIgLy8gcG9vbElkOiB1aW50NjQKCWludCAwCgkhPQoJZHVwCglieiAqc2tpcF9hbmQwCglmcmFtZV9kaWcgLTIgLy8gcG9vbElkOiB1aW50NjQKCWludCAyNAoJPD0KCSYmCgoqc2tpcF9hbmQwOgoJLy8gcG9vbCBpZCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgbnVtYmVyIG9mIHBvb2xzIGZvciB0aGlzIHZhbGlkYXRvcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjE3CgkvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1twb29sSWQgLSAxXS5wb29sQXBwSWQKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0yIC8vIHBvb2xJZDogdWludDY0CglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCXJldHN1YgoKLy8gZ2V0UG9vbEluZm8oKHVpbnQ2NCx1aW50NjQsdWludDY0KSkodWludDY0LHVpbnQxNix1aW50NjQpCiphYmlfcm91dGVfZ2V0UG9vbEluZm86CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHBvb2xLZXk6ICh1aW50NjQsdWludDY0LHVpbnQ2NCkKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWR1cAoJbGVuCglpbnQgMjQKCT09CgoJLy8gYXJndW1lbnQgMCAocG9vbEtleSkgZm9yIGdldFBvb2xJbmZvIG11c3QgYmUgYSAodWludDY0LHVpbnQ2NCx1aW50NjQpCglhc3NlcnQKCgkvLyBleGVjdXRlIGdldFBvb2xJbmZvKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpKHVpbnQ2NCx1aW50MTYsdWludDY0KQoJY2FsbHN1YiBnZXRQb29sSW5mbwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFBvb2xJbmZvKHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkpOiBQb29sSW5mbwpnZXRQb29sSW5mbzoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIyMgoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRDdXJNYXhTdGFrZVBlclBvb2wodWludDY0KXVpbnQ2NAoqYWJpX3JvdXRlX2dldEN1ck1heFN0YWtlUGVyUG9vbDoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHVpbnQ2NCl1aW50NjQKCWNhbGxzdWIgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sCglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiB1aW50NjQKLy8KLy8gQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIHN0YWtlIHBlciBwb29sIGZvciBhIGdpdmVuIHZhbGlkYXRvci4KLy8gTm9ybWFsbHkgdGhpcyB3b3VsZCBiZSBtYXhBbGdvUGVyUG9vbCwgYnV0IGl0IHNob3VsZCBhbHNvIG5ldmVyIGdvIGFib3ZlIE1heEFsbG93ZWRTdGFrZSAvIG51bVBvb2xzIHNvCi8vIGFzIHBvb2xzIGFyZSBhZGRlZCB0aGUgbWF4IGFsbG93ZWQgcGVyIHBvb2wgY2FuIHJlZHVjZS4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCmdldEN1ck1heFN0YWtlUGVyUG9vbDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzMKCS8vIG51bVBvb2xzID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyBhcyB1aW50NjQKCWludCAyNDIKCWludCAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIG51bVBvb2xzOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzQKCS8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzID0gdGhpcy5tYXhBbGxvd2VkU3Rha2UoKSAvIG51bVBvb2xzCgljYWxsc3ViIG1heEFsbG93ZWRTdGFrZQoJZnJhbWVfZGlnIDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoJLwoJZnJhbWVfYnVyeSAxIC8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzUKCS8vIG1heFBlclBvb2w6IHVpbnQ2NCA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1heEFsZ29QZXJQb29sCglpbnQgMjE3CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCgkvLyAqaWYxX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjM2CgkvLyBtYXhQZXJQb29sID09PSAwCglmcmFtZV9kaWcgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCWludCAwCgk9PQoJYnogKmlmMV9lbmQKCgkvLyAqaWYxX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIzNwoJLy8gbWF4UGVyUG9vbCA9IHRoaXMubWF4QWxnb0FsbG93ZWRQZXJQb29sKCkKCWNhbGxzdWIgbWF4QWxnb0FsbG93ZWRQZXJQb29sCglmcmFtZV9idXJ5IDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoqaWYxX2VuZDoKCS8vICppZjJfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzkKCS8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzIDwgbWF4UGVyUG9vbAoJZnJhbWVfZGlnIDEgLy8gaGFyZE1heERpdmlkZWRCZXR3ZWVuUG9vbHM6IHVpbnQ2NAoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8CglieiAqaWYyX2VuZAoKCS8vICppZjJfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjQwCgkvLyBtYXhQZXJQb29sID0gaGFyZE1heERpdmlkZWRCZXR3ZWVuUG9vbHMKCWZyYW1lX2RpZyAxIC8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzOiB1aW50NjQKCWZyYW1lX2J1cnkgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCippZjJfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjQyCgkvLyByZXR1cm4gbWF4UGVyUG9vbAoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCgoJLy8gcG9wIGFsbCBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUgc3RhY2sKCXBvcG4gMgoJcmV0c3ViCgovLyBkb2VzU3Rha2VyTmVlZFRvUGF5TUJSKGFkZHJlc3MpYm9vbAoqYWJpX3JvdXRlX2RvZXNTdGFrZXJOZWVkVG9QYXlNQlI6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHN0YWtlcjogYWRkcmVzcwoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZHVwCglsZW4KCWludCAzMgoJPT0KCgkvLyBhcmd1bWVudCAwIChzdGFrZXIpIGZvciBkb2VzU3Rha2VyTmVlZFRvUGF5TUJSIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBleGVjdXRlIGRvZXNTdGFrZXJOZWVkVG9QYXlNQlIoYWRkcmVzcylib29sCgljYWxsc3ViIGRvZXNTdGFrZXJOZWVkVG9QYXlNQlIKCWJ5dGUgMHgwMAoJaW50IDAKCXVuY292ZXIgMgoJc2V0Yml0Cgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZG9lc1N0YWtlck5lZWRUb1BheU1CUihzdGFrZXI6IEFkZHJlc3MpOiBib29sZWFuCi8vCi8vIEhlbHBlciBjYWxsZXJzIGNhbiBjYWxsIHcvIHNpbXVsYXRlIHRvIGRldGVybWluZSBpZiAnQWRkU3Rha2VyJyBNQlIgc2hvdWxkIGJlIGluY2x1ZGVkIHcvIHN0YWtpbmcgYW1vdW50Ci8vIEBwYXJhbSBzdGFrZXIKZG9lc1N0YWtlck5lZWRUb1BheU1CUjoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI1MQoJLy8gcmV0dXJuICF0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS5leGlzdHMKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZXI6IEFkZHJlc3MKCWNvbmNhdAoJYm94X2xlbgoJc3dhcAoJcG9wCgkhCglyZXRzdWIKCi8vIGdldFN0YWtlZFBvb2xzRm9yQWNjb3VudChhZGRyZXNzKSh1aW50NjQsdWludDY0LHVpbnQ2NClbXQoqYWJpX3JvdXRlX2dldFN0YWtlZFBvb2xzRm9yQWNjb3VudDoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gc3Rha2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKHN0YWtlcikgZm9yIGdldFN0YWtlZFBvb2xzRm9yQWNjb3VudCBtdXN0IGJlIGEgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBnZXRTdGFrZWRQb29sc0ZvckFjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCx1aW50NjQpW10KCWNhbGxzdWIgZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50CglkdXAKCWxlbgoJaW50IDI0CgkvCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0Cgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50KHN0YWtlcjogQWRkcmVzcyk6IFZhbGlkYXRvclBvb2xLZXlbXQovLwovLyBSZXRyaWV2ZXMgdGhlIHN0YWtlZCBwb29scyBmb3IgYW4gYWNjb3VudC4KLy8KLy8gQHBhcmFtIHtBZGRyZXNzfSBzdGFrZXIgLSBUaGUgYWNjb3VudCB0byByZXRyaWV2ZSBzdGFrZWQgcG9vbHMgZm9yLgovLyBAcmV0dXJuIHtWYWxpZGF0b3JQb29sS2V5W119IC0gVGhlIGFycmF5IG9mIHN0YWtlZCBwb29scyBmb3IgdGhlIGFjY291bnQuCmdldFN0YWtlZFBvb2xzRm9yQWNjb3VudDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyAqaWYzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjYxCgkvLyAhdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikuZXhpc3RzCglieXRlIDB4NzM3MDczIC8vICJzcHMiCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoJIQoJYnogKmlmM19lbmQKCgkvLyAqaWYzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2MgoJLy8gcmV0dXJuIFtdCglieXRlIDB4CgliICpnZXRTdGFrZWRQb29sc0ZvckFjY291bnQqcmV0dXJuCgoqaWYzX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2NAoJLy8gcmV0RGF0YTogVmFsaWRhdG9yUG9vbEtleVtdID0gW10KCWJ5dGUgMHgKCWZyYW1lX2J1cnkgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjUKCS8vIHBvb2xTZXQgPSBjbG9uZSh0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZSkKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZXI6IEFkZHJlc3MKCWNvbmNhdAoJYm94X2dldAoKCS8vIGJveCB2YWx1ZSBkb2VzIG5vdCBleGlzdDogdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUKCWFzc2VydAoJZnJhbWVfYnVyeSAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjYKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgcG9vbFNldC5sZW5ndGg7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzE6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjYKCS8vIGkgPCBwb29sU2V0Lmxlbmd0aAoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl8xX2VuZAoKCS8vICppZjRfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjcKCS8vIHBvb2xTZXRbaV0uaWQgIT09IDAKCWZyYW1lX2RpZyAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgkhPQoJYnogKmlmNF9lbmQKCgkvLyAqaWY0X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2OAoJLy8gcmV0RGF0YS5wdXNoKHBvb2xTZXRbaV0pCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCWZyYW1lX2RpZyAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWNvbmNhdAoJZnJhbWVfYnVyeSAwIC8vIHJldERhdGE6IFZhbGlkYXRvclBvb2xLZXlbXQoKKmlmNF9lbmQ6CgoqZm9yXzFfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjYKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzEKCipmb3JfMV9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzEKCS8vIHJldHVybiByZXREYXRhCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCipnZXRTdGFrZWRQb29sc0ZvckFjY291bnQqcmV0dXJuOgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCgoJLy8gcG9wIGFsbCBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUgc3RhY2sKCXBvcG4gMgoJcmV0c3ViCgovLyBnZXRUb2tlblBheW91dFJhdGlvKHVpbnQ2NCkodWludDY0WzI0XSx1aW50NjQpCiphYmlfcm91dGVfZ2V0VG9rZW5QYXlvdXRSYXRpbzoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KQoJY2FsbHN1YiBnZXRUb2tlblBheW91dFJhdGlvCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0VG9rZW5QYXlvdXRSYXRpbyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogUG9vbFRva2VuUGF5b3V0UmF0aW8KLy8KLy8gUmV0cmlldmVzIHRoZSB0b2tlbiBwYXlvdXQgcmF0aW8gZm9yIGEgZ2l2ZW4gdmFsaWRhdG9yIC0gcmV0dXJuaW5nIHRoZSBwb29sIHJhdGlvcyBvZiB3aG9sZSBzbyB0aGF0IHRva2VuCi8vIHBheW91dHMgYWNyb3NzIHBvb2xzIGNhbiBiZSBiYXNlZCBvbiBhIHN0YWJsZSBzbmFwaG9zdCBvZiBzdGFrZS4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEByZXR1cm4ge1Bvb2xUb2tlblBheW91dFJhdGlvfSAtIFRoZSB0b2tlbiBwYXlvdXQgcmF0aW8gZm9yIHRoZSB2YWxpZGF0b3IuCmdldFRva2VuUGF5b3V0UmF0aW86Cglwcm90byAxIDEKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyODMKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCXJldHN1YgoKLy8gZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cyh1aW50NjQpKCh1aW50NjRbM10pWzhdKQoqYWJpX3JvdXRlX2dldE5vZGVQb29sQXNzaWdubWVudHM6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldE5vZGVQb29sQXNzaWdubWVudHModWludDY0KSgodWludDY0WzNdKVs4XSkKCWNhbGxzdWIgZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldE5vZGVQb29sQXNzaWdubWVudHModmFsaWRhdG9ySWQ6IHVpbnQ2NCk6IE5vZGVQb29sQXNzaWdubWVudENvbmZpZwpnZXROb2RlUG9vbEFzc2lnbm1lbnRzOgoJcHJvdG8gMSAxCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mjg4CgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS5leGlzdHMsICJ0aGUgc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBkb2Vzbid0IGV4aXN0IikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoKCS8vIHRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGRvZXNuJ3QgZXhpc3QKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI5MAoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUubm9kZVBvb2xBc3NpZ25tZW50cwoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRORkRSZWdpc3RyeUlEKCl1aW50NjQKKmFiaV9yb3V0ZV9nZXRORkRSZWdpc3RyeUlEOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBleGVjdXRlIGdldE5GRFJlZ2lzdHJ5SUQoKXVpbnQ2NAoJY2FsbHN1YiBnZXRORkRSZWdpc3RyeUlECglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0TkZEUmVnaXN0cnlJRCgpOiB1aW50NjQKZ2V0TkZEUmVnaXN0cnlJRDoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI5NAoJLy8gcmV0dXJuIHRoaXMubmZkUmVnaXN0cnlBcHBJZAoJbG9hZCAyMDAgLy8gVE1QTF9uZmRSZWdpc3RyeUFwcElkCglyZXRzdWIKCi8vIGFkZFZhbGlkYXRvcihwYXksc3RyaW5nLCh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KSl1aW50NjQKKmFiaV9yb3V0ZV9hZGRWYWxpZGF0b3I6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIGNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDI0MgoJPT0KCgkvLyBhcmd1bWVudCAwIChjb25maWcpIGZvciBhZGRWYWxpZGF0b3IgbXVzdCBiZSBhICh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KQoJYXNzZXJ0CgoJLy8gbmZkTmFtZTogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglleHRyYWN0IDIgMAoKCS8vIG1iclBheW1lbnQ6IHBheQoJdHhuIEdyb3VwSW5kZXgKCWludCAxCgktCglkdXAKCWd0eG5zIFR5cGVFbnVtCglpbnQgcGF5Cgk9PQoKCS8vIGFyZ3VtZW50IDIgKG1iclBheW1lbnQpIGZvciBhZGRWYWxpZGF0b3IgbXVzdCBiZSBhIHBheSB0cmFuc2FjdGlvbgoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBhZGRWYWxpZGF0b3IocGF5LHN0cmluZywodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkpdWludDY0CgljYWxsc3ViIGFkZFZhbGlkYXRvcgoJaXRvYgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFZhbGlkYXRvcihtYnJQYXltZW50OiBQYXlUeG4sIG5mZE5hbWU6IHN0cmluZywgY29uZmlnOiBWYWxpZGF0b3JDb25maWcpOiB1aW50NjQKLy8KLy8gQWRkcyBhIG5ldyB2YWxpZGF0b3IKLy8gUmVxdWlyZXMgYXQgbGVhc3QgMTAgQUxHTyBhcyB0aGUgJ2ZlZScgZm9yIHRoZSB0cmFuc2FjdGlvbiB0byBoZWxwIGRpc3N1YWRlIHNwYW1tZWQgdmFsaWRhdG9yIGFkZHMuCi8vCi8vIEBwYXJhbSB7UGF5VHhufSBtYnJQYXltZW50IHBheW1lbnQgZnJvbSBjYWxsZXIgd2hpY2ggY292ZXJzIG1iciBpbmNyZWFzZSBvZiBuZXcgdmFsaWRhdG9yIHN0b3JhZ2UKLy8gQHBhcmFtIHtzdHJpbmd9IG5mZE5hbWUgKE9wdGlvbmFsKSBOYW1lIG9mIG5mZCAodXNlZCBhcyBkb3VibGUtY2hlY2sgYWdhaW5zdCBpZCBzcGVjaWZpZWQgaW4gY29uZmlnKQovLyBAcGFyYW0ge1ZhbGlkYXRvckNvbmZpZ30gY29uZmlnIFZhbGlkYXRvckNvbmZpZyBzdHJ1Y3QKLy8gQHJldHVybnMge3VpbnQ2NH0gdmFsaWRhdG9yIGlkCmFkZFZhbGlkYXRvcjoKCXByb3RvIDMgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzA2CgkvLyB0aGlzLnZhbGlkYXRlQ29uZmlnKGNvbmZpZykKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJY2FsbHN1YiB2YWxpZGF0ZUNvbmZpZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMwOAoJLy8gdmVyaWZ5UGF5VHhuKG1iclBheW1lbnQsIHsgcmVjZWl2ZXI6IHRoaXMuYXBwLmFkZHJlc3MsIGFtb3VudDogdGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkVmFsaWRhdG9yTWJyIH0pCgkvLyB2ZXJpZnkgcmVjZWl2ZXIKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIFJlY2VpdmVyCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6InJlY2VpdmVyIiwiZXhwZWN0ZWQiOiJ0aGlzLmFwcC5hZGRyZXNzIn0KCWFzc2VydAoKCS8vIHZlcmlmeSBhbW91bnQKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCglleHRyYWN0IDAgOAoJYnRvaQoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6ImFtb3VudCIsImV4cGVjdGVkIjoidGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkVmFsaWRhdG9yTWJyIn0KCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxMAoJLy8gYXNzZXJ0KG1iclBheW1lbnQuZmVlID4gMTAgKiAxMDAwMDAwLCAnZmVlIG11c3QgYmUgMTAgQUxHTyBvciBtb3JlIHRvIHByZXZlbnQgc3BhbW1pbmcgb2YgdmFsaWRhdG9ycycpCglmcmFtZV9kaWcgLTEgLy8gbWJyUGF5bWVudDogUGF5VHhuCglndHhucyBGZWUKCWludCAxMDAwMDAwMAoJPgoKCS8vIGZlZSBtdXN0IGJlIDEwIEFMR08gb3IgbW9yZSB0byBwcmV2ZW50IHNwYW1taW5nIG9mIHZhbGlkYXRvcnMKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxMwoJLy8gdmFsaWRhdG9ySWQgPSB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgKyAxCglieXRlIDB4NmU3NTZkNTYgLy8gIm51bVYiCglhcHBfZ2xvYmFsX2dldAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzE0CgkvLyB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgPSB2YWxpZGF0b3JJZAoJYnl0ZSAweDZlNzU2ZDU2IC8vICJudW1WIgoJZnJhbWVfZGlnIDAgLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMTYKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkuY3JlYXRlKCkKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJaW50IDEwOTIKCWJveF9jcmVhdGUKCXBvcAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxNwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcgPSBjb25maWcKCWludCAwCglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMTgKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLmlkID0gdmFsaWRhdG9ySWQKCWludCAwCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gKmlmNV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMyMQoJLy8gY29uZmlnLm5mZEZvckluZm8gIT09IDAKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA3MiA4CglidG9pCglpbnQgMAoJIT0KCWJ6ICppZjVfZW5kCgoJLy8gKmlmNV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMjMKCS8vIGFzc2VydCh0aGlzLmlzTkZEQXBwSURWYWxpZChjb25maWcubmZkRm9ySW5mbyksICdwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZCcpCglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgNzIgOAoJYnRvaQoJY2FsbHN1YiBpc05GREFwcElEVmFsaWQKCgkvLyBwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzI1CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgdGhpcy50eG4uc2VuZGVyID09PSAoQXBwSUQuZnJvbVVpbnQ2NChjb25maWcubmZkRm9ySW5mbykuZ2xvYmFsU3RhdGUoJ2kub3duZXIuYScpIGFzIEFkZHJlc3MpLAoJLy8gICAgICAgICAgICAgICAgICdJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXInLAoJLy8gICAgICAgICAgICAgKQoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIC0zIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDcyIDgKCWJ0b2kKCWJ5dGUgMHg2OTJlNmY3NzZlNjU3MjJlNjEgLy8gImkub3duZXIuYSIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KGNvbmZpZy5uZmRGb3JJbmZvKS5nbG9iYWxTdGF0ZSgnaS5vd25lci5hJykKCWFzc2VydAoJPT0KCgkvLyBJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXIKCWFzc2VydAoKKmlmNV9lbmQ6CgkvLyAqaWY2X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzMxCgkvLyBjb25maWcuZW50cnlHYXRpbmdUeXBlID09PSBHQVRJTkdfVFlQRV9DUkVBVEVEX0JZX05GRF9BRERSRVNTRVMgfHwKCS8vICAgICAgICAgICAgIGNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX1NFR01FTlRfT0ZfTkZECglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgODAgMQoJYnRvaQoJaW50IDMKCT09CglkdXAKCWJueiAqc2tpcF9vcjAKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4MCAxCglidG9pCglpbnQgNAoJPT0KCXx8Cgoqc2tpcF9vcjA6CglieiAqaWY2X2VuZAoKCS8vICppZjZfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzM1CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5pc05GREFwcElEVmFsaWQoY29uZmlnLmVudHJ5R2F0aW5nQXNzZXRzWzBdKSwKCS8vICAgICAgICAgICAgICAgICAncHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZEJywKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAxMTMgOAoJYnRvaQoJY2FsbHN1YiBpc05GREFwcElEVmFsaWQKCgkvLyBwcm92aWRlZCBORkQgQXBwIGlkIGZvciBnYXRpbmcgbXVzdCBiZSB2YWxpZCBORkQKCWFzc2VydAoKKmlmNl9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNDAKCS8vIHRoaXMucmV0aU9QX2FkZGVkVmFsaWRhdG9yLmxvZyh7IGlkOiB2YWxpZGF0b3JJZCwgb3duZXI6IGNvbmZpZy5vd25lciwgbWFuYWdlcjogY29uZmlnLm1hbmFnZXIgfSkKCWJ5dGUgMHhhOGRkMjFjYiAvLyByZXRpT1BfYWRkZWRWYWxpZGF0b3IodWludDY0LGFkZHJlc3MsYWRkcmVzcykKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4IDMyCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA0MCAzMgoJY29uY2F0Cgljb25jYXQKCWxvZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM0MQoJLy8gcmV0dXJuIHZhbGlkYXRvcklkCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvck1hbmFnZXIodWludDY0LGFkZHJlc3Mpdm9pZAoqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvck1hbmFnZXI6CgkvLyBtYW5hZ2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKG1hbmFnZXIpIGZvciBjaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyKHVpbnQ2NCxhZGRyZXNzKXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yTWFuYWdlcgoJaW50IDEKCXJldHVybgoKLy8gY2hhbmdlVmFsaWRhdG9yTWFuYWdlcih2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBtYW5hZ2VyOiBBZGRyZXNzKTogdm9pZAovLwovLyBDaGFuZ2VzIHRoZSBWYWxpZGF0b3IgbWFuYWdlciBmb3IgYSBzcGVjaWZpYyBWYWxpZGF0b3IgaWQuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gY2hhbmdlIHRoZSBtYW5hZ2VyIGZvci4KLy8gQHBhcmFtIHtBZGRyZXNzfSBtYW5hZ2VyIC0gVGhlIG5ldyBtYW5hZ2VyIGFkZHJlc3MuCmNoYW5nZVZhbGlkYXRvck1hbmFnZXI6Cglwcm90byAyIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNTIKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM1MwoJLy8gYXNzZXJ0KG1hbmFnZXIgIT09IGdsb2JhbHMuemVyb0FkZHJlc3MsICduZWVkcyB0byBhdCBsZWFzdCBiZSB2YWxpZCBhZGRyZXNzJykKCWZyYW1lX2RpZyAtMiAvLyBtYW5hZ2VyOiBBZGRyZXNzCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CgoJLy8gbmVlZHMgdG8gYXQgbGVhc3QgYmUgdmFsaWQgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzU0CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5tYW5hZ2VyID0gbWFuYWdlcgoJaW50IDQwCglmcmFtZV9kaWcgLTIgLy8gbWFuYWdlcjogQWRkcmVzcwoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCXJldHN1YgoKLy8gY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyh1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkCiphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbzoKCS8vIHN1bnNldHRpbmdUbzogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglidG9pCgoJLy8gc3Vuc2V0dGluZ09uOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbwoJaW50IDEKCXJldHVybgoKLy8gY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBzdW5zZXR0aW5nT246IHVpbnQ2NCwgc3Vuc2V0dGluZ1RvOiBWYWxpZGF0b3JJZFR5cGUpOiB2b2lkCi8vCi8vIFVwZGF0ZXMgdGhlIHN1bnNldCBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiB2YWxpZGF0b3IuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gdXBkYXRlLgovLyBAcGFyYW0ge3VpbnQ2NH0gc3Vuc2V0dGluZ09uIC0gVGhlIG5ldyBzdW5zZXQgdGltZXN0YW1wLgovLyBAcGFyYW0ge3VpbnQ2NH0gc3Vuc2V0dGluZ1RvIC0gVGhlIG5ldyBzdW5zZXQgdG8gdmFsaWRhdG9yIGlkLgpjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvOgoJcHJvdG8gMyAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzY2CgkvLyB0aGlzLmNhbGxlck11c3RCZU93bmVyKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgY2FsbGVyTXVzdEJlT3duZXIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNjcKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnN1bnNldHRpbmdPbiA9IHN1bnNldHRpbmdPbgoJaW50IDIyNgoJZnJhbWVfZGlnIC0yIC8vIHN1bnNldHRpbmdPbjogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM2OAoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcuc3Vuc2V0dGluZ1RvID0gc3Vuc2V0dGluZ1RvCglpbnQgMjM0CglmcmFtZV9kaWcgLTMgLy8gc3Vuc2V0dGluZ1RvOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvck5GRCh1aW50NjQsdWludDY0LHN0cmluZyl2b2lkCiphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yTkZEOgoJLy8gbmZkTmFtZTogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglleHRyYWN0IDIgMAoKCS8vIG5mZEFwcElEOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JORkQodWludDY0LHVpbnQ2NCxzdHJpbmcpdm9pZAoJY2FsbHN1YiBjaGFuZ2VWYWxpZGF0b3JORkQKCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvck5GRCh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBuZmRBcHBJRDogdWludDY0LCBuZmROYW1lOiBzdHJpbmcpOiB2b2lkCi8vCi8vIENoYW5nZXMgdGhlIE5GRCBmb3IgYSB2YWxpZGF0b3IgaW4gdGhlIHZhbGlkYXRvckxpc3QgY29udHJhY3QuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gdXBkYXRlLgovLyBAcGFyYW0ge3VpbnQ2NH0gbmZkQXBwSUQgLSBUaGUgYXBwbGljYXRpb24gaWQgb2YgdGhlIE5GRCB0byBhc3NpZ24gdG8gdGhlIHZhbGlkYXRvci4KLy8gQHBhcmFtIHtzdHJpbmd9IG5mZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgTkZEICh3aGljaCBtdXN0IG1hdGNoKQpjaGFuZ2VWYWxpZGF0b3JORkQ6Cglwcm90byAzIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozODAKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM4MgoJLy8gYXNzZXJ0KHRoaXMuaXNORkRBcHBJRFZhbGlkKG5mZEFwcElEKSwgJ3Byb3ZpZGVkIE5GRCBtdXN0IGJlIHZhbGlkJykKCWZyYW1lX2RpZyAtMiAvLyBuZmRBcHBJRDogdWludDY0CgljYWxsc3ViIGlzTkZEQXBwSURWYWxpZAoKCS8vIHByb3ZpZGVkIE5GRCBtdXN0IGJlIHZhbGlkCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozODQKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHRoaXMudHhuLnNlbmRlciA9PT0gKEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzKSwKCS8vICAgICAgICAgICAgICdJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXInLAoJLy8gICAgICAgICApCgl0eG4gU2VuZGVyCglmcmFtZV9kaWcgLTIgLy8gbmZkQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKQoJYXNzZXJ0Cgk9PQoKCS8vIElmIHNwZWNpZnlpbmcgTkZELCBhY2NvdW50IGFkZGluZyB2YWxpZGF0b3IgbXVzdCBiZSBvd25lcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mzg4CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5uZmRGb3JJbmZvID0gbmZkQXBwSUQKCWludCA3MgoJZnJhbWVfZGlnIC0yIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHVpbnQ2NCxhZGRyZXNzKXZvaWQKKmFiaV9yb3V0ZV9jaGFuZ2VWYWxpZGF0b3JDb21taXNzaW9uQWRkcmVzczoKCS8vIGNvbW1pc3Npb25BZGRyZXNzOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKGNvbW1pc3Npb25BZGRyZXNzKSBmb3IgY2hhbmdlVmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MgbXVzdCBiZSBhIGFkZHJlc3MKCWFzc2VydAoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHVpbnQ2NCxhZGRyZXNzKXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MKCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIGNvbW1pc3Npb25BZGRyZXNzOiBBZGRyZXNzKTogdm9pZAovLwovLyBDaGFuZ2UgdGhlIGNvbW1pc3Npb24gYWRkcmVzcyB0aGF0IHZhbGlkYXRvciByZXdhcmRzIGFyZSBzZW50IHRvLgovLyBbIE9OTFkgT1dORVIgQ0FOIENIQU5HRSBdCmNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzOgoJcHJvdG8gMiAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mzk2CgkvLyB0aGlzLmNhbGxlck11c3RCZU93bmVyKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgY2FsbGVyTXVzdEJlT3duZXIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozOTcKCS8vIGFzc2VydChjb21taXNzaW9uQWRkcmVzcyAhPT0gQWRkcmVzcy56ZXJvQWRkcmVzcykKCWZyYW1lX2RpZyAtMiAvLyBjb21taXNzaW9uQWRkcmVzczogQWRkcmVzcwoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mzk4CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy52YWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyA9IGNvbW1pc3Npb25BZGRyZXNzCglpbnQgMTc3CglmcmFtZV9kaWcgLTIgLy8gY29tbWlzc2lvbkFkZHJlc3M6IEFkZHJlc3MKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8odWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQpdm9pZAoqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvclJld2FyZEluZm86CgkvLyBSZXdhcmRQZXJQYXlvdXQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgoJYnRvaQoKCS8vIEdhdGluZ0Fzc2V0TWluQmFsYW5jZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyA1CglidG9pCgoJLy8gRW50cnlHYXRpbmdBc3NldHM6IHVpbnQ2NFs0XQoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAoJZHVwCglsZW4KCWludCAzMgoJPT0KCgkvLyBhcmd1bWVudCAyIChFbnRyeUdhdGluZ0Fzc2V0cykgZm9yIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8gbXVzdCBiZSBhIHVpbnQ2NFs0XQoJYXNzZXJ0CgoJLy8gRW50cnlHYXRpbmdBZGRyZXNzOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDMgKEVudHJ5R2F0aW5nQWRkcmVzcykgZm9yIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8gbXVzdCBiZSBhIGFkZHJlc3MKCWFzc2VydAoKCS8vIEVudHJ5R2F0aW5nVHlwZTogdWludDgKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMQoJPT0KCgkvLyBhcmd1bWVudCA0IChFbnRyeUdhdGluZ1R5cGUpIGZvciBjaGFuZ2VWYWxpZGF0b3JSZXdhcmRJbmZvIG11c3QgYmUgYSB1aW50OAoJYXNzZXJ0CglidG9pCgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mbyh1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCl2b2lkCgljYWxsc3ViIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8KCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8odmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgRW50cnlHYXRpbmdUeXBlOiB1aW50OCwgRW50cnlHYXRpbmdBZGRyZXNzOiBBZGRyZXNzLCBFbnRyeUdhdGluZ0Fzc2V0czogU3RhdGljQXJyYXk8dWludDY0LCA0PiwgR2F0aW5nQXNzZXRNaW5CYWxhbmNlOiB1aW50NjQsIFJld2FyZFBlclBheW91dDogdWludDY0KTogdm9pZAovLwovLyBBbGxvdyB0aGUgYWRkaXRpb25hbCByZXdhcmRzIChnYXRpbmcgZW50cnksIGFkZGl0aW9uYWwgdG9rZW4gcmV3YXJkcykgaW5mb3JtYXRpb24gYmUgY2hhbmdlZCBhdCB3aWxsLgovLyBbIE9OTFkgT1dORVIgQ0FOIENIQU5HRSBdCmNoYW5nZVZhbGlkYXRvclJld2FyZEluZm86Cglwcm90byA2IDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MTMKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQxNQoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgRW50cnlHYXRpbmdUeXBlID49IEdBVElOR19UWVBFX05PTkUgJiYgRW50cnlHYXRpbmdUeXBlIDwgR0FUSU5HX1RZUEVfQ09OU1RfTUFYLAoJLy8gICAgICAgICAgICAgJ2ludmFsaWQgRW50cnkgZ2F0aW5nIHR5cGUnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDAKCT49CglkdXAKCWJ6ICpza2lwX2FuZDEKCWZyYW1lX2RpZyAtMiAvLyBFbnRyeUdhdGluZ1R5cGU6IHVpbnQ4CglpbnQgNAoJPAoJJiYKCipza2lwX2FuZDE6CgkvLyBpbnZhbGlkIEVudHJ5IGdhdGluZyB0eXBlCglhc3NlcnQKCgkvLyAqaWY3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDE5CgkvLyBFbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX0FTU0VUU19DUkVBVEVEX0JZCglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDEKCT09CglieiAqaWY3X2VuZAoKCS8vICppZjdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDIwCgkvLyBhc3NlcnQoRW50cnlHYXRpbmdBZGRyZXNzICE9PSBnbG9iYWxzLnplcm9BZGRyZXNzKQoJZnJhbWVfZGlnIC0zIC8vIEVudHJ5R2F0aW5nQWRkcmVzczogQWRkcmVzcwoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoqaWY3X2VuZDoKCS8vICppZjhfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MjMKCS8vIEVudHJ5R2F0aW5nVHlwZSA9PT0gR0FUSU5HX1RZUEVfQ1JFQVRFRF9CWV9ORkRfQUREUkVTU0VTIHx8CgkvLyAgICAgICAgICAgICBFbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX1NFR01FTlRfT0ZfTkZECglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDMKCT09CglkdXAKCWJueiAqc2tpcF9vcjEKCWZyYW1lX2RpZyAtMiAvLyBFbnRyeUdhdGluZ1R5cGU6IHVpbnQ4CglpbnQgNAoJPT0KCXx8Cgoqc2tpcF9vcjE6CglieiAqaWY4X2VuZAoKCS8vICppZjhfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDI2CgkvLyBhc3NlcnQodGhpcy5pc05GREFwcElEVmFsaWQoRW50cnlHYXRpbmdBc3NldHNbMF0pLCAncHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZEJykKCWZyYW1lX2RpZyAtNCAvLyBFbnRyeUdhdGluZ0Fzc2V0czogU3RhdGljQXJyYXk8dWludDY0LCA0PgoJZXh0cmFjdCAwIDgKCWJ0b2kKCWNhbGxzdWIgaXNORkRBcHBJRFZhbGlkCgoJLy8gcHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZECglhc3NlcnQKCippZjhfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDI4CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPSBFbnRyeUdhdGluZ1R5cGUKCWludCA4MAoJZnJhbWVfZGlnIC0yIC8vIEVudHJ5R2F0aW5nVHlwZTogdWludDgKCWl0b2IKCWV4dHJhY3QgNyAxCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQyOQoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcuZW50cnlHYXRpbmdBZGRyZXNzID0gRW50cnlHYXRpbmdBZGRyZXNzCglpbnQgODEKCWZyYW1lX2RpZyAtMyAvLyBFbnRyeUdhdGluZ0FkZHJlc3M6IEFkZHJlc3MKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDMwCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0cyA9IEVudHJ5R2F0aW5nQXNzZXRzCglpbnQgMTEzCglmcmFtZV9kaWcgLTQgLy8gRW50cnlHYXRpbmdBc3NldHM6IFN0YXRpY0FycmF5PHVpbnQ2NCwgND4KCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDMxCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5nYXRpbmdBc3NldE1pbkJhbGFuY2UgPSBHYXRpbmdBc3NldE1pbkJhbGFuY2UKCWludCAxNDUKCWZyYW1lX2RpZyAtNSAvLyBHYXRpbmdBc3NldE1pbkJhbGFuY2U6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MzIKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnJld2FyZFBlclBheW91dCA9IFJld2FyZFBlclBheW91dAoJaW50IDE2MQoJZnJhbWVfZGlnIC02IC8vIFJld2FyZFBlclBheW91dDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyBhZGRQb29sKHBheSx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCkKKmFiaV9yb3V0ZV9hZGRQb29sOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBub2RlTnVtOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gbWJyUGF5bWVudDogcGF5Cgl0eG4gR3JvdXBJbmRleAoJaW50IDEKCS0KCWR1cAoJZ3R4bnMgVHlwZUVudW0KCWludCBwYXkKCT09CgoJLy8gYXJndW1lbnQgMiAobWJyUGF5bWVudCkgZm9yIGFkZFBvb2wgbXVzdCBiZSBhIHBheSB0cmFuc2FjdGlvbgoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBhZGRQb29sKHBheSx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCkKCWNhbGxzdWIgYWRkUG9vbAoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFBvb2wobWJyUGF5bWVudDogUGF5VHhuLCB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBub2RlTnVtOiB1aW50NjQpOiBWYWxpZGF0b3JQb29sS2V5Ci8vCi8vIEFkZHMgYSBuZXcgcG9vbCB0byBhIHZhbGlkYXRvcidzIHBvb2wgc2V0LCByZXR1cm5pbmcgdGhlICdrZXknIHRvIHJlZmVyZW5jZSB0aGUgcG9vbCBpbiB0aGUgZnV0dXJlIGZvciBzdGFraW5nLCBldGMuCi8vIFRoZSBjYWxsZXIgbXVzdCBwYXkgdGhlIGNvc3Qgb2YgdGhlIHZhbGlkYXRvcnMgTUJSIGluY3JlYXNlIGFzIHdlbGwgYXMgdGhlIE1CUiB0aGF0IHdpbGwgYmUgbmVlZGVkIGZvciB0aGUgcG9vbCBpdHNlbGYuCi8vCi8vIFsgT05MWSBPV05FUiBPUiBNQU5BR0VSIENBTiBjYWxsIF0KLy8gQHBhcmFtIHtQYXlUeG59IG1iclBheW1lbnQgcGF5bWVudCBmcm9tIGNhbGxlciB3aGljaCBjb3ZlcnMgbWJyIGluY3JlYXNlIG9mIGFkZGluZyBhIG5ldyBwb29sCi8vIEBwYXJhbSB7dWludDY0fSB2YWxpZGF0b3JJZCBpcyBpZCBvZiB2YWxpZGF0b3IgdG8gcG9vbCB0byAobXVzdCBiZSBvd25lciBvciBtYW5hZ2VyKQovLyBAcGFyYW0ge3VpbnQ2NH0gbm9kZU51bSBpcyBub2RlIG51bWJlciB0byBhZGQgdG8KLy8gQHJldHVybnMge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2wga2V5IHRvIGNyZWF0ZWQgcG9vbAphZGRQb29sOgoJcHJvdG8gMyAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ0NwoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lck9yTWFuYWdlcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyT3JNYW5hZ2VyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDUwCgkvLyB2ZXJpZnlQYXlUeG4obWJyUGF5bWVudCwgeyByZWNlaXZlcjogdGhpcy5hcHAuYWRkcmVzcywgYW1vdW50OiB0aGlzLmdldE1ickFtb3VudHMoKS5hZGRQb29sTWJyIH0pCgkvLyB2ZXJpZnkgcmVjZWl2ZXIKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIFJlY2VpdmVyCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6InJlY2VpdmVyIiwiZXhwZWN0ZWQiOiJ0aGlzLmFwcC5hZGRyZXNzIn0KCWFzc2VydAoKCS8vIHZlcmlmeSBhbW91bnQKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCglleHRyYWN0IDggOAoJYnRvaQoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6ImFtb3VudCIsImV4cGVjdGVkIjoidGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkUG9vbE1iciJ9Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NTIKCS8vIGFzc2VydCh0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLmV4aXN0cywgInNwZWNpZmllZCB2YWxpZGF0b3IgaWQgaXNuJ3QgdmFsaWQiKQoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJYm94X2xlbgoJc3dhcAoJcG9wCgoJLy8gc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBpc24ndCB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDU0CgkvLyBudW1Qb29sczogdWludDY0ID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyBhcyB1aW50NjQKCWludCAyNDIKCWludCAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIG51bVBvb2xzOiB1aW50NjQKCgkvLyAqaWY5X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDU1CgkvLyAobnVtUG9vbHMgYXMgdWludDY0KSA+PSBNQVhfUE9PTFMKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWludCAyNAoJPj0KCWJ6ICppZjlfZW5kCgoJLy8gKmlmOV9jb25zZXF1ZW50CgkvLyBhbHJlYWR5IGF0IG1heCBwb29sIHNpemUKCWVycgoKKmlmOV9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NTgKCS8vIG51bVBvb2xzICs9IDEKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ2MQoJLy8gc2VuZEFwcENhbGwoewoJLy8gICAgICAgICAgICAgb25Db21wbGV0aW9uOiBPbkNvbXBsZXRpb24uTm9PcCwKCS8vICAgICAgICAgICAgIGFwcHJvdmFsUHJvZ3JhbTogWwoJLy8gICAgICAgICAgICAgICAgIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uZXh0cmFjdCgwLCA0MDk2KSwKCS8vICAgICAgICAgICAgICAgICB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLmV4dHJhY3QoNDA5NiwgdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5zaXplIC0gNDA5NiksCgkvLyAgICAgICAgICAgICBdLAoJLy8gICAgICAgICAgICAgY2xlYXJTdGF0ZVByb2dyYW06IFN0YWtpbmdQb29sLmNsZWFyUHJvZ3JhbSgpLAoJLy8gICAgICAgICAgICAgZ2xvYmFsTnVtVWludDogU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1VaW50LAoJLy8gICAgICAgICAgICAgZ2xvYmFsTnVtQnl0ZVNsaWNlOiBTdGFraW5nUG9vbC5zY2hlbWEuZ2xvYmFsLm51bUJ5dGVTbGljZSwKCS8vICAgICAgICAgICAgIGV4dHJhUHJvZ3JhbVBhZ2VzOiAzLAoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25BcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gY3JlYXRpbmdDb250cmFjdElELCB2YWxpZGF0b3JJZCwgcG9vbElkLCBtaW5FbnRyeVN0YWtlCgkvLyAgICAgICAgICAgICAgICAgbWV0aG9kKCdjcmVhdGVBcHBsaWNhdGlvbih1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCcpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodGhpcy5hcHAuaWQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodmFsaWRhdG9ySWQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IobnVtUG9vbHMgYXMgdWludDY0KSwKCS8vICAgICAgICAgICAgICAgICBpdG9iKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1pbkVudHJ5U3Rha2UpLAoJLy8gICAgICAgICAgICAgXSwKCS8vICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDYyCgkvLyBvbkNvbXBsZXRpb246IE9uQ29tcGxldGlvbi5Ob09wCglpbnQgMCAvLyBOb09wCglpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ2MwoJLy8gYXBwcm92YWxQcm9ncmFtOiBbCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5leHRyYWN0KDAsIDQwOTYpLAoJLy8gICAgICAgICAgICAgICAgIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uZXh0cmFjdCg0MDk2LCB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLnNpemUgLSA0MDk2KSwKCS8vICAgICAgICAgICAgIF0KCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWludCAwCglpbnQgNDA5NgoJYm94X2V4dHJhY3QKCWl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWludCA0MDk2CglieXRlIDB4NzA2ZjZmNmM1NDY1NmQ3MDZjNjE3NDY1NDE3MDcwNzI2Zjc2NjE2YzQyNzk3NDY1NzMgLy8gInBvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMiCglib3hfbGVuCgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLnNpemUKCWFzc2VydAoJaW50IDQwOTYKCS0KCWJveF9leHRyYWN0CglpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDY3CgkvLyBjbGVhclN0YXRlUHJvZ3JhbTogU3Rha2luZ1Bvb2wuY2xlYXJQcm9ncmFtKCkKCWJ5dGUgYjY0IEN3PT0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NjgKCS8vIGdsb2JhbE51bVVpbnQ6IFN0YWtpbmdQb29sLnNjaGVtYS5nbG9iYWwubnVtVWludAoJaW50IDExCglpdHhuX2ZpZWxkIEdsb2JhbE51bVVpbnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NjkKCS8vIGdsb2JhbE51bUJ5dGVTbGljZTogU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1CeXRlU2xpY2UKCWludCAzCglpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ3MAoJLy8gZXh0cmFQcm9ncmFtUGFnZXM6IDMKCWludCAzCglpdHhuX2ZpZWxkIEV4dHJhUHJvZ3JhbVBhZ2VzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDcxCgkvLyBhcHBsaWNhdGlvbkFyZ3M6IFsKCS8vICAgICAgICAgICAgICAgICAvLyBjcmVhdGluZ0NvbnRyYWN0SUQsIHZhbGlkYXRvcklkLCBwb29sSWQsIG1pbkVudHJ5U3Rha2UKCS8vICAgICAgICAgICAgICAgICBtZXRob2QoJ2NyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkJyksCgkvLyAgICAgICAgICAgICAgICAgaXRvYih0aGlzLmFwcC5pZCksCgkvLyAgICAgICAgICAgICAgICAgaXRvYih2YWxpZGF0b3JJZCksCgkvLyAgICAgICAgICAgICAgICAgaXRvYihudW1Qb29scyBhcyB1aW50NjQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWluRW50cnlTdGFrZSksCgkvLyAgICAgICAgICAgICBdCgltZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCXR4bmEgQXBwbGljYXRpb25zIDAKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglpbnQgMjA5CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ4MQoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyA9IG51bVBvb2xzIGFzIHVpbnQxNgoJaW50IDI0MgoJZnJhbWVfZGlnIDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoJaXRvYgoJZXh0cmFjdCA2IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDg0CgkvLyBwb29sQXBwSWQgPSB0aGlzLml0eG4uY3JlYXRlZEFwcGxpY2F0aW9uSUQuaWQKCWl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKCWZyYW1lX2J1cnkgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ4NQoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1tudW1Qb29scyAtIDFdLnBvb2xBcHBJZCA9IHBvb2xBcHBJZAoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgMCAvLyBudW1Qb29sczogdWludDY0CglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0ODYKCS8vIHRoaXMuYWRkUG9vbFRvTm9kZSh2YWxpZGF0b3JJZCwgcG9vbEFwcElkLCBub2RlTnVtKQoJZnJhbWVfZGlnIC0zIC8vIG5vZGVOdW06IHVpbnQ2NAoJZnJhbWVfZGlnIDEgLy8gcG9vbEFwcElkOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGFkZFBvb2xUb05vZGUKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0ODgKCS8vIHRoaXMucmV0aU9QX3ZhbGlkYXRvckFkZGVkUG9vbC5sb2coewoJLy8gICAgICAgICAgICAgaWQ6IHZhbGlkYXRvcklkLAoJLy8gICAgICAgICAgICAgbnVtOiBudW1Qb29scyBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKSwKCS8vICAgICAgICAgfSkKCWJ5dGUgMHhmYmNjMGY2YiAvLyByZXRpT1BfdmFsaWRhdG9yQWRkZWRQb29sKHVpbnQ2NCx1aW50MTYsdWludDY0KQoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWl0b2IKCWR1cAoJYml0bGVuCglpbnQgMTYKCTw9CgoJLy8gbnVtUG9vbHMgYXMgdWludDE2IG92ZXJmbG93ZWQgMTYgYml0cwoJYXNzZXJ0CglleHRyYWN0IDYgMgoJY29uY2F0CglmcmFtZV9kaWcgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cgljb25jYXQKCWxvZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ5NAoJLy8gcmV0dXJuIHsgaWQ6IHZhbGlkYXRvcklkLCBwb29sSWQ6IG51bVBvb2xzIGFzIHVpbnQ2NCwgcG9vbEFwcElkOiB0aGlzLml0eG4hLmNyZWF0ZWRBcHBsaWNhdGlvbklELmlkIH0KCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCglmcmFtZV9kaWcgMCAvLyBudW1Qb29sczogdWludDY0CglpdG9iCgljb25jYXQKCWl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKCWl0b2IKCWNvbmNhdAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDEKCXJldHN1YgoKLy8gYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KQoqYWJpX3JvdXRlX2FkZFN0YWtlOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gc3Rha2VkQW1vdW50UGF5bWVudDogcGF5Cgl0eG4gR3JvdXBJbmRleAoJaW50IDEKCS0KCWR1cAoJZ3R4bnMgVHlwZUVudW0KCWludCBwYXkKCT09CgoJLy8gYXJndW1lbnQgMiAoc3Rha2VkQW1vdW50UGF5bWVudCkgZm9yIGFkZFN0YWtlIG11c3QgYmUgYSBwYXkgdHJhbnNhY3Rpb24KCWFzc2VydAoKCS8vIGV4ZWN1dGUgYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBhZGRTdGFrZQoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFN0YWtlKHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4biwgdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgdmFsdWVUb1ZlcmlmeTogdWludDY0KTogVmFsaWRhdG9yUG9vbEtleQovLwovLyBBZGRzIHN0YWtlIHRvIGEgdmFsaWRhdG9yIHBvb2wuCi8vCi8vIEBwYXJhbSB7UGF5VHhufSBzdGFrZWRBbW91bnRQYXltZW50IC0gcGF5bWVudCBjb21pbmcgZnJvbSBzdGFrZXIgdG8gcGxhY2UgaW50byBhIHBvb2wKLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWx1ZVRvVmVyaWZ5IC0gb25seSBpZiB2YWxpZGF0b3IgaGFzIGdhdGluZyB0byBlbnRlciAtIHRoaXMgaXMgYXNzZXQgaWQgb3IgbmZkIGlkIHRoYXQgY29ycmVzcG9uZHMgdG8gZ2F0aW5nLgovLyBUeG4gc2VuZGVyIGlzIGZhY3RvcmVkIGluIGFzIHdlbGwgaWYgdGhhdCBpcyBwYXJ0IG9mIGdhdGluZy4KLy8gKiBAcmV0dXJucyB7VmFsaWRhdG9yUG9vbEtleX0gLSBUaGUga2V5IG9mIHRoZSB2YWxpZGF0b3IgcG9vbC4KYWRkU3Rha2U6Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA1CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTA3CgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS5leGlzdHMsICJzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGlzbid0IHZhbGlkIikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoKCS8vIHNwZWNpZmllZCB2YWxpZGF0b3IgaWQgaXNuJ3QgdmFsaWQKCWFzc2VydAoKCS8vICppZjEwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTEwCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5zdW5zZXR0aW5nT24gPiAwCglpbnQgMjI2CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWludCAwCgk+CglieiAqaWYxMF9lbmQKCgkvLyAqaWYxMF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MTIKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5zdW5zZXR0aW5nT24gPiBnbG9iYWxzLmxhdGVzdFRpbWVzdGFtcCwKCS8vICAgICAgICAgICAgICAgICAiY2FuJ3Qgc3Rha2Ugd2l0aCBhIHZhbGlkYXRvciB0aGF0IGlzIHBhc3QgaXRzIHN1bnNldHRpbmcgdGltZSIsCgkvLyAgICAgICAgICAgICApCglpbnQgMjI2CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKCT4KCgkvLyBjYW4ndCBzdGFrZSB3aXRoIGEgdmFsaWRhdG9yIHRoYXQgaXMgcGFzdCBpdHMgc3Vuc2V0dGluZyB0aW1lCglhc3NlcnQKCippZjEwX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUxOAoJLy8gc3Rha2VyID0gdGhpcy50eG4uc2VuZGVyCgl0eG4gU2VuZGVyCglmcmFtZV9idXJ5IDAgLy8gc3Rha2VyOiBhZGRyZXNzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTIyCgkvLyB2ZXJpZnlQYXlUeG4oc3Rha2VkQW1vdW50UGF5bWVudCwgewoJLy8gICAgICAgICAgICAgc2VuZGVyOiBzdGFrZXIsCgkvLyAgICAgICAgICAgICByZWNlaXZlcjogdGhpcy5hcHAuYWRkcmVzcywKCS8vICAgICAgICAgfSkKCS8vIHZlcmlmeSBzZW5kZXIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIFNlbmRlcgoJZnJhbWVfZGlnIDAgLy8gc3Rha2VyOiBhZGRyZXNzCgk9PQoKCS8vIHRyYW5zYWN0aW9uIHZlcmlmaWNhdGlvbiBmYWlsZWQ6IHsidHhuIjoic3Rha2VkQW1vdW50UGF5bWVudCIsImZpZWxkIjoic2VuZGVyIiwiZXhwZWN0ZWQiOiJzdGFrZXIifQoJYXNzZXJ0CgoJLy8gdmVyaWZ5IHJlY2VpdmVyCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBSZWNlaXZlcgoJZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCT09CgoJLy8gdHJhbnNhY3Rpb24gdmVyaWZpY2F0aW9uIGZhaWxlZDogeyJ0eG4iOiJzdGFrZWRBbW91bnRQYXltZW50IiwiZmllbGQiOiJyZWNlaXZlciIsImV4cGVjdGVkIjoidGhpcy5hcHAuYWRkcmVzcyJ9Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzAKCS8vIHRoaXMuZG9lc1N0YWtlck1lZXRHYXRpbmcodmFsaWRhdG9ySWQsIHZhbHVlVG9WZXJpZnkpCglmcmFtZV9kaWcgLTMgLy8gdmFsdWVUb1ZlcmlmeTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBkb2VzU3Rha2VyTWVldEdhdGluZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUzMgoJLy8gcmVhbEFtb3VudCA9IHN0YWtlZEFtb3VudFBheW1lbnQuYW1vdW50CglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBBbW91bnQKCWZyYW1lX2J1cnkgMSAvLyByZWFsQW1vdW50OiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzMKCS8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NCA9IDAKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gbWJyQW10TGVmdEJlaGluZDogdWludDY0CgoJLy8gKmlmMTFfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzUKCS8vIHRoaXMuZG9lc1N0YWtlck5lZWRUb1BheU1CUihzdGFrZXIpCglmcmFtZV9kaWcgMCAvLyBzdGFrZXI6IGFkZHJlc3MKCWNhbGxzdWIgZG9lc1N0YWtlck5lZWRUb1BheU1CUgoJYnogKmlmMTFfZW5kCgoJLy8gKmlmMTFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTM4CgkvLyBtYnJBbXRMZWZ0QmVoaW5kID0gdGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkU3Rha2VyTWJyCgljYWxsc3ViIGdldE1ickFtb3VudHMKCWV4dHJhY3QgMjQgOAoJYnRvaQoJZnJhbWVfYnVyeSAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUzOQoJLy8gcmVhbEFtb3VudCAtPSBtYnJBbXRMZWZ0QmVoaW5kCglmcmFtZV9kaWcgMSAvLyByZWFsQW1vdW50OiB1aW50NjQKCWZyYW1lX2RpZyAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoJLQoJZnJhbWVfYnVyeSAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU0MAoJLy8gdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikuY3JlYXRlKCkKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAwIC8vIHN0YWtlcjogYWRkcmVzcwoJY29uY2F0CglpbnQgMTQ0Cglib3hfY3JlYXRlCglwb3AKCippZjExX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU0NAoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS50b3RhbEFsZ29TdGFrZWQgKyByZWFsQW1vdW50IDwgdGhpcy5tYXhBbGxvd2VkU3Rha2UoKSwKCS8vICAgICAgICAgICAgICd0b3RhbCBzdGFrZWQgZm9yIGFsbCBvZiBhIHZhbGlkYXRvcnMgcG9vbHMgbWF5IG5vdCBleGNlZWQgaGFyZCBjYXAnLAoJLy8gICAgICAgICApCglpbnQgMjUyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoJKwoJY2FsbHN1YiBtYXhBbGxvd2VkU3Rha2UKCTwKCgkvLyB0b3RhbCBzdGFrZWQgZm9yIGFsbCBvZiBhIHZhbGlkYXRvcnMgcG9vbHMgbWF5IG5vdCBleGNlZWQgaGFyZCBjYXAKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU1MQoJLy8gZmluZFJldCA9IHRoaXMuZmluZFBvb2xGb3JTdGFrZXIodmFsaWRhdG9ySWQsIHN0YWtlciwgcmVhbEFtb3VudCkKCWZyYW1lX2RpZyAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoJZnJhbWVfZGlnIDAgLy8gc3Rha2VyOiBhZGRyZXNzCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBmaW5kUG9vbEZvclN0YWtlcgoJZnJhbWVfYnVyeSAzIC8vIGZpbmRSZXQ6ICgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NTIKCS8vIHBvb2xLZXkgPSBmaW5kUmV0WzBdCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NTMKCS8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IgPSBmaW5kUmV0WzFdCglmcmFtZV9kaWcgMyAvLyBmaW5kUmV0OiAoKHVpbnQ2NCx1aW50NjQsdWludDY0KSxib29sLGJvb2wpCglzdG9yZSAyNTUgLy8gZnVsbCBhcnJheQoJbG9hZCAyNTUgLy8gZnVsbCBhcnJheQoJaW50IDE5MgoJZ2V0Yml0CglmcmFtZV9idXJ5IDQgLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU1NAoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sID0gZmluZFJldFsyXQoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWludCAxOTMKCWdldGJpdAoJZnJhbWVfYnVyeSA1IC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoKCS8vICppZjEyX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTU1CgkvLyBwb29sS2V5LnBvb2xJZCA9PT0gMAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMAoJPT0KCWJ6ICppZjEyX2VuZAoKCS8vICppZjEyX2NvbnNlcXVlbnQKCS8vIE5vIHBvb2wgYXZhaWxhYmxlIHdpdGggZnJlZSBzdGFrZS4gIFZhbGlkYXRvciBuZWVkcyB0byBhZGQgYW5vdGhlciBwb29sCgllcnIKCippZjEyX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU2MAoJLy8gdGhpcy51cGRhdGVTdGFrZXJQb29sU2V0KHN0YWtlciwgcG9vbEtleSkKCWZyYW1lX2RpZyAzIC8vIGZpbmRSZXQ6ICgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKCXN0b3JlIDI1NSAvLyBmdWxsIGFycmF5Cglsb2FkIDI1NSAvLyBmdWxsIGFycmF5CglleHRyYWN0IDAgMjQKCWZyYW1lX2RpZyAwIC8vIHN0YWtlcjogYWRkcmVzcwoJY2FsbHN1YiB1cGRhdGVTdGFrZXJQb29sU2V0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTYzCgkvLyB0aGlzLmNhbGxQb29sQWRkU3Rha2UoCgkvLyAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LAoJLy8gICAgICAgICAgICAgcG9vbEtleSwKCS8vICAgICAgICAgICAgIG1ickFtdExlZnRCZWhpbmQsCgkvLyAgICAgICAgICAgICBpc05ld1N0YWtlclRvVmFsaWRhdG9yLAoJLy8gICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1Byb3RvY29sLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgNSAvLyBpc05ld1N0YWtlclRvUHJvdG9jb2w6IGJvb2wKCWZyYW1lX2RpZyA0IC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCWZyYW1lX2RpZyAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMCAyNAoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4bgoJY2FsbHN1YiBjYWxsUG9vbEFkZFN0YWtlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTcwCgkvLyB0aGlzLnJldGlPUF9zdGFrZUFkZGVkLmxvZyh7CgkvLyAgICAgICAgICAgICBpZDogdmFsaWRhdG9ySWQsCgkvLyAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLAoJLy8gICAgICAgICAgICAgYW1vdW50U3Rha2VkOiByZWFsQW1vdW50LAoJLy8gICAgICAgICAgICAgc3Rha2VyOiBzdGFrZXIsCgkvLyAgICAgICAgIH0pCglieXRlIDB4OTYyYjQxNDMgLy8gcmV0aU9QX3N0YWtlQWRkZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQpCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgMCAvLyBzdGFrZXI6IGFkZHJlc3MKCWNvbmNhdAoJZnJhbWVfZGlnIDEgLy8gcmVhbEFtb3VudDogdWludDY0CglpdG9iCgljb25jYXQKCWNvbmNhdAoJbG9nCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTc4CgkvLyByZXR1cm4gcG9vbEtleQoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMCAyNAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDUKCXJldHN1YgoKLy8gc2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KQoqYWJpX3JvdXRlX3NldFRva2VuUGF5b3V0UmF0aW86CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIHNldFRva2VuUGF5b3V0UmF0aW8odWludDY0KSh1aW50NjRbMjRdLHVpbnQ2NCkKCWNhbGxzdWIgc2V0VG9rZW5QYXlvdXRSYXRpbwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIHNldFRva2VuUGF5b3V0UmF0aW8odmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IFBvb2xUb2tlblBheW91dFJhdGlvCi8vCi8vIHNldFRva2VuUGF5b3V0UmF0aW8gaXMgY2FsbGVkIGJ5IFN0YWtpbmcgUG9vbCAjIDEgKE9OTFkpIHRvIGFzayB0aGUgdmFsaWRhdG9yICh1cykgdG8gY2FsY3VsYXRlIHRoZSByYXRpb3MKLy8gb2Ygc3Rha2UgaW4gdGhlIHBvb2xzIGZvciBzdWJzZXF1ZW50IHRva2VuIHBheW91dHMgKGllOiAyIHBvb2xzLCAnMTAwJyBhbGdvIHRvdGFsIHN0YWtlZCwgNjAgaW4gcG9vbCAxLCBhbmQgNDAKLy8gaW4gcG9vbCAyKSAgVGhpcyBpcyBkb25lIHNvIHdlIGhhdmUgYSBzdGFibGUgc25hcHNob3Qgb2Ygc3Rha2UgLSB0YWtlbiBvbmNlIHBlciBlcG9jaCAtIG9ubHkgdHJpZ2dlcmVkIGJ5Ci8vIHBvb2wgMSBkb2luZyBwYXlvdXQuICBwb29scyBvdGhlciB0aGFuIDEgZG9pbmcgcGF5b3V0IGNhbGwgcG9vbCAxIHRvIGFzayBpdCBkbyBpdCBmaXJzdC4KLy8gSXQgd291bGQgYmUgNjAvNDAlIGluIHRoZSBwb29sUGN0T2ZXaG9sZSB2YWx1ZXMuICBUaGUgdG9rZW4gcmV3YXJkIHBheW91dHMgdGhlbiB1c2UgdGhlc2UgdmFsdWVzIGluc3RlYWQgb2YKLy8gdGhlaXIgJ2N1cnJlbnQnIHN0YWtlIHdoaWNoIGNoYW5nZXMgYXMgcGFydCBvZiB0aGUgcGF5b3V0cyB0aGVtc2VsdmVzIChhbmQgcGVvcGxlIGNvdWxkIGJlIGNoYW5naW5nIHN0YWtlCi8vIGR1cmluZyB0aGUgZXBvY2ggdXBkYXRlcyBhY3Jvc3MgcG9vbHMpCi8vCi8vIE11bHRpcGxlIHBvb2xzIHdpbGwgY2FsbCB1cyB2aWEgcG9vbCAxIChwb29sMi0+cG9vbDEtPnZhbGlkYXRvciwgZXRjLikgc28gZG9uJ3QgYXNzZXJ0IG9uIHBvb2wxIGNhbGxpbmcgbXVsdGlwbGUKLy8gdGltZXMgaW4gc2FtZSBlcG9jaC4gIEp1c3QgcmV0dXJuLgovLwovLyBAcGFyYW0gdmFsaWRhdG9ySWQgLSB2YWxpZGF0b3IgaWQgKGFuZCB0aHVzIHBvb2wpIGNhbGxpbmcgdXMuICBWZXJpZmllZCBzbyB0aGF0IHNlbmRlciBNVVNUIGJlIHBvb2wgMSBvZiB0aGlzIHZhbGlkYXRvci4KLy8gQHJldHVybnMgUG9vbFRva2VuUGF5b3V0UmF0aW8gLSB0aGUgZmluaXNoZWQgcmF0aW8gZGF0YQpzZXRUb2tlblBheW91dFJhdGlvOgoJcHJvdG8gMSAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gOAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU5OAoJLy8gcG9vbDFBcHBJRCA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkCglpbnQgMjY4CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMCAvLyBwb29sMUFwcElEOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1OTkKCS8vIGFzc2VydChwb29sMUFwcElEICE9PSAwKQoJZnJhbWVfZGlnIDAgLy8gcG9vbDFBcHBJRDogdWludDY0CglpbnQgMAoJIT0KCWFzc2VydAoKCS8vICppZjEzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjAxCgkvLyB0aGlzLnR4bi5zZW5kZXIgIT09IEFwcElELmZyb21VaW50NjQocG9vbDFBcHBJRCkuYWRkcmVzcwoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIDAgLy8gcG9vbDFBcHBJRDogdWludDY0CglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCSE9CglieiAqaWYxM19lbmQKCgkvLyAqaWYxM19jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MDIKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWIgKnNldFRva2VuUGF5b3V0UmF0aW8qcmV0dXJuCgoqaWYxM19lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MDgKCS8vIGN1clJvdW5kID0gZ2xvYmFscy5yb3VuZAoJZ2xvYmFsIFJvdW5kCglmcmFtZV9idXJ5IDEgLy8gY3VyUm91bmQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYwOQoJLy8gbGFzdFBheW91dFVwZGF0ZSA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUudG9rZW5QYXlvdXRSYXRpby51cGRhdGVkRm9yUGF5b3V0CglpbnQgODkyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCgkvLyAqaWYxNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYxMAoJLy8gbGFzdFBheW91dFVwZGF0ZSAhPT0gMAoJZnJhbWVfZGlnIDIgLy8gbGFzdFBheW91dFVwZGF0ZTogdWludDY0CglpbnQgMAoJIT0KCWJ6ICppZjE0X2VuZAoKCS8vICppZjE0X2NvbnNlcXVlbnQKCS8vICppZjE1X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjEyCgkvLyAoQXBwSUQuZnJvbVVpbnQ2NChwb29sMUFwcElEKS5nbG9iYWxTdGF0ZSgnbGFzdFBheW91dCcpIGFzIHVpbnQ2NCkgPT09IGxhc3RQYXlvdXRVcGRhdGUKCWZyYW1lX2RpZyAwIC8vIHBvb2wxQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDZjNjE3Mzc0NTA2MTc5NmY3NTc0IC8vICJsYXN0UGF5b3V0IgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQocG9vbDFBcHBJRCkuZ2xvYmFsU3RhdGUoJ2xhc3RQYXlvdXQnKQoJYXNzZXJ0CglmcmFtZV9kaWcgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCT09CglieiAqaWYxNV9lbmQKCgkvLyAqaWYxNV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MTMKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWIgKnNldFRva2VuUGF5b3V0UmF0aW8qcmV0dXJuCgoqaWYxNV9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MTUKCS8vIGVwb2NoUm91bmRMZW5ndGggPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lcG9jaFJvdW5kTGVuZ3RoIGFzIHVpbnQ2NAoJaW50IDE2OQoJaW50IDQKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDMgLy8gZXBvY2hSb3VuZExlbmd0aDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjE2CgkvLyB0aGlzRXBvY2hCZWdpbiA9IGN1clJvdW5kIC0gKGN1clJvdW5kICUgZXBvY2hSb3VuZExlbmd0aCkKCWZyYW1lX2RpZyAxIC8vIGN1clJvdW5kOiB1aW50NjQKCWZyYW1lX2RpZyAxIC8vIGN1clJvdW5kOiB1aW50NjQKCWZyYW1lX2RpZyAzIC8vIGVwb2NoUm91bmRMZW5ndGg6IHVpbnQ2NAoJJQoJLQoJZnJhbWVfYnVyeSA0IC8vIHRoaXNFcG9jaEJlZ2luOiB1aW50NjQKCgkvLyAqaWYxNl9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYxOAoJLy8gbGFzdFBheW91dFVwZGF0ZSAtIChsYXN0UGF5b3V0VXBkYXRlICUgZXBvY2hSb3VuZExlbmd0aCkgPT09IHRoaXNFcG9jaEJlZ2luCglmcmFtZV9kaWcgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCWZyYW1lX2RpZyAyIC8vIGxhc3RQYXlvdXRVcGRhdGU6IHVpbnQ2NAoJZnJhbWVfZGlnIDMgLy8gZXBvY2hSb3VuZExlbmd0aDogdWludDY0CgklCgktCglmcmFtZV9kaWcgNCAvLyB0aGlzRXBvY2hCZWdpbjogdWludDY0Cgk9PQoJYnogKmlmMTZfZW5kCgoJLy8gKmlmMTZfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjE5CgkvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS50b2tlblBheW91dFJhdGlvCglpbnQgNzAwIC8vIGhlYWRPZmZzZXQKCWludCAyMDAKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CgliICpzZXRUb2tlblBheW91dFJhdGlvKnJldHVybgoKKmlmMTZfZW5kOgoKKmlmMTRfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjIyCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8udXBkYXRlZEZvclBheW91dCA9IGN1clJvdW5kCglpbnQgODkyCglmcmFtZV9kaWcgMSAvLyBjdXJSb3VuZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYyNAoJLy8gY3VyTnVtUG9vbHMgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnN0YXRlLm51bVBvb2xzIGFzIHVpbnQ2NAoJaW50IDI0MgoJaW50IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDUgLy8gY3VyTnVtUG9vbHM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYyNQoJLy8gdG90YWxTdGFrZUZvclZhbGlkYXRvciA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUudG90YWxBbGdvU3Rha2VkCglpbnQgMjUyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgNiAvLyB0b3RhbFN0YWtlRm9yVmFsaWRhdG9yOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MjYKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgY3VyTnVtUG9vbHM7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDcgLy8gaTogdWludDY0CgoqZm9yXzI6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MjYKCS8vIGkgPCBjdXJOdW1Qb29scwoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglmcmFtZV9kaWcgNSAvLyBjdXJOdW1Qb29sczogdWludDY0Cgk8CglieiAqZm9yXzJfZW5kCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjMxCgkvLyBvdXJQb29sUGN0T2ZXaG9sZSA9IHdpZGVSYXRpbygKCS8vICAgICAgICAgICAgICAgICBbdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1tpXS50b3RhbEFsZ29TdGFrZWQsIDFfMDAwXzAwMF0sCgkvLyAgICAgICAgICAgICAgICAgW3RvdGFsU3Rha2VGb3JWYWxpZGF0b3JdLAoJLy8gICAgICAgICAgICAgKQoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglpbnQgMV8wMDBfMDAwCgltdWx3CglpbnQgMAoJZnJhbWVfZGlnIDYgLy8gdG90YWxTdGFrZUZvclZhbGlkYXRvcjogdWludDY0CglkaXZtb2R3Cglwb3AKCXBvcAoJc3dhcAoJIQoKCS8vIHdpZGVSYXRpbyBmYWlsZWQKCWFzc2VydAoJZnJhbWVfYnVyeSA4IC8vIG91clBvb2xQY3RPZldob2xlOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MzUKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUudG9rZW5QYXlvdXRSYXRpby5wb29sUGN0T2ZXaG9sZVtpXSA9IG91clBvb2xQY3RPZldob2xlCglpbnQgNzAwCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWZyYW1lX2RpZyA4IC8vIG91clBvb2xQY3RPZldob2xlOiB1aW50NjQKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoqZm9yXzJfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MjYKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSA3IC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzIKCipmb3JfMl9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MzcKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCipzZXRUb2tlblBheW91dFJhdGlvKnJldHVybjoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDgKCXJldHN1YgoKLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcygodWludDY0LHVpbnQ2NCx1aW50NjQpLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkCiphYmlfcm91dGVfc3Rha2VVcGRhdGVkVmlhUmV3YXJkczoKCS8vIHNhdHVyYXRlZEJ1cm5Ub0ZlZVNpbms6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQoJYnRvaQoKCS8vIHZhbGlkYXRvckNvbW1pc3Npb246IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAoJYnRvaQoKCS8vIHJld2FyZFRva2VuQW1vdW50UmVzZXJ2ZWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwoJYnRvaQoKCS8vIGFsZ29Ub0FkZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglidG9pCgoJLy8gcG9vbEtleTogKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZHVwCglsZW4KCWludCAyNAoJPT0KCgkvLyBhcmd1bWVudCA0IChwb29sS2V5KSBmb3Igc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyBtdXN0IGJlIGEgKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBzdGFrZVVwZGF0ZWRWaWFSZXdhcmRzKCh1aW50NjQsdWludDY0LHVpbnQ2NCksdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKCWNhbGxzdWIgc3Rha2VVcGRhdGVkVmlhUmV3YXJkcwoJaW50IDEKCXJldHVybgoKLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyhwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5LCBhbGdvVG9BZGQ6IHVpbnQ2NCwgcmV3YXJkVG9rZW5BbW91bnRSZXNlcnZlZDogdWludDY0LCB2YWxpZGF0b3JDb21taXNzaW9uOiB1aW50NjQsIHNhdHVyYXRlZEJ1cm5Ub0ZlZVNpbms6IHVpbnQ2NCk6IHZvaWQKLy8KLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyBpcyBjYWxsZWQgYnkgU3Rha2luZyBwb29scyB0byBpbmZvcm0gdGhlIHZhbGlkYXRvciAodXMpIHRoYXQgYSBwYXJ0aWN1bGFyIGFtb3VudCBvZiB0b3RhbAovLyBzdGFrZSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgc3BlY2lmaWVkIHBvb2wuICBUaGlzIGlzIHVzZWQgdG8gdXBkYXRlIHRoZSBzdGF0cyB3ZSBoYXZlIGluIG91ciBQb29sSW5mbyBzdG9yYWdlLgovLyBUaGUgY2FsbGluZyBBcHAgaWQgaXMgdmFsaWRhdGVkIGFnYWluc3Qgb3VyIHBvb2wgbGlzdCBhcyB3ZWxsLgovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBWYWxpZGF0b3JQb29sS2V5IHR5cGUKLy8gQHBhcmFtIHt1aW50NjR9IGFsZ29Ub0FkZCAtIGFtb3VudCB0aGlzIHZhbGlkYXRvcidzIHRvdGFsIHN0YWtlIGluY3JlYXNlZCB2aWEgcmV3YXJkcwovLyBAcGFyYW0ge3VpbnQ2NH0gcmV3YXJkVG9rZW5BbW91bnRSZXNlcnZlZCAtIGFtb3VudCB0aGlzIHZhbGlkYXRvcidzIHRvdGFsIHN0YWtlIGluY3JlYXNlZCB2aWEgcmV3YXJkcyAodGhhdCBzaG91bGQgYmUKLy8gQHBhcmFtIHt1aW50NjR9IHZhbGlkYXRvckNvbW1pc3Npb24gLSB0aGUgY29tbWlzc2lvbiBhbW91bnQgdGhlIHZhbGlkYXRvciB3YXMgcGFpZCwgaWYgYW55Ci8vIEBwYXJhbSB7dWludDY0fSBzYXR1cmF0ZWRCdXJuVG9GZWVTaW5rIC0gaWYgdGhlIHBvb2wgd2FzIGluIHNhdHVyYXRlZCBzdGF0ZSwgdGhlIGFtb3VudCBzZW50IGJhY2sgdG8gdGhlIGZlZSBzaW5rLgovLyBzZWVuIGFzICdhY2NvdW50ZWQgZm9yL3BlbmRpbmcgc3BlbnQnKQpzdGFrZVVwZGF0ZWRWaWFSZXdhcmRzOgoJcHJvdG8gNSAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjU4CgkvLyB0aGlzLnZlcmlmeVBvb2xLZXlDYWxsZXIocG9vbEtleSkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CgljYWxsc3ViIHZlcmlmeVBvb2xLZXlDYWxsZXIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NjEKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCArPSBhbGdvVG9BZGQKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAxMCAvLyBoZWFkT2Zmc2V0CgkrCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NjIKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS50b3RhbEFsZ29TdGFrZWQgKz0gYWxnb1RvQWRkCglpbnQgMjUyCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMiAvLyBhbGdvVG9BZGQ6IHVpbnQ2NAoJKwoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjYzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUucmV3YXJkVG9rZW5IZWxkQmFjayArPSByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkCglpbnQgMjYwCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkOiB1aW50NjQKCSsKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY2NQoJLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgKz0gYWxnb1RvQWRkCglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglhcHBfZ2xvYmFsX2dldAoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CgkrCglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglzd2FwCglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY2OAoJLy8gdGhpcy5yZXZlcmlmeU5GRE93bmVyc2hpcChwb29sS2V5LmlkKQoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCgljYWxsc3ViIHJldmVyaWZ5TkZET3duZXJzaGlwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjcwCgkvLyB0aGlzLnJldGlPUF9lcG9jaFJld2FyZFVwZGF0ZS5sb2coewoJLy8gICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLAoJLy8gICAgICAgICAgICAgYWxnb0FkZGVkOiBhbGdvVG9BZGQsCgkvLyAgICAgICAgICAgICByZXdhcmRUb2tlbkhlbGRCYWNrOiByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkLAoJLy8gICAgICAgICAgICAgc2F0dXJhdGVkQnVyblRvRmVlU2luazogc2F0dXJhdGVkQnVyblRvRmVlU2luaywKCS8vICAgICAgICAgICAgIHZhbGlkYXRvckNvbW1pc3Npb246IHZhbGlkYXRvckNvbW1pc3Npb24sCgkvLyAgICAgICAgIH0pCglieXRlIDB4YjNlNDdjM2QgLy8gcmV0aU9QX2Vwb2NoUmV3YXJkVXBkYXRlKHVpbnQ2NCx1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTQgLy8gdmFsaWRhdG9yQ29tbWlzc2lvbjogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtNSAvLyBzYXR1cmF0ZWRCdXJuVG9GZWVTaW5rOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY29uY2F0Cglsb2cKCXJldHN1YgoKLy8gc3Rha2VSZW1vdmVkKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wpdm9pZAoqYWJpX3JvdXRlX3N0YWtlUmVtb3ZlZDoKCS8vIHN0YWtlclJlbW92ZWQ6IGJvb2wKCXR4bmEgQXBwbGljYXRpb25BcmdzIDUKCWR1cAoJbGVuCglpbnQgMQoJPT0KCgkvLyBhcmd1bWVudCAwIChzdGFrZXJSZW1vdmVkKSBmb3Igc3Rha2VSZW1vdmVkIG11c3QgYmUgYSBib29sCglhc3NlcnQKCWludCAwCglnZXRiaXQKCgkvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDQKCWJ0b2kKCgkvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDMKCWJ0b2kKCgkvLyBzdGFrZXI6IGFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMzIKCT09CgoJLy8gYXJndW1lbnQgMyAoc3Rha2VyKSBmb3Igc3Rha2VSZW1vdmVkIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBwb29sS2V5OiAodWludDY0LHVpbnQ2NCx1aW50NjQpCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDI0Cgk9PQoKCS8vIGFyZ3VtZW50IDQgKHBvb2xLZXkpIGZvciBzdGFrZVJlbW92ZWQgbXVzdCBiZSBhICh1aW50NjQsdWludDY0LHVpbnQ2NCkKCWFzc2VydAoKCS8vIGV4ZWN1dGUgc3Rha2VSZW1vdmVkKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wpdm9pZAoJY2FsbHN1YiBzdGFrZVJlbW92ZWQKCWludCAxCglyZXR1cm4KCi8vIHN0YWtlUmVtb3ZlZChwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5LCBzdGFrZXI6IEFkZHJlc3MsIGFtb3VudFJlbW92ZWQ6IHVpbnQ2NCwgcmV3YXJkUmVtb3ZlZDogdWludDY0LCBzdGFrZXJSZW1vdmVkOiBib29sZWFuKTogdm9pZAovLwovLyBzdGFrZVJlbW92ZWQgaXMgY2FsbGVkIGJ5IFN0YWtpbmcgcG9vbHMgdG8gaW5mb3JtIHRoZSB2YWxpZGF0b3IgKHVzKSB0aGF0IGEgcGFydGljdWxhciBhbW91bnQgb2YgdG90YWwgc3Rha2UgaGFzIGJlZW4gcmVtb3ZlZAovLyBmcm9tIHRoZSBzcGVjaWZpZWQgcG9vbC4gIFRoaXMgaXMgdXNlZCB0byB1cGRhdGUgdGhlIHN0YXRzIHdlIGhhdmUgaW4gb3VyIFBvb2xJbmZvIHN0b3JhZ2UuCi8vIElmIGFueSBhbW91bnQgb2YgcmV3YXJkUmVtb3ZlZCBpcyBzcGVjaWZpZWQsIHRoZW4gdGhhdCBhbW91bnQgb2YgcmV3YXJkIGlzIHNlbnQgdG8gdGhlIHVzZQovLyBUaGUgY2FsbGluZyBBcHAgaWQgaXMgdmFsaWRhdGVkIGFnYWluc3Qgb3VyIHBvb2wgbGlzdCBhcyB3ZWxsLgovLwovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgY2FsbGluZyB1cyBmcm9tIHdoaWNoIHN0YWtlIHdhcyByZW1vdmVkCi8vIEBwYXJhbSB7QWRkcmVzc30gc3Rha2VyCi8vIEBwYXJhbSB7dWludDY0fSBhbW91bnRSZW1vdmVkIC0gYWxnbyBhbW91bnQgcmVtb3ZlZAovLyBAcGFyYW0ge3VpbnQ2NH0gcmV3YXJkUmVtb3ZlZCAtIGlmIGFwcGxpY2FibGUsIGFtb3VudCBvZiB0b2tlbiByZXdhcmQgcmVtb3ZlZCAoYnkgcG9vbCAxIGNhbGxlcikgb3IgVE8gcmVtb3ZlIGFuZCBwYXkgb3V0ICh2aWEgcG9vbCAxIGZyb20gZGlmZmVyZW50IHBvb2wgY2FsbGVyKQovLyBAcGFyYW0ge2Jvb2xlYW59IHN0YWtlclJlbW92ZWQKc3Rha2VSZW1vdmVkOgoJcHJvdG8gNSAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMwoKCS8vICppZjE3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzAwCgkvLyBnbG9iYWxzLm9wY29kZUJ1ZGdldCA8IDMwMAoJZ2xvYmFsIE9wY29kZUJ1ZGdldAoJaW50IDMwMAoJPAoJYnogKmlmMTdfZW5kCgoJLy8gKmlmMTdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzAxCgkvLyBpbmNyZWFzZU9wY29kZUJ1ZGdldCgpCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJaW50IDAKCWl0eG5fZmllbGQgRmVlCglieXRlIGI2NCBDb0VCIC8vICNwcmFnbWEgdmVyc2lvbiAxMDsgaW50IDEKCWR1cAoJaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCWludCBEZWxldGVBcHBsaWNhdGlvbgoJaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KCWl0eG5fc3VibWl0CgoqaWYxN19lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MDMKCS8vIHRoaXMudmVyaWZ5UG9vbEtleUNhbGxlcihwb29sS2V5KQoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWNhbGxzdWIgdmVyaWZ5UG9vbEtleUNhbGxlcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcwNwoJLy8gYXNzZXJ0KGFtb3VudFJlbW92ZWQgPiAwIHx8IHJld2FyZFJlbW92ZWQgPiAwLCAnc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGFsZ28gb3IgcmV3YXJkIHdhcyByZW1vdmVkJykKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWludCAwCgk+CglkdXAKCWJueiAqc2tpcF9vcjIKCWZyYW1lX2RpZyAtNCAvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCWludCAwCgk+Cgl8fAoKKnNraXBfb3IyOgoJLy8gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGFsZ28gb3IgcmV3YXJkIHdhcyByZW1vdmVkCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MTAKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCAtPSBhbW91bnRSZW1vdmVkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxMQoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsQWxnb1N0YWtlZCAtPSBhbW91bnRSZW1vdmVkCglpbnQgMjUyCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxMgoJLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgLT0gYW1vdW50UmVtb3ZlZAoJYnl0ZSAweDczNzQ2MTZiNjU2NCAvLyAic3Rha2VkIgoJYXBwX2dsb2JhbF9nZXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCXN3YXAKCWFwcF9nbG9iYWxfcHV0CgoJLy8gKmlmMThfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MTQKCS8vIHJld2FyZFJlbW92ZWQgPiAwCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CglpbnQgMAoJPgoJYnogKmlmMThfZWxzZQoKCS8vICppZjE4X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxNQoJLy8gcmV3YXJkVG9rZW5JRCA9IHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5jb25maWcucmV3YXJkVG9rZW5JZAoJaW50IDE1MwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIHJld2FyZFRva2VuSUQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxNgoJLy8gYXNzZXJ0KHJld2FyZFRva2VuSUQgIT09IDAsICJyZXdhcmRSZW1vdmVkIGNhbid0IGJlIHNldCBpZiB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIHJld2FyZCB0b2tlbiEiKQoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JRDogdWludDY0CglpbnQgMAoJIT0KCgkvLyByZXdhcmRSZW1vdmVkIGNhbid0IGJlIHNldCBpZiB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIHJld2FyZCB0b2tlbiEKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxNwoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS5yZXdhcmRUb2tlbkhlbGRCYWNrID49IHJld2FyZFJlbW92ZWQsCgkvLyAgICAgICAgICAgICAgICAgJ3Jld2FyZCBiZWluZyByZW1vdmVkIG11c3QgYmUgY292ZXJlZCBieSBob2xkIGJhY2sgYW1vdW50JywKCS8vICAgICAgICAgICAgICkKCWludCAyNjAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtNCAvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCT49CgoJLy8gcmV3YXJkIGJlaW5nIHJlbW92ZWQgbXVzdCBiZSBjb3ZlcmVkIGJ5IGhvbGQgYmFjayBhbW91bnQKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyMwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnJld2FyZFRva2VuSGVsZEJhY2sgLT0gcmV3YXJkUmVtb3ZlZAoJaW50IDI2MAoJZHVwCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CgktCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyAqaWYxOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyOAoJLy8gcG9vbEtleS5wb29sSWQgIT09IDEKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCSE9CglieiAqaWYxOV9lbmQKCgkvLyAqaWYxOV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MjkKCS8vIHNlbmRNZXRob2RDYWxsPHR5cGVvZiBTdGFraW5nUG9vbC5wcm90b3R5cGUucGF5VG9rZW5SZXdhcmQ+KHsKCS8vICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRDogQXBwSUQuZnJvbVVpbnQ2NCh0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJnczogW3N0YWtlciwgcmV3YXJkVG9rZW5JRCwgcmV3YXJkUmVtb3ZlZF0sCgkvLyAgICAgICAgICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgltZXRob2QgInBheVRva2VuUmV3YXJkKGFkZHJlc3MsdWludDY0LHVpbnQ2NCl2b2lkIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MzAKCS8vIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQodGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzWzBdLnBvb2xBcHBJZCkKCWludCAyNjgKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczMQoJLy8gbWV0aG9kQXJnczogW3N0YWtlciwgcmV3YXJkVG9rZW5JRCwgcmV3YXJkUmVtb3ZlZF0KCWZyYW1lX2RpZyAtMiAvLyBzdGFrZXI6IEFkZHJlc3MKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklEOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCippZjE5X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczNAoJLy8gdGhpcy5yZXRpT1Bfc3Rha2VSZW1vdmVkLmxvZyh7CgkvLyAgICAgICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICAgICAgcG9vbE51bTogcG9vbEtleS5wb29sSWQgYXMgdWludDE2LAoJLy8gICAgICAgICAgICAgICAgIHBvb2xBcHBJZDogQXBwSUQuZnJvbVVpbnQ2NChwb29sS2V5LnBvb2xBcHBJZCksCgkvLyAgICAgICAgICAgICAgICAgc3Rha2VyOiBzdGFrZXIsCgkvLyAgICAgICAgICAgICAgICAgYW1vdW50VW5zdGFrZWQ6IGFtb3VudFJlbW92ZWQsCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5Bc3NldElkOiBBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JRCksCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5zUmVjZWl2ZWQ6IHJld2FyZFJlbW92ZWQsCgkvLyAgICAgICAgICAgICB9KQoJYnl0ZSAweDEyZjRiZDRiIC8vIHJldGlPUF9zdGFrZVJlbW92ZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTIgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC00IC8vIHJld2FyZFJlbW92ZWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklEOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWIgKmlmMThfZW5kCgoqaWYxOF9lbHNlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzQ0CgkvLyB0aGlzLnJldGlPUF9zdGFrZVJlbW92ZWQubG9nKHsKCS8vICAgICAgICAgICAgICAgICBpZDogcG9vbEtleS5pZCwKCS8vICAgICAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICAgICAgcG9vbEFwcElkOiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICBzdGFrZXI6IHN0YWtlciwKCS8vICAgICAgICAgICAgICAgICBhbW91bnRVbnN0YWtlZDogYW1vdW50UmVtb3ZlZCwKCS8vICAgICAgICAgICAgICAgICAvLyBubyB0b2tlbnMgcmV3YXJkZWQuLgoJLy8gICAgICAgICAgICAgICAgIHJld2FyZFRva2VuQXNzZXRJZDogQXNzZXRJRC56ZXJvSW5kZXgsCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5zUmVjZWl2ZWQ6IDAsCgkvLyAgICAgICAgICAgICB9KQoJYnl0ZSAweDEyZjRiZDRiIC8vIHJldGlPUF9zdGFrZVJlbW92ZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTIgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAKCWNvbmNhdAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCippZjE4X2VuZDoKCS8vICppZjIwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzU2CgkvLyBzdGFrZXJSZW1vdmVkCglmcmFtZV9kaWcgLTUgLy8gc3Rha2VyUmVtb3ZlZDogYm9vbGVhbgoJYnogKmlmMjBfZW5kCgoJLy8gKmlmMjBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzU4CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbcG9vbEtleS5wb29sSWQgLSAxXS50b3RhbFN0YWtlcnMgLT0gMQoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJaW50IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDEKCS0KCWl0b2IKCWV4dHJhY3QgNiAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NjAKCS8vIHJlbW92ZVJldCA9IHRoaXMucmVtb3ZlRnJvbVN0YWtlclBvb2xTZXQoc3Rha2VyLCA8VmFsaWRhdG9yUG9vbEtleT57CgkvLyAgICAgICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICAgICAgcG9vbElkOiBwb29sS2V5LnBvb2xJZCwKCS8vICAgICAgICAgICAgICAgICBwb29sQXBwSWQ6IHBvb2xLZXkucG9vbEFwcElkLAoJLy8gICAgICAgICAgICAgfSkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY2FsbHN1YiByZW1vdmVGcm9tU3Rha2VyUG9vbFNldAoJZnJhbWVfYnVyeSAxIC8vIHJlbW92ZVJldDogKGJvb2wsYm9vbCkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NjUKCS8vIHN0YWtlck91dE9mVGhpc1ZhbGlkYXRvciA9IHJlbW92ZVJldFswXQoJZnJhbWVfZGlnIDEgLy8gcmVtb3ZlUmV0OiAoYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWludCAwCglnZXRiaXQKCWZyYW1lX2J1cnkgMiAvLyBzdGFrZXJPdXRPZlRoaXNWYWxpZGF0b3I6IGJvb2wKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NjYKCS8vIHN0YWtlck91dE9mUHJvdG9jb2wgPSByZW1vdmVSZXRbMV0KCWZyYW1lX2RpZyAxIC8vIHJlbW92ZVJldDogKGJvb2wsYm9vbCkKCXN0b3JlIDI1NSAvLyBmdWxsIGFycmF5Cglsb2FkIDI1NSAvLyBmdWxsIGFycmF5CglpbnQgMQoJZ2V0Yml0CglmcmFtZV9idXJ5IDMgLy8gc3Rha2VyT3V0T2ZQcm90b2NvbDogYm9vbAoKCS8vICppZjIxX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzY4CgkvLyBzdGFrZXJPdXRPZlRoaXNWYWxpZGF0b3IKCWZyYW1lX2RpZyAyIC8vIHN0YWtlck91dE9mVGhpc1ZhbGlkYXRvcjogYm9vbAoJYnogKmlmMjFfZW5kCgoJLy8gKmlmMjFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzY5CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUudG90YWxTdGFrZXJzIC09IDEKCWludCAyNDQKCWR1cAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDEKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKKmlmMjFfZW5kOgoJLy8gKmlmMjJfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NzIKCS8vIHN0YWtlck91dE9mUHJvdG9jb2wKCWZyYW1lX2RpZyAzIC8vIHN0YWtlck91dE9mUHJvdG9jb2w6IGJvb2wKCWJ6ICppZjIyX2VuZAoKCS8vICppZjIyX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc3MwoJLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlIC09IDEKCWJ5dGUgMHg2ZTc1NmQ1Mzc0NjE2YjY1NzI3MyAvLyAibnVtU3Rha2VycyIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMQoJLQoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJc3dhcAoJYXBwX2dsb2JhbF9wdXQKCippZjIyX2VuZDoKCippZjIwX2VuZDoKCXJldHN1YgoKLy8gZmluZFBvb2xGb3JTdGFrZXIodWludDY0LGFkZHJlc3MsdWludDY0KSgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKKmFiaV9yb3V0ZV9maW5kUG9vbEZvclN0YWtlcjoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gYW1vdW50VG9TdGFrZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglidG9pCgoJLy8gc3Rha2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDEgKHN0YWtlcikgZm9yIGZpbmRQb29sRm9yU3Rha2VyIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBmaW5kUG9vbEZvclN0YWtlcih1aW50NjQsYWRkcmVzcyx1aW50NjQpKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJY2FsbHN1YiBmaW5kUG9vbEZvclN0YWtlcgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGZpbmRQb29sRm9yU3Rha2VyKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIHN0YWtlcjogQWRkcmVzcywgYW1vdW50VG9TdGFrZTogdWludDY0KTogW1ZhbGlkYXRvclBvb2xLZXksIGJvb2xlYW4sIGJvb2xlYW5dCi8vCi8vIEZpbmRzIHRoZSBwb29sIGZvciBhIHN0YWtlciBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgdmFsaWRhdG9yIGlkLCBzdGFrZXIgYWRkcmVzcywgYW5kIGFtb3VudCB0byBzdGFrZS4KLy8gRmlyc3QgY2hlY2tzIHRoZSBzdGFrZXJzICdhbHJlYWR5IHN0YWtlZCBsaXN0JyBmb3IgdGhlIHZhbGlkYXRvciBwcmVmZXJyaW5nIHRob3NlIChhZGRpbmcgaWYgcG9zc2libGUpIHRoZW4gYWRkcwovLyB0byBuZXcgcG9vbCBpZiBuZWNlc3NhcnkuCi8vCi8vIEBwYXJhbSB7VmFsaWRhdG9ySWRUeXBlfSB2YWxpZGF0b3JJZCAtIFRoZSBpZCBvZiB0aGUgdmFsaWRhdG9yLgovLyBAcGFyYW0ge0FkZHJlc3N9IHN0YWtlciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzdGFrZXIuCi8vIEBwYXJhbSB7dWludDY0fSBhbW91bnRUb1N0YWtlIC0gVGhlIGFtb3VudCB0byBzdGFrZS4KLy8gQHJldHVybnMge1ZhbGlkYXRvclBvb2xLZXksIGJvb2xlYW4sIGJvb2xlYW59IC0gVGhlIHBvb2wgZm9yIHRoZSBzdGFrZXIsIHRydWUvZmFsc2Ugb24gd2hldGhlciB0aGUgc3Rha2VyIGlzICduZXcnCi8vIHRvIHRoaXMgVkFMSURBVE9SLCBhbmQgdHJ1ZS9mYWxzZSBpZiBzdGFrZXIgaXMgbmV3IHRvIHRoZSBwcm90b2NvbC4KZmluZFBvb2xGb3JTdGFrZXI6Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA3CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Nzk0CgkvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yID0gdHJ1ZQoJaW50IDEKCWZyYW1lX2J1cnkgMCAvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yOiBib29sCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Nzk1CgkvLyBpc05ld1N0YWtlclRvUHJvdG9jb2wgPSB0cnVlCglpbnQgMQoJZnJhbWVfYnVyeSAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgwMwoJLy8gbWF4UGVyUG9vbCA9IHRoaXMuZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sCglmcmFtZV9idXJ5IDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoJLy8gKmlmMjNfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MDYKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLmV4aXN0cwoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfbGVuCglzd2FwCglwb3AKCWJ6ICppZjIzX2VuZAoKCS8vICppZjIzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgwNwoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgwOAoJLy8gYXNzZXJ0KHZhbGlkYXRvcklkICE9PSAwKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWludCAwCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODA5CgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IHBvb2xTZXQubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoKKmZvcl8zOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODA5CgkvLyBpIDwgcG9vbFNldC5sZW5ndGgKCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDYKCTwKCWJ6ICpmb3JfM19lbmQKCgkvLyAqaWYyNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxMAoJLy8gZ2xvYmFscy5vcGNvZGVCdWRnZXQgPCAzMDAKCWdsb2JhbCBPcGNvZGVCdWRnZXQKCWludCAzMDAKCTwKCWJ6ICppZjI0X2VuZAoKCS8vICppZjI0X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxMQoJLy8gaW5jcmVhc2VPcGNvZGVCdWRnZXQoKQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCWludCAwCglpdHhuX2ZpZWxkIEZlZQoJYnl0ZSBiNjQgQ29FQiAvLyAjcHJhZ21hIHZlcnNpb24gMTA7IGludCAxCglkdXAKCWl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCglpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCglpbnQgRGVsZXRlQXBwbGljYXRpb24KCWl0eG5fZmllbGQgT25Db21wbGV0aW9uCglpdHhuX3N1Ym1pdAoKKmlmMjRfZW5kOgoJLy8gKmlmMjVfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MTMKCS8vIHBvb2xTZXRbaV0uaWQgPT09IDAKCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgk9PQoJYnogKmlmMjVfZW5kCgoJLy8gKmlmMjVfY29uc2VxdWVudAoJYiAqZm9yXzNfY29udGludWUKCippZjI1X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxNgoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sID0gZmFsc2UKCWludCAwCglmcmFtZV9idXJ5IDEgLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sCgoJLy8gKmlmMjZfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MTcKCS8vIHBvb2xTZXRbaV0uaWQgPT09IHZhbGlkYXRvcklkCglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgMAoJKwoJaW50IDgKCWV4dHJhY3QzCglidG9pCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJPT0KCWJ6ICppZjI2X2VuZAoKCS8vICppZjI2X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxOQoJLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciA9IGZhbHNlCglpbnQgMAoJZnJhbWVfYnVyeSAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCgkvLyAqaWYyN19jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyMQoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1twb29sU2V0W2ldLnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCArCgkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50VG9TdGFrZSA8PQoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4UGVyUG9vbAoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgOCAvLyBoZWFkT2Zmc2V0CgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJKwoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8PQoJYnogKmlmMjdfZW5kCgoJLy8gKmlmMjdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODI1CgkvLyByZXR1cm4gW3Bvb2xTZXRbaV0sIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IsIGlzTmV3U3Rha2VyVG9Qcm90b2NvbF0KCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWJ5dGUgMHgwMAoJaW50IDAKCWZyYW1lX2RpZyAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCXNldGJpdAoJaW50IDEKCWZyYW1lX2RpZyAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoJc2V0Yml0Cgljb25jYXQKCWIgKmZpbmRQb29sRm9yU3Rha2VyKnJldHVybgoKKmlmMjdfZW5kOgoKKmlmMjZfZW5kOgoKKmZvcl8zX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODA5CgkvLyBpICs9IDEKCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgNCAvLyBpOiB1aW50NjQKCWIgKmZvcl8zCgoqZm9yXzNfZW5kOgoKKmlmMjNfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODMyCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBhbW91bnRUb1N0YWtlID49IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1pbkVudHJ5U3Rha2UsCgkvLyAgICAgICAgICAgICAnbXVzdCBzdGFrZSBhdCBsZWFzdCB0aGUgbWluaW11bSBmb3IgdGhpcyBwb29sJywKCS8vICAgICAgICAgKQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJaW50IDIwOQoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk+PQoKCS8vIG11c3Qgc3Rha2UgYXQgbGVhc3QgdGhlIG1pbmltdW0gZm9yIHRoaXMgcG9vbAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODM4CgkvLyBwb29scyA9IGNsb25lKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHMpCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWludCA0MzIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglmcmFtZV9idXJ5IDUgLy8gcG9vbHM6ICh1aW50NjQsdWludDE2LHVpbnQ2NClbMjRdCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODM5CgkvLyBjdXJOdW1Qb29scyA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUubnVtUG9vbHMgYXMgdWludDY0CglpbnQgMjQyCglpbnQgMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgNiAvLyBjdXJOdW1Qb29sczogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQwCgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IGN1ck51bVBvb2xzOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA3IC8vIGk6IHVpbnQ2NAoKKmZvcl80OgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQwCgkvLyBpIDwgY3VyTnVtUG9vbHMKCWZyYW1lX2RpZyA3IC8vIGk6IHVpbnQ2NAoJZnJhbWVfZGlnIDYgLy8gY3VyTnVtUG9vbHM6IHVpbnQ2NAoJPAoJYnogKmZvcl80X2VuZAoKCS8vICppZjI4X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQxCgkvLyBwb29sc1tpXS50b3RhbEFsZ29TdGFrZWQgKyBhbW91bnRUb1N0YWtlIDw9IG1heFBlclBvb2wKCWZyYW1lX2RpZyA1IC8vIHBvb2xzOiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJKwoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8PQoJYnogKmlmMjhfZW5kCgoJLy8gKmlmMjhfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQyCgkvLyByZXR1cm4gWwoJLy8gICAgICAgICAgICAgICAgICAgICB7IGlkOiB2YWxpZGF0b3JJZCwgcG9vbElkOiBpICsgMSwgcG9vbEFwcElkOiBwb29sc1tpXS5wb29sQXBwSWQgfSwKCS8vICAgICAgICAgICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciwKCS8vICAgICAgICAgICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1Byb3RvY29sLAoJLy8gICAgICAgICAgICAgICAgIF0KCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxCgkrCglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyA1IC8vIHBvb2xzOiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglieXRlIDB4MDAKCWludCAwCglmcmFtZV9kaWcgMCAvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yOiBib29sCglzZXRiaXQKCWludCAxCglmcmFtZV9kaWcgMSAvLyBpc05ld1N0YWtlclRvUHJvdG9jb2w6IGJvb2wKCXNldGJpdAoJY29uY2F0CgliICpmaW5kUG9vbEZvclN0YWtlcipyZXR1cm4KCippZjI4X2VuZDoKCipmb3JfNF9jb250aW51ZToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg0MAoJLy8gaSArPSAxCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDcgLy8gaTogdWludDY0CgliICpmb3JfNAoKKmZvcl80X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg1MAoJLy8gcmV0dXJuIFt7IGlkOiB2YWxpZGF0b3JJZCwgcG9vbElkOiAwLCBwb29sQXBwSWQ6IDAgfSwgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciwgaXNOZXdTdGFrZXJUb1Byb3RvY29sXQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCgljb25jYXQKCWJ5dGUgMHgwMAoJaW50IDAKCWZyYW1lX2RpZyAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCXNldGJpdAoJaW50IDEKCWZyYW1lX2RpZyAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoJc2V0Yml0Cgljb25jYXQKCipmaW5kUG9vbEZvclN0YWtlcipyZXR1cm46CgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCgkvLyBwb3AgYWxsIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHRoZSBzdGFjawoJcG9wbiA3CglyZXRzdWIKCi8vIG1vdmVQb29sVG9Ob2RlKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKKmFiaV9yb3V0ZV9tb3ZlUG9vbFRvTm9kZToKCS8vIG5vZGVOdW06IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwoJYnRvaQoKCS8vIHBvb2xBcHBJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglidG9pCgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgbW92ZVBvb2xUb05vZGUodWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZAoJY2FsbHN1YiBtb3ZlUG9vbFRvTm9kZQoJaW50IDEKCXJldHVybgoKLy8gbW92ZVBvb2xUb05vZGUodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcG9vbEFwcElkOiB1aW50NjQsIG5vZGVOdW06IHVpbnQ2NCk6IHZvaWQKLy8KLy8gRmluZCB0aGUgc3BlY2lmaWVkIHBvb2wgKGluIGFueSBub2RlIG51bWJlcikgYW5kIG1vdmUgaXQgdG8gdGhlIHNwZWNpZmllZCBub2RlLgovLyBUaGUgcG9vbCBhY2NvdW50IGlzIGZvcmNlZCBvZmZsaW5lIGlmIG1vdmVkIHNvIHByaW9yIG5vZGUgd2lsbCBzdGlsbCBydW4gZm9yIDMyMCByb3VuZHMgYnV0Ci8vIG5ldyBrZXkgZ29lcyBvbmxpbmUgb24gbmV3IG5vZGUgc29vbiBhZnRlciAoMzIwIHJvdW5kcyBhZnRlciBpdCBnb2VzIG9ubGluZSkKLy8gTm8tb3AgaWYgc3VjY2VzcywgYXNzZXJ0cyBpZiBub3QgZm91bmQgb3IgY2FuJ3QgbW92ZSAgKG5vIHNwYWNlIGluIHRhcmdldCkKLy8gWyBPTkxZIE9XTkVSIE9SIE1BTkFHRVIgQ0FOIENIQU5HRSBdCi8vCi8vIEBwYXJhbSB7VmFsaWRhdG9ySWRUeXBlfSB2YWxpZGF0b3JJZCAtIFRoZSBpZCBvZiB0aGUgdmFsaWRhdG9yLgovLyBAcGFyYW0ge3VpbnQ2NH0gcG9vbEFwcElkCi8vIEBwYXJhbSB7dWludDY0fSBub2RlTnVtCm1vdmVQb29sVG9Ob2RlOgoJcHJvdG8gMyAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg2NQoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lck9yTWFuYWdlcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyT3JNYW5hZ2VyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODY3CgkvLyBub2RlUG9vbEFzc2lnbm1lbnRzID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5ub2RlUG9vbEFzc2lnbm1lbnRzKQoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfYnVyeSAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NjgKCS8vIGFzc2VydChub2RlTnVtID49IDEgJiYgbm9kZU51bSA8PSBNQVhfTk9ERVMsICdub2RlIG51bWJlciBvdXQgb2YgYWxsb3dhYmxlIHJhbmdlJykKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCAxCgk+PQoJZHVwCglieiAqc2tpcF9hbmQyCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgOAoJPD0KCSYmCgoqc2tpcF9hbmQyOgoJLy8gbm9kZSBudW1iZXIgb3V0IG9mIGFsbG93YWJsZSByYW5nZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODcwCgkvLyBmb3IgKGxldCBzcmNOb2RlSWR4ID0gMDsgc3JjTm9kZUlkeCA8IE1BWF9OT0RFUzsgc3JjTm9kZUlkeCArPSAxKQoJaW50IDAKCWZyYW1lX2J1cnkgMSAvLyBzcmNOb2RlSWR4OiB1aW50NjQKCipmb3JfNToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3MAoJLy8gc3JjTm9kZUlkeCA8IE1BWF9OT0RFUwoJZnJhbWVfZGlnIDEgLy8gc3JjTm9kZUlkeDogdWludDY0CglpbnQgOAoJPAoJYnogKmZvcl81X2VuZAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3MQoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBNQVhfUE9PTFNfUEVSX05PREU7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzY6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzEKCS8vIGkgPCBNQVhfUE9PTFNfUEVSX05PREUKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDMKCTwKCWJ6ICpmb3JfNl9lbmQKCgkvLyAqaWYyOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3MgoJLy8gbm9kZVBvb2xBc3NpZ25tZW50cy5ub2Rlc1tzcmNOb2RlSWR4XS5wb29sQXBwSWRzW2ldID09PSBwb29sQXBwSWQKCWZyYW1lX2RpZyAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCWludCAwCglmcmFtZV9kaWcgMSAvLyBzcmNOb2RlSWR4OiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMAoJKwoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWZyYW1lX2RpZyAtMiAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJPT0KCWJ6ICppZjI5X2VuZAoKCS8vICppZjI5X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3MwoJLy8gYXNzZXJ0KG5vZGVOdW0gLSAxICE9PSBzcmNOb2RlSWR4LCAiY2FuJ3QgbW92ZSB0byBzYW1lIG5vZGUiKQoJZnJhbWVfZGlnIC0zIC8vIG5vZGVOdW06IHVpbnQ2NAoJaW50IDEKCS0KCWZyYW1lX2RpZyAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJIT0KCgkvLyBjYW4ndCBtb3ZlIHRvIHNhbWUgbm9kZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODc1CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLm5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbc3JjTm9kZUlkeF0ucG9vbEFwcElkc1tpXSA9IDAKCWludCA5MDAKCWZyYW1lX2RpZyAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3OAoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5nb09mZmxpbmU+KHsKCS8vICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgltZXRob2QgImdvT2ZmbGluZSgpdm9pZCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODc5CgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkKCWZyYW1lX2RpZyAtMiAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4MwoJLy8gdGhpcy5hZGRQb29sVG9Ob2RlKHZhbGlkYXRvcklkLCBwb29sQXBwSWQsIG5vZGVOdW0pCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gcG9vbEFwcElkOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGFkZFBvb2xUb05vZGUKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4ODQKCS8vIHJldHVybgoJcmV0c3ViCgoqaWYyOV9lbmQ6CgoqZm9yXzZfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzEKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzYKCipmb3JfNl9lbmQ6CgoqZm9yXzVfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzAKCS8vIHNyY05vZGVJZHggKz0gMQoJZnJhbWVfZGlnIDEgLy8gc3JjTm9kZUlkeDogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJYiAqZm9yXzUKCipmb3JfNV9lbmQ6CgkvLyBjb3VsZG4ndCBmaW5kIHBvb2wgYXBwIGlkIGluIG5vZGVzIHRvIG1vdmUKCWVycgoJcmV0c3ViCgovLyBlbXB0eVRva2VuUmV3YXJkcyh1aW50NjQsYWRkcmVzcyl1aW50NjQKKmFiaV9yb3V0ZV9lbXB0eVRva2VuUmV3YXJkczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gcmVjZWl2ZXI6IGFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMzIKCT09CgoJLy8gYXJndW1lbnQgMCAocmVjZWl2ZXIpIGZvciBlbXB0eVRva2VuUmV3YXJkcyBtdXN0IGJlIGEgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZW1wdHlUb2tlblJld2FyZHModWludDY0LGFkZHJlc3MpdWludDY0CgljYWxsc3ViIGVtcHR5VG9rZW5SZXdhcmRzCglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZW1wdHlUb2tlblJld2FyZHModmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcmVjZWl2ZXI6IEFkZHJlc3MpOiB1aW50NjQKLy8KLy8gU2VuZHMgdGhlIHJld2FyZCB0b2tlbnMgaGVsZCBpbiBwb29sIDEgdG8gc3BlY2lmaWVkIHJlY2VpdmVyLgovLyBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgdGhlIG93bmVyIHdoZW4gdGhleSB3YW50IHRvIGdldCByZXdhcmQgdG9rZW5zICdiYWNrJyB3aGljaCB0aGV5IHNlbnQgdG8KLy8gdGhlIGZpcnN0IHBvb2wgKGxpa2VseSBiZWNhdXNlIHZhbGlkYXRvciBpcyBzdW5zZXR0aW5nLiAgQW55IHRva2VucyBjdXJyZW50bHkgJ3Jlc2VydmVkJyBmb3Igc3Rha2VycyB0byBjbGFpbSB3aWxsCi8vIE5PVCBiZSBzZW50IGFzIHRoZXkgbXVzdCBiZSBoZWxkIGJhY2sgZm9yIHN0YWtlcnMgdG8gbGF0ZXIgY2xhaW0uCi8vIFsgT05MWSBPV05FUiBDQU4gQ0FMTF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7QWRkcmVzc30gcmVjZWl2ZXIgLSB0aGUgYWNjb3VudCB0byBzZW5kIHRoZSB0b2tlbnMgdG8gKG11c3QgYWxyZWFkeSBiZSBvcHRlZC1pbiB0byB0aGUgcmV3YXJkIHRva2VuKQovLyBAcmV0dXJucyB7dWludDY0fSB0aGUgYW1vdW50IG9mIHJld2FyZCB0b2tlbiBzZW50CmVtcHR5VG9rZW5SZXdhcmRzOgoJcHJvdG8gMiAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkwMwoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTA0CgkvLyByZXdhcmRUb2tlbklkID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcucmV3YXJkVG9rZW5JZAoJaW50IDE1MwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTA1CgkvLyByZXdhcmRUb2tlbkhlbGRCYWNrID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5yZXdhcmRUb2tlbkhlbGRCYWNrCglpbnQgMjYwCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMSAvLyByZXdhcmRUb2tlbkhlbGRCYWNrOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MDYKCS8vIGFzc2VydChyZXdhcmRUb2tlbklkICE9PSAwLCAidGhpcyB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIGEgcmV3YXJkIHRva2VuIGRlZmluZWQiKQoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0CglpbnQgMAoJIT0KCgkvLyB0aGlzIHZhbGlkYXRvciBkb2Vzbid0IGhhdmUgYSByZXdhcmQgdG9rZW4gZGVmaW5lZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTA3CgkvLyBwb29sT25lQXBwSWQgPSBBcHBJRC5mcm9tVWludDY0KHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkKQoJaW50IDI2OAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MDkKCS8vIHRva2VuUmV3YXJkQmFsID0KCS8vICAgICAgICAgICAgIHBvb2xPbmVBcHBJZC5hZGRyZXNzLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JZCkpIC0gcmV3YXJkVG9rZW5IZWxkQmFjawoJZnJhbWVfZGlnIDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCXBvcAoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0Cglhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKCXBvcAoJZnJhbWVfZGlnIDEgLy8gcmV3YXJkVG9rZW5IZWxkQmFjazogdWludDY0CgktCglmcmFtZV9idXJ5IDMgLy8gdG9rZW5SZXdhcmRCYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkxMwoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5wYXlUb2tlblJld2FyZD4oewoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25JRDogcG9vbE9uZUFwcElkLAoJLy8gICAgICAgICAgICAgbWV0aG9kQXJnczogW3JlY2VpdmVyLCByZXdhcmRUb2tlbklkLCB0b2tlblJld2FyZEJhbF0sCgkvLyAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJbWV0aG9kICJwYXlUb2tlblJld2FyZChhZGRyZXNzLHVpbnQ2NCx1aW50NjQpdm9pZCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTE0CgkvLyBhcHBsaWNhdGlvbklEOiBwb29sT25lQXBwSWQKCWZyYW1lX2RpZyAyIC8vIHBvb2xPbmVBcHBJZDogdWludDY0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MTUKCS8vIG1ldGhvZEFyZ3M6IFtyZWNlaXZlciwgcmV3YXJkVG9rZW5JZCwgdG9rZW5SZXdhcmRCYWxdCglmcmFtZV9kaWcgLTIgLy8gcmVjZWl2ZXI6IEFkZHJlc3MKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklkOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMyAvLyB0b2tlblJld2FyZEJhbDogdWludDY0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MTcKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHBvb2xPbmVBcHBJZC5hZGRyZXNzLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JZCkpID09PSByZXdhcmRUb2tlbkhlbGRCYWNrLAoJLy8gICAgICAgICAgICAgJ2JhbGFuY2Ugb2YgcmVtYWluaW5nIHJld2FyZCB0b2tlbnMgc2hvdWxkIG1hdGNoIHRoZSBoZWxkIGJhY2sgYW1vdW50JywKCS8vICAgICAgICAgKQoJZnJhbWVfZGlnIDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCXBvcAoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0Cglhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKCXBvcAoJZnJhbWVfZGlnIDEgLy8gcmV3YXJkVG9rZW5IZWxkQmFjazogdWludDY0Cgk9PQoKCS8vIGJhbGFuY2Ugb2YgcmVtYWluaW5nIHJld2FyZCB0b2tlbnMgc2hvdWxkIG1hdGNoIHRoZSBoZWxkIGJhY2sgYW1vdW50Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MjEKCS8vIHJldHVybiB0b2tlblJld2FyZEJhbAoJZnJhbWVfZGlnIDMgLy8gdG9rZW5SZXdhcmRCYWw6IHVpbnQ2NAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDMKCXJldHN1YgoKLy8gY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IHZvaWQKY2FsbGVyTXVzdEJlT3duZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDE0CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICB0aGlzLnR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLAoJLy8gICAgICAgICAgICAgJ2NhbiBvbmx5IGJlIGNhbGxlZCBieSB2YWxpZGF0b3Igb3duZXInLAoJLy8gICAgICAgICApCgl0eG4gU2VuZGVyCglpbnQgOAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJPT0KCgkvLyBjYW4gb25seSBiZSBjYWxsZWQgYnkgdmFsaWRhdG9yIG93bmVyCglhc3NlcnQKCXJldHN1YgoKLy8gY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXIodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IHZvaWQKY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDIxCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICB0aGlzLnR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyIHx8CgkvLyAgICAgICAgICAgICAgICAgdGhpcy50eG4uc2VuZGVyID09PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5tYW5hZ2VyLAoJLy8gICAgICAgICAgICAgJ2NhbiBvbmx5IGJlIGNhbGxlZCBieSBvd25lciBvciBtYW5hZ2VyIG9mIHZhbGlkYXRvcicsCgkvLyAgICAgICAgICkKCXR4biBTZW5kZXIKCWludCA4CglpbnQgMzIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0Cgk9PQoJZHVwCglibnogKnNraXBfb3IzCgl0eG4gU2VuZGVyCglpbnQgNDAKCWludCAzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCT09Cgl8fAoKKnNraXBfb3IzOgoJLy8gY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IG93bmVyIG9yIG1hbmFnZXIgb2YgdmFsaWRhdG9yCglhc3NlcnQKCXJldHN1YgoKLy8gdmVyaWZ5UG9vbEtleUNhbGxlcihwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5KTogdm9pZAovLwovLyB2ZXJpZnlQb29sS2V5Q2FsbGVyIHZlcmlmaWVzIHRoZSBwYXNzZWQgaW4ga2V5IChmcm9tIGEgc3Rha2luZyBwb29sIGNhbGxpbmcgdXMgdG8gdXBkYXRlIG1ldHJpY3MpIGlzIHZhbGlkCi8vIGFuZCBtYXRjaGVzIHRoZSBpbmZvcm1hdGlvbiB3ZSBoYXZlIGluIG91ciBzdGF0ZS4gICdGYWtlJyBwb29scyBjb3VsZCBjYWxsIHVzIHRvIHVwZGF0ZSBvdXIgZGF0YSwgYnV0IHRoZXkKLy8gY2FuJ3QgZmFrZSB0aGUgaWRzIGFuZCBtb3N0IGltcG9ydGFudGx5IGFwcGxpY2F0aW9uIGlkKCEpIG9mIHRoZSBjYWxsZXIgdGhhdCBoYXMgdG8gbWF0Y2guCnZlcmlmeVBvb2xLZXlDYWxsZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDM0CgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLmV4aXN0cywgInRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGlzbid0IHZhbGlkIikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cglib3hfbGVuCglzd2FwCglwb3AKCgkvLyB0aGUgc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBpc24ndCB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTAzNQoJLy8gYXNzZXJ0KHBvb2xLZXkucG9vbElkIDw9IE1BWF9QT09MUywgJ3Bvb2wgaWQgbm90IGluIHZhbGlkIHJhbmdlJykKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDI0Cgk8PQoKCS8vIHBvb2wgaWQgbm90IGluIHZhbGlkIHJhbmdlCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDM2CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBwb29sS2V5LnBvb2xJZCA+IDAgJiYgKHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNikgPD0gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLm51bVBvb2xzLAoJLy8gICAgICAgICAgICAgJ3Bvb2wgaWQgb3V0c2lkZSBvZiByYW5nZSBvZiBwb29scyBjcmVhdGVkIGZvciB0aGlzIHZhbGlkYXRvcicsCgkvLyAgICAgICAgICkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDAKCT4KCWR1cAoJYnogKnNraXBfYW5kMwoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMjQyCglpbnQgMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk8PQoJJiYKCipza2lwX2FuZDM6CgkvLyBwb29sIGlkIG91dHNpZGUgb2YgcmFuZ2Ugb2YgcG9vbHMgY3JlYXRlZCBmb3IgdGhpcyB2YWxpZGF0b3IKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNDIKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHBvb2xLZXkucG9vbEFwcElkID09PSB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbcG9vbEtleS5wb29sSWQgLSAxXS5wb29sQXBwSWQsCgkvLyAgICAgICAgICAgICAiVGhlIHBhc3NlZCBpbiBhcHAgaWQgZG9lc24ndCBtYXRjaCB0aGUgcGFzc2VkIGluIGlkcyIsCgkvLyAgICAgICAgICkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk9PQoKCS8vIFRoZSBwYXNzZWQgaW4gYXBwIGlkIGRvZXNuJ3QgbWF0Y2ggdGhlIHBhc3NlZCBpbiBpZHMKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNDcKCS8vIGFzc2VydCh0aGlzLnR4bi5zZW5kZXIgPT09IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLmFkZHJlc3MpCgl0eG4gU2VuZGVyCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAxNiA4CglidG9pCglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCT09Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDQ5CgkvLyBhc3NlcnQocG9vbEtleS5pZCA9PT0gKEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLmdsb2JhbFN0YXRlKCd2YWxpZGF0b3JJZCcpIGFzIHVpbnQ2NCkpCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWJ5dGUgMHg3NjYxNmM2OTY0NjE3NDZmNzI0OTY0IC8vICJ2YWxpZGF0b3JJZCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgndmFsaWRhdG9ySWQnKQoJYXNzZXJ0Cgk9PQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA1MAoJLy8gYXNzZXJ0KHBvb2xLZXkucG9vbElkID09PSAoQXBwSUQuZnJvbVVpbnQ2NChwb29sS2V5LnBvb2xBcHBJZCkuZ2xvYmFsU3RhdGUoJ3Bvb2xJZCcpIGFzIHVpbnQ2NCkpCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWJ5dGUgMHg3MDZmNmY2YzQ5NjQgLy8gInBvb2xJZCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgncG9vbElkJykKCWFzc2VydAoJPT0KCWFzc2VydAoJcmV0c3ViCgovLyByZXZlcmlmeU5GRE93bmVyc2hpcCh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogdm9pZAovLwovLyBUaGlzIG1ldGhvZCB2ZXJpZmllcyB0aGUgb3duZXJzaGlwIG9mIE5GRCAoTmFtZWQgRnVuY3Rpb24gRGF0YSkgYnkgYSB2YWxpZGF0b3IuCi8vIElmIHRoZSBvd25lcnNoaXAgaXMgbm8gbG9uZ2VyIHZhbGlkLCBpdCByZW1vdmVzIHRoZSBORkQgZnJvbSB0aGUgdmFsaWRhdG9yJ3MgY29uZmlndXJhdGlvbi4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3Igd2hvc2UgZGF0YSBzaG91bGQgYmUgcmUtZXZhbHVhdGVkLgpyZXZlcmlmeU5GRE93bmVyc2hpcDoKCXByb3RvIDEgMAoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDYwCgkvLyB2YWxpZGF0b3JDb25maWcgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZwoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJZnJhbWVfYnVyeSAwIC8vIHN0b3JhZ2Uga2V5Ly92YWxpZGF0b3JDb25maWcKCgkvLyAqaWYzMF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNjEKCS8vIHZhbGlkYXRvckNvbmZpZy5uZmRGb3JJbmZvICE9PSAwCglpbnQgNzIKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDAKCSE9CglieiAqaWYzMF9lbmQKCgkvLyAqaWYzMF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDY0CgkvLyBuZmRPd25lciA9IEFwcElELmZyb21VaW50NjQodmFsaWRhdG9yQ29uZmlnLm5mZEZvckluZm8pLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzCglpbnQgNzIKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQodmFsaWRhdG9yQ29uZmlnLm5mZEZvckluZm8pLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCgkvLyAqaWYzMV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNjYKCS8vIHZhbGlkYXRvckNvbmZpZy5vd25lciAhPT0gbmZkT3duZXIgJiYgdmFsaWRhdG9yQ29uZmlnLm1hbmFnZXIgIT09IG5mZE93bmVyCglpbnQgOAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfZGlnIDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCSE9CglkdXAKCWJ6ICpza2lwX2FuZDQKCWludCA0MAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfZGlnIDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCSE9CgkmJgoKKnNraXBfYW5kNDoKCWJ6ICppZjMxX2VuZAoKCS8vICppZjMxX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNjgKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm5mZEZvckluZm8gPSAwCglpbnQgNzIKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKKmlmMzFfZW5kOgoKKmlmMzBfZW5kOgoJcmV0c3ViCgovLyB2YWxpZGF0ZUNvbmZpZyhjb25maWc6IFZhbGlkYXRvckNvbmZpZyk6IHZvaWQKdmFsaWRhdGVDb25maWc6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDc1CgkvLyBhc3NlcnQoY29uZmlnLm93bmVyICE9PSBBZGRyZXNzLnplcm9BZGRyZXNzKQoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDggMzIKCWdsb2JhbCBaZXJvQWRkcmVzcwoJIT0KCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNzYKCS8vIGFzc2VydChjb25maWcubWFuYWdlciAhPT0gQWRkcmVzcy56ZXJvQWRkcmVzcykKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA0MCAzMgoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA3NwoJLy8gYXNzZXJ0KHRoaXMudHhuLnNlbmRlciA9PT0gY29uZmlnLm93bmVyLCAnc2VuZGVyIG11c3QgYmUgb3duZXIgdG8gYWRkIG5ldyB2YWxpZGF0b3InKQoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDggMzIKCT09CgoJLy8gc2VuZGVyIG11c3QgYmUgb3duZXIgdG8gYWRkIG5ldyB2YWxpZGF0b3IKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNzkKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIGNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPj0gR0FUSU5HX1RZUEVfTk9ORSAmJiBjb25maWcuZW50cnlHYXRpbmdUeXBlIDw9IEdBVElOR19UWVBFX0NPTlNUX01BWCwKCS8vICAgICAgICAgICAgICdnYXRpbmcgdHlwZSBub3QgdmFsaWQnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgODAgMQoJYnRvaQoJaW50IDAKCT49CglkdXAKCWJ6ICpza2lwX2FuZDUKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4MCAxCglidG9pCglpbnQgNAoJPD0KCSYmCgoqc2tpcF9hbmQ1OgoJLy8gZ2F0aW5nIHR5cGUgbm90IHZhbGlkCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDgzCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBjb25maWcuZXBvY2hSb3VuZExlbmd0aCA+PSBNSU5fRVBPQ0hfTEVOR1RIICYmIGNvbmZpZy5lcG9jaFJvdW5kTGVuZ3RoIDw9IE1BWF9FUE9DSF9MRU5HVEgsCgkvLyAgICAgICAgICAgICAnZXBvY2ggbGVuZ3RoIG5vdCBpbiBhbGxvd2FibGUgcmFuZ2UnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTY5IDQKCWJ0b2kKCWludCAxCgk+PQoJZHVwCglieiAqc2tpcF9hbmQ2CglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTY5IDQKCWJ0b2kKCWludCAxMDAwMDAwCgk8PQoJJiYKCipza2lwX2FuZDY6CgkvLyBlcG9jaCBsZW5ndGggbm90IGluIGFsbG93YWJsZSByYW5nZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA4NwoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgY29uZmlnLnBlcmNlbnRUb1ZhbGlkYXRvciA+PSBNSU5fUENUX1RPX1ZBTElEQVRPUiAmJiBjb25maWcucGVyY2VudFRvVmFsaWRhdG9yIDw9IE1BWF9QQ1RfVE9fVkFMSURBVE9SLAoJLy8gICAgICAgICAgICAgJ2NvbW1pc3Npb24gcGVyY2VudGFnZSBub3QgdmFsaWQnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTczIDQKCWJ0b2kKCWludCAwCgk+PQoJZHVwCglieiAqc2tpcF9hbmQ3CglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTczIDQKCWJ0b2kKCWludCAxMDAwMDAwCgk8PQoJJiYKCipza2lwX2FuZDc6CgkvLyBjb21taXNzaW9uIHBlcmNlbnRhZ2Ugbm90IHZhbGlkCglhc3NlcnQKCgkvLyAqaWYzMl9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwOTEKCS8vIGNvbmZpZy5wZXJjZW50VG9WYWxpZGF0b3IgIT09IDAKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAxNzMgNAoJYnRvaQoJaW50IDAKCSE9CglieiAqaWYzMl9lbmQKCgkvLyAqaWYzMl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDkyCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgY29uZmlnLnZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzICE9PSBBZGRyZXNzLnplcm9BZGRyZXNzLAoJLy8gICAgICAgICAgICAgICAgICd2YWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyBtdXN0IGJlIHNldCBpZiBwZXJjZW50IHRvIHZhbGlkYXRvciBpcyBub3QgMCcsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTc3IDMyCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CgoJLy8gdmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MgbXVzdCBiZSBzZXQgaWYgcGVyY2VudCB0byB2YWxpZGF0b3IgaXMgbm90IDAKCWFzc2VydAoKKmlmMzJfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA5NwoJLy8gYXNzZXJ0KGNvbmZpZy5taW5FbnRyeVN0YWtlID49IE1JTl9BTEdPX1NUQUtFX1BFUl9QT09MLCAnc3Rha2luZyBwb29sIG11c3QgaGF2ZSBtaW5pbXVtIGVudHJ5IG9mIDEgYWxnbycpCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMjA5IDgKCWJ0b2kKCWludCAxMDAwMDAwCgk+PQoKCS8vIHN0YWtpbmcgcG9vbCBtdXN0IGhhdmUgbWluaW11bSBlbnRyeSBvZiAxIGFsZ28KCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwOTkKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIGNvbmZpZy5wb29sc1Blck5vZGUgPiAwICYmIGNvbmZpZy5wb29sc1Blck5vZGUgPD0gTUFYX1BPT0xTX1BFUl9OT0RFLAoJLy8gICAgICAgICAgICAgJ251bWJlciBvZiBwb29scyBwZXIgbm9kZSBtdXN0IGJlIGJlIGJldHdlZW4gMSBhbmQgdGhlIG1heGltdW0gYWxsb3dlZCBudW1iZXInLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMjI1IDEKCWJ0b2kKCWludCAwCgk+CglkdXAKCWJ6ICpza2lwX2FuZDgKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAyMjUgMQoJYnRvaQoJaW50IDMKCTw9CgkmJgoKKnNraXBfYW5kODoKCS8vIG51bWJlciBvZiBwb29scyBwZXIgbm9kZSBtdXN0IGJlIGJlIGJldHdlZW4gMSBhbmQgdGhlIG1heGltdW0gYWxsb3dlZCBudW1iZXIKCWFzc2VydAoKCS8vICppZjMzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEwMwoJLy8gY29uZmlnLnN1bnNldHRpbmdPbiAhPT0gMAoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDIyNiA4CglidG9pCglpbnQgMAoJIT0KCWJ6ICppZjMzX2VuZAoKCS8vICppZjMzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMDQKCS8vIGFzc2VydChjb25maWcuc3Vuc2V0dGluZ09uID4gZ2xvYmFscy5sYXRlc3RUaW1lc3RhbXAsICdzdW5zZXR0aW5nT24gbXVzdCBiZSBsYXRlciB0aGFuIG5vdyBpZiBzZXQnKQoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDIyNiA4CglidG9pCglnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCgk+CgoJLy8gc3Vuc2V0dGluZ09uIG11c3QgYmUgbGF0ZXIgdGhhbiBub3cgaWYgc2V0Cglhc3NlcnQKCippZjMzX2VuZDoKCXJldHN1YgoKLy8gY2FsbFBvb2xBZGRTdGFrZShzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4sIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXksIG1ickFtdFBhaWQ6IHVpbnQ2NCwgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbGVhbiwgaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sZWFuKTogdm9pZAovLwovLyBBZGRzIGEgc3Rha2VycyBhbW91bnQgb2YgYWxnbyB0byBhIHZhbGlkYXRvciBwb29sLCB0cmFuc2ZlcnJpbmcgdGhlIGFsZ28gd2UgcmVjZWl2ZWQgZnJvbSB0aGVtIChhbHJlYWR5IHZlcmlmaWVkCi8vIGJ5IG91ciBjYWxsZXIpIHRvIHRoZSBzdGFraW5nIHBvb2wgYWNjb3VudCwgYW5kIHRoZW4gdGVsbGluZyBpdCBhYm91dCB0aGUgYW1vdW50IGJlaW5nIGFkZGVkIGZvciB0aGUgc3BlY2lmaWVkCi8vIHN0YWtlci4KLy8KLy8gQHBhcmFtIHtQYXlUeG59IHN0YWtlZEFtb3VudFBheW1lbnQgLSBwYXltZW50IGNvbWluZyBmcm9tIHN0YWtlciB0byBwbGFjZSBpbnRvIGEgcG9vbAovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBUaGUga2V5IG9mIHRoZSB2YWxpZGF0b3IgcG9vbC4KLy8gQHBhcmFtIHt1aW50NjR9IG1ickFtdFBhaWQgLSBBbW91bnQgdGhlIHVzZXIgaXMgbGVhdmluZyBiZWhpbmQgaW4gdGhlIHZhbGlkYXRvciB0byBwYXkgZm9yIHRoZWlyIHN0YWtlciBNQlIgY29zdAovLyBAcGFyYW0ge2Jvb2xlYW59IGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IgLSBpZiB0aGlzIGlzIGEgbmV3LCBmaXJzdC10aW1lIHN0YWtlciB0byB0aGUgdmFsaWRhdG9yCi8vIEBwYXJhbSB7Ym9vbGVhbn0gaXNOZXdTdGFrZXJUb1Byb3RvY29sIC0gaWYgdGhpcyBpcyBhIG5ldywgZmlyc3QtdGltZSBzdGFrZXIgdG8gdGhlIHByb3RvY29sCmNhbGxQb29sQWRkU3Rha2U6Cglwcm90byA1IDAKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiAyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEyNgoJLy8gcG9vbEFwcElkID0gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzW3Bvb2xLZXkucG9vbElkIC0gMV0ucG9vbEFwcElkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIHBvb2xBcHBJZDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEzMAoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5hZGRTdGFrZSwgdWludDY0Pih7CgkvLyAgICAgICAgICAgICBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCksCgkvLyAgICAgICAgICAgICBtZXRob2RBcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gPT09PT09PQoJLy8gICAgICAgICAgICAgICAgIC8vIFRISVMgSVMgQSBTRU5EIG9mIHRoZSBhbW91bnQgcmVjZWl2ZWQgcmlnaHQgYmFjayBvdXQgYW5kIGludG8gdGhlIHN0YWtpbmcgcG9vbCBjb250cmFjdCBhY2NvdW50LgoJLy8gICAgICAgICAgICAgICAgIHsgYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQsIHJlY2VpdmVyOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuYWRkcmVzcyB9LAoJLy8gICAgICAgICAgICAgICAgIC8vID09PT09PT0KCS8vICAgICAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LnNlbmRlciwKCS8vICAgICAgICAgICAgIF0sCgkvLyAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgcGF5CglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEzNQoJLy8gYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJZnJhbWVfZGlnIC0zIC8vIG1ickFtdFBhaWQ6IHVpbnQ2NAoJLQoJaXR4bl9maWVsZCBBbW91bnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTM1CgkvLyByZWNlaXZlcjogQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmFkZHJlc3MKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCWl0eG5fZmllbGQgUmVjZWl2ZXIKCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCWl0eG5fbmV4dAoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAiYWRkU3Rha2UocGF5LGFkZHJlc3MpdWludDY0IgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTMxCgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTMyCgkvLyBtZXRob2RBcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gPT09PT09PQoJLy8gICAgICAgICAgICAgICAgIC8vIFRISVMgSVMgQSBTRU5EIG9mIHRoZSBhbW91bnQgcmVjZWl2ZWQgcmlnaHQgYmFjayBvdXQgYW5kIGludG8gdGhlIHN0YWtpbmcgcG9vbCBjb250cmFjdCBhY2NvdW50LgoJLy8gICAgICAgICAgICAgICAgIHsgYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQsIHJlY2VpdmVyOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuYWRkcmVzcyB9LAoJLy8gICAgICAgICAgICAgICAgIC8vID09PT09PT0KCS8vICAgICAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LnNlbmRlciwKCS8vICAgICAgICAgICAgIF0KCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIFNlbmRlcgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCgkvLyBTdWJtaXQgaW5uZXIgdHJhbnNhY3Rpb24KCWl0eG5fc3VibWl0CglpdHhuIE51bUxvZ3MKCWludCAxCgktCglpdHhuYXMgTG9ncwoJZXh0cmFjdCA0IDAKCWJ0b2kKCgkvLyAqaWYzNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNDAKCS8vIGdsb2JhbHMub3Bjb2RlQnVkZ2V0IDwgNTAwCglnbG9iYWwgT3Bjb2RlQnVkZ2V0CglpbnQgNTAwCgk8CglieiAqaWYzNF9lbmQKCgkvLyAqaWYzNF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTQxCgkvLyBpbmNyZWFzZU9wY29kZUJ1ZGdldCgpCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJaW50IDAKCWl0eG5fZmllbGQgRmVlCglieXRlIGI2NCBDb0VCIC8vICNwcmFnbWEgdmVyc2lvbiAxMDsgaW50IDEKCWR1cAoJaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCWludCBEZWxldGVBcHBsaWNhdGlvbgoJaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KCWl0eG5fc3VibWl0CgoqaWYzNF9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTQ1CgkvLyBwb29sTnVtU3Rha2VycyA9IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgnbnVtU3Rha2VycycpIGFzIHVpbnQ2NAoJZnJhbWVfZGlnIDAgLy8gcG9vbEFwcElkOiB1aW50NjQKCWJ5dGUgMHg2ZTc1NmQ1Mzc0NjE2YjY1NzI3MyAvLyAibnVtU3Rha2VycyIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuZ2xvYmFsU3RhdGUoJ251bVN0YWtlcnMnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDEgLy8gcG9vbE51bVN0YWtlcnM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNDYKCS8vIHBvb2xBbGdvU3Rha2VkID0gQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmdsb2JhbFN0YXRlKCdzdGFrZWQnKSBhcyB1aW50NjQKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglhcHBfZ2xvYmFsX2dldF9leAoKCS8vIGdsb2JhbCBzdGF0ZSB2YWx1ZSBkb2VzIG5vdCBleGlzdDogQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmdsb2JhbFN0YXRlKCdzdGFrZWQnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDIgLy8gcG9vbEFsZ29TdGFrZWQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNDcKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsU3Rha2VycyA9IHBvb2xOdW1TdGFrZXJzIGFzIHVpbnQxNgoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJZnJhbWVfZGlnIDEgLy8gcG9vbE51bVN0YWtlcnM6IHVpbnQ2NAoJaXRvYgoJZXh0cmFjdCA2IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNDgKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCA9IHBvb2xBbGdvU3Rha2VkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJZnJhbWVfZGlnIDIgLy8gcG9vbEFsZ29TdGFrZWQ6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gKmlmMzVfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTUxCgkvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yCglmcmFtZV9kaWcgLTQgLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbGVhbgoJYnogKmlmMzVfZW5kCgoJLy8gKmlmMzVfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE1MgoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsU3Rha2VycyArPSAxCglpbnQgMjQ0CglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWludCAxCgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCippZjM1X2VuZDoKCS8vICppZjM2X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE1NAoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sCglmcmFtZV9kaWcgLTUgLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sZWFuCglieiAqaWYzNl9lbmQKCgkvLyAqaWYzNl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTU1CgkvLyB0aGlzLm51bVN0YWtlcnMudmFsdWUgKz0gMQoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJYXBwX2dsb2JhbF9nZXQKCWludCAxCgkrCglieXRlIDB4NmU3NTZkNTM3NDYxNmI2NTcyNzMgLy8gIm51bVN0YWtlcnMiCglzd2FwCglhcHBfZ2xvYmFsX3B1dAoKKmlmMzZfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE1NwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsQWxnb1N0YWtlZCArPSBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWludCAyNTIKCWR1cAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4bgoJZ3R4bnMgQW1vdW50CglmcmFtZV9kaWcgLTMgLy8gbWJyQW10UGFpZDogdWludDY0CgktCgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTU4CgkvLyB0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSArPSBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCWFwcF9nbG9iYWxfZ2V0CglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBBbW91bnQKCWZyYW1lX2RpZyAtMyAvLyBtYnJBbXRQYWlkOiB1aW50NjQKCS0KCSsKCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCXN3YXAKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIHVwZGF0ZVN0YWtlclBvb2xTZXQoc3Rha2VyOiBBZGRyZXNzLCBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5KTogdm9pZAp1cGRhdGVTdGFrZXJQb29sU2V0OgoJcHJvdG8gMiAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjIKCS8vIGFzc2VydCh0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS5leGlzdHMpCglieXRlIDB4NzM3MDczIC8vICJzcHMiCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE2NAoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDAgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjUKCS8vIGZpcnN0RW1wdHkgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjYKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoKKmZvcl83OgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE2NgoJLy8gaSA8IHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlLmxlbmd0aAoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl83X2VuZAoKCS8vICppZjM3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE2NwoJLy8gcG9vbFNldFtpXSA9PT0gcG9vbEtleQoJZnJhbWVfZGlnIDAgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDI0CglleHRyYWN0MwoJZnJhbWVfZGlnIC0yIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCT09CglieiAqaWYzN19lbmQKCgkvLyAqaWYzN19jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTY5CgkvLyByZXR1cm4KCXJldHN1YgoKKmlmMzdfZW5kOgoJLy8gKmlmMzhfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTcxCgkvLyBmaXJzdEVtcHR5ID09PSAwICYmIHBvb2xTZXRbaV0uaWQgPT09IDAKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDAKCT09CglkdXAKCWJ6ICpza2lwX2FuZDkKCWZyYW1lX2RpZyAwIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgk9PQoJJiYKCipza2lwX2FuZDk6CglieiAqaWYzOF9lbmQKCgkvLyAqaWYzOF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTcyCgkvLyBmaXJzdEVtcHR5ID0gaSArIDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMSAvLyBmaXJzdEVtcHR5OiB1aW50NjQKCippZjM4X2VuZDoKCipmb3JfN19jb250aW51ZToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjYKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzcKCipmb3JfN19lbmQ6CgkvLyAqaWYzOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNzUKCS8vIGZpcnN0RW1wdHkgPT09IDAKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDAKCT09CglieiAqaWYzOV9lbmQKCgkvLyAqaWYzOV9jb25zZXF1ZW50CgkvLyBObyBlbXB0eSBzbG90IGF2YWlsYWJsZSBpbiB0aGUgc3Rha2VyIHBvb2wgc2V0CgllcnIKCippZjM5X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNzgKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlW2ZpcnN0RW1wdHkgLSAxXSA9IHBvb2xLZXkKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDEKCS0KCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyByZW1vdmVGcm9tU3Rha2VyUG9vbFNldChzdGFrZXI6IEFkZHJlc3MsIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkpOiBbYm9vbGVhbiwgYm9vbGVhbl0KLy8KLy8gUmVtb3ZlcyBhIHBvb2wga2V5IGZyb20gdGhlIHN0YWtlcidzIGFjdGl2ZSBwb29sIHNldCAtIGZhaWxzIGlmIG5vdCBmb3VuZCAoISkKLy8KLy8gQHBhcmFtIHtBZGRyZXNzfSBzdGFrZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgc3Rha2VyLgovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBUaGUgcG9vbCBrZXkgdGhleSBzaG91bGQgYmUgc3RvcmVkIGluCi8vCi8vIEByZXR1cm4gW2Jvb2xlYW4sIGJvb2xlYW5dIFtpcyB0aGUgc3Rha2VyIGdvbmUgZnJvbSBBTEwgcG9vbHMgb2YgdGhlIGdpdmVuIFZBTElEQVRPUiwgYW5kIGlzIHN0YWtlciBnb25lIGZyb20gQUxMIHBvb2xzXQpyZW1vdmVGcm9tU3Rha2VyUG9vbFNldDoKCXByb3RvIDIgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTkxCgkvLyBpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAwIC8vIGluU2FtZVZhbGlkYXRvclBvb2xDb3VudDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5MgoJLy8gaW5BbnlQb29sQ291bnQgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAxIC8vIGluQW55UG9vbENvdW50OiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTkzCgkvLyBmb3VuZCA9IGZhbHNlCglpbnQgMAoJZnJhbWVfYnVyeSAyIC8vIGZvdW5kOiBib29sCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5NQoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExOTYKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoKKmZvcl84OgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5NgoJLy8gaSA8IHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlLmxlbmd0aAoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl84X2VuZAoKCS8vICppZjQwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5NwoJLy8gcG9vbFNldFtpXS5pZCA9PT0gMAoJZnJhbWVfZGlnIDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWY0MF9lbmQKCgkvLyAqaWY0MF9jb25zZXF1ZW50CgliICpmb3JfOF9jb250aW51ZQoKKmlmNDBfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwMAoJLy8gaW5BbnlQb29sQ291bnQgKz0gMQoJZnJhbWVfZGlnIDEgLy8gaW5BbnlQb29sQ291bnQ6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMSAvLyBpbkFueVBvb2xDb3VudDogdWludDY0CgoJLy8gKmlmNDFfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjAxCgkvLyBwb29sU2V0W2ldLmlkID09PSBwb29sS2V5LmlkCglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgMAoJKwoJaW50IDgKCWV4dHJhY3QzCglidG9pCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCT09CglieiAqaWY0MV9lbmQKCgkvLyAqaWY0MV9jb25zZXF1ZW50CgkvLyAqaWY0Ml9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDIKCS8vIHBvb2xTZXRbaV0gPT09IHBvb2xLZXkKCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5Cgk9PQoJYnogKmlmNDJfZWxzZQoKCS8vICppZjQyX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDMKCS8vIGZvdW5kID0gdHJ1ZQoJaW50IDEKCWZyYW1lX2J1cnkgMiAvLyBmb3VuZDogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDUKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlW2ldID0geyBpZDogMCwgcG9vbElkOiAwLCBwb29sQXBwSWQ6IDAgfQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJYiAqaWY0Ml9lbmQKCippZjQyX2Vsc2U6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjA3CgkvLyBpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgKz0gMQoJZnJhbWVfZGlnIDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCippZjQyX2VuZDoKCippZjQxX2VuZDoKCipmb3JfOF9jb250aW51ZToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExOTYKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzgKCipmb3JfOF9lbmQ6CgkvLyAqaWY0M19jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMTEKCS8vICFmb3VuZAoJZnJhbWVfZGlnIDIgLy8gZm91bmQ6IGJvb2wKCSEKCWJ6ICppZjQzX2VuZAoKCS8vICppZjQzX2NvbnNlcXVlbnQKCS8vIE5vIG1hdGNoaW5nIHNsb3QgZm91bmQgd2hlbiB0b2xkIHRvIHJlbW92ZSBhIHBvb2wgZnJvbSB0aGUgc3Rha2VycyBzZXQKCWVycgoKKmlmNDNfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIxNQoJLy8gcmV0dXJuIFtpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgPT09IDAsIGluQW55UG9vbENvdW50ID09PSAwXQoJYnl0ZSAweDAwCglpbnQgMAoJZnJhbWVfZGlnIDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCWludCAwCgk9PQoJc2V0Yml0CglpbnQgMQoJZnJhbWVfZGlnIDEgLy8gaW5BbnlQb29sQ291bnQ6IHVpbnQ2NAoJaW50IDAKCT09CglzZXRiaXQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCgkvLyBwb3AgYWxsIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHRoZSBzdGFjawoJcG9wbiA0CglyZXRzdWIKCi8vIGFkZFBvb2xUb05vZGUodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcG9vbEFwcElkOiB1aW50NjQsIG5vZGVOdW06IHVpbnQ2NCk6IHZvaWQKYWRkUG9vbFRvTm9kZToKCXByb3RvIDMgMAoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjE5CgkvLyBub2RlUG9vbEFzc2lnbm1lbnRzID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5ub2RlUG9vbEFzc2lnbm1lbnRzKQoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfYnVyeSAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjIwCgkvLyBtYXhQb29sc1Blck5vZGVGb3JUaGlzVmFsaWRhdG9yID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcucG9vbHNQZXJOb2RlIGFzIHVpbnQ2NAoJaW50IDIyNQoJaW50IDEKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDEgLy8gbWF4UG9vbHNQZXJOb2RlRm9yVGhpc1ZhbGlkYXRvcjogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIyMgoJLy8gYXNzZXJ0KG5vZGVOdW0gPj0gMSAmJiBub2RlTnVtIDw9IE1BWF9OT0RFUywgJ25vZGUgbnVtYmVyIG5vdCBpbiB2YWxpZCByYW5nZScpCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgMQoJPj0KCWR1cAoJYnogKnNraXBfYW5kMTAKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCA4Cgk8PQoJJiYKCipza2lwX2FuZDEwOgoJLy8gbm9kZSBudW1iZXIgbm90IGluIHZhbGlkIHJhbmdlCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI0CgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IG1heFBvb2xzUGVyTm9kZUZvclRoaXNWYWxpZGF0b3I7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzk6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI0CgkvLyBpIDwgbWF4UG9vbHNQZXJOb2RlRm9yVGhpc1ZhbGlkYXRvcgoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglmcmFtZV9kaWcgMSAvLyBtYXhQb29sc1Blck5vZGVGb3JUaGlzVmFsaWRhdG9yOiB1aW50NjQKCTwKCWJ6ICpmb3JfOV9lbmQKCgkvLyAqaWY0NF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMjUKCS8vIG5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbbm9kZU51bSAtIDFdLnBvb2xBcHBJZHNbaV0gPT09IDAKCWZyYW1lX2RpZyAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCWludCAwCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgMQoJLQoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWY0NF9lbmQKCgkvLyAqaWY0NF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI3CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLm5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbbm9kZU51bSAtIDFdLnBvb2xBcHBJZHNbaV0gPSBwb29sQXBwSWQKCWludCA5MDAKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCAxCgktCglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDAKCSsKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJZnJhbWVfZGlnIC0yIC8vIHBvb2xBcHBJZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMjgKCS8vIHJldHVybgoJcmV0c3ViCgoqaWY0NF9lbmQ6CgoqZm9yXzlfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI0CgkvLyBpICs9IDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCWIgKmZvcl85CgoqZm9yXzlfZW5kOgoJLy8gbm8gYXZhaWxhYmxlIHNwYWNlIGluIHNwZWNpZmllZCBub2RlIGZvciB0aGlzIHBvb2wKCWVycgoJcmV0c3ViCgovLyBkb2VzU3Rha2VyTWVldEdhdGluZyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQpOiB2b2lkCi8vCi8vIENoZWNrcyBpZiBhIHN0YWtlciBtZWV0cyB0aGUgZ2F0aW5nIHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgYnkgdGhlIHZhbGlkYXRvci4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWx1ZVRvVmVyaWZ5IC0gVGhlIHZhbHVlIHRvIHZlcmlmeSBhZ2FpbnN0IHRoZSBnYXRpbmcgcmVxdWlyZW1lbnRzLgovLyBAcmV0dXJucyB7dm9pZH0gb3IgYXNzZXJ0cyBpZiByZXF1aXJlbWVudHMgbm90IG1ldC4KZG9lc1N0YWtlck1lZXRHYXRpbmc6Cglwcm90byAyIDAKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA4CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI0MgoJLy8gdHlwZSA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLmVudHJ5R2F0aW5nVHlwZQoJaW50IDgwCglpbnQgMQoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMCAvLyB0eXBlOiB1aW50OAoKCS8vICppZjQ1X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI0MwoJLy8gdHlwZSA9PT0gR0FUSU5HX1RZUEVfTk9ORQoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAwCgk9PQoJYnogKmlmNDVfZW5kCgoJLy8gKmlmNDVfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI0NAoJLy8gcmV0dXJuCglyZXRzdWIKCippZjQ1X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNDYKCS8vIHN0YWtlciA9IHRoaXMudHhuLnNlbmRlcgoJdHhuIFNlbmRlcgoJZnJhbWVfYnVyeSAxIC8vIHN0YWtlcjogYWRkcmVzcwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNDcKCS8vIGNvbmZpZyA9IGNsb25lKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnKQoJaW50IDAKCWludCAyNDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglmcmFtZV9idXJ5IDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCgkvLyAqaWY0Nl9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTEKCS8vIHR5cGUgPT09IEdBVElOR19UWVBFX0FTU0VUU19DUkVBVEVEX0JZIHx8CgkvLyAgICAgICAgICAgICB0eXBlID09PSBHQVRJTkdfVFlQRV9BU1NFVF9JRCB8fAoJLy8gICAgICAgICAgICAgdHlwZSA9PT0gR0FUSU5HX1RZUEVfQ1JFQVRFRF9CWV9ORkRfQUREUkVTU0VTCglmcmFtZV9kaWcgMCAvLyB0eXBlOiB1aW50OAoJaW50IDEKCT09CglkdXAKCWJueiAqc2tpcF9vcjQKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMgoJPT0KCXx8Cgoqc2tpcF9vcjQ6CglkdXAKCWJueiAqc2tpcF9vcjUKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMwoJPT0KCXx8Cgoqc2tpcF9vcjU6CglieiAqaWY0Nl9lbmQKCgkvLyAqaWY0Nl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjU1CgkvLyBhc3NlcnQodmFsdWVUb1ZlcmlmeSAhPT0gMCkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWludCAwCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI1NgoJLy8gYmFsUmVxdWlyZWQgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5nYXRpbmdBc3NldE1pbkJhbGFuY2UKCWludCAxNDUKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAzIC8vIGJhbFJlcXVpcmVkOiB1aW50NjQKCgkvLyAqaWY0N19jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTcKCS8vIGJhbFJlcXVpcmVkID09PSAwCglmcmFtZV9kaWcgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0CglpbnQgMAoJPT0KCWJ6ICppZjQ3X2VuZAoKCS8vICppZjQ3X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTgKCS8vIGJhbFJlcXVpcmVkID0gMQoJaW50IDEKCWZyYW1lX2J1cnkgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0CgoqaWY0N19lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjYwCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgc3Rha2VyLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQodmFsdWVUb1ZlcmlmeSkpID49IGJhbFJlcXVpcmVkLAoJLy8gICAgICAgICAgICAgICAgICdtdXN0IGhhdmUgcmVxdWlyZWQgbWluaW11bSBiYWxhbmNlIG9mIHZhbGlkYXRvciBkZWZpbmVkIHRva2VuIHRvIGFkZCBzdGFrZScsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgMSAvLyBzdGFrZXI6IGFkZHJlc3MKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQoJcG9wCglmcmFtZV9kaWcgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0Cgk+PQoKCS8vIG11c3QgaGF2ZSByZXF1aXJlZCBtaW5pbXVtIGJhbGFuY2Ugb2YgdmFsaWRhdG9yIGRlZmluZWQgdG9rZW4gdG8gYWRkIHN0YWtlCglhc3NlcnQKCippZjQ2X2VuZDoKCS8vICppZjQ4X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI2NQoJLy8gdHlwZSA9PT0gR0FUSU5HX1RZUEVfQVNTRVRTX0NSRUFURURfQlkKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMQoJPT0KCWJ6ICppZjQ4X2VuZAoKCS8vICppZjQ4X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNjYKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICBBc3NldElELmZyb21VaW50NjQodmFsdWVUb1ZlcmlmeSkuY3JlYXRvciA9PT0gY29uZmlnLmVudHJ5R2F0aW5nQWRkcmVzcywKCS8vICAgICAgICAgICAgICAgICAnc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgY3JlYXRlZCBieSBjcmVhdG9yIHRoYXQgdGhlIHZhbGlkYXRvciBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UnLAoJLy8gICAgICAgICAgICAgKQoJZnJhbWVfZGlnIC0yIC8vIHZhbHVlVG9WZXJpZnk6IHVpbnQ2NAoJYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKCXBvcAoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgODEgMzIKCT09CgoJLy8gc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgY3JlYXRlZCBieSBjcmVhdG9yIHRoYXQgdGhlIHZhbGlkYXRvciBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UKCWFzc2VydAoKKmlmNDhfZW5kOgoJLy8gKmlmNDlfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjcxCgkvLyB0eXBlID09PSBHQVRJTkdfVFlQRV9BU1NFVF9JRAoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAyCgk9PQoJYnogKmlmNDlfZW5kCgoJLy8gKmlmNDlfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3MgoJLy8gZm91bmQgPSBmYWxzZQoJaW50IDAKCWZyYW1lX2J1cnkgNCAvLyBmb3VuZDogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNzMKCS8vIGNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0cwoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMTEzIDMyCglkdXAKCWZyYW1lX2J1cnkgNSAvLyBjb3B5IG9mIHRoZSBhcnJheSB3ZSBhcmUgaXRlcmF0aW5nIG92ZXIKCWV4dHJhY3QgMCA4CglidG9pCglmcmFtZV9idXJ5IDYgLy8gYXNzZXRJZDogdWludDY0CglpbnQgMAoJZnJhbWVfYnVyeSA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCgoqZm9yT2ZfMDoKCS8vICppZjUwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3NAoJLy8gdmFsdWVUb1ZlcmlmeSA9PT0gYXNzZXRJZAoJZnJhbWVfZGlnIC0yIC8vIHZhbHVlVG9WZXJpZnk6IHVpbnQ2NAoJZnJhbWVfZGlnIDYgLy8gYXNzZXRJZDogdWludDY0Cgk9PQoJYnogKmlmNTBfZW5kCgoJLy8gKmlmNTBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3NQoJLy8gZm91bmQgPSB0cnVlCglpbnQgMQoJZnJhbWVfYnVyeSA0IC8vIGZvdW5kOiBib29sCgliICpmb3JPZl8wX2VuZAoKKmlmNTBfZW5kOgoKKmZvck9mXzBfY29udGludWU6CgkvLyBpbmNyZW1lbnQgb2Zmc2V0IGFuZCBsb29wIGlmIG5vdCBvdXQgb2YgYm91bmRzCglmcmFtZV9kaWcgNyAvLyB0aGUgb2Zmc2V0IHdlIGFyZSBleHRyYWN0aW5nIHRoZSBuZXh0IGVsZW1lbnQgZnJvbQoJaW50IDgKCSsKCWR1cAoJaW50IDMyIC8vIG9mZnNldCBvZiBsYXN0IGVsZW1lbnQKCTwKCWJ6ICpmb3JPZl8wX2VuZAoJZnJhbWVfYnVyeSA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCglmcmFtZV9kaWcgNSAvLyBjb3B5IG9mIHRoZSBhcnJheSB3ZSBhcmUgaXRlcmF0aW5nIG92ZXIKCWZyYW1lX2RpZyA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCglpbnQgOAoJZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSA2IC8vIGFzc2V0SWQ6IHVpbnQ2NAoJYiAqZm9yT2ZfMAoKKmZvck9mXzBfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3OQoJLy8gYXNzZXJ0KGZvdW5kLCAnc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgaWRlbnRpY2FsIHRvIHRoZSBhc3NldCBpZCBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UnKQoJZnJhbWVfZGlnIDQgLy8gZm91bmQ6IGJvb2wKCgkvLyBzcGVjaWZpZWQgYXNzZXQgbXVzdCBiZSBpZGVudGljYWwgdG8gdGhlIGFzc2V0IGlkIGRlZmluZWQgYXMgYSByZXF1aXJlbWVudCB0byBzdGFrZQoJYXNzZXJ0CgoqaWY0OV9lbmQ6CgkvLyAqaWY1MV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyODEKCS8vIHR5cGUgPT09IEdBVElOR19UWVBFX0NSRUFURURfQllfTkZEX0FERFJFU1NFUwoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAzCgk9PQoJYnogKmlmNTFfZW5kCgoJLy8gKmlmNTFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI4NAoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIHRoaXMuaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0KGNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0c1swXSwgQXNzZXRJRC5mcm9tVWludDY0KHZhbHVlVG9WZXJpZnkpLmNyZWF0b3IpLAoJLy8gICAgICAgICAgICAgICAgICdzcGVjaWZpZWQgYXNzZXQgbXVzdCBiZSBjcmVhdGVkIGJ5IGNyZWF0b3IgdGhhdCBpcyBvbmUgb2YgdGhlIGxpbmtlZCBhZGRyZXNzZXMgaW4gYW4gbmZkJywKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCglwb3AKCWZyYW1lX2RpZyAyIC8vIGNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCglleHRyYWN0IDExMyA4CglidG9pCgljYWxsc3ViIGlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdAoKCS8vIHNwZWNpZmllZCBhc3NldCBtdXN0IGJlIGNyZWF0ZWQgYnkgY3JlYXRvciB0aGF0IGlzIG9uZSBvZiB0aGUgbGlua2VkIGFkZHJlc3NlcyBpbiBhbiBuZmQKCWFzc2VydAoKKmlmNTFfZW5kOgoJLy8gKmlmNTJfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjg5CgkvLyB0eXBlID09PSBHQVRJTkdfVFlQRV9TRUdNRU5UX09GX05GRAoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCA0Cgk9PQoJYnogKmlmNTJfZW5kCgoJLy8gKmlmNTJfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI5MQoJLy8gdXNlck9mZmVyZWRORkRBcHBJRCA9IHZhbHVlVG9WZXJpZnkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWZyYW1lX2J1cnkgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjkyCgkvLyBhc3NlcnQodGhpcy5pc05GREFwcElEVmFsaWQodXNlck9mZmVyZWRORkRBcHBJRCksICdwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZCcpCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWNhbGxzdWIgaXNORkRBcHBJRFZhbGlkCgoJLy8gcHJvdmlkZWQgTkZEIG11c3QgYmUgdmFsaWQKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyOTUKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICByYXdCeXRlcyhBcHBJRC5mcm9tVWludDY0KHVzZXJPZmZlcmVkTkZEQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzKSA9PT0KCS8vICAgICAgICAgICAgICAgICAgICAgcmF3Qnl0ZXMoc3Rha2VyKSB8fCB0aGlzLmlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdCh1c2VyT2ZmZXJlZE5GREFwcElELCBzdGFrZXIpLAoJLy8gICAgICAgICAgICAgICAgICJwcm92aWRlZCBuZmQgZm9yIGVudHJ5IGlzbid0IG93bmVkIG9yIGxpbmtlZCB0byB0aGUgc3Rha2VyIiwKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyA4IC8vIHVzZXJPZmZlcmVkTkZEQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQodXNlck9mZmVyZWRORkRBcHBJRCkuZ2xvYmFsU3RhdGUoJ2kub3duZXIuYScpCglhc3NlcnQKCWZyYW1lX2RpZyAxIC8vIHN0YWtlcjogYWRkcmVzcwoJPT0KCWR1cAoJYm56ICpza2lwX29yNgoJZnJhbWVfZGlnIDEgLy8gc3Rha2VyOiBhZGRyZXNzCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWNhbGxzdWIgaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0Cgl8fAoKKnNraXBfb3I2OgoJLy8gcHJvdmlkZWQgbmZkIGZvciBlbnRyeSBpc24ndCBvd25lZCBvciBsaW5rZWQgdG8gdGhlIHN0YWtlcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMwMgoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIGJ0b2koQXBwSUQuZnJvbVVpbnQ2NCh1c2VyT2ZmZXJlZE5GREFwcElEKS5nbG9iYWxTdGF0ZSgnaS5wYXJlbnRBcHBJRCcpIGFzIGJ5dGVzKSA9PT0KCS8vICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmVudHJ5R2F0aW5nQXNzZXRzWzBdLAoJLy8gICAgICAgICAgICAgICAgICdzcGVjaWZpZWQgbmZkIG11c3QgYmUgYSBzZWdtZW50IG9mIHRoZSBuZmQgdGhlIHZhbGlkYXRvciBzcGVjaWZpZWQgYXMgYSByZXF1aXJlbWVudCcsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWJ5dGUgMHg2OTJlNzA2MTcyNjU2ZTc0NDE3MDcwNDk0NCAvLyAiaS5wYXJlbnRBcHBJRCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHVzZXJPZmZlcmVkTkZEQXBwSUQpLmdsb2JhbFN0YXRlKCdpLnBhcmVudEFwcElEJykKCWFzc2VydAoJYnRvaQoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMTEzIDgKCWJ0b2kKCT09CgoJLy8gc3BlY2lmaWVkIG5mZCBtdXN0IGJlIGEgc2VnbWVudCBvZiB0aGUgbmZkIHRoZSB2YWxpZGF0b3Igc3BlY2lmaWVkIGFzIGEgcmVxdWlyZW1lbnQKCWFzc2VydAoKKmlmNTJfZW5kOgoJcmV0c3ViCgovLyBpc05GREFwcElEVmFsaWQobmZkQXBwSUQ6IHVpbnQ2NCk6IGJvb2xlYW4KLy8KLy8gQ2hlY2tzIGlmIHRoZSBnaXZlbiBORkQgQXBwIGlkIGlzIHZhbGlkLiAgVXNpbmcgb25seSB0aGUgQXBwIGlkIHRoZXJlJ3Mgbm8gdmFsaWRhdGlvbiBhZ2FpbnN0IHRoZSBuYW1lIChpZTogdGhhdCBuZmQgWCBpcyBuYW1lIFkpCi8vIFNvIGl0J3MgYXNzdW1lZCBmb3IgdGhlIGNhbGxlciwgdGhlIGFwcCBpZCBhbG9uZSBpcyBmaW5lLiAgVGhlIG5hbWUgaXMgZmV0Y2hlZCBmcm9tIHRoZSBzcGVjaWZpZWQgYXBwIGlkIGFuZCB0aGUgdHdvCi8vIHRvZ2V0aGVyIGFyZSB1c2VkIGZvciB2YWxpZGl0eSBjaGVjayBjYWxsIHRvIHRoZSBuZmQgcmVnaXN0cnkuCi8vCi8vIEBwYXJhbSB7dWludDY0fSBuZmRBcHBJRCAtIFRoZSBORkQgQXBwIGlkIHRvIHZlcmlmeS4KLy8KLy8gQHJldHVybnMge2Jvb2xlYW59IC0gUmV0dXJucyB0cnVlIGlmIHRoZSBORkQgQXBwIGlkIGlzIHZhbGlkLCBvdGhlcndpc2UgZmFsc2UuCmlzTkZEQXBwSURWYWxpZDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMyMQoJLy8gdXNlck9mZmVyZWRORkROYW1lID0gQXBwSUQuZnJvbVVpbnQ2NChuZmRBcHBJRCkuZ2xvYmFsU3RhdGUoJ2kubmFtZScpIGFzIHN0cmluZwoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWJ5dGUgMHg2OTJlNmU2MTZkNjUgLy8gImkubmFtZSIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KG5mZEFwcElEKS5nbG9iYWxTdGF0ZSgnaS5uYW1lJykKCWFzc2VydAoJZnJhbWVfYnVyeSAwIC8vIHVzZXJPZmZlcmVkTkZETmFtZTogc3RyaW5nCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMyMwoJLy8gcmV0dXJuIHNlbmRNZXRob2RDYWxsPFtzdHJpbmcsIHVpbnQ2NF0sIGJvb2xlYW4+KHsKCS8vICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQodGhpcy5uZmRSZWdpc3RyeUFwcElkKSwKCS8vICAgICAgICAgICAgIG5hbWU6ICdpc1ZhbGlkTmZkQXBwSWQnLAoJLy8gICAgICAgICAgICAgbWV0aG9kQXJnczogW3VzZXJPZmZlcmVkTkZETmFtZSwgbmZkQXBwSURdLAoJLy8gICAgICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAiaXNWYWxpZE5mZEFwcElkKHN0cmluZyx1aW50NjQpYm9vbCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMyNAoJLy8gYXBwbGljYXRpb25JRDogQXBwSUQuZnJvbVVpbnQ2NCh0aGlzLm5mZFJlZ2lzdHJ5QXBwSWQpCglsb2FkIDIwMCAvLyBUTVBMX25mZFJlZ2lzdHJ5QXBwSWQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMjYKCS8vIG1ldGhvZEFyZ3M6IFt1c2VyT2ZmZXJlZE5GRE5hbWUsIG5mZEFwcElEXQoJZnJhbWVfZGlnIDAgLy8gdXNlck9mZmVyZWRORkROYW1lOiBzdHJpbmcKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoJaXR4biBOdW1Mb2dzCglpbnQgMQoJLQoJaXR4bmFzIExvZ3MKCWV4dHJhY3QgNCAwCglpbnQgMAoJZ2V0Yml0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCglyZXRzdWIKCi8vIGlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdChuZmRBcHBJRDogdWludDY0LCBhZGRyVG9GaW5kOiBBZGRyZXNzKTogYm9vbGVhbgovLwovLyBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBhZGRyZXNzIGlzIHByZXNlbnQgaW4gYW4gTkZEcyBsaXN0IG9mIHZlcmlmaWVkIGFkZHJlc3Nlcy4KLy8gVGhlIE5GRCBpcyBhc3N1bWVkIHRvIGhhdmUgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcyBvZmZpY2lhbC4KLy8KLy8gQHBhcmFtIHt1aW50NjR9IG5mZEFwcElEIC0gVGhlIE5GRCBhcHBsaWNhdGlvbiBpZC4KLy8gQHBhcmFtIHtBZGRyZXNzfSBhZGRyVG9GaW5kIC0gVGhlIGFkZHJlc3MgdG8gZmluZCBpbiB0aGUgdi5jYUFsZ28uMC5hcyBwcm9wZXJ0eQovLyBAcmV0dXJuIHtib29sZWFufSAtIGB0cnVlYCBpZiB0aGUgYWRkcmVzcyBpcyBwcmVzZW50LCBgZmFsc2VgIG90aGVyd2lzZS4KaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0OgoJcHJvdG8gMiAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMzkKCS8vIHNlbmRBcHBDYWxsKHsKCS8vICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLAoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25BcmdzOiBbJ3JlYWRfcHJvcGVydHknLCAndi5jYUFsZ28uMC5hcyddLAoJLy8gICAgICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzQwCgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KG5mZEFwcElEKQoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDEKCS8vIGFwcGxpY2F0aW9uQXJnczogWydyZWFkX3Byb3BlcnR5JywgJ3YuY2FBbGdvLjAuYXMnXQoJYnl0ZSAweDcyNjU2MTY0NWY3MDcyNmY3MDY1NzI3NDc5IC8vICJyZWFkX3Byb3BlcnR5IgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWJ5dGUgMHg3NjJlNjM2MTQxNmM2NzZmMmUzMDJlNjE3MyAvLyAidi5jYUFsZ28uMC5hcyIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDMKCS8vIGNhQWxnb0RhdGEgPSB0aGlzLml0eG4ubGFzdExvZwoJaXR4biBMYXN0TG9nCglmcmFtZV9idXJ5IDAgLy8gY2FBbGdvRGF0YTogYnl0ZVtdCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM0NAoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBjYUFsZ29EYXRhLmxlbmd0aDsgaSArPSAzMikKCWludCAwCglmcmFtZV9idXJ5IDEgLy8gaTogdWludDY0CgoqZm9yXzEwOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM0NAoJLy8gaSA8IGNhQWxnb0RhdGEubGVuZ3RoCglmcmFtZV9kaWcgMSAvLyBpOiB1aW50NjQKCWZyYW1lX2RpZyAwIC8vIGNhQWxnb0RhdGE6IGJ5dGVbXQoJbGVuCgk8CglieiAqZm9yXzEwX2VuZAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDUKCS8vIGFkZHIgPSBleHRyYWN0MyhjYUFsZ29EYXRhLCBpLCAzMikKCWZyYW1lX2RpZyAwIC8vIGNhQWxnb0RhdGE6IGJ5dGVbXQoJZnJhbWVfZGlnIDEgLy8gaTogdWludDY0CglpbnQgMzIKCWV4dHJhY3QzCglmcmFtZV9idXJ5IDIgLy8gYWRkcjogYnl0ZVtdCgoJLy8gKmlmNTNfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzQ2CgkvLyBhZGRyICE9PSByYXdCeXRlcyhnbG9iYWxzLnplcm9BZGRyZXNzKSAmJiBhZGRyID09PSByYXdCeXRlcyhhZGRyVG9GaW5kKQoJZnJhbWVfZGlnIDIgLy8gYWRkcjogYnl0ZVtdCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CglkdXAKCWJ6ICpza2lwX2FuZDExCglmcmFtZV9kaWcgMiAvLyBhZGRyOiBieXRlW10KCWZyYW1lX2RpZyAtMiAvLyBhZGRyVG9GaW5kOiBBZGRyZXNzCgk9PQoJJiYKCipza2lwX2FuZDExOgoJYnogKmlmNTNfZW5kCgoJLy8gKmlmNTNfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM0NwoJLy8gcmV0dXJuIHRydWUKCWludCAxCgliICppc0FkZHJlc3NJbk5GRENBQWxnb0xpc3QqcmV0dXJuCgoqaWY1M19lbmQ6CgoqZm9yXzEwX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM0NAoJLy8gaSArPSAzMgoJZnJhbWVfZGlnIDEgLy8gaTogdWludDY0CglpbnQgMzIKCSsKCWZyYW1lX2J1cnkgMSAvLyBpOiB1aW50NjQKCWIgKmZvcl8xMAoKKmZvcl8xMF9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzUwCgkvLyByZXR1cm4gZmFsc2UKCWludCAwCgoqaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0KnJldHVybjoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDIKCXJldHN1YgoKLy8gYWxnb1NhdHVyYXRpb25MZXZlbCgpOiB1aW50NjQKLy8KLy8gUmV0dXJucyB0aGUgbWF4aW11bSBhbGxvd2VkIHN0YWtlIHBlciB2YWxpZGF0b3IgYmFzZWQgb24gYSBwZXJjZW50YWdlIG9mIGFsbCBjdXJyZW50IG9ubGluZSBzdGFrZSBiZWZvcmUKLy8gdGhlIHZhbGlkYXRvciBpcyBjb25zaWRlcmVkIHNhdHVyYXRlZCAtIHdoZXJlIHJld2FyZHMgYXJlIGRpbWluaXNoZWQuCi8vIE5PVEU6IHRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCB0d2ljZSAtIGhlcmUgYW5kIGluIHN0YWtpbmcgcG9vbCBjb250cmFjdC4gIEJvdGggbXVzdCBiZSBpZGVudGljYWwuCmFsZ29TYXR1cmF0aW9uTGV2ZWw6Cglwcm90byAwIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNTkKCS8vIG9ubGluZSA9IHRoaXMuZ2V0Q3VycmVudE9ubGluZVN0YWtlKCkKCWNhbGxzdWIgZ2V0Q3VycmVudE9ubGluZVN0YWtlCglmcmFtZV9idXJ5IDAgLy8gb25saW5lOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzYxCgkvLyByZXR1cm4gd2lkZVJhdGlvKFtvbmxpbmUsIE1BWF9WQUxJREFUT1JfU09GVF9QQ1RfT0ZfT05MSU5FXzFERUNJTUFMXSwgWzEwMDBdKQoJZnJhbWVfZGlnIDAgLy8gb25saW5lOiB1aW50NjQKCWludCAxMDAKCW11bHcKCWludCAwCglpbnQgMTAwMAoJZGl2bW9kdwoJcG9wCglwb3AKCXN3YXAKCSEKCgkvLyB3aWRlUmF0aW8gZmFpbGVkCglhc3NlcnQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gbWF4QWxsb3dlZFN0YWtlKCk6IHVpbnQ2NAovLwovLyBSZXR1cm5zIHRoZSBNQVhJTVVNIGFsbG93ZWQgc3Rha2UgcGVyIHZhbGlkYXRvciBiYXNlZCBvbiBhIHBlcmNlbnRhZ2Ugb2YgYWxsIGN1cnJlbnQgb25saW5lIHN0YWtlLgovLyBBZGRpbmcgc3Rha2UgaXMgY29tcGxldGVseSBibG9ja2VkIGF0IHRoaXMgYW1vdW50LgptYXhBbGxvd2VkU3Rha2U6Cglwcm90byAwIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNjkKCS8vIG9ubGluZSA9IHRoaXMuZ2V0Q3VycmVudE9ubGluZVN0YWtlKCkKCWNhbGxzdWIgZ2V0Q3VycmVudE9ubGluZVN0YWtlCglmcmFtZV9idXJ5IDAgLy8gb25saW5lOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzcxCgkvLyByZXR1cm4gd2lkZVJhdGlvKFtvbmxpbmUsIE1BWF9WQUxJREFUT1JfSEFSRF9QQ1RfT0ZfT05MSU5FXzFERUNJTUFMXSwgWzEwMDBdKQoJZnJhbWVfZGlnIDAgLy8gb25saW5lOiB1aW50NjQKCWludCAxNTAKCW11bHcKCWludCAwCglpbnQgMTAwMAoJZGl2bW9kdwoJcG9wCglwb3AKCXN3YXAKCSEKCgkvLyB3aWRlUmF0aW8gZmFpbGVkCglhc3NlcnQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gbWF4QWxnb0FsbG93ZWRQZXJQb29sKCk6IHVpbnQ2NAovLwovLyBSZXR1cm5zIHRoZSBNQVhJTVVNIGFsbG93ZWQgc3Rha2UgcGVyIHBvb2wgYW5kIHN0aWxsIHJlY2VpdmUgaW5jZW50aXZlcyAtIHdlJ2xsIHRyZWF0IHRoaXMgYXMgdGhlICdtYXggcGVyIHBvb2wnCm1heEFsZ29BbGxvd2VkUGVyUG9vbDoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNzgKCS8vIHJldHVybiBnbG9iYWxzLnBheW91dHNNYXhCYWxhbmNlCglnbG9iYWwgUGF5b3V0c01heEJhbGFuY2UKCXJldHN1YgoKLy8gZ2V0Q3VycmVudE9ubGluZVN0YWtlKCk6IHVpbnQ2NApnZXRDdXJyZW50T25saW5lU3Rha2U6Cglwcm90byAwIDEKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzgyCgkvLyByZXR1cm4gb25saW5lU3Rha2UoKQoJb25saW5lX3N0YWtlCglyZXRzdWIKCi8vIG1pbkJhbGFuY2VGb3JBY2NvdW50KGNvbnRyYWN0czogdWludDY0LCBleHRyYVBhZ2VzOiB1aW50NjQsIGFzc2V0czogdWludDY0LCBsb2NhbEludHM6IHVpbnQ2NCwgbG9jYWxCeXRlczogdWludDY0LCBnbG9iYWxJbnRzOiB1aW50NjQsIGdsb2JhbEJ5dGVzOiB1aW50NjQpOiB1aW50NjQKbWluQmFsYW5jZUZvckFjY291bnQ6Cglwcm90byA3IDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzOTQKCS8vIG1pbkJhbCA9IEFMR09SQU5EX0FDQ09VTlRfTUlOX0JBTEFOQ0UKCWludCAxMDAwMDAKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzOTUKCS8vIG1pbkJhbCArPSBjb250cmFjdHMgKiBBUFBMSUNBVElPTl9CQVNFX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyBjb250cmFjdHM6IHVpbnQ2NAoJaW50IDEwMDAwMAoJKgoJKwoJZnJhbWVfYnVyeSAwIC8vIG1pbkJhbDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM5NgoJLy8gbWluQmFsICs9IGV4dHJhUGFnZXMgKiBBUFBMSUNBVElPTl9CQVNFX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyBleHRyYVBhZ2VzOiB1aW50NjQKCWludCAxMDAwMDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzOTcKCS8vIG1pbkJhbCArPSBhc3NldHMgKiBBU1NFVF9IT0xESU5HX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMyAvLyBhc3NldHM6IHVpbnQ2NAoJaW50IDEwMDAwMAoJKgoJKwoJZnJhbWVfYnVyeSAwIC8vIG1pbkJhbDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM5OAoJLy8gbWluQmFsICs9IGxvY2FsSW50cyAqIFNTQ19WQUxVRV9VSU5UCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoJZnJhbWVfZGlnIC00IC8vIGxvY2FsSW50czogdWludDY0CglpbnQgMjg1MDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzOTkKCS8vIG1pbkJhbCArPSBnbG9iYWxJbnRzICogU1NDX1ZBTFVFX1VJTlQKCWZyYW1lX2RpZyAwIC8vIG1pbkJhbDogdWludDY0CglmcmFtZV9kaWcgLTYgLy8gZ2xvYmFsSW50czogdWludDY0CglpbnQgMjg1MDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDAKCS8vIG1pbkJhbCArPSBsb2NhbEJ5dGVzICogU1NDX1ZBTFVFX0JZVEVTCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoJZnJhbWVfZGlnIC01IC8vIGxvY2FsQnl0ZXM6IHVpbnQ2NAoJaW50IDUwMDAwCgkqCgkrCglmcmFtZV9idXJ5IDAgLy8gbWluQmFsOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDAxCgkvLyBtaW5CYWwgKz0gZ2xvYmFsQnl0ZXMgKiBTU0NfVkFMVUVfQllURVMKCWZyYW1lX2RpZyAwIC8vIG1pbkJhbDogdWludDY0CglmcmFtZV9kaWcgLTcgLy8gZ2xvYmFsQnl0ZXM6IHVpbnQ2NAoJaW50IDUwMDAwCgkqCgkrCglmcmFtZV9idXJ5IDAgLy8gbWluQmFsOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDAyCgkvLyByZXR1cm4gbWluQmFsCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoJcmV0c3ViCgovLyBjb3N0Rm9yQm94U3RvcmFnZSh0b3RhbE51bUJ5dGVzOiB1aW50NjQpOiB1aW50NjQKY29zdEZvckJveFN0b3JhZ2U6Cglwcm90byAxIDEKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDA5CgkvLyByZXR1cm4gU0NCT1hfUEVSQk9YICsgdG90YWxOdW1CeXRlcyAqIFNDQk9YX1BFUkJZVEUKCWludCAyNTAwCglmcmFtZV9kaWcgLTEgLy8gdG90YWxOdW1CeXRlczogdWludDY0CglpbnQgNDAwCgkqCgkrCglyZXRzdWIKCipjcmVhdGVfTm9PcDoKCW1ldGhvZCAiY3JlYXRlQXBwbGljYXRpb24oKXZvaWQiCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAwCgltYXRjaCAqYWJpX3JvdXRlX2NyZWF0ZUFwcGxpY2F0aW9uCgoJLy8gdGhpcyBjb250cmFjdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGdpdmVuIEFCSSBtZXRob2QgZm9yIGNyZWF0ZSBOb09wCgllcnIKCipjYWxsX05vT3A6CgltZXRob2QgImluaXRTdGFraW5nQ29udHJhY3QodWludDY0KXZvaWQiCgltZXRob2QgImxvYWRTdGFraW5nQ29udHJhY3REYXRhKHVpbnQ2NCxieXRlW10pdm9pZCIKCW1ldGhvZCAiZmluYWxpemVTdGFraW5nQ29udHJhY3QoKXZvaWQiCgltZXRob2QgImdhcygpdm9pZCIKCW1ldGhvZCAiZ2V0TWJyQW1vdW50cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCgltZXRob2QgImdldFByb3RvY29sQ29uc3RyYWludHMoKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiZ2V0TnVtVmFsaWRhdG9ycygpdWludDY0IgoJbWV0aG9kICJnZXRWYWxpZGF0b3JDb25maWcodWludDY0KSh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiZ2V0VmFsaWRhdG9yU3RhdGUodWludDY0KSh1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQpIgoJbWV0aG9kICJnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpIgoJbWV0aG9kICJnZXRQb29scyh1aW50NjQpKHVpbnQ2NCx1aW50MTYsdWludDY0KVtdIgoJbWV0aG9kICJnZXRQb29sQXBwSWQodWludDY0LHVpbnQ2NCl1aW50NjQiCgltZXRob2QgImdldFBvb2xJbmZvKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpKHVpbnQ2NCx1aW50MTYsdWludDY0KSIKCW1ldGhvZCAiZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHVpbnQ2NCl1aW50NjQiCgltZXRob2QgImRvZXNTdGFrZXJOZWVkVG9QYXlNQlIoYWRkcmVzcylib29sIgoJbWV0aG9kICJnZXRTdGFrZWRQb29sc0ZvckFjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCx1aW50NjQpW10iCgltZXRob2QgImdldFRva2VuUGF5b3V0UmF0aW8odWludDY0KSh1aW50NjRbMjRdLHVpbnQ2NCkiCgltZXRob2QgImdldE5vZGVQb29sQXNzaWdubWVudHModWludDY0KSgodWludDY0WzNdKVs4XSkiCgltZXRob2QgImdldE5GRFJlZ2lzdHJ5SUQoKXVpbnQ2NCIKCW1ldGhvZCAiYWRkVmFsaWRhdG9yKHBheSxzdHJpbmcsKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIKCW1ldGhvZCAiY2hhbmdlVmFsaWRhdG9yTWFuYWdlcih1aW50NjQsYWRkcmVzcyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQiCgltZXRob2QgImNoYW5nZVZhbGlkYXRvck5GRCh1aW50NjQsdWludDY0LHN0cmluZyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyh1aW50NjQsYWRkcmVzcyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JSZXdhcmRJbmZvKHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0KXZvaWQiCgltZXRob2QgImFkZFBvb2wocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAic2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KSIKCW1ldGhvZCAic3Rha2VVcGRhdGVkVmlhUmV3YXJkcygodWludDY0LHVpbnQ2NCx1aW50NjQpLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIgoJbWV0aG9kICJzdGFrZVJlbW92ZWQoKHVpbnQ2NCx1aW50NjQsdWludDY0KSxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCl2b2lkIgoJbWV0aG9kICJmaW5kUG9vbEZvclN0YWtlcih1aW50NjQsYWRkcmVzcyx1aW50NjQpKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKSIKCW1ldGhvZCAibW92ZVBvb2xUb05vZGUodWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIKCW1ldGhvZCAiZW1wdHlUb2tlblJld2FyZHModWludDY0LGFkZHJlc3MpdWludDY0IgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggKmFiaV9yb3V0ZV9pbml0U3Rha2luZ0NvbnRyYWN0ICphYmlfcm91dGVfbG9hZFN0YWtpbmdDb250cmFjdERhdGEgKmFiaV9yb3V0ZV9maW5hbGl6ZVN0YWtpbmdDb250cmFjdCAqYWJpX3JvdXRlX2dhcyAqYWJpX3JvdXRlX2dldE1ickFtb3VudHMgKmFiaV9yb3V0ZV9nZXRQcm90b2NvbENvbnN0cmFpbnRzICphYmlfcm91dGVfZ2V0TnVtVmFsaWRhdG9ycyAqYWJpX3JvdXRlX2dldFZhbGlkYXRvckNvbmZpZyAqYWJpX3JvdXRlX2dldFZhbGlkYXRvclN0YXRlICphYmlfcm91dGVfZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyICphYmlfcm91dGVfZ2V0UG9vbHMgKmFiaV9yb3V0ZV9nZXRQb29sQXBwSWQgKmFiaV9yb3V0ZV9nZXRQb29sSW5mbyAqYWJpX3JvdXRlX2dldEN1ck1heFN0YWtlUGVyUG9vbCAqYWJpX3JvdXRlX2RvZXNTdGFrZXJOZWVkVG9QYXlNQlIgKmFiaV9yb3V0ZV9nZXRTdGFrZWRQb29sc0ZvckFjY291bnQgKmFiaV9yb3V0ZV9nZXRUb2tlblBheW91dFJhdGlvICphYmlfcm91dGVfZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cyAqYWJpX3JvdXRlX2dldE5GRFJlZ2lzdHJ5SUQgKmFiaV9yb3V0ZV9hZGRWYWxpZGF0b3IgKmFiaV9yb3V0ZV9jaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyICphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyAqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvck5GRCAqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzICphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mbyAqYWJpX3JvdXRlX2FkZFBvb2wgKmFiaV9yb3V0ZV9hZGRTdGFrZSAqYWJpX3JvdXRlX3NldFRva2VuUGF5b3V0UmF0aW8gKmFiaV9yb3V0ZV9zdGFrZVVwZGF0ZWRWaWFSZXdhcmRzICphYmlfcm91dGVfc3Rha2VSZW1vdmVkICphYmlfcm91dGVfZmluZFBvb2xGb3JTdGFrZXIgKmFiaV9yb3V0ZV9tb3ZlUG9vbFRvTm9kZSAqYWJpX3JvdXRlX2VtcHR5VG9rZW5SZXdhcmRzCgoJLy8gdGhpcyBjb250cmFjdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGdpdmVuIEFCSSBtZXRob2QgZm9yIGNhbGwgTm9PcAoJZXJy", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCgovLyBUaGlzIFRFQUwgd2FzIGdlbmVyYXRlZCBieSBURUFMU2NyaXB0IHYwLjEwMy4wCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbGdvcmFuZGZvdW5kYXRpb24vVEVBTFNjcmlwdAoKLy8gVGhpcyBjb250cmFjdCBpcyBjb21wbGlhbnQgd2l0aCBhbmQvb3IgaW1wbGVtZW50cyB0aGUgZm9sbG93aW5nIEFSQ3M6IFsgQVJDNCBdCgovLyBUaGUgZm9sbG93aW5nIGxpbmVzIG9mIFRFQUwgYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0ZW1wbGF0ZSB2YXJpYWJsZXMgaW4gc2NyYXRjaCBzbG90cwpwdXNoYnl0ZXMgVE1QTF9uZmRSZWdpc3RyeUFwcElkCmJ0b2kKc3RvcmUgMjAwCgovLyBUaGUgZm9sbG93aW5nIHRlbiBsaW5lcyBvZiBURUFMIGhhbmRsZSBpbml0aWFsIHByb2dyYW0gZmxvdwovLyBUaGlzIHBhdHRlcm4gaXMgdXNlZCB0byBtYWtlIGl0IGVhc3kgZm9yIGFueW9uZSB0byBwYXJzZSB0aGUgc3RhcnQgb2YgdGhlIHByb2dyYW0gYW5kIGRldGVybWluZSBpZiBhIHNwZWNpZmljIGFjdGlvbiBpcyBhbGxvd2VkCi8vIEhlcmUsIGFjdGlvbiByZWZlcnMgdG8gdGhlIE9uQ29tcGxldGUgaW4gY29tYmluYXRpb24gd2l0aCB3aGV0aGVyIHRoZSBhcHAgaXMgYmVpbmcgY3JlYXRlZCBvciBjYWxsZWQKLy8gRXZlcnkgcG9zc2libGUgYWN0aW9uIGZvciB0aGlzIGNvbnRyYWN0IGlzIHJlcHJlc2VudGVkIGluIHRoZSBzd2l0Y2ggc3RhdGVtZW50Ci8vIElmIHRoZSBhY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIGluIHRoZSBjb250cmFjdCwgaXRzIHJlc3BlY3RpdmUgYnJhbmNoIHdpbGwgYmUgIipOT1RfSU1QTEVNRU5URUQiIHdoaWNoIGp1c3QgY29udGFpbnMgImVyciIKdHhuIEFwcGxpY2F0aW9uSUQKIQppbnQgNgoqCnR4biBPbkNvbXBsZXRpb24KKwpzd2l0Y2ggKmNhbGxfTm9PcCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKmNyZWF0ZV9Ob09wICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRAoKKk5PVF9JTVBMRU1FTlRFRDoKCS8vIFRoZSByZXF1ZXN0ZWQgYWN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIGNvbnRyYWN0LiBBcmUgeW91IHVzaW5nIHRoZSBjb3JyZWN0IE9uQ29tcGxldGU/IERpZCB5b3Ugc2V0IHlvdXIgYXBwIElEPwoJZXJyCgovLyBjcmVhdGVBcHBsaWNhdGlvbigpdm9pZAoqYWJpX3JvdXRlX2NyZWF0ZUFwcGxpY2F0aW9uOgoJLy8gZXhlY3V0ZSBjcmVhdGVBcHBsaWNhdGlvbigpdm9pZAoJY2FsbHN1YiBjcmVhdGVBcHBsaWNhdGlvbgoJaW50IDEKCXJldHVybgoKLy8gY3JlYXRlQXBwbGljYXRpb24oKTogdm9pZApjcmVhdGVBcHBsaWNhdGlvbjoKCXByb3RvIDAgMAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyCgkvLyB0aGlzLnN0YWtpbmdQb29sSW5pdGlhbGl6ZWQudmFsdWUgPSBmYWxzZQoJYnl0ZSAweDY5NmU2OTc0IC8vICJpbml0IgoJaW50IDAKCWJ5dGUgMHgwMAoJaW50IDAKCXVuY292ZXIgMgoJc2V0Yml0CglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgzCgkvLyB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgPSAwCglieXRlIDB4NmU3NTZkNTYgLy8gIm51bVYiCglpbnQgMAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NAoJLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlID0gMAoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJaW50IDAKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODUKCS8vIHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlID0gMAoJYnl0ZSAweDczNzQ2MTZiNjU2NCAvLyAic3Rha2VkIgoJaW50IDAKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIGluaXRTdGFraW5nQ29udHJhY3QodWludDY0KXZvaWQKKmFiaV9yb3V0ZV9pbml0U3Rha2luZ0NvbnRyYWN0OgoJLy8gYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBpbml0U3Rha2luZ0NvbnRyYWN0KHVpbnQ2NCl2b2lkCgljYWxsc3ViIGluaXRTdGFraW5nQ29udHJhY3QKCWludCAxCglyZXR1cm4KCi8vIGluaXRTdGFraW5nQ29udHJhY3QoYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0KTogdm9pZAppbml0U3Rha2luZ0NvbnRyYWN0OgoJcHJvdG8gMSAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTAKCS8vIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uY3JlYXRlKGFwcHJvdmFsUHJvZ3JhbVNpemUpCglieXRlIDB4NzA2ZjZmNmM1NDY1NmQ3MDZjNjE3NDY1NDE3MDcwNzI2Zjc2NjE2YzQyNzk3NDY1NzMgLy8gInBvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMiCglmcmFtZV9kaWcgLTEgLy8gYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0Cglib3hfY3JlYXRlCglwb3AKCXJldHN1YgoKLy8gbG9hZFN0YWtpbmdDb250cmFjdERhdGEodWludDY0LGJ5dGVbXSl2b2lkCiphYmlfcm91dGVfbG9hZFN0YWtpbmdDb250cmFjdERhdGE6CgkvLyBkYXRhOiBieXRlW10KCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWV4dHJhY3QgMiAwCgoJLy8gb2Zmc2V0OiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGxvYWRTdGFraW5nQ29udHJhY3REYXRhKHVpbnQ2NCxieXRlW10pdm9pZAoJY2FsbHN1YiBsb2FkU3Rha2luZ0NvbnRyYWN0RGF0YQoJaW50IDEKCXJldHVybgoKLy8gbG9hZFN0YWtpbmdDb250cmFjdERhdGEob2Zmc2V0OiB1aW50NjQsIGRhdGE6IGJ5dGVzKTogdm9pZApsb2FkU3Rha2luZ0NvbnRyYWN0RGF0YToKCXByb3RvIDIgMAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk0CgkvLyBhc3NlcnQoIXRoaXMuc3Rha2luZ1Bvb2xJbml0aWFsaXplZC52YWx1ZSkKCWJ5dGUgMHg2OTZlNjk3NCAvLyAiaW5pdCIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMAoJZ2V0Yml0CgkhCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5NQoJLy8gdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5yZXBsYWNlKG9mZnNldCwgZGF0YSkKCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWZyYW1lX2RpZyAtMSAvLyBvZmZzZXQ6IHVpbnQ2NAoJZnJhbWVfZGlnIC0yIC8vIGRhdGE6IGJ5dGVzCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdCgpdm9pZAoqYWJpX3JvdXRlX2ZpbmFsaXplU3Rha2luZ0NvbnRyYWN0OgoJLy8gZXhlY3V0ZSBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdCgpdm9pZAoJY2FsbHN1YiBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdAoJaW50IDEKCXJldHVybgoKLy8gZmluYWxpemVTdGFraW5nQ29udHJhY3QoKTogdm9pZApmaW5hbGl6ZVN0YWtpbmdDb250cmFjdDoKCXByb3RvIDAgMAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk5CgkvLyB0aGlzLnN0YWtpbmdQb29sSW5pdGlhbGl6ZWQudmFsdWUgPSB0cnVlCglieXRlIDB4Njk2ZTY5NzQgLy8gImluaXQiCglpbnQgMQoJYnl0ZSAweDAwCglpbnQgMAoJdW5jb3ZlciAyCglzZXRiaXQKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIGdhcygpdm9pZAoqYWJpX3JvdXRlX2dhczoKCS8vIGV4ZWN1dGUgZ2FzKCl2b2lkCgljYWxsc3ViIGdhcwoJaW50IDEKCXJldHVybgoKLy8gZ2FzKCk6IHZvaWQKLy8KLy8gZ2FzIGlzIGEgZHVtbXkgbm8tb3AgY2FsbCB0aGF0IGNhbiBiZSB1c2VkIHRvIHBvb2wtdXAgcmVzb3VyY2UgcmVmZXJlbmNlcyBhbmQgb3Bjb2RlIGNvc3QKZ2FzOgoJcHJvdG8gMCAwCglyZXRzdWIKCi8vIGdldE1ickFtb3VudHMoKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0TWJyQW1vdW50czoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXRNYnJBbW91bnRzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0TWJyQW1vdW50cygpOiBNYnJBbW91bnRzCi8vCi8vIFJldHVybnMgdGhlIE1CUiBhbW91bnRzIG5lZWRlZCBmb3IgdmFyaW91cyBhY3Rpb25zOgovLyBbCi8vIGFkZFZhbGlkYXRvck1icjogdWludDY0IC0gbWJyIG5lZWRlZCB0byBhZGQgYSBuZXcgdmFsaWRhdG9yIC0gcGFpZCB0byB2YWxpZGF0b3IgY29udHJhY3QKLy8gYWRkUG9vbE1icjogdWludDY0IC0gbWJyIG5lZWRlZCB0byBhZGQgYSBuZXcgcG9vbCAtIHBhaWQgdG8gdmFsaWRhdG9yCi8vIHBvb2xJbml0TWJyOiB1aW50NjQgLSBtYnIgbmVlZGVkIHRvIGluaXRTdG9yYWdlKCkgb2YgcG9vbCAtIHBhaWQgdG8gcG9vbCBpdHNlbGYKLy8gYWRkU3Rha2VyTWJyOiB1aW50NjQgLSBtYnIgc3Rha2VyIG5lZWRzIHRvIGFkZCB0byBmaXJzdCBzdGFraW5nIHBheW1lbnQgKHN0YXlzIHcvIHZhbGlkYXRvcikKLy8gXQpnZXRNYnJBbW91bnRzOgoJcHJvdG8gMCAxCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5CgkvLyByZXR1cm4gewoJLy8gICAgICAgICAgICAgYWRkVmFsaWRhdG9yTWJyOiB0aGlzLmNvc3RGb3JCb3hTdG9yYWdlKDEgLyogdiBwcmVmaXggKi8gKyBsZW48VmFsaWRhdG9ySWRUeXBlPigpICsgbGVuPFZhbGlkYXRvckluZm8+KCkpLAoJLy8gICAgICAgICAgICAgYWRkUG9vbE1icjogdGhpcy5taW5CYWxhbmNlRm9yQWNjb3VudCgKCS8vICAgICAgICAgICAgICAgICAxLAoJLy8gICAgICAgICAgICAgICAgIC8vIHdlIGNvdWxkIGNhbGN1bGF0ZSB0aGlzIGRpcmVjdGx5IGJ5IHJlZmVyZW5jaW5nIHRoZSBzaXplIG9mIHN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtIGJ1dCBpdCB3b3VsZAoJLy8gICAgICAgICAgICAgICAgIC8vIG1lYW4gb3VyIGNhbGxlcnMgd291bGQgaGF2ZSB0byByZWZlcmVuY2UgdGhlIGJveCBBTkQgYnV5IHVwIGkvbyAtIHNvIGp1c3QgZ28gbWF4IG9uIGV4dHJhIHBhZ2VzCgkvLyAgICAgICAgICAgICAgICAgMywKCS8vICAgICAgICAgICAgICAgICAwLAoJLy8gICAgICAgICAgICAgICAgIDAsCgkvLyAgICAgICAgICAgICAgICAgMCwKCS8vICAgICAgICAgICAgICAgICBTdGFraW5nUG9vbC5zY2hlbWEuZ2xvYmFsLm51bVVpbnQsCgkvLyAgICAgICAgICAgICAgICAgU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1CeXRlU2xpY2UsCgkvLyAgICAgICAgICAgICApLAoJLy8gICAgICAgICAgICAgcG9vbEluaXRNYnI6CgkvLyAgICAgICAgICAgICAgICAgQUxHT1JBTkRfQUNDT1VOVF9NSU5fQkFMQU5DRSArCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5jb3N0Rm9yQm94U3RvcmFnZSg3IC8qICdzdGFrZXJzJyBuYW1lICovICsgbGVuPFN0YWtlZEluZm8+KCkgKiBNQVhfU1RBS0VSU19QRVJfUE9PTCksCgkvLyAgICAgICAgICAgICBhZGRTdGFrZXJNYnI6CgkvLyAgICAgICAgICAgICAgICAgLy8gaG93IG11Y2ggdG8gY2hhcmdlIGZvciBmaXJzdCB0aW1lIGEgc3Rha2VyIGFkZHMgc3Rha2UgLSBzaW5jZSB3ZSBhZGQgYSB0cmFja2luZyBib3ggcGVyIHN0YWtlcgoJLy8gICAgICAgICAgICAgICAgIHRoaXMuY29zdEZvckJveFN0b3JhZ2UoCgkvLyAgICAgICAgICAgICAgICAgICAgIDMgLyogJ3NwcycgcHJlZml4ICovICsgbGVuPEFkZHJlc3M+KCkgKyBsZW48VmFsaWRhdG9yUG9vbEtleT4oKSAqIE1BWF9QT09MU19QRVJfU1RBS0VSLAoJLy8gICAgICAgICAgICAgICAgICksIC8vIHNpemUgb2Yga2V5ICsgYWxsIHZhbHVlcwoJLy8gICAgICAgICB9CglpbnQgMTEwMQoJY2FsbHN1YiBjb3N0Rm9yQm94U3RvcmFnZQoJaXRvYgoJaW50IDMKCWludCAxMQoJaW50IDAKCWR1cG4gMgoJaW50IDMKCWludCAxCgljYWxsc3ViIG1pbkJhbGFuY2VGb3JBY2NvdW50CglpdG9iCgljb25jYXQKCWludCAxMDAwMDAKCWludCAxMjgwNwoJY2FsbHN1YiBjb3N0Rm9yQm94U3RvcmFnZQoJKwoJaXRvYgoJY29uY2F0CglpbnQgMTc5CgljYWxsc3ViIGNvc3RGb3JCb3hTdG9yYWdlCglpdG9iCgljb25jYXQKCXJldHN1YgoKLy8gZ2V0UHJvdG9jb2xDb25zdHJhaW50cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0UHJvdG9jb2xDb25zdHJhaW50czoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXRQcm90b2NvbENvbnN0cmFpbnRzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWNhbGxzdWIgZ2V0UHJvdG9jb2xDb25zdHJhaW50cwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFByb3RvY29sQ29uc3RyYWludHMoKTogQ29uc3RyYWludHMKLy8KLy8gUmV0dXJucyB0aGUgcHJvdG9jb2wgY29uc3RyYWludHMgc28gdGhhdCBVSXMgY2FuIGxpbWl0IHdoYXQgdXNlcnMgc3BlY2lmeSBmb3IgdmFsaWRhdG9yIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KZ2V0UHJvdG9jb2xDb25zdHJhaW50czoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0NwoJLy8gcmV0dXJuIHsKCS8vICAgICAgICAgICAgIGVwb2NoUGF5b3V0Um91bmRzTWluOiBNSU5fRVBPQ0hfTEVOR1RILAoJLy8gICAgICAgICAgICAgZXBvY2hQYXlvdXRSb3VuZHNNYXg6IE1BWF9FUE9DSF9MRU5HVEgsCgkvLyAgICAgICAgICAgICBtaW5QY3RUb1ZhbGlkYXRvcldGb3VyRGVjaW1hbHM6IE1JTl9QQ1RfVE9fVkFMSURBVE9SLAoJLy8gICAgICAgICAgICAgbWF4UGN0VG9WYWxpZGF0b3JXRm91ckRlY2ltYWxzOiBNQVhfUENUX1RPX1ZBTElEQVRPUiwKCS8vICAgICAgICAgICAgIG1pbkVudHJ5U3Rha2U6IE1JTl9BTEdPX1NUQUtFX1BFUl9QT09MLAoJLy8gICAgICAgICAgICAgbWF4QWxnb1BlclBvb2w6IHRoaXMubWF4QWxnb0FsbG93ZWRQZXJQb29sKCksCgkvLyAgICAgICAgICAgICBtYXhBbGdvUGVyVmFsaWRhdG9yOiB0aGlzLm1heEFsbG93ZWRTdGFrZSgpLAoJLy8gICAgICAgICAgICAgYW10Q29uc2lkZXJlZFNhdHVyYXRlZDogdGhpcy5hbGdvU2F0dXJhdGlvbkxldmVsKCksCgkvLyAgICAgICAgICAgICBtYXhOb2RlczogTUFYX05PREVTLAoJLy8gICAgICAgICAgICAgbWF4UG9vbHNQZXJOb2RlOiBNQVhfUE9PTFNfUEVSX05PREUsCgkvLyAgICAgICAgICAgICBtYXhTdGFrZXJzUGVyUG9vbDogTUFYX1NUQUtFUlNfUEVSX1BPT0wsCgkvLyAgICAgICAgIH0KCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDBmNDI0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGY0MjQwMDAwMDAwMDAwMDBmNDI0MAoJY2FsbHN1YiBtYXhBbGdvQWxsb3dlZFBlclBvb2wKCWl0b2IKCWNvbmNhdAoJY2FsbHN1YiBtYXhBbGxvd2VkU3Rha2UKCWl0b2IKCWNvbmNhdAoJY2FsbHN1YiBhbGdvU2F0dXJhdGlvbkxldmVsCglpdG9iCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDA4Cgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAzCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMGM4Cgljb25jYXQKCXJldHN1YgoKLy8gZ2V0TnVtVmFsaWRhdG9ycygpdWludDY0CiphYmlfcm91dGVfZ2V0TnVtVmFsaWRhdG9yczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXROdW1WYWxpZGF0b3JzKCl1aW50NjQKCWNhbGxzdWIgZ2V0TnVtVmFsaWRhdG9ycwoJaXRvYgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldE51bVZhbGlkYXRvcnMoKTogdWludDY0Ci8vCi8vIFJldHVybnMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHZhbGlkYXRvcnMKZ2V0TnVtVmFsaWRhdG9yczoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE2NwoJLy8gcmV0dXJuIHRoaXMubnVtVmFsaWRhdG9ycy52YWx1ZQoJYnl0ZSAweDZlNzU2ZDU2IC8vICJudW1WIgoJYXBwX2dsb2JhbF9nZXQKCXJldHN1YgoKLy8gZ2V0VmFsaWRhdG9yQ29uZmlnKHVpbnQ2NCkodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKKmFiaV9yb3V0ZV9nZXRWYWxpZGF0b3JDb25maWc6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFZhbGlkYXRvckNvbmZpZyh1aW50NjQpKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCgljYWxsc3ViIGdldFZhbGlkYXRvckNvbmZpZwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvckNvbmZpZyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogVmFsaWRhdG9yQ29uZmlnCmdldFZhbGlkYXRvckNvbmZpZzoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE3MgoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnCglpbnQgMAoJaW50IDI0MgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCXJldHN1YgoKLy8gZ2V0VmFsaWRhdG9yU3RhdGUodWludDY0KSh1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0VmFsaWRhdG9yU3RhdGU6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFZhbGlkYXRvclN0YXRlKHVpbnQ2NCkodWludDE2LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBnZXRWYWxpZGF0b3JTdGF0ZQoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvclN0YXRlKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBWYWxpZGF0b3JDdXJTdGF0ZQpnZXRWYWxpZGF0b3JTdGF0ZToKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE3NwoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUKCWludCAyNDIgLy8gaGVhZE9mZnNldAoJaW50IDI2CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpCiphYmlfcm91dGVfZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpCgljYWxsc3ViIGdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcih2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogW0FkZHJlc3MsIEFkZHJlc3NdCmdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcjoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE4MgoJLy8gcmV0dXJuIFsKCS8vICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLAoJLy8gICAgICAgICAgICAgdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWFuYWdlciwKCS8vICAgICAgICAgXQoJaW50IDgKCWludCAzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWludCA0MAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJY29uY2F0CglyZXRzdWIKCi8vIGdldFBvb2xzKHVpbnQ2NCkodWludDY0LHVpbnQxNix1aW50NjQpW10KKmFiaV9yb3V0ZV9nZXRQb29sczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0UG9vbHModWludDY0KSh1aW50NjQsdWludDE2LHVpbnQ2NClbXQoJY2FsbHN1YiBnZXRQb29scwoJZHVwCglsZW4KCWludCAxOAoJLwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFBvb2xzKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBQb29sSW5mb1tdCi8vCi8vIFJldHVybiBsaXN0IG9mIGFsbCBwb29scyBmb3IgdGhpcyB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWxpZGF0b3JJZAovLyBAcmV0dXJuIHtQb29sSW5mb1tdfSAtIGFycmF5IG9mIHBvb2xzCi8vIE5vdCBjYWxsYWJsZSBmcm9tIG90aGVyIGNvbnRyYWN0cyBiZWNhdXNlID4xSyByZXR1cm4gYnV0IGNhbiBiZSBjYWxsZWQgdy8gc2ltdWxhdGUgd2hpY2ggYnVtcHMgbG9nIHJldHVybnMKZ2V0UG9vbHM6Cglwcm90byAxIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiAyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk2CgkvLyByZXREYXRhOiBQb29sSW5mb1tdID0gW10KCWJ5dGUgMHgKCWZyYW1lX2J1cnkgMCAvLyByZXREYXRhOiBQb29sSW5mb1tdCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk3CgkvLyBwb29sU2V0ID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29scykKCWludCAyNjggLy8gaGVhZE9mZnNldAoJaW50IDQzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWZyYW1lX2J1cnkgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE5OAoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBwb29sU2V0Lmxlbmd0aDsgaSArPSAxKQoJaW50IDAKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCipmb3JfMDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE5OAoJLy8gaSA8IHBvb2xTZXQubGVuZ3RoCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCAyNAoJPAoJYnogKmZvcl8wX2VuZAoKCS8vICppZjBfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxOTkKCS8vIHBvb2xTZXRbaV0ucG9vbEFwcElkID09PSAwCglmcmFtZV9kaWcgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWYwX2VuZAoKCS8vICppZjBfY29uc2VxdWVudAoJYiAqZm9yXzBfZW5kCgoqaWYwX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIwMwoJLy8gcmV0RGF0YS5wdXNoKHBvb2xTZXRbaV0pCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBQb29sSW5mb1tdCglmcmFtZV9kaWcgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDE4CglleHRyYWN0MwoJY29uY2F0CglmcmFtZV9idXJ5IDAgLy8gcmV0RGF0YTogUG9vbEluZm9bXQoKKmZvcl8wX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk4CgkvLyBpICs9IDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCWIgKmZvcl8wCgoqZm9yXzBfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjA1CgkvLyByZXR1cm4gcmV0RGF0YQoJZnJhbWVfZGlnIDAgLy8gcmV0RGF0YTogUG9vbEluZm9bXQoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDIKCXJldHN1YgoKLy8gZ2V0UG9vbEFwcElkKHVpbnQ2NCx1aW50NjQpdWludDY0CiphYmlfcm91dGVfZ2V0UG9vbEFwcElkOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBwb29sSWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJYnRvaQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFBvb2xBcHBJZCh1aW50NjQsdWludDY0KXVpbnQ2NAoJY2FsbHN1YiBnZXRQb29sQXBwSWQKCWl0b2IKCWNvbmNhdAoJbG9nCglpbnQgMQoJcmV0dXJuCgovLyBnZXRQb29sQXBwSWQodmFsaWRhdG9ySWQ6IHVpbnQ2NCwgcG9vbElkOiB1aW50NjQpOiB1aW50NjQKLy8KLy8gZ2V0UG9vbEFwcElkIGlzIHVzZWZ1bCBmb3IgY2FsbGVycyB0byBkZXRlcm1pbmUgYXBwIHRvIGNhbGwgZm9yIHJlbW92aW5nIHN0YWtlIGlmIHRoZXkgZG9uJ3QgaGF2ZSBzdGFraW5nIG9yCi8vIHdhbnQgdG8gZ2V0IHN0YWtlciBsaXN0IGZvciBhbiBhY2NvdW50LiAgVGhlIHN0YWtpbmcgcG9vbCBhbHNvIHVzZXMgaXQgdG8gZ2V0IHRoZSBhcHAgaWQgb2Ygc3Rha2luZyBwb29sIDEKLy8gKHdoaWNoIGNvbnRhaW5zIHJld2FyZCB0b2tlbnMgaWYgYmVpbmcgdXNlZCkgc28gdGhhdCB0aGUgYW1vdW50IGF2YWlsYWJsZSBjYW4gYmUgZGV0ZXJtaW5lZC4KZ2V0UG9vbEFwcElkOgoJcHJvdG8gMiAxCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjE1CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBwb29sSWQgIT09IDAgJiYgcG9vbElkIDw9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHMubGVuZ3RoLAoJLy8gICAgICAgICAgICAgJ3Bvb2wgaWQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIG51bWJlciBvZiBwb29scyBmb3IgdGhpcyB2YWxpZGF0b3InLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTIgLy8gcG9vbElkOiB1aW50NjQKCWludCAwCgkhPQoJZHVwCglieiAqc2tpcF9hbmQwCglmcmFtZV9kaWcgLTIgLy8gcG9vbElkOiB1aW50NjQKCWludCAyNAoJPD0KCSYmCgoqc2tpcF9hbmQwOgoJLy8gcG9vbCBpZCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgbnVtYmVyIG9mIHBvb2xzIGZvciB0aGlzIHZhbGlkYXRvcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjE5CgkvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1twb29sSWQgLSAxXS5wb29sQXBwSWQKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0yIC8vIHBvb2xJZDogdWludDY0CglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCXJldHN1YgoKLy8gZ2V0UG9vbEluZm8oKHVpbnQ2NCx1aW50NjQsdWludDY0KSkodWludDY0LHVpbnQxNix1aW50NjQpCiphYmlfcm91dGVfZ2V0UG9vbEluZm86CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHBvb2xLZXk6ICh1aW50NjQsdWludDY0LHVpbnQ2NCkKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWR1cAoJbGVuCglpbnQgMjQKCT09CgoJLy8gYXJndW1lbnQgMCAocG9vbEtleSkgZm9yIGdldFBvb2xJbmZvIG11c3QgYmUgYSAodWludDY0LHVpbnQ2NCx1aW50NjQpCglhc3NlcnQKCgkvLyBleGVjdXRlIGdldFBvb2xJbmZvKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpKHVpbnQ2NCx1aW50MTYsdWludDY0KQoJY2FsbHN1YiBnZXRQb29sSW5mbwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFBvb2xJbmZvKHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkpOiBQb29sSW5mbwpnZXRQb29sSW5mbzoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIyNAoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRDdXJNYXhTdGFrZVBlclBvb2wodWludDY0KXVpbnQ2NAoqYWJpX3JvdXRlX2dldEN1ck1heFN0YWtlUGVyUG9vbDoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHVpbnQ2NCl1aW50NjQKCWNhbGxzdWIgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sCglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiB1aW50NjQKLy8KLy8gQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIHN0YWtlIHBlciBwb29sIGZvciBhIGdpdmVuIHZhbGlkYXRvci4KLy8gTm9ybWFsbHkgdGhpcyB3b3VsZCBiZSBtYXhBbGdvUGVyUG9vbCwgYnV0IGl0IHNob3VsZCBhbHNvIG5ldmVyIGdvIGFib3ZlIE1heEFsbG93ZWRTdGFrZSAvIG51bVBvb2xzIHNvCi8vIGFzIHBvb2xzIGFyZSBhZGRlZCB0aGUgbWF4IGFsbG93ZWQgcGVyIHBvb2wgY2FuIHJlZHVjZS4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCmdldEN1ck1heFN0YWtlUGVyUG9vbDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzYKCS8vIG51bVBvb2xzID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyBhcyB1aW50NjQKCWludCAyNDIKCWludCAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIG51bVBvb2xzOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzcKCS8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzID0gdGhpcy5tYXhBbGxvd2VkU3Rha2UoKSAvIG51bVBvb2xzCgljYWxsc3ViIG1heEFsbG93ZWRTdGFrZQoJZnJhbWVfZGlnIDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoJLwoJZnJhbWVfYnVyeSAxIC8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzgKCS8vIG1heFBlclBvb2w6IHVpbnQ2NCA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1heEFsZ29QZXJQb29sCglpbnQgMjE3CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCgkvLyAqaWYxX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjM5CgkvLyBtYXhQZXJQb29sID09PSAwCglmcmFtZV9kaWcgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCWludCAwCgk9PQoJYnogKmlmMV9lbmQKCgkvLyAqaWYxX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI0MAoJLy8gbWF4UGVyUG9vbCA9IHRoaXMubWF4QWxnb0FsbG93ZWRQZXJQb29sKCkKCWNhbGxzdWIgbWF4QWxnb0FsbG93ZWRQZXJQb29sCglmcmFtZV9idXJ5IDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoqaWYxX2VuZDoKCS8vICppZjJfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNDIKCS8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzIDwgbWF4UGVyUG9vbAoJZnJhbWVfZGlnIDEgLy8gaGFyZE1heERpdmlkZWRCZXR3ZWVuUG9vbHM6IHVpbnQ2NAoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8CglieiAqaWYyX2VuZAoKCS8vICppZjJfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjQzCgkvLyBtYXhQZXJQb29sID0gaGFyZE1heERpdmlkZWRCZXR3ZWVuUG9vbHMKCWZyYW1lX2RpZyAxIC8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzOiB1aW50NjQKCWZyYW1lX2J1cnkgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCippZjJfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjQ1CgkvLyByZXR1cm4gbWF4UGVyUG9vbAoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCgoJLy8gcG9wIGFsbCBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUgc3RhY2sKCXBvcG4gMgoJcmV0c3ViCgovLyBkb2VzU3Rha2VyTmVlZFRvUGF5TUJSKGFkZHJlc3MpYm9vbAoqYWJpX3JvdXRlX2RvZXNTdGFrZXJOZWVkVG9QYXlNQlI6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHN0YWtlcjogYWRkcmVzcwoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZHVwCglsZW4KCWludCAzMgoJPT0KCgkvLyBhcmd1bWVudCAwIChzdGFrZXIpIGZvciBkb2VzU3Rha2VyTmVlZFRvUGF5TUJSIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBleGVjdXRlIGRvZXNTdGFrZXJOZWVkVG9QYXlNQlIoYWRkcmVzcylib29sCgljYWxsc3ViIGRvZXNTdGFrZXJOZWVkVG9QYXlNQlIKCWJ5dGUgMHgwMAoJaW50IDAKCXVuY292ZXIgMgoJc2V0Yml0Cgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZG9lc1N0YWtlck5lZWRUb1BheU1CUihzdGFrZXI6IEFkZHJlc3MpOiBib29sZWFuCi8vCi8vIEhlbHBlciBjYWxsZXJzIGNhbiBjYWxsIHcvIHNpbXVsYXRlIHRvIGRldGVybWluZSBpZiAnQWRkU3Rha2VyJyBNQlIgc2hvdWxkIGJlIGluY2x1ZGVkIHcvIHN0YWtpbmcgYW1vdW50Ci8vIEBwYXJhbSBzdGFrZXIKZG9lc1N0YWtlck5lZWRUb1BheU1CUjoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI1NAoJLy8gcmV0dXJuICF0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS5leGlzdHMKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZXI6IEFkZHJlc3MKCWNvbmNhdAoJYm94X2xlbgoJc3dhcAoJcG9wCgkhCglyZXRzdWIKCi8vIGdldFN0YWtlZFBvb2xzRm9yQWNjb3VudChhZGRyZXNzKSh1aW50NjQsdWludDY0LHVpbnQ2NClbXQoqYWJpX3JvdXRlX2dldFN0YWtlZFBvb2xzRm9yQWNjb3VudDoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gc3Rha2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKHN0YWtlcikgZm9yIGdldFN0YWtlZFBvb2xzRm9yQWNjb3VudCBtdXN0IGJlIGEgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBnZXRTdGFrZWRQb29sc0ZvckFjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCx1aW50NjQpW10KCWNhbGxzdWIgZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50CglkdXAKCWxlbgoJaW50IDI0CgkvCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0Cgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50KHN0YWtlcjogQWRkcmVzcyk6IFZhbGlkYXRvclBvb2xLZXlbXQovLwovLyBSZXRyaWV2ZXMgdGhlIHN0YWtlZCBwb29scyBmb3IgYW4gYWNjb3VudC4KLy8KLy8gQHBhcmFtIHtBZGRyZXNzfSBzdGFrZXIgLSBUaGUgYWNjb3VudCB0byByZXRyaWV2ZSBzdGFrZWQgcG9vbHMgZm9yLgovLyBAcmV0dXJuIHtWYWxpZGF0b3JQb29sS2V5W119IC0gVGhlIGFycmF5IG9mIHN0YWtlZCBwb29scyBmb3IgdGhlIGFjY291bnQuCmdldFN0YWtlZFBvb2xzRm9yQWNjb3VudDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyAqaWYzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjY1CgkvLyAhdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikuZXhpc3RzCglieXRlIDB4NzM3MDczIC8vICJzcHMiCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoJIQoJYnogKmlmM19lbmQKCgkvLyAqaWYzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2NgoJLy8gcmV0dXJuIFtdCglieXRlIDB4CgliICpnZXRTdGFrZWRQb29sc0ZvckFjY291bnQqcmV0dXJuCgoqaWYzX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2OAoJLy8gcmV0RGF0YTogVmFsaWRhdG9yUG9vbEtleVtdID0gW10KCWJ5dGUgMHgKCWZyYW1lX2J1cnkgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjkKCS8vIHBvb2xTZXQgPSBjbG9uZSh0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZSkKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZXI6IEFkZHJlc3MKCWNvbmNhdAoJYm94X2dldAoKCS8vIGJveCB2YWx1ZSBkb2VzIG5vdCBleGlzdDogdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUKCWFzc2VydAoJZnJhbWVfYnVyeSAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzAKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgcG9vbFNldC5sZW5ndGg7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzE6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzAKCS8vIGkgPCBwb29sU2V0Lmxlbmd0aAoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl8xX2VuZAoKCS8vICppZjRfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzEKCS8vIHBvb2xTZXRbaV0uaWQgIT09IDAKCWZyYW1lX2RpZyAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgkhPQoJYnogKmlmNF9lbmQKCgkvLyAqaWY0X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI3MgoJLy8gcmV0RGF0YS5wdXNoKHBvb2xTZXRbaV0pCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCWZyYW1lX2RpZyAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWNvbmNhdAoJZnJhbWVfYnVyeSAwIC8vIHJldERhdGE6IFZhbGlkYXRvclBvb2xLZXlbXQoKKmlmNF9lbmQ6CgoqZm9yXzFfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzAKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzEKCipmb3JfMV9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzUKCS8vIHJldHVybiByZXREYXRhCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCipnZXRTdGFrZWRQb29sc0ZvckFjY291bnQqcmV0dXJuOgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCgoJLy8gcG9wIGFsbCBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUgc3RhY2sKCXBvcG4gMgoJcmV0c3ViCgovLyBnZXRUb2tlblBheW91dFJhdGlvKHVpbnQ2NCkodWludDY0WzI0XSx1aW50NjQpCiphYmlfcm91dGVfZ2V0VG9rZW5QYXlvdXRSYXRpbzoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KQoJY2FsbHN1YiBnZXRUb2tlblBheW91dFJhdGlvCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0VG9rZW5QYXlvdXRSYXRpbyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogUG9vbFRva2VuUGF5b3V0UmF0aW8KLy8KLy8gUmV0cmlldmVzIHRoZSB0b2tlbiBwYXlvdXQgcmF0aW8gZm9yIGEgZ2l2ZW4gdmFsaWRhdG9yIC0gcmV0dXJuaW5nIHRoZSBwb29sIHJhdGlvcyBvZiB3aG9sZSBzbyB0aGF0IHRva2VuCi8vIHBheW91dHMgYWNyb3NzIHBvb2xzIGNhbiBiZSBiYXNlZCBvbiBhIHN0YWJsZSBzbmFwaG9zdCBvZiBzdGFrZS4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEByZXR1cm4ge1Bvb2xUb2tlblBheW91dFJhdGlvfSAtIFRoZSB0b2tlbiBwYXlvdXQgcmF0aW8gZm9yIHRoZSB2YWxpZGF0b3IuCmdldFRva2VuUGF5b3V0UmF0aW86Cglwcm90byAxIDEKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyODcKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCXJldHN1YgoKLy8gZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cyh1aW50NjQpKCh1aW50NjRbM10pWzhdKQoqYWJpX3JvdXRlX2dldE5vZGVQb29sQXNzaWdubWVudHM6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldE5vZGVQb29sQXNzaWdubWVudHModWludDY0KSgodWludDY0WzNdKVs4XSkKCWNhbGxzdWIgZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldE5vZGVQb29sQXNzaWdubWVudHModmFsaWRhdG9ySWQ6IHVpbnQ2NCk6IE5vZGVQb29sQXNzaWdubWVudENvbmZpZwpnZXROb2RlUG9vbEFzc2lnbm1lbnRzOgoJcHJvdG8gMSAxCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjkyCgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS5leGlzdHMsICJ0aGUgc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBkb2Vzbid0IGV4aXN0IikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoKCS8vIHRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGRvZXNuJ3QgZXhpc3QKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI5NAoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUubm9kZVBvb2xBc3NpZ25tZW50cwoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRORkRSZWdpc3RyeUlEKCl1aW50NjQKKmFiaV9yb3V0ZV9nZXRORkRSZWdpc3RyeUlEOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBleGVjdXRlIGdldE5GRFJlZ2lzdHJ5SUQoKXVpbnQ2NAoJY2FsbHN1YiBnZXRORkRSZWdpc3RyeUlECglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0TkZEUmVnaXN0cnlJRCgpOiB1aW50NjQKZ2V0TkZEUmVnaXN0cnlJRDoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI5OQoJLy8gcmV0dXJuIHRoaXMubmZkUmVnaXN0cnlBcHBJZAoJbG9hZCAyMDAgLy8gVE1QTF9uZmRSZWdpc3RyeUFwcElkCglyZXRzdWIKCi8vIGFkZFZhbGlkYXRvcihwYXksc3RyaW5nLCh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KSl1aW50NjQKKmFiaV9yb3V0ZV9hZGRWYWxpZGF0b3I6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIGNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDI0MgoJPT0KCgkvLyBhcmd1bWVudCAwIChjb25maWcpIGZvciBhZGRWYWxpZGF0b3IgbXVzdCBiZSBhICh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KQoJYXNzZXJ0CgoJLy8gbmZkTmFtZTogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglleHRyYWN0IDIgMAoKCS8vIG1iclBheW1lbnQ6IHBheQoJdHhuIEdyb3VwSW5kZXgKCWludCAxCgktCglkdXAKCWd0eG5zIFR5cGVFbnVtCglpbnQgcGF5Cgk9PQoKCS8vIGFyZ3VtZW50IDIgKG1iclBheW1lbnQpIGZvciBhZGRWYWxpZGF0b3IgbXVzdCBiZSBhIHBheSB0cmFuc2FjdGlvbgoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBhZGRWYWxpZGF0b3IocGF5LHN0cmluZywodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkpdWludDY0CgljYWxsc3ViIGFkZFZhbGlkYXRvcgoJaXRvYgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFZhbGlkYXRvcihtYnJQYXltZW50OiBQYXlUeG4sIG5mZE5hbWU6IHN0cmluZywgY29uZmlnOiBWYWxpZGF0b3JDb25maWcpOiB1aW50NjQKLy8KLy8gQWRkcyBhIG5ldyB2YWxpZGF0b3IKLy8gUmVxdWlyZXMgYXQgbGVhc3QgMTAgQUxHTyBhcyB0aGUgJ2ZlZScgZm9yIHRoZSB0cmFuc2FjdGlvbiB0byBoZWxwIGRpc3N1YWRlIHNwYW1tZWQgdmFsaWRhdG9yIGFkZHMuCi8vCi8vIEBwYXJhbSB7UGF5VHhufSBtYnJQYXltZW50IHBheW1lbnQgZnJvbSBjYWxsZXIgd2hpY2ggY292ZXJzIG1iciBpbmNyZWFzZSBvZiBuZXcgdmFsaWRhdG9yIHN0b3JhZ2UKLy8gQHBhcmFtIHtzdHJpbmd9IG5mZE5hbWUgKE9wdGlvbmFsKSBOYW1lIG9mIG5mZCAodXNlZCBhcyBkb3VibGUtY2hlY2sgYWdhaW5zdCBpZCBzcGVjaWZpZWQgaW4gY29uZmlnKQovLyBAcGFyYW0ge1ZhbGlkYXRvckNvbmZpZ30gY29uZmlnIFZhbGlkYXRvckNvbmZpZyBzdHJ1Y3QKLy8gQHJldHVybnMge3VpbnQ2NH0gdmFsaWRhdG9yIGlkCmFkZFZhbGlkYXRvcjoKCXByb3RvIDMgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzExCgkvLyB0aGlzLnZhbGlkYXRlQ29uZmlnKGNvbmZpZykKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJY2FsbHN1YiB2YWxpZGF0ZUNvbmZpZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxMwoJLy8gdmVyaWZ5UGF5VHhuKG1iclBheW1lbnQsIHsgcmVjZWl2ZXI6IHRoaXMuYXBwLmFkZHJlc3MsIGFtb3VudDogdGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkVmFsaWRhdG9yTWJyIH0pCgkvLyB2ZXJpZnkgcmVjZWl2ZXIKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIFJlY2VpdmVyCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6InJlY2VpdmVyIiwiZXhwZWN0ZWQiOiJ0aGlzLmFwcC5hZGRyZXNzIn0KCWFzc2VydAoKCS8vIHZlcmlmeSBhbW91bnQKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCglleHRyYWN0IDAgOAoJYnRvaQoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6ImFtb3VudCIsImV4cGVjdGVkIjoidGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkVmFsaWRhdG9yTWJyIn0KCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxNQoJLy8gYXNzZXJ0KG1iclBheW1lbnQuZmVlID4gMTAgKiAxMDAwMDAwLCAnZmVlIG11c3QgYmUgMTAgQUxHTyBvciBtb3JlIHRvIHByZXZlbnQgc3BhbW1pbmcgb2YgdmFsaWRhdG9ycycpCglmcmFtZV9kaWcgLTEgLy8gbWJyUGF5bWVudDogUGF5VHhuCglndHhucyBGZWUKCWludCAxMDAwMDAwMAoJPgoKCS8vIGZlZSBtdXN0IGJlIDEwIEFMR08gb3IgbW9yZSB0byBwcmV2ZW50IHNwYW1taW5nIG9mIHZhbGlkYXRvcnMKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxOAoJLy8gdmFsaWRhdG9ySWQgPSB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgKyAxCglieXRlIDB4NmU3NTZkNTYgLy8gIm51bVYiCglhcHBfZ2xvYmFsX2dldAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzE5CgkvLyB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgPSB2YWxpZGF0b3JJZAoJYnl0ZSAweDZlNzU2ZDU2IC8vICJudW1WIgoJZnJhbWVfZGlnIDAgLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMjEKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkuY3JlYXRlKCkKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJaW50IDEwOTIKCWJveF9jcmVhdGUKCXBvcAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMyMgoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcgPSBjb25maWcKCWludCAwCglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMjMKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLmlkID0gdmFsaWRhdG9ySWQKCWludCAwCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gKmlmNV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMyNgoJLy8gY29uZmlnLm5mZEZvckluZm8gIT09IDAKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA3MiA4CglidG9pCglpbnQgMAoJIT0KCWJ6ICppZjVfZW5kCgoJLy8gKmlmNV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMjgKCS8vIGFzc2VydCh0aGlzLmlzTkZEQXBwSURWYWxpZChjb25maWcubmZkRm9ySW5mbyksICdwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZCcpCglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgNzIgOAoJYnRvaQoJY2FsbHN1YiBpc05GREFwcElEVmFsaWQKCgkvLyBwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzMwCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgdGhpcy50eG4uc2VuZGVyID09PSAoQXBwSUQuZnJvbVVpbnQ2NChjb25maWcubmZkRm9ySW5mbykuZ2xvYmFsU3RhdGUoJ2kub3duZXIuYScpIGFzIEFkZHJlc3MpLAoJLy8gICAgICAgICAgICAgICAgICdJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXInLAoJLy8gICAgICAgICAgICAgKQoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIC0zIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDcyIDgKCWJ0b2kKCWJ5dGUgMHg2OTJlNmY3NzZlNjU3MjJlNjEgLy8gImkub3duZXIuYSIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KGNvbmZpZy5uZmRGb3JJbmZvKS5nbG9iYWxTdGF0ZSgnaS5vd25lci5hJykKCWFzc2VydAoJPT0KCgkvLyBJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXIKCWFzc2VydAoKKmlmNV9lbmQ6CgkvLyAqaWY2X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzM2CgkvLyBjb25maWcuZW50cnlHYXRpbmdUeXBlID09PSBHQVRJTkdfVFlQRV9DUkVBVEVEX0JZX05GRF9BRERSRVNTRVMgfHwKCS8vICAgICAgICAgICAgIGNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX1NFR01FTlRfT0ZfTkZECglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgODAgMQoJYnRvaQoJaW50IDMKCT09CglkdXAKCWJueiAqc2tpcF9vcjAKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4MCAxCglidG9pCglpbnQgNAoJPT0KCXx8Cgoqc2tpcF9vcjA6CglieiAqaWY2X2VuZAoKCS8vICppZjZfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzQwCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5pc05GREFwcElEVmFsaWQoY29uZmlnLmVudHJ5R2F0aW5nQXNzZXRzWzBdKSwKCS8vICAgICAgICAgICAgICAgICAncHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZEJywKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAxMTMgOAoJYnRvaQoJY2FsbHN1YiBpc05GREFwcElEVmFsaWQKCgkvLyBwcm92aWRlZCBORkQgQXBwIGlkIGZvciBnYXRpbmcgbXVzdCBiZSB2YWxpZCBORkQKCWFzc2VydAoKKmlmNl9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNDUKCS8vIHRoaXMucmV0aU9QX2FkZGVkVmFsaWRhdG9yLmxvZyh7IGlkOiB2YWxpZGF0b3JJZCwgb3duZXI6IGNvbmZpZy5vd25lciwgbWFuYWdlcjogY29uZmlnLm1hbmFnZXIgfSkKCWJ5dGUgMHhhOGRkMjFjYiAvLyByZXRpT1BfYWRkZWRWYWxpZGF0b3IodWludDY0LGFkZHJlc3MsYWRkcmVzcykKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4IDMyCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA0MCAzMgoJY29uY2F0Cgljb25jYXQKCWxvZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM0NgoJLy8gcmV0dXJuIHZhbGlkYXRvcklkCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvck1hbmFnZXIodWludDY0LGFkZHJlc3Mpdm9pZAoqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvck1hbmFnZXI6CgkvLyBtYW5hZ2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKG1hbmFnZXIpIGZvciBjaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyKHVpbnQ2NCxhZGRyZXNzKXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yTWFuYWdlcgoJaW50IDEKCXJldHVybgoKLy8gY2hhbmdlVmFsaWRhdG9yTWFuYWdlcih2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBtYW5hZ2VyOiBBZGRyZXNzKTogdm9pZAovLwovLyBDaGFuZ2VzIHRoZSBWYWxpZGF0b3IgbWFuYWdlciBmb3IgYSBzcGVjaWZpYyBWYWxpZGF0b3IgaWQuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gY2hhbmdlIHRoZSBtYW5hZ2VyIGZvci4KLy8gQHBhcmFtIHtBZGRyZXNzfSBtYW5hZ2VyIC0gVGhlIG5ldyBtYW5hZ2VyIGFkZHJlc3MuCmNoYW5nZVZhbGlkYXRvck1hbmFnZXI6Cglwcm90byAyIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNTcKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM1OAoJLy8gYXNzZXJ0KG1hbmFnZXIgIT09IGdsb2JhbHMuemVyb0FkZHJlc3MsICduZWVkcyB0byBhdCBsZWFzdCBiZSB2YWxpZCBhZGRyZXNzJykKCWZyYW1lX2RpZyAtMiAvLyBtYW5hZ2VyOiBBZGRyZXNzCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CgoJLy8gbmVlZHMgdG8gYXQgbGVhc3QgYmUgdmFsaWQgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzU5CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5tYW5hZ2VyID0gbWFuYWdlcgoJaW50IDQwCglmcmFtZV9kaWcgLTIgLy8gbWFuYWdlcjogQWRkcmVzcwoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCXJldHN1YgoKLy8gY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyh1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkCiphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbzoKCS8vIHN1bnNldHRpbmdUbzogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglidG9pCgoJLy8gc3Vuc2V0dGluZ09uOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbwoJaW50IDEKCXJldHVybgoKLy8gY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBzdW5zZXR0aW5nT246IHVpbnQ2NCwgc3Vuc2V0dGluZ1RvOiBWYWxpZGF0b3JJZFR5cGUpOiB2b2lkCi8vCi8vIFVwZGF0ZXMgdGhlIHN1bnNldCBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiB2YWxpZGF0b3IuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gdXBkYXRlLgovLyBAcGFyYW0ge3VpbnQ2NH0gc3Vuc2V0dGluZ09uIC0gVGhlIG5ldyBzdW5zZXQgdGltZXN0YW1wLgovLyBAcGFyYW0ge3VpbnQ2NH0gc3Vuc2V0dGluZ1RvIC0gVGhlIG5ldyBzdW5zZXQgdG8gdmFsaWRhdG9yIGlkLgpjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvOgoJcHJvdG8gMyAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzcxCgkvLyB0aGlzLmNhbGxlck11c3RCZU93bmVyKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgY2FsbGVyTXVzdEJlT3duZXIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNzIKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnN1bnNldHRpbmdPbiA9IHN1bnNldHRpbmdPbgoJaW50IDIyNgoJZnJhbWVfZGlnIC0yIC8vIHN1bnNldHRpbmdPbjogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM3MwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcuc3Vuc2V0dGluZ1RvID0gc3Vuc2V0dGluZ1RvCglpbnQgMjM0CglmcmFtZV9kaWcgLTMgLy8gc3Vuc2V0dGluZ1RvOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvck5GRCh1aW50NjQsdWludDY0LHN0cmluZyl2b2lkCiphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yTkZEOgoJLy8gbmZkTmFtZTogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglleHRyYWN0IDIgMAoKCS8vIG5mZEFwcElEOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JORkQodWludDY0LHVpbnQ2NCxzdHJpbmcpdm9pZAoJY2FsbHN1YiBjaGFuZ2VWYWxpZGF0b3JORkQKCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvck5GRCh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBuZmRBcHBJRDogdWludDY0LCBuZmROYW1lOiBzdHJpbmcpOiB2b2lkCi8vCi8vIENoYW5nZXMgdGhlIE5GRCBmb3IgYSB2YWxpZGF0b3IgaW4gdGhlIHZhbGlkYXRvckxpc3QgY29udHJhY3QuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gdXBkYXRlLgovLyBAcGFyYW0ge3VpbnQ2NH0gbmZkQXBwSUQgLSBUaGUgYXBwbGljYXRpb24gaWQgb2YgdGhlIE5GRCB0byBhc3NpZ24gdG8gdGhlIHZhbGlkYXRvci4KLy8gQHBhcmFtIHtzdHJpbmd9IG5mZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgTkZEICh3aGljaCBtdXN0IG1hdGNoKQpjaGFuZ2VWYWxpZGF0b3JORkQ6Cglwcm90byAzIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozODUKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM4NwoJLy8gYXNzZXJ0KHRoaXMuaXNORkRBcHBJRFZhbGlkKG5mZEFwcElEKSwgJ3Byb3ZpZGVkIE5GRCBtdXN0IGJlIHZhbGlkJykKCWZyYW1lX2RpZyAtMiAvLyBuZmRBcHBJRDogdWludDY0CgljYWxsc3ViIGlzTkZEQXBwSURWYWxpZAoKCS8vIHByb3ZpZGVkIE5GRCBtdXN0IGJlIHZhbGlkCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozODkKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHRoaXMudHhuLnNlbmRlciA9PT0gKEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzKSwKCS8vICAgICAgICAgICAgICdJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXInLAoJLy8gICAgICAgICApCgl0eG4gU2VuZGVyCglmcmFtZV9kaWcgLTIgLy8gbmZkQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKQoJYXNzZXJ0Cgk9PQoKCS8vIElmIHNwZWNpZnlpbmcgTkZELCBhY2NvdW50IGFkZGluZyB2YWxpZGF0b3IgbXVzdCBiZSBvd25lcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzkzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5uZmRGb3JJbmZvID0gbmZkQXBwSUQKCWludCA3MgoJZnJhbWVfZGlnIC0yIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHVpbnQ2NCxhZGRyZXNzKXZvaWQKKmFiaV9yb3V0ZV9jaGFuZ2VWYWxpZGF0b3JDb21taXNzaW9uQWRkcmVzczoKCS8vIGNvbW1pc3Npb25BZGRyZXNzOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKGNvbW1pc3Npb25BZGRyZXNzKSBmb3IgY2hhbmdlVmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MgbXVzdCBiZSBhIGFkZHJlc3MKCWFzc2VydAoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHVpbnQ2NCxhZGRyZXNzKXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MKCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIGNvbW1pc3Npb25BZGRyZXNzOiBBZGRyZXNzKTogdm9pZAovLwovLyBDaGFuZ2UgdGhlIGNvbW1pc3Npb24gYWRkcmVzcyB0aGF0IHZhbGlkYXRvciByZXdhcmRzIGFyZSBzZW50IHRvLgovLyBbIE9OTFkgT1dORVIgQ0FOIENIQU5HRSBdCmNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzOgoJcHJvdG8gMiAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDAxCgkvLyB0aGlzLmNhbGxlck11c3RCZU93bmVyKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgY2FsbGVyTXVzdEJlT3duZXIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MDIKCS8vIGFzc2VydChjb21taXNzaW9uQWRkcmVzcyAhPT0gQWRkcmVzcy56ZXJvQWRkcmVzcykKCWZyYW1lX2RpZyAtMiAvLyBjb21taXNzaW9uQWRkcmVzczogQWRkcmVzcwoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDAzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy52YWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyA9IGNvbW1pc3Npb25BZGRyZXNzCglpbnQgMTc3CglmcmFtZV9kaWcgLTIgLy8gY29tbWlzc2lvbkFkZHJlc3M6IEFkZHJlc3MKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8odWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQpdm9pZAoqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvclJld2FyZEluZm86CgkvLyBSZXdhcmRQZXJQYXlvdXQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgoJYnRvaQoKCS8vIEdhdGluZ0Fzc2V0TWluQmFsYW5jZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyA1CglidG9pCgoJLy8gRW50cnlHYXRpbmdBc3NldHM6IHVpbnQ2NFs0XQoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAoJZHVwCglsZW4KCWludCAzMgoJPT0KCgkvLyBhcmd1bWVudCAyIChFbnRyeUdhdGluZ0Fzc2V0cykgZm9yIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8gbXVzdCBiZSBhIHVpbnQ2NFs0XQoJYXNzZXJ0CgoJLy8gRW50cnlHYXRpbmdBZGRyZXNzOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDMgKEVudHJ5R2F0aW5nQWRkcmVzcykgZm9yIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8gbXVzdCBiZSBhIGFkZHJlc3MKCWFzc2VydAoKCS8vIEVudHJ5R2F0aW5nVHlwZTogdWludDgKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMQoJPT0KCgkvLyBhcmd1bWVudCA0IChFbnRyeUdhdGluZ1R5cGUpIGZvciBjaGFuZ2VWYWxpZGF0b3JSZXdhcmRJbmZvIG11c3QgYmUgYSB1aW50OAoJYXNzZXJ0CglidG9pCgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mbyh1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCl2b2lkCgljYWxsc3ViIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8KCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8odmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgRW50cnlHYXRpbmdUeXBlOiB1aW50OCwgRW50cnlHYXRpbmdBZGRyZXNzOiBBZGRyZXNzLCBFbnRyeUdhdGluZ0Fzc2V0czogU3RhdGljQXJyYXk8dWludDY0LCA0PiwgR2F0aW5nQXNzZXRNaW5CYWxhbmNlOiB1aW50NjQsIFJld2FyZFBlclBheW91dDogdWludDY0KTogdm9pZAovLwovLyBBbGxvdyB0aGUgYWRkaXRpb25hbCByZXdhcmRzIChnYXRpbmcgZW50cnksIGFkZGl0aW9uYWwgdG9rZW4gcmV3YXJkcykgaW5mb3JtYXRpb24gYmUgY2hhbmdlZCBhdCB3aWxsLgovLyBbIE9OTFkgT1dORVIgQ0FOIENIQU5HRSBdCmNoYW5nZVZhbGlkYXRvclJld2FyZEluZm86Cglwcm90byA2IDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MTgKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQyMAoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgRW50cnlHYXRpbmdUeXBlID49IEdBVElOR19UWVBFX05PTkUgJiYgRW50cnlHYXRpbmdUeXBlIDwgR0FUSU5HX1RZUEVfQ09OU1RfTUFYLAoJLy8gICAgICAgICAgICAgJ2ludmFsaWQgRW50cnkgZ2F0aW5nIHR5cGUnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDAKCT49CglkdXAKCWJ6ICpza2lwX2FuZDEKCWZyYW1lX2RpZyAtMiAvLyBFbnRyeUdhdGluZ1R5cGU6IHVpbnQ4CglpbnQgNAoJPAoJJiYKCipza2lwX2FuZDE6CgkvLyBpbnZhbGlkIEVudHJ5IGdhdGluZyB0eXBlCglhc3NlcnQKCgkvLyAqaWY3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDI0CgkvLyBFbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX0FTU0VUU19DUkVBVEVEX0JZCglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDEKCT09CglieiAqaWY3X2VuZAoKCS8vICppZjdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDI1CgkvLyBhc3NlcnQoRW50cnlHYXRpbmdBZGRyZXNzICE9PSBnbG9iYWxzLnplcm9BZGRyZXNzKQoJZnJhbWVfZGlnIC0zIC8vIEVudHJ5R2F0aW5nQWRkcmVzczogQWRkcmVzcwoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoqaWY3X2VuZDoKCS8vICppZjhfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MjgKCS8vIEVudHJ5R2F0aW5nVHlwZSA9PT0gR0FUSU5HX1RZUEVfQ1JFQVRFRF9CWV9ORkRfQUREUkVTU0VTIHx8CgkvLyAgICAgICAgICAgICBFbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX1NFR01FTlRfT0ZfTkZECglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDMKCT09CglkdXAKCWJueiAqc2tpcF9vcjEKCWZyYW1lX2RpZyAtMiAvLyBFbnRyeUdhdGluZ1R5cGU6IHVpbnQ4CglpbnQgNAoJPT0KCXx8Cgoqc2tpcF9vcjE6CglieiAqaWY4X2VuZAoKCS8vICppZjhfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDMxCgkvLyBhc3NlcnQodGhpcy5pc05GREFwcElEVmFsaWQoRW50cnlHYXRpbmdBc3NldHNbMF0pLCAncHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZEJykKCWZyYW1lX2RpZyAtNCAvLyBFbnRyeUdhdGluZ0Fzc2V0czogU3RhdGljQXJyYXk8dWludDY0LCA0PgoJZXh0cmFjdCAwIDgKCWJ0b2kKCWNhbGxzdWIgaXNORkRBcHBJRFZhbGlkCgoJLy8gcHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZECglhc3NlcnQKCippZjhfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDMzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPSBFbnRyeUdhdGluZ1R5cGUKCWludCA4MAoJZnJhbWVfZGlnIC0yIC8vIEVudHJ5R2F0aW5nVHlwZTogdWludDgKCWl0b2IKCWV4dHJhY3QgNyAxCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQzNAoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcuZW50cnlHYXRpbmdBZGRyZXNzID0gRW50cnlHYXRpbmdBZGRyZXNzCglpbnQgODEKCWZyYW1lX2RpZyAtMyAvLyBFbnRyeUdhdGluZ0FkZHJlc3M6IEFkZHJlc3MKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDM1CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0cyA9IEVudHJ5R2F0aW5nQXNzZXRzCglpbnQgMTEzCglmcmFtZV9kaWcgLTQgLy8gRW50cnlHYXRpbmdBc3NldHM6IFN0YXRpY0FycmF5PHVpbnQ2NCwgND4KCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDM2CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5nYXRpbmdBc3NldE1pbkJhbGFuY2UgPSBHYXRpbmdBc3NldE1pbkJhbGFuY2UKCWludCAxNDUKCWZyYW1lX2RpZyAtNSAvLyBHYXRpbmdBc3NldE1pbkJhbGFuY2U6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MzcKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnJld2FyZFBlclBheW91dCA9IFJld2FyZFBlclBheW91dAoJaW50IDE2MQoJZnJhbWVfZGlnIC02IC8vIFJld2FyZFBlclBheW91dDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyBhZGRQb29sKHBheSx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCkKKmFiaV9yb3V0ZV9hZGRQb29sOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBub2RlTnVtOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gbWJyUGF5bWVudDogcGF5Cgl0eG4gR3JvdXBJbmRleAoJaW50IDEKCS0KCWR1cAoJZ3R4bnMgVHlwZUVudW0KCWludCBwYXkKCT09CgoJLy8gYXJndW1lbnQgMiAobWJyUGF5bWVudCkgZm9yIGFkZFBvb2wgbXVzdCBiZSBhIHBheSB0cmFuc2FjdGlvbgoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBhZGRQb29sKHBheSx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCkKCWNhbGxzdWIgYWRkUG9vbAoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFBvb2wobWJyUGF5bWVudDogUGF5VHhuLCB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBub2RlTnVtOiB1aW50NjQpOiBWYWxpZGF0b3JQb29sS2V5Ci8vCi8vIEFkZHMgYSBuZXcgcG9vbCB0byBhIHZhbGlkYXRvcidzIHBvb2wgc2V0LCByZXR1cm5pbmcgdGhlICdrZXknIHRvIHJlZmVyZW5jZSB0aGUgcG9vbCBpbiB0aGUgZnV0dXJlIGZvciBzdGFraW5nLCBldGMuCi8vIFRoZSBjYWxsZXIgbXVzdCBwYXkgdGhlIGNvc3Qgb2YgdGhlIHZhbGlkYXRvcnMgTUJSIGluY3JlYXNlIGFzIHdlbGwgYXMgdGhlIE1CUiB0aGF0IHdpbGwgYmUgbmVlZGVkIGZvciB0aGUgcG9vbCBpdHNlbGYuCi8vCi8vIFsgT05MWSBPV05FUiBPUiBNQU5BR0VSIENBTiBjYWxsIF0KLy8gQHBhcmFtIHtQYXlUeG59IG1iclBheW1lbnQgcGF5bWVudCBmcm9tIGNhbGxlciB3aGljaCBjb3ZlcnMgbWJyIGluY3JlYXNlIG9mIGFkZGluZyBhIG5ldyBwb29sCi8vIEBwYXJhbSB7dWludDY0fSB2YWxpZGF0b3JJZCBpcyBpZCBvZiB2YWxpZGF0b3IgdG8gcG9vbCB0byAobXVzdCBiZSBvd25lciBvciBtYW5hZ2VyKQovLyBAcGFyYW0ge3VpbnQ2NH0gbm9kZU51bSBpcyBub2RlIG51bWJlciB0byBhZGQgdG8KLy8gQHJldHVybnMge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2wga2V5IHRvIGNyZWF0ZWQgcG9vbAphZGRQb29sOgoJcHJvdG8gMyAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ1MgoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lck9yTWFuYWdlcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyT3JNYW5hZ2VyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDU1CgkvLyB2ZXJpZnlQYXlUeG4obWJyUGF5bWVudCwgeyByZWNlaXZlcjogdGhpcy5hcHAuYWRkcmVzcywgYW1vdW50OiB0aGlzLmdldE1ickFtb3VudHMoKS5hZGRQb29sTWJyIH0pCgkvLyB2ZXJpZnkgcmVjZWl2ZXIKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIFJlY2VpdmVyCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6InJlY2VpdmVyIiwiZXhwZWN0ZWQiOiJ0aGlzLmFwcC5hZGRyZXNzIn0KCWFzc2VydAoKCS8vIHZlcmlmeSBhbW91bnQKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCglleHRyYWN0IDggOAoJYnRvaQoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6ImFtb3VudCIsImV4cGVjdGVkIjoidGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkUG9vbE1iciJ9Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NTcKCS8vIGFzc2VydCh0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLmV4aXN0cywgInNwZWNpZmllZCB2YWxpZGF0b3IgaWQgaXNuJ3QgdmFsaWQiKQoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJYm94X2xlbgoJc3dhcAoJcG9wCgoJLy8gc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBpc24ndCB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDU5CgkvLyBudW1Qb29sczogdWludDY0ID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyBhcyB1aW50NjQKCWludCAyNDIKCWludCAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIG51bVBvb2xzOiB1aW50NjQKCgkvLyAqaWY5X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDYwCgkvLyAobnVtUG9vbHMgYXMgdWludDY0KSA+PSBNQVhfUE9PTFMKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWludCAyNAoJPj0KCWJ6ICppZjlfZW5kCgoJLy8gKmlmOV9jb25zZXF1ZW50CgkvLyBhbHJlYWR5IGF0IG1heCBwb29sIHNpemUKCWVycgoKKmlmOV9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NjMKCS8vIG51bVBvb2xzICs9IDEKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ2NgoJLy8gc2VuZEFwcENhbGwoewoJLy8gICAgICAgICAgICAgb25Db21wbGV0aW9uOiBPbkNvbXBsZXRpb24uTm9PcCwKCS8vICAgICAgICAgICAgIGFwcHJvdmFsUHJvZ3JhbTogWwoJLy8gICAgICAgICAgICAgICAgIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uZXh0cmFjdCgwLCA0MDk2KSwKCS8vICAgICAgICAgICAgICAgICB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLmV4dHJhY3QoNDA5NiwgdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5zaXplIC0gNDA5NiksCgkvLyAgICAgICAgICAgICBdLAoJLy8gICAgICAgICAgICAgY2xlYXJTdGF0ZVByb2dyYW06IFN0YWtpbmdQb29sLmNsZWFyUHJvZ3JhbSgpLAoJLy8gICAgICAgICAgICAgZ2xvYmFsTnVtVWludDogU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1VaW50LAoJLy8gICAgICAgICAgICAgZ2xvYmFsTnVtQnl0ZVNsaWNlOiBTdGFraW5nUG9vbC5zY2hlbWEuZ2xvYmFsLm51bUJ5dGVTbGljZSwKCS8vICAgICAgICAgICAgIGV4dHJhUHJvZ3JhbVBhZ2VzOiAzLAoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25BcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gY3JlYXRpbmdDb250cmFjdElELCB2YWxpZGF0b3JJZCwgcG9vbElkLCBtaW5FbnRyeVN0YWtlCgkvLyAgICAgICAgICAgICAgICAgbWV0aG9kKCdjcmVhdGVBcHBsaWNhdGlvbih1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCcpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodGhpcy5hcHAuaWQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodmFsaWRhdG9ySWQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IobnVtUG9vbHMgYXMgdWludDY0KSwKCS8vICAgICAgICAgICAgICAgICBpdG9iKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1pbkVudHJ5U3Rha2UpLAoJLy8gICAgICAgICAgICAgXSwKCS8vICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDY3CgkvLyBvbkNvbXBsZXRpb246IE9uQ29tcGxldGlvbi5Ob09wCglpbnQgMCAvLyBOb09wCglpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ2OAoJLy8gYXBwcm92YWxQcm9ncmFtOiBbCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5leHRyYWN0KDAsIDQwOTYpLAoJLy8gICAgICAgICAgICAgICAgIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uZXh0cmFjdCg0MDk2LCB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLnNpemUgLSA0MDk2KSwKCS8vICAgICAgICAgICAgIF0KCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWludCAwCglpbnQgNDA5NgoJYm94X2V4dHJhY3QKCWl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWludCA0MDk2CglieXRlIDB4NzA2ZjZmNmM1NDY1NmQ3MDZjNjE3NDY1NDE3MDcwNzI2Zjc2NjE2YzQyNzk3NDY1NzMgLy8gInBvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMiCglib3hfbGVuCgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLnNpemUKCWFzc2VydAoJaW50IDQwOTYKCS0KCWJveF9leHRyYWN0CglpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDcyCgkvLyBjbGVhclN0YXRlUHJvZ3JhbTogU3Rha2luZ1Bvb2wuY2xlYXJQcm9ncmFtKCkKCWJ5dGUgYjY0IEN3PT0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NzMKCS8vIGdsb2JhbE51bVVpbnQ6IFN0YWtpbmdQb29sLnNjaGVtYS5nbG9iYWwubnVtVWludAoJaW50IDExCglpdHhuX2ZpZWxkIEdsb2JhbE51bVVpbnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NzQKCS8vIGdsb2JhbE51bUJ5dGVTbGljZTogU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1CeXRlU2xpY2UKCWludCAzCglpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ3NQoJLy8gZXh0cmFQcm9ncmFtUGFnZXM6IDMKCWludCAzCglpdHhuX2ZpZWxkIEV4dHJhUHJvZ3JhbVBhZ2VzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDc2CgkvLyBhcHBsaWNhdGlvbkFyZ3M6IFsKCS8vICAgICAgICAgICAgICAgICAvLyBjcmVhdGluZ0NvbnRyYWN0SUQsIHZhbGlkYXRvcklkLCBwb29sSWQsIG1pbkVudHJ5U3Rha2UKCS8vICAgICAgICAgICAgICAgICBtZXRob2QoJ2NyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkJyksCgkvLyAgICAgICAgICAgICAgICAgaXRvYih0aGlzLmFwcC5pZCksCgkvLyAgICAgICAgICAgICAgICAgaXRvYih2YWxpZGF0b3JJZCksCgkvLyAgICAgICAgICAgICAgICAgaXRvYihudW1Qb29scyBhcyB1aW50NjQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWluRW50cnlTdGFrZSksCgkvLyAgICAgICAgICAgICBdCgltZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCXR4bmEgQXBwbGljYXRpb25zIDAKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglpbnQgMjA5CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ4NgoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyA9IG51bVBvb2xzIGFzIHVpbnQxNgoJaW50IDI0MgoJZnJhbWVfZGlnIDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoJaXRvYgoJZXh0cmFjdCA2IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDg5CgkvLyBwb29sQXBwSWQgPSB0aGlzLml0eG4uY3JlYXRlZEFwcGxpY2F0aW9uSUQuaWQKCWl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKCWZyYW1lX2J1cnkgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ5MAoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1tudW1Qb29scyAtIDFdLnBvb2xBcHBJZCA9IHBvb2xBcHBJZAoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgMCAvLyBudW1Qb29sczogdWludDY0CglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0OTEKCS8vIHRoaXMuYWRkUG9vbFRvTm9kZSh2YWxpZGF0b3JJZCwgcG9vbEFwcElkLCBub2RlTnVtKQoJZnJhbWVfZGlnIC0zIC8vIG5vZGVOdW06IHVpbnQ2NAoJZnJhbWVfZGlnIDEgLy8gcG9vbEFwcElkOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGFkZFBvb2xUb05vZGUKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0OTMKCS8vIHRoaXMucmV0aU9QX3ZhbGlkYXRvckFkZGVkUG9vbC5sb2coewoJLy8gICAgICAgICAgICAgaWQ6IHZhbGlkYXRvcklkLAoJLy8gICAgICAgICAgICAgbnVtOiBudW1Qb29scyBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKSwKCS8vICAgICAgICAgfSkKCWJ5dGUgMHhmYmNjMGY2YiAvLyByZXRpT1BfdmFsaWRhdG9yQWRkZWRQb29sKHVpbnQ2NCx1aW50MTYsdWludDY0KQoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWl0b2IKCWR1cAoJYml0bGVuCglpbnQgMTYKCTw9CgoJLy8gbnVtUG9vbHMgYXMgdWludDE2IG92ZXJmbG93ZWQgMTYgYml0cwoJYXNzZXJ0CglleHRyYWN0IDYgMgoJY29uY2F0CglmcmFtZV9kaWcgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cgljb25jYXQKCWxvZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ5OQoJLy8gcmV0dXJuIHsgaWQ6IHZhbGlkYXRvcklkLCBwb29sSWQ6IG51bVBvb2xzIGFzIHVpbnQ2NCwgcG9vbEFwcElkOiB0aGlzLml0eG4hLmNyZWF0ZWRBcHBsaWNhdGlvbklELmlkIH0KCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCglmcmFtZV9kaWcgMCAvLyBudW1Qb29sczogdWludDY0CglpdG9iCgljb25jYXQKCWl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKCWl0b2IKCWNvbmNhdAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDEKCXJldHN1YgoKLy8gYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KQoqYWJpX3JvdXRlX2FkZFN0YWtlOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gc3Rha2VkQW1vdW50UGF5bWVudDogcGF5Cgl0eG4gR3JvdXBJbmRleAoJaW50IDEKCS0KCWR1cAoJZ3R4bnMgVHlwZUVudW0KCWludCBwYXkKCT09CgoJLy8gYXJndW1lbnQgMiAoc3Rha2VkQW1vdW50UGF5bWVudCkgZm9yIGFkZFN0YWtlIG11c3QgYmUgYSBwYXkgdHJhbnNhY3Rpb24KCWFzc2VydAoKCS8vIGV4ZWN1dGUgYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBhZGRTdGFrZQoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFN0YWtlKHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4biwgdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgdmFsdWVUb1ZlcmlmeTogdWludDY0KTogVmFsaWRhdG9yUG9vbEtleQovLwovLyBBZGRzIHN0YWtlIHRvIGEgdmFsaWRhdG9yIHBvb2wuCi8vCi8vIEBwYXJhbSB7UGF5VHhufSBzdGFrZWRBbW91bnRQYXltZW50IC0gcGF5bWVudCBjb21pbmcgZnJvbSBzdGFrZXIgdG8gcGxhY2UgaW50byBhIHBvb2wKLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWx1ZVRvVmVyaWZ5IC0gb25seSBpZiB2YWxpZGF0b3IgaGFzIGdhdGluZyB0byBlbnRlciAtIHRoaXMgaXMgYXNzZXQgaWQgb3IgbmZkIGlkIHRoYXQgY29ycmVzcG9uZHMgdG8gZ2F0aW5nLgovLyBUeG4gc2VuZGVyIGlzIGZhY3RvcmVkIGluIGFzIHdlbGwgaWYgdGhhdCBpcyBwYXJ0IG9mIGdhdGluZy4KLy8gKiBAcmV0dXJucyB7VmFsaWRhdG9yUG9vbEtleX0gLSBUaGUga2V5IG9mIHRoZSB2YWxpZGF0b3IgcG9vbC4KYWRkU3Rha2U6Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA1CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTEyCgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS5leGlzdHMsICJzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGlzbid0IHZhbGlkIikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoKCS8vIHNwZWNpZmllZCB2YWxpZGF0b3IgaWQgaXNuJ3QgdmFsaWQKCWFzc2VydAoKCS8vICppZjEwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTE1CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5zdW5zZXR0aW5nT24gPiAwCglpbnQgMjI2CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWludCAwCgk+CglieiAqaWYxMF9lbmQKCgkvLyAqaWYxMF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MTcKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5zdW5zZXR0aW5nT24gPiBnbG9iYWxzLmxhdGVzdFRpbWVzdGFtcCwKCS8vICAgICAgICAgICAgICAgICAiY2FuJ3Qgc3Rha2Ugd2l0aCBhIHZhbGlkYXRvciB0aGF0IGlzIHBhc3QgaXRzIHN1bnNldHRpbmcgdGltZSIsCgkvLyAgICAgICAgICAgICApCglpbnQgMjI2CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKCT4KCgkvLyBjYW4ndCBzdGFrZSB3aXRoIGEgdmFsaWRhdG9yIHRoYXQgaXMgcGFzdCBpdHMgc3Vuc2V0dGluZyB0aW1lCglhc3NlcnQKCippZjEwX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUyMwoJLy8gc3Rha2VyID0gdGhpcy50eG4uc2VuZGVyCgl0eG4gU2VuZGVyCglmcmFtZV9idXJ5IDAgLy8gc3Rha2VyOiBhZGRyZXNzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTI3CgkvLyB2ZXJpZnlQYXlUeG4oc3Rha2VkQW1vdW50UGF5bWVudCwgewoJLy8gICAgICAgICAgICAgc2VuZGVyOiBzdGFrZXIsCgkvLyAgICAgICAgICAgICByZWNlaXZlcjogdGhpcy5hcHAuYWRkcmVzcywKCS8vICAgICAgICAgfSkKCS8vIHZlcmlmeSBzZW5kZXIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIFNlbmRlcgoJZnJhbWVfZGlnIDAgLy8gc3Rha2VyOiBhZGRyZXNzCgk9PQoKCS8vIHRyYW5zYWN0aW9uIHZlcmlmaWNhdGlvbiBmYWlsZWQ6IHsidHhuIjoic3Rha2VkQW1vdW50UGF5bWVudCIsImZpZWxkIjoic2VuZGVyIiwiZXhwZWN0ZWQiOiJzdGFrZXIifQoJYXNzZXJ0CgoJLy8gdmVyaWZ5IHJlY2VpdmVyCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBSZWNlaXZlcgoJZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCT09CgoJLy8gdHJhbnNhY3Rpb24gdmVyaWZpY2F0aW9uIGZhaWxlZDogeyJ0eG4iOiJzdGFrZWRBbW91bnRQYXltZW50IiwiZmllbGQiOiJyZWNlaXZlciIsImV4cGVjdGVkIjoidGhpcy5hcHAuYWRkcmVzcyJ9Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzUKCS8vIHRoaXMuZG9lc1N0YWtlck1lZXRHYXRpbmcodmFsaWRhdG9ySWQsIHZhbHVlVG9WZXJpZnkpCglmcmFtZV9kaWcgLTMgLy8gdmFsdWVUb1ZlcmlmeTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBkb2VzU3Rha2VyTWVldEdhdGluZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUzNwoJLy8gcmVhbEFtb3VudCA9IHN0YWtlZEFtb3VudFBheW1lbnQuYW1vdW50CglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBBbW91bnQKCWZyYW1lX2J1cnkgMSAvLyByZWFsQW1vdW50OiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzgKCS8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NCA9IDAKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gbWJyQW10TGVmdEJlaGluZDogdWludDY0CgoJLy8gKmlmMTFfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NDAKCS8vIHRoaXMuZG9lc1N0YWtlck5lZWRUb1BheU1CUihzdGFrZXIpCglmcmFtZV9kaWcgMCAvLyBzdGFrZXI6IGFkZHJlc3MKCWNhbGxzdWIgZG9lc1N0YWtlck5lZWRUb1BheU1CUgoJYnogKmlmMTFfZW5kCgoJLy8gKmlmMTFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTQzCgkvLyBtYnJBbXRMZWZ0QmVoaW5kID0gdGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkU3Rha2VyTWJyCgljYWxsc3ViIGdldE1ickFtb3VudHMKCWV4dHJhY3QgMjQgOAoJYnRvaQoJZnJhbWVfYnVyeSAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU0NAoJLy8gcmVhbEFtb3VudCAtPSBtYnJBbXRMZWZ0QmVoaW5kCglmcmFtZV9kaWcgMSAvLyByZWFsQW1vdW50OiB1aW50NjQKCWZyYW1lX2RpZyAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoJLQoJZnJhbWVfYnVyeSAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU0NQoJLy8gdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikuY3JlYXRlKCkKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAwIC8vIHN0YWtlcjogYWRkcmVzcwoJY29uY2F0CglpbnQgMTQ0Cglib3hfY3JlYXRlCglwb3AKCippZjExX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU0OQoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS50b3RhbEFsZ29TdGFrZWQgKyByZWFsQW1vdW50IDwgdGhpcy5tYXhBbGxvd2VkU3Rha2UoKSwKCS8vICAgICAgICAgICAgICd0b3RhbCBzdGFrZWQgZm9yIGFsbCBvZiBhIHZhbGlkYXRvcnMgcG9vbHMgbWF5IG5vdCBleGNlZWQgaGFyZCBjYXAnLAoJLy8gICAgICAgICApCglpbnQgMjUyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoJKwoJY2FsbHN1YiBtYXhBbGxvd2VkU3Rha2UKCTwKCgkvLyB0b3RhbCBzdGFrZWQgZm9yIGFsbCBvZiBhIHZhbGlkYXRvcnMgcG9vbHMgbWF5IG5vdCBleGNlZWQgaGFyZCBjYXAKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU1NgoJLy8gZmluZFJldCA9IHRoaXMuZmluZFBvb2xGb3JTdGFrZXIodmFsaWRhdG9ySWQsIHN0YWtlciwgcmVhbEFtb3VudCkKCWZyYW1lX2RpZyAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoJZnJhbWVfZGlnIDAgLy8gc3Rha2VyOiBhZGRyZXNzCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBmaW5kUG9vbEZvclN0YWtlcgoJZnJhbWVfYnVyeSAzIC8vIGZpbmRSZXQ6ICgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NTcKCS8vIHBvb2xLZXkgPSBmaW5kUmV0WzBdCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NTgKCS8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IgPSBmaW5kUmV0WzFdCglmcmFtZV9kaWcgMyAvLyBmaW5kUmV0OiAoKHVpbnQ2NCx1aW50NjQsdWludDY0KSxib29sLGJvb2wpCglzdG9yZSAyNTUgLy8gZnVsbCBhcnJheQoJbG9hZCAyNTUgLy8gZnVsbCBhcnJheQoJaW50IDE5MgoJZ2V0Yml0CglmcmFtZV9idXJ5IDQgLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU1OQoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sID0gZmluZFJldFsyXQoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWludCAxOTMKCWdldGJpdAoJZnJhbWVfYnVyeSA1IC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoKCS8vICppZjEyX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTYwCgkvLyBwb29sS2V5LnBvb2xJZCA9PT0gMAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMAoJPT0KCWJ6ICppZjEyX2VuZAoKCS8vICppZjEyX2NvbnNlcXVlbnQKCS8vIE5vIHBvb2wgYXZhaWxhYmxlIHdpdGggZnJlZSBzdGFrZS4gIFZhbGlkYXRvciBuZWVkcyB0byBhZGQgYW5vdGhlciBwb29sCgllcnIKCippZjEyX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU2NQoJLy8gdGhpcy51cGRhdGVTdGFrZXJQb29sU2V0KHN0YWtlciwgcG9vbEtleSkKCWZyYW1lX2RpZyAzIC8vIGZpbmRSZXQ6ICgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKCXN0b3JlIDI1NSAvLyBmdWxsIGFycmF5Cglsb2FkIDI1NSAvLyBmdWxsIGFycmF5CglleHRyYWN0IDAgMjQKCWZyYW1lX2RpZyAwIC8vIHN0YWtlcjogYWRkcmVzcwoJY2FsbHN1YiB1cGRhdGVTdGFrZXJQb29sU2V0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTY4CgkvLyB0aGlzLmNhbGxQb29sQWRkU3Rha2UoCgkvLyAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LAoJLy8gICAgICAgICAgICAgcG9vbEtleSwKCS8vICAgICAgICAgICAgIG1ickFtdExlZnRCZWhpbmQsCgkvLyAgICAgICAgICAgICBpc05ld1N0YWtlclRvVmFsaWRhdG9yLAoJLy8gICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1Byb3RvY29sLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgNSAvLyBpc05ld1N0YWtlclRvUHJvdG9jb2w6IGJvb2wKCWZyYW1lX2RpZyA0IC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCWZyYW1lX2RpZyAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMCAyNAoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4bgoJY2FsbHN1YiBjYWxsUG9vbEFkZFN0YWtlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTc1CgkvLyB0aGlzLnJldGlPUF9zdGFrZUFkZGVkLmxvZyh7CgkvLyAgICAgICAgICAgICBpZDogdmFsaWRhdG9ySWQsCgkvLyAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLAoJLy8gICAgICAgICAgICAgYW1vdW50U3Rha2VkOiByZWFsQW1vdW50LAoJLy8gICAgICAgICAgICAgc3Rha2VyOiBzdGFrZXIsCgkvLyAgICAgICAgIH0pCglieXRlIDB4OTYyYjQxNDMgLy8gcmV0aU9QX3N0YWtlQWRkZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQpCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgMCAvLyBzdGFrZXI6IGFkZHJlc3MKCWNvbmNhdAoJZnJhbWVfZGlnIDEgLy8gcmVhbEFtb3VudDogdWludDY0CglpdG9iCgljb25jYXQKCWNvbmNhdAoJbG9nCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTgzCgkvLyByZXR1cm4gcG9vbEtleQoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMCAyNAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDUKCXJldHN1YgoKLy8gc2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KQoqYWJpX3JvdXRlX3NldFRva2VuUGF5b3V0UmF0aW86CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIHNldFRva2VuUGF5b3V0UmF0aW8odWludDY0KSh1aW50NjRbMjRdLHVpbnQ2NCkKCWNhbGxzdWIgc2V0VG9rZW5QYXlvdXRSYXRpbwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIHNldFRva2VuUGF5b3V0UmF0aW8odmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IFBvb2xUb2tlblBheW91dFJhdGlvCi8vCi8vIHNldFRva2VuUGF5b3V0UmF0aW8gaXMgY2FsbGVkIGJ5IFN0YWtpbmcgUG9vbCAjIDEgKE9OTFkpIHRvIGFzayB0aGUgdmFsaWRhdG9yICh1cykgdG8gY2FsY3VsYXRlIHRoZSByYXRpb3MKLy8gb2Ygc3Rha2UgaW4gdGhlIHBvb2xzIGZvciBzdWJzZXF1ZW50IHRva2VuIHBheW91dHMgKGllOiAyIHBvb2xzLCAnMTAwJyBhbGdvIHRvdGFsIHN0YWtlZCwgNjAgaW4gcG9vbCAxLCBhbmQgNDAKLy8gaW4gcG9vbCAyKSAgVGhpcyBpcyBkb25lIHNvIHdlIGhhdmUgYSBzdGFibGUgc25hcHNob3Qgb2Ygc3Rha2UgLSB0YWtlbiBvbmNlIHBlciBlcG9jaCAtIG9ubHkgdHJpZ2dlcmVkIGJ5Ci8vIHBvb2wgMSBkb2luZyBwYXlvdXQuICBwb29scyBvdGhlciB0aGFuIDEgZG9pbmcgcGF5b3V0IGNhbGwgcG9vbCAxIHRvIGFzayBpdCBkbyBpdCBmaXJzdC4KLy8gSXQgd291bGQgYmUgNjAvNDAlIGluIHRoZSBwb29sUGN0T2ZXaG9sZSB2YWx1ZXMuICBUaGUgdG9rZW4gcmV3YXJkIHBheW91dHMgdGhlbiB1c2UgdGhlc2UgdmFsdWVzIGluc3RlYWQgb2YKLy8gdGhlaXIgJ2N1cnJlbnQnIHN0YWtlIHdoaWNoIGNoYW5nZXMgYXMgcGFydCBvZiB0aGUgcGF5b3V0cyB0aGVtc2VsdmVzIChhbmQgcGVvcGxlIGNvdWxkIGJlIGNoYW5naW5nIHN0YWtlCi8vIGR1cmluZyB0aGUgZXBvY2ggdXBkYXRlcyBhY3Jvc3MgcG9vbHMpCi8vCi8vIE11bHRpcGxlIHBvb2xzIHdpbGwgY2FsbCB1cyB2aWEgcG9vbCAxIChwb29sMi0+cG9vbDEtPnZhbGlkYXRvciwgZXRjLikgc28gZG9uJ3QgYXNzZXJ0IG9uIHBvb2wxIGNhbGxpbmcgbXVsdGlwbGUKLy8gdGltZXMgaW4gc2FtZSBlcG9jaC4gIEp1c3QgcmV0dXJuLgovLwovLyBAcGFyYW0gdmFsaWRhdG9ySWQgLSB2YWxpZGF0b3IgaWQgKGFuZCB0aHVzIHBvb2wpIGNhbGxpbmcgdXMuICBWZXJpZmllZCBzbyB0aGF0IHNlbmRlciBNVVNUIGJlIHBvb2wgMSBvZiB0aGlzIHZhbGlkYXRvci4KLy8gQHJldHVybnMgUG9vbFRva2VuUGF5b3V0UmF0aW8gLSB0aGUgZmluaXNoZWQgcmF0aW8gZGF0YQpzZXRUb2tlblBheW91dFJhdGlvOgoJcHJvdG8gMSAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gOAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYwMwoJLy8gcG9vbDFBcHBJRCA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkCglpbnQgMjY4CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMCAvLyBwb29sMUFwcElEOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MDQKCS8vIGFzc2VydChwb29sMUFwcElEICE9PSAwKQoJZnJhbWVfZGlnIDAgLy8gcG9vbDFBcHBJRDogdWludDY0CglpbnQgMAoJIT0KCWFzc2VydAoKCS8vICppZjEzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjA2CgkvLyB0aGlzLnR4bi5zZW5kZXIgIT09IEFwcElELmZyb21VaW50NjQocG9vbDFBcHBJRCkuYWRkcmVzcwoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIDAgLy8gcG9vbDFBcHBJRDogdWludDY0CglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCSE9CglieiAqaWYxM19lbmQKCgkvLyAqaWYxM19jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MDcKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWIgKnNldFRva2VuUGF5b3V0UmF0aW8qcmV0dXJuCgoqaWYxM19lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MTMKCS8vIGN1clJvdW5kID0gZ2xvYmFscy5yb3VuZAoJZ2xvYmFsIFJvdW5kCglmcmFtZV9idXJ5IDEgLy8gY3VyUm91bmQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYxNAoJLy8gbGFzdFBheW91dFVwZGF0ZSA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUudG9rZW5QYXlvdXRSYXRpby51cGRhdGVkRm9yUGF5b3V0CglpbnQgODkyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCgkvLyAqaWYxNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYxNQoJLy8gbGFzdFBheW91dFVwZGF0ZSAhPT0gMAoJZnJhbWVfZGlnIDIgLy8gbGFzdFBheW91dFVwZGF0ZTogdWludDY0CglpbnQgMAoJIT0KCWJ6ICppZjE0X2VuZAoKCS8vICppZjE0X2NvbnNlcXVlbnQKCS8vICppZjE1X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjE3CgkvLyAoQXBwSUQuZnJvbVVpbnQ2NChwb29sMUFwcElEKS5nbG9iYWxTdGF0ZSgnbGFzdFBheW91dCcpIGFzIHVpbnQ2NCkgPT09IGxhc3RQYXlvdXRVcGRhdGUKCWZyYW1lX2RpZyAwIC8vIHBvb2wxQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDZjNjE3Mzc0NTA2MTc5NmY3NTc0IC8vICJsYXN0UGF5b3V0IgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQocG9vbDFBcHBJRCkuZ2xvYmFsU3RhdGUoJ2xhc3RQYXlvdXQnKQoJYXNzZXJ0CglmcmFtZV9kaWcgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCT09CglieiAqaWYxNV9lbmQKCgkvLyAqaWYxNV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MTgKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWIgKnNldFRva2VuUGF5b3V0UmF0aW8qcmV0dXJuCgoqaWYxNV9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MjAKCS8vIGVwb2NoUm91bmRMZW5ndGggPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lcG9jaFJvdW5kTGVuZ3RoIGFzIHVpbnQ2NAoJaW50IDE2OQoJaW50IDQKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDMgLy8gZXBvY2hSb3VuZExlbmd0aDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjIxCgkvLyB0aGlzRXBvY2hCZWdpbiA9IGN1clJvdW5kIC0gKGN1clJvdW5kICUgZXBvY2hSb3VuZExlbmd0aCkKCWZyYW1lX2RpZyAxIC8vIGN1clJvdW5kOiB1aW50NjQKCWZyYW1lX2RpZyAxIC8vIGN1clJvdW5kOiB1aW50NjQKCWZyYW1lX2RpZyAzIC8vIGVwb2NoUm91bmRMZW5ndGg6IHVpbnQ2NAoJJQoJLQoJZnJhbWVfYnVyeSA0IC8vIHRoaXNFcG9jaEJlZ2luOiB1aW50NjQKCgkvLyAqaWYxNl9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYyMwoJLy8gbGFzdFBheW91dFVwZGF0ZSAtIChsYXN0UGF5b3V0VXBkYXRlICUgZXBvY2hSb3VuZExlbmd0aCkgPT09IHRoaXNFcG9jaEJlZ2luCglmcmFtZV9kaWcgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCWZyYW1lX2RpZyAyIC8vIGxhc3RQYXlvdXRVcGRhdGU6IHVpbnQ2NAoJZnJhbWVfZGlnIDMgLy8gZXBvY2hSb3VuZExlbmd0aDogdWludDY0CgklCgktCglmcmFtZV9kaWcgNCAvLyB0aGlzRXBvY2hCZWdpbjogdWludDY0Cgk9PQoJYnogKmlmMTZfZW5kCgoJLy8gKmlmMTZfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjI0CgkvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS50b2tlblBheW91dFJhdGlvCglpbnQgNzAwIC8vIGhlYWRPZmZzZXQKCWludCAyMDAKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CgliICpzZXRUb2tlblBheW91dFJhdGlvKnJldHVybgoKKmlmMTZfZW5kOgoKKmlmMTRfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjI3CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8udXBkYXRlZEZvclBheW91dCA9IGN1clJvdW5kCglpbnQgODkyCglmcmFtZV9kaWcgMSAvLyBjdXJSb3VuZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYyOQoJLy8gY3VyTnVtUG9vbHMgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnN0YXRlLm51bVBvb2xzIGFzIHVpbnQ2NAoJaW50IDI0MgoJaW50IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDUgLy8gY3VyTnVtUG9vbHM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYzMAoJLy8gdG90YWxTdGFrZUZvclZhbGlkYXRvciA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUudG90YWxBbGdvU3Rha2VkCglpbnQgMjUyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgNiAvLyB0b3RhbFN0YWtlRm9yVmFsaWRhdG9yOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MzEKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgY3VyTnVtUG9vbHM7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDcgLy8gaTogdWludDY0CgoqZm9yXzI6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MzEKCS8vIGkgPCBjdXJOdW1Qb29scwoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglmcmFtZV9kaWcgNSAvLyBjdXJOdW1Qb29sczogdWludDY0Cgk8CglieiAqZm9yXzJfZW5kCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjM2CgkvLyBvdXJQb29sUGN0T2ZXaG9sZSA9IHdpZGVSYXRpbygKCS8vICAgICAgICAgICAgICAgICBbdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1tpXS50b3RhbEFsZ29TdGFrZWQsIDFfMDAwXzAwMF0sCgkvLyAgICAgICAgICAgICAgICAgW3RvdGFsU3Rha2VGb3JWYWxpZGF0b3JdLAoJLy8gICAgICAgICAgICAgKQoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglpbnQgMV8wMDBfMDAwCgltdWx3CglpbnQgMAoJZnJhbWVfZGlnIDYgLy8gdG90YWxTdGFrZUZvclZhbGlkYXRvcjogdWludDY0CglkaXZtb2R3Cglwb3AKCXBvcAoJc3dhcAoJIQoKCS8vIHdpZGVSYXRpbyBmYWlsZWQKCWFzc2VydAoJZnJhbWVfYnVyeSA4IC8vIG91clBvb2xQY3RPZldob2xlOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NDAKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUudG9rZW5QYXlvdXRSYXRpby5wb29sUGN0T2ZXaG9sZVtpXSA9IG91clBvb2xQY3RPZldob2xlCglpbnQgNzAwCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWZyYW1lX2RpZyA4IC8vIG91clBvb2xQY3RPZldob2xlOiB1aW50NjQKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoqZm9yXzJfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MzEKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSA3IC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzIKCipmb3JfMl9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NDIKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCipzZXRUb2tlblBheW91dFJhdGlvKnJldHVybjoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDgKCXJldHN1YgoKLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcygodWludDY0LHVpbnQ2NCx1aW50NjQpLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkCiphYmlfcm91dGVfc3Rha2VVcGRhdGVkVmlhUmV3YXJkczoKCS8vIHNhdHVyYXRlZEJ1cm5Ub0ZlZVNpbms6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQoJYnRvaQoKCS8vIHZhbGlkYXRvckNvbW1pc3Npb246IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAoJYnRvaQoKCS8vIHJld2FyZFRva2VuQW1vdW50UmVzZXJ2ZWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwoJYnRvaQoKCS8vIGFsZ29Ub0FkZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglidG9pCgoJLy8gcG9vbEtleTogKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZHVwCglsZW4KCWludCAyNAoJPT0KCgkvLyBhcmd1bWVudCA0IChwb29sS2V5KSBmb3Igc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyBtdXN0IGJlIGEgKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBzdGFrZVVwZGF0ZWRWaWFSZXdhcmRzKCh1aW50NjQsdWludDY0LHVpbnQ2NCksdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKCWNhbGxzdWIgc3Rha2VVcGRhdGVkVmlhUmV3YXJkcwoJaW50IDEKCXJldHVybgoKLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyhwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5LCBhbGdvVG9BZGQ6IHVpbnQ2NCwgcmV3YXJkVG9rZW5BbW91bnRSZXNlcnZlZDogdWludDY0LCB2YWxpZGF0b3JDb21taXNzaW9uOiB1aW50NjQsIHNhdHVyYXRlZEJ1cm5Ub0ZlZVNpbms6IHVpbnQ2NCk6IHZvaWQKLy8KLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyBpcyBjYWxsZWQgYnkgU3Rha2luZyBwb29scyB0byBpbmZvcm0gdGhlIHZhbGlkYXRvciAodXMpIHRoYXQgYSBwYXJ0aWN1bGFyIGFtb3VudCBvZiB0b3RhbAovLyBzdGFrZSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgc3BlY2lmaWVkIHBvb2wuICBUaGlzIGlzIHVzZWQgdG8gdXBkYXRlIHRoZSBzdGF0cyB3ZSBoYXZlIGluIG91ciBQb29sSW5mbyBzdG9yYWdlLgovLyBUaGUgY2FsbGluZyBBcHAgaWQgaXMgdmFsaWRhdGVkIGFnYWluc3Qgb3VyIHBvb2wgbGlzdCBhcyB3ZWxsLgovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBWYWxpZGF0b3JQb29sS2V5IHR5cGUKLy8gQHBhcmFtIHt1aW50NjR9IGFsZ29Ub0FkZCAtIGFtb3VudCB0aGlzIHZhbGlkYXRvcidzIHRvdGFsIHN0YWtlIGluY3JlYXNlZCB2aWEgcmV3YXJkcwovLyBAcGFyYW0ge3VpbnQ2NH0gcmV3YXJkVG9rZW5BbW91bnRSZXNlcnZlZCAtIGFtb3VudCB0aGlzIHZhbGlkYXRvcidzIHRvdGFsIHN0YWtlIGluY3JlYXNlZCB2aWEgcmV3YXJkcyAodGhhdCBzaG91bGQgYmUKLy8gQHBhcmFtIHt1aW50NjR9IHZhbGlkYXRvckNvbW1pc3Npb24gLSB0aGUgY29tbWlzc2lvbiBhbW91bnQgdGhlIHZhbGlkYXRvciB3YXMgcGFpZCwgaWYgYW55Ci8vIEBwYXJhbSB7dWludDY0fSBzYXR1cmF0ZWRCdXJuVG9GZWVTaW5rIC0gaWYgdGhlIHBvb2wgd2FzIGluIHNhdHVyYXRlZCBzdGF0ZSwgdGhlIGFtb3VudCBzZW50IGJhY2sgdG8gdGhlIGZlZSBzaW5rLgovLyBzZWVuIGFzICdhY2NvdW50ZWQgZm9yL3BlbmRpbmcgc3BlbnQnKQpzdGFrZVVwZGF0ZWRWaWFSZXdhcmRzOgoJcHJvdG8gNSAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjYzCgkvLyB0aGlzLnZlcmlmeVBvb2xLZXlDYWxsZXIocG9vbEtleSkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CgljYWxsc3ViIHZlcmlmeVBvb2xLZXlDYWxsZXIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NjYKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCArPSBhbGdvVG9BZGQKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAxMCAvLyBoZWFkT2Zmc2V0CgkrCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NjcKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS50b3RhbEFsZ29TdGFrZWQgKz0gYWxnb1RvQWRkCglpbnQgMjUyCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMiAvLyBhbGdvVG9BZGQ6IHVpbnQ2NAoJKwoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjY4CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUucmV3YXJkVG9rZW5IZWxkQmFjayArPSByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkCglpbnQgMjYwCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkOiB1aW50NjQKCSsKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY3MAoJLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgKz0gYWxnb1RvQWRkCglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglhcHBfZ2xvYmFsX2dldAoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CgkrCglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglzd2FwCglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY3MwoJLy8gdGhpcy5yZXZlcmlmeU5GRE93bmVyc2hpcChwb29sS2V5LmlkKQoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCgljYWxsc3ViIHJldmVyaWZ5TkZET3duZXJzaGlwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Njc1CgkvLyB0aGlzLnJldGlPUF9lcG9jaFJld2FyZFVwZGF0ZS5sb2coewoJLy8gICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLAoJLy8gICAgICAgICAgICAgYWxnb0FkZGVkOiBhbGdvVG9BZGQsCgkvLyAgICAgICAgICAgICByZXdhcmRUb2tlbkhlbGRCYWNrOiByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkLAoJLy8gICAgICAgICAgICAgc2F0dXJhdGVkQnVyblRvRmVlU2luazogc2F0dXJhdGVkQnVyblRvRmVlU2luaywKCS8vICAgICAgICAgICAgIHZhbGlkYXRvckNvbW1pc3Npb246IHZhbGlkYXRvckNvbW1pc3Npb24sCgkvLyAgICAgICAgIH0pCglieXRlIDB4YjNlNDdjM2QgLy8gcmV0aU9QX2Vwb2NoUmV3YXJkVXBkYXRlKHVpbnQ2NCx1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTQgLy8gdmFsaWRhdG9yQ29tbWlzc2lvbjogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtNSAvLyBzYXR1cmF0ZWRCdXJuVG9GZWVTaW5rOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY29uY2F0Cglsb2cKCXJldHN1YgoKLy8gc3Rha2VSZW1vdmVkKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wpdm9pZAoqYWJpX3JvdXRlX3N0YWtlUmVtb3ZlZDoKCS8vIHN0YWtlclJlbW92ZWQ6IGJvb2wKCXR4bmEgQXBwbGljYXRpb25BcmdzIDUKCWR1cAoJbGVuCglpbnQgMQoJPT0KCgkvLyBhcmd1bWVudCAwIChzdGFrZXJSZW1vdmVkKSBmb3Igc3Rha2VSZW1vdmVkIG11c3QgYmUgYSBib29sCglhc3NlcnQKCWludCAwCglnZXRiaXQKCgkvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDQKCWJ0b2kKCgkvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDMKCWJ0b2kKCgkvLyBzdGFrZXI6IGFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMzIKCT09CgoJLy8gYXJndW1lbnQgMyAoc3Rha2VyKSBmb3Igc3Rha2VSZW1vdmVkIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBwb29sS2V5OiAodWludDY0LHVpbnQ2NCx1aW50NjQpCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDI0Cgk9PQoKCS8vIGFyZ3VtZW50IDQgKHBvb2xLZXkpIGZvciBzdGFrZVJlbW92ZWQgbXVzdCBiZSBhICh1aW50NjQsdWludDY0LHVpbnQ2NCkKCWFzc2VydAoKCS8vIGV4ZWN1dGUgc3Rha2VSZW1vdmVkKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wpdm9pZAoJY2FsbHN1YiBzdGFrZVJlbW92ZWQKCWludCAxCglyZXR1cm4KCi8vIHN0YWtlUmVtb3ZlZChwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5LCBzdGFrZXI6IEFkZHJlc3MsIGFtb3VudFJlbW92ZWQ6IHVpbnQ2NCwgcmV3YXJkUmVtb3ZlZDogdWludDY0LCBzdGFrZXJSZW1vdmVkOiBib29sZWFuKTogdm9pZAovLwovLyBzdGFrZVJlbW92ZWQgaXMgY2FsbGVkIGJ5IFN0YWtpbmcgcG9vbHMgdG8gaW5mb3JtIHRoZSB2YWxpZGF0b3IgKHVzKSB0aGF0IGEgcGFydGljdWxhciBhbW91bnQgb2YgdG90YWwgc3Rha2UgaGFzIGJlZW4gcmVtb3ZlZAovLyBmcm9tIHRoZSBzcGVjaWZpZWQgcG9vbC4gIFRoaXMgaXMgdXNlZCB0byB1cGRhdGUgdGhlIHN0YXRzIHdlIGhhdmUgaW4gb3VyIFBvb2xJbmZvIHN0b3JhZ2UuCi8vIElmIGFueSBhbW91bnQgb2YgcmV3YXJkUmVtb3ZlZCBpcyBzcGVjaWZpZWQsIHRoZW4gdGhhdCBhbW91bnQgb2YgcmV3YXJkIGlzIHNlbnQgdG8gdGhlIHVzZQovLyBUaGUgY2FsbGluZyBBcHAgaWQgaXMgdmFsaWRhdGVkIGFnYWluc3Qgb3VyIHBvb2wgbGlzdCBhcyB3ZWxsLgovLwovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgY2FsbGluZyB1cyBmcm9tIHdoaWNoIHN0YWtlIHdhcyByZW1vdmVkCi8vIEBwYXJhbSB7QWRkcmVzc30gc3Rha2VyCi8vIEBwYXJhbSB7dWludDY0fSBhbW91bnRSZW1vdmVkIC0gYWxnbyBhbW91bnQgcmVtb3ZlZAovLyBAcGFyYW0ge3VpbnQ2NH0gcmV3YXJkUmVtb3ZlZCAtIGlmIGFwcGxpY2FibGUsIGFtb3VudCBvZiB0b2tlbiByZXdhcmQgcmVtb3ZlZCAoYnkgcG9vbCAxIGNhbGxlcikgb3IgVE8gcmVtb3ZlIGFuZCBwYXkgb3V0ICh2aWEgcG9vbCAxIGZyb20gZGlmZmVyZW50IHBvb2wgY2FsbGVyKQovLyBAcGFyYW0ge2Jvb2xlYW59IHN0YWtlclJlbW92ZWQKc3Rha2VSZW1vdmVkOgoJcHJvdG8gNSAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMwoKCS8vICppZjE3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzA1CgkvLyBnbG9iYWxzLm9wY29kZUJ1ZGdldCA8IDMwMAoJZ2xvYmFsIE9wY29kZUJ1ZGdldAoJaW50IDMwMAoJPAoJYnogKmlmMTdfZW5kCgoJLy8gKmlmMTdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzA2CgkvLyBpbmNyZWFzZU9wY29kZUJ1ZGdldCgpCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJaW50IDAKCWl0eG5fZmllbGQgRmVlCglieXRlIGI2NCBDb0VCIC8vICNwcmFnbWEgdmVyc2lvbiAxMDsgaW50IDEKCWR1cAoJaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCWludCBEZWxldGVBcHBsaWNhdGlvbgoJaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KCWl0eG5fc3VibWl0CgoqaWYxN19lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MDgKCS8vIHRoaXMudmVyaWZ5UG9vbEtleUNhbGxlcihwb29sS2V5KQoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWNhbGxzdWIgdmVyaWZ5UG9vbEtleUNhbGxlcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxMgoJLy8gYXNzZXJ0KGFtb3VudFJlbW92ZWQgPiAwIHx8IHJld2FyZFJlbW92ZWQgPiAwLCAnc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGFsZ28gb3IgcmV3YXJkIHdhcyByZW1vdmVkJykKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWludCAwCgk+CglkdXAKCWJueiAqc2tpcF9vcjIKCWZyYW1lX2RpZyAtNCAvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCWludCAwCgk+Cgl8fAoKKnNraXBfb3IyOgoJLy8gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGFsZ28gb3IgcmV3YXJkIHdhcyByZW1vdmVkCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MTUKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCAtPSBhbW91bnRSZW1vdmVkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxNgoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsQWxnb1N0YWtlZCAtPSBhbW91bnRSZW1vdmVkCglpbnQgMjUyCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxNwoJLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgLT0gYW1vdW50UmVtb3ZlZAoJYnl0ZSAweDczNzQ2MTZiNjU2NCAvLyAic3Rha2VkIgoJYXBwX2dsb2JhbF9nZXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCXN3YXAKCWFwcF9nbG9iYWxfcHV0CgoJLy8gKmlmMThfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MTkKCS8vIHJld2FyZFJlbW92ZWQgPiAwCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CglpbnQgMAoJPgoJYnogKmlmMThfZWxzZQoKCS8vICppZjE4X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyMAoJLy8gcmV3YXJkVG9rZW5JRCA9IHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5jb25maWcucmV3YXJkVG9rZW5JZAoJaW50IDE1MwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIHJld2FyZFRva2VuSUQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyMQoJLy8gYXNzZXJ0KHJld2FyZFRva2VuSUQgIT09IDAsICJyZXdhcmRSZW1vdmVkIGNhbid0IGJlIHNldCBpZiB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIHJld2FyZCB0b2tlbiEiKQoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JRDogdWludDY0CglpbnQgMAoJIT0KCgkvLyByZXdhcmRSZW1vdmVkIGNhbid0IGJlIHNldCBpZiB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIHJld2FyZCB0b2tlbiEKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyMgoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS5yZXdhcmRUb2tlbkhlbGRCYWNrID49IHJld2FyZFJlbW92ZWQsCgkvLyAgICAgICAgICAgICAgICAgJ3Jld2FyZCBiZWluZyByZW1vdmVkIG11c3QgYmUgY292ZXJlZCBieSBob2xkIGJhY2sgYW1vdW50JywKCS8vICAgICAgICAgICAgICkKCWludCAyNjAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtNCAvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCT49CgoJLy8gcmV3YXJkIGJlaW5nIHJlbW92ZWQgbXVzdCBiZSBjb3ZlcmVkIGJ5IGhvbGQgYmFjayBhbW91bnQKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyOAoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnJld2FyZFRva2VuSGVsZEJhY2sgLT0gcmV3YXJkUmVtb3ZlZAoJaW50IDI2MAoJZHVwCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CgktCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyAqaWYxOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczMwoJLy8gcG9vbEtleS5wb29sSWQgIT09IDEKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCSE9CglieiAqaWYxOV9lbmQKCgkvLyAqaWYxOV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MzQKCS8vIHNlbmRNZXRob2RDYWxsPHR5cGVvZiBTdGFraW5nUG9vbC5wcm90b3R5cGUucGF5VG9rZW5SZXdhcmQ+KHsKCS8vICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRDogQXBwSUQuZnJvbVVpbnQ2NCh0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJnczogW3N0YWtlciwgcmV3YXJkVG9rZW5JRCwgcmV3YXJkUmVtb3ZlZF0sCgkvLyAgICAgICAgICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgltZXRob2QgInBheVRva2VuUmV3YXJkKGFkZHJlc3MsdWludDY0LHVpbnQ2NCl2b2lkIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MzUKCS8vIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQodGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzWzBdLnBvb2xBcHBJZCkKCWludCAyNjgKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczNgoJLy8gbWV0aG9kQXJnczogW3N0YWtlciwgcmV3YXJkVG9rZW5JRCwgcmV3YXJkUmVtb3ZlZF0KCWZyYW1lX2RpZyAtMiAvLyBzdGFrZXI6IEFkZHJlc3MKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklEOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCippZjE5X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczOQoJLy8gdGhpcy5yZXRpT1Bfc3Rha2VSZW1vdmVkLmxvZyh7CgkvLyAgICAgICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICAgICAgcG9vbE51bTogcG9vbEtleS5wb29sSWQgYXMgdWludDE2LAoJLy8gICAgICAgICAgICAgICAgIHBvb2xBcHBJZDogQXBwSUQuZnJvbVVpbnQ2NChwb29sS2V5LnBvb2xBcHBJZCksCgkvLyAgICAgICAgICAgICAgICAgc3Rha2VyOiBzdGFrZXIsCgkvLyAgICAgICAgICAgICAgICAgYW1vdW50VW5zdGFrZWQ6IGFtb3VudFJlbW92ZWQsCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5Bc3NldElkOiBBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JRCksCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5zUmVjZWl2ZWQ6IHJld2FyZFJlbW92ZWQsCgkvLyAgICAgICAgICAgICB9KQoJYnl0ZSAweDEyZjRiZDRiIC8vIHJldGlPUF9zdGFrZVJlbW92ZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTIgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC00IC8vIHJld2FyZFJlbW92ZWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklEOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWIgKmlmMThfZW5kCgoqaWYxOF9lbHNlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzQ5CgkvLyB0aGlzLnJldGlPUF9zdGFrZVJlbW92ZWQubG9nKHsKCS8vICAgICAgICAgICAgICAgICBpZDogcG9vbEtleS5pZCwKCS8vICAgICAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICAgICAgcG9vbEFwcElkOiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICBzdGFrZXI6IHN0YWtlciwKCS8vICAgICAgICAgICAgICAgICBhbW91bnRVbnN0YWtlZDogYW1vdW50UmVtb3ZlZCwKCS8vICAgICAgICAgICAgICAgICAvLyBubyB0b2tlbnMgcmV3YXJkZWQuLgoJLy8gICAgICAgICAgICAgICAgIHJld2FyZFRva2VuQXNzZXRJZDogQXNzZXRJRC56ZXJvSW5kZXgsCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5zUmVjZWl2ZWQ6IDAsCgkvLyAgICAgICAgICAgICB9KQoJYnl0ZSAweDEyZjRiZDRiIC8vIHJldGlPUF9zdGFrZVJlbW92ZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTIgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAKCWNvbmNhdAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCippZjE4X2VuZDoKCS8vICppZjIwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzYxCgkvLyBzdGFrZXJSZW1vdmVkCglmcmFtZV9kaWcgLTUgLy8gc3Rha2VyUmVtb3ZlZDogYm9vbGVhbgoJYnogKmlmMjBfZW5kCgoJLy8gKmlmMjBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzYzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbcG9vbEtleS5wb29sSWQgLSAxXS50b3RhbFN0YWtlcnMgLT0gMQoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJaW50IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDEKCS0KCWl0b2IKCWV4dHJhY3QgNiAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NjUKCS8vIHJlbW92ZVJldCA9IHRoaXMucmVtb3ZlRnJvbVN0YWtlclBvb2xTZXQoc3Rha2VyLCA8VmFsaWRhdG9yUG9vbEtleT57CgkvLyAgICAgICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICAgICAgcG9vbElkOiBwb29sS2V5LnBvb2xJZCwKCS8vICAgICAgICAgICAgICAgICBwb29sQXBwSWQ6IHBvb2xLZXkucG9vbEFwcElkLAoJLy8gICAgICAgICAgICAgfSkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY2FsbHN1YiByZW1vdmVGcm9tU3Rha2VyUG9vbFNldAoJZnJhbWVfYnVyeSAxIC8vIHJlbW92ZVJldDogKGJvb2wsYm9vbCkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NzAKCS8vIHN0YWtlck91dE9mVGhpc1ZhbGlkYXRvciA9IHJlbW92ZVJldFswXQoJZnJhbWVfZGlnIDEgLy8gcmVtb3ZlUmV0OiAoYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWludCAwCglnZXRiaXQKCWZyYW1lX2J1cnkgMiAvLyBzdGFrZXJPdXRPZlRoaXNWYWxpZGF0b3I6IGJvb2wKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NzEKCS8vIHN0YWtlck91dE9mUHJvdG9jb2wgPSByZW1vdmVSZXRbMV0KCWZyYW1lX2RpZyAxIC8vIHJlbW92ZVJldDogKGJvb2wsYm9vbCkKCXN0b3JlIDI1NSAvLyBmdWxsIGFycmF5Cglsb2FkIDI1NSAvLyBmdWxsIGFycmF5CglpbnQgMQoJZ2V0Yml0CglmcmFtZV9idXJ5IDMgLy8gc3Rha2VyT3V0T2ZQcm90b2NvbDogYm9vbAoKCS8vICppZjIxX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzczCgkvLyBzdGFrZXJPdXRPZlRoaXNWYWxpZGF0b3IKCWZyYW1lX2RpZyAyIC8vIHN0YWtlck91dE9mVGhpc1ZhbGlkYXRvcjogYm9vbAoJYnogKmlmMjFfZW5kCgoJLy8gKmlmMjFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Nzc0CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUudG90YWxTdGFrZXJzIC09IDEKCWludCAyNDQKCWR1cAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDEKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKKmlmMjFfZW5kOgoJLy8gKmlmMjJfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NzcKCS8vIHN0YWtlck91dE9mUHJvdG9jb2wKCWZyYW1lX2RpZyAzIC8vIHN0YWtlck91dE9mUHJvdG9jb2w6IGJvb2wKCWJ6ICppZjIyX2VuZAoKCS8vICppZjIyX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc3OAoJLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlIC09IDEKCWJ5dGUgMHg2ZTc1NmQ1Mzc0NjE2YjY1NzI3MyAvLyAibnVtU3Rha2VycyIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMQoJLQoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJc3dhcAoJYXBwX2dsb2JhbF9wdXQKCippZjIyX2VuZDoKCippZjIwX2VuZDoKCXJldHN1YgoKLy8gZmluZFBvb2xGb3JTdGFrZXIodWludDY0LGFkZHJlc3MsdWludDY0KSgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKKmFiaV9yb3V0ZV9maW5kUG9vbEZvclN0YWtlcjoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gYW1vdW50VG9TdGFrZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglidG9pCgoJLy8gc3Rha2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDEgKHN0YWtlcikgZm9yIGZpbmRQb29sRm9yU3Rha2VyIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBmaW5kUG9vbEZvclN0YWtlcih1aW50NjQsYWRkcmVzcyx1aW50NjQpKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJY2FsbHN1YiBmaW5kUG9vbEZvclN0YWtlcgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGZpbmRQb29sRm9yU3Rha2VyKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIHN0YWtlcjogQWRkcmVzcywgYW1vdW50VG9TdGFrZTogdWludDY0KTogW1ZhbGlkYXRvclBvb2xLZXksIGJvb2xlYW4sIGJvb2xlYW5dCi8vCi8vIEZpbmRzIHRoZSBwb29sIGZvciBhIHN0YWtlciBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgdmFsaWRhdG9yIGlkLCBzdGFrZXIgYWRkcmVzcywgYW5kIGFtb3VudCB0byBzdGFrZS4KLy8gRmlyc3QgY2hlY2tzIHRoZSBzdGFrZXJzICdhbHJlYWR5IHN0YWtlZCBsaXN0JyBmb3IgdGhlIHZhbGlkYXRvciBwcmVmZXJyaW5nIHRob3NlIChhZGRpbmcgaWYgcG9zc2libGUpIHRoZW4gYWRkcwovLyB0byBuZXcgcG9vbCBpZiBuZWNlc3NhcnkuCi8vCi8vIEBwYXJhbSB7VmFsaWRhdG9ySWRUeXBlfSB2YWxpZGF0b3JJZCAtIFRoZSBpZCBvZiB0aGUgdmFsaWRhdG9yLgovLyBAcGFyYW0ge0FkZHJlc3N9IHN0YWtlciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzdGFrZXIuCi8vIEBwYXJhbSB7dWludDY0fSBhbW91bnRUb1N0YWtlIC0gVGhlIGFtb3VudCB0byBzdGFrZS4KLy8gQHJldHVybnMge1ZhbGlkYXRvclBvb2xLZXksIGJvb2xlYW4sIGJvb2xlYW59IC0gVGhlIHBvb2wgZm9yIHRoZSBzdGFrZXIsIHRydWUvZmFsc2Ugb24gd2hldGhlciB0aGUgc3Rha2VyIGlzICduZXcnCi8vIHRvIHRoaXMgVkFMSURBVE9SLCBhbmQgdHJ1ZS9mYWxzZSBpZiBzdGFrZXIgaXMgbmV3IHRvIHRoZSBwcm90b2NvbC4KZmluZFBvb2xGb3JTdGFrZXI6Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA3CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODAwCgkvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yID0gdHJ1ZQoJaW50IDEKCWZyYW1lX2J1cnkgMCAvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yOiBib29sCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODAxCgkvLyBpc05ld1N0YWtlclRvUHJvdG9jb2wgPSB0cnVlCglpbnQgMQoJZnJhbWVfYnVyeSAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgwOQoJLy8gbWF4UGVyUG9vbCA9IHRoaXMuZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sCglmcmFtZV9idXJ5IDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoJLy8gKmlmMjNfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MTIKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLmV4aXN0cwoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfbGVuCglzd2FwCglwb3AKCWJ6ICppZjIzX2VuZAoKCS8vICppZjIzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxMwoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxNAoJLy8gYXNzZXJ0KHZhbGlkYXRvcklkICE9PSAwKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWludCAwCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODE1CgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IHBvb2xTZXQubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoKKmZvcl8zOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODE1CgkvLyBpIDwgcG9vbFNldC5sZW5ndGgKCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDYKCTwKCWJ6ICpmb3JfM19lbmQKCgkvLyAqaWYyNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxNgoJLy8gZ2xvYmFscy5vcGNvZGVCdWRnZXQgPCAzMDAKCWdsb2JhbCBPcGNvZGVCdWRnZXQKCWludCAzMDAKCTwKCWJ6ICppZjI0X2VuZAoKCS8vICppZjI0X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxNwoJLy8gaW5jcmVhc2VPcGNvZGVCdWRnZXQoKQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCWludCAwCglpdHhuX2ZpZWxkIEZlZQoJYnl0ZSBiNjQgQ29FQiAvLyAjcHJhZ21hIHZlcnNpb24gMTA7IGludCAxCglkdXAKCWl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCglpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCglpbnQgRGVsZXRlQXBwbGljYXRpb24KCWl0eG5fZmllbGQgT25Db21wbGV0aW9uCglpdHhuX3N1Ym1pdAoKKmlmMjRfZW5kOgoJLy8gKmlmMjVfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MTkKCS8vIHBvb2xTZXRbaV0uaWQgPT09IDAKCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgk9PQoJYnogKmlmMjVfZW5kCgoJLy8gKmlmMjVfY29uc2VxdWVudAoJYiAqZm9yXzNfY29udGludWUKCippZjI1X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyMgoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sID0gZmFsc2UKCWludCAwCglmcmFtZV9idXJ5IDEgLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sCgoJLy8gKmlmMjZfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MjMKCS8vIHBvb2xTZXRbaV0uaWQgPT09IHZhbGlkYXRvcklkCglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgMAoJKwoJaW50IDgKCWV4dHJhY3QzCglidG9pCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJPT0KCWJ6ICppZjI2X2VuZAoKCS8vICppZjI2X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyNQoJLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciA9IGZhbHNlCglpbnQgMAoJZnJhbWVfYnVyeSAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCgkvLyAqaWYyN19jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyNwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1twb29sU2V0W2ldLnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCArCgkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50VG9TdGFrZSA8PQoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4UGVyUG9vbAoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgOCAvLyBoZWFkT2Zmc2V0CgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJKwoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8PQoJYnogKmlmMjdfZW5kCgoJLy8gKmlmMjdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODMxCgkvLyByZXR1cm4gW3Bvb2xTZXRbaV0sIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IsIGlzTmV3U3Rha2VyVG9Qcm90b2NvbF0KCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWJ5dGUgMHgwMAoJaW50IDAKCWZyYW1lX2RpZyAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCXNldGJpdAoJaW50IDEKCWZyYW1lX2RpZyAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoJc2V0Yml0Cgljb25jYXQKCWIgKmZpbmRQb29sRm9yU3Rha2VyKnJldHVybgoKKmlmMjdfZW5kOgoKKmlmMjZfZW5kOgoKKmZvcl8zX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODE1CgkvLyBpICs9IDEKCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgNCAvLyBpOiB1aW50NjQKCWIgKmZvcl8zCgoqZm9yXzNfZW5kOgoKKmlmMjNfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODM4CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBhbW91bnRUb1N0YWtlID49IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1pbkVudHJ5U3Rha2UsCgkvLyAgICAgICAgICAgICAnbXVzdCBzdGFrZSBhdCBsZWFzdCB0aGUgbWluaW11bSBmb3IgdGhpcyBwb29sJywKCS8vICAgICAgICAgKQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJaW50IDIwOQoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk+PQoKCS8vIG11c3Qgc3Rha2UgYXQgbGVhc3QgdGhlIG1pbmltdW0gZm9yIHRoaXMgcG9vbAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ0CgkvLyBwb29scyA9IGNsb25lKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHMpCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWludCA0MzIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglmcmFtZV9idXJ5IDUgLy8gcG9vbHM6ICh1aW50NjQsdWludDE2LHVpbnQ2NClbMjRdCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ1CgkvLyBjdXJOdW1Qb29scyA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUubnVtUG9vbHMgYXMgdWludDY0CglpbnQgMjQyCglpbnQgMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgNiAvLyBjdXJOdW1Qb29sczogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ2CgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IGN1ck51bVBvb2xzOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA3IC8vIGk6IHVpbnQ2NAoKKmZvcl80OgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ2CgkvLyBpIDwgY3VyTnVtUG9vbHMKCWZyYW1lX2RpZyA3IC8vIGk6IHVpbnQ2NAoJZnJhbWVfZGlnIDYgLy8gY3VyTnVtUG9vbHM6IHVpbnQ2NAoJPAoJYnogKmZvcl80X2VuZAoKCS8vICppZjI4X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ3CgkvLyBwb29sc1tpXS50b3RhbEFsZ29TdGFrZWQgKyBhbW91bnRUb1N0YWtlIDw9IG1heFBlclBvb2wKCWZyYW1lX2RpZyA1IC8vIHBvb2xzOiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJKwoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8PQoJYnogKmlmMjhfZW5kCgoJLy8gKmlmMjhfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ4CgkvLyByZXR1cm4gWwoJLy8gICAgICAgICAgICAgICAgICAgICB7IGlkOiB2YWxpZGF0b3JJZCwgcG9vbElkOiBpICsgMSwgcG9vbEFwcElkOiBwb29sc1tpXS5wb29sQXBwSWQgfSwKCS8vICAgICAgICAgICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciwKCS8vICAgICAgICAgICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1Byb3RvY29sLAoJLy8gICAgICAgICAgICAgICAgIF0KCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxCgkrCglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyA1IC8vIHBvb2xzOiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglieXRlIDB4MDAKCWludCAwCglmcmFtZV9kaWcgMCAvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yOiBib29sCglzZXRiaXQKCWludCAxCglmcmFtZV9kaWcgMSAvLyBpc05ld1N0YWtlclRvUHJvdG9jb2w6IGJvb2wKCXNldGJpdAoJY29uY2F0CgliICpmaW5kUG9vbEZvclN0YWtlcipyZXR1cm4KCippZjI4X2VuZDoKCipmb3JfNF9jb250aW51ZToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg0NgoJLy8gaSArPSAxCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDcgLy8gaTogdWludDY0CgliICpmb3JfNAoKKmZvcl80X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg1NgoJLy8gcmV0dXJuIFt7IGlkOiB2YWxpZGF0b3JJZCwgcG9vbElkOiAwLCBwb29sQXBwSWQ6IDAgfSwgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciwgaXNOZXdTdGFrZXJUb1Byb3RvY29sXQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCgljb25jYXQKCWJ5dGUgMHgwMAoJaW50IDAKCWZyYW1lX2RpZyAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCXNldGJpdAoJaW50IDEKCWZyYW1lX2RpZyAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoJc2V0Yml0Cgljb25jYXQKCipmaW5kUG9vbEZvclN0YWtlcipyZXR1cm46CgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCgkvLyBwb3AgYWxsIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHRoZSBzdGFjawoJcG9wbiA3CglyZXRzdWIKCi8vIG1vdmVQb29sVG9Ob2RlKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKKmFiaV9yb3V0ZV9tb3ZlUG9vbFRvTm9kZToKCS8vIG5vZGVOdW06IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwoJYnRvaQoKCS8vIHBvb2xBcHBJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglidG9pCgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgbW92ZVBvb2xUb05vZGUodWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZAoJY2FsbHN1YiBtb3ZlUG9vbFRvTm9kZQoJaW50IDEKCXJldHVybgoKLy8gbW92ZVBvb2xUb05vZGUodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcG9vbEFwcElkOiB1aW50NjQsIG5vZGVOdW06IHVpbnQ2NCk6IHZvaWQKLy8KLy8gRmluZCB0aGUgc3BlY2lmaWVkIHBvb2wgKGluIGFueSBub2RlIG51bWJlcikgYW5kIG1vdmUgaXQgdG8gdGhlIHNwZWNpZmllZCBub2RlLgovLyBUaGUgcG9vbCBhY2NvdW50IGlzIGZvcmNlZCBvZmZsaW5lIGlmIG1vdmVkIHNvIHByaW9yIG5vZGUgd2lsbCBzdGlsbCBydW4gZm9yIDMyMCByb3VuZHMgYnV0Ci8vIG5ldyBrZXkgZ29lcyBvbmxpbmUgb24gbmV3IG5vZGUgc29vbiBhZnRlciAoMzIwIHJvdW5kcyBhZnRlciBpdCBnb2VzIG9ubGluZSkKLy8gTm8tb3AgaWYgc3VjY2VzcywgYXNzZXJ0cyBpZiBub3QgZm91bmQgb3IgY2FuJ3QgbW92ZSAgKG5vIHNwYWNlIGluIHRhcmdldCkKLy8gWyBPTkxZIE9XTkVSIE9SIE1BTkFHRVIgQ0FOIENIQU5HRSBdCi8vCi8vIEBwYXJhbSB7VmFsaWRhdG9ySWRUeXBlfSB2YWxpZGF0b3JJZCAtIFRoZSBpZCBvZiB0aGUgdmFsaWRhdG9yLgovLyBAcGFyYW0ge3VpbnQ2NH0gcG9vbEFwcElkCi8vIEBwYXJhbSB7dWludDY0fSBub2RlTnVtCm1vdmVQb29sVG9Ob2RlOgoJcHJvdG8gMyAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3MQoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lck9yTWFuYWdlcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyT3JNYW5hZ2VyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODczCgkvLyBub2RlUG9vbEFzc2lnbm1lbnRzID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5ub2RlUG9vbEFzc2lnbm1lbnRzKQoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfYnVyeSAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzQKCS8vIGFzc2VydChub2RlTnVtID49IDEgJiYgbm9kZU51bSA8PSBNQVhfTk9ERVMsICdub2RlIG51bWJlciBvdXQgb2YgYWxsb3dhYmxlIHJhbmdlJykKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCAxCgk+PQoJZHVwCglieiAqc2tpcF9hbmQyCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgOAoJPD0KCSYmCgoqc2tpcF9hbmQyOgoJLy8gbm9kZSBudW1iZXIgb3V0IG9mIGFsbG93YWJsZSByYW5nZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODc2CgkvLyBmb3IgKGxldCBzcmNOb2RlSWR4ID0gMDsgc3JjTm9kZUlkeCA8IE1BWF9OT0RFUzsgc3JjTm9kZUlkeCArPSAxKQoJaW50IDAKCWZyYW1lX2J1cnkgMSAvLyBzcmNOb2RlSWR4OiB1aW50NjQKCipmb3JfNToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3NgoJLy8gc3JjTm9kZUlkeCA8IE1BWF9OT0RFUwoJZnJhbWVfZGlnIDEgLy8gc3JjTm9kZUlkeDogdWludDY0CglpbnQgOAoJPAoJYnogKmZvcl81X2VuZAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3NwoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBNQVhfUE9PTFNfUEVSX05PREU7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzY6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzcKCS8vIGkgPCBNQVhfUE9PTFNfUEVSX05PREUKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDMKCTwKCWJ6ICpmb3JfNl9lbmQKCgkvLyAqaWYyOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3OAoJLy8gbm9kZVBvb2xBc3NpZ25tZW50cy5ub2Rlc1tzcmNOb2RlSWR4XS5wb29sQXBwSWRzW2ldID09PSBwb29sQXBwSWQKCWZyYW1lX2RpZyAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCWludCAwCglmcmFtZV9kaWcgMSAvLyBzcmNOb2RlSWR4OiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMAoJKwoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWZyYW1lX2RpZyAtMiAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJPT0KCWJ6ICppZjI5X2VuZAoKCS8vICppZjI5X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3OQoJLy8gYXNzZXJ0KG5vZGVOdW0gLSAxICE9PSBzcmNOb2RlSWR4LCAiY2FuJ3QgbW92ZSB0byBzYW1lIG5vZGUiKQoJZnJhbWVfZGlnIC0zIC8vIG5vZGVOdW06IHVpbnQ2NAoJaW50IDEKCS0KCWZyYW1lX2RpZyAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJIT0KCgkvLyBjYW4ndCBtb3ZlIHRvIHNhbWUgbm9kZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODgxCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLm5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbc3JjTm9kZUlkeF0ucG9vbEFwcElkc1tpXSA9IDAKCWludCA5MDAKCWZyYW1lX2RpZyAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4NAoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5nb09mZmxpbmU+KHsKCS8vICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgltZXRob2QgImdvT2ZmbGluZSgpdm9pZCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODg1CgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkKCWZyYW1lX2RpZyAtMiAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4OQoJLy8gdGhpcy5hZGRQb29sVG9Ob2RlKHZhbGlkYXRvcklkLCBwb29sQXBwSWQsIG5vZGVOdW0pCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gcG9vbEFwcElkOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGFkZFBvb2xUb05vZGUKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4OTAKCS8vIHJldHVybgoJcmV0c3ViCgoqaWYyOV9lbmQ6CgoqZm9yXzZfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzcKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzYKCipmb3JfNl9lbmQ6CgoqZm9yXzVfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzYKCS8vIHNyY05vZGVJZHggKz0gMQoJZnJhbWVfZGlnIDEgLy8gc3JjTm9kZUlkeDogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJYiAqZm9yXzUKCipmb3JfNV9lbmQ6CgkvLyBjb3VsZG4ndCBmaW5kIHBvb2wgYXBwIGlkIGluIG5vZGVzIHRvIG1vdmUKCWVycgoJcmV0c3ViCgovLyBlbXB0eVRva2VuUmV3YXJkcyh1aW50NjQsYWRkcmVzcyl1aW50NjQKKmFiaV9yb3V0ZV9lbXB0eVRva2VuUmV3YXJkczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gcmVjZWl2ZXI6IGFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMzIKCT09CgoJLy8gYXJndW1lbnQgMCAocmVjZWl2ZXIpIGZvciBlbXB0eVRva2VuUmV3YXJkcyBtdXN0IGJlIGEgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZW1wdHlUb2tlblJld2FyZHModWludDY0LGFkZHJlc3MpdWludDY0CgljYWxsc3ViIGVtcHR5VG9rZW5SZXdhcmRzCglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZW1wdHlUb2tlblJld2FyZHModmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcmVjZWl2ZXI6IEFkZHJlc3MpOiB1aW50NjQKLy8KLy8gU2VuZHMgdGhlIHJld2FyZCB0b2tlbnMgaGVsZCBpbiBwb29sIDEgdG8gc3BlY2lmaWVkIHJlY2VpdmVyLgovLyBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgdGhlIG93bmVyIHdoZW4gdGhleSB3YW50IHRvIGdldCByZXdhcmQgdG9rZW5zICdiYWNrJyB3aGljaCB0aGV5IHNlbnQgdG8KLy8gdGhlIGZpcnN0IHBvb2wgKGxpa2VseSBiZWNhdXNlIHZhbGlkYXRvciBpcyBzdW5zZXR0aW5nLiAgQW55IHRva2VucyBjdXJyZW50bHkgJ3Jlc2VydmVkJyBmb3Igc3Rha2VycyB0byBjbGFpbSB3aWxsCi8vIE5PVCBiZSBzZW50IGFzIHRoZXkgbXVzdCBiZSBoZWxkIGJhY2sgZm9yIHN0YWtlcnMgdG8gbGF0ZXIgY2xhaW0uCi8vIFsgT05MWSBPV05FUiBDQU4gQ0FMTF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7QWRkcmVzc30gcmVjZWl2ZXIgLSB0aGUgYWNjb3VudCB0byBzZW5kIHRoZSB0b2tlbnMgdG8gKG11c3QgYWxyZWFkeSBiZSBvcHRlZC1pbiB0byB0aGUgcmV3YXJkIHRva2VuKQovLyBAcmV0dXJucyB7dWludDY0fSB0aGUgYW1vdW50IG9mIHJld2FyZCB0b2tlbiBzZW50CmVtcHR5VG9rZW5SZXdhcmRzOgoJcHJvdG8gMiAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkwOQoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTEwCgkvLyByZXdhcmRUb2tlbklkID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcucmV3YXJkVG9rZW5JZAoJaW50IDE1MwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTExCgkvLyByZXdhcmRUb2tlbkhlbGRCYWNrID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5yZXdhcmRUb2tlbkhlbGRCYWNrCglpbnQgMjYwCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMSAvLyByZXdhcmRUb2tlbkhlbGRCYWNrOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MTIKCS8vIGFzc2VydChyZXdhcmRUb2tlbklkICE9PSAwLCAidGhpcyB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIGEgcmV3YXJkIHRva2VuIGRlZmluZWQiKQoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0CglpbnQgMAoJIT0KCgkvLyB0aGlzIHZhbGlkYXRvciBkb2Vzbid0IGhhdmUgYSByZXdhcmQgdG9rZW4gZGVmaW5lZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTEzCgkvLyBwb29sT25lQXBwSWQgPSBBcHBJRC5mcm9tVWludDY0KHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkKQoJaW50IDI2OAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MTUKCS8vIHRva2VuUmV3YXJkQmFsID0KCS8vICAgICAgICAgICAgIHBvb2xPbmVBcHBJZC5hZGRyZXNzLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JZCkpIC0gcmV3YXJkVG9rZW5IZWxkQmFjawoJZnJhbWVfZGlnIDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCXBvcAoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0Cglhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKCXBvcAoJZnJhbWVfZGlnIDEgLy8gcmV3YXJkVG9rZW5IZWxkQmFjazogdWludDY0CgktCglmcmFtZV9idXJ5IDMgLy8gdG9rZW5SZXdhcmRCYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkxOQoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5wYXlUb2tlblJld2FyZD4oewoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25JRDogcG9vbE9uZUFwcElkLAoJLy8gICAgICAgICAgICAgbWV0aG9kQXJnczogW3JlY2VpdmVyLCByZXdhcmRUb2tlbklkLCB0b2tlblJld2FyZEJhbF0sCgkvLyAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJbWV0aG9kICJwYXlUb2tlblJld2FyZChhZGRyZXNzLHVpbnQ2NCx1aW50NjQpdm9pZCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTIwCgkvLyBhcHBsaWNhdGlvbklEOiBwb29sT25lQXBwSWQKCWZyYW1lX2RpZyAyIC8vIHBvb2xPbmVBcHBJZDogdWludDY0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MjEKCS8vIG1ldGhvZEFyZ3M6IFtyZWNlaXZlciwgcmV3YXJkVG9rZW5JZCwgdG9rZW5SZXdhcmRCYWxdCglmcmFtZV9kaWcgLTIgLy8gcmVjZWl2ZXI6IEFkZHJlc3MKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklkOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMyAvLyB0b2tlblJld2FyZEJhbDogdWludDY0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MjMKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHBvb2xPbmVBcHBJZC5hZGRyZXNzLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JZCkpID09PSByZXdhcmRUb2tlbkhlbGRCYWNrLAoJLy8gICAgICAgICAgICAgJ2JhbGFuY2Ugb2YgcmVtYWluaW5nIHJld2FyZCB0b2tlbnMgc2hvdWxkIG1hdGNoIHRoZSBoZWxkIGJhY2sgYW1vdW50JywKCS8vICAgICAgICAgKQoJZnJhbWVfZGlnIDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCXBvcAoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0Cglhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKCXBvcAoJZnJhbWVfZGlnIDEgLy8gcmV3YXJkVG9rZW5IZWxkQmFjazogdWludDY0Cgk9PQoKCS8vIGJhbGFuY2Ugb2YgcmVtYWluaW5nIHJld2FyZCB0b2tlbnMgc2hvdWxkIG1hdGNoIHRoZSBoZWxkIGJhY2sgYW1vdW50Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MjcKCS8vIHJldHVybiB0b2tlblJld2FyZEJhbAoJZnJhbWVfZGlnIDMgLy8gdG9rZW5SZXdhcmRCYWw6IHVpbnQ2NAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDMKCXJldHN1YgoKLy8gY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IHZvaWQKY2FsbGVyTXVzdEJlT3duZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDIwCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICB0aGlzLnR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLAoJLy8gICAgICAgICAgICAgJ2NhbiBvbmx5IGJlIGNhbGxlZCBieSB2YWxpZGF0b3Igb3duZXInLAoJLy8gICAgICAgICApCgl0eG4gU2VuZGVyCglpbnQgOAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJPT0KCgkvLyBjYW4gb25seSBiZSBjYWxsZWQgYnkgdmFsaWRhdG9yIG93bmVyCglhc3NlcnQKCXJldHN1YgoKLy8gY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXIodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IHZvaWQKY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDI3CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICB0aGlzLnR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyIHx8CgkvLyAgICAgICAgICAgICAgICAgdGhpcy50eG4uc2VuZGVyID09PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5tYW5hZ2VyLAoJLy8gICAgICAgICAgICAgJ2NhbiBvbmx5IGJlIGNhbGxlZCBieSBvd25lciBvciBtYW5hZ2VyIG9mIHZhbGlkYXRvcicsCgkvLyAgICAgICAgICkKCXR4biBTZW5kZXIKCWludCA4CglpbnQgMzIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0Cgk9PQoJZHVwCglibnogKnNraXBfb3IzCgl0eG4gU2VuZGVyCglpbnQgNDAKCWludCAzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCT09Cgl8fAoKKnNraXBfb3IzOgoJLy8gY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IG93bmVyIG9yIG1hbmFnZXIgb2YgdmFsaWRhdG9yCglhc3NlcnQKCXJldHN1YgoKLy8gdmVyaWZ5UG9vbEtleUNhbGxlcihwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5KTogdm9pZAovLwovLyB2ZXJpZnlQb29sS2V5Q2FsbGVyIHZlcmlmaWVzIHRoZSBwYXNzZWQgaW4ga2V5IChmcm9tIGEgc3Rha2luZyBwb29sIGNhbGxpbmcgdXMgdG8gdXBkYXRlIG1ldHJpY3MpIGlzIHZhbGlkCi8vIGFuZCBtYXRjaGVzIHRoZSBpbmZvcm1hdGlvbiB3ZSBoYXZlIGluIG91ciBzdGF0ZS4gICdGYWtlJyBwb29scyBjb3VsZCBjYWxsIHVzIHRvIHVwZGF0ZSBvdXIgZGF0YSwgYnV0IHRoZXkKLy8gY2FuJ3QgZmFrZSB0aGUgaWRzIGFuZCBtb3N0IGltcG9ydGFudGx5IGFwcGxpY2F0aW9uIGlkKCEpIG9mIHRoZSBjYWxsZXIgdGhhdCBoYXMgdG8gbWF0Y2guCnZlcmlmeVBvb2xLZXlDYWxsZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDQwCgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLmV4aXN0cywgInRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGlzbid0IHZhbGlkIikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cglib3hfbGVuCglzd2FwCglwb3AKCgkvLyB0aGUgc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBpc24ndCB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA0MQoJLy8gYXNzZXJ0KHBvb2xLZXkucG9vbElkIDw9IE1BWF9QT09MUywgJ3Bvb2wgaWQgbm90IGluIHZhbGlkIHJhbmdlJykKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDI0Cgk8PQoKCS8vIHBvb2wgaWQgbm90IGluIHZhbGlkIHJhbmdlCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDQyCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBwb29sS2V5LnBvb2xJZCA+IDAgJiYgKHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNikgPD0gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLm51bVBvb2xzLAoJLy8gICAgICAgICAgICAgJ3Bvb2wgaWQgb3V0c2lkZSBvZiByYW5nZSBvZiBwb29scyBjcmVhdGVkIGZvciB0aGlzIHZhbGlkYXRvcicsCgkvLyAgICAgICAgICkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDAKCT4KCWR1cAoJYnogKnNraXBfYW5kMwoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMjQyCglpbnQgMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk8PQoJJiYKCipza2lwX2FuZDM6CgkvLyBwb29sIGlkIG91dHNpZGUgb2YgcmFuZ2Ugb2YgcG9vbHMgY3JlYXRlZCBmb3IgdGhpcyB2YWxpZGF0b3IKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNDgKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHBvb2xLZXkucG9vbEFwcElkID09PSB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbcG9vbEtleS5wb29sSWQgLSAxXS5wb29sQXBwSWQsCgkvLyAgICAgICAgICAgICAiVGhlIHBhc3NlZCBpbiBhcHAgaWQgZG9lc24ndCBtYXRjaCB0aGUgcGFzc2VkIGluIGlkcyIsCgkvLyAgICAgICAgICkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk9PQoKCS8vIFRoZSBwYXNzZWQgaW4gYXBwIGlkIGRvZXNuJ3QgbWF0Y2ggdGhlIHBhc3NlZCBpbiBpZHMKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNTMKCS8vIGFzc2VydCh0aGlzLnR4bi5zZW5kZXIgPT09IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLmFkZHJlc3MpCgl0eG4gU2VuZGVyCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAxNiA4CglidG9pCglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCT09Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDU1CgkvLyBhc3NlcnQocG9vbEtleS5pZCA9PT0gKEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLmdsb2JhbFN0YXRlKCd2YWxpZGF0b3JJZCcpIGFzIHVpbnQ2NCkpCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWJ5dGUgMHg3NjYxNmM2OTY0NjE3NDZmNzI0OTY0IC8vICJ2YWxpZGF0b3JJZCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgndmFsaWRhdG9ySWQnKQoJYXNzZXJ0Cgk9PQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA1NgoJLy8gYXNzZXJ0KHBvb2xLZXkucG9vbElkID09PSAoQXBwSUQuZnJvbVVpbnQ2NChwb29sS2V5LnBvb2xBcHBJZCkuZ2xvYmFsU3RhdGUoJ3Bvb2xJZCcpIGFzIHVpbnQ2NCkpCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWJ5dGUgMHg3MDZmNmY2YzQ5NjQgLy8gInBvb2xJZCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgncG9vbElkJykKCWFzc2VydAoJPT0KCWFzc2VydAoJcmV0c3ViCgovLyByZXZlcmlmeU5GRE93bmVyc2hpcCh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogdm9pZAovLwovLyBUaGlzIG1ldGhvZCB2ZXJpZmllcyB0aGUgb3duZXJzaGlwIG9mIE5GRCAoTmFtZWQgRnVuY3Rpb24gRGF0YSkgYnkgYSB2YWxpZGF0b3IuCi8vIElmIHRoZSBvd25lcnNoaXAgaXMgbm8gbG9uZ2VyIHZhbGlkLCBpdCByZW1vdmVzIHRoZSBORkQgZnJvbSB0aGUgdmFsaWRhdG9yJ3MgY29uZmlndXJhdGlvbi4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3Igd2hvc2UgZGF0YSBzaG91bGQgYmUgcmUtZXZhbHVhdGVkLgpyZXZlcmlmeU5GRE93bmVyc2hpcDoKCXByb3RvIDEgMAoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDY2CgkvLyB2YWxpZGF0b3JDb25maWcgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZwoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJZnJhbWVfYnVyeSAwIC8vIHN0b3JhZ2Uga2V5Ly92YWxpZGF0b3JDb25maWcKCgkvLyAqaWYzMF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNjcKCS8vIHZhbGlkYXRvckNvbmZpZy5uZmRGb3JJbmZvICE9PSAwCglpbnQgNzIKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDAKCSE9CglieiAqaWYzMF9lbmQKCgkvLyAqaWYzMF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDcwCgkvLyBuZmRPd25lciA9IEFwcElELmZyb21VaW50NjQodmFsaWRhdG9yQ29uZmlnLm5mZEZvckluZm8pLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzCglpbnQgNzIKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQodmFsaWRhdG9yQ29uZmlnLm5mZEZvckluZm8pLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCgkvLyAqaWYzMV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNzIKCS8vIHZhbGlkYXRvckNvbmZpZy5vd25lciAhPT0gbmZkT3duZXIgJiYgdmFsaWRhdG9yQ29uZmlnLm1hbmFnZXIgIT09IG5mZE93bmVyCglpbnQgOAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfZGlnIDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCSE9CglkdXAKCWJ6ICpza2lwX2FuZDQKCWludCA0MAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfZGlnIDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCSE9CgkmJgoKKnNraXBfYW5kNDoKCWJ6ICppZjMxX2VuZAoKCS8vICppZjMxX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNzQKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm5mZEZvckluZm8gPSAwCglpbnQgNzIKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKKmlmMzFfZW5kOgoKKmlmMzBfZW5kOgoJcmV0c3ViCgovLyB2YWxpZGF0ZUNvbmZpZyhjb25maWc6IFZhbGlkYXRvckNvbmZpZyk6IHZvaWQKdmFsaWRhdGVDb25maWc6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDgxCgkvLyBhc3NlcnQoY29uZmlnLm93bmVyICE9PSBBZGRyZXNzLnplcm9BZGRyZXNzKQoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDggMzIKCWdsb2JhbCBaZXJvQWRkcmVzcwoJIT0KCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwODIKCS8vIGFzc2VydChjb25maWcubWFuYWdlciAhPT0gQWRkcmVzcy56ZXJvQWRkcmVzcykKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA0MCAzMgoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA4MwoJLy8gYXNzZXJ0KHRoaXMudHhuLnNlbmRlciA9PT0gY29uZmlnLm93bmVyLCAnc2VuZGVyIG11c3QgYmUgb3duZXIgdG8gYWRkIG5ldyB2YWxpZGF0b3InKQoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDggMzIKCT09CgoJLy8gc2VuZGVyIG11c3QgYmUgb3duZXIgdG8gYWRkIG5ldyB2YWxpZGF0b3IKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwODUKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIGNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPj0gR0FUSU5HX1RZUEVfTk9ORSAmJiBjb25maWcuZW50cnlHYXRpbmdUeXBlIDw9IEdBVElOR19UWVBFX0NPTlNUX01BWCwKCS8vICAgICAgICAgICAgICdnYXRpbmcgdHlwZSBub3QgdmFsaWQnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgODAgMQoJYnRvaQoJaW50IDAKCT49CglkdXAKCWJ6ICpza2lwX2FuZDUKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4MCAxCglidG9pCglpbnQgNAoJPD0KCSYmCgoqc2tpcF9hbmQ1OgoJLy8gZ2F0aW5nIHR5cGUgbm90IHZhbGlkCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDg5CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBjb25maWcuZXBvY2hSb3VuZExlbmd0aCA+PSBNSU5fRVBPQ0hfTEVOR1RIICYmIGNvbmZpZy5lcG9jaFJvdW5kTGVuZ3RoIDw9IE1BWF9FUE9DSF9MRU5HVEgsCgkvLyAgICAgICAgICAgICAnZXBvY2ggbGVuZ3RoIG5vdCBpbiBhbGxvd2FibGUgcmFuZ2UnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTY5IDQKCWJ0b2kKCWludCAxCgk+PQoJZHVwCglieiAqc2tpcF9hbmQ2CglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTY5IDQKCWJ0b2kKCWludCAxMDAwMDAwCgk8PQoJJiYKCipza2lwX2FuZDY6CgkvLyBlcG9jaCBsZW5ndGggbm90IGluIGFsbG93YWJsZSByYW5nZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA5MwoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgY29uZmlnLnBlcmNlbnRUb1ZhbGlkYXRvciA+PSBNSU5fUENUX1RPX1ZBTElEQVRPUiAmJiBjb25maWcucGVyY2VudFRvVmFsaWRhdG9yIDw9IE1BWF9QQ1RfVE9fVkFMSURBVE9SLAoJLy8gICAgICAgICAgICAgJ2NvbW1pc3Npb24gcGVyY2VudGFnZSBub3QgdmFsaWQnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTczIDQKCWJ0b2kKCWludCAwCgk+PQoJZHVwCglieiAqc2tpcF9hbmQ3CglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTczIDQKCWJ0b2kKCWludCAxMDAwMDAwCgk8PQoJJiYKCipza2lwX2FuZDc6CgkvLyBjb21taXNzaW9uIHBlcmNlbnRhZ2Ugbm90IHZhbGlkCglhc3NlcnQKCgkvLyAqaWYzMl9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwOTcKCS8vIGNvbmZpZy5wZXJjZW50VG9WYWxpZGF0b3IgIT09IDAKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAxNzMgNAoJYnRvaQoJaW50IDAKCSE9CglieiAqaWYzMl9lbmQKCgkvLyAqaWYzMl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDk4CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgY29uZmlnLnZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzICE9PSBBZGRyZXNzLnplcm9BZGRyZXNzLAoJLy8gICAgICAgICAgICAgICAgICd2YWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyBtdXN0IGJlIHNldCBpZiBwZXJjZW50IHRvIHZhbGlkYXRvciBpcyBub3QgMCcsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTc3IDMyCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CgoJLy8gdmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MgbXVzdCBiZSBzZXQgaWYgcGVyY2VudCB0byB2YWxpZGF0b3IgaXMgbm90IDAKCWFzc2VydAoKKmlmMzJfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEwMwoJLy8gYXNzZXJ0KGNvbmZpZy5taW5FbnRyeVN0YWtlID49IE1JTl9BTEdPX1NUQUtFX1BFUl9QT09MLCAnc3Rha2luZyBwb29sIG11c3QgaGF2ZSBtaW5pbXVtIGVudHJ5IG9mIDEgYWxnbycpCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMjA5IDgKCWJ0b2kKCWludCAxMDAwMDAwCgk+PQoKCS8vIHN0YWtpbmcgcG9vbCBtdXN0IGhhdmUgbWluaW11bSBlbnRyeSBvZiAxIGFsZ28KCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMDUKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIGNvbmZpZy5wb29sc1Blck5vZGUgPiAwICYmIGNvbmZpZy5wb29sc1Blck5vZGUgPD0gTUFYX1BPT0xTX1BFUl9OT0RFLAoJLy8gICAgICAgICAgICAgJ251bWJlciBvZiBwb29scyBwZXIgbm9kZSBtdXN0IGJlIGJlIGJldHdlZW4gMSBhbmQgdGhlIG1heGltdW0gYWxsb3dlZCBudW1iZXInLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMjI1IDEKCWJ0b2kKCWludCAwCgk+CglkdXAKCWJ6ICpza2lwX2FuZDgKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAyMjUgMQoJYnRvaQoJaW50IDMKCTw9CgkmJgoKKnNraXBfYW5kODoKCS8vIG51bWJlciBvZiBwb29scyBwZXIgbm9kZSBtdXN0IGJlIGJlIGJldHdlZW4gMSBhbmQgdGhlIG1heGltdW0gYWxsb3dlZCBudW1iZXIKCWFzc2VydAoKCS8vICppZjMzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEwOQoJLy8gY29uZmlnLnN1bnNldHRpbmdPbiAhPT0gMAoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDIyNiA4CglidG9pCglpbnQgMAoJIT0KCWJ6ICppZjMzX2VuZAoKCS8vICppZjMzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMTAKCS8vIGFzc2VydChjb25maWcuc3Vuc2V0dGluZ09uID4gZ2xvYmFscy5sYXRlc3RUaW1lc3RhbXAsICdzdW5zZXR0aW5nT24gbXVzdCBiZSBsYXRlciB0aGFuIG5vdyBpZiBzZXQnKQoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDIyNiA4CglidG9pCglnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCgk+CgoJLy8gc3Vuc2V0dGluZ09uIG11c3QgYmUgbGF0ZXIgdGhhbiBub3cgaWYgc2V0Cglhc3NlcnQKCippZjMzX2VuZDoKCXJldHN1YgoKLy8gY2FsbFBvb2xBZGRTdGFrZShzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4sIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXksIG1ickFtdFBhaWQ6IHVpbnQ2NCwgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbGVhbiwgaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sZWFuKTogdm9pZAovLwovLyBBZGRzIGEgc3Rha2VycyBhbW91bnQgb2YgYWxnbyB0byBhIHZhbGlkYXRvciBwb29sLCB0cmFuc2ZlcnJpbmcgdGhlIGFsZ28gd2UgcmVjZWl2ZWQgZnJvbSB0aGVtIChhbHJlYWR5IHZlcmlmaWVkCi8vIGJ5IG91ciBjYWxsZXIpIHRvIHRoZSBzdGFraW5nIHBvb2wgYWNjb3VudCwgYW5kIHRoZW4gdGVsbGluZyBpdCBhYm91dCB0aGUgYW1vdW50IGJlaW5nIGFkZGVkIGZvciB0aGUgc3BlY2lmaWVkCi8vIHN0YWtlci4KLy8KLy8gQHBhcmFtIHtQYXlUeG59IHN0YWtlZEFtb3VudFBheW1lbnQgLSBwYXltZW50IGNvbWluZyBmcm9tIHN0YWtlciB0byBwbGFjZSBpbnRvIGEgcG9vbAovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBUaGUga2V5IG9mIHRoZSB2YWxpZGF0b3IgcG9vbC4KLy8gQHBhcmFtIHt1aW50NjR9IG1ickFtdFBhaWQgLSBBbW91bnQgdGhlIHVzZXIgaXMgbGVhdmluZyBiZWhpbmQgaW4gdGhlIHZhbGlkYXRvciB0byBwYXkgZm9yIHRoZWlyIHN0YWtlciBNQlIgY29zdAovLyBAcGFyYW0ge2Jvb2xlYW59IGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IgLSBpZiB0aGlzIGlzIGEgbmV3LCBmaXJzdC10aW1lIHN0YWtlciB0byB0aGUgdmFsaWRhdG9yCi8vIEBwYXJhbSB7Ym9vbGVhbn0gaXNOZXdTdGFrZXJUb1Byb3RvY29sIC0gaWYgdGhpcyBpcyBhIG5ldywgZmlyc3QtdGltZSBzdGFrZXIgdG8gdGhlIHByb3RvY29sCmNhbGxQb29sQWRkU3Rha2U6Cglwcm90byA1IDAKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiAyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEzMgoJLy8gcG9vbEFwcElkID0gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzW3Bvb2xLZXkucG9vbElkIC0gMV0ucG9vbEFwcElkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIHBvb2xBcHBJZDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEzNgoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5hZGRTdGFrZSwgdWludDY0Pih7CgkvLyAgICAgICAgICAgICBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCksCgkvLyAgICAgICAgICAgICBtZXRob2RBcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gPT09PT09PQoJLy8gICAgICAgICAgICAgICAgIC8vIFRISVMgSVMgQSBTRU5EIG9mIHRoZSBhbW91bnQgcmVjZWl2ZWQgcmlnaHQgYmFjayBvdXQgYW5kIGludG8gdGhlIHN0YWtpbmcgcG9vbCBjb250cmFjdCBhY2NvdW50LgoJLy8gICAgICAgICAgICAgICAgIHsgYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQsIHJlY2VpdmVyOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuYWRkcmVzcyB9LAoJLy8gICAgICAgICAgICAgICAgIC8vID09PT09PT0KCS8vICAgICAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LnNlbmRlciwKCS8vICAgICAgICAgICAgIF0sCgkvLyAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgcGF5CglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE0MQoJLy8gYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJZnJhbWVfZGlnIC0zIC8vIG1ickFtdFBhaWQ6IHVpbnQ2NAoJLQoJaXR4bl9maWVsZCBBbW91bnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTQxCgkvLyByZWNlaXZlcjogQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmFkZHJlc3MKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCWl0eG5fZmllbGQgUmVjZWl2ZXIKCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCWl0eG5fbmV4dAoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAiYWRkU3Rha2UocGF5LGFkZHJlc3MpdWludDY0IgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTM3CgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTM4CgkvLyBtZXRob2RBcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gPT09PT09PQoJLy8gICAgICAgICAgICAgICAgIC8vIFRISVMgSVMgQSBTRU5EIG9mIHRoZSBhbW91bnQgcmVjZWl2ZWQgcmlnaHQgYmFjayBvdXQgYW5kIGludG8gdGhlIHN0YWtpbmcgcG9vbCBjb250cmFjdCBhY2NvdW50LgoJLy8gICAgICAgICAgICAgICAgIHsgYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQsIHJlY2VpdmVyOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuYWRkcmVzcyB9LAoJLy8gICAgICAgICAgICAgICAgIC8vID09PT09PT0KCS8vICAgICAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LnNlbmRlciwKCS8vICAgICAgICAgICAgIF0KCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIFNlbmRlcgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCgkvLyBTdWJtaXQgaW5uZXIgdHJhbnNhY3Rpb24KCWl0eG5fc3VibWl0CglpdHhuIE51bUxvZ3MKCWludCAxCgktCglpdHhuYXMgTG9ncwoJZXh0cmFjdCA0IDAKCWJ0b2kKCgkvLyAqaWYzNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNDYKCS8vIGdsb2JhbHMub3Bjb2RlQnVkZ2V0IDwgNTAwCglnbG9iYWwgT3Bjb2RlQnVkZ2V0CglpbnQgNTAwCgk8CglieiAqaWYzNF9lbmQKCgkvLyAqaWYzNF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTQ3CgkvLyBpbmNyZWFzZU9wY29kZUJ1ZGdldCgpCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJaW50IDAKCWl0eG5fZmllbGQgRmVlCglieXRlIGI2NCBDb0VCIC8vICNwcmFnbWEgdmVyc2lvbiAxMDsgaW50IDEKCWR1cAoJaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCWludCBEZWxldGVBcHBsaWNhdGlvbgoJaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KCWl0eG5fc3VibWl0CgoqaWYzNF9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTUxCgkvLyBwb29sTnVtU3Rha2VycyA9IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgnbnVtU3Rha2VycycpIGFzIHVpbnQ2NAoJZnJhbWVfZGlnIDAgLy8gcG9vbEFwcElkOiB1aW50NjQKCWJ5dGUgMHg2ZTc1NmQ1Mzc0NjE2YjY1NzI3MyAvLyAibnVtU3Rha2VycyIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuZ2xvYmFsU3RhdGUoJ251bVN0YWtlcnMnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDEgLy8gcG9vbE51bVN0YWtlcnM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNTIKCS8vIHBvb2xBbGdvU3Rha2VkID0gQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmdsb2JhbFN0YXRlKCdzdGFrZWQnKSBhcyB1aW50NjQKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglhcHBfZ2xvYmFsX2dldF9leAoKCS8vIGdsb2JhbCBzdGF0ZSB2YWx1ZSBkb2VzIG5vdCBleGlzdDogQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmdsb2JhbFN0YXRlKCdzdGFrZWQnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDIgLy8gcG9vbEFsZ29TdGFrZWQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNTMKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsU3Rha2VycyA9IHBvb2xOdW1TdGFrZXJzIGFzIHVpbnQxNgoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJZnJhbWVfZGlnIDEgLy8gcG9vbE51bVN0YWtlcnM6IHVpbnQ2NAoJaXRvYgoJZXh0cmFjdCA2IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNTQKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCA9IHBvb2xBbGdvU3Rha2VkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJZnJhbWVfZGlnIDIgLy8gcG9vbEFsZ29TdGFrZWQ6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gKmlmMzVfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTU3CgkvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yCglmcmFtZV9kaWcgLTQgLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbGVhbgoJYnogKmlmMzVfZW5kCgoJLy8gKmlmMzVfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE1OAoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsU3Rha2VycyArPSAxCglpbnQgMjQ0CglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWludCAxCgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCippZjM1X2VuZDoKCS8vICppZjM2X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE2MAoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sCglmcmFtZV9kaWcgLTUgLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sZWFuCglieiAqaWYzNl9lbmQKCgkvLyAqaWYzNl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTYxCgkvLyB0aGlzLm51bVN0YWtlcnMudmFsdWUgKz0gMQoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJYXBwX2dsb2JhbF9nZXQKCWludCAxCgkrCglieXRlIDB4NmU3NTZkNTM3NDYxNmI2NTcyNzMgLy8gIm51bVN0YWtlcnMiCglzd2FwCglhcHBfZ2xvYmFsX3B1dAoKKmlmMzZfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE2MwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsQWxnb1N0YWtlZCArPSBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWludCAyNTIKCWR1cAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4bgoJZ3R4bnMgQW1vdW50CglmcmFtZV9kaWcgLTMgLy8gbWJyQW10UGFpZDogdWludDY0CgktCgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTY0CgkvLyB0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSArPSBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCWFwcF9nbG9iYWxfZ2V0CglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBBbW91bnQKCWZyYW1lX2RpZyAtMyAvLyBtYnJBbXRQYWlkOiB1aW50NjQKCS0KCSsKCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCXN3YXAKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIHVwZGF0ZVN0YWtlclBvb2xTZXQoc3Rha2VyOiBBZGRyZXNzLCBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5KTogdm9pZAp1cGRhdGVTdGFrZXJQb29sU2V0OgoJcHJvdG8gMiAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjgKCS8vIGFzc2VydCh0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS5leGlzdHMpCglieXRlIDB4NzM3MDczIC8vICJzcHMiCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE3MAoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDAgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNzEKCS8vIGZpcnN0RW1wdHkgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNzIKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoKKmZvcl83OgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE3MgoJLy8gaSA8IHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlLmxlbmd0aAoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl83X2VuZAoKCS8vICppZjM3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE3MwoJLy8gcG9vbFNldFtpXSA9PT0gcG9vbEtleQoJZnJhbWVfZGlnIDAgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDI0CglleHRyYWN0MwoJZnJhbWVfZGlnIC0yIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCT09CglieiAqaWYzN19lbmQKCgkvLyAqaWYzN19jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTc1CgkvLyByZXR1cm4KCXJldHN1YgoKKmlmMzdfZW5kOgoJLy8gKmlmMzhfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTc3CgkvLyBmaXJzdEVtcHR5ID09PSAwICYmIHBvb2xTZXRbaV0uaWQgPT09IDAKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDAKCT09CglkdXAKCWJ6ICpza2lwX2FuZDkKCWZyYW1lX2RpZyAwIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgk9PQoJJiYKCipza2lwX2FuZDk6CglieiAqaWYzOF9lbmQKCgkvLyAqaWYzOF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTc4CgkvLyBmaXJzdEVtcHR5ID0gaSArIDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMSAvLyBmaXJzdEVtcHR5OiB1aW50NjQKCippZjM4X2VuZDoKCipmb3JfN19jb250aW51ZToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNzIKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzcKCipmb3JfN19lbmQ6CgkvLyAqaWYzOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExODEKCS8vIGZpcnN0RW1wdHkgPT09IDAKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDAKCT09CglieiAqaWYzOV9lbmQKCgkvLyAqaWYzOV9jb25zZXF1ZW50CgkvLyBObyBlbXB0eSBzbG90IGF2YWlsYWJsZSBpbiB0aGUgc3Rha2VyIHBvb2wgc2V0CgllcnIKCippZjM5X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExODQKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlW2ZpcnN0RW1wdHkgLSAxXSA9IHBvb2xLZXkKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDEKCS0KCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyByZW1vdmVGcm9tU3Rha2VyUG9vbFNldChzdGFrZXI6IEFkZHJlc3MsIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkpOiBbYm9vbGVhbiwgYm9vbGVhbl0KLy8KLy8gUmVtb3ZlcyBhIHBvb2wga2V5IGZyb20gdGhlIHN0YWtlcidzIGFjdGl2ZSBwb29sIHNldCAtIGZhaWxzIGlmIG5vdCBmb3VuZCAoISkKLy8KLy8gQHBhcmFtIHtBZGRyZXNzfSBzdGFrZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgc3Rha2VyLgovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBUaGUgcG9vbCBrZXkgdGhleSBzaG91bGQgYmUgc3RvcmVkIGluCi8vCi8vIEByZXR1cm4gW2Jvb2xlYW4sIGJvb2xlYW5dIFtpcyB0aGUgc3Rha2VyIGdvbmUgZnJvbSBBTEwgcG9vbHMgb2YgdGhlIGdpdmVuIFZBTElEQVRPUiwgYW5kIGlzIHN0YWtlciBnb25lIGZyb20gQUxMIHBvb2xzXQpyZW1vdmVGcm9tU3Rha2VyUG9vbFNldDoKCXByb3RvIDIgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTk3CgkvLyBpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAwIC8vIGluU2FtZVZhbGlkYXRvclBvb2xDb3VudDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5OAoJLy8gaW5BbnlQb29sQ291bnQgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAxIC8vIGluQW55UG9vbENvdW50OiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTk5CgkvLyBmb3VuZCA9IGZhbHNlCglpbnQgMAoJZnJhbWVfYnVyeSAyIC8vIGZvdW5kOiBib29sCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwMQoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDIKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoKKmZvcl84OgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwMgoJLy8gaSA8IHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlLmxlbmd0aAoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl84X2VuZAoKCS8vICppZjQwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwMwoJLy8gcG9vbFNldFtpXS5pZCA9PT0gMAoJZnJhbWVfZGlnIDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWY0MF9lbmQKCgkvLyAqaWY0MF9jb25zZXF1ZW50CgliICpmb3JfOF9jb250aW51ZQoKKmlmNDBfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwNgoJLy8gaW5BbnlQb29sQ291bnQgKz0gMQoJZnJhbWVfZGlnIDEgLy8gaW5BbnlQb29sQ291bnQ6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMSAvLyBpbkFueVBvb2xDb3VudDogdWludDY0CgoJLy8gKmlmNDFfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjA3CgkvLyBwb29sU2V0W2ldLmlkID09PSBwb29sS2V5LmlkCglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgMAoJKwoJaW50IDgKCWV4dHJhY3QzCglidG9pCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCT09CglieiAqaWY0MV9lbmQKCgkvLyAqaWY0MV9jb25zZXF1ZW50CgkvLyAqaWY0Ml9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDgKCS8vIHBvb2xTZXRbaV0gPT09IHBvb2xLZXkKCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5Cgk9PQoJYnogKmlmNDJfZWxzZQoKCS8vICppZjQyX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDkKCS8vIGZvdW5kID0gdHJ1ZQoJaW50IDEKCWZyYW1lX2J1cnkgMiAvLyBmb3VuZDogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMTEKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlW2ldID0geyBpZDogMCwgcG9vbElkOiAwLCBwb29sQXBwSWQ6IDAgfQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJYiAqaWY0Ml9lbmQKCippZjQyX2Vsc2U6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjEzCgkvLyBpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgKz0gMQoJZnJhbWVfZGlnIDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCippZjQyX2VuZDoKCippZjQxX2VuZDoKCipmb3JfOF9jb250aW51ZToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDIKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzgKCipmb3JfOF9lbmQ6CgkvLyAqaWY0M19jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMTcKCS8vICFmb3VuZAoJZnJhbWVfZGlnIDIgLy8gZm91bmQ6IGJvb2wKCSEKCWJ6ICppZjQzX2VuZAoKCS8vICppZjQzX2NvbnNlcXVlbnQKCS8vIE5vIG1hdGNoaW5nIHNsb3QgZm91bmQgd2hlbiB0b2xkIHRvIHJlbW92ZSBhIHBvb2wgZnJvbSB0aGUgc3Rha2VycyBzZXQKCWVycgoKKmlmNDNfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIyMQoJLy8gcmV0dXJuIFtpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgPT09IDAsIGluQW55UG9vbENvdW50ID09PSAwXQoJYnl0ZSAweDAwCglpbnQgMAoJZnJhbWVfZGlnIDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCWludCAwCgk9PQoJc2V0Yml0CglpbnQgMQoJZnJhbWVfZGlnIDEgLy8gaW5BbnlQb29sQ291bnQ6IHVpbnQ2NAoJaW50IDAKCT09CglzZXRiaXQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCgkvLyBwb3AgYWxsIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHRoZSBzdGFjawoJcG9wbiA0CglyZXRzdWIKCi8vIGFkZFBvb2xUb05vZGUodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcG9vbEFwcElkOiB1aW50NjQsIG5vZGVOdW06IHVpbnQ2NCk6IHZvaWQKYWRkUG9vbFRvTm9kZToKCXByb3RvIDMgMAoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI1CgkvLyBub2RlUG9vbEFzc2lnbm1lbnRzID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5ub2RlUG9vbEFzc2lnbm1lbnRzKQoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfYnVyeSAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI2CgkvLyBtYXhQb29sc1Blck5vZGVGb3JUaGlzVmFsaWRhdG9yID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcucG9vbHNQZXJOb2RlIGFzIHVpbnQ2NAoJaW50IDIyNQoJaW50IDEKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDEgLy8gbWF4UG9vbHNQZXJOb2RlRm9yVGhpc1ZhbGlkYXRvcjogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIyOAoJLy8gYXNzZXJ0KG5vZGVOdW0gPj0gMSAmJiBub2RlTnVtIDw9IE1BWF9OT0RFUywgJ25vZGUgbnVtYmVyIG5vdCBpbiB2YWxpZCByYW5nZScpCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgMQoJPj0KCWR1cAoJYnogKnNraXBfYW5kMTAKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCA4Cgk8PQoJJiYKCipza2lwX2FuZDEwOgoJLy8gbm9kZSBudW1iZXIgbm90IGluIHZhbGlkIHJhbmdlCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjMwCgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IG1heFBvb2xzUGVyTm9kZUZvclRoaXNWYWxpZGF0b3I7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzk6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjMwCgkvLyBpIDwgbWF4UG9vbHNQZXJOb2RlRm9yVGhpc1ZhbGlkYXRvcgoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglmcmFtZV9kaWcgMSAvLyBtYXhQb29sc1Blck5vZGVGb3JUaGlzVmFsaWRhdG9yOiB1aW50NjQKCTwKCWJ6ICpmb3JfOV9lbmQKCgkvLyAqaWY0NF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMzEKCS8vIG5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbbm9kZU51bSAtIDFdLnBvb2xBcHBJZHNbaV0gPT09IDAKCWZyYW1lX2RpZyAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCWludCAwCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgMQoJLQoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWY0NF9lbmQKCgkvLyAqaWY0NF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjMzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLm5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbbm9kZU51bSAtIDFdLnBvb2xBcHBJZHNbaV0gPSBwb29sQXBwSWQKCWludCA5MDAKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCAxCgktCglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDAKCSsKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJZnJhbWVfZGlnIC0yIC8vIHBvb2xBcHBJZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMzQKCS8vIHJldHVybgoJcmV0c3ViCgoqaWY0NF9lbmQ6CgoqZm9yXzlfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjMwCgkvLyBpICs9IDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCWIgKmZvcl85CgoqZm9yXzlfZW5kOgoJLy8gbm8gYXZhaWxhYmxlIHNwYWNlIGluIHNwZWNpZmllZCBub2RlIGZvciB0aGlzIHBvb2wKCWVycgoJcmV0c3ViCgovLyBkb2VzU3Rha2VyTWVldEdhdGluZyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQpOiB2b2lkCi8vCi8vIENoZWNrcyBpZiBhIHN0YWtlciBtZWV0cyB0aGUgZ2F0aW5nIHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgYnkgdGhlIHZhbGlkYXRvci4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWx1ZVRvVmVyaWZ5IC0gVGhlIHZhbHVlIHRvIHZlcmlmeSBhZ2FpbnN0IHRoZSBnYXRpbmcgcmVxdWlyZW1lbnRzLgovLyBAcmV0dXJucyB7dm9pZH0gb3IgYXNzZXJ0cyBpZiByZXF1aXJlbWVudHMgbm90IG1ldC4KZG9lc1N0YWtlck1lZXRHYXRpbmc6Cglwcm90byAyIDAKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA4CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI0OAoJLy8gdHlwZSA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLmVudHJ5R2F0aW5nVHlwZQoJaW50IDgwCglpbnQgMQoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMCAvLyB0eXBlOiB1aW50OAoKCS8vICppZjQ1X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI0OQoJLy8gdHlwZSA9PT0gR0FUSU5HX1RZUEVfTk9ORQoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAwCgk9PQoJYnogKmlmNDVfZW5kCgoJLy8gKmlmNDVfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI1MAoJLy8gcmV0dXJuCglyZXRzdWIKCippZjQ1X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTIKCS8vIHN0YWtlciA9IHRoaXMudHhuLnNlbmRlcgoJdHhuIFNlbmRlcgoJZnJhbWVfYnVyeSAxIC8vIHN0YWtlcjogYWRkcmVzcwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTMKCS8vIGNvbmZpZyA9IGNsb25lKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnKQoJaW50IDAKCWludCAyNDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglmcmFtZV9idXJ5IDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCgkvLyAqaWY0Nl9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTcKCS8vIHR5cGUgPT09IEdBVElOR19UWVBFX0FTU0VUU19DUkVBVEVEX0JZIHx8CgkvLyAgICAgICAgICAgICB0eXBlID09PSBHQVRJTkdfVFlQRV9BU1NFVF9JRCB8fAoJLy8gICAgICAgICAgICAgdHlwZSA9PT0gR0FUSU5HX1RZUEVfQ1JFQVRFRF9CWV9ORkRfQUREUkVTU0VTCglmcmFtZV9kaWcgMCAvLyB0eXBlOiB1aW50OAoJaW50IDEKCT09CglkdXAKCWJueiAqc2tpcF9vcjQKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMgoJPT0KCXx8Cgoqc2tpcF9vcjQ6CglkdXAKCWJueiAqc2tpcF9vcjUKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMwoJPT0KCXx8Cgoqc2tpcF9vcjU6CglieiAqaWY0Nl9lbmQKCgkvLyAqaWY0Nl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjYxCgkvLyBhc3NlcnQodmFsdWVUb1ZlcmlmeSAhPT0gMCkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWludCAwCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI2MgoJLy8gYmFsUmVxdWlyZWQgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5nYXRpbmdBc3NldE1pbkJhbGFuY2UKCWludCAxNDUKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAzIC8vIGJhbFJlcXVpcmVkOiB1aW50NjQKCgkvLyAqaWY0N19jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNjMKCS8vIGJhbFJlcXVpcmVkID09PSAwCglmcmFtZV9kaWcgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0CglpbnQgMAoJPT0KCWJ6ICppZjQ3X2VuZAoKCS8vICppZjQ3X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNjQKCS8vIGJhbFJlcXVpcmVkID0gMQoJaW50IDEKCWZyYW1lX2J1cnkgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0CgoqaWY0N19lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjY2CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgc3Rha2VyLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQodmFsdWVUb1ZlcmlmeSkpID49IGJhbFJlcXVpcmVkLAoJLy8gICAgICAgICAgICAgICAgICdtdXN0IGhhdmUgcmVxdWlyZWQgbWluaW11bSBiYWxhbmNlIG9mIHZhbGlkYXRvciBkZWZpbmVkIHRva2VuIHRvIGFkZCBzdGFrZScsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgMSAvLyBzdGFrZXI6IGFkZHJlc3MKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQoJcG9wCglmcmFtZV9kaWcgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0Cgk+PQoKCS8vIG11c3QgaGF2ZSByZXF1aXJlZCBtaW5pbXVtIGJhbGFuY2Ugb2YgdmFsaWRhdG9yIGRlZmluZWQgdG9rZW4gdG8gYWRkIHN0YWtlCglhc3NlcnQKCippZjQ2X2VuZDoKCS8vICppZjQ4X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3MQoJLy8gdHlwZSA9PT0gR0FUSU5HX1RZUEVfQVNTRVRTX0NSRUFURURfQlkKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMQoJPT0KCWJ6ICppZjQ4X2VuZAoKCS8vICppZjQ4X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNzIKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICBBc3NldElELmZyb21VaW50NjQodmFsdWVUb1ZlcmlmeSkuY3JlYXRvciA9PT0gY29uZmlnLmVudHJ5R2F0aW5nQWRkcmVzcywKCS8vICAgICAgICAgICAgICAgICAnc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgY3JlYXRlZCBieSBjcmVhdG9yIHRoYXQgdGhlIHZhbGlkYXRvciBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UnLAoJLy8gICAgICAgICAgICAgKQoJZnJhbWVfZGlnIC0yIC8vIHZhbHVlVG9WZXJpZnk6IHVpbnQ2NAoJYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKCXBvcAoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgODEgMzIKCT09CgoJLy8gc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgY3JlYXRlZCBieSBjcmVhdG9yIHRoYXQgdGhlIHZhbGlkYXRvciBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UKCWFzc2VydAoKKmlmNDhfZW5kOgoJLy8gKmlmNDlfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjc3CgkvLyB0eXBlID09PSBHQVRJTkdfVFlQRV9BU1NFVF9JRAoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAyCgk9PQoJYnogKmlmNDlfZW5kCgoJLy8gKmlmNDlfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3OAoJLy8gZm91bmQgPSBmYWxzZQoJaW50IDAKCWZyYW1lX2J1cnkgNCAvLyBmb3VuZDogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNzkKCS8vIGNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0cwoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMTEzIDMyCglkdXAKCWZyYW1lX2J1cnkgNSAvLyBjb3B5IG9mIHRoZSBhcnJheSB3ZSBhcmUgaXRlcmF0aW5nIG92ZXIKCWV4dHJhY3QgMCA4CglidG9pCglmcmFtZV9idXJ5IDYgLy8gYXNzZXRJZDogdWludDY0CglpbnQgMAoJZnJhbWVfYnVyeSA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCgoqZm9yT2ZfMDoKCS8vICppZjUwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI4MAoJLy8gdmFsdWVUb1ZlcmlmeSA9PT0gYXNzZXRJZAoJZnJhbWVfZGlnIC0yIC8vIHZhbHVlVG9WZXJpZnk6IHVpbnQ2NAoJZnJhbWVfZGlnIDYgLy8gYXNzZXRJZDogdWludDY0Cgk9PQoJYnogKmlmNTBfZW5kCgoJLy8gKmlmNTBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI4MQoJLy8gZm91bmQgPSB0cnVlCglpbnQgMQoJZnJhbWVfYnVyeSA0IC8vIGZvdW5kOiBib29sCgliICpmb3JPZl8wX2VuZAoKKmlmNTBfZW5kOgoKKmZvck9mXzBfY29udGludWU6CgkvLyBpbmNyZW1lbnQgb2Zmc2V0IGFuZCBsb29wIGlmIG5vdCBvdXQgb2YgYm91bmRzCglmcmFtZV9kaWcgNyAvLyB0aGUgb2Zmc2V0IHdlIGFyZSBleHRyYWN0aW5nIHRoZSBuZXh0IGVsZW1lbnQgZnJvbQoJaW50IDgKCSsKCWR1cAoJaW50IDMyIC8vIG9mZnNldCBvZiBsYXN0IGVsZW1lbnQKCTwKCWJ6ICpmb3JPZl8wX2VuZAoJZnJhbWVfYnVyeSA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCglmcmFtZV9kaWcgNSAvLyBjb3B5IG9mIHRoZSBhcnJheSB3ZSBhcmUgaXRlcmF0aW5nIG92ZXIKCWZyYW1lX2RpZyA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCglpbnQgOAoJZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSA2IC8vIGFzc2V0SWQ6IHVpbnQ2NAoJYiAqZm9yT2ZfMAoKKmZvck9mXzBfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI4NQoJLy8gYXNzZXJ0KGZvdW5kLCAnc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgaWRlbnRpY2FsIHRvIHRoZSBhc3NldCBpZCBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UnKQoJZnJhbWVfZGlnIDQgLy8gZm91bmQ6IGJvb2wKCgkvLyBzcGVjaWZpZWQgYXNzZXQgbXVzdCBiZSBpZGVudGljYWwgdG8gdGhlIGFzc2V0IGlkIGRlZmluZWQgYXMgYSByZXF1aXJlbWVudCB0byBzdGFrZQoJYXNzZXJ0CgoqaWY0OV9lbmQ6CgkvLyAqaWY1MV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyODcKCS8vIHR5cGUgPT09IEdBVElOR19UWVBFX0NSRUFURURfQllfTkZEX0FERFJFU1NFUwoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAzCgk9PQoJYnogKmlmNTFfZW5kCgoJLy8gKmlmNTFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI5MAoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIHRoaXMuaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0KGNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0c1swXSwgQXNzZXRJRC5mcm9tVWludDY0KHZhbHVlVG9WZXJpZnkpLmNyZWF0b3IpLAoJLy8gICAgICAgICAgICAgICAgICdzcGVjaWZpZWQgYXNzZXQgbXVzdCBiZSBjcmVhdGVkIGJ5IGNyZWF0b3IgdGhhdCBpcyBvbmUgb2YgdGhlIGxpbmtlZCBhZGRyZXNzZXMgaW4gYW4gbmZkJywKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCglwb3AKCWZyYW1lX2RpZyAyIC8vIGNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCglleHRyYWN0IDExMyA4CglidG9pCgljYWxsc3ViIGlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdAoKCS8vIHNwZWNpZmllZCBhc3NldCBtdXN0IGJlIGNyZWF0ZWQgYnkgY3JlYXRvciB0aGF0IGlzIG9uZSBvZiB0aGUgbGlua2VkIGFkZHJlc3NlcyBpbiBhbiBuZmQKCWFzc2VydAoKKmlmNTFfZW5kOgoJLy8gKmlmNTJfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjk1CgkvLyB0eXBlID09PSBHQVRJTkdfVFlQRV9TRUdNRU5UX09GX05GRAoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCA0Cgk9PQoJYnogKmlmNTJfZW5kCgoJLy8gKmlmNTJfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI5NwoJLy8gdXNlck9mZmVyZWRORkRBcHBJRCA9IHZhbHVlVG9WZXJpZnkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWZyYW1lX2J1cnkgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjk4CgkvLyBhc3NlcnQodGhpcy5pc05GREFwcElEVmFsaWQodXNlck9mZmVyZWRORkRBcHBJRCksICdwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZCcpCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWNhbGxzdWIgaXNORkRBcHBJRFZhbGlkCgoJLy8gcHJvdmlkZWQgTkZEIG11c3QgYmUgdmFsaWQKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMDEKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICByYXdCeXRlcyhBcHBJRC5mcm9tVWludDY0KHVzZXJPZmZlcmVkTkZEQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzKSA9PT0KCS8vICAgICAgICAgICAgICAgICAgICAgcmF3Qnl0ZXMoc3Rha2VyKSB8fCB0aGlzLmlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdCh1c2VyT2ZmZXJlZE5GREFwcElELCBzdGFrZXIpLAoJLy8gICAgICAgICAgICAgICAgICJwcm92aWRlZCBuZmQgZm9yIGVudHJ5IGlzbid0IG93bmVkIG9yIGxpbmtlZCB0byB0aGUgc3Rha2VyIiwKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyA4IC8vIHVzZXJPZmZlcmVkTkZEQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQodXNlck9mZmVyZWRORkRBcHBJRCkuZ2xvYmFsU3RhdGUoJ2kub3duZXIuYScpCglhc3NlcnQKCWZyYW1lX2RpZyAxIC8vIHN0YWtlcjogYWRkcmVzcwoJPT0KCWR1cAoJYm56ICpza2lwX29yNgoJZnJhbWVfZGlnIDEgLy8gc3Rha2VyOiBhZGRyZXNzCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWNhbGxzdWIgaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0Cgl8fAoKKnNraXBfb3I2OgoJLy8gcHJvdmlkZWQgbmZkIGZvciBlbnRyeSBpc24ndCBvd25lZCBvciBsaW5rZWQgdG8gdGhlIHN0YWtlcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMwOAoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIGJ0b2koQXBwSUQuZnJvbVVpbnQ2NCh1c2VyT2ZmZXJlZE5GREFwcElEKS5nbG9iYWxTdGF0ZSgnaS5wYXJlbnRBcHBJRCcpIGFzIGJ5dGVzKSA9PT0KCS8vICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmVudHJ5R2F0aW5nQXNzZXRzWzBdLAoJLy8gICAgICAgICAgICAgICAgICdzcGVjaWZpZWQgbmZkIG11c3QgYmUgYSBzZWdtZW50IG9mIHRoZSBuZmQgdGhlIHZhbGlkYXRvciBzcGVjaWZpZWQgYXMgYSByZXF1aXJlbWVudCcsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWJ5dGUgMHg2OTJlNzA2MTcyNjU2ZTc0NDE3MDcwNDk0NCAvLyAiaS5wYXJlbnRBcHBJRCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHVzZXJPZmZlcmVkTkZEQXBwSUQpLmdsb2JhbFN0YXRlKCdpLnBhcmVudEFwcElEJykKCWFzc2VydAoJYnRvaQoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMTEzIDgKCWJ0b2kKCT09CgoJLy8gc3BlY2lmaWVkIG5mZCBtdXN0IGJlIGEgc2VnbWVudCBvZiB0aGUgbmZkIHRoZSB2YWxpZGF0b3Igc3BlY2lmaWVkIGFzIGEgcmVxdWlyZW1lbnQKCWFzc2VydAoKKmlmNTJfZW5kOgoJcmV0c3ViCgovLyBpc05GREFwcElEVmFsaWQobmZkQXBwSUQ6IHVpbnQ2NCk6IGJvb2xlYW4KLy8KLy8gQ2hlY2tzIGlmIHRoZSBnaXZlbiBORkQgQXBwIGlkIGlzIHZhbGlkLiAgVXNpbmcgb25seSB0aGUgQXBwIGlkIHRoZXJlJ3Mgbm8gdmFsaWRhdGlvbiBhZ2FpbnN0IHRoZSBuYW1lIChpZTogdGhhdCBuZmQgWCBpcyBuYW1lIFkpCi8vIFNvIGl0J3MgYXNzdW1lZCBmb3IgdGhlIGNhbGxlciwgdGhlIGFwcCBpZCBhbG9uZSBpcyBmaW5lLiAgVGhlIG5hbWUgaXMgZmV0Y2hlZCBmcm9tIHRoZSBzcGVjaWZpZWQgYXBwIGlkIGFuZCB0aGUgdHdvCi8vIHRvZ2V0aGVyIGFyZSB1c2VkIGZvciB2YWxpZGl0eSBjaGVjayBjYWxsIHRvIHRoZSBuZmQgcmVnaXN0cnkuCi8vCi8vIEBwYXJhbSB7dWludDY0fSBuZmRBcHBJRCAtIFRoZSBORkQgQXBwIGlkIHRvIHZlcmlmeS4KLy8KLy8gQHJldHVybnMge2Jvb2xlYW59IC0gUmV0dXJucyB0cnVlIGlmIHRoZSBORkQgQXBwIGlkIGlzIHZhbGlkLCBvdGhlcndpc2UgZmFsc2UuCmlzTkZEQXBwSURWYWxpZDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMyNwoJLy8gdXNlck9mZmVyZWRORkROYW1lID0gQXBwSUQuZnJvbVVpbnQ2NChuZmRBcHBJRCkuZ2xvYmFsU3RhdGUoJ2kubmFtZScpIGFzIHN0cmluZwoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWJ5dGUgMHg2OTJlNmU2MTZkNjUgLy8gImkubmFtZSIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KG5mZEFwcElEKS5nbG9iYWxTdGF0ZSgnaS5uYW1lJykKCWFzc2VydAoJZnJhbWVfYnVyeSAwIC8vIHVzZXJPZmZlcmVkTkZETmFtZTogc3RyaW5nCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMyOQoJLy8gcmV0dXJuIHNlbmRNZXRob2RDYWxsPFtzdHJpbmcsIHVpbnQ2NF0sIGJvb2xlYW4+KHsKCS8vICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQodGhpcy5uZmRSZWdpc3RyeUFwcElkKSwKCS8vICAgICAgICAgICAgIG5hbWU6ICdpc1ZhbGlkTmZkQXBwSWQnLAoJLy8gICAgICAgICAgICAgbWV0aG9kQXJnczogW3VzZXJPZmZlcmVkTkZETmFtZSwgbmZkQXBwSURdLAoJLy8gICAgICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAiaXNWYWxpZE5mZEFwcElkKHN0cmluZyx1aW50NjQpYm9vbCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMzMAoJLy8gYXBwbGljYXRpb25JRDogQXBwSUQuZnJvbVVpbnQ2NCh0aGlzLm5mZFJlZ2lzdHJ5QXBwSWQpCglsb2FkIDIwMCAvLyBUTVBMX25mZFJlZ2lzdHJ5QXBwSWQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMzIKCS8vIG1ldGhvZEFyZ3M6IFt1c2VyT2ZmZXJlZE5GRE5hbWUsIG5mZEFwcElEXQoJZnJhbWVfZGlnIDAgLy8gdXNlck9mZmVyZWRORkROYW1lOiBzdHJpbmcKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoJaXR4biBOdW1Mb2dzCglpbnQgMQoJLQoJaXR4bmFzIExvZ3MKCWV4dHJhY3QgNCAwCglpbnQgMAoJZ2V0Yml0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCglyZXRzdWIKCi8vIGlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdChuZmRBcHBJRDogdWludDY0LCBhZGRyVG9GaW5kOiBBZGRyZXNzKTogYm9vbGVhbgovLwovLyBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBhZGRyZXNzIGlzIHByZXNlbnQgaW4gYW4gTkZEcyBsaXN0IG9mIHZlcmlmaWVkIGFkZHJlc3Nlcy4KLy8gVGhlIE5GRCBpcyBhc3N1bWVkIHRvIGhhdmUgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcyBvZmZpY2lhbC4KLy8KLy8gQHBhcmFtIHt1aW50NjR9IG5mZEFwcElEIC0gVGhlIE5GRCBhcHBsaWNhdGlvbiBpZC4KLy8gQHBhcmFtIHtBZGRyZXNzfSBhZGRyVG9GaW5kIC0gVGhlIGFkZHJlc3MgdG8gZmluZCBpbiB0aGUgdi5jYUFsZ28uMC5hcyBwcm9wZXJ0eQovLyBAcmV0dXJuIHtib29sZWFufSAtIGB0cnVlYCBpZiB0aGUgYWRkcmVzcyBpcyBwcmVzZW50LCBgZmFsc2VgIG90aGVyd2lzZS4KaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0OgoJcHJvdG8gMiAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDUKCS8vIHNlbmRBcHBDYWxsKHsKCS8vICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLAoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25BcmdzOiBbJ3JlYWRfcHJvcGVydHknLCAndi5jYUFsZ28uMC5hcyddLAoJLy8gICAgICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzQ2CgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KG5mZEFwcElEKQoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDcKCS8vIGFwcGxpY2F0aW9uQXJnczogWydyZWFkX3Byb3BlcnR5JywgJ3YuY2FBbGdvLjAuYXMnXQoJYnl0ZSAweDcyNjU2MTY0NWY3MDcyNmY3MDY1NzI3NDc5IC8vICJyZWFkX3Byb3BlcnR5IgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWJ5dGUgMHg3NjJlNjM2MTQxNmM2NzZmMmUzMDJlNjE3MyAvLyAidi5jYUFsZ28uMC5hcyIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDkKCS8vIGNhQWxnb0RhdGEgPSB0aGlzLml0eG4ubGFzdExvZwoJaXR4biBMYXN0TG9nCglmcmFtZV9idXJ5IDAgLy8gY2FBbGdvRGF0YTogYnl0ZVtdCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM1MAoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBjYUFsZ29EYXRhLmxlbmd0aDsgaSArPSAzMikKCWludCAwCglmcmFtZV9idXJ5IDEgLy8gaTogdWludDY0CgoqZm9yXzEwOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM1MAoJLy8gaSA8IGNhQWxnb0RhdGEubGVuZ3RoCglmcmFtZV9kaWcgMSAvLyBpOiB1aW50NjQKCWZyYW1lX2RpZyAwIC8vIGNhQWxnb0RhdGE6IGJ5dGVbXQoJbGVuCgk8CglieiAqZm9yXzEwX2VuZAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNTEKCS8vIGFkZHIgPSBleHRyYWN0MyhjYUFsZ29EYXRhLCBpLCAzMikKCWZyYW1lX2RpZyAwIC8vIGNhQWxnb0RhdGE6IGJ5dGVbXQoJZnJhbWVfZGlnIDEgLy8gaTogdWludDY0CglpbnQgMzIKCWV4dHJhY3QzCglmcmFtZV9idXJ5IDIgLy8gYWRkcjogYnl0ZVtdCgoJLy8gKmlmNTNfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzUyCgkvLyBhZGRyICE9PSByYXdCeXRlcyhnbG9iYWxzLnplcm9BZGRyZXNzKSAmJiBhZGRyID09PSByYXdCeXRlcyhhZGRyVG9GaW5kKQoJZnJhbWVfZGlnIDIgLy8gYWRkcjogYnl0ZVtdCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CglkdXAKCWJ6ICpza2lwX2FuZDExCglmcmFtZV9kaWcgMiAvLyBhZGRyOiBieXRlW10KCWZyYW1lX2RpZyAtMiAvLyBhZGRyVG9GaW5kOiBBZGRyZXNzCgk9PQoJJiYKCipza2lwX2FuZDExOgoJYnogKmlmNTNfZW5kCgoJLy8gKmlmNTNfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM1MwoJLy8gcmV0dXJuIHRydWUKCWludCAxCgliICppc0FkZHJlc3NJbk5GRENBQWxnb0xpc3QqcmV0dXJuCgoqaWY1M19lbmQ6CgoqZm9yXzEwX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM1MAoJLy8gaSArPSAzMgoJZnJhbWVfZGlnIDEgLy8gaTogdWludDY0CglpbnQgMzIKCSsKCWZyYW1lX2J1cnkgMSAvLyBpOiB1aW50NjQKCWIgKmZvcl8xMAoKKmZvcl8xMF9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzU2CgkvLyByZXR1cm4gZmFsc2UKCWludCAwCgoqaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0KnJldHVybjoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDIKCXJldHN1YgoKLy8gYWxnb1NhdHVyYXRpb25MZXZlbCgpOiB1aW50NjQKLy8KLy8gUmV0dXJucyB0aGUgbWF4aW11bSBhbGxvd2VkIHN0YWtlIHBlciB2YWxpZGF0b3IgYmFzZWQgb24gYSBwZXJjZW50YWdlIG9mIGFsbCBjdXJyZW50IG9ubGluZSBzdGFrZSBiZWZvcmUKLy8gdGhlIHZhbGlkYXRvciBpcyBjb25zaWRlcmVkIHNhdHVyYXRlZCAtIHdoZXJlIHJld2FyZHMgYXJlIGRpbWluaXNoZWQuCi8vIE5PVEU6IHRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCB0d2ljZSAtIGhlcmUgYW5kIGluIHN0YWtpbmcgcG9vbCBjb250cmFjdC4gIEJvdGggbXVzdCBiZSBpZGVudGljYWwuCmFsZ29TYXR1cmF0aW9uTGV2ZWw6Cglwcm90byAwIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNjUKCS8vIG9ubGluZSA9IHRoaXMuZ2V0Q3VycmVudE9ubGluZVN0YWtlKCkKCWNhbGxzdWIgZ2V0Q3VycmVudE9ubGluZVN0YWtlCglmcmFtZV9idXJ5IDAgLy8gb25saW5lOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzY3CgkvLyByZXR1cm4gd2lkZVJhdGlvKFtvbmxpbmUsIE1BWF9WQUxJREFUT1JfU09GVF9QQ1RfT0ZfT05MSU5FXzFERUNJTUFMXSwgWzEwMDBdKQoJZnJhbWVfZGlnIDAgLy8gb25saW5lOiB1aW50NjQKCWludCAxMDAKCW11bHcKCWludCAwCglpbnQgMTAwMAoJZGl2bW9kdwoJcG9wCglwb3AKCXN3YXAKCSEKCgkvLyB3aWRlUmF0aW8gZmFpbGVkCglhc3NlcnQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gbWF4QWxsb3dlZFN0YWtlKCk6IHVpbnQ2NAovLwovLyBSZXR1cm5zIHRoZSBNQVhJTVVNIGFsbG93ZWQgc3Rha2UgcGVyIHZhbGlkYXRvciBiYXNlZCBvbiBhIHBlcmNlbnRhZ2Ugb2YgYWxsIGN1cnJlbnQgb25saW5lIHN0YWtlLgovLyBBZGRpbmcgc3Rha2UgaXMgY29tcGxldGVseSBibG9ja2VkIGF0IHRoaXMgYW1vdW50LgptYXhBbGxvd2VkU3Rha2U6Cglwcm90byAwIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNzUKCS8vIG9ubGluZSA9IHRoaXMuZ2V0Q3VycmVudE9ubGluZVN0YWtlKCkKCWNhbGxzdWIgZ2V0Q3VycmVudE9ubGluZVN0YWtlCglmcmFtZV9idXJ5IDAgLy8gb25saW5lOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzc3CgkvLyByZXR1cm4gd2lkZVJhdGlvKFtvbmxpbmUsIE1BWF9WQUxJREFUT1JfSEFSRF9QQ1RfT0ZfT05MSU5FXzFERUNJTUFMXSwgWzEwMDBdKQoJZnJhbWVfZGlnIDAgLy8gb25saW5lOiB1aW50NjQKCWludCAxNTAKCW11bHcKCWludCAwCglpbnQgMTAwMAoJZGl2bW9kdwoJcG9wCglwb3AKCXN3YXAKCSEKCgkvLyB3aWRlUmF0aW8gZmFpbGVkCglhc3NlcnQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gbWF4QWxnb0FsbG93ZWRQZXJQb29sKCk6IHVpbnQ2NAovLwovLyBSZXR1cm5zIHRoZSBNQVhJTVVNIGFsbG93ZWQgc3Rha2UgcGVyIHBvb2wgYW5kIHN0aWxsIHJlY2VpdmUgaW5jZW50aXZlcyAtIHdlJ2xsIHRyZWF0IHRoaXMgYXMgdGhlICdtYXggcGVyIHBvb2wnCm1heEFsZ29BbGxvd2VkUGVyUG9vbDoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzODQKCS8vIHJldHVybiBnbG9iYWxzLnBheW91dHNNYXhCYWxhbmNlCglnbG9iYWwgUGF5b3V0c01heEJhbGFuY2UKCXJldHN1YgoKLy8gZ2V0Q3VycmVudE9ubGluZVN0YWtlKCk6IHVpbnQ2NApnZXRDdXJyZW50T25saW5lU3Rha2U6Cglwcm90byAwIDEKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzg4CgkvLyByZXR1cm4gb25saW5lU3Rha2UoKQoJb25saW5lX3N0YWtlCglyZXRzdWIKCi8vIG1pbkJhbGFuY2VGb3JBY2NvdW50KGNvbnRyYWN0czogdWludDY0LCBleHRyYVBhZ2VzOiB1aW50NjQsIGFzc2V0czogdWludDY0LCBsb2NhbEludHM6IHVpbnQ2NCwgbG9jYWxCeXRlczogdWludDY0LCBnbG9iYWxJbnRzOiB1aW50NjQsIGdsb2JhbEJ5dGVzOiB1aW50NjQpOiB1aW50NjQKbWluQmFsYW5jZUZvckFjY291bnQ6Cglwcm90byA3IDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDAKCS8vIG1pbkJhbCA9IEFMR09SQU5EX0FDQ09VTlRfTUlOX0JBTEFOQ0UKCWludCAxMDAwMDAKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDEKCS8vIG1pbkJhbCArPSBjb250cmFjdHMgKiBBUFBMSUNBVElPTl9CQVNFX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyBjb250cmFjdHM6IHVpbnQ2NAoJaW50IDEwMDAwMAoJKgoJKwoJZnJhbWVfYnVyeSAwIC8vIG1pbkJhbDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTQwMgoJLy8gbWluQmFsICs9IGV4dHJhUGFnZXMgKiBBUFBMSUNBVElPTl9CQVNFX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyBleHRyYVBhZ2VzOiB1aW50NjQKCWludCAxMDAwMDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDMKCS8vIG1pbkJhbCArPSBhc3NldHMgKiBBU1NFVF9IT0xESU5HX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMyAvLyBhc3NldHM6IHVpbnQ2NAoJaW50IDEwMDAwMAoJKgoJKwoJZnJhbWVfYnVyeSAwIC8vIG1pbkJhbDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTQwNAoJLy8gbWluQmFsICs9IGxvY2FsSW50cyAqIFNTQ19WQUxVRV9VSU5UCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoJZnJhbWVfZGlnIC00IC8vIGxvY2FsSW50czogdWludDY0CglpbnQgMjg1MDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDUKCS8vIG1pbkJhbCArPSBnbG9iYWxJbnRzICogU1NDX1ZBTFVFX1VJTlQKCWZyYW1lX2RpZyAwIC8vIG1pbkJhbDogdWludDY0CglmcmFtZV9kaWcgLTYgLy8gZ2xvYmFsSW50czogdWludDY0CglpbnQgMjg1MDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDYKCS8vIG1pbkJhbCArPSBsb2NhbEJ5dGVzICogU1NDX1ZBTFVFX0JZVEVTCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoJZnJhbWVfZGlnIC01IC8vIGxvY2FsQnl0ZXM6IHVpbnQ2NAoJaW50IDUwMDAwCgkqCgkrCglmcmFtZV9idXJ5IDAgLy8gbWluQmFsOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDA3CgkvLyBtaW5CYWwgKz0gZ2xvYmFsQnl0ZXMgKiBTU0NfVkFMVUVfQllURVMKCWZyYW1lX2RpZyAwIC8vIG1pbkJhbDogdWludDY0CglmcmFtZV9kaWcgLTcgLy8gZ2xvYmFsQnl0ZXM6IHVpbnQ2NAoJaW50IDUwMDAwCgkqCgkrCglmcmFtZV9idXJ5IDAgLy8gbWluQmFsOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDA4CgkvLyByZXR1cm4gbWluQmFsCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoJcmV0c3ViCgovLyBjb3N0Rm9yQm94U3RvcmFnZSh0b3RhbE51bUJ5dGVzOiB1aW50NjQpOiB1aW50NjQKY29zdEZvckJveFN0b3JhZ2U6Cglwcm90byAxIDEKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDE1CgkvLyByZXR1cm4gU0NCT1hfUEVSQk9YICsgdG90YWxOdW1CeXRlcyAqIFNDQk9YX1BFUkJZVEUKCWludCAyNTAwCglmcmFtZV9kaWcgLTEgLy8gdG90YWxOdW1CeXRlczogdWludDY0CglpbnQgNDAwCgkqCgkrCglyZXRzdWIKCipjcmVhdGVfTm9PcDoKCW1ldGhvZCAiY3JlYXRlQXBwbGljYXRpb24oKXZvaWQiCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAwCgltYXRjaCAqYWJpX3JvdXRlX2NyZWF0ZUFwcGxpY2F0aW9uCgoJLy8gdGhpcyBjb250cmFjdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGdpdmVuIEFCSSBtZXRob2QgZm9yIGNyZWF0ZSBOb09wCgllcnIKCipjYWxsX05vT3A6CgltZXRob2QgImluaXRTdGFraW5nQ29udHJhY3QodWludDY0KXZvaWQiCgltZXRob2QgImxvYWRTdGFraW5nQ29udHJhY3REYXRhKHVpbnQ2NCxieXRlW10pdm9pZCIKCW1ldGhvZCAiZmluYWxpemVTdGFraW5nQ29udHJhY3QoKXZvaWQiCgltZXRob2QgImdhcygpdm9pZCIKCW1ldGhvZCAiZ2V0TWJyQW1vdW50cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCgltZXRob2QgImdldFByb3RvY29sQ29uc3RyYWludHMoKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiZ2V0TnVtVmFsaWRhdG9ycygpdWludDY0IgoJbWV0aG9kICJnZXRWYWxpZGF0b3JDb25maWcodWludDY0KSh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiZ2V0VmFsaWRhdG9yU3RhdGUodWludDY0KSh1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQpIgoJbWV0aG9kICJnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpIgoJbWV0aG9kICJnZXRQb29scyh1aW50NjQpKHVpbnQ2NCx1aW50MTYsdWludDY0KVtdIgoJbWV0aG9kICJnZXRQb29sQXBwSWQodWludDY0LHVpbnQ2NCl1aW50NjQiCgltZXRob2QgImdldFBvb2xJbmZvKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpKHVpbnQ2NCx1aW50MTYsdWludDY0KSIKCW1ldGhvZCAiZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHVpbnQ2NCl1aW50NjQiCgltZXRob2QgImRvZXNTdGFrZXJOZWVkVG9QYXlNQlIoYWRkcmVzcylib29sIgoJbWV0aG9kICJnZXRTdGFrZWRQb29sc0ZvckFjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCx1aW50NjQpW10iCgltZXRob2QgImdldFRva2VuUGF5b3V0UmF0aW8odWludDY0KSh1aW50NjRbMjRdLHVpbnQ2NCkiCgltZXRob2QgImdldE5vZGVQb29sQXNzaWdubWVudHModWludDY0KSgodWludDY0WzNdKVs4XSkiCgltZXRob2QgImdldE5GRFJlZ2lzdHJ5SUQoKXVpbnQ2NCIKCW1ldGhvZCAiYWRkVmFsaWRhdG9yKHBheSxzdHJpbmcsKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIKCW1ldGhvZCAiY2hhbmdlVmFsaWRhdG9yTWFuYWdlcih1aW50NjQsYWRkcmVzcyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQiCgltZXRob2QgImNoYW5nZVZhbGlkYXRvck5GRCh1aW50NjQsdWludDY0LHN0cmluZyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyh1aW50NjQsYWRkcmVzcyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JSZXdhcmRJbmZvKHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0KXZvaWQiCgltZXRob2QgImFkZFBvb2wocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAic2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KSIKCW1ldGhvZCAic3Rha2VVcGRhdGVkVmlhUmV3YXJkcygodWludDY0LHVpbnQ2NCx1aW50NjQpLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIgoJbWV0aG9kICJzdGFrZVJlbW92ZWQoKHVpbnQ2NCx1aW50NjQsdWludDY0KSxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCl2b2lkIgoJbWV0aG9kICJmaW5kUG9vbEZvclN0YWtlcih1aW50NjQsYWRkcmVzcyx1aW50NjQpKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKSIKCW1ldGhvZCAibW92ZVBvb2xUb05vZGUodWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIKCW1ldGhvZCAiZW1wdHlUb2tlblJld2FyZHModWludDY0LGFkZHJlc3MpdWludDY0IgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggKmFiaV9yb3V0ZV9pbml0U3Rha2luZ0NvbnRyYWN0ICphYmlfcm91dGVfbG9hZFN0YWtpbmdDb250cmFjdERhdGEgKmFiaV9yb3V0ZV9maW5hbGl6ZVN0YWtpbmdDb250cmFjdCAqYWJpX3JvdXRlX2dhcyAqYWJpX3JvdXRlX2dldE1ickFtb3VudHMgKmFiaV9yb3V0ZV9nZXRQcm90b2NvbENvbnN0cmFpbnRzICphYmlfcm91dGVfZ2V0TnVtVmFsaWRhdG9ycyAqYWJpX3JvdXRlX2dldFZhbGlkYXRvckNvbmZpZyAqYWJpX3JvdXRlX2dldFZhbGlkYXRvclN0YXRlICphYmlfcm91dGVfZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyICphYmlfcm91dGVfZ2V0UG9vbHMgKmFiaV9yb3V0ZV9nZXRQb29sQXBwSWQgKmFiaV9yb3V0ZV9nZXRQb29sSW5mbyAqYWJpX3JvdXRlX2dldEN1ck1heFN0YWtlUGVyUG9vbCAqYWJpX3JvdXRlX2RvZXNTdGFrZXJOZWVkVG9QYXlNQlIgKmFiaV9yb3V0ZV9nZXRTdGFrZWRQb29sc0ZvckFjY291bnQgKmFiaV9yb3V0ZV9nZXRUb2tlblBheW91dFJhdGlvICphYmlfcm91dGVfZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cyAqYWJpX3JvdXRlX2dldE5GRFJlZ2lzdHJ5SUQgKmFiaV9yb3V0ZV9hZGRWYWxpZGF0b3IgKmFiaV9yb3V0ZV9jaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyICphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyAqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvck5GRCAqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzICphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mbyAqYWJpX3JvdXRlX2FkZFBvb2wgKmFiaV9yb3V0ZV9hZGRTdGFrZSAqYWJpX3JvdXRlX3NldFRva2VuUGF5b3V0UmF0aW8gKmFiaV9yb3V0ZV9zdGFrZVVwZGF0ZWRWaWFSZXdhcmRzICphYmlfcm91dGVfc3Rha2VSZW1vdmVkICphYmlfcm91dGVfZmluZFBvb2xGb3JTdGFrZXIgKmFiaV9yb3V0ZV9tb3ZlUG9vbFRvTm9kZSAqYWJpX3JvdXRlX2VtcHR5VG9rZW5SZXdhcmRzCgoJLy8gdGhpcyBjb250cmFjdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGdpdmVuIEFCSSBtZXRob2QgZm9yIGNhbGwgTm9PcAoJZXJy", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEx" }, "templateVariables": { diff --git a/contracts/contracts/artifacts/ValidatorRegistry.src_map.json b/contracts/contracts/artifacts/ValidatorRegistry.src_map.json index 153b8ee9..2c6bd90b 100644 --- a/contracts/contracts/artifacts/ValidatorRegistry.src_map.json +++ b/contracts/contracts/artifacts/ValidatorRegistry.src_map.json @@ -1284,14 +1284,14 @@ }, { "teal": 289, - "source": 166, + "source": 165, "pc": [ 478 ] }, { "teal": 292, - "source": 166, + "source": 165, "pc": [ 479, 480, @@ -1300,42 +1300,42 @@ }, { "teal": 293, - "source": 166, + "source": 165, "pc": [ 482 ] }, { "teal": 294, - "source": 166, + "source": 165, "pc": [ 483 ] }, { "teal": 295, - "source": 166, + "source": 165, "pc": [ 484 ] }, { "teal": 296, - "source": 166, + "source": 165, "pc": [ 485 ] }, { "teal": 297, - "source": 166, + "source": 165, "pc": [ 486 ] }, { "teal": 303, - "source": 166, + "source": 165, "pc": [ 487, 488, @@ -1359,14 +1359,14 @@ }, { "teal": 309, - "source": 166, + "source": 165, "pc": [ 493 ] }, { "teal": 314, - "source": 171, + "source": 170, "pc": [ 494 ] @@ -1389,7 +1389,7 @@ }, { "teal": 321, - "source": 171, + "source": 170, "pc": [ 499, 500, @@ -1398,35 +1398,35 @@ }, { "teal": 322, - "source": 171, + "source": 170, "pc": [ 502 ] }, { "teal": 323, - "source": 171, + "source": 170, "pc": [ 503 ] }, { "teal": 324, - "source": 171, + "source": 170, "pc": [ 504 ] }, { "teal": 325, - "source": 171, + "source": 170, "pc": [ 505 ] }, { "teal": 329, - "source": 171, + "source": 170, "pc": [ 506, 507, @@ -1494,14 +1494,14 @@ }, { "teal": 341, - "source": 171, + "source": 170, "pc": [ 520 ] }, { "teal": 346, - "source": 176, + "source": 175, "pc": [ 521 ] @@ -1524,7 +1524,7 @@ }, { "teal": 353, - "source": 176, + "source": 175, "pc": [ 526, 527, @@ -1533,35 +1533,35 @@ }, { "teal": 354, - "source": 176, + "source": 175, "pc": [ 529 ] }, { "teal": 355, - "source": 176, + "source": 175, "pc": [ 530 ] }, { "teal": 356, - "source": 176, + "source": 175, "pc": [ 531 ] }, { "teal": 357, - "source": 176, + "source": 175, "pc": [ 532 ] }, { "teal": 361, - "source": 176, + "source": 175, "pc": [ 533, 534, @@ -1630,14 +1630,14 @@ }, { "teal": 373, - "source": 176, + "source": 175, "pc": [ 548 ] }, { "teal": 378, - "source": 181, + "source": 180, "pc": [ 549 ] @@ -1660,7 +1660,7 @@ }, { "teal": 385, - "source": 181, + "source": 180, "pc": [ 554, 555, @@ -1669,35 +1669,35 @@ }, { "teal": 386, - "source": 181, + "source": 180, "pc": [ 557 ] }, { "teal": 387, - "source": 181, + "source": 180, "pc": [ 558 ] }, { "teal": 388, - "source": 181, + "source": 180, "pc": [ 559 ] }, { "teal": 389, - "source": 181, + "source": 180, "pc": [ 560 ] }, { "teal": 393, - "source": 181, + "source": 180, "pc": [ 561, 562, @@ -1832,14 +1832,14 @@ }, { "teal": 417, - "source": 181, + "source": 180, "pc": [ 588 ] }, { "teal": 422, - "source": 195, + "source": 194, "pc": [ 589 ] @@ -1862,7 +1862,7 @@ }, { "teal": 429, - "source": 195, + "source": 194, "pc": [ 594, 595, @@ -1871,21 +1871,21 @@ }, { "teal": 430, - "source": 195, + "source": 194, "pc": [ 597 ] }, { "teal": 431, - "source": 195, + "source": 194, "pc": [ 598 ] }, { "teal": 432, - "source": 195, + "source": 194, "pc": [ 599, 600 @@ -1893,21 +1893,21 @@ }, { "teal": 433, - "source": 195, + "source": 194, "pc": [ 601 ] }, { "teal": 434, - "source": 195, + "source": 194, "pc": [ 602 ] }, { "teal": 435, - "source": 195, + "source": 194, "pc": [ 603, 604, @@ -1916,49 +1916,49 @@ }, { "teal": 436, - "source": 195, + "source": 194, "pc": [ 606 ] }, { "teal": 437, - "source": 195, + "source": 194, "pc": [ 607 ] }, { "teal": 438, - "source": 195, + "source": 194, "pc": [ 608 ] }, { "teal": 439, - "source": 195, + "source": 194, "pc": [ 609 ] }, { "teal": 440, - "source": 195, + "source": 194, "pc": [ 610 ] }, { "teal": 441, - "source": 195, + "source": 194, "pc": [ 611 ] }, { "teal": 450, - "source": 195, + "source": 194, "pc": [ 612, 613, @@ -1967,14 +1967,14 @@ }, { "teal": 453, - "source": 195, + "source": 194, "pc": [ 615 ] }, { "teal": 454, - "source": 195, + "source": 194, "pc": [ 616, 617 @@ -2325,7 +2325,7 @@ }, { "teal": 533, - "source": 195, + "source": 194, "pc": [ 691, 692 @@ -2333,7 +2333,7 @@ }, { "teal": 536, - "source": 195, + "source": 194, "pc": [ 693, 694 @@ -2341,21 +2341,21 @@ }, { "teal": 537, - "source": 195, + "source": 194, "pc": [ 695 ] }, { "teal": 542, - "source": 212, + "source": 213, "pc": [ 696 ] }, { "teal": 545, - "source": 212, + "source": 214, "pc": [ 697, 698, @@ -2364,14 +2364,14 @@ }, { "teal": 546, - "source": 212, + "source": 214, "pc": [ 700 ] }, { "teal": 549, - "source": 212, + "source": 214, "pc": [ 701, 702, @@ -2380,14 +2380,14 @@ }, { "teal": 550, - "source": 212, + "source": 214, "pc": [ 704 ] }, { "teal": 553, - "source": 212, + "source": 213, "pc": [ 705, 706, @@ -2396,42 +2396,42 @@ }, { "teal": 554, - "source": 212, + "source": 213, "pc": [ 708 ] }, { "teal": 555, - "source": 212, + "source": 213, "pc": [ 709 ] }, { "teal": 556, - "source": 212, + "source": 213, "pc": [ 710 ] }, { "teal": 557, - "source": 212, + "source": 213, "pc": [ 711 ] }, { "teal": 558, - "source": 212, + "source": 213, "pc": [ 712 ] }, { - "teal": 562, - "source": 212, + "teal": 566, + "source": 213, "pc": [ 713, 714, @@ -2439,37 +2439,37 @@ ] }, { - "teal": 569, - "source": 214, + "teal": 573, + "source": 216, "pc": [ 716, 717 ] }, { - "teal": 570, - "source": 214, + "teal": 574, + "source": 216, "pc": [ 718 ] }, { - "teal": 571, - "source": 214, + "teal": 575, + "source": 216, "pc": [ 719 ] }, { - "teal": 572, - "source": 214, + "teal": 576, + "source": 216, "pc": [ 720 ] }, { - "teal": 573, - "source": 214, + "teal": 577, + "source": 216, "pc": [ 721, 722, @@ -2477,183 +2477,183 @@ ] }, { - "teal": 574, - "source": 214, + "teal": 578, + "source": 216, "pc": [ 724, 725 ] }, { - "teal": 575, - "source": 214, + "teal": 579, + "source": 216, "pc": [ 726 ] }, { - "teal": 576, - "source": 214, + "teal": 580, + "source": 216, "pc": [ 727 ] }, { - "teal": 577, - "source": 214, + "teal": 581, + "source": 216, "pc": [ 728 ] }, { - "teal": 581, - "source": 213, + "teal": 585, + "source": 215, "errorMessage": "pool id must be between 1 and number of pools for this validator", "pc": [ 729 ] }, { - "teal": 585, - "source": 217, + "teal": 589, + "source": 219, "pc": [ 730, 731 ] }, { - "teal": 586, - "source": 217, + "teal": 590, + "source": 219, "pc": [ 732, 733 ] }, { - "teal": 587, - "source": 217, + "teal": 591, + "source": 219, "pc": [ 734 ] }, { - "teal": 588, - "source": 217, + "teal": 592, + "source": 219, "pc": [ 735 ] }, { - "teal": 589, - "source": 217, + "teal": 593, + "source": 219, "pc": [ 736, 737 ] }, { - "teal": 590, - "source": 217, + "teal": 594, + "source": 219, "pc": [ 738 ] }, { - "teal": 591, - "source": 217, + "teal": 595, + "source": 219, "pc": [ 739 ] }, { - "teal": 592, - "source": 217, + "teal": 596, + "source": 219, "pc": [ 740 ] }, { - "teal": 593, - "source": 217, + "teal": 597, + "source": 219, "pc": [ 741 ] }, { - "teal": 594, - "source": 217, + "teal": 598, + "source": 219, "pc": [ 742 ] }, { - "teal": 595, - "source": 217, + "teal": 599, + "source": 219, "pc": [ 743 ] }, { - "teal": 596, - "source": 217, + "teal": 600, + "source": 219, "pc": [ 744, 745 ] }, { - "teal": 597, - "source": 217, + "teal": 601, + "source": 219, "pc": [ 746 ] }, { - "teal": 598, - "source": 217, + "teal": 602, + "source": 219, "pc": [ 747 ] }, { - "teal": 599, - "source": 217, + "teal": 603, + "source": 219, "pc": [ 748, 749 ] }, { - "teal": 600, - "source": 217, + "teal": 604, + "source": 219, "pc": [ 750 ] }, { - "teal": 601, - "source": 217, + "teal": 605, + "source": 219, "pc": [ 751 ] }, { - "teal": 602, - "source": 212, + "teal": 606, + "source": 213, "pc": [ 752 ] }, { - "teal": 607, - "source": 221, + "teal": 611, + "source": 222, "pc": [ 753 ] }, { - "teal": 610, - "source": 221, + "teal": 614, + "source": 223, "pc": [ 754, 755, @@ -2661,44 +2661,44 @@ ] }, { - "teal": 611, - "source": 221, + "teal": 615, + "source": 223, "pc": [ 757 ] }, { - "teal": 612, - "source": 221, + "teal": 616, + "source": 223, "pc": [ 758 ] }, { - "teal": 613, - "source": 221, + "teal": 617, + "source": 223, "pc": [ 759 ] }, { - "teal": 614, - "source": 221, + "teal": 618, + "source": 223, "pc": [ 760 ] }, { - "teal": 617, - "source": 221, + "teal": 621, + "source": 223, "errorMessage": "argument 0 (poolKey) for getPoolInfo must be a (uint64,uint64,uint64)", "pc": [ 761 ] }, { - "teal": 620, - "source": 221, + "teal": 624, + "source": 222, "pc": [ 762, 763, @@ -2706,36 +2706,36 @@ ] }, { - "teal": 621, - "source": 221, + "teal": 625, + "source": 222, "pc": [ 765 ] }, { - "teal": 622, - "source": 221, + "teal": 626, + "source": 222, "pc": [ 766 ] }, { - "teal": 623, - "source": 221, + "teal": 627, + "source": 222, "pc": [ 767 ] }, { - "teal": 624, - "source": 221, + "teal": 628, + "source": 222, "pc": [ 768 ] }, { - "teal": 628, - "source": 221, + "teal": 632, + "source": 222, "pc": [ 769, 770, @@ -2743,24 +2743,24 @@ ] }, { - "teal": 632, - "source": 222, + "teal": 636, + "source": 224, "pc": [ 772, 773 ] }, { - "teal": 633, - "source": 222, + "teal": 637, + "source": 224, "pc": [ 774, 775 ] }, { - "teal": 634, - "source": 222, + "teal": 638, + "source": 224, "pc": [ 776, 777, @@ -2768,74 +2768,74 @@ ] }, { - "teal": 635, - "source": 222, + "teal": 639, + "source": 224, "pc": [ 779 ] }, { - "teal": 636, - "source": 222, + "teal": 640, + "source": 224, "pc": [ 780 ] }, { - "teal": 637, - "source": 222, + "teal": 641, + "source": 224, "pc": [ 781 ] }, { - "teal": 638, - "source": 222, + "teal": 642, + "source": 224, "pc": [ 782, 783 ] }, { - "teal": 639, - "source": 222, + "teal": 643, + "source": 224, "pc": [ 784 ] }, { - "teal": 640, - "source": 222, + "teal": 644, + "source": 224, "pc": [ 785 ] }, { - "teal": 641, - "source": 222, + "teal": 645, + "source": 224, "pc": [ 786, 787 ] }, { - "teal": 642, - "source": 222, + "teal": 646, + "source": 224, "pc": [ 788 ] }, { - "teal": 643, - "source": 222, + "teal": 647, + "source": 224, "pc": [ 789, 790 ] }, { - "teal": 644, - "source": 222, + "teal": 648, + "source": 224, "pc": [ 791, 792, @@ -2843,58 +2843,58 @@ ] }, { - "teal": 645, - "source": 222, + "teal": 649, + "source": 224, "pc": [ 794 ] }, { - "teal": 646, - "source": 222, + "teal": 650, + "source": 224, "pc": [ 795 ] }, { - "teal": 647, - "source": 222, + "teal": 651, + "source": 224, "pc": [ 796 ] }, { - "teal": 648, - "source": 222, + "teal": 652, + "source": 224, "pc": [ 797, 798 ] }, { - "teal": 649, - "source": 222, + "teal": 653, + "source": 224, "pc": [ 799 ] }, { - "teal": 650, - "source": 221, + "teal": 654, + "source": 222, "pc": [ 800 ] }, { - "teal": 655, - "source": 232, + "teal": 659, + "source": 234, "pc": [ 801 ] }, { - "teal": 658, - "source": 232, + "teal": 662, + "source": 235, "pc": [ 802, 803, @@ -2902,15 +2902,15 @@ ] }, { - "teal": 659, - "source": 232, + "teal": 663, + "source": 235, "pc": [ 805 ] }, { - "teal": 662, - "source": 232, + "teal": 666, + "source": 234, "pc": [ 806, 807, @@ -2918,43 +2918,43 @@ ] }, { - "teal": 663, - "source": 232, + "teal": 667, + "source": 234, "pc": [ 809 ] }, { - "teal": 664, - "source": 232, + "teal": 668, + "source": 234, "pc": [ 810 ] }, { - "teal": 665, - "source": 232, + "teal": 669, + "source": 234, "pc": [ 811 ] }, { - "teal": 666, - "source": 232, + "teal": 670, + "source": 234, "pc": [ 812 ] }, { - "teal": 667, - "source": 232, + "teal": 671, + "source": 234, "pc": [ 813 ] }, { - "teal": 677, - "source": 232, + "teal": 681, + "source": 234, "pc": [ 814, 815, @@ -2962,98 +2962,98 @@ ] }, { - "teal": 680, - "source": 232, + "teal": 684, + "source": 234, "pc": [ 817 ] }, { - "teal": 681, - "source": 232, + "teal": 685, + "source": 234, "pc": [ 818, 819 ] }, { - "teal": 685, - "source": 233, + "teal": 689, + "source": 236, "pc": [ 820, 821 ] }, { - "teal": 686, - "source": 233, + "teal": 690, + "source": 236, "pc": [ 822, 823 ] }, { - "teal": 687, - "source": 233, + "teal": 691, + "source": 236, "pc": [ 824 ] }, { - "teal": 688, - "source": 233, + "teal": 692, + "source": 236, "pc": [ 825, 826 ] }, { - "teal": 689, - "source": 233, + "teal": 693, + "source": 236, "pc": [ 827 ] }, { - "teal": 690, - "source": 233, + "teal": 694, + "source": 236, "pc": [ 828 ] }, { - "teal": 691, - "source": 233, + "teal": 695, + "source": 236, "pc": [ 829, 830 ] }, { - "teal": 692, - "source": 233, + "teal": 696, + "source": 236, "pc": [ 831 ] }, { - "teal": 693, - "source": 233, + "teal": 697, + "source": 236, "pc": [ 832 ] }, { - "teal": 694, - "source": 233, + "teal": 698, + "source": 236, "pc": [ 833, 834 ] }, { - "teal": 698, - "source": 234, + "teal": 702, + "source": 237, "pc": [ 835, 836, @@ -3061,31 +3061,31 @@ ] }, { - "teal": 699, - "source": 234, + "teal": 703, + "source": 237, "pc": [ 838, 839 ] }, { - "teal": 700, - "source": 234, + "teal": 704, + "source": 237, "pc": [ 840 ] }, { - "teal": 701, - "source": 234, + "teal": 705, + "source": 237, "pc": [ 841, 842 ] }, { - "teal": 705, - "source": 235, + "teal": 709, + "source": 238, "pc": [ 843, 844, @@ -3093,96 +3093,96 @@ ] }, { - "teal": 706, - "source": 235, + "teal": 710, + "source": 238, "pc": [ 846 ] }, { - "teal": 707, - "source": 235, + "teal": 711, + "source": 238, "pc": [ 847 ] }, { - "teal": 708, - "source": 235, + "teal": 712, + "source": 238, "pc": [ 848, 849 ] }, { - "teal": 709, - "source": 235, + "teal": 713, + "source": 238, "pc": [ 850 ] }, { - "teal": 710, - "source": 235, + "teal": 714, + "source": 238, "pc": [ 851 ] }, { - "teal": 711, - "source": 235, + "teal": 715, + "source": 238, "pc": [ 852, 853 ] }, { - "teal": 712, - "source": 235, + "teal": 716, + "source": 238, "pc": [ 854 ] }, { - "teal": 713, - "source": 235, + "teal": 717, + "source": 238, "pc": [ 855 ] }, { - "teal": 714, - "source": 235, + "teal": 718, + "source": 238, "pc": [ 856, 857 ] }, { - "teal": 719, - "source": 236, + "teal": 723, + "source": 239, "pc": [ 858, 859 ] }, { - "teal": 720, - "source": 236, + "teal": 724, + "source": 239, "pc": [ 860 ] }, { - "teal": 721, - "source": 236, + "teal": 725, + "source": 239, "pc": [ 861 ] }, { - "teal": 722, - "source": 236, + "teal": 726, + "source": 239, "pc": [ 862, 863, @@ -3190,8 +3190,8 @@ ] }, { - "teal": 727, - "source": 237, + "teal": 731, + "source": 240, "pc": [ 865, 866, @@ -3199,39 +3199,39 @@ ] }, { - "teal": 728, - "source": 237, + "teal": 732, + "source": 240, "pc": [ 868, 869 ] }, { - "teal": 734, - "source": 239, + "teal": 738, + "source": 242, "pc": [ 870, 871 ] }, { - "teal": 735, - "source": 239, + "teal": 739, + "source": 242, "pc": [ 872, 873 ] }, { - "teal": 736, - "source": 239, + "teal": 740, + "source": 242, "pc": [ 874 ] }, { - "teal": 737, - "source": 239, + "teal": 741, + "source": 242, "pc": [ 875, 876, @@ -3239,62 +3239,62 @@ ] }, { - "teal": 742, - "source": 240, + "teal": 746, + "source": 243, "pc": [ 878, 879 ] }, { - "teal": 743, - "source": 240, + "teal": 747, + "source": 243, "pc": [ 880, 881 ] }, { - "teal": 748, - "source": 242, + "teal": 752, + "source": 245, "pc": [ 882, 883 ] }, { - "teal": 751, - "source": 232, + "teal": 755, + "source": 234, "pc": [ 884, 885 ] }, { - "teal": 754, - "source": 232, + "teal": 758, + "source": 234, "pc": [ 886, 887 ] }, { - "teal": 755, - "source": 232, + "teal": 759, + "source": 234, "pc": [ 888 ] }, { - "teal": 760, - "source": 250, + "teal": 764, + "source": 252, "pc": [ 889 ] }, { - "teal": 763, - "source": 250, + "teal": 767, + "source": 253, "pc": [ 890, 891, @@ -3302,45 +3302,45 @@ ] }, { - "teal": 764, - "source": 250, + "teal": 768, + "source": 253, "pc": [ 893 ] }, { - "teal": 765, - "source": 250, + "teal": 769, + "source": 253, "pc": [ 894 ] }, { - "teal": 766, - "source": 250, + "teal": 770, + "source": 253, "pc": [ 895, 896 ] }, { - "teal": 767, - "source": 250, + "teal": 771, + "source": 253, "pc": [ 897 ] }, { - "teal": 770, - "source": 250, + "teal": 774, + "source": 253, "errorMessage": "argument 0 (staker) for doesStakerNeedToPayMBR must be a address", "pc": [ 898 ] }, { - "teal": 773, - "source": 250, + "teal": 777, + "source": 252, "pc": [ 899, 900, @@ -3348,66 +3348,66 @@ ] }, { - "teal": 774, - "source": 250, + "teal": 778, + "source": 252, "pc": [ 902, 903 ] }, { - "teal": 775, - "source": 250, + "teal": 779, + "source": 252, "pc": [ 904 ] }, { - "teal": 776, - "source": 250, + "teal": 780, + "source": 252, "pc": [ 905, 906 ] }, { - "teal": 777, - "source": 250, + "teal": 781, + "source": 252, "pc": [ 907 ] }, { - "teal": 778, - "source": 250, + "teal": 782, + "source": 252, "pc": [ 908 ] }, { - "teal": 779, - "source": 250, + "teal": 783, + "source": 252, "pc": [ 909 ] }, { - "teal": 780, - "source": 250, + "teal": 784, + "source": 252, "pc": [ 910 ] }, { - "teal": 781, - "source": 250, + "teal": 785, + "source": 252, "pc": [ 911 ] }, { - "teal": 788, - "source": 250, + "teal": 792, + "source": 252, "pc": [ 912, 913, @@ -3415,72 +3415,72 @@ ] }, { - "teal": 792, - "source": 251, + "teal": 796, + "source": 254, "pc": [ 915 ] }, { - "teal": 793, - "source": 251, + "teal": 797, + "source": 254, "pc": [ 916, 917 ] }, { - "teal": 794, - "source": 251, + "teal": 798, + "source": 254, "pc": [ 918 ] }, { - "teal": 795, - "source": 251, + "teal": 799, + "source": 254, "pc": [ 919 ] }, { - "teal": 796, - "source": 251, + "teal": 800, + "source": 254, "pc": [ 920 ] }, { - "teal": 797, - "source": 251, + "teal": 801, + "source": 254, "pc": [ 921 ] }, { - "teal": 798, - "source": 251, + "teal": 802, + "source": 254, "pc": [ 922 ] }, { - "teal": 799, - "source": 250, + "teal": 803, + "source": 252, "pc": [ 923 ] }, { - "teal": 804, - "source": 260, + "teal": 808, + "source": 263, "pc": [ 924 ] }, { - "teal": 807, - "source": 260, + "teal": 811, + "source": 264, "pc": [ 925, 926, @@ -3488,45 +3488,45 @@ ] }, { - "teal": 808, - "source": 260, + "teal": 812, + "source": 264, "pc": [ 928 ] }, { - "teal": 809, - "source": 260, + "teal": 813, + "source": 264, "pc": [ 929 ] }, { - "teal": 810, - "source": 260, + "teal": 814, + "source": 264, "pc": [ 930, 931 ] }, { - "teal": 811, - "source": 260, + "teal": 815, + "source": 264, "pc": [ 932 ] }, { - "teal": 814, - "source": 260, + "teal": 818, + "source": 264, "errorMessage": "argument 0 (staker) for getStakedPoolsForAccount must be a address", "pc": [ 933 ] }, { - "teal": 817, - "source": 260, + "teal": 821, + "source": 263, "pc": [ 934, 935, @@ -3534,43 +3534,43 @@ ] }, { - "teal": 818, - "source": 260, + "teal": 822, + "source": 263, "pc": [ 937 ] }, { - "teal": 819, - "source": 260, + "teal": 823, + "source": 263, "pc": [ 938 ] }, { - "teal": 820, - "source": 260, + "teal": 824, + "source": 263, "pc": [ 939 ] }, { - "teal": 821, - "source": 260, + "teal": 825, + "source": 263, "pc": [ 940 ] }, { - "teal": 822, - "source": 260, + "teal": 826, + "source": 263, "pc": [ 941 ] }, { - "teal": 823, - "source": 260, + "teal": 827, + "source": 263, "pc": [ 942, 943, @@ -3578,50 +3578,50 @@ ] }, { - "teal": 824, - "source": 260, + "teal": 828, + "source": 263, "pc": [ 945 ] }, { - "teal": 825, - "source": 260, + "teal": 829, + "source": 263, "pc": [ 946 ] }, { - "teal": 826, - "source": 260, + "teal": 830, + "source": 263, "pc": [ 947 ] }, { - "teal": 827, - "source": 260, + "teal": 831, + "source": 263, "pc": [ 948 ] }, { - "teal": 828, - "source": 260, + "teal": 832, + "source": 263, "pc": [ 949 ] }, { - "teal": 829, - "source": 260, + "teal": 833, + "source": 263, "pc": [ 950 ] }, { - "teal": 838, - "source": 260, + "teal": 842, + "source": 263, "pc": [ 951, 952, @@ -3629,73 +3629,73 @@ ] }, { - "teal": 841, - "source": 260, + "teal": 845, + "source": 263, "pc": [ 954 ] }, { - "teal": 842, - "source": 260, + "teal": 846, + "source": 263, "pc": [ 955, 956 ] }, { - "teal": 847, - "source": 261, + "teal": 851, + "source": 265, "pc": [ 957 ] }, { - "teal": 848, - "source": 261, + "teal": 852, + "source": 265, "pc": [ 958, 959 ] }, { - "teal": 849, - "source": 261, + "teal": 853, + "source": 265, "pc": [ 960 ] }, { - "teal": 850, - "source": 261, + "teal": 854, + "source": 265, "pc": [ 961 ] }, { - "teal": 851, - "source": 261, + "teal": 855, + "source": 265, "pc": [ 962 ] }, { - "teal": 852, - "source": 261, + "teal": 856, + "source": 265, "pc": [ 963 ] }, { - "teal": 853, - "source": 261, + "teal": 857, + "source": 265, "pc": [ 964 ] }, { - "teal": 854, - "source": 261, + "teal": 858, + "source": 265, "pc": [ 965, 966, @@ -3703,15 +3703,15 @@ ] }, { - "teal": 859, - "source": 262, + "teal": 863, + "source": 266, "pc": [ 968 ] }, { - "teal": 860, - "source": 262, + "teal": 864, + "source": 266, "pc": [ 969, 970, @@ -3719,106 +3719,106 @@ ] }, { - "teal": 865, - "source": 264, + "teal": 869, + "source": 268, "pc": [ 972 ] }, { - "teal": 866, - "source": 264, + "teal": 870, + "source": 268, "pc": [ 973, 974 ] }, { - "teal": 870, - "source": 265, + "teal": 874, + "source": 269, "pc": [ 975 ] }, { - "teal": 871, - "source": 265, + "teal": 875, + "source": 269, "pc": [ 976, 977 ] }, { - "teal": 872, - "source": 265, + "teal": 876, + "source": 269, "pc": [ 978 ] }, { - "teal": 873, - "source": 265, + "teal": 877, + "source": 269, "pc": [ 979 ] }, { - "teal": 876, - "source": 265, + "teal": 880, + "source": 269, "errorMessage": "box value does not exist: this.stakerPoolSet(staker).value", "pc": [ 980 ] }, { - "teal": 877, - "source": 265, + "teal": 881, + "source": 269, "pc": [ 981, 982 ] }, { - "teal": 881, - "source": 266, + "teal": 885, + "source": 270, "pc": [ 983 ] }, { - "teal": 882, - "source": 266, + "teal": 886, + "source": 270, "pc": [ 984, 985 ] }, { - "teal": 887, - "source": 266, + "teal": 891, + "source": 270, "pc": [ 986, 987 ] }, { - "teal": 888, - "source": 266, + "teal": 892, + "source": 270, "pc": [ 988, 989 ] }, { - "teal": 889, - "source": 266, + "teal": 893, + "source": 270, "pc": [ 990 ] }, { - "teal": 890, - "source": 266, + "teal": 894, + "source": 270, "pc": [ 991, 992, @@ -3826,87 +3826,87 @@ ] }, { - "teal": 895, - "source": 267, + "teal": 899, + "source": 271, "pc": [ 994, 995 ] }, { - "teal": 896, - "source": 267, + "teal": 900, + "source": 271, "pc": [ 996, 997 ] }, { - "teal": 897, - "source": 267, + "teal": 901, + "source": 271, "pc": [ 998 ] }, { - "teal": 898, - "source": 267, + "teal": 902, + "source": 271, "pc": [ 999 ] }, { - "teal": 899, - "source": 267, + "teal": 903, + "source": 271, "pc": [ 1000 ] }, { - "teal": 900, - "source": 267, + "teal": 904, + "source": 271, "pc": [ 1001 ] }, { - "teal": 901, - "source": 267, + "teal": 905, + "source": 271, "pc": [ 1002 ] }, { - "teal": 902, - "source": 267, + "teal": 906, + "source": 271, "pc": [ 1003 ] }, { - "teal": 903, - "source": 267, + "teal": 907, + "source": 271, "pc": [ 1004 ] }, { - "teal": 904, - "source": 267, + "teal": 908, + "source": 271, "pc": [ 1005 ] }, { - "teal": 905, - "source": 267, + "teal": 909, + "source": 271, "pc": [ 1006 ] }, { - "teal": 906, - "source": 267, + "teal": 910, + "source": 271, "pc": [ 1007, 1008, @@ -3914,105 +3914,105 @@ ] }, { - "teal": 911, - "source": 268, + "teal": 915, + "source": 272, "pc": [ 1010, 1011 ] }, { - "teal": 912, - "source": 268, + "teal": 916, + "source": 272, "pc": [ 1012, 1013 ] }, { - "teal": 913, - "source": 268, + "teal": 917, + "source": 272, "pc": [ 1014, 1015 ] }, { - "teal": 914, - "source": 268, + "teal": 918, + "source": 272, "pc": [ 1016 ] }, { - "teal": 915, - "source": 268, + "teal": 919, + "source": 272, "pc": [ 1017 ] }, { - "teal": 916, - "source": 268, + "teal": 920, + "source": 272, "pc": [ 1018 ] }, { - "teal": 917, - "source": 268, + "teal": 921, + "source": 272, "pc": [ 1019 ] }, { - "teal": 918, - "source": 268, + "teal": 922, + "source": 272, "pc": [ 1020 ] }, { - "teal": 919, - "source": 268, + "teal": 923, + "source": 272, "pc": [ 1021, 1022 ] }, { - "teal": 926, - "source": 266, + "teal": 930, + "source": 270, "pc": [ 1023, 1024 ] }, { - "teal": 927, - "source": 266, + "teal": 931, + "source": 270, "pc": [ 1025 ] }, { - "teal": 928, - "source": 266, + "teal": 932, + "source": 270, "pc": [ 1026 ] }, { - "teal": 929, - "source": 266, + "teal": 933, + "source": 270, "pc": [ 1027, 1028 ] }, { - "teal": 930, - "source": 266, + "teal": 934, + "source": 270, "pc": [ 1029, 1030, @@ -4020,46 +4020,46 @@ ] }, { - "teal": 935, - "source": 271, + "teal": 939, + "source": 275, "pc": [ 1032, 1033 ] }, { - "teal": 939, - "source": 260, + "teal": 943, + "source": 263, "pc": [ 1034, 1035 ] }, { - "teal": 942, - "source": 260, + "teal": 946, + "source": 263, "pc": [ 1036, 1037 ] }, { - "teal": 943, - "source": 260, + "teal": 947, + "source": 263, "pc": [ 1038 ] }, { - "teal": 948, - "source": 282, + "teal": 952, + "source": 285, "pc": [ 1039 ] }, { - "teal": 951, - "source": 282, + "teal": 955, + "source": 286, "pc": [ 1040, 1041, @@ -4067,15 +4067,15 @@ ] }, { - "teal": 952, - "source": 282, + "teal": 956, + "source": 286, "pc": [ 1043 ] }, { - "teal": 955, - "source": 282, + "teal": 959, + "source": 285, "pc": [ 1044, 1045, @@ -4083,36 +4083,36 @@ ] }, { - "teal": 956, - "source": 282, + "teal": 960, + "source": 285, "pc": [ 1047 ] }, { - "teal": 957, - "source": 282, + "teal": 961, + "source": 285, "pc": [ 1048 ] }, { - "teal": 958, - "source": 282, + "teal": 962, + "source": 285, "pc": [ 1049 ] }, { - "teal": 959, - "source": 282, + "teal": 963, + "source": 285, "pc": [ 1050 ] }, { - "teal": 969, - "source": 282, + "teal": 973, + "source": 285, "pc": [ 1051, 1052, @@ -4120,82 +4120,82 @@ ] }, { - "teal": 973, - "source": 283, + "teal": 977, + "source": 287, "pc": [ 1054, 1055 ] }, { - "teal": 974, - "source": 283, + "teal": 978, + "source": 287, "pc": [ 1056, 1057 ] }, { - "teal": 975, - "source": 283, + "teal": 979, + "source": 287, "pc": [ 1058 ] }, { - "teal": 976, - "source": 283, + "teal": 980, + "source": 287, "pc": [ 1059, 1060 ] }, { - "teal": 977, - "source": 283, + "teal": 981, + "source": 287, "pc": [ 1061 ] }, { - "teal": 978, - "source": 283, + "teal": 982, + "source": 287, "pc": [ 1062 ] }, { - "teal": 979, - "source": 283, + "teal": 983, + "source": 287, "pc": [ 1063, 1064 ] }, { - "teal": 980, - "source": 283, + "teal": 984, + "source": 287, "pc": [ 1065 ] }, { - "teal": 981, - "source": 282, + "teal": 985, + "source": 285, "pc": [ 1066 ] }, { - "teal": 986, - "source": 287, + "teal": 990, + "source": 290, "pc": [ 1067 ] }, { - "teal": 989, - "source": 287, + "teal": 993, + "source": 291, "pc": [ 1068, 1069, @@ -4203,15 +4203,15 @@ ] }, { - "teal": 990, - "source": 287, + "teal": 994, + "source": 291, "pc": [ 1071 ] }, { - "teal": 993, - "source": 287, + "teal": 997, + "source": 290, "pc": [ 1072, 1073, @@ -4219,36 +4219,36 @@ ] }, { - "teal": 994, - "source": 287, + "teal": 998, + "source": 290, "pc": [ 1075 ] }, { - "teal": 995, - "source": 287, + "teal": 999, + "source": 290, "pc": [ 1076 ] }, { - "teal": 996, - "source": 287, + "teal": 1000, + "source": 290, "pc": [ 1077 ] }, { - "teal": 997, - "source": 287, + "teal": 1001, + "source": 290, "pc": [ 1078 ] }, { - "teal": 1001, - "source": 287, + "teal": 1005, + "source": 290, "pc": [ 1079, 1080, @@ -4256,140 +4256,140 @@ ] }, { - "teal": 1005, - "source": 288, + "teal": 1009, + "source": 292, "pc": [ 1082 ] }, { - "teal": 1006, - "source": 288, + "teal": 1010, + "source": 292, "pc": [ 1083, 1084 ] }, { - "teal": 1007, - "source": 288, + "teal": 1011, + "source": 292, "pc": [ 1085 ] }, { - "teal": 1008, - "source": 288, + "teal": 1012, + "source": 292, "pc": [ 1086 ] }, { - "teal": 1009, - "source": 288, + "teal": 1013, + "source": 292, "pc": [ 1087 ] }, { - "teal": 1010, - "source": 288, + "teal": 1014, + "source": 292, "pc": [ 1088 ] }, { - "teal": 1011, - "source": 288, + "teal": 1015, + "source": 292, "pc": [ 1089 ] }, { - "teal": 1014, - "source": 288, + "teal": 1018, + "source": 292, "errorMessage": "the specified validator id doesn't exist", "pc": [ 1090 ] }, { - "teal": 1018, - "source": 290, + "teal": 1022, + "source": 294, "pc": [ 1091, 1092 ] }, { - "teal": 1019, - "source": 290, + "teal": 1023, + "source": 294, "pc": [ 1093, 1094 ] }, { - "teal": 1020, - "source": 290, + "teal": 1024, + "source": 294, "pc": [ 1095 ] }, { - "teal": 1021, - "source": 290, + "teal": 1025, + "source": 294, "pc": [ 1096, 1097 ] }, { - "teal": 1022, - "source": 290, + "teal": 1026, + "source": 294, "pc": [ 1098 ] }, { - "teal": 1023, - "source": 290, + "teal": 1027, + "source": 294, "pc": [ 1099 ] }, { - "teal": 1024, - "source": 290, + "teal": 1028, + "source": 294, "pc": [ 1100, 1101 ] }, { - "teal": 1025, - "source": 290, + "teal": 1029, + "source": 294, "pc": [ 1102 ] }, { - "teal": 1026, - "source": 287, + "teal": 1030, + "source": 290, "pc": [ 1103 ] }, { - "teal": 1031, - "source": 293, + "teal": 1035, + "source": 297, "pc": [ 1104 ] }, { - "teal": 1034, - "source": 293, + "teal": 1038, + "source": 297, "pc": [ 1105, 1106, @@ -4397,43 +4397,43 @@ ] }, { - "teal": 1035, - "source": 293, + "teal": 1039, + "source": 297, "pc": [ 1108 ] }, { - "teal": 1036, - "source": 293, + "teal": 1040, + "source": 297, "pc": [ 1109 ] }, { - "teal": 1037, - "source": 293, + "teal": 1041, + "source": 297, "pc": [ 1110 ] }, { - "teal": 1038, - "source": 293, + "teal": 1042, + "source": 297, "pc": [ 1111 ] }, { - "teal": 1039, - "source": 293, + "teal": 1043, + "source": 297, "pc": [ 1112 ] }, { - "teal": 1043, - "source": 293, + "teal": 1047, + "source": 297, "pc": [ 1113, 1114, @@ -4441,30 +4441,30 @@ ] }, { - "teal": 1047, - "source": 294, + "teal": 1051, + "source": 299, "pc": [ 1116, 1117 ] }, { - "teal": 1048, - "source": 293, + "teal": 1052, + "source": 297, "pc": [ 1118 ] }, { - "teal": 1053, - "source": 305, + "teal": 1057, + "source": 310, "pc": [ 1119 ] }, { - "teal": 1056, - "source": 305, + "teal": 1060, + "source": 310, "pc": [ 1120, 1121, @@ -4472,45 +4472,45 @@ ] }, { - "teal": 1057, - "source": 305, + "teal": 1061, + "source": 310, "pc": [ 1123 ] }, { - "teal": 1058, - "source": 305, + "teal": 1062, + "source": 310, "pc": [ 1124 ] }, { - "teal": 1059, - "source": 305, + "teal": 1063, + "source": 310, "pc": [ 1125, 1126 ] }, { - "teal": 1060, - "source": 305, + "teal": 1064, + "source": 310, "pc": [ 1127 ] }, { - "teal": 1063, - "source": 305, + "teal": 1067, + "source": 310, "errorMessage": "argument 0 (config) for addValidator must be a (uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64)", "pc": [ 1128 ] }, { - "teal": 1066, - "source": 305, + "teal": 1070, + "source": 310, "pc": [ 1129, 1130, @@ -4518,8 +4518,8 @@ ] }, { - "teal": 1067, - "source": 305, + "teal": 1071, + "source": 310, "pc": [ 1132, 1133, @@ -4527,67 +4527,67 @@ ] }, { - "teal": 1070, - "source": 305, + "teal": 1074, + "source": 310, "pc": [ 1135, 1136 ] }, { - "teal": 1071, - "source": 305, + "teal": 1075, + "source": 310, "pc": [ 1137 ] }, { - "teal": 1072, - "source": 305, + "teal": 1076, + "source": 310, "pc": [ 1138 ] }, { - "teal": 1073, - "source": 305, + "teal": 1077, + "source": 310, "pc": [ 1139 ] }, { - "teal": 1074, - "source": 305, + "teal": 1078, + "source": 310, "pc": [ 1140, 1141 ] }, { - "teal": 1075, - "source": 305, + "teal": 1079, + "source": 310, "pc": [ 1142 ] }, { - "teal": 1076, - "source": 305, + "teal": 1080, + "source": 310, "pc": [ 1143 ] }, { - "teal": 1079, - "source": 305, + "teal": 1083, + "source": 310, "errorMessage": "argument 2 (mbrPayment) for addValidator must be a pay transaction", "pc": [ 1144 ] }, { - "teal": 1082, - "source": 305, + "teal": 1086, + "source": 310, "pc": [ 1145, 1146, @@ -4595,43 +4595,43 @@ ] }, { - "teal": 1083, - "source": 305, + "teal": 1087, + "source": 310, "pc": [ 1148 ] }, { - "teal": 1084, - "source": 305, + "teal": 1088, + "source": 310, "pc": [ 1149 ] }, { - "teal": 1085, - "source": 305, + "teal": 1089, + "source": 310, "pc": [ 1150 ] }, { - "teal": 1086, - "source": 305, + "teal": 1090, + "source": 310, "pc": [ 1151 ] }, { - "teal": 1087, - "source": 305, + "teal": 1091, + "source": 310, "pc": [ 1152 ] }, { - "teal": 1099, - "source": 305, + "teal": 1103, + "source": 310, "pc": [ 1153, 1154, @@ -4639,23 +4639,23 @@ ] }, { - "teal": 1102, - "source": 305, + "teal": 1106, + "source": 310, "pc": [ 1156 ] }, { - "teal": 1106, - "source": 306, + "teal": 1110, + "source": 311, "pc": [ 1157, 1158 ] }, { - "teal": 1107, - "source": 306, + "teal": 1111, + "source": 311, "pc": [ 1159, 1160, @@ -4663,63 +4663,63 @@ ] }, { - "teal": 1112, - "source": 308, + "teal": 1116, + "source": 313, "pc": [ 1162, 1163 ] }, { - "teal": 1113, - "source": 308, + "teal": 1117, + "source": 313, "pc": [ 1164, 1165 ] }, { - "teal": 1114, - "source": 308, + "teal": 1118, + "source": 313, "pc": [ 1166, 1167 ] }, { - "teal": 1115, - "source": 308, + "teal": 1119, + "source": 313, "pc": [ 1168 ] }, { - "teal": 1118, - "source": 308, + "teal": 1122, + "source": 313, "errorMessage": "transaction verification failed: {\"txn\":\"mbrPayment\",\"field\":\"receiver\",\"expected\":\"this.app.address\"}", "pc": [ 1169 ] }, { - "teal": 1121, - "source": 308, + "teal": 1125, + "source": 313, "pc": [ 1170, 1171 ] }, { - "teal": 1122, - "source": 308, + "teal": 1126, + "source": 313, "pc": [ 1172, 1173 ] }, { - "teal": 1123, - "source": 308, + "teal": 1127, + "source": 313, "pc": [ 1174, 1175, @@ -4727,8 +4727,8 @@ ] }, { - "teal": 1124, - "source": 308, + "teal": 1128, + "source": 313, "pc": [ 1177, 1178, @@ -4736,46 +4736,46 @@ ] }, { - "teal": 1125, - "source": 308, + "teal": 1129, + "source": 313, "pc": [ 1180 ] }, { - "teal": 1126, - "source": 308, + "teal": 1130, + "source": 313, "pc": [ 1181 ] }, { - "teal": 1129, - "source": 308, + "teal": 1133, + "source": 313, "errorMessage": "transaction verification failed: {\"txn\":\"mbrPayment\",\"field\":\"amount\",\"expected\":\"this.getMbrAmounts().addValidatorMbr\"}", "pc": [ 1182 ] }, { - "teal": 1133, - "source": 310, + "teal": 1137, + "source": 315, "pc": [ 1183, 1184 ] }, { - "teal": 1134, - "source": 310, + "teal": 1138, + "source": 315, "pc": [ 1185, 1186 ] }, { - "teal": 1135, - "source": 310, + "teal": 1139, + "source": 315, "pc": [ 1187, 1188, @@ -4785,112 +4785,112 @@ ] }, { - "teal": 1136, - "source": 310, + "teal": 1140, + "source": 315, "pc": [ 1192 ] }, { - "teal": 1139, - "source": 310, + "teal": 1143, + "source": 315, "errorMessage": "fee must be 10 ALGO or more to prevent spamming of validators", "pc": [ 1193 ] }, { - "teal": 1143, - "source": 313, + "teal": 1147, + "source": 318, "pc": [ 1194, 1195 ] }, { - "teal": 1144, - "source": 313, + "teal": 1148, + "source": 318, "pc": [ 1196 ] }, { - "teal": 1145, - "source": 313, + "teal": 1149, + "source": 318, "pc": [ 1197 ] }, { - "teal": 1146, - "source": 313, + "teal": 1150, + "source": 318, "pc": [ 1198 ] }, { - "teal": 1147, - "source": 313, + "teal": 1151, + "source": 318, "pc": [ 1199, 1200 ] }, { - "teal": 1151, - "source": 314, + "teal": 1155, + "source": 319, "pc": [ 1201, 1202 ] }, { - "teal": 1152, - "source": 314, + "teal": 1156, + "source": 319, "pc": [ 1203, 1204 ] }, { - "teal": 1153, - "source": 314, + "teal": 1157, + "source": 319, "pc": [ 1205 ] }, { - "teal": 1157, - "source": 316, + "teal": 1161, + "source": 321, "pc": [ 1206 ] }, { - "teal": 1158, - "source": 316, + "teal": 1162, + "source": 321, "pc": [ 1207, 1208 ] }, { - "teal": 1159, - "source": 316, + "teal": 1163, + "source": 321, "pc": [ 1209 ] }, { - "teal": 1160, - "source": 316, + "teal": 1164, + "source": 321, "pc": [ 1210 ] }, { - "teal": 1161, - "source": 316, + "teal": 1165, + "source": 321, "pc": [ 1211, 1212, @@ -4898,155 +4898,155 @@ ] }, { - "teal": 1162, - "source": 316, + "teal": 1166, + "source": 321, "pc": [ 1214 ] }, { - "teal": 1163, - "source": 316, + "teal": 1167, + "source": 321, "pc": [ 1215 ] }, { - "teal": 1167, - "source": 317, + "teal": 1171, + "source": 322, "pc": [ 1216 ] }, { - "teal": 1168, - "source": 317, + "teal": 1172, + "source": 322, "pc": [ 1217, 1218 ] }, { - "teal": 1169, - "source": 317, + "teal": 1173, + "source": 322, "pc": [ 1219 ] }, { - "teal": 1170, - "source": 317, + "teal": 1174, + "source": 322, "pc": [ 1220, 1221 ] }, { - "teal": 1171, - "source": 317, + "teal": 1175, + "source": 322, "pc": [ 1222 ] }, { - "teal": 1172, - "source": 317, + "teal": 1176, + "source": 322, "pc": [ 1223 ] }, { - "teal": 1173, - "source": 317, + "teal": 1177, + "source": 322, "pc": [ 1224, 1225 ] }, { - "teal": 1174, - "source": 317, + "teal": 1178, + "source": 322, "pc": [ 1226 ] }, { - "teal": 1178, - "source": 318, + "teal": 1182, + "source": 323, "pc": [ 1227 ] }, { - "teal": 1179, - "source": 318, + "teal": 1183, + "source": 323, "pc": [ 1228, 1229 ] }, { - "teal": 1180, - "source": 318, + "teal": 1184, + "source": 323, "pc": [ 1230 ] }, { - "teal": 1181, - "source": 318, + "teal": 1185, + "source": 323, "pc": [ 1231 ] }, { - "teal": 1182, - "source": 318, + "teal": 1186, + "source": 323, "pc": [ 1232, 1233 ] }, { - "teal": 1183, - "source": 318, + "teal": 1187, + "source": 323, "pc": [ 1234 ] }, { - "teal": 1184, - "source": 318, + "teal": 1188, + "source": 323, "pc": [ 1235 ] }, { - "teal": 1185, - "source": 318, + "teal": 1189, + "source": 323, "pc": [ 1236, 1237 ] }, { - "teal": 1186, - "source": 318, + "teal": 1190, + "source": 323, "pc": [ 1238 ] }, { - "teal": 1191, - "source": 321, + "teal": 1195, + "source": 326, "pc": [ 1239, 1240 ] }, { - "teal": 1192, - "source": 321, + "teal": 1196, + "source": 326, "pc": [ 1241, 1242, @@ -5054,29 +5054,29 @@ ] }, { - "teal": 1193, - "source": 321, + "teal": 1197, + "source": 326, "pc": [ 1244 ] }, { - "teal": 1194, - "source": 321, + "teal": 1198, + "source": 326, "pc": [ 1245 ] }, { - "teal": 1195, - "source": 321, + "teal": 1199, + "source": 326, "pc": [ 1246 ] }, { - "teal": 1196, - "source": 321, + "teal": 1200, + "source": 326, "pc": [ 1247, 1248, @@ -5084,16 +5084,16 @@ ] }, { - "teal": 1201, - "source": 323, + "teal": 1205, + "source": 328, "pc": [ 1250, 1251 ] }, { - "teal": 1202, - "source": 323, + "teal": 1206, + "source": 328, "pc": [ 1252, 1253, @@ -5101,15 +5101,15 @@ ] }, { - "teal": 1203, - "source": 323, + "teal": 1207, + "source": 328, "pc": [ 1255 ] }, { - "teal": 1204, - "source": 323, + "teal": 1208, + "source": 328, "pc": [ 1256, 1257, @@ -5117,32 +5117,32 @@ ] }, { - "teal": 1207, - "source": 323, + "teal": 1211, + "source": 328, "errorMessage": "provided NFD must be valid", "pc": [ 1259 ] }, { - "teal": 1214, - "source": 326, + "teal": 1218, + "source": 331, "pc": [ 1260, 1261 ] }, { - "teal": 1215, - "source": 326, + "teal": 1219, + "source": 331, "pc": [ 1262, 1263 ] }, { - "teal": 1216, - "source": 326, + "teal": 1220, + "source": 331, "pc": [ 1264, 1265, @@ -5150,61 +5150,61 @@ ] }, { - "teal": 1217, - "source": 326, + "teal": 1221, + "source": 331, "pc": [ 1267 ] }, { - "teal": 1218, - "source": 326, + "teal": 1222, + "source": 331, "pc": [ 1268, 1269 ] }, { - "teal": 1219, - "source": 326, + "teal": 1223, + "source": 331, "pc": [ 1270 ] }, { - "teal": 1222, - "source": 326, + "teal": 1226, + "source": 331, "errorMessage": "global state value does not exist: AppID.fromUint64(config.nfdForInfo).globalState('i.owner.a')", "pc": [ 1271 ] }, { - "teal": 1223, - "source": 326, + "teal": 1227, + "source": 331, "pc": [ 1272 ] }, { - "teal": 1226, - "source": 325, + "teal": 1230, + "source": 330, "errorMessage": "If specifying NFD, account adding validator must be owner", "pc": [ 1273 ] }, { - "teal": 1233, - "source": 331, + "teal": 1237, + "source": 336, "pc": [ 1274, 1275 ] }, { - "teal": 1234, - "source": 331, + "teal": 1238, + "source": 336, "pc": [ 1276, 1277, @@ -5212,37 +5212,37 @@ ] }, { - "teal": 1235, - "source": 331, + "teal": 1239, + "source": 336, "pc": [ 1279 ] }, { - "teal": 1236, - "source": 331, + "teal": 1240, + "source": 336, "pc": [ 1280, 1281 ] }, { - "teal": 1237, - "source": 331, + "teal": 1241, + "source": 336, "pc": [ 1282 ] }, { - "teal": 1238, - "source": 331, + "teal": 1242, + "source": 336, "pc": [ 1283 ] }, { - "teal": 1239, - "source": 331, + "teal": 1243, + "source": 336, "pc": [ 1284, 1285, @@ -5250,16 +5250,16 @@ ] }, { - "teal": 1240, - "source": 332, + "teal": 1244, + "source": 337, "pc": [ 1287, 1288 ] }, { - "teal": 1241, - "source": 332, + "teal": 1245, + "source": 337, "pc": [ 1289, 1290, @@ -5267,37 +5267,37 @@ ] }, { - "teal": 1242, - "source": 332, + "teal": 1246, + "source": 337, "pc": [ 1292 ] }, { - "teal": 1243, - "source": 332, + "teal": 1247, + "source": 337, "pc": [ 1293, 1294 ] }, { - "teal": 1244, - "source": 332, + "teal": 1248, + "source": 337, "pc": [ 1295 ] }, { - "teal": 1245, - "source": 331, + "teal": 1249, + "source": 336, "pc": [ 1296 ] }, { - "teal": 1248, - "source": 330, + "teal": 1252, + "source": 335, "pc": [ 1297, 1298, @@ -5305,16 +5305,16 @@ ] }, { - "teal": 1256, - "source": 336, + "teal": 1260, + "source": 341, "pc": [ 1300, 1301 ] }, { - "teal": 1257, - "source": 336, + "teal": 1261, + "source": 341, "pc": [ 1302, 1303, @@ -5322,15 +5322,15 @@ ] }, { - "teal": 1258, - "source": 336, + "teal": 1262, + "source": 341, "pc": [ 1305 ] }, { - "teal": 1259, - "source": 336, + "teal": 1263, + "source": 341, "pc": [ 1306, 1307, @@ -5338,16 +5338,16 @@ ] }, { - "teal": 1262, - "source": 335, + "teal": 1266, + "source": 340, "errorMessage": "provided NFD App id for gating must be valid NFD", "pc": [ 1309 ] }, { - "teal": 1267, - "source": 340, + "teal": 1271, + "source": 345, "pc": [ 1310, 1311, @@ -5358,31 +5358,31 @@ ] }, { - "teal": 1268, - "source": 340, + "teal": 1272, + "source": 345, "pc": [ 1316, 1317 ] }, { - "teal": 1269, - "source": 340, + "teal": 1273, + "source": 345, "pc": [ 1318 ] }, { - "teal": 1270, - "source": 340, + "teal": 1274, + "source": 345, "pc": [ 1319, 1320 ] }, { - "teal": 1271, - "source": 340, + "teal": 1275, + "source": 345, "pc": [ 1321, 1322, @@ -5390,23 +5390,23 @@ ] }, { - "teal": 1272, - "source": 340, + "teal": 1276, + "source": 345, "pc": [ 1324 ] }, { - "teal": 1273, - "source": 340, + "teal": 1277, + "source": 345, "pc": [ 1325, 1326 ] }, { - "teal": 1274, - "source": 340, + "teal": 1278, + "source": 345, "pc": [ 1327, 1328, @@ -5414,52 +5414,52 @@ ] }, { - "teal": 1275, - "source": 340, + "teal": 1279, + "source": 345, "pc": [ 1330 ] }, { - "teal": 1276, - "source": 340, + "teal": 1280, + "source": 345, "pc": [ 1331 ] }, { - "teal": 1277, - "source": 340, + "teal": 1281, + "source": 345, "pc": [ 1332 ] }, { - "teal": 1281, - "source": 341, + "teal": 1285, + "source": 346, "pc": [ 1333, 1334 ] }, { - "teal": 1284, - "source": 305, + "teal": 1288, + "source": 310, "pc": [ 1335, 1336 ] }, { - "teal": 1285, - "source": 305, + "teal": 1289, + "source": 310, "pc": [ 1337 ] }, { - "teal": 1290, - "source": 351, + "teal": 1294, + "source": 356, "pc": [ 1338, 1339, @@ -5467,45 +5467,45 @@ ] }, { - "teal": 1291, - "source": 351, + "teal": 1295, + "source": 356, "pc": [ 1341 ] }, { - "teal": 1292, - "source": 351, + "teal": 1296, + "source": 356, "pc": [ 1342 ] }, { - "teal": 1293, - "source": 351, + "teal": 1297, + "source": 356, "pc": [ 1343, 1344 ] }, { - "teal": 1294, - "source": 351, + "teal": 1298, + "source": 356, "pc": [ 1345 ] }, { - "teal": 1297, - "source": 351, + "teal": 1301, + "source": 356, "errorMessage": "argument 0 (manager) for changeValidatorManager must be a address", "pc": [ 1346 ] }, { - "teal": 1300, - "source": 351, + "teal": 1304, + "source": 356, "pc": [ 1347, 1348, @@ -5513,15 +5513,15 @@ ] }, { - "teal": 1301, - "source": 351, + "teal": 1305, + "source": 356, "pc": [ 1350 ] }, { - "teal": 1304, - "source": 351, + "teal": 1308, + "source": 356, "pc": [ 1351, 1352, @@ -5529,22 +5529,22 @@ ] }, { - "teal": 1305, - "source": 351, + "teal": 1309, + "source": 356, "pc": [ 1354 ] }, { - "teal": 1306, - "source": 351, + "teal": 1310, + "source": 356, "pc": [ 1355 ] }, { - "teal": 1316, - "source": 351, + "teal": 1320, + "source": 356, "pc": [ 1356, 1357, @@ -5552,16 +5552,16 @@ ] }, { - "teal": 1320, - "source": 352, + "teal": 1324, + "source": 357, "pc": [ 1359, 1360 ] }, { - "teal": 1321, - "source": 352, + "teal": 1325, + "source": 357, "pc": [ 1361, 1362, @@ -5569,106 +5569,106 @@ ] }, { - "teal": 1325, - "source": 353, + "teal": 1329, + "source": 358, "pc": [ 1364, 1365 ] }, { - "teal": 1326, - "source": 353, + "teal": 1330, + "source": 358, "pc": [ 1366, 1367 ] }, { - "teal": 1327, - "source": 353, + "teal": 1331, + "source": 358, "pc": [ 1368 ] }, { - "teal": 1330, - "source": 353, + "teal": 1334, + "source": 358, "errorMessage": "needs to at least be valid address", "pc": [ 1369 ] }, { - "teal": 1334, - "source": 354, + "teal": 1338, + "source": 359, "pc": [ 1370, 1371 ] }, { - "teal": 1335, - "source": 354, + "teal": 1339, + "source": 359, "pc": [ 1372, 1373 ] }, { - "teal": 1336, - "source": 354, + "teal": 1340, + "source": 359, "pc": [ 1374 ] }, { - "teal": 1337, - "source": 354, + "teal": 1341, + "source": 359, "pc": [ 1375, 1376 ] }, { - "teal": 1338, - "source": 354, + "teal": 1342, + "source": 359, "pc": [ 1377 ] }, { - "teal": 1339, - "source": 354, + "teal": 1343, + "source": 359, "pc": [ 1378 ] }, { - "teal": 1340, - "source": 354, + "teal": 1344, + "source": 359, "pc": [ 1379, 1380 ] }, { - "teal": 1341, - "source": 354, + "teal": 1345, + "source": 359, "pc": [ 1381 ] }, { - "teal": 1342, - "source": 351, + "teal": 1346, + "source": 356, "pc": [ 1382 ] }, { - "teal": 1347, - "source": 365, + "teal": 1351, + "source": 370, "pc": [ 1383, 1384, @@ -5676,15 +5676,15 @@ ] }, { - "teal": 1348, - "source": 365, + "teal": 1352, + "source": 370, "pc": [ 1386 ] }, { - "teal": 1351, - "source": 365, + "teal": 1355, + "source": 370, "pc": [ 1387, 1388, @@ -5692,15 +5692,15 @@ ] }, { - "teal": 1352, - "source": 365, + "teal": 1356, + "source": 370, "pc": [ 1390 ] }, { - "teal": 1355, - "source": 365, + "teal": 1359, + "source": 370, "pc": [ 1391, 1392, @@ -5708,15 +5708,15 @@ ] }, { - "teal": 1356, - "source": 365, + "teal": 1360, + "source": 370, "pc": [ 1394 ] }, { - "teal": 1359, - "source": 365, + "teal": 1363, + "source": 370, "pc": [ 1395, 1396, @@ -5724,22 +5724,22 @@ ] }, { - "teal": 1360, - "source": 365, + "teal": 1364, + "source": 370, "pc": [ 1398 ] }, { - "teal": 1361, - "source": 365, + "teal": 1365, + "source": 370, "pc": [ 1399 ] }, { - "teal": 1372, - "source": 365, + "teal": 1376, + "source": 370, "pc": [ 1400, 1401, @@ -5747,16 +5747,16 @@ ] }, { - "teal": 1376, - "source": 366, + "teal": 1380, + "source": 371, "pc": [ 1403, 1404 ] }, { - "teal": 1377, - "source": 366, + "teal": 1381, + "source": 371, "pc": [ 1405, 1406, @@ -5764,75 +5764,75 @@ ] }, { - "teal": 1381, - "source": 367, + "teal": 1385, + "source": 372, "pc": [ 1408, 1409 ] }, { - "teal": 1382, - "source": 367, + "teal": 1386, + "source": 372, "pc": [ 1410, 1411 ] }, { - "teal": 1383, - "source": 367, + "teal": 1387, + "source": 372, "pc": [ 1412 ] }, { - "teal": 1384, - "source": 367, + "teal": 1388, + "source": 372, "pc": [ 1413 ] }, { - "teal": 1385, - "source": 367, + "teal": 1389, + "source": 372, "pc": [ 1414, 1415 ] }, { - "teal": 1386, - "source": 367, + "teal": 1390, + "source": 372, "pc": [ 1416 ] }, { - "teal": 1387, - "source": 367, + "teal": 1391, + "source": 372, "pc": [ 1417 ] }, { - "teal": 1388, - "source": 367, + "teal": 1392, + "source": 372, "pc": [ 1418, 1419 ] }, { - "teal": 1389, - "source": 367, + "teal": 1393, + "source": 372, "pc": [ 1420 ] }, { - "teal": 1393, - "source": 368, + "teal": 1397, + "source": 373, "pc": [ 1421, 1422, @@ -5840,74 +5840,74 @@ ] }, { - "teal": 1394, - "source": 368, + "teal": 1398, + "source": 373, "pc": [ 1424, 1425 ] }, { - "teal": 1395, - "source": 368, + "teal": 1399, + "source": 373, "pc": [ 1426 ] }, { - "teal": 1396, - "source": 368, + "teal": 1400, + "source": 373, "pc": [ 1427 ] }, { - "teal": 1397, - "source": 368, + "teal": 1401, + "source": 373, "pc": [ 1428, 1429 ] }, { - "teal": 1398, - "source": 368, + "teal": 1402, + "source": 373, "pc": [ 1430 ] }, { - "teal": 1399, - "source": 368, + "teal": 1403, + "source": 373, "pc": [ 1431 ] }, { - "teal": 1400, - "source": 368, + "teal": 1404, + "source": 373, "pc": [ 1432, 1433 ] }, { - "teal": 1401, - "source": 368, + "teal": 1405, + "source": 373, "pc": [ 1434 ] }, { - "teal": 1402, - "source": 365, + "teal": 1406, + "source": 370, "pc": [ 1435 ] }, { - "teal": 1407, - "source": 379, + "teal": 1411, + "source": 384, "pc": [ 1436, 1437, @@ -5915,8 +5915,8 @@ ] }, { - "teal": 1408, - "source": 379, + "teal": 1412, + "source": 384, "pc": [ 1439, 1440, @@ -5924,8 +5924,8 @@ ] }, { - "teal": 1411, - "source": 379, + "teal": 1415, + "source": 384, "pc": [ 1442, 1443, @@ -5933,15 +5933,15 @@ ] }, { - "teal": 1412, - "source": 379, + "teal": 1416, + "source": 384, "pc": [ 1445 ] }, { - "teal": 1415, - "source": 379, + "teal": 1419, + "source": 384, "pc": [ 1446, 1447, @@ -5949,15 +5949,15 @@ ] }, { - "teal": 1416, - "source": 379, + "teal": 1420, + "source": 384, "pc": [ 1449 ] }, { - "teal": 1419, - "source": 379, + "teal": 1423, + "source": 384, "pc": [ 1450, 1451, @@ -5965,22 +5965,22 @@ ] }, { - "teal": 1420, - "source": 379, + "teal": 1424, + "source": 384, "pc": [ 1453 ] }, { - "teal": 1421, - "source": 379, + "teal": 1425, + "source": 384, "pc": [ 1454 ] }, { - "teal": 1432, - "source": 379, + "teal": 1436, + "source": 384, "pc": [ 1455, 1456, @@ -5988,16 +5988,16 @@ ] }, { - "teal": 1436, - "source": 380, + "teal": 1440, + "source": 385, "pc": [ 1458, 1459 ] }, { - "teal": 1437, - "source": 380, + "teal": 1441, + "source": 385, "pc": [ 1460, 1461, @@ -6005,16 +6005,16 @@ ] }, { - "teal": 1441, - "source": 382, + "teal": 1445, + "source": 387, "pc": [ 1463, 1464 ] }, { - "teal": 1442, - "source": 382, + "teal": 1446, + "source": 387, "pc": [ 1465, 1466, @@ -6022,144 +6022,144 @@ ] }, { - "teal": 1445, - "source": 382, + "teal": 1449, + "source": 387, "errorMessage": "provided NFD must be valid", "pc": [ 1468 ] }, { - "teal": 1452, - "source": 385, + "teal": 1456, + "source": 390, "pc": [ 1469, 1470 ] }, { - "teal": 1453, - "source": 385, + "teal": 1457, + "source": 390, "pc": [ 1471, 1472 ] }, { - "teal": 1454, - "source": 385, + "teal": 1458, + "source": 390, "pc": [ 1473, 1474 ] }, { - "teal": 1455, - "source": 385, + "teal": 1459, + "source": 390, "pc": [ 1475 ] }, { - "teal": 1458, - "source": 385, + "teal": 1462, + "source": 390, "errorMessage": "global state value does not exist: AppID.fromUint64(nfdAppID).globalState('i.owner.a')", "pc": [ 1476 ] }, { - "teal": 1459, - "source": 385, + "teal": 1463, + "source": 390, "pc": [ 1477 ] }, { - "teal": 1462, - "source": 384, + "teal": 1466, + "source": 389, "errorMessage": "If specifying NFD, account adding validator must be owner", "pc": [ 1478 ] }, { - "teal": 1466, - "source": 388, + "teal": 1470, + "source": 393, "pc": [ 1479, 1480 ] }, { - "teal": 1467, - "source": 388, + "teal": 1471, + "source": 393, "pc": [ 1481, 1482 ] }, { - "teal": 1468, - "source": 388, + "teal": 1472, + "source": 393, "pc": [ 1483 ] }, { - "teal": 1469, - "source": 388, + "teal": 1473, + "source": 393, "pc": [ 1484 ] }, { - "teal": 1470, - "source": 388, + "teal": 1474, + "source": 393, "pc": [ 1485, 1486 ] }, { - "teal": 1471, - "source": 388, + "teal": 1475, + "source": 393, "pc": [ 1487 ] }, { - "teal": 1472, - "source": 388, + "teal": 1476, + "source": 393, "pc": [ 1488 ] }, { - "teal": 1473, - "source": 388, + "teal": 1477, + "source": 393, "pc": [ 1489, 1490 ] }, { - "teal": 1474, - "source": 388, + "teal": 1478, + "source": 393, "pc": [ 1491 ] }, { - "teal": 1475, - "source": 379, + "teal": 1479, + "source": 384, "pc": [ 1492 ] }, { - "teal": 1480, - "source": 395, + "teal": 1484, + "source": 400, "pc": [ 1493, 1494, @@ -6167,45 +6167,45 @@ ] }, { - "teal": 1481, - "source": 395, + "teal": 1485, + "source": 400, "pc": [ 1496 ] }, { - "teal": 1482, - "source": 395, + "teal": 1486, + "source": 400, "pc": [ 1497 ] }, { - "teal": 1483, - "source": 395, + "teal": 1487, + "source": 400, "pc": [ 1498, 1499 ] }, { - "teal": 1484, - "source": 395, + "teal": 1488, + "source": 400, "pc": [ 1500 ] }, { - "teal": 1487, - "source": 395, + "teal": 1491, + "source": 400, "errorMessage": "argument 0 (commissionAddress) for changeValidatorCommissionAddress must be a address", "pc": [ 1501 ] }, { - "teal": 1490, - "source": 395, + "teal": 1494, + "source": 400, "pc": [ 1502, 1503, @@ -6213,15 +6213,15 @@ ] }, { - "teal": 1491, - "source": 395, + "teal": 1495, + "source": 400, "pc": [ 1505 ] }, { - "teal": 1494, - "source": 395, + "teal": 1498, + "source": 400, "pc": [ 1506, 1507, @@ -6229,22 +6229,22 @@ ] }, { - "teal": 1495, - "source": 395, + "teal": 1499, + "source": 400, "pc": [ 1509 ] }, { - "teal": 1496, - "source": 395, + "teal": 1500, + "source": 400, "pc": [ 1510 ] }, { - "teal": 1503, - "source": 395, + "teal": 1507, + "source": 400, "pc": [ 1511, 1512, @@ -6252,16 +6252,16 @@ ] }, { - "teal": 1507, - "source": 396, + "teal": 1511, + "source": 401, "pc": [ 1514, 1515 ] }, { - "teal": 1508, - "source": 396, + "teal": 1512, + "source": 401, "pc": [ 1516, 1517, @@ -6269,38 +6269,38 @@ ] }, { - "teal": 1512, - "source": 397, + "teal": 1516, + "source": 402, "pc": [ 1519, 1520 ] }, { - "teal": 1513, - "source": 397, + "teal": 1517, + "source": 402, "pc": [ 1521, 1522 ] }, { - "teal": 1514, - "source": 397, + "teal": 1518, + "source": 402, "pc": [ 1523 ] }, { - "teal": 1515, - "source": 397, + "teal": 1519, + "source": 402, "pc": [ 1524 ] }, { - "teal": 1519, - "source": 398, + "teal": 1523, + "source": 403, "pc": [ 1525, 1526, @@ -6308,67 +6308,67 @@ ] }, { - "teal": 1520, - "source": 398, + "teal": 1524, + "source": 403, "pc": [ 1528, 1529 ] }, { - "teal": 1521, - "source": 398, + "teal": 1525, + "source": 403, "pc": [ 1530 ] }, { - "teal": 1522, - "source": 398, + "teal": 1526, + "source": 403, "pc": [ 1531, 1532 ] }, { - "teal": 1523, - "source": 398, + "teal": 1527, + "source": 403, "pc": [ 1533 ] }, { - "teal": 1524, - "source": 398, + "teal": 1528, + "source": 403, "pc": [ 1534 ] }, { - "teal": 1525, - "source": 398, + "teal": 1529, + "source": 403, "pc": [ 1535, 1536 ] }, { - "teal": 1526, - "source": 398, + "teal": 1530, + "source": 403, "pc": [ 1537 ] }, { - "teal": 1527, - "source": 395, + "teal": 1531, + "source": 400, "pc": [ 1538 ] }, { - "teal": 1532, - "source": 411, + "teal": 1536, + "source": 416, "pc": [ 1539, 1540, @@ -6376,15 +6376,15 @@ ] }, { - "teal": 1533, - "source": 411, + "teal": 1537, + "source": 416, "pc": [ 1542 ] }, { - "teal": 1536, - "source": 410, + "teal": 1540, + "source": 415, "pc": [ 1543, 1544, @@ -6392,15 +6392,15 @@ ] }, { - "teal": 1537, - "source": 410, + "teal": 1541, + "source": 415, "pc": [ 1546 ] }, { - "teal": 1540, - "source": 409, + "teal": 1544, + "source": 414, "pc": [ 1547, 1548, @@ -6408,45 +6408,45 @@ ] }, { - "teal": 1541, - "source": 409, + "teal": 1545, + "source": 414, "pc": [ 1550 ] }, { - "teal": 1542, - "source": 409, + "teal": 1546, + "source": 414, "pc": [ 1551 ] }, { - "teal": 1543, - "source": 409, + "teal": 1547, + "source": 414, "pc": [ 1552, 1553 ] }, { - "teal": 1544, - "source": 409, + "teal": 1548, + "source": 414, "pc": [ 1554 ] }, { - "teal": 1547, - "source": 409, + "teal": 1551, + "source": 414, "errorMessage": "argument 2 (EntryGatingAssets) for changeValidatorRewardInfo must be a uint64[4]", "pc": [ 1555 ] }, { - "teal": 1550, - "source": 408, + "teal": 1554, + "source": 413, "pc": [ 1556, 1557, @@ -6454,45 +6454,45 @@ ] }, { - "teal": 1551, - "source": 408, + "teal": 1555, + "source": 413, "pc": [ 1559 ] }, { - "teal": 1552, - "source": 408, + "teal": 1556, + "source": 413, "pc": [ 1560 ] }, { - "teal": 1553, - "source": 408, + "teal": 1557, + "source": 413, "pc": [ 1561, 1562 ] }, { - "teal": 1554, - "source": 408, + "teal": 1558, + "source": 413, "pc": [ 1563 ] }, { - "teal": 1557, - "source": 408, + "teal": 1561, + "source": 413, "errorMessage": "argument 3 (EntryGatingAddress) for changeValidatorRewardInfo must be a address", "pc": [ 1564 ] }, { - "teal": 1560, - "source": 407, + "teal": 1564, + "source": 412, "pc": [ 1565, 1566, @@ -6500,51 +6500,51 @@ ] }, { - "teal": 1561, - "source": 407, + "teal": 1565, + "source": 412, "pc": [ 1568 ] }, { - "teal": 1562, - "source": 407, + "teal": 1566, + "source": 412, "pc": [ 1569 ] }, { - "teal": 1563, - "source": 407, + "teal": 1567, + "source": 412, "pc": [ 1570 ] }, { - "teal": 1564, - "source": 407, + "teal": 1568, + "source": 412, "pc": [ 1571 ] }, { - "teal": 1567, - "source": 407, + "teal": 1571, + "source": 412, "errorMessage": "argument 4 (EntryGatingType) for changeValidatorRewardInfo must be a uint8", "pc": [ 1572 ] }, { - "teal": 1568, - "source": 407, + "teal": 1572, + "source": 412, "pc": [ 1573 ] }, { - "teal": 1571, - "source": 406, + "teal": 1575, + "source": 411, "pc": [ 1574, 1575, @@ -6552,15 +6552,15 @@ ] }, { - "teal": 1572, - "source": 406, + "teal": 1576, + "source": 411, "pc": [ 1577 ] }, { - "teal": 1575, - "source": 405, + "teal": 1579, + "source": 410, "pc": [ 1578, 1579, @@ -6568,22 +6568,22 @@ ] }, { - "teal": 1576, - "source": 405, + "teal": 1580, + "source": 410, "pc": [ 1581 ] }, { - "teal": 1577, - "source": 405, + "teal": 1581, + "source": 410, "pc": [ 1582 ] }, { - "teal": 1584, - "source": 405, + "teal": 1588, + "source": 410, "pc": [ 1583, 1584, @@ -6591,16 +6591,16 @@ ] }, { - "teal": 1588, - "source": 413, + "teal": 1592, + "source": 418, "pc": [ 1586, 1587 ] }, { - "teal": 1589, - "source": 413, + "teal": 1593, + "source": 418, "pc": [ 1588, 1589, @@ -6608,37 +6608,37 @@ ] }, { - "teal": 1596, - "source": 416, + "teal": 1600, + "source": 421, "pc": [ 1591, 1592 ] }, { - "teal": 1597, - "source": 416, + "teal": 1601, + "source": 421, "pc": [ 1593 ] }, { - "teal": 1598, - "source": 416, + "teal": 1602, + "source": 421, "pc": [ 1594 ] }, { - "teal": 1599, - "source": 416, + "teal": 1603, + "source": 421, "pc": [ 1595 ] }, { - "teal": 1600, - "source": 416, + "teal": 1604, + "source": 421, "pc": [ 1596, 1597, @@ -6646,68 +6646,68 @@ ] }, { - "teal": 1601, - "source": 416, + "teal": 1605, + "source": 421, "pc": [ 1599, 1600 ] }, { - "teal": 1602, - "source": 416, + "teal": 1606, + "source": 421, "pc": [ 1601, 1602 ] }, { - "teal": 1603, - "source": 416, + "teal": 1607, + "source": 421, "pc": [ 1603 ] }, { - "teal": 1604, - "source": 416, + "teal": 1608, + "source": 421, "pc": [ 1604 ] }, { - "teal": 1608, - "source": 415, + "teal": 1612, + "source": 420, "errorMessage": "invalid Entry gating type", "pc": [ 1605 ] }, { - "teal": 1613, - "source": 419, + "teal": 1617, + "source": 424, "pc": [ 1606, 1607 ] }, { - "teal": 1614, - "source": 419, + "teal": 1618, + "source": 424, "pc": [ 1608 ] }, { - "teal": 1615, - "source": 419, + "teal": 1619, + "source": 424, "pc": [ 1609 ] }, { - "teal": 1616, - "source": 419, + "teal": 1620, + "source": 424, "pc": [ 1610, 1611, @@ -6715,68 +6715,68 @@ ] }, { - "teal": 1621, - "source": 420, + "teal": 1625, + "source": 425, "pc": [ 1613, 1614 ] }, { - "teal": 1622, - "source": 420, + "teal": 1626, + "source": 425, "pc": [ 1615, 1616 ] }, { - "teal": 1623, - "source": 420, + "teal": 1627, + "source": 425, "pc": [ 1617 ] }, { - "teal": 1624, - "source": 420, + "teal": 1628, + "source": 425, "pc": [ 1618 ] }, { - "teal": 1631, - "source": 423, + "teal": 1635, + "source": 428, "pc": [ 1619, 1620 ] }, { - "teal": 1632, - "source": 423, + "teal": 1636, + "source": 428, "pc": [ 1621, 1622 ] }, { - "teal": 1633, - "source": 423, + "teal": 1637, + "source": 428, "pc": [ 1623 ] }, { - "teal": 1634, - "source": 423, + "teal": 1638, + "source": 428, "pc": [ 1624 ] }, { - "teal": 1635, - "source": 423, + "teal": 1639, + "source": 428, "pc": [ 1625, 1626, @@ -6784,38 +6784,38 @@ ] }, { - "teal": 1636, - "source": 424, + "teal": 1640, + "source": 429, "pc": [ 1628, 1629 ] }, { - "teal": 1637, - "source": 424, + "teal": 1641, + "source": 429, "pc": [ 1630, 1631 ] }, { - "teal": 1638, - "source": 424, + "teal": 1642, + "source": 429, "pc": [ 1632 ] }, { - "teal": 1639, - "source": 423, + "teal": 1643, + "source": 428, "pc": [ 1633 ] }, { - "teal": 1642, - "source": 422, + "teal": 1646, + "source": 427, "pc": [ 1634, 1635, @@ -6823,16 +6823,16 @@ ] }, { - "teal": 1647, - "source": 426, + "teal": 1651, + "source": 431, "pc": [ 1637, 1638 ] }, { - "teal": 1648, - "source": 426, + "teal": 1652, + "source": 431, "pc": [ 1639, 1640, @@ -6840,15 +6840,15 @@ ] }, { - "teal": 1649, - "source": 426, + "teal": 1653, + "source": 431, "pc": [ 1642 ] }, { - "teal": 1650, - "source": 426, + "teal": 1654, + "source": 431, "pc": [ 1643, 1644, @@ -6856,39 +6856,39 @@ ] }, { - "teal": 1653, - "source": 426, + "teal": 1657, + "source": 431, "errorMessage": "provided NFD App id for gating must be valid NFD", "pc": [ 1646 ] }, { - "teal": 1658, - "source": 428, + "teal": 1662, + "source": 433, "pc": [ 1647, 1648 ] }, { - "teal": 1659, - "source": 428, + "teal": 1663, + "source": 433, "pc": [ 1649, 1650 ] }, { - "teal": 1660, - "source": 428, + "teal": 1664, + "source": 433, "pc": [ 1651 ] }, { - "teal": 1661, - "source": 428, + "teal": 1665, + "source": 433, "pc": [ 1652, 1653, @@ -6896,239 +6896,239 @@ ] }, { - "teal": 1662, - "source": 428, + "teal": 1666, + "source": 433, "pc": [ 1655 ] }, { - "teal": 1663, - "source": 428, + "teal": 1667, + "source": 433, "pc": [ 1656, 1657 ] }, { - "teal": 1664, - "source": 428, + "teal": 1668, + "source": 433, "pc": [ 1658 ] }, { - "teal": 1665, - "source": 428, + "teal": 1669, + "source": 433, "pc": [ 1659 ] }, { - "teal": 1666, - "source": 428, + "teal": 1670, + "source": 433, "pc": [ 1660, 1661 ] }, { - "teal": 1667, - "source": 428, + "teal": 1671, + "source": 433, "pc": [ 1662 ] }, { - "teal": 1671, - "source": 429, + "teal": 1675, + "source": 434, "pc": [ 1663, 1664 ] }, { - "teal": 1672, - "source": 429, + "teal": 1676, + "source": 434, "pc": [ 1665, 1666 ] }, { - "teal": 1673, - "source": 429, + "teal": 1677, + "source": 434, "pc": [ 1667 ] }, { - "teal": 1674, - "source": 429, + "teal": 1678, + "source": 434, "pc": [ 1668, 1669 ] }, { - "teal": 1675, - "source": 429, + "teal": 1679, + "source": 434, "pc": [ 1670 ] }, { - "teal": 1676, - "source": 429, + "teal": 1680, + "source": 434, "pc": [ 1671 ] }, { - "teal": 1677, - "source": 429, + "teal": 1681, + "source": 434, "pc": [ 1672, 1673 ] }, { - "teal": 1678, - "source": 429, + "teal": 1682, + "source": 434, "pc": [ 1674 ] }, { - "teal": 1682, - "source": 430, + "teal": 1686, + "source": 435, "pc": [ 1675, 1676 ] }, { - "teal": 1683, - "source": 430, + "teal": 1687, + "source": 435, "pc": [ 1677, 1678 ] }, { - "teal": 1684, - "source": 430, + "teal": 1688, + "source": 435, "pc": [ 1679 ] }, { - "teal": 1685, - "source": 430, + "teal": 1689, + "source": 435, "pc": [ 1680, 1681 ] }, { - "teal": 1686, - "source": 430, + "teal": 1690, + "source": 435, "pc": [ 1682 ] }, { - "teal": 1687, - "source": 430, + "teal": 1691, + "source": 435, "pc": [ 1683 ] }, { - "teal": 1688, - "source": 430, + "teal": 1692, + "source": 435, "pc": [ 1684, 1685 ] }, { - "teal": 1689, - "source": 430, + "teal": 1693, + "source": 435, "pc": [ 1686 ] }, { - "teal": 1693, - "source": 431, + "teal": 1697, + "source": 436, "pc": [ 1687, 1688 ] }, { - "teal": 1694, - "source": 431, + "teal": 1698, + "source": 436, "pc": [ 1689, 1690 ] }, { - "teal": 1695, - "source": 431, + "teal": 1699, + "source": 436, "pc": [ 1691 ] }, { - "teal": 1696, - "source": 431, + "teal": 1700, + "source": 436, "pc": [ 1692 ] }, { - "teal": 1697, - "source": 431, + "teal": 1701, + "source": 436, "pc": [ 1693, 1694 ] }, { - "teal": 1698, - "source": 431, + "teal": 1702, + "source": 436, "pc": [ 1695 ] }, { - "teal": 1699, - "source": 431, + "teal": 1703, + "source": 436, "pc": [ 1696 ] }, { - "teal": 1700, - "source": 431, + "teal": 1704, + "source": 436, "pc": [ 1697, 1698 ] }, { - "teal": 1701, - "source": 431, + "teal": 1705, + "source": 436, "pc": [ 1699 ] }, { - "teal": 1705, - "source": 432, + "teal": 1709, + "source": 437, "pc": [ 1700, 1701, @@ -7136,81 +7136,81 @@ ] }, { - "teal": 1706, - "source": 432, + "teal": 1710, + "source": 437, "pc": [ 1703, 1704 ] }, { - "teal": 1707, - "source": 432, + "teal": 1711, + "source": 437, "pc": [ 1705 ] }, { - "teal": 1708, - "source": 432, + "teal": 1712, + "source": 437, "pc": [ 1706 ] }, { - "teal": 1709, - "source": 432, + "teal": 1713, + "source": 437, "pc": [ 1707, 1708 ] }, { - "teal": 1710, - "source": 432, + "teal": 1714, + "source": 437, "pc": [ 1709 ] }, { - "teal": 1711, - "source": 432, + "teal": 1715, + "source": 437, "pc": [ 1710 ] }, { - "teal": 1712, - "source": 432, + "teal": 1716, + "source": 437, "pc": [ 1711, 1712 ] }, { - "teal": 1713, - "source": 432, + "teal": 1717, + "source": 437, "pc": [ 1713 ] }, { - "teal": 1714, - "source": 405, + "teal": 1718, + "source": 410, "pc": [ 1714 ] }, { - "teal": 1719, - "source": 446, + "teal": 1723, + "source": 451, "pc": [ 1715 ] }, { - "teal": 1722, - "source": 446, + "teal": 1726, + "source": 451, "pc": [ 1716, 1717, @@ -7218,15 +7218,15 @@ ] }, { - "teal": 1723, - "source": 446, + "teal": 1727, + "source": 451, "pc": [ 1719 ] }, { - "teal": 1726, - "source": 446, + "teal": 1730, + "source": 451, "pc": [ 1720, 1721, @@ -7234,74 +7234,74 @@ ] }, { - "teal": 1727, - "source": 446, + "teal": 1731, + "source": 451, "pc": [ 1723 ] }, { - "teal": 1730, - "source": 446, + "teal": 1734, + "source": 451, "pc": [ 1724, 1725 ] }, { - "teal": 1731, - "source": 446, + "teal": 1735, + "source": 451, "pc": [ 1726 ] }, { - "teal": 1732, - "source": 446, + "teal": 1736, + "source": 451, "pc": [ 1727 ] }, { - "teal": 1733, - "source": 446, + "teal": 1737, + "source": 451, "pc": [ 1728 ] }, { - "teal": 1734, - "source": 446, + "teal": 1738, + "source": 451, "pc": [ 1729, 1730 ] }, { - "teal": 1735, - "source": 446, + "teal": 1739, + "source": 451, "pc": [ 1731 ] }, { - "teal": 1736, - "source": 446, + "teal": 1740, + "source": 451, "pc": [ 1732 ] }, { - "teal": 1739, - "source": 446, + "teal": 1743, + "source": 451, "errorMessage": "argument 2 (mbrPayment) for addPool must be a pay transaction", "pc": [ 1733 ] }, { - "teal": 1742, - "source": 446, + "teal": 1746, + "source": 451, "pc": [ 1734, 1735, @@ -7309,36 +7309,36 @@ ] }, { - "teal": 1743, - "source": 446, + "teal": 1747, + "source": 451, "pc": [ 1737 ] }, { - "teal": 1744, - "source": 446, + "teal": 1748, + "source": 451, "pc": [ 1738 ] }, { - "teal": 1745, - "source": 446, + "teal": 1749, + "source": 451, "pc": [ 1739 ] }, { - "teal": 1746, - "source": 446, + "teal": 1750, + "source": 451, "pc": [ 1740 ] }, { - "teal": 1759, - "source": 446, + "teal": 1763, + "source": 451, "pc": [ 1741, 1742, @@ -7346,30 +7346,30 @@ ] }, { - "teal": 1762, - "source": 446, + "teal": 1766, + "source": 451, "pc": [ 1744 ] }, { - "teal": 1763, - "source": 446, + "teal": 1767, + "source": 451, "pc": [ 1745 ] }, { - "teal": 1767, - "source": 447, + "teal": 1771, + "source": 452, "pc": [ 1746, 1747 ] }, { - "teal": 1768, - "source": 447, + "teal": 1772, + "source": 452, "pc": [ 1748, 1749, @@ -7377,63 +7377,63 @@ ] }, { - "teal": 1773, - "source": 450, + "teal": 1777, + "source": 455, "pc": [ 1751, 1752 ] }, { - "teal": 1774, - "source": 450, + "teal": 1778, + "source": 455, "pc": [ 1753, 1754 ] }, { - "teal": 1775, - "source": 450, + "teal": 1779, + "source": 455, "pc": [ 1755, 1756 ] }, { - "teal": 1776, - "source": 450, + "teal": 1780, + "source": 455, "pc": [ 1757 ] }, { - "teal": 1779, - "source": 450, + "teal": 1783, + "source": 455, "errorMessage": "transaction verification failed: {\"txn\":\"mbrPayment\",\"field\":\"receiver\",\"expected\":\"this.app.address\"}", "pc": [ 1758 ] }, { - "teal": 1782, - "source": 450, + "teal": 1786, + "source": 455, "pc": [ 1759, 1760 ] }, { - "teal": 1783, - "source": 450, + "teal": 1787, + "source": 455, "pc": [ 1761, 1762 ] }, { - "teal": 1784, - "source": 450, + "teal": 1788, + "source": 455, "pc": [ 1763, 1764, @@ -7441,8 +7441,8 @@ ] }, { - "teal": 1785, - "source": 450, + "teal": 1789, + "source": 455, "pc": [ 1766, 1767, @@ -7450,185 +7450,185 @@ ] }, { - "teal": 1786, - "source": 450, + "teal": 1790, + "source": 455, "pc": [ 1769 ] }, { - "teal": 1787, - "source": 450, + "teal": 1791, + "source": 455, "pc": [ 1770 ] }, { - "teal": 1790, - "source": 450, + "teal": 1794, + "source": 455, "errorMessage": "transaction verification failed: {\"txn\":\"mbrPayment\",\"field\":\"amount\",\"expected\":\"this.getMbrAmounts().addPoolMbr\"}", "pc": [ 1771 ] }, { - "teal": 1794, - "source": 452, + "teal": 1798, + "source": 457, "pc": [ 1772 ] }, { - "teal": 1795, - "source": 452, + "teal": 1799, + "source": 457, "pc": [ 1773, 1774 ] }, { - "teal": 1796, - "source": 452, + "teal": 1800, + "source": 457, "pc": [ 1775 ] }, { - "teal": 1797, - "source": 452, + "teal": 1801, + "source": 457, "pc": [ 1776 ] }, { - "teal": 1798, - "source": 452, + "teal": 1802, + "source": 457, "pc": [ 1777 ] }, { - "teal": 1799, - "source": 452, + "teal": 1803, + "source": 457, "pc": [ 1778 ] }, { - "teal": 1800, - "source": 452, + "teal": 1804, + "source": 457, "pc": [ 1779 ] }, { - "teal": 1803, - "source": 452, + "teal": 1807, + "source": 457, "errorMessage": "specified validator id isn't valid", "pc": [ 1780 ] }, { - "teal": 1807, - "source": 454, + "teal": 1811, + "source": 459, "pc": [ 1781, 1782 ] }, { - "teal": 1808, - "source": 454, + "teal": 1812, + "source": 459, "pc": [ 1783, 1784 ] }, { - "teal": 1809, - "source": 454, + "teal": 1813, + "source": 459, "pc": [ 1785 ] }, { - "teal": 1810, - "source": 454, + "teal": 1814, + "source": 459, "pc": [ 1786, 1787 ] }, { - "teal": 1811, - "source": 454, + "teal": 1815, + "source": 459, "pc": [ 1788 ] }, { - "teal": 1812, - "source": 454, + "teal": 1816, + "source": 459, "pc": [ 1789 ] }, { - "teal": 1813, - "source": 454, + "teal": 1817, + "source": 459, "pc": [ 1790, 1791 ] }, { - "teal": 1814, - "source": 454, + "teal": 1818, + "source": 459, "pc": [ 1792 ] }, { - "teal": 1815, - "source": 454, + "teal": 1819, + "source": 459, "pc": [ 1793 ] }, { - "teal": 1816, - "source": 454, + "teal": 1820, + "source": 459, "pc": [ 1794, 1795 ] }, { - "teal": 1821, - "source": 455, + "teal": 1825, + "source": 460, "pc": [ 1796, 1797 ] }, { - "teal": 1822, + "teal": 1826, "source": 58, "pc": [ 1798 ] }, { - "teal": 1823, - "source": 455, + "teal": 1827, + "source": 460, "pc": [ 1799 ] }, { - "teal": 1824, - "source": 455, + "teal": 1828, + "source": 460, "pc": [ 1800, 1801, @@ -7636,191 +7636,191 @@ ] }, { - "teal": 1828, - "source": 456, + "teal": 1832, + "source": 461, "errorMessage": "already at max pool size", "pc": [ 1803 ] }, { - "teal": 1833, - "source": 458, + "teal": 1837, + "source": 463, "pc": [ 1804, 1805 ] }, { - "teal": 1834, - "source": 458, + "teal": 1838, + "source": 463, "pc": [ 1806 ] }, { - "teal": 1835, - "source": 458, + "teal": 1839, + "source": 463, "pc": [ 1807 ] }, { - "teal": 1836, - "source": 458, + "teal": 1840, + "source": 463, "pc": [ 1808, 1809 ] }, { - "teal": 1858, - "source": 461, + "teal": 1862, + "source": 466, "pc": [ 1810 ] }, { - "teal": 1859, - "source": 461, + "teal": 1863, + "source": 466, "pc": [ 1811, 1812 ] }, { - "teal": 1860, - "source": 461, + "teal": 1864, + "source": 466, "pc": [ 1813, 1814 ] }, { - "teal": 1864, - "source": 462, + "teal": 1868, + "source": 467, "pc": [ 1815 ] }, { - "teal": 1865, - "source": 462, + "teal": 1869, + "source": 467, "pc": [ 1816, 1817 ] }, { - "teal": 1872, - "source": 464, + "teal": 1876, + "source": 469, "pc": [ 1818, 1819 ] }, { - "teal": 1873, - "source": 464, + "teal": 1877, + "source": 469, "pc": [ 1820 ] }, { - "teal": 1874, - "source": 464, + "teal": 1878, + "source": 469, "pc": [ 1821, 1822 ] }, { - "teal": 1875, - "source": 464, + "teal": 1879, + "source": 469, "pc": [ 1823 ] }, { - "teal": 1876, - "source": 464, + "teal": 1880, + "source": 469, "pc": [ 1824, 1825 ] }, { - "teal": 1877, - "source": 465, + "teal": 1881, + "source": 470, "pc": [ 1826, 1827 ] }, { - "teal": 1878, - "source": 465, + "teal": 1882, + "source": 470, "pc": [ 1828, 1829 ] }, { - "teal": 1879, - "source": 465, + "teal": 1883, + "source": 470, "pc": [ 1830, 1831 ] }, { - "teal": 1880, - "source": 465, + "teal": 1884, + "source": 470, "pc": [ 1832 ] }, { - "teal": 1883, - "source": 465, + "teal": 1887, + "source": 470, "errorMessage": "box value does not exist: this.stakingPoolApprovalProgram.size", "pc": [ 1833 ] }, { - "teal": 1884, - "source": 465, + "teal": 1888, + "source": 470, "pc": [ 1834, 1835 ] }, { - "teal": 1885, - "source": 465, + "teal": 1889, + "source": 470, "pc": [ 1836 ] }, { - "teal": 1886, - "source": 465, + "teal": 1890, + "source": 470, "pc": [ 1837 ] }, { - "teal": 1887, - "source": 465, + "teal": 1891, + "source": 470, "pc": [ 1838, 1839 ] }, { - "teal": 1891, - "source": 467, + "teal": 1895, + "source": 472, "pc": [ 1840, 1841, @@ -7828,64 +7828,64 @@ ] }, { - "teal": 1892, - "source": 467, + "teal": 1896, + "source": 472, "pc": [ 1843, 1844 ] }, { - "teal": 1896, - "source": 468, + "teal": 1900, + "source": 473, "pc": [ 1845, 1846 ] }, { - "teal": 1897, - "source": 468, + "teal": 1901, + "source": 473, "pc": [ 1847, 1848 ] }, { - "teal": 1901, - "source": 469, + "teal": 1905, + "source": 474, "pc": [ 1849, 1850 ] }, { - "teal": 1902, - "source": 469, + "teal": 1906, + "source": 474, "pc": [ 1851, 1852 ] }, { - "teal": 1906, - "source": 470, + "teal": 1910, + "source": 475, "pc": [ 1853, 1854 ] }, { - "teal": 1907, - "source": 470, + "teal": 1911, + "source": 475, "pc": [ 1855, 1856 ] }, { - "teal": 1918, - "source": 473, + "teal": 1922, + "source": 478, "pc": [ 1857, 1858, @@ -7896,16 +7896,16 @@ ] }, { - "teal": 1919, - "source": 473, + "teal": 1923, + "source": 478, "pc": [ 1863, 1864 ] }, { - "teal": 1920, - "source": 474, + "teal": 1924, + "source": 479, "pc": [ 1865, 1866, @@ -7913,195 +7913,195 @@ ] }, { - "teal": 1921, - "source": 474, + "teal": 1925, + "source": 479, "pc": [ 1868 ] }, { - "teal": 1922, - "source": 474, + "teal": 1926, + "source": 479, "pc": [ 1869, 1870 ] }, { - "teal": 1923, - "source": 475, + "teal": 1927, + "source": 480, "pc": [ 1871, 1872 ] }, { - "teal": 1924, - "source": 475, + "teal": 1928, + "source": 480, "pc": [ 1873 ] }, { - "teal": 1925, - "source": 475, + "teal": 1929, + "source": 480, "pc": [ 1874, 1875 ] }, { - "teal": 1926, - "source": 476, + "teal": 1930, + "source": 481, "pc": [ 1876, 1877 ] }, { - "teal": 1927, - "source": 476, + "teal": 1931, + "source": 481, "pc": [ 1878 ] }, { - "teal": 1928, - "source": 476, + "teal": 1932, + "source": 481, "pc": [ 1879, 1880 ] }, { - "teal": 1929, - "source": 477, + "teal": 1933, + "source": 482, "pc": [ 1881, 1882 ] }, { - "teal": 1930, - "source": 477, + "teal": 1934, + "source": 482, "pc": [ 1883 ] }, { - "teal": 1931, - "source": 477, + "teal": 1935, + "source": 482, "pc": [ 1884 ] }, { - "teal": 1932, - "source": 477, + "teal": 1936, + "source": 482, "pc": [ 1885, 1886 ] }, { - "teal": 1933, - "source": 477, + "teal": 1937, + "source": 482, "pc": [ 1887 ] }, { - "teal": 1934, - "source": 477, + "teal": 1938, + "source": 482, "pc": [ 1888 ] }, { - "teal": 1935, - "source": 477, + "teal": 1939, + "source": 482, "pc": [ 1889, 1890 ] }, { - "teal": 1936, - "source": 477, + "teal": 1940, + "source": 482, "pc": [ 1891 ] }, { - "teal": 1937, - "source": 477, + "teal": 1941, + "source": 482, "pc": [ 1892 ] }, { - "teal": 1938, - "source": 477, + "teal": 1942, + "source": 482, "pc": [ 1893 ] }, { - "teal": 1939, - "source": 477, + "teal": 1943, + "source": 482, "pc": [ 1894, 1895 ] }, { - "teal": 1942, - "source": 461, + "teal": 1946, + "source": 466, "pc": [ 1896 ] }, { - "teal": 1943, - "source": 461, + "teal": 1947, + "source": 466, "pc": [ 1897, 1898 ] }, { - "teal": 1946, - "source": 461, + "teal": 1950, + "source": 466, "pc": [ 1899 ] }, { - "teal": 1950, - "source": 481, + "teal": 1954, + "source": 486, "pc": [ 1900, 1901 ] }, { - "teal": 1951, - "source": 481, + "teal": 1955, + "source": 486, "pc": [ 1902, 1903 ] }, { - "teal": 1952, - "source": 481, + "teal": 1956, + "source": 486, "pc": [ 1904 ] }, { - "teal": 1953, - "source": 481, + "teal": 1957, + "source": 486, "pc": [ 1905, 1906, @@ -8109,217 +8109,217 @@ ] }, { - "teal": 1954, - "source": 481, + "teal": 1958, + "source": 486, "pc": [ 1908 ] }, { - "teal": 1955, - "source": 481, + "teal": 1959, + "source": 486, "pc": [ 1909, 1910 ] }, { - "teal": 1956, - "source": 481, + "teal": 1960, + "source": 486, "pc": [ 1911 ] }, { - "teal": 1957, - "source": 481, + "teal": 1961, + "source": 486, "pc": [ 1912 ] }, { - "teal": 1958, - "source": 481, + "teal": 1962, + "source": 486, "pc": [ 1913, 1914 ] }, { - "teal": 1959, - "source": 481, + "teal": 1963, + "source": 486, "pc": [ 1915 ] }, { - "teal": 1963, - "source": 484, + "teal": 1967, + "source": 489, "pc": [ 1916, 1917 ] }, { - "teal": 1964, - "source": 484, + "teal": 1968, + "source": 489, "pc": [ 1918, 1919 ] }, { - "teal": 1968, - "source": 485, + "teal": 1972, + "source": 490, "pc": [ 1920, 1921 ] }, { - "teal": 1969, - "source": 485, + "teal": 1973, + "source": 490, "pc": [ 1922, 1923 ] }, { - "teal": 1970, - "source": 485, + "teal": 1974, + "source": 490, "pc": [ 1924 ] }, { - "teal": 1971, - "source": 485, + "teal": 1975, + "source": 490, "pc": [ 1925 ] }, { - "teal": 1972, - "source": 485, + "teal": 1976, + "source": 490, "pc": [ 1926, 1927 ] }, { - "teal": 1973, - "source": 485, + "teal": 1977, + "source": 490, "pc": [ 1928 ] }, { - "teal": 1974, - "source": 485, + "teal": 1978, + "source": 490, "pc": [ 1929 ] }, { - "teal": 1975, - "source": 485, + "teal": 1979, + "source": 490, "pc": [ 1930 ] }, { - "teal": 1976, - "source": 485, + "teal": 1980, + "source": 490, "pc": [ 1931 ] }, { - "teal": 1977, - "source": 485, + "teal": 1981, + "source": 490, "pc": [ 1932, 1933 ] }, { - "teal": 1978, - "source": 485, + "teal": 1982, + "source": 490, "pc": [ 1934 ] }, { - "teal": 1979, - "source": 485, + "teal": 1983, + "source": 490, "pc": [ 1935 ] }, { - "teal": 1980, - "source": 485, + "teal": 1984, + "source": 490, "pc": [ 1936, 1937 ] }, { - "teal": 1981, - "source": 485, + "teal": 1985, + "source": 490, "pc": [ 1938 ] }, { - "teal": 1982, - "source": 485, + "teal": 1986, + "source": 490, "pc": [ 1939 ] }, { - "teal": 1983, - "source": 485, + "teal": 1987, + "source": 490, "pc": [ 1940, 1941 ] }, { - "teal": 1984, - "source": 485, + "teal": 1988, + "source": 490, "pc": [ 1942 ] }, { - "teal": 1988, - "source": 486, + "teal": 1992, + "source": 491, "pc": [ 1943, 1944 ] }, { - "teal": 1989, - "source": 486, + "teal": 1993, + "source": 491, "pc": [ 1945, 1946 ] }, { - "teal": 1990, - "source": 486, + "teal": 1994, + "source": 491, "pc": [ 1947, 1948 ] }, { - "teal": 1991, - "source": 486, + "teal": 1995, + "source": 491, "pc": [ 1949, 1950, @@ -8327,8 +8327,8 @@ ] }, { - "teal": 1999, - "source": 488, + "teal": 2003, + "source": 493, "pc": [ 1952, 1953, @@ -8339,75 +8339,75 @@ ] }, { - "teal": 2000, - "source": 489, + "teal": 2004, + "source": 494, "pc": [ 1958, 1959 ] }, { - "teal": 2001, - "source": 489, + "teal": 2005, + "source": 494, "pc": [ 1960 ] }, { - "teal": 2002, - "source": 490, + "teal": 2006, + "source": 495, "pc": [ 1961, 1962 ] }, { - "teal": 2003, - "source": 490, + "teal": 2007, + "source": 495, "pc": [ 1963 ] }, { - "teal": 2004, - "source": 490, + "teal": 2008, + "source": 495, "pc": [ 1964 ] }, { - "teal": 2005, - "source": 490, + "teal": 2009, + "source": 495, "pc": [ 1965 ] }, { - "teal": 2006, - "source": 490, + "teal": 2010, + "source": 495, "pc": [ 1966, 1967 ] }, { - "teal": 2007, - "source": 490, + "teal": 2011, + "source": 495, "pc": [ 1968 ] }, { - "teal": 2010, - "source": 490, + "teal": 2014, + "source": 495, "errorMessage": "numPools as uint16 overflowed 16 bits", "pc": [ 1969 ] }, { - "teal": 2011, - "source": 490, + "teal": 2015, + "source": 495, "pc": [ 1970, 1971, @@ -8415,140 +8415,140 @@ ] }, { - "teal": 2012, - "source": 490, + "teal": 2016, + "source": 495, "pc": [ 1973 ] }, { - "teal": 2013, - "source": 491, + "teal": 2017, + "source": 496, "pc": [ 1974, 1975 ] }, { - "teal": 2014, - "source": 491, + "teal": 2018, + "source": 496, "pc": [ 1976 ] }, { - "teal": 2015, - "source": 491, + "teal": 2019, + "source": 496, "pc": [ 1977 ] }, { - "teal": 2016, - "source": 488, + "teal": 2020, + "source": 493, "pc": [ 1978 ] }, { - "teal": 2017, - "source": 488, + "teal": 2021, + "source": 493, "pc": [ 1979 ] }, { - "teal": 2021, - "source": 494, + "teal": 2025, + "source": 499, "pc": [ 1980, 1981 ] }, { - "teal": 2022, - "source": 494, + "teal": 2026, + "source": 499, "pc": [ 1982 ] }, { - "teal": 2023, - "source": 494, + "teal": 2027, + "source": 499, "pc": [ 1983, 1984 ] }, { - "teal": 2024, - "source": 494, + "teal": 2028, + "source": 499, "pc": [ 1985 ] }, { - "teal": 2025, - "source": 494, + "teal": 2029, + "source": 499, "pc": [ 1986 ] }, { - "teal": 2026, - "source": 494, + "teal": 2030, + "source": 499, "pc": [ 1987, 1988 ] }, { - "teal": 2027, - "source": 494, + "teal": 2031, + "source": 499, "pc": [ 1989 ] }, { - "teal": 2028, - "source": 494, + "teal": 2032, + "source": 499, "pc": [ 1990 ] }, { - "teal": 2031, - "source": 446, + "teal": 2035, + "source": 451, "pc": [ 1991, 1992 ] }, { - "teal": 2034, - "source": 446, + "teal": 2038, + "source": 451, "pc": [ 1993, 1994 ] }, { - "teal": 2035, - "source": 446, + "teal": 2039, + "source": 451, "pc": [ 1995 ] }, { - "teal": 2040, - "source": 506, + "teal": 2044, + "source": 511, "pc": [ 1996 ] }, { - "teal": 2043, - "source": 506, + "teal": 2047, + "source": 511, "pc": [ 1997, 1998, @@ -8556,15 +8556,15 @@ ] }, { - "teal": 2044, - "source": 506, + "teal": 2048, + "source": 511, "pc": [ 2000 ] }, { - "teal": 2047, - "source": 506, + "teal": 2051, + "source": 511, "pc": [ 2001, 2002, @@ -8572,74 +8572,74 @@ ] }, { - "teal": 2048, - "source": 506, + "teal": 2052, + "source": 511, "pc": [ 2004 ] }, { - "teal": 2051, - "source": 506, + "teal": 2055, + "source": 511, "pc": [ 2005, 2006 ] }, { - "teal": 2052, - "source": 506, + "teal": 2056, + "source": 511, "pc": [ 2007 ] }, { - "teal": 2053, - "source": 506, + "teal": 2057, + "source": 511, "pc": [ 2008 ] }, { - "teal": 2054, - "source": 506, + "teal": 2058, + "source": 511, "pc": [ 2009 ] }, { - "teal": 2055, - "source": 506, + "teal": 2059, + "source": 511, "pc": [ 2010, 2011 ] }, { - "teal": 2056, - "source": 506, + "teal": 2060, + "source": 511, "pc": [ 2012 ] }, { - "teal": 2057, - "source": 506, + "teal": 2061, + "source": 511, "pc": [ 2013 ] }, { - "teal": 2060, - "source": 506, + "teal": 2064, + "source": 511, "errorMessage": "argument 2 (stakedAmountPayment) for addStake must be a pay transaction", "pc": [ 2014 ] }, { - "teal": 2063, - "source": 506, + "teal": 2067, + "source": 511, "pc": [ 2015, 2016, @@ -8647,36 +8647,36 @@ ] }, { - "teal": 2064, - "source": 506, + "teal": 2068, + "source": 511, "pc": [ 2018 ] }, { - "teal": 2065, - "source": 506, + "teal": 2069, + "source": 511, "pc": [ 2019 ] }, { - "teal": 2066, - "source": 506, + "teal": 2070, + "source": 511, "pc": [ 2020 ] }, { - "teal": 2067, - "source": 506, + "teal": 2071, + "source": 511, "pc": [ 2021 ] }, { - "teal": 2079, - "source": 506, + "teal": 2083, + "source": 511, "pc": [ 2022, 2023, @@ -8684,161 +8684,161 @@ ] }, { - "teal": 2082, - "source": 506, + "teal": 2086, + "source": 511, "pc": [ 2025 ] }, { - "teal": 2083, - "source": 506, + "teal": 2087, + "source": 511, "pc": [ 2026, 2027 ] }, { - "teal": 2087, - "source": 507, + "teal": 2091, + "source": 512, "pc": [ 2028 ] }, { - "teal": 2088, - "source": 507, + "teal": 2092, + "source": 512, "pc": [ 2029, 2030 ] }, { - "teal": 2089, - "source": 507, + "teal": 2093, + "source": 512, "pc": [ 2031 ] }, { - "teal": 2090, - "source": 507, + "teal": 2094, + "source": 512, "pc": [ 2032 ] }, { - "teal": 2091, - "source": 507, + "teal": 2095, + "source": 512, "pc": [ 2033 ] }, { - "teal": 2092, - "source": 507, + "teal": 2096, + "source": 512, "pc": [ 2034 ] }, { - "teal": 2093, - "source": 507, + "teal": 2097, + "source": 512, "pc": [ 2035 ] }, { - "teal": 2096, - "source": 507, + "teal": 2100, + "source": 512, "errorMessage": "specified validator id isn't valid", "pc": [ 2036 ] }, { - "teal": 2101, - "source": 510, + "teal": 2105, + "source": 515, "pc": [ 2037, 2038 ] }, { - "teal": 2102, - "source": 510, + "teal": 2106, + "source": 515, "pc": [ 2039 ] }, { - "teal": 2103, - "source": 510, + "teal": 2107, + "source": 515, "pc": [ 2040 ] }, { - "teal": 2104, - "source": 510, + "teal": 2108, + "source": 515, "pc": [ 2041, 2042 ] }, { - "teal": 2105, - "source": 510, + "teal": 2109, + "source": 515, "pc": [ 2043 ] }, { - "teal": 2106, - "source": 510, + "teal": 2110, + "source": 515, "pc": [ 2044 ] }, { - "teal": 2107, - "source": 510, + "teal": 2111, + "source": 515, "pc": [ 2045, 2046 ] }, { - "teal": 2108, - "source": 510, + "teal": 2112, + "source": 515, "pc": [ 2047 ] }, { - "teal": 2109, - "source": 510, + "teal": 2113, + "source": 515, "pc": [ 2048 ] }, { - "teal": 2110, - "source": 510, + "teal": 2114, + "source": 515, "pc": [ 2049 ] }, { - "teal": 2111, - "source": 510, + "teal": 2115, + "source": 515, "pc": [ 2050 ] }, { - "teal": 2112, - "source": 510, + "teal": 2116, + "source": 515, "pc": [ 2051, 2052, @@ -8846,207 +8846,207 @@ ] }, { - "teal": 2120, - "source": 513, + "teal": 2124, + "source": 518, "pc": [ 2054, 2055 ] }, { - "teal": 2121, - "source": 513, + "teal": 2125, + "source": 518, "pc": [ 2056 ] }, { - "teal": 2122, - "source": 513, + "teal": 2126, + "source": 518, "pc": [ 2057 ] }, { - "teal": 2123, - "source": 513, + "teal": 2127, + "source": 518, "pc": [ 2058, 2059 ] }, { - "teal": 2124, - "source": 513, + "teal": 2128, + "source": 518, "pc": [ 2060 ] }, { - "teal": 2125, - "source": 513, + "teal": 2129, + "source": 518, "pc": [ 2061 ] }, { - "teal": 2126, - "source": 513, + "teal": 2130, + "source": 518, "pc": [ 2062, 2063 ] }, { - "teal": 2127, - "source": 513, + "teal": 2131, + "source": 518, "pc": [ 2064 ] }, { - "teal": 2128, - "source": 513, + "teal": 2132, + "source": 518, "pc": [ 2065 ] }, { - "teal": 2129, - "source": 513, + "teal": 2133, + "source": 518, "pc": [ 2066, 2067 ] }, { - "teal": 2130, - "source": 513, + "teal": 2134, + "source": 518, "pc": [ 2068 ] }, { - "teal": 2133, - "source": 512, + "teal": 2137, + "source": 517, "errorMessage": "can't stake with a validator that is past its sunsetting time", "pc": [ 2069 ] }, { - "teal": 2138, - "source": 518, + "teal": 2142, + "source": 523, "pc": [ 2070, 2071 ] }, { - "teal": 2139, - "source": 518, + "teal": 2143, + "source": 523, "pc": [ 2072, 2073 ] }, { - "teal": 2147, - "source": 522, + "teal": 2151, + "source": 527, "pc": [ 2074, 2075 ] }, { - "teal": 2148, - "source": 523, + "teal": 2152, + "source": 528, "pc": [ 2076, 2077 ] }, { - "teal": 2149, - "source": 523, + "teal": 2153, + "source": 528, "pc": [ 2078, 2079 ] }, { - "teal": 2150, - "source": 523, + "teal": 2154, + "source": 528, "pc": [ 2080 ] }, { - "teal": 2153, - "source": 523, + "teal": 2157, + "source": 528, "errorMessage": "transaction verification failed: {\"txn\":\"stakedAmountPayment\",\"field\":\"sender\",\"expected\":\"staker\"}", "pc": [ 2081 ] }, { - "teal": 2156, - "source": 522, + "teal": 2160, + "source": 527, "pc": [ 2082, 2083 ] }, { - "teal": 2157, - "source": 524, + "teal": 2161, + "source": 529, "pc": [ 2084, 2085 ] }, { - "teal": 2158, - "source": 524, + "teal": 2162, + "source": 529, "pc": [ 2086, 2087 ] }, { - "teal": 2159, - "source": 524, + "teal": 2163, + "source": 529, "pc": [ 2088 ] }, { - "teal": 2162, - "source": 524, + "teal": 2166, + "source": 529, "errorMessage": "transaction verification failed: {\"txn\":\"stakedAmountPayment\",\"field\":\"receiver\",\"expected\":\"this.app.address\"}", "pc": [ 2089 ] }, { - "teal": 2166, - "source": 530, + "teal": 2170, + "source": 535, "pc": [ 2090, 2091 ] }, { - "teal": 2167, - "source": 530, + "teal": 2171, + "source": 535, "pc": [ 2092, 2093 ] }, { - "teal": 2168, - "source": 530, + "teal": 2172, + "source": 535, "pc": [ 2094, 2095, @@ -9054,55 +9054,55 @@ ] }, { - "teal": 2172, - "source": 532, + "teal": 2176, + "source": 537, "pc": [ 2097, 2098 ] }, { - "teal": 2173, - "source": 532, + "teal": 2177, + "source": 537, "pc": [ 2099, 2100 ] }, { - "teal": 2174, - "source": 532, + "teal": 2178, + "source": 537, "pc": [ 2101, 2102 ] }, { - "teal": 2178, - "source": 533, + "teal": 2182, + "source": 538, "pc": [ 2103 ] }, { - "teal": 2179, - "source": 533, + "teal": 2183, + "source": 538, "pc": [ 2104, 2105 ] }, { - "teal": 2184, - "source": 535, + "teal": 2188, + "source": 540, "pc": [ 2106, 2107 ] }, { - "teal": 2185, - "source": 535, + "teal": 2189, + "source": 540, "pc": [ 2108, 2109, @@ -9110,8 +9110,8 @@ ] }, { - "teal": 2186, - "source": 535, + "teal": 2190, + "source": 540, "pc": [ 2111, 2112, @@ -9119,8 +9119,8 @@ ] }, { - "teal": 2191, - "source": 538, + "teal": 2195, + "source": 543, "pc": [ 2114, 2115, @@ -9128,8 +9128,8 @@ ] }, { - "teal": 2192, - "source": 538, + "teal": 2196, + "source": 543, "pc": [ 2117, 2118, @@ -9137,76 +9137,76 @@ ] }, { - "teal": 2193, - "source": 538, + "teal": 2197, + "source": 543, "pc": [ 2120 ] }, { - "teal": 2194, - "source": 538, + "teal": 2198, + "source": 543, "pc": [ 2121, 2122 ] }, { - "teal": 2198, - "source": 539, + "teal": 2202, + "source": 544, "pc": [ 2123, 2124 ] }, { - "teal": 2199, - "source": 539, + "teal": 2203, + "source": 544, "pc": [ 2125, 2126 ] }, { - "teal": 2200, - "source": 539, + "teal": 2204, + "source": 544, "pc": [ 2127 ] }, { - "teal": 2201, - "source": 539, + "teal": 2205, + "source": 544, "pc": [ 2128, 2129 ] }, { - "teal": 2205, - "source": 540, + "teal": 2209, + "source": 545, "pc": [ 2130 ] }, { - "teal": 2206, - "source": 540, + "teal": 2210, + "source": 545, "pc": [ 2131, 2132 ] }, { - "teal": 2207, - "source": 540, + "teal": 2211, + "source": 545, "pc": [ 2133 ] }, { - "teal": 2208, - "source": 540, + "teal": 2212, + "source": 545, "pc": [ 2134, 2135, @@ -9214,103 +9214,103 @@ ] }, { - "teal": 2209, - "source": 540, + "teal": 2213, + "source": 545, "pc": [ 2137 ] }, { - "teal": 2210, - "source": 540, + "teal": 2214, + "source": 545, "pc": [ 2138 ] }, { - "teal": 2218, - "source": 545, + "teal": 2222, + "source": 550, "pc": [ 2139, 2140 ] }, { - "teal": 2219, - "source": 545, + "teal": 2223, + "source": 550, "pc": [ 2141 ] }, { - "teal": 2220, - "source": 545, + "teal": 2224, + "source": 550, "pc": [ 2142 ] }, { - "teal": 2221, - "source": 545, + "teal": 2225, + "source": 550, "pc": [ 2143, 2144 ] }, { - "teal": 2222, - "source": 545, + "teal": 2226, + "source": 550, "pc": [ 2145 ] }, { - "teal": 2223, - "source": 545, + "teal": 2227, + "source": 550, "pc": [ 2146 ] }, { - "teal": 2224, - "source": 545, + "teal": 2228, + "source": 550, "pc": [ 2147, 2148 ] }, { - "teal": 2225, - "source": 545, + "teal": 2229, + "source": 550, "pc": [ 2149 ] }, { - "teal": 2226, - "source": 545, + "teal": 2230, + "source": 550, "pc": [ 2150 ] }, { - "teal": 2227, - "source": 545, + "teal": 2231, + "source": 550, "pc": [ 2151, 2152 ] }, { - "teal": 2228, - "source": 545, + "teal": 2232, + "source": 550, "pc": [ 2153 ] }, { - "teal": 2229, - "source": 545, + "teal": 2233, + "source": 550, "pc": [ 2154, 2155, @@ -9318,47 +9318,47 @@ ] }, { - "teal": 2230, - "source": 545, + "teal": 2234, + "source": 550, "pc": [ 2157 ] }, { - "teal": 2233, - "source": 544, + "teal": 2237, + "source": 549, "errorMessage": "total staked for all of a validators pools may not exceed hard cap", "pc": [ 2158 ] }, { - "teal": 2237, - "source": 551, + "teal": 2241, + "source": 556, "pc": [ 2159, 2160 ] }, { - "teal": 2238, - "source": 551, + "teal": 2242, + "source": 556, "pc": [ 2161, 2162 ] }, { - "teal": 2239, - "source": 551, + "teal": 2243, + "source": 556, "pc": [ 2163, 2164 ] }, { - "teal": 2240, - "source": 551, + "teal": 2244, + "source": 556, "pc": [ 2165, 2166, @@ -9366,87 +9366,87 @@ ] }, { - "teal": 2241, - "source": 551, + "teal": 2245, + "source": 556, "pc": [ 2168, 2169 ] }, { - "teal": 2247, - "source": 553, + "teal": 2251, + "source": 558, "pc": [ 2170, 2171 ] }, { - "teal": 2248, - "source": 553, + "teal": 2252, + "source": 558, "pc": [ 2172, 2173 ] }, { - "teal": 2249, - "source": 553, + "teal": 2253, + "source": 558, "pc": [ 2174, 2175 ] }, { - "teal": 2250, - "source": 553, + "teal": 2254, + "source": 558, "pc": [ 2176, 2177 ] }, { - "teal": 2251, - "source": 553, + "teal": 2255, + "source": 558, "pc": [ 2178 ] }, { - "teal": 2252, - "source": 553, + "teal": 2256, + "source": 558, "pc": [ 2179, 2180 ] }, { - "teal": 2256, - "source": 554, + "teal": 2260, + "source": 559, "pc": [ 2181, 2182 ] }, { - "teal": 2257, - "source": 554, + "teal": 2261, + "source": 559, "pc": [ 2183, 2184 ] }, { - "teal": 2258, - "source": 554, + "teal": 2262, + "source": 559, "pc": [ 2185, 2186 ] }, { - "teal": 2259, - "source": 554, + "teal": 2263, + "source": 559, "pc": [ 2187, 2188, @@ -9454,47 +9454,47 @@ ] }, { - "teal": 2260, - "source": 554, + "teal": 2264, + "source": 559, "pc": [ 2190 ] }, { - "teal": 2261, - "source": 554, + "teal": 2265, + "source": 559, "pc": [ 2191, 2192 ] }, { - "teal": 2266, - "source": 555, + "teal": 2270, + "source": 560, "pc": [ 2193, 2194 ] }, { - "teal": 2267, - "source": 555, + "teal": 2271, + "source": 560, "pc": [ 2195, 2196 ] }, { - "teal": 2268, - "source": 555, + "teal": 2272, + "source": 560, "pc": [ 2197, 2198 ] }, { - "teal": 2269, - "source": 555, + "teal": 2273, + "source": 560, "pc": [ 2199, 2200, @@ -9502,29 +9502,29 @@ ] }, { - "teal": 2270, - "source": 555, + "teal": 2274, + "source": 560, "pc": [ 2202 ] }, { - "teal": 2271, - "source": 555, + "teal": 2275, + "source": 560, "pc": [ 2203 ] }, { - "teal": 2272, - "source": 555, + "teal": 2276, + "source": 560, "pc": [ 2204 ] }, { - "teal": 2273, - "source": 555, + "teal": 2277, + "source": 560, "pc": [ 2205, 2206, @@ -9532,40 +9532,40 @@ ] }, { - "teal": 2277, - "source": 556, + "teal": 2281, + "source": 561, "errorMessage": "No pool available with free stake. Validator needs to add another pool", "pc": [ 2208 ] }, { - "teal": 2282, - "source": 560, + "teal": 2286, + "source": 565, "pc": [ 2209, 2210 ] }, { - "teal": 2283, - "source": 560, + "teal": 2287, + "source": 565, "pc": [ 2211, 2212 ] }, { - "teal": 2284, - "source": 560, + "teal": 2288, + "source": 565, "pc": [ 2213, 2214 ] }, { - "teal": 2285, - "source": 560, + "teal": 2289, + "source": 565, "pc": [ 2215, 2216, @@ -9573,16 +9573,16 @@ ] }, { - "teal": 2286, - "source": 560, + "teal": 2290, + "source": 565, "pc": [ 2218, 2219 ] }, { - "teal": 2287, - "source": 560, + "teal": 2291, + "source": 565, "pc": [ 2220, 2221, @@ -9590,56 +9590,56 @@ ] }, { - "teal": 2297, - "source": 568, + "teal": 2301, + "source": 573, "pc": [ 2223, 2224 ] }, { - "teal": 2298, - "source": 567, + "teal": 2302, + "source": 572, "pc": [ 2225, 2226 ] }, { - "teal": 2299, - "source": 566, + "teal": 2303, + "source": 571, "pc": [ 2227, 2228 ] }, { - "teal": 2300, - "source": 565, + "teal": 2304, + "source": 570, "pc": [ 2229, 2230 ] }, { - "teal": 2301, - "source": 565, + "teal": 2305, + "source": 570, "pc": [ 2231, 2232 ] }, { - "teal": 2302, - "source": 565, + "teal": 2306, + "source": 570, "pc": [ 2233, 2234 ] }, { - "teal": 2303, - "source": 565, + "teal": 2307, + "source": 570, "pc": [ 2235, 2236, @@ -9647,16 +9647,16 @@ ] }, { - "teal": 2304, - "source": 564, + "teal": 2308, + "source": 569, "pc": [ 2238, 2239 ] }, { - "teal": 2305, - "source": 563, + "teal": 2309, + "source": 568, "pc": [ 2240, 2241, @@ -9664,8 +9664,8 @@ ] }, { - "teal": 2315, - "source": 570, + "teal": 2319, + "source": 575, "pc": [ 2243, 2244, @@ -9676,47 +9676,47 @@ ] }, { - "teal": 2316, - "source": 571, + "teal": 2320, + "source": 576, "pc": [ 2249, 2250 ] }, { - "teal": 2317, - "source": 571, + "teal": 2321, + "source": 576, "pc": [ 2251 ] }, { - "teal": 2318, - "source": 572, + "teal": 2322, + "source": 577, "pc": [ 2252, 2253 ] }, { - "teal": 2319, - "source": 572, + "teal": 2323, + "source": 577, "pc": [ 2254, 2255 ] }, { - "teal": 2320, - "source": 572, + "teal": 2324, + "source": 577, "pc": [ 2256, 2257 ] }, { - "teal": 2321, - "source": 572, + "teal": 2325, + "source": 577, "pc": [ 2258, 2259, @@ -9724,59 +9724,59 @@ ] }, { - "teal": 2322, - "source": 572, + "teal": 2326, + "source": 577, "pc": [ 2261 ] }, { - "teal": 2323, - "source": 572, + "teal": 2327, + "source": 577, "pc": [ 2262 ] }, { - "teal": 2324, - "source": 572, + "teal": 2328, + "source": 577, "pc": [ 2263 ] }, { - "teal": 2325, - "source": 572, + "teal": 2329, + "source": 577, "pc": [ 2264 ] }, { - "teal": 2326, - "source": 572, + "teal": 2330, + "source": 577, "pc": [ 2265, 2266 ] }, { - "teal": 2327, - "source": 572, + "teal": 2331, + "source": 577, "pc": [ 2267 ] }, { - "teal": 2330, - "source": 572, + "teal": 2334, + "source": 577, "errorMessage": "poolKey.poolId as uint16 overflowed 16 bits", "pc": [ 2268 ] }, { - "teal": 2331, - "source": 572, + "teal": 2335, + "source": 577, "pc": [ 2269, 2270, @@ -9784,39 +9784,39 @@ ] }, { - "teal": 2332, - "source": 572, + "teal": 2336, + "source": 577, "pc": [ 2272 ] }, { - "teal": 2333, - "source": 573, + "teal": 2337, + "source": 578, "pc": [ 2273, 2274 ] }, { - "teal": 2334, - "source": 573, + "teal": 2338, + "source": 578, "pc": [ 2275, 2276 ] }, { - "teal": 2335, - "source": 573, + "teal": 2339, + "source": 578, "pc": [ 2277, 2278 ] }, { - "teal": 2336, - "source": 573, + "teal": 2340, + "source": 578, "pc": [ 2279, 2280, @@ -9824,104 +9824,104 @@ ] }, { - "teal": 2337, - "source": 573, + "teal": 2341, + "source": 578, "pc": [ 2282 ] }, { - "teal": 2338, - "source": 573, + "teal": 2342, + "source": 578, "pc": [ 2283 ] }, { - "teal": 2339, - "source": 573, + "teal": 2343, + "source": 578, "pc": [ 2284 ] }, { - "teal": 2340, - "source": 575, + "teal": 2344, + "source": 580, "pc": [ 2285, 2286 ] }, { - "teal": 2341, - "source": 575, + "teal": 2345, + "source": 580, "pc": [ 2287 ] }, { - "teal": 2342, - "source": 574, + "teal": 2346, + "source": 579, "pc": [ 2288, 2289 ] }, { - "teal": 2343, - "source": 574, + "teal": 2347, + "source": 579, "pc": [ 2290 ] }, { - "teal": 2344, - "source": 574, + "teal": 2348, + "source": 579, "pc": [ 2291 ] }, { - "teal": 2345, - "source": 570, + "teal": 2349, + "source": 575, "pc": [ 2292 ] }, { - "teal": 2346, - "source": 570, + "teal": 2350, + "source": 575, "pc": [ 2293 ] }, { - "teal": 2350, - "source": 578, + "teal": 2354, + "source": 583, "pc": [ 2294, 2295 ] }, { - "teal": 2351, - "source": 578, + "teal": 2355, + "source": 583, "pc": [ 2296, 2297 ] }, { - "teal": 2352, - "source": 578, + "teal": 2356, + "source": 583, "pc": [ 2298, 2299 ] }, { - "teal": 2353, - "source": 578, + "teal": 2357, + "source": 583, "pc": [ 2300, 2301, @@ -9929,38 +9929,38 @@ ] }, { - "teal": 2356, - "source": 506, + "teal": 2360, + "source": 511, "pc": [ 2303, 2304 ] }, { - "teal": 2359, - "source": 506, + "teal": 2363, + "source": 511, "pc": [ 2305, 2306 ] }, { - "teal": 2360, - "source": 506, + "teal": 2364, + "source": 511, "pc": [ 2307 ] }, { - "teal": 2365, - "source": 596, + "teal": 2369, + "source": 601, "pc": [ 2308 ] }, { - "teal": 2368, - "source": 596, + "teal": 2372, + "source": 601, "pc": [ 2309, 2310, @@ -9968,15 +9968,15 @@ ] }, { - "teal": 2369, - "source": 596, + "teal": 2373, + "source": 601, "pc": [ 2312 ] }, { - "teal": 2372, - "source": 596, + "teal": 2376, + "source": 601, "pc": [ 2313, 2314, @@ -9984,36 +9984,36 @@ ] }, { - "teal": 2373, - "source": 596, + "teal": 2377, + "source": 601, "pc": [ 2316 ] }, { - "teal": 2374, - "source": 596, + "teal": 2378, + "source": 601, "pc": [ 2317 ] }, { - "teal": 2375, - "source": 596, + "teal": 2379, + "source": 601, "pc": [ 2318 ] }, { - "teal": 2376, - "source": 596, + "teal": 2380, + "source": 601, "pc": [ 2319 ] }, { - "teal": 2394, - "source": 596, + "teal": 2398, + "source": 601, "pc": [ 2320, 2321, @@ -10021,164 +10021,164 @@ ] }, { - "teal": 2397, - "source": 596, + "teal": 2401, + "source": 601, "pc": [ 2323 ] }, { - "teal": 2398, - "source": 596, + "teal": 2402, + "source": 601, "pc": [ 2324, 2325 ] }, { - "teal": 2402, - "source": 598, + "teal": 2406, + "source": 603, "pc": [ 2326, 2327 ] }, { - "teal": 2403, - "source": 598, + "teal": 2407, + "source": 603, "pc": [ 2328 ] }, { - "teal": 2404, - "source": 598, + "teal": 2408, + "source": 603, "pc": [ 2329 ] }, { - "teal": 2405, - "source": 598, + "teal": 2409, + "source": 603, "pc": [ 2330, 2331 ] }, { - "teal": 2406, - "source": 598, + "teal": 2410, + "source": 603, "pc": [ 2332 ] }, { - "teal": 2407, - "source": 598, + "teal": 2411, + "source": 603, "pc": [ 2333 ] }, { - "teal": 2408, - "source": 598, + "teal": 2412, + "source": 603, "pc": [ 2334, 2335 ] }, { - "teal": 2409, - "source": 598, + "teal": 2413, + "source": 603, "pc": [ 2336 ] }, { - "teal": 2410, - "source": 598, + "teal": 2414, + "source": 603, "pc": [ 2337 ] }, { - "teal": 2411, - "source": 598, + "teal": 2415, + "source": 603, "pc": [ 2338, 2339 ] }, { - "teal": 2415, - "source": 599, + "teal": 2419, + "source": 604, "pc": [ 2340, 2341 ] }, { - "teal": 2416, - "source": 599, + "teal": 2420, + "source": 604, "pc": [ 2342 ] }, { - "teal": 2417, - "source": 599, + "teal": 2421, + "source": 604, "pc": [ 2343 ] }, { - "teal": 2418, - "source": 599, + "teal": 2422, + "source": 604, "pc": [ 2344 ] }, { - "teal": 2423, - "source": 601, + "teal": 2427, + "source": 606, "pc": [ 2345, 2346 ] }, { - "teal": 2424, - "source": 601, + "teal": 2428, + "source": 606, "pc": [ 2347, 2348 ] }, { - "teal": 2425, - "source": 601, + "teal": 2429, + "source": 606, "pc": [ 2349, 2350 ] }, { - "teal": 2426, - "source": 601, + "teal": 2430, + "source": 606, "pc": [ 2351 ] }, { - "teal": 2427, - "source": 601, + "teal": 2431, + "source": 606, "pc": [ 2352 ] }, { - "teal": 2428, - "source": 601, + "teal": 2432, + "source": 606, "pc": [ 2353, 2354, @@ -10186,68 +10186,68 @@ ] }, { - "teal": 2433, - "source": 602, + "teal": 2437, + "source": 607, "pc": [ 2356, 2357 ] }, { - "teal": 2434, - "source": 602, + "teal": 2438, + "source": 607, "pc": [ 2358, 2359 ] }, { - "teal": 2435, - "source": 602, + "teal": 2439, + "source": 607, "pc": [ 2360 ] }, { - "teal": 2436, - "source": 602, + "teal": 2440, + "source": 607, "pc": [ 2361, 2362 ] }, { - "teal": 2437, - "source": 602, + "teal": 2441, + "source": 607, "pc": [ 2363 ] }, { - "teal": 2438, - "source": 602, + "teal": 2442, + "source": 607, "pc": [ 2364 ] }, { - "teal": 2439, - "source": 602, + "teal": 2443, + "source": 607, "pc": [ 2365, 2366 ] }, { - "teal": 2440, - "source": 602, + "teal": 2444, + "source": 607, "pc": [ 2367 ] }, { - "teal": 2441, - "source": 602, + "teal": 2445, + "source": 607, "pc": [ 2368, 2369, @@ -10255,120 +10255,120 @@ ] }, { - "teal": 2446, - "source": 608, + "teal": 2450, + "source": 613, "pc": [ 2371, 2372 ] }, { - "teal": 2447, - "source": 608, + "teal": 2451, + "source": 613, "pc": [ 2373, 2374 ] }, { - "teal": 2451, - "source": 609, + "teal": 2455, + "source": 614, "pc": [ 2375, 2376 ] }, { - "teal": 2452, - "source": 609, + "teal": 2456, + "source": 614, "pc": [ 2377 ] }, { - "teal": 2453, - "source": 609, + "teal": 2457, + "source": 614, "pc": [ 2378 ] }, { - "teal": 2454, - "source": 609, + "teal": 2458, + "source": 614, "pc": [ 2379, 2380 ] }, { - "teal": 2455, - "source": 609, + "teal": 2459, + "source": 614, "pc": [ 2381 ] }, { - "teal": 2456, - "source": 609, + "teal": 2460, + "source": 614, "pc": [ 2382 ] }, { - "teal": 2457, - "source": 609, + "teal": 2461, + "source": 614, "pc": [ 2383, 2384 ] }, { - "teal": 2458, - "source": 609, + "teal": 2462, + "source": 614, "pc": [ 2385 ] }, { - "teal": 2459, - "source": 609, + "teal": 2463, + "source": 614, "pc": [ 2386 ] }, { - "teal": 2460, - "source": 609, + "teal": 2464, + "source": 614, "pc": [ 2387, 2388 ] }, { - "teal": 2465, - "source": 610, + "teal": 2469, + "source": 615, "pc": [ 2389, 2390 ] }, { - "teal": 2466, - "source": 610, + "teal": 2470, + "source": 615, "pc": [ 2391 ] }, { - "teal": 2467, - "source": 610, + "teal": 2471, + "source": 615, "pc": [ 2392 ] }, { - "teal": 2468, - "source": 610, + "teal": 2472, + "source": 615, "pc": [ 2393, 2394, @@ -10376,16 +10376,16 @@ ] }, { - "teal": 2474, - "source": 612, + "teal": 2478, + "source": 617, "pc": [ 2396, 2397 ] }, { - "teal": 2475, - "source": 612, + "teal": 2479, + "source": 617, "pc": [ 2398, 2399, @@ -10402,38 +10402,38 @@ ] }, { - "teal": 2476, - "source": 612, + "teal": 2480, + "source": 617, "pc": [ 2410 ] }, { - "teal": 2479, - "source": 612, + "teal": 2483, + "source": 617, "errorMessage": "global state value does not exist: AppID.fromUint64(pool1AppID).globalState('lastPayout')", "pc": [ 2411 ] }, { - "teal": 2480, - "source": 612, + "teal": 2484, + "source": 617, "pc": [ 2412, 2413 ] }, { - "teal": 2481, - "source": 612, + "teal": 2485, + "source": 617, "pc": [ 2414 ] }, { - "teal": 2482, - "source": 612, + "teal": 2486, + "source": 617, "pc": [ 2415, 2416, @@ -10441,68 +10441,68 @@ ] }, { - "teal": 2487, - "source": 613, + "teal": 2491, + "source": 618, "pc": [ 2418, 2419 ] }, { - "teal": 2488, - "source": 613, + "teal": 2492, + "source": 618, "pc": [ 2420, 2421 ] }, { - "teal": 2489, - "source": 613, + "teal": 2493, + "source": 618, "pc": [ 2422 ] }, { - "teal": 2490, - "source": 613, + "teal": 2494, + "source": 618, "pc": [ 2423, 2424 ] }, { - "teal": 2491, - "source": 613, + "teal": 2495, + "source": 618, "pc": [ 2425 ] }, { - "teal": 2492, - "source": 613, + "teal": 2496, + "source": 618, "pc": [ 2426 ] }, { - "teal": 2493, - "source": 613, + "teal": 2497, + "source": 618, "pc": [ 2427, 2428 ] }, { - "teal": 2494, - "source": 613, + "teal": 2498, + "source": 618, "pc": [ 2429 ] }, { - "teal": 2495, - "source": 613, + "teal": 2499, + "source": 618, "pc": [ 2430, 2431, @@ -10510,8 +10510,8 @@ ] }, { - "teal": 2500, - "source": 615, + "teal": 2504, + "source": 620, "pc": [ 2433, 2434, @@ -10519,174 +10519,174 @@ ] }, { - "teal": 2501, - "source": 615, + "teal": 2505, + "source": 620, "pc": [ 2436, 2437 ] }, { - "teal": 2502, - "source": 615, + "teal": 2506, + "source": 620, "pc": [ 2438 ] }, { - "teal": 2503, - "source": 615, + "teal": 2507, + "source": 620, "pc": [ 2439, 2440 ] }, { - "teal": 2504, - "source": 615, + "teal": 2508, + "source": 620, "pc": [ 2441 ] }, { - "teal": 2505, - "source": 615, + "teal": 2509, + "source": 620, "pc": [ 2442 ] }, { - "teal": 2506, - "source": 615, + "teal": 2510, + "source": 620, "pc": [ 2443, 2444 ] }, { - "teal": 2507, - "source": 615, + "teal": 2511, + "source": 620, "pc": [ 2445 ] }, { - "teal": 2508, - "source": 615, + "teal": 2512, + "source": 620, "pc": [ 2446 ] }, { - "teal": 2509, - "source": 615, + "teal": 2513, + "source": 620, "pc": [ 2447, 2448 ] }, { - "teal": 2513, - "source": 616, + "teal": 2517, + "source": 621, "pc": [ 2449, 2450 ] }, { - "teal": 2514, - "source": 616, + "teal": 2518, + "source": 621, "pc": [ 2451, 2452 ] }, { - "teal": 2515, - "source": 616, + "teal": 2519, + "source": 621, "pc": [ 2453, 2454 ] }, { - "teal": 2516, - "source": 616, + "teal": 2520, + "source": 621, "pc": [ 2455 ] }, { - "teal": 2517, - "source": 616, + "teal": 2521, + "source": 621, "pc": [ 2456 ] }, { - "teal": 2518, - "source": 616, + "teal": 2522, + "source": 621, "pc": [ 2457, 2458 ] }, { - "teal": 2523, - "source": 618, + "teal": 2527, + "source": 623, "pc": [ 2459, 2460 ] }, { - "teal": 2524, - "source": 618, + "teal": 2528, + "source": 623, "pc": [ 2461, 2462 ] }, { - "teal": 2525, - "source": 618, + "teal": 2529, + "source": 623, "pc": [ 2463, 2464 ] }, { - "teal": 2526, - "source": 618, + "teal": 2530, + "source": 623, "pc": [ 2465 ] }, { - "teal": 2527, - "source": 618, + "teal": 2531, + "source": 623, "pc": [ 2466 ] }, { - "teal": 2528, - "source": 618, + "teal": 2532, + "source": 623, "pc": [ 2467, 2468 ] }, { - "teal": 2529, - "source": 618, + "teal": 2533, + "source": 623, "pc": [ 2469 ] }, { - "teal": 2530, - "source": 618, + "teal": 2534, + "source": 623, "pc": [ 2470, 2471, @@ -10694,68 +10694,68 @@ ] }, { - "teal": 2535, - "source": 619, + "teal": 2539, + "source": 624, "pc": [ 2473, 2474 ] }, { - "teal": 2536, - "source": 619, + "teal": 2540, + "source": 624, "pc": [ 2475, 2476 ] }, { - "teal": 2537, - "source": 619, + "teal": 2541, + "source": 624, "pc": [ 2477 ] }, { - "teal": 2538, - "source": 619, + "teal": 2542, + "source": 624, "pc": [ 2478, 2479 ] }, { - "teal": 2539, - "source": 619, + "teal": 2543, + "source": 624, "pc": [ 2480 ] }, { - "teal": 2540, - "source": 619, + "teal": 2544, + "source": 624, "pc": [ 2481 ] }, { - "teal": 2541, - "source": 619, + "teal": 2545, + "source": 624, "pc": [ 2482, 2483 ] }, { - "teal": 2542, - "source": 619, + "teal": 2546, + "source": 624, "pc": [ 2484 ] }, { - "teal": 2543, - "source": 619, + "teal": 2547, + "source": 624, "pc": [ 2485, 2486, @@ -10763,262 +10763,262 @@ ] }, { - "teal": 2550, - "source": 622, + "teal": 2554, + "source": 627, "pc": [ 2488, 2489 ] }, { - "teal": 2551, - "source": 622, + "teal": 2555, + "source": 627, "pc": [ 2490, 2491 ] }, { - "teal": 2552, - "source": 622, + "teal": 2556, + "source": 627, "pc": [ 2492 ] }, { - "teal": 2553, - "source": 622, + "teal": 2557, + "source": 627, "pc": [ 2493 ] }, { - "teal": 2554, - "source": 622, + "teal": 2558, + "source": 627, "pc": [ 2494, 2495 ] }, { - "teal": 2555, - "source": 622, + "teal": 2559, + "source": 627, "pc": [ 2496 ] }, { - "teal": 2556, - "source": 622, + "teal": 2560, + "source": 627, "pc": [ 2497 ] }, { - "teal": 2557, - "source": 622, + "teal": 2561, + "source": 627, "pc": [ 2498, 2499 ] }, { - "teal": 2558, - "source": 622, + "teal": 2562, + "source": 627, "pc": [ 2500 ] }, { - "teal": 2562, - "source": 624, + "teal": 2566, + "source": 629, "pc": [ 2501, 2502 ] }, { - "teal": 2563, - "source": 624, + "teal": 2567, + "source": 629, "pc": [ 2503, 2504 ] }, { - "teal": 2564, - "source": 624, + "teal": 2568, + "source": 629, "pc": [ 2505 ] }, { - "teal": 2565, - "source": 624, + "teal": 2569, + "source": 629, "pc": [ 2506, 2507 ] }, { - "teal": 2566, - "source": 624, + "teal": 2570, + "source": 629, "pc": [ 2508 ] }, { - "teal": 2567, - "source": 624, + "teal": 2571, + "source": 629, "pc": [ 2509 ] }, { - "teal": 2568, - "source": 624, + "teal": 2572, + "source": 629, "pc": [ 2510, 2511 ] }, { - "teal": 2569, - "source": 624, + "teal": 2573, + "source": 629, "pc": [ 2512 ] }, { - "teal": 2570, - "source": 624, + "teal": 2574, + "source": 629, "pc": [ 2513 ] }, { - "teal": 2571, - "source": 624, + "teal": 2575, + "source": 629, "pc": [ 2514, 2515 ] }, { - "teal": 2575, - "source": 625, + "teal": 2579, + "source": 630, "pc": [ 2516, 2517 ] }, { - "teal": 2576, - "source": 625, + "teal": 2580, + "source": 630, "pc": [ 2518 ] }, { - "teal": 2577, - "source": 625, + "teal": 2581, + "source": 630, "pc": [ 2519 ] }, { - "teal": 2578, - "source": 625, + "teal": 2582, + "source": 630, "pc": [ 2520, 2521 ] }, { - "teal": 2579, - "source": 625, + "teal": 2583, + "source": 630, "pc": [ 2522 ] }, { - "teal": 2580, - "source": 625, + "teal": 2584, + "source": 630, "pc": [ 2523 ] }, { - "teal": 2581, - "source": 625, + "teal": 2585, + "source": 630, "pc": [ 2524, 2525 ] }, { - "teal": 2582, - "source": 625, + "teal": 2586, + "source": 630, "pc": [ 2526 ] }, { - "teal": 2583, - "source": 625, + "teal": 2587, + "source": 630, "pc": [ 2527 ] }, { - "teal": 2584, - "source": 625, + "teal": 2588, + "source": 630, "pc": [ 2528, 2529 ] }, { - "teal": 2588, - "source": 626, + "teal": 2592, + "source": 631, "pc": [ 2530 ] }, { - "teal": 2589, - "source": 626, + "teal": 2593, + "source": 631, "pc": [ 2531, 2532 ] }, { - "teal": 2594, - "source": 626, + "teal": 2598, + "source": 631, "pc": [ 2533, 2534 ] }, { - "teal": 2595, - "source": 626, + "teal": 2599, + "source": 631, "pc": [ 2535, 2536 ] }, { - "teal": 2596, - "source": 626, + "teal": 2600, + "source": 631, "pc": [ 2537 ] }, { - "teal": 2597, - "source": 626, + "teal": 2601, + "source": 631, "pc": [ 2538, 2539, @@ -11026,326 +11026,326 @@ ] }, { - "teal": 2604, - "source": 632, + "teal": 2608, + "source": 637, "pc": [ 2541, 2542 ] }, { - "teal": 2605, - "source": 632, + "teal": 2609, + "source": 637, "pc": [ 2543, 2544 ] }, { - "teal": 2606, - "source": 632, + "teal": 2610, + "source": 637, "pc": [ 2545, 2546 ] }, { - "teal": 2607, - "source": 632, + "teal": 2611, + "source": 637, "pc": [ 2547 ] }, { - "teal": 2608, - "source": 632, + "teal": 2612, + "source": 637, "pc": [ 2548 ] }, { - "teal": 2609, - "source": 632, + "teal": 2613, + "source": 637, "pc": [ 2549, 2550 ] }, { - "teal": 2610, - "source": 632, + "teal": 2614, + "source": 637, "pc": [ 2551 ] }, { - "teal": 2611, - "source": 632, + "teal": 2615, + "source": 637, "pc": [ 2552 ] }, { - "teal": 2612, - "source": 632, + "teal": 2616, + "source": 637, "pc": [ 2553 ] }, { - "teal": 2613, - "source": 632, + "teal": 2617, + "source": 637, "pc": [ 2554, 2555 ] }, { - "teal": 2614, - "source": 632, + "teal": 2618, + "source": 637, "pc": [ 2556 ] }, { - "teal": 2615, - "source": 632, + "teal": 2619, + "source": 637, "pc": [ 2557 ] }, { - "teal": 2616, - "source": 632, + "teal": 2620, + "source": 637, "pc": [ 2558, 2559 ] }, { - "teal": 2617, - "source": 632, + "teal": 2621, + "source": 637, "pc": [ 2560 ] }, { - "teal": 2618, - "source": 632, + "teal": 2622, + "source": 637, "pc": [ 2561 ] }, { - "teal": 2619, - "source": 632, + "teal": 2623, + "source": 637, "pc": [ 2562, 2563 ] }, { - "teal": 2620, - "source": 631, + "teal": 2624, + "source": 636, "pc": [ 2564 ] }, { - "teal": 2621, - "source": 631, + "teal": 2625, + "source": 636, "pc": [ 2565 ] }, { - "teal": 2622, - "source": 633, + "teal": 2626, + "source": 638, "pc": [ 2566, 2567 ] }, { - "teal": 2623, - "source": 631, + "teal": 2627, + "source": 636, "pc": [ 2568 ] }, { - "teal": 2624, - "source": 631, + "teal": 2628, + "source": 636, "pc": [ 2569 ] }, { - "teal": 2625, - "source": 631, + "teal": 2629, + "source": 636, "pc": [ 2570 ] }, { - "teal": 2626, - "source": 631, + "teal": 2630, + "source": 636, "pc": [ 2571 ] }, { - "teal": 2627, - "source": 631, + "teal": 2631, + "source": 636, "pc": [ 2572 ] }, { - "teal": 2630, - "source": 631, + "teal": 2634, + "source": 636, "errorMessage": "wideRatio failed", "pc": [ 2573 ] }, { - "teal": 2631, - "source": 631, + "teal": 2635, + "source": 636, "pc": [ 2574, 2575 ] }, { - "teal": 2635, - "source": 635, + "teal": 2639, + "source": 640, "pc": [ 2576, 2577 ] }, { - "teal": 2636, - "source": 635, + "teal": 2640, + "source": 640, "pc": [ 2578, 2579 ] }, { - "teal": 2637, - "source": 635, + "teal": 2641, + "source": 640, "pc": [ 2580 ] }, { - "teal": 2638, - "source": 635, + "teal": 2642, + "source": 640, "pc": [ 2581 ] }, { - "teal": 2639, - "source": 635, + "teal": 2643, + "source": 640, "pc": [ 2582 ] }, { - "teal": 2640, - "source": 635, + "teal": 2644, + "source": 640, "pc": [ 2583, 2584 ] }, { - "teal": 2641, - "source": 635, + "teal": 2645, + "source": 640, "pc": [ 2585 ] }, { - "teal": 2642, - "source": 635, + "teal": 2646, + "source": 640, "pc": [ 2586 ] }, { - "teal": 2643, - "source": 635, + "teal": 2647, + "source": 640, "pc": [ 2587, 2588 ] }, { - "teal": 2644, - "source": 635, + "teal": 2648, + "source": 640, "pc": [ 2589 ] }, { - "teal": 2645, - "source": 635, + "teal": 2649, + "source": 640, "pc": [ 2590 ] }, { - "teal": 2646, - "source": 635, + "teal": 2650, + "source": 640, "pc": [ 2591, 2592 ] }, { - "teal": 2647, - "source": 635, + "teal": 2651, + "source": 640, "pc": [ 2593 ] }, { - "teal": 2652, - "source": 626, + "teal": 2656, + "source": 631, "pc": [ 2594, 2595 ] }, { - "teal": 2653, - "source": 626, + "teal": 2657, + "source": 631, "pc": [ 2596 ] }, { - "teal": 2654, - "source": 626, + "teal": 2658, + "source": 631, "pc": [ 2597 ] }, { - "teal": 2655, - "source": 626, + "teal": 2659, + "source": 631, "pc": [ 2598, 2599 ] }, { - "teal": 2656, - "source": 626, + "teal": 2660, + "source": 631, "pc": [ 2600, 2601, @@ -11353,91 +11353,91 @@ ] }, { - "teal": 2661, - "source": 637, + "teal": 2665, + "source": 642, "pc": [ 2603, 2604 ] }, { - "teal": 2662, - "source": 637, + "teal": 2666, + "source": 642, "pc": [ 2605, 2606 ] }, { - "teal": 2663, - "source": 637, + "teal": 2667, + "source": 642, "pc": [ 2607 ] }, { - "teal": 2664, - "source": 637, + "teal": 2668, + "source": 642, "pc": [ 2608, 2609 ] }, { - "teal": 2665, - "source": 637, + "teal": 2669, + "source": 642, "pc": [ 2610 ] }, { - "teal": 2666, - "source": 637, + "teal": 2670, + "source": 642, "pc": [ 2611 ] }, { - "teal": 2667, - "source": 637, + "teal": 2671, + "source": 642, "pc": [ 2612, 2613 ] }, { - "teal": 2668, - "source": 637, + "teal": 2672, + "source": 642, "pc": [ 2614 ] }, { - "teal": 2672, - "source": 596, + "teal": 2676, + "source": 601, "pc": [ 2615, 2616 ] }, { - "teal": 2675, - "source": 596, + "teal": 2679, + "source": 601, "pc": [ 2617, 2618 ] }, { - "teal": 2676, - "source": 596, + "teal": 2680, + "source": 601, "pc": [ 2619 ] }, { - "teal": 2681, - "source": 656, + "teal": 2685, + "source": 661, "pc": [ 2620, 2621, @@ -11445,15 +11445,15 @@ ] }, { - "teal": 2682, - "source": 656, + "teal": 2686, + "source": 661, "pc": [ 2623 ] }, { - "teal": 2685, - "source": 655, + "teal": 2689, + "source": 660, "pc": [ 2624, 2625, @@ -11461,15 +11461,15 @@ ] }, { - "teal": 2686, - "source": 655, + "teal": 2690, + "source": 660, "pc": [ 2627 ] }, { - "teal": 2689, - "source": 654, + "teal": 2693, + "source": 659, "pc": [ 2628, 2629, @@ -11477,15 +11477,15 @@ ] }, { - "teal": 2690, - "source": 654, + "teal": 2694, + "source": 659, "pc": [ 2631 ] }, { - "teal": 2693, - "source": 653, + "teal": 2697, + "source": 658, "pc": [ 2632, 2633, @@ -11493,15 +11493,15 @@ ] }, { - "teal": 2694, - "source": 653, + "teal": 2698, + "source": 658, "pc": [ 2635 ] }, { - "teal": 2697, - "source": 652, + "teal": 2701, + "source": 657, "pc": [ 2636, 2637, @@ -11509,44 +11509,44 @@ ] }, { - "teal": 2698, - "source": 652, + "teal": 2702, + "source": 657, "pc": [ 2639 ] }, { - "teal": 2699, - "source": 652, + "teal": 2703, + "source": 657, "pc": [ 2640 ] }, { - "teal": 2700, - "source": 652, + "teal": 2704, + "source": 657, "pc": [ 2641 ] }, { - "teal": 2701, - "source": 652, + "teal": 2705, + "source": 657, "pc": [ 2642 ] }, { - "teal": 2704, - "source": 652, + "teal": 2708, + "source": 657, "errorMessage": "argument 4 (poolKey) for stakeUpdatedViaRewards must be a (uint64,uint64,uint64)", "pc": [ 2643 ] }, { - "teal": 2707, - "source": 651, + "teal": 2711, + "source": 656, "pc": [ 2644, 2645, @@ -11554,22 +11554,22 @@ ] }, { - "teal": 2708, - "source": 651, + "teal": 2712, + "source": 656, "pc": [ 2647 ] }, { - "teal": 2709, - "source": 651, + "teal": 2713, + "source": 656, "pc": [ 2648 ] }, { - "teal": 2723, - "source": 651, + "teal": 2727, + "source": 656, "pc": [ 2649, 2650, @@ -11577,16 +11577,16 @@ ] }, { - "teal": 2727, - "source": 658, + "teal": 2731, + "source": 663, "pc": [ 2652, 2653 ] }, { - "teal": 2728, - "source": 658, + "teal": 2732, + "source": 663, "pc": [ 2654, 2655, @@ -11594,24 +11594,24 @@ ] }, { - "teal": 2732, - "source": 661, + "teal": 2736, + "source": 666, "pc": [ 2657, 2658 ] }, { - "teal": 2733, - "source": 661, + "teal": 2737, + "source": 666, "pc": [ 2659, 2660 ] }, { - "teal": 2734, - "source": 661, + "teal": 2738, + "source": 666, "pc": [ 2661, 2662, @@ -11619,82 +11619,82 @@ ] }, { - "teal": 2735, - "source": 661, + "teal": 2739, + "source": 666, "pc": [ 2664 ] }, { - "teal": 2736, - "source": 661, + "teal": 2740, + "source": 666, "pc": [ 2665 ] }, { - "teal": 2737, - "source": 661, + "teal": 2741, + "source": 666, "pc": [ 2666 ] }, { - "teal": 2738, - "source": 661, + "teal": 2742, + "source": 666, "pc": [ 2667, 2668 ] }, { - "teal": 2739, - "source": 661, + "teal": 2743, + "source": 666, "pc": [ 2669 ] }, { - "teal": 2740, - "source": 661, + "teal": 2744, + "source": 666, "pc": [ 2670 ] }, { - "teal": 2741, - "source": 661, + "teal": 2745, + "source": 666, "pc": [ 2671, 2672 ] }, { - "teal": 2742, - "source": 661, + "teal": 2746, + "source": 666, "pc": [ 2673 ] }, { - "teal": 2743, - "source": 661, + "teal": 2747, + "source": 666, "pc": [ 2674, 2675 ] }, { - "teal": 2744, - "source": 661, + "teal": 2748, + "source": 666, "pc": [ 2676, 2677 ] }, { - "teal": 2745, - "source": 661, + "teal": 2749, + "source": 666, "pc": [ 2678, 2679, @@ -11702,88 +11702,88 @@ ] }, { - "teal": 2746, - "source": 661, + "teal": 2750, + "source": 666, "pc": [ 2681 ] }, { - "teal": 2747, - "source": 661, + "teal": 2751, + "source": 666, "pc": [ 2682 ] }, { - "teal": 2748, - "source": 661, + "teal": 2752, + "source": 666, "pc": [ 2683 ] }, { - "teal": 2749, - "source": 661, + "teal": 2753, + "source": 666, "pc": [ 2684, 2685 ] }, { - "teal": 2750, - "source": 661, + "teal": 2754, + "source": 666, "pc": [ 2686 ] }, { - "teal": 2751, - "source": 661, + "teal": 2755, + "source": 666, "pc": [ 2687 ] }, { - "teal": 2752, - "source": 661, + "teal": 2756, + "source": 666, "pc": [ 2688, 2689 ] }, { - "teal": 2753, - "source": 661, + "teal": 2757, + "source": 666, "pc": [ 2690 ] }, { - "teal": 2754, - "source": 661, + "teal": 2758, + "source": 666, "pc": [ 2691 ] }, { - "teal": 2755, - "source": 661, + "teal": 2759, + "source": 666, "pc": [ 2692 ] }, { - "teal": 2756, - "source": 661, + "teal": 2760, + "source": 666, "pc": [ 2693, 2694 ] }, { - "teal": 2757, - "source": 661, + "teal": 2761, + "source": 666, "pc": [ 2695, 2696, @@ -11791,88 +11791,88 @@ ] }, { - "teal": 2758, - "source": 661, + "teal": 2762, + "source": 666, "pc": [ 2698 ] }, { - "teal": 2759, - "source": 661, + "teal": 2763, + "source": 666, "pc": [ 2699 ] }, { - "teal": 2760, - "source": 661, + "teal": 2764, + "source": 666, "pc": [ 2700 ] }, { - "teal": 2761, - "source": 661, + "teal": 2765, + "source": 666, "pc": [ 2701, 2702 ] }, { - "teal": 2762, - "source": 661, + "teal": 2766, + "source": 666, "pc": [ 2703 ] }, { - "teal": 2763, - "source": 661, + "teal": 2767, + "source": 666, "pc": [ 2704 ] }, { - "teal": 2764, - "source": 661, + "teal": 2768, + "source": 666, "pc": [ 2705, 2706 ] }, { - "teal": 2765, - "source": 661, + "teal": 2769, + "source": 666, "pc": [ 2707 ] }, { - "teal": 2766, - "source": 661, + "teal": 2770, + "source": 666, "pc": [ 2708 ] }, { - "teal": 2767, - "source": 661, + "teal": 2771, + "source": 666, "pc": [ 2709 ] }, { - "teal": 2768, - "source": 661, + "teal": 2772, + "source": 666, "pc": [ 2710, 2711 ] }, { - "teal": 2769, - "source": 661, + "teal": 2773, + "source": 666, "pc": [ 2712, 2713, @@ -11880,81 +11880,81 @@ ] }, { - "teal": 2770, - "source": 661, + "teal": 2774, + "source": 666, "pc": [ 2715 ] }, { - "teal": 2771, - "source": 661, + "teal": 2775, + "source": 666, "pc": [ 2716 ] }, { - "teal": 2772, - "source": 661, + "teal": 2776, + "source": 666, "pc": [ 2717 ] }, { - "teal": 2773, - "source": 661, + "teal": 2777, + "source": 666, "pc": [ 2718, 2719 ] }, { - "teal": 2774, - "source": 661, + "teal": 2778, + "source": 666, "pc": [ 2720 ] }, { - "teal": 2778, - "source": 662, + "teal": 2782, + "source": 667, "pc": [ 2721, 2722 ] }, { - "teal": 2779, - "source": 662, + "teal": 2783, + "source": 667, "pc": [ 2723 ] }, { - "teal": 2780, - "source": 662, + "teal": 2784, + "source": 667, "pc": [ 2724 ] }, { - "teal": 2781, - "source": 662, + "teal": 2785, + "source": 667, "pc": [ 2725 ] }, { - "teal": 2782, - "source": 662, + "teal": 2786, + "source": 667, "pc": [ 2726, 2727 ] }, { - "teal": 2783, - "source": 662, + "teal": 2787, + "source": 667, "pc": [ 2728, 2729, @@ -11962,88 +11962,88 @@ ] }, { - "teal": 2784, - "source": 662, + "teal": 2788, + "source": 667, "pc": [ 2731 ] }, { - "teal": 2785, - "source": 662, + "teal": 2789, + "source": 667, "pc": [ 2732 ] }, { - "teal": 2786, - "source": 662, + "teal": 2790, + "source": 667, "pc": [ 2733 ] }, { - "teal": 2787, - "source": 662, + "teal": 2791, + "source": 667, "pc": [ 2734, 2735 ] }, { - "teal": 2788, - "source": 662, + "teal": 2792, + "source": 667, "pc": [ 2736 ] }, { - "teal": 2789, - "source": 662, + "teal": 2793, + "source": 667, "pc": [ 2737 ] }, { - "teal": 2790, - "source": 662, + "teal": 2794, + "source": 667, "pc": [ 2738, 2739 ] }, { - "teal": 2791, - "source": 662, + "teal": 2795, + "source": 667, "pc": [ 2740 ] }, { - "teal": 2792, - "source": 662, + "teal": 2796, + "source": 667, "pc": [ 2741 ] }, { - "teal": 2793, - "source": 662, + "teal": 2797, + "source": 667, "pc": [ 2742 ] }, { - "teal": 2794, - "source": 662, + "teal": 2798, + "source": 667, "pc": [ 2743, 2744 ] }, { - "teal": 2795, - "source": 662, + "teal": 2799, + "source": 667, "pc": [ 2745, 2746, @@ -12051,81 +12051,81 @@ ] }, { - "teal": 2796, - "source": 662, + "teal": 2800, + "source": 667, "pc": [ 2748 ] }, { - "teal": 2797, - "source": 662, + "teal": 2801, + "source": 667, "pc": [ 2749 ] }, { - "teal": 2798, - "source": 662, + "teal": 2802, + "source": 667, "pc": [ 2750 ] }, { - "teal": 2799, - "source": 662, + "teal": 2803, + "source": 667, "pc": [ 2751, 2752 ] }, { - "teal": 2800, - "source": 662, + "teal": 2804, + "source": 667, "pc": [ 2753 ] }, { - "teal": 2804, - "source": 663, + "teal": 2808, + "source": 668, "pc": [ 2754, 2755 ] }, { - "teal": 2805, - "source": 663, + "teal": 2809, + "source": 668, "pc": [ 2756 ] }, { - "teal": 2806, - "source": 663, + "teal": 2810, + "source": 668, "pc": [ 2757 ] }, { - "teal": 2807, - "source": 663, + "teal": 2811, + "source": 668, "pc": [ 2758 ] }, { - "teal": 2808, - "source": 663, + "teal": 2812, + "source": 668, "pc": [ 2759, 2760 ] }, { - "teal": 2809, - "source": 663, + "teal": 2813, + "source": 668, "pc": [ 2761, 2762, @@ -12133,88 +12133,88 @@ ] }, { - "teal": 2810, - "source": 663, + "teal": 2814, + "source": 668, "pc": [ 2764 ] }, { - "teal": 2811, - "source": 663, + "teal": 2815, + "source": 668, "pc": [ 2765 ] }, { - "teal": 2812, - "source": 663, + "teal": 2816, + "source": 668, "pc": [ 2766 ] }, { - "teal": 2813, - "source": 663, + "teal": 2817, + "source": 668, "pc": [ 2767, 2768 ] }, { - "teal": 2814, - "source": 663, + "teal": 2818, + "source": 668, "pc": [ 2769 ] }, { - "teal": 2815, - "source": 663, + "teal": 2819, + "source": 668, "pc": [ 2770 ] }, { - "teal": 2816, - "source": 663, + "teal": 2820, + "source": 668, "pc": [ 2771, 2772 ] }, { - "teal": 2817, - "source": 663, + "teal": 2821, + "source": 668, "pc": [ 2773 ] }, { - "teal": 2818, - "source": 663, + "teal": 2822, + "source": 668, "pc": [ 2774 ] }, { - "teal": 2819, - "source": 663, + "teal": 2823, + "source": 668, "pc": [ 2775 ] }, { - "teal": 2820, - "source": 663, + "teal": 2824, + "source": 668, "pc": [ 2776, 2777 ] }, { - "teal": 2821, - "source": 663, + "teal": 2825, + "source": 668, "pc": [ 2778, 2779, @@ -12222,104 +12222,104 @@ ] }, { - "teal": 2822, - "source": 663, + "teal": 2826, + "source": 668, "pc": [ 2781 ] }, { - "teal": 2823, - "source": 663, + "teal": 2827, + "source": 668, "pc": [ 2782 ] }, { - "teal": 2824, - "source": 663, + "teal": 2828, + "source": 668, "pc": [ 2783 ] }, { - "teal": 2825, - "source": 663, + "teal": 2829, + "source": 668, "pc": [ 2784, 2785 ] }, { - "teal": 2826, - "source": 663, + "teal": 2830, + "source": 668, "pc": [ 2786 ] }, { - "teal": 2830, - "source": 665, + "teal": 2834, + "source": 670, "pc": [ 2787, 2788 ] }, { - "teal": 2831, - "source": 665, + "teal": 2835, + "source": 670, "pc": [ 2789 ] }, { - "teal": 2832, - "source": 665, + "teal": 2836, + "source": 670, "pc": [ 2790, 2791 ] }, { - "teal": 2833, - "source": 665, + "teal": 2837, + "source": 670, "pc": [ 2792 ] }, { - "teal": 2834, - "source": 665, + "teal": 2838, + "source": 670, "pc": [ 2793, 2794 ] }, { - "teal": 2835, - "source": 665, + "teal": 2839, + "source": 670, "pc": [ 2795 ] }, { - "teal": 2836, - "source": 665, + "teal": 2840, + "source": 670, "pc": [ 2796 ] }, { - "teal": 2840, - "source": 668, + "teal": 2844, + "source": 673, "pc": [ 2797, 2798 ] }, { - "teal": 2841, - "source": 668, + "teal": 2845, + "source": 673, "pc": [ 2799, 2800, @@ -12327,15 +12327,15 @@ ] }, { - "teal": 2842, - "source": 668, + "teal": 2846, + "source": 673, "pc": [ 2802 ] }, { - "teal": 2843, - "source": 668, + "teal": 2847, + "source": 673, "pc": [ 2803, 2804, @@ -12343,8 +12343,8 @@ ] }, { - "teal": 2855, - "source": 670, + "teal": 2859, + "source": 675, "pc": [ 2806, 2807, @@ -12355,16 +12355,16 @@ ] }, { - "teal": 2856, - "source": 671, + "teal": 2860, + "source": 676, "pc": [ 2812, 2813 ] }, { - "teal": 2857, - "source": 671, + "teal": 2861, + "source": 676, "pc": [ 2814, 2815, @@ -12372,30 +12372,30 @@ ] }, { - "teal": 2858, - "source": 671, + "teal": 2862, + "source": 676, "pc": [ 2817 ] }, { - "teal": 2859, - "source": 671, + "teal": 2863, + "source": 676, "pc": [ 2818 ] }, { - "teal": 2860, - "source": 672, + "teal": 2864, + "source": 677, "pc": [ 2819, 2820 ] }, { - "teal": 2861, - "source": 672, + "teal": 2865, + "source": 677, "pc": [ 2821, 2822, @@ -12403,59 +12403,59 @@ ] }, { - "teal": 2862, - "source": 672, + "teal": 2866, + "source": 677, "pc": [ 2824 ] }, { - "teal": 2863, - "source": 672, + "teal": 2867, + "source": 677, "pc": [ 2825 ] }, { - "teal": 2864, - "source": 672, + "teal": 2868, + "source": 677, "pc": [ 2826 ] }, { - "teal": 2865, - "source": 672, + "teal": 2869, + "source": 677, "pc": [ 2827 ] }, { - "teal": 2866, - "source": 672, + "teal": 2870, + "source": 677, "pc": [ 2828, 2829 ] }, { - "teal": 2867, - "source": 672, + "teal": 2871, + "source": 677, "pc": [ 2830 ] }, { - "teal": 2870, - "source": 672, + "teal": 2874, + "source": 677, "errorMessage": "poolKey.poolId as uint16 overflowed 16 bits", "pc": [ 2831 ] }, { - "teal": 2871, - "source": 672, + "teal": 2875, + "source": 677, "pc": [ 2832, 2833, @@ -12463,23 +12463,23 @@ ] }, { - "teal": 2872, - "source": 672, + "teal": 2876, + "source": 677, "pc": [ 2835 ] }, { - "teal": 2873, - "source": 673, + "teal": 2877, + "source": 678, "pc": [ 2836, 2837 ] }, { - "teal": 2874, - "source": 673, + "teal": 2878, + "source": 678, "pc": [ 2838, 2839, @@ -12487,138 +12487,138 @@ ] }, { - "teal": 2875, - "source": 673, + "teal": 2879, + "source": 678, "pc": [ 2841 ] }, { - "teal": 2876, - "source": 673, + "teal": 2880, + "source": 678, "pc": [ 2842 ] }, { - "teal": 2877, - "source": 673, + "teal": 2881, + "source": 678, "pc": [ 2843 ] }, { - "teal": 2878, - "source": 677, + "teal": 2882, + "source": 682, "pc": [ 2844, 2845 ] }, { - "teal": 2879, - "source": 677, + "teal": 2883, + "source": 682, "pc": [ 2846 ] }, { - "teal": 2880, - "source": 677, + "teal": 2884, + "source": 682, "pc": [ 2847 ] }, { - "teal": 2881, - "source": 676, + "teal": 2885, + "source": 681, "pc": [ 2848, 2849 ] }, { - "teal": 2882, - "source": 676, + "teal": 2886, + "source": 681, "pc": [ 2850 ] }, { - "teal": 2883, - "source": 676, + "teal": 2887, + "source": 681, "pc": [ 2851 ] }, { - "teal": 2884, - "source": 674, + "teal": 2888, + "source": 679, "pc": [ 2852, 2853 ] }, { - "teal": 2885, - "source": 674, + "teal": 2889, + "source": 679, "pc": [ 2854 ] }, { - "teal": 2886, - "source": 674, + "teal": 2890, + "source": 679, "pc": [ 2855 ] }, { - "teal": 2887, - "source": 675, + "teal": 2891, + "source": 680, "pc": [ 2856, 2857 ] }, { - "teal": 2888, - "source": 675, + "teal": 2892, + "source": 680, "pc": [ 2858 ] }, { - "teal": 2889, - "source": 675, + "teal": 2893, + "source": 680, "pc": [ 2859 ] }, { - "teal": 2890, - "source": 670, + "teal": 2894, + "source": 675, "pc": [ 2860 ] }, { - "teal": 2891, - "source": 670, + "teal": 2895, + "source": 675, "pc": [ 2861 ] }, { - "teal": 2892, - "source": 651, + "teal": 2896, + "source": 656, "pc": [ 2862 ] }, { - "teal": 2897, - "source": 698, + "teal": 2901, + "source": 703, "pc": [ 2863, 2864, @@ -12626,58 +12626,58 @@ ] }, { - "teal": 2898, - "source": 698, + "teal": 2902, + "source": 703, "pc": [ 2866 ] }, { - "teal": 2899, - "source": 698, + "teal": 2903, + "source": 703, "pc": [ 2867 ] }, { - "teal": 2900, - "source": 698, + "teal": 2904, + "source": 703, "pc": [ 2868 ] }, { - "teal": 2901, - "source": 698, + "teal": 2905, + "source": 703, "pc": [ 2869 ] }, { - "teal": 2904, - "source": 698, + "teal": 2908, + "source": 703, "errorMessage": "argument 0 (stakerRemoved) for stakeRemoved must be a bool", "pc": [ 2870 ] }, { - "teal": 2905, - "source": 698, + "teal": 2909, + "source": 703, "pc": [ 2871 ] }, { - "teal": 2906, - "source": 698, + "teal": 2910, + "source": 703, "pc": [ 2872 ] }, { - "teal": 2909, - "source": 697, + "teal": 2913, + "source": 702, "pc": [ 2873, 2874, @@ -12685,15 +12685,15 @@ ] }, { - "teal": 2910, - "source": 697, + "teal": 2914, + "source": 702, "pc": [ 2876 ] }, { - "teal": 2913, - "source": 696, + "teal": 2917, + "source": 701, "pc": [ 2877, 2878, @@ -12701,15 +12701,15 @@ ] }, { - "teal": 2914, - "source": 696, + "teal": 2918, + "source": 701, "pc": [ 2880 ] }, { - "teal": 2917, - "source": 695, + "teal": 2921, + "source": 700, "pc": [ 2881, 2882, @@ -12717,45 +12717,45 @@ ] }, { - "teal": 2918, - "source": 695, + "teal": 2922, + "source": 700, "pc": [ 2884 ] }, { - "teal": 2919, - "source": 695, + "teal": 2923, + "source": 700, "pc": [ 2885 ] }, { - "teal": 2920, - "source": 695, + "teal": 2924, + "source": 700, "pc": [ 2886, 2887 ] }, { - "teal": 2921, - "source": 695, + "teal": 2925, + "source": 700, "pc": [ 2888 ] }, { - "teal": 2924, - "source": 695, + "teal": 2928, + "source": 700, "errorMessage": "argument 3 (staker) for stakeRemoved must be a address", "pc": [ 2889 ] }, { - "teal": 2927, - "source": 694, + "teal": 2931, + "source": 699, "pc": [ 2890, 2891, @@ -12763,44 +12763,44 @@ ] }, { - "teal": 2928, - "source": 694, + "teal": 2932, + "source": 699, "pc": [ 2893 ] }, { - "teal": 2929, - "source": 694, + "teal": 2933, + "source": 699, "pc": [ 2894 ] }, { - "teal": 2930, - "source": 694, + "teal": 2934, + "source": 699, "pc": [ 2895 ] }, { - "teal": 2931, - "source": 694, + "teal": 2935, + "source": 699, "pc": [ 2896 ] }, { - "teal": 2934, - "source": 694, + "teal": 2938, + "source": 699, "errorMessage": "argument 4 (poolKey) for stakeRemoved must be a (uint64,uint64,uint64)", "pc": [ 2897 ] }, { - "teal": 2937, - "source": 693, + "teal": 2941, + "source": 698, "pc": [ 2898, 2899, @@ -12808,22 +12808,22 @@ ] }, { - "teal": 2938, - "source": 693, + "teal": 2942, + "source": 698, "pc": [ 2901 ] }, { - "teal": 2939, - "source": 693, + "teal": 2943, + "source": 698, "pc": [ 2902 ] }, { - "teal": 2954, - "source": 693, + "teal": 2958, + "source": 698, "pc": [ 2903, 2904, @@ -12831,46 +12831,46 @@ ] }, { - "teal": 2957, - "source": 693, + "teal": 2961, + "source": 698, "pc": [ 2906 ] }, { - "teal": 2958, - "source": 693, + "teal": 2962, + "source": 698, "pc": [ 2907, 2908 ] }, { - "teal": 2963, - "source": 700, + "teal": 2967, + "source": 705, "pc": [ 2909, 2910 ] }, { - "teal": 2964, - "source": 700, + "teal": 2968, + "source": 705, "pc": [ 2911, 2912 ] }, { - "teal": 2965, - "source": 700, + "teal": 2969, + "source": 705, "pc": [ 2913 ] }, { - "teal": 2966, - "source": 700, + "teal": 2970, + "source": 705, "pc": [ 2914, 2915, @@ -12878,108 +12878,108 @@ ] }, { - "teal": 2971, - "source": 701, + "teal": 2975, + "source": 706, "pc": [ 2917 ] }, { - "teal": 2972, - "source": 701, + "teal": 2976, + "source": 706, "pc": [ 2918, 2919 ] }, { - "teal": 2973, - "source": 701, + "teal": 2977, + "source": 706, "pc": [ 2920, 2921 ] }, { - "teal": 2974, - "source": 701, + "teal": 2978, + "source": 706, "pc": [ 2922 ] }, { - "teal": 2975, - "source": 701, + "teal": 2979, + "source": 706, "pc": [ 2923, 2924 ] }, { - "teal": 2976, - "source": 701, + "teal": 2980, + "source": 706, "pc": [ 2925, 2926 ] }, { - "teal": 2977, - "source": 701, + "teal": 2981, + "source": 706, "pc": [ 2927 ] }, { - "teal": 2978, - "source": 701, + "teal": 2982, + "source": 706, "pc": [ 2928, 2929 ] }, { - "teal": 2979, - "source": 701, + "teal": 2983, + "source": 706, "pc": [ 2930, 2931 ] }, { - "teal": 2980, - "source": 701, + "teal": 2984, + "source": 706, "pc": [ 2932, 2933 ] }, { - "teal": 2981, - "source": 701, + "teal": 2985, + "source": 706, "pc": [ 2934, 2935 ] }, { - "teal": 2982, - "source": 701, + "teal": 2986, + "source": 706, "pc": [ 2936 ] }, { - "teal": 2987, - "source": 703, + "teal": 2991, + "source": 708, "pc": [ 2937, 2938 ] }, { - "teal": 2988, - "source": 703, + "teal": 2992, + "source": 708, "pc": [ 2939, 2940, @@ -12987,37 +12987,37 @@ ] }, { - "teal": 2992, - "source": 707, + "teal": 2996, + "source": 712, "pc": [ 2942, 2943 ] }, { - "teal": 2993, - "source": 707, + "teal": 2997, + "source": 712, "pc": [ 2944 ] }, { - "teal": 2994, - "source": 707, + "teal": 2998, + "source": 712, "pc": [ 2945 ] }, { - "teal": 2995, - "source": 707, + "teal": 2999, + "source": 712, "pc": [ 2946 ] }, { - "teal": 2996, - "source": 707, + "teal": 3000, + "source": 712, "pc": [ 2947, 2948, @@ -13025,61 +13025,61 @@ ] }, { - "teal": 2997, - "source": 707, + "teal": 3001, + "source": 712, "pc": [ 2950, 2951 ] }, { - "teal": 2998, - "source": 707, + "teal": 3002, + "source": 712, "pc": [ 2952 ] }, { - "teal": 2999, - "source": 707, + "teal": 3003, + "source": 712, "pc": [ 2953 ] }, { - "teal": 3000, - "source": 707, + "teal": 3004, + "source": 712, "pc": [ 2954 ] }, { - "teal": 3004, - "source": 707, + "teal": 3008, + "source": 712, "errorMessage": "should only be called if algo or reward was removed", "pc": [ 2955 ] }, { - "teal": 3008, - "source": 710, + "teal": 3012, + "source": 715, "pc": [ 2956, 2957 ] }, { - "teal": 3009, - "source": 710, + "teal": 3013, + "source": 715, "pc": [ 2958, 2959 ] }, { - "teal": 3010, - "source": 710, + "teal": 3014, + "source": 715, "pc": [ 2960, 2961, @@ -13087,82 +13087,82 @@ ] }, { - "teal": 3011, - "source": 710, + "teal": 3015, + "source": 715, "pc": [ 2963 ] }, { - "teal": 3012, - "source": 710, + "teal": 3016, + "source": 715, "pc": [ 2964 ] }, { - "teal": 3013, - "source": 710, + "teal": 3017, + "source": 715, "pc": [ 2965 ] }, { - "teal": 3014, - "source": 710, + "teal": 3018, + "source": 715, "pc": [ 2966, 2967 ] }, { - "teal": 3015, - "source": 710, + "teal": 3019, + "source": 715, "pc": [ 2968 ] }, { - "teal": 3016, - "source": 710, + "teal": 3020, + "source": 715, "pc": [ 2969 ] }, { - "teal": 3017, - "source": 710, + "teal": 3021, + "source": 715, "pc": [ 2970, 2971 ] }, { - "teal": 3018, - "source": 710, + "teal": 3022, + "source": 715, "pc": [ 2972 ] }, { - "teal": 3019, - "source": 710, + "teal": 3023, + "source": 715, "pc": [ 2973, 2974 ] }, { - "teal": 3020, - "source": 710, + "teal": 3024, + "source": 715, "pc": [ 2975, 2976 ] }, { - "teal": 3021, - "source": 710, + "teal": 3025, + "source": 715, "pc": [ 2977, 2978, @@ -13170,88 +13170,88 @@ ] }, { - "teal": 3022, - "source": 710, + "teal": 3026, + "source": 715, "pc": [ 2980 ] }, { - "teal": 3023, - "source": 710, + "teal": 3027, + "source": 715, "pc": [ 2981 ] }, { - "teal": 3024, - "source": 710, + "teal": 3028, + "source": 715, "pc": [ 2982 ] }, { - "teal": 3025, - "source": 710, + "teal": 3029, + "source": 715, "pc": [ 2983, 2984 ] }, { - "teal": 3026, - "source": 710, + "teal": 3030, + "source": 715, "pc": [ 2985 ] }, { - "teal": 3027, - "source": 710, + "teal": 3031, + "source": 715, "pc": [ 2986 ] }, { - "teal": 3028, - "source": 710, + "teal": 3032, + "source": 715, "pc": [ 2987, 2988 ] }, { - "teal": 3029, - "source": 710, + "teal": 3033, + "source": 715, "pc": [ 2989 ] }, { - "teal": 3030, - "source": 710, + "teal": 3034, + "source": 715, "pc": [ 2990 ] }, { - "teal": 3031, - "source": 710, + "teal": 3035, + "source": 715, "pc": [ 2991 ] }, { - "teal": 3032, - "source": 710, + "teal": 3036, + "source": 715, "pc": [ 2992, 2993 ] }, { - "teal": 3033, - "source": 710, + "teal": 3037, + "source": 715, "pc": [ 2994, 2995, @@ -13259,88 +13259,88 @@ ] }, { - "teal": 3034, - "source": 710, + "teal": 3038, + "source": 715, "pc": [ 2997 ] }, { - "teal": 3035, - "source": 710, + "teal": 3039, + "source": 715, "pc": [ 2998 ] }, { - "teal": 3036, - "source": 710, + "teal": 3040, + "source": 715, "pc": [ 2999 ] }, { - "teal": 3037, - "source": 710, + "teal": 3041, + "source": 715, "pc": [ 3000, 3001 ] }, { - "teal": 3038, - "source": 710, + "teal": 3042, + "source": 715, "pc": [ 3002 ] }, { - "teal": 3039, - "source": 710, + "teal": 3043, + "source": 715, "pc": [ 3003 ] }, { - "teal": 3040, - "source": 710, + "teal": 3044, + "source": 715, "pc": [ 3004, 3005 ] }, { - "teal": 3041, - "source": 710, + "teal": 3045, + "source": 715, "pc": [ 3006 ] }, { - "teal": 3042, - "source": 710, + "teal": 3046, + "source": 715, "pc": [ 3007 ] }, { - "teal": 3043, - "source": 710, + "teal": 3047, + "source": 715, "pc": [ 3008 ] }, { - "teal": 3044, - "source": 710, + "teal": 3048, + "source": 715, "pc": [ 3009, 3010 ] }, { - "teal": 3045, - "source": 710, + "teal": 3049, + "source": 715, "pc": [ 3011, 3012, @@ -13348,81 +13348,81 @@ ] }, { - "teal": 3046, - "source": 710, + "teal": 3050, + "source": 715, "pc": [ 3014 ] }, { - "teal": 3047, - "source": 710, + "teal": 3051, + "source": 715, "pc": [ 3015 ] }, { - "teal": 3048, - "source": 710, + "teal": 3052, + "source": 715, "pc": [ 3016 ] }, { - "teal": 3049, - "source": 710, + "teal": 3053, + "source": 715, "pc": [ 3017, 3018 ] }, { - "teal": 3050, - "source": 710, + "teal": 3054, + "source": 715, "pc": [ 3019 ] }, { - "teal": 3054, - "source": 711, + "teal": 3058, + "source": 716, "pc": [ 3020, 3021 ] }, { - "teal": 3055, - "source": 711, + "teal": 3059, + "source": 716, "pc": [ 3022 ] }, { - "teal": 3056, - "source": 711, + "teal": 3060, + "source": 716, "pc": [ 3023 ] }, { - "teal": 3057, - "source": 711, + "teal": 3061, + "source": 716, "pc": [ 3024 ] }, { - "teal": 3058, - "source": 711, + "teal": 3062, + "source": 716, "pc": [ 3025, 3026 ] }, { - "teal": 3059, - "source": 711, + "teal": 3063, + "source": 716, "pc": [ 3027, 3028, @@ -13430,88 +13430,88 @@ ] }, { - "teal": 3060, - "source": 711, + "teal": 3064, + "source": 716, "pc": [ 3030 ] }, { - "teal": 3061, - "source": 711, + "teal": 3065, + "source": 716, "pc": [ 3031 ] }, { - "teal": 3062, - "source": 711, + "teal": 3066, + "source": 716, "pc": [ 3032 ] }, { - "teal": 3063, - "source": 711, + "teal": 3067, + "source": 716, "pc": [ 3033, 3034 ] }, { - "teal": 3064, - "source": 711, + "teal": 3068, + "source": 716, "pc": [ 3035 ] }, { - "teal": 3065, - "source": 711, + "teal": 3069, + "source": 716, "pc": [ 3036 ] }, { - "teal": 3066, - "source": 711, + "teal": 3070, + "source": 716, "pc": [ 3037, 3038 ] }, { - "teal": 3067, - "source": 711, + "teal": 3071, + "source": 716, "pc": [ 3039 ] }, { - "teal": 3068, - "source": 711, + "teal": 3072, + "source": 716, "pc": [ 3040 ] }, { - "teal": 3069, - "source": 711, + "teal": 3073, + "source": 716, "pc": [ 3041 ] }, { - "teal": 3070, - "source": 711, + "teal": 3074, + "source": 716, "pc": [ 3042, 3043 ] }, { - "teal": 3071, - "source": 711, + "teal": 3075, + "source": 716, "pc": [ 3044, 3045, @@ -13519,118 +13519,118 @@ ] }, { - "teal": 3072, - "source": 711, + "teal": 3076, + "source": 716, "pc": [ 3047 ] }, { - "teal": 3073, - "source": 711, + "teal": 3077, + "source": 716, "pc": [ 3048 ] }, { - "teal": 3074, - "source": 711, + "teal": 3078, + "source": 716, "pc": [ 3049 ] }, { - "teal": 3075, - "source": 711, + "teal": 3079, + "source": 716, "pc": [ 3050, 3051 ] }, { - "teal": 3076, - "source": 711, + "teal": 3080, + "source": 716, "pc": [ 3052 ] }, { - "teal": 3080, - "source": 712, + "teal": 3084, + "source": 717, "pc": [ 3053, 3054 ] }, { - "teal": 3081, - "source": 712, + "teal": 3085, + "source": 717, "pc": [ 3055 ] }, { - "teal": 3082, - "source": 712, + "teal": 3086, + "source": 717, "pc": [ 3056, 3057 ] }, { - "teal": 3083, - "source": 712, + "teal": 3087, + "source": 717, "pc": [ 3058 ] }, { - "teal": 3084, - "source": 712, + "teal": 3088, + "source": 717, "pc": [ 3059, 3060 ] }, { - "teal": 3085, - "source": 712, + "teal": 3089, + "source": 717, "pc": [ 3061 ] }, { - "teal": 3086, - "source": 712, + "teal": 3090, + "source": 717, "pc": [ 3062 ] }, { - "teal": 3091, - "source": 714, + "teal": 3095, + "source": 719, "pc": [ 3063, 3064 ] }, { - "teal": 3092, - "source": 714, + "teal": 3096, + "source": 719, "pc": [ 3065 ] }, { - "teal": 3093, - "source": 714, + "teal": 3097, + "source": 719, "pc": [ 3066 ] }, { - "teal": 3094, - "source": 714, + "teal": 3098, + "source": 719, "pc": [ 3067, 3068, @@ -13638,38 +13638,38 @@ ] }, { - "teal": 3099, - "source": 715, + "teal": 3103, + "source": 720, "pc": [ 3070, 3071 ] }, { - "teal": 3100, - "source": 715, + "teal": 3104, + "source": 720, "pc": [ 3072 ] }, { - "teal": 3101, - "source": 715, + "teal": 3105, + "source": 720, "pc": [ 3073 ] }, { - "teal": 3102, - "source": 715, + "teal": 3106, + "source": 720, "pc": [ 3074, 3075 ] }, { - "teal": 3103, - "source": 715, + "teal": 3107, + "source": 720, "pc": [ 3076, 3077, @@ -13677,119 +13677,119 @@ ] }, { - "teal": 3104, - "source": 715, + "teal": 3108, + "source": 720, "pc": [ 3079 ] }, { - "teal": 3105, - "source": 715, + "teal": 3109, + "source": 720, "pc": [ 3080 ] }, { - "teal": 3106, - "source": 715, + "teal": 3110, + "source": 720, "pc": [ 3081 ] }, { - "teal": 3107, - "source": 715, + "teal": 3111, + "source": 720, "pc": [ 3082, 3083 ] }, { - "teal": 3108, - "source": 715, + "teal": 3112, + "source": 720, "pc": [ 3084 ] }, { - "teal": 3109, - "source": 715, + "teal": 3113, + "source": 720, "pc": [ 3085 ] }, { - "teal": 3110, - "source": 715, + "teal": 3114, + "source": 720, "pc": [ 3086, 3087 ] }, { - "teal": 3114, - "source": 716, + "teal": 3118, + "source": 721, "pc": [ 3088, 3089 ] }, { - "teal": 3115, - "source": 716, + "teal": 3119, + "source": 721, "pc": [ 3090 ] }, { - "teal": 3116, - "source": 716, + "teal": 3120, + "source": 721, "pc": [ 3091 ] }, { - "teal": 3119, - "source": 716, + "teal": 3123, + "source": 721, "errorMessage": "rewardRemoved can't be set if validator doesn't have reward token!", "pc": [ 3092 ] }, { - "teal": 3126, - "source": 718, + "teal": 3130, + "source": 723, "pc": [ 3093, 3094 ] }, { - "teal": 3127, - "source": 718, + "teal": 3131, + "source": 723, "pc": [ 3095 ] }, { - "teal": 3128, - "source": 718, + "teal": 3132, + "source": 723, "pc": [ 3096 ] }, { - "teal": 3129, - "source": 718, + "teal": 3133, + "source": 723, "pc": [ 3097, 3098 ] }, { - "teal": 3130, - "source": 718, + "teal": 3134, + "source": 723, "pc": [ 3099, 3100, @@ -13797,111 +13797,111 @@ ] }, { - "teal": 3131, - "source": 718, + "teal": 3135, + "source": 723, "pc": [ 3102 ] }, { - "teal": 3132, - "source": 718, + "teal": 3136, + "source": 723, "pc": [ 3103 ] }, { - "teal": 3133, - "source": 718, + "teal": 3137, + "source": 723, "pc": [ 3104 ] }, { - "teal": 3134, - "source": 718, + "teal": 3138, + "source": 723, "pc": [ 3105, 3106 ] }, { - "teal": 3135, - "source": 718, + "teal": 3139, + "source": 723, "pc": [ 3107 ] }, { - "teal": 3136, - "source": 718, + "teal": 3140, + "source": 723, "pc": [ 3108 ] }, { - "teal": 3137, - "source": 718, + "teal": 3141, + "source": 723, "pc": [ 3109, 3110 ] }, { - "teal": 3138, - "source": 718, + "teal": 3142, + "source": 723, "pc": [ 3111 ] }, { - "teal": 3141, - "source": 717, + "teal": 3145, + "source": 722, "errorMessage": "reward being removed must be covered by hold back amount", "pc": [ 3112 ] }, { - "teal": 3145, - "source": 723, + "teal": 3149, + "source": 728, "pc": [ 3113, 3114 ] }, { - "teal": 3146, - "source": 723, + "teal": 3150, + "source": 728, "pc": [ 3115 ] }, { - "teal": 3147, - "source": 723, + "teal": 3151, + "source": 728, "pc": [ 3116 ] }, { - "teal": 3148, - "source": 723, + "teal": 3152, + "source": 728, "pc": [ 3117 ] }, { - "teal": 3149, - "source": 723, + "teal": 3153, + "source": 728, "pc": [ 3118, 3119 ] }, { - "teal": 3150, - "source": 723, + "teal": 3154, + "source": 728, "pc": [ 3120, 3121, @@ -13909,88 +13909,88 @@ ] }, { - "teal": 3151, - "source": 723, + "teal": 3155, + "source": 728, "pc": [ 3123 ] }, { - "teal": 3152, - "source": 723, + "teal": 3156, + "source": 728, "pc": [ 3124 ] }, { - "teal": 3153, - "source": 723, + "teal": 3157, + "source": 728, "pc": [ 3125 ] }, { - "teal": 3154, - "source": 723, + "teal": 3158, + "source": 728, "pc": [ 3126, 3127 ] }, { - "teal": 3155, - "source": 723, + "teal": 3159, + "source": 728, "pc": [ 3128 ] }, { - "teal": 3156, - "source": 723, + "teal": 3160, + "source": 728, "pc": [ 3129 ] }, { - "teal": 3157, - "source": 723, + "teal": 3161, + "source": 728, "pc": [ 3130, 3131 ] }, { - "teal": 3158, - "source": 723, + "teal": 3162, + "source": 728, "pc": [ 3132 ] }, { - "teal": 3159, - "source": 723, + "teal": 3163, + "source": 728, "pc": [ 3133 ] }, { - "teal": 3160, - "source": 723, + "teal": 3164, + "source": 728, "pc": [ 3134 ] }, { - "teal": 3161, - "source": 723, + "teal": 3165, + "source": 728, "pc": [ 3135, 3136 ] }, { - "teal": 3162, - "source": 723, + "teal": 3166, + "source": 728, "pc": [ 3137, 3138, @@ -13998,52 +13998,52 @@ ] }, { - "teal": 3163, - "source": 723, + "teal": 3167, + "source": 728, "pc": [ 3140 ] }, { - "teal": 3164, - "source": 723, + "teal": 3168, + "source": 728, "pc": [ 3141 ] }, { - "teal": 3165, - "source": 723, + "teal": 3169, + "source": 728, "pc": [ 3142 ] }, { - "teal": 3166, - "source": 723, + "teal": 3170, + "source": 728, "pc": [ 3143, 3144 ] }, { - "teal": 3167, - "source": 723, + "teal": 3171, + "source": 728, "pc": [ 3145 ] }, { - "teal": 3172, - "source": 728, + "teal": 3176, + "source": 733, "pc": [ 3146, 3147 ] }, { - "teal": 3173, - "source": 728, + "teal": 3177, + "source": 733, "pc": [ 3148, 3149, @@ -14051,29 +14051,29 @@ ] }, { - "teal": 3174, - "source": 728, + "teal": 3178, + "source": 733, "pc": [ 3151 ] }, { - "teal": 3175, - "source": 728, + "teal": 3179, + "source": 733, "pc": [ 3152 ] }, { - "teal": 3176, - "source": 728, + "teal": 3180, + "source": 733, "pc": [ 3153 ] }, { - "teal": 3177, - "source": 728, + "teal": 3181, + "source": 733, "pc": [ 3154, 3155, @@ -14081,77 +14081,77 @@ ] }, { - "teal": 3185, - "source": 729, + "teal": 3189, + "source": 734, "pc": [ 3157 ] }, { - "teal": 3186, - "source": 729, + "teal": 3190, + "source": 734, "pc": [ 3158, 3159 ] }, { - "teal": 3187, - "source": 729, + "teal": 3191, + "source": 734, "pc": [ 3160, 3161 ] }, { - "teal": 3188, - "source": 729, + "teal": 3192, + "source": 734, "pc": [ 3162, 3163 ] }, { - "teal": 3189, - "source": 729, + "teal": 3193, + "source": 734, "pc": [ 3164, 3165 ] }, { - "teal": 3193, - "source": 730, + "teal": 3197, + "source": 735, "pc": [ 3166, 3167 ] }, { - "teal": 3194, - "source": 730, + "teal": 3198, + "source": 735, "pc": [ 3168 ] }, { - "teal": 3195, - "source": 730, + "teal": 3199, + "source": 735, "pc": [ 3169 ] }, { - "teal": 3196, - "source": 730, + "teal": 3200, + "source": 735, "pc": [ 3170, 3171 ] }, { - "teal": 3197, - "source": 730, + "teal": 3201, + "source": 735, "pc": [ 3172, 3173, @@ -14159,159 +14159,159 @@ ] }, { - "teal": 3198, - "source": 730, + "teal": 3202, + "source": 735, "pc": [ 3175 ] }, { - "teal": 3199, - "source": 730, + "teal": 3203, + "source": 735, "pc": [ 3176 ] }, { - "teal": 3200, - "source": 730, + "teal": 3204, + "source": 735, "pc": [ 3177 ] }, { - "teal": 3201, - "source": 730, + "teal": 3205, + "source": 735, "pc": [ 3178, 3179 ] }, { - "teal": 3202, - "source": 730, + "teal": 3206, + "source": 735, "pc": [ 3180 ] }, { - "teal": 3203, - "source": 730, + "teal": 3207, + "source": 735, "pc": [ 3181 ] }, { - "teal": 3204, - "source": 730, + "teal": 3208, + "source": 735, "pc": [ 3182, 3183 ] }, { - "teal": 3208, - "source": 731, + "teal": 3212, + "source": 736, "pc": [ 3184, 3185 ] }, { - "teal": 3209, - "source": 731, + "teal": 3213, + "source": 736, "pc": [ 3186, 3187 ] }, { - "teal": 3210, - "source": 731, + "teal": 3214, + "source": 736, "pc": [ 3188, 3189 ] }, { - "teal": 3211, - "source": 731, + "teal": 3215, + "source": 736, "pc": [ 3190 ] }, { - "teal": 3212, - "source": 731, + "teal": 3216, + "source": 736, "pc": [ 3191, 3192 ] }, { - "teal": 3213, - "source": 731, + "teal": 3217, + "source": 736, "pc": [ 3193, 3194 ] }, { - "teal": 3214, - "source": 731, + "teal": 3218, + "source": 736, "pc": [ 3195 ] }, { - "teal": 3215, - "source": 731, + "teal": 3219, + "source": 736, "pc": [ 3196, 3197 ] }, { - "teal": 3218, - "source": 729, + "teal": 3222, + "source": 734, "pc": [ 3198 ] }, { - "teal": 3219, - "source": 729, + "teal": 3223, + "source": 734, "pc": [ 3199, 3200 ] }, { - "teal": 3222, - "source": 729, + "teal": 3226, + "source": 734, "pc": [ 3201 ] }, { - "teal": 3235, - "source": 734, + "teal": 3239, + "source": 739, "pc": [ 3202, 3203 ] }, { - "teal": 3236, - "source": 735, + "teal": 3240, + "source": 740, "pc": [ 3204, 3205 ] }, { - "teal": 3237, - "source": 735, + "teal": 3241, + "source": 740, "pc": [ 3206, 3207, @@ -14319,30 +14319,30 @@ ] }, { - "teal": 3238, - "source": 735, + "teal": 3242, + "source": 740, "pc": [ 3209 ] }, { - "teal": 3239, - "source": 735, + "teal": 3243, + "source": 740, "pc": [ 3210 ] }, { - "teal": 3240, - "source": 736, + "teal": 3244, + "source": 741, "pc": [ 3211, 3212 ] }, { - "teal": 3241, - "source": 736, + "teal": 3245, + "source": 741, "pc": [ 3213, 3214, @@ -14350,59 +14350,59 @@ ] }, { - "teal": 3242, - "source": 736, + "teal": 3246, + "source": 741, "pc": [ 3216 ] }, { - "teal": 3243, - "source": 736, + "teal": 3247, + "source": 741, "pc": [ 3217 ] }, { - "teal": 3244, - "source": 736, + "teal": 3248, + "source": 741, "pc": [ 3218 ] }, { - "teal": 3245, - "source": 736, + "teal": 3249, + "source": 741, "pc": [ 3219 ] }, { - "teal": 3246, - "source": 736, + "teal": 3250, + "source": 741, "pc": [ 3220, 3221 ] }, { - "teal": 3247, - "source": 736, + "teal": 3251, + "source": 741, "pc": [ 3222 ] }, { - "teal": 3250, - "source": 736, + "teal": 3254, + "source": 741, "errorMessage": "poolKey.poolId as uint16 overflowed 16 bits", "pc": [ 3223 ] }, { - "teal": 3251, - "source": 736, + "teal": 3255, + "source": 741, "pc": [ 3224, 3225, @@ -14410,23 +14410,23 @@ ] }, { - "teal": 3252, - "source": 736, + "teal": 3256, + "source": 741, "pc": [ 3227 ] }, { - "teal": 3253, - "source": 737, + "teal": 3257, + "source": 742, "pc": [ 3228, 3229 ] }, { - "teal": 3254, - "source": 737, + "teal": 3258, + "source": 742, "pc": [ 3230, 3231, @@ -14434,124 +14434,124 @@ ] }, { - "teal": 3255, - "source": 737, + "teal": 3259, + "source": 742, "pc": [ 3233 ] }, { - "teal": 3256, - "source": 737, + "teal": 3260, + "source": 742, "pc": [ 3234 ] }, { - "teal": 3257, - "source": 737, + "teal": 3261, + "source": 742, "pc": [ 3235 ] }, { - "teal": 3258, - "source": 738, + "teal": 3262, + "source": 743, "pc": [ 3236, 3237 ] }, { - "teal": 3259, - "source": 738, + "teal": 3263, + "source": 743, "pc": [ 3238 ] }, { - "teal": 3260, - "source": 739, + "teal": 3264, + "source": 744, "pc": [ 3239, 3240 ] }, { - "teal": 3261, - "source": 739, + "teal": 3265, + "source": 744, "pc": [ 3241 ] }, { - "teal": 3262, - "source": 739, + "teal": 3266, + "source": 744, "pc": [ 3242 ] }, { - "teal": 3263, - "source": 741, + "teal": 3267, + "source": 746, "pc": [ 3243, 3244 ] }, { - "teal": 3264, - "source": 741, + "teal": 3268, + "source": 746, "pc": [ 3245 ] }, { - "teal": 3265, - "source": 741, + "teal": 3269, + "source": 746, "pc": [ 3246 ] }, { - "teal": 3266, - "source": 740, + "teal": 3270, + "source": 745, "pc": [ 3247, 3248 ] }, { - "teal": 3267, - "source": 740, + "teal": 3271, + "source": 745, "pc": [ 3249 ] }, { - "teal": 3268, - "source": 740, + "teal": 3272, + "source": 745, "pc": [ 3250 ] }, { - "teal": 3269, - "source": 734, + "teal": 3273, + "source": 739, "pc": [ 3251 ] }, { - "teal": 3270, - "source": 734, + "teal": 3274, + "source": 739, "pc": [ 3252 ] }, { - "teal": 3271, - "source": 714, + "teal": 3275, + "source": 719, "pc": [ 3253, 3254, @@ -14559,24 +14559,24 @@ ] }, { - "teal": 3285, - "source": 744, + "teal": 3289, + "source": 749, "pc": [ 3256, 3257 ] }, { - "teal": 3286, - "source": 745, + "teal": 3290, + "source": 750, "pc": [ 3258, 3259 ] }, { - "teal": 3287, - "source": 745, + "teal": 3291, + "source": 750, "pc": [ 3260, 3261, @@ -14584,30 +14584,30 @@ ] }, { - "teal": 3288, - "source": 745, + "teal": 3292, + "source": 750, "pc": [ 3263 ] }, { - "teal": 3289, - "source": 745, + "teal": 3293, + "source": 750, "pc": [ 3264 ] }, { - "teal": 3290, - "source": 746, + "teal": 3294, + "source": 751, "pc": [ 3265, 3266 ] }, { - "teal": 3291, - "source": 746, + "teal": 3295, + "source": 751, "pc": [ 3267, 3268, @@ -14615,59 +14615,59 @@ ] }, { - "teal": 3292, - "source": 746, + "teal": 3296, + "source": 751, "pc": [ 3270 ] }, { - "teal": 3293, - "source": 746, + "teal": 3297, + "source": 751, "pc": [ 3271 ] }, { - "teal": 3294, - "source": 746, + "teal": 3298, + "source": 751, "pc": [ 3272 ] }, { - "teal": 3295, - "source": 746, + "teal": 3299, + "source": 751, "pc": [ 3273 ] }, { - "teal": 3296, - "source": 746, + "teal": 3300, + "source": 751, "pc": [ 3274, 3275 ] }, { - "teal": 3297, - "source": 746, + "teal": 3301, + "source": 751, "pc": [ 3276 ] }, { - "teal": 3300, - "source": 746, + "teal": 3304, + "source": 751, "errorMessage": "poolKey.poolId as uint16 overflowed 16 bits", "pc": [ 3277 ] }, { - "teal": 3301, - "source": 746, + "teal": 3305, + "source": 751, "pc": [ 3278, 3279, @@ -14675,23 +14675,23 @@ ] }, { - "teal": 3302, - "source": 746, + "teal": 3306, + "source": 751, "pc": [ 3281 ] }, { - "teal": 3303, - "source": 747, + "teal": 3307, + "source": 752, "pc": [ 3282, 3283 ] }, { - "teal": 3304, - "source": 747, + "teal": 3308, + "source": 752, "pc": [ 3284, 3285, @@ -14699,118 +14699,118 @@ ] }, { - "teal": 3305, - "source": 747, + "teal": 3309, + "source": 752, "pc": [ 3287 ] }, { - "teal": 3306, - "source": 747, + "teal": 3310, + "source": 752, "pc": [ 3288 ] }, { - "teal": 3307, - "source": 747, + "teal": 3311, + "source": 752, "pc": [ 3289 ] }, { - "teal": 3308, - "source": 748, + "teal": 3312, + "source": 753, "pc": [ 3290, 3291 ] }, { - "teal": 3309, - "source": 748, + "teal": 3313, + "source": 753, "pc": [ 3292 ] }, { - "teal": 3310, - "source": 749, + "teal": 3314, + "source": 754, "pc": [ 3293, 3294 ] }, { - "teal": 3311, - "source": 749, + "teal": 3315, + "source": 754, "pc": [ 3295 ] }, { - "teal": 3312, - "source": 749, + "teal": 3316, + "source": 754, "pc": [ 3296 ] }, { - "teal": 3313, - "source": 752, + "teal": 3317, + "source": 757, "pc": [ 3297, 3298 ] }, { - "teal": 3314, - "source": 752, + "teal": 3318, + "source": 757, "pc": [ 3299 ] }, { - "teal": 3315, - "source": 751, + "teal": 3319, + "source": 756, "pc": [ 3300, 3301 ] }, { - "teal": 3316, - "source": 751, + "teal": 3320, + "source": 756, "pc": [ 3302 ] }, { - "teal": 3317, - "source": 744, + "teal": 3321, + "source": 749, "pc": [ 3303 ] }, { - "teal": 3318, - "source": 744, + "teal": 3322, + "source": 749, "pc": [ 3304 ] }, { - "teal": 3324, - "source": 756, + "teal": 3328, + "source": 761, "pc": [ 3305, 3306 ] }, { - "teal": 3325, - "source": 756, + "teal": 3329, + "source": 761, "pc": [ 3307, 3308, @@ -14818,24 +14818,24 @@ ] }, { - "teal": 3330, - "source": 758, + "teal": 3334, + "source": 763, "pc": [ 3310, 3311 ] }, { - "teal": 3331, - "source": 758, + "teal": 3335, + "source": 763, "pc": [ 3312, 3313 ] }, { - "teal": 3332, - "source": 758, + "teal": 3336, + "source": 763, "pc": [ 3314, 3315, @@ -14843,81 +14843,81 @@ ] }, { - "teal": 3333, - "source": 758, + "teal": 3337, + "source": 763, "pc": [ 3317 ] }, { - "teal": 3334, - "source": 758, + "teal": 3338, + "source": 763, "pc": [ 3318 ] }, { - "teal": 3335, - "source": 758, + "teal": 3339, + "source": 763, "pc": [ 3319 ] }, { - "teal": 3336, - "source": 758, + "teal": 3340, + "source": 763, "pc": [ 3320, 3321 ] }, { - "teal": 3337, - "source": 758, + "teal": 3341, + "source": 763, "pc": [ 3322 ] }, { - "teal": 3338, - "source": 758, + "teal": 3342, + "source": 763, "pc": [ 3323 ] }, { - "teal": 3339, - "source": 758, + "teal": 3343, + "source": 763, "pc": [ 3324 ] }, { - "teal": 3340, - "source": 758, + "teal": 3344, + "source": 763, "pc": [ 3325 ] }, { - "teal": 3341, - "source": 758, + "teal": 3345, + "source": 763, "pc": [ 3326, 3327 ] }, { - "teal": 3342, - "source": 758, + "teal": 3346, + "source": 763, "pc": [ 3328, 3329 ] }, { - "teal": 3343, - "source": 758, + "teal": 3347, + "source": 763, "pc": [ 3330, 3331, @@ -14925,88 +14925,88 @@ ] }, { - "teal": 3344, - "source": 758, + "teal": 3348, + "source": 763, "pc": [ 3333 ] }, { - "teal": 3345, - "source": 758, + "teal": 3349, + "source": 763, "pc": [ 3334 ] }, { - "teal": 3346, - "source": 758, + "teal": 3350, + "source": 763, "pc": [ 3335 ] }, { - "teal": 3347, - "source": 758, + "teal": 3351, + "source": 763, "pc": [ 3336, 3337 ] }, { - "teal": 3348, - "source": 758, + "teal": 3352, + "source": 763, "pc": [ 3338 ] }, { - "teal": 3349, - "source": 758, + "teal": 3353, + "source": 763, "pc": [ 3339 ] }, { - "teal": 3350, - "source": 758, + "teal": 3354, + "source": 763, "pc": [ 3340 ] }, { - "teal": 3351, - "source": 758, + "teal": 3355, + "source": 763, "pc": [ 3341 ] }, { - "teal": 3352, - "source": 758, + "teal": 3356, + "source": 763, "pc": [ 3342, 3343 ] }, { - "teal": 3353, - "source": 758, + "teal": 3357, + "source": 763, "pc": [ 3344 ] }, { - "teal": 3354, - "source": 758, + "teal": 3358, + "source": 763, "pc": [ 3345, 3346 ] }, { - "teal": 3355, - "source": 758, + "teal": 3359, + "source": 763, "pc": [ 3347, 3348, @@ -15014,72 +15014,72 @@ ] }, { - "teal": 3356, - "source": 758, + "teal": 3360, + "source": 763, "pc": [ 3350 ] }, { - "teal": 3357, - "source": 758, + "teal": 3361, + "source": 763, "pc": [ 3351 ] }, { - "teal": 3358, - "source": 758, + "teal": 3362, + "source": 763, "pc": [ 3352 ] }, { - "teal": 3359, - "source": 758, + "teal": 3363, + "source": 763, "pc": [ 3353, 3354 ] }, { - "teal": 3360, - "source": 758, + "teal": 3364, + "source": 763, "pc": [ 3355 ] }, { - "teal": 3361, - "source": 758, + "teal": 3365, + "source": 763, "pc": [ 3356 ] }, { - "teal": 3362, - "source": 758, + "teal": 3366, + "source": 763, "pc": [ 3357 ] }, { - "teal": 3363, - "source": 758, + "teal": 3367, + "source": 763, "pc": [ 3358 ] }, { - "teal": 3364, - "source": 758, + "teal": 3368, + "source": 763, "pc": [ 3359 ] }, { - "teal": 3365, - "source": 758, + "teal": 3369, + "source": 763, "pc": [ 3360, 3361, @@ -15087,23 +15087,23 @@ ] }, { - "teal": 3366, - "source": 758, + "teal": 3370, + "source": 763, "pc": [ 3363 ] }, { - "teal": 3367, - "source": 758, + "teal": 3371, + "source": 763, "pc": [ 3364, 3365 ] }, { - "teal": 3368, - "source": 758, + "teal": 3372, + "source": 763, "pc": [ 3366, 3367, @@ -15111,52 +15111,52 @@ ] }, { - "teal": 3369, - "source": 758, + "teal": 3373, + "source": 763, "pc": [ 3369 ] }, { - "teal": 3370, - "source": 758, + "teal": 3374, + "source": 763, "pc": [ 3370 ] }, { - "teal": 3371, - "source": 758, + "teal": 3375, + "source": 763, "pc": [ 3371 ] }, { - "teal": 3372, - "source": 758, + "teal": 3376, + "source": 763, "pc": [ 3372, 3373 ] }, { - "teal": 3373, - "source": 758, + "teal": 3377, + "source": 763, "pc": [ 3374 ] }, { - "teal": 3381, - "source": 761, + "teal": 3385, + "source": 766, "pc": [ 3375, 3376 ] }, { - "teal": 3382, - "source": 761, + "teal": 3386, + "source": 766, "pc": [ 3377, 3378, @@ -15164,30 +15164,30 @@ ] }, { - "teal": 3383, - "source": 761, + "teal": 3387, + "source": 766, "pc": [ 3380 ] }, { - "teal": 3384, - "source": 761, + "teal": 3388, + "source": 766, "pc": [ 3381 ] }, { - "teal": 3385, - "source": 762, + "teal": 3389, + "source": 767, "pc": [ 3382, 3383 ] }, { - "teal": 3386, - "source": 762, + "teal": 3390, + "source": 767, "pc": [ 3384, 3385, @@ -15195,37 +15195,37 @@ ] }, { - "teal": 3387, - "source": 762, + "teal": 3391, + "source": 767, "pc": [ 3387 ] }, { - "teal": 3388, - "source": 762, + "teal": 3392, + "source": 767, "pc": [ 3388 ] }, { - "teal": 3389, - "source": 762, + "teal": 3393, + "source": 767, "pc": [ 3389 ] }, { - "teal": 3390, - "source": 763, + "teal": 3394, + "source": 768, "pc": [ 3390, 3391 ] }, { - "teal": 3391, - "source": 763, + "teal": 3395, + "source": 768, "pc": [ 3392, 3393, @@ -15233,37 +15233,37 @@ ] }, { - "teal": 3392, - "source": 763, + "teal": 3396, + "source": 768, "pc": [ 3395 ] }, { - "teal": 3393, - "source": 763, + "teal": 3397, + "source": 768, "pc": [ 3396 ] }, { - "teal": 3394, - "source": 763, + "teal": 3398, + "source": 768, "pc": [ 3397 ] }, { - "teal": 3395, - "source": 760, + "teal": 3399, + "source": 765, "pc": [ 3398, 3399 ] }, { - "teal": 3396, - "source": 760, + "teal": 3400, + "source": 765, "pc": [ 3400, 3401, @@ -15271,116 +15271,116 @@ ] }, { - "teal": 3397, - "source": 760, + "teal": 3401, + "source": 765, "pc": [ 3403, 3404 ] }, { - "teal": 3401, - "source": 765, + "teal": 3405, + "source": 770, "pc": [ 3405, 3406 ] }, { - "teal": 3402, - "source": 765, + "teal": 3406, + "source": 770, "pc": [ 3407, 3408 ] }, { - "teal": 3403, - "source": 765, + "teal": 3407, + "source": 770, "pc": [ 3409, 3410 ] }, { - "teal": 3404, - "source": 765, + "teal": 3408, + "source": 770, "pc": [ 3411 ] }, { - "teal": 3405, - "source": 765, + "teal": 3409, + "source": 770, "pc": [ 3412 ] }, { - "teal": 3406, - "source": 765, + "teal": 3410, + "source": 770, "pc": [ 3413, 3414 ] }, { - "teal": 3410, - "source": 766, + "teal": 3414, + "source": 771, "pc": [ 3415, 3416 ] }, { - "teal": 3411, - "source": 766, + "teal": 3415, + "source": 771, "pc": [ 3417, 3418 ] }, { - "teal": 3412, - "source": 766, + "teal": 3416, + "source": 771, "pc": [ 3419, 3420 ] }, { - "teal": 3413, - "source": 766, + "teal": 3417, + "source": 771, "pc": [ 3421 ] }, { - "teal": 3414, - "source": 766, + "teal": 3418, + "source": 771, "pc": [ 3422 ] }, { - "teal": 3415, - "source": 766, + "teal": 3419, + "source": 771, "pc": [ 3423, 3424 ] }, { - "teal": 3420, - "source": 768, + "teal": 3424, + "source": 773, "pc": [ 3425, 3426 ] }, { - "teal": 3421, - "source": 768, + "teal": 3425, + "source": 773, "pc": [ 3427, 3428, @@ -15388,45 +15388,45 @@ ] }, { - "teal": 3426, - "source": 769, + "teal": 3430, + "source": 774, "pc": [ 3430, 3431 ] }, { - "teal": 3427, - "source": 769, + "teal": 3431, + "source": 774, "pc": [ 3432 ] }, { - "teal": 3428, - "source": 769, + "teal": 3432, + "source": 774, "pc": [ 3433 ] }, { - "teal": 3429, - "source": 769, + "teal": 3433, + "source": 774, "pc": [ 3434 ] }, { - "teal": 3430, - "source": 769, + "teal": 3434, + "source": 774, "pc": [ 3435, 3436 ] }, { - "teal": 3431, - "source": 769, + "teal": 3435, + "source": 774, "pc": [ 3437, 3438, @@ -15434,87 +15434,87 @@ ] }, { - "teal": 3432, - "source": 769, + "teal": 3436, + "source": 774, "pc": [ 3440 ] }, { - "teal": 3433, - "source": 769, + "teal": 3437, + "source": 774, "pc": [ 3441 ] }, { - "teal": 3434, - "source": 769, + "teal": 3438, + "source": 774, "pc": [ 3442 ] }, { - "teal": 3435, - "source": 769, + "teal": 3439, + "source": 774, "pc": [ 3443, 3444 ] }, { - "teal": 3436, - "source": 769, + "teal": 3440, + "source": 774, "pc": [ 3445 ] }, { - "teal": 3437, - "source": 769, + "teal": 3441, + "source": 774, "pc": [ 3446 ] }, { - "teal": 3438, - "source": 769, + "teal": 3442, + "source": 774, "pc": [ 3447 ] }, { - "teal": 3439, - "source": 769, + "teal": 3443, + "source": 774, "pc": [ 3448 ] }, { - "teal": 3440, - "source": 769, + "teal": 3444, + "source": 774, "pc": [ 3449 ] }, { - "teal": 3441, - "source": 769, + "teal": 3445, + "source": 774, "pc": [ 3450 ] }, { - "teal": 3442, - "source": 769, + "teal": 3446, + "source": 774, "pc": [ 3451, 3452 ] }, { - "teal": 3443, - "source": 769, + "teal": 3447, + "source": 774, "pc": [ 3453, 3454, @@ -15522,52 +15522,52 @@ ] }, { - "teal": 3444, - "source": 769, + "teal": 3448, + "source": 774, "pc": [ 3456 ] }, { - "teal": 3445, - "source": 769, + "teal": 3449, + "source": 774, "pc": [ 3457 ] }, { - "teal": 3446, - "source": 769, + "teal": 3450, + "source": 774, "pc": [ 3458 ] }, { - "teal": 3447, - "source": 769, + "teal": 3451, + "source": 774, "pc": [ 3459, 3460 ] }, { - "teal": 3448, - "source": 769, + "teal": 3452, + "source": 774, "pc": [ 3461 ] }, { - "teal": 3454, - "source": 772, + "teal": 3458, + "source": 777, "pc": [ 3462, 3463 ] }, { - "teal": 3455, - "source": 772, + "teal": 3459, + "source": 777, "pc": [ 3464, 3465, @@ -15575,73 +15575,73 @@ ] }, { - "teal": 3460, - "source": 773, + "teal": 3464, + "source": 778, "pc": [ 3467, 3468 ] }, { - "teal": 3461, - "source": 773, + "teal": 3465, + "source": 778, "pc": [ 3469 ] }, { - "teal": 3462, - "source": 773, + "teal": 3466, + "source": 778, "pc": [ 3470 ] }, { - "teal": 3463, - "source": 773, + "teal": 3467, + "source": 778, "pc": [ 3471 ] }, { - "teal": 3464, - "source": 773, + "teal": 3468, + "source": 778, "pc": [ 3472, 3473 ] }, { - "teal": 3465, - "source": 773, + "teal": 3469, + "source": 778, "pc": [ 3474 ] }, { - "teal": 3466, - "source": 773, + "teal": 3470, + "source": 778, "pc": [ 3475 ] }, { - "teal": 3471, - "source": 693, + "teal": 3475, + "source": 698, "pc": [ 3476 ] }, { - "teal": 3476, - "source": 789, + "teal": 3480, + "source": 794, "pc": [ 3477 ] }, { - "teal": 3479, - "source": 792, + "teal": 3483, + "source": 798, "pc": [ 3478, 3479, @@ -15649,15 +15649,15 @@ ] }, { - "teal": 3480, - "source": 792, + "teal": 3484, + "source": 798, "pc": [ 3481 ] }, { - "teal": 3483, - "source": 791, + "teal": 3487, + "source": 797, "pc": [ 3482, 3483, @@ -15665,45 +15665,45 @@ ] }, { - "teal": 3484, - "source": 791, + "teal": 3488, + "source": 797, "pc": [ 3485 ] }, { - "teal": 3485, - "source": 791, + "teal": 3489, + "source": 797, "pc": [ 3486 ] }, { - "teal": 3486, - "source": 791, + "teal": 3490, + "source": 797, "pc": [ 3487, 3488 ] }, { - "teal": 3487, - "source": 791, + "teal": 3491, + "source": 797, "pc": [ 3489 ] }, { - "teal": 3490, - "source": 791, + "teal": 3494, + "source": 797, "errorMessage": "argument 1 (staker) for findPoolForStaker must be a address", "pc": [ 3490 ] }, { - "teal": 3493, - "source": 790, + "teal": 3497, + "source": 796, "pc": [ 3491, 3492, @@ -15711,15 +15711,15 @@ ] }, { - "teal": 3494, - "source": 790, + "teal": 3498, + "source": 796, "pc": [ 3494 ] }, { - "teal": 3497, - "source": 789, + "teal": 3501, + "source": 794, "pc": [ 3495, 3496, @@ -15727,36 +15727,36 @@ ] }, { - "teal": 3498, - "source": 789, + "teal": 3502, + "source": 794, "pc": [ 3498 ] }, { - "teal": 3499, - "source": 789, + "teal": 3503, + "source": 794, "pc": [ 3499 ] }, { - "teal": 3500, - "source": 789, + "teal": 3504, + "source": 794, "pc": [ 3500 ] }, { - "teal": 3501, - "source": 789, + "teal": 3505, + "source": 794, "pc": [ 3501 ] }, { - "teal": 3515, - "source": 789, + "teal": 3519, + "source": 794, "pc": [ 3502, 3503, @@ -15764,61 +15764,61 @@ ] }, { - "teal": 3518, - "source": 789, + "teal": 3522, + "source": 794, "pc": [ 3505 ] }, { - "teal": 3519, - "source": 789, + "teal": 3523, + "source": 794, "pc": [ 3506, 3507 ] }, { - "teal": 3523, - "source": 794, + "teal": 3527, + "source": 800, "pc": [ 3508 ] }, { - "teal": 3524, - "source": 794, + "teal": 3528, + "source": 800, "pc": [ 3509, 3510 ] }, { - "teal": 3528, - "source": 795, + "teal": 3532, + "source": 801, "pc": [ 3511 ] }, { - "teal": 3529, - "source": 795, + "teal": 3533, + "source": 801, "pc": [ 3512, 3513 ] }, { - "teal": 3533, - "source": 803, + "teal": 3537, + "source": 809, "pc": [ 3514, 3515 ] }, { - "teal": 3534, - "source": 803, + "teal": 3538, + "source": 809, "pc": [ 3516, 3517, @@ -15826,59 +15826,59 @@ ] }, { - "teal": 3535, - "source": 803, + "teal": 3539, + "source": 809, "pc": [ 3519, 3520 ] }, { - "teal": 3540, - "source": 806, + "teal": 3544, + "source": 812, "pc": [ 3521 ] }, { - "teal": 3541, - "source": 806, + "teal": 3545, + "source": 812, "pc": [ 3522, 3523 ] }, { - "teal": 3542, - "source": 806, + "teal": 3546, + "source": 812, "pc": [ 3524 ] }, { - "teal": 3543, - "source": 806, + "teal": 3547, + "source": 812, "pc": [ 3525 ] }, { - "teal": 3544, - "source": 806, + "teal": 3548, + "source": 812, "pc": [ 3526 ] }, { - "teal": 3545, - "source": 806, + "teal": 3549, + "source": 812, "pc": [ 3527 ] }, { - "teal": 3546, - "source": 806, + "teal": 3550, + "source": 812, "pc": [ 3528, 3529, @@ -15886,120 +15886,120 @@ ] }, { - "teal": 3551, - "source": 807, + "teal": 3555, + "source": 813, "pc": [ 3531 ] }, { - "teal": 3552, - "source": 807, + "teal": 3556, + "source": 813, "pc": [ 3532, 3533 ] }, { - "teal": 3553, - "source": 807, + "teal": 3557, + "source": 813, "pc": [ 3534 ] }, { - "teal": 3554, - "source": 807, + "teal": 3558, + "source": 813, "pc": [ 3535 ] }, { - "teal": 3557, - "source": 807, + "teal": 3561, + "source": 813, "errorMessage": "box value does not exist: this.stakerPoolSet(staker).value", "pc": [ 3536 ] }, { - "teal": 3558, - "source": 807, + "teal": 3562, + "source": 813, "pc": [ 3537, 3538 ] }, { - "teal": 3562, - "source": 808, + "teal": 3566, + "source": 814, "pc": [ 3539, 3540 ] }, { - "teal": 3563, - "source": 808, + "teal": 3567, + "source": 814, "pc": [ 3541 ] }, { - "teal": 3564, - "source": 808, + "teal": 3568, + "source": 814, "pc": [ 3542 ] }, { - "teal": 3565, - "source": 808, + "teal": 3569, + "source": 814, "pc": [ 3543 ] }, { - "teal": 3569, - "source": 809, + "teal": 3573, + "source": 815, "pc": [ 3544 ] }, { - "teal": 3570, - "source": 809, + "teal": 3574, + "source": 815, "pc": [ 3545, 3546 ] }, { - "teal": 3575, - "source": 809, + "teal": 3579, + "source": 815, "pc": [ 3547, 3548 ] }, { - "teal": 3576, - "source": 809, + "teal": 3580, + "source": 815, "pc": [ 3549, 3550 ] }, { - "teal": 3577, - "source": 809, + "teal": 3581, + "source": 815, "pc": [ 3551 ] }, { - "teal": 3578, - "source": 809, + "teal": 3582, + "source": 815, "pc": [ 3552, 3553, @@ -16007,31 +16007,31 @@ ] }, { - "teal": 3583, - "source": 810, + "teal": 3587, + "source": 816, "pc": [ 3555, 3556 ] }, { - "teal": 3584, - "source": 810, + "teal": 3588, + "source": 816, "pc": [ 3557, 3558 ] }, { - "teal": 3585, - "source": 810, + "teal": 3589, + "source": 816, "pc": [ 3559 ] }, { - "teal": 3586, - "source": 810, + "teal": 3590, + "source": 816, "pc": [ 3560, 3561, @@ -16039,179 +16039,179 @@ ] }, { - "teal": 3591, - "source": 811, + "teal": 3595, + "source": 817, "pc": [ 3563 ] }, { - "teal": 3592, - "source": 811, + "teal": 3596, + "source": 817, "pc": [ 3564, 3565 ] }, { - "teal": 3593, - "source": 811, + "teal": 3597, + "source": 817, "pc": [ 3566, 3567 ] }, { - "teal": 3594, - "source": 811, + "teal": 3598, + "source": 817, "pc": [ 3568 ] }, { - "teal": 3595, - "source": 811, + "teal": 3599, + "source": 817, "pc": [ 3569, 3570 ] }, { - "teal": 3596, - "source": 811, + "teal": 3600, + "source": 817, "pc": [ 3571, 3572 ] }, { - "teal": 3597, - "source": 811, + "teal": 3601, + "source": 817, "pc": [ 3573 ] }, { - "teal": 3598, - "source": 811, + "teal": 3602, + "source": 817, "pc": [ 3574, 3575 ] }, { - "teal": 3599, - "source": 811, + "teal": 3603, + "source": 817, "pc": [ 3576, 3577 ] }, { - "teal": 3600, - "source": 811, + "teal": 3604, + "source": 817, "pc": [ 3578, 3579 ] }, { - "teal": 3601, - "source": 811, + "teal": 3605, + "source": 817, "pc": [ 3580, 3581 ] }, { - "teal": 3602, - "source": 811, + "teal": 3606, + "source": 817, "pc": [ 3582 ] }, { - "teal": 3608, - "source": 813, + "teal": 3612, + "source": 819, "pc": [ 3583, 3584 ] }, { - "teal": 3609, - "source": 813, + "teal": 3613, + "source": 819, "pc": [ 3585, 3586 ] }, { - "teal": 3610, - "source": 813, + "teal": 3614, + "source": 819, "pc": [ 3587 ] }, { - "teal": 3611, - "source": 813, + "teal": 3615, + "source": 819, "pc": [ 3588 ] }, { - "teal": 3612, - "source": 813, + "teal": 3616, + "source": 819, "pc": [ 3589 ] }, { - "teal": 3613, - "source": 813, + "teal": 3617, + "source": 819, "pc": [ 3590 ] }, { - "teal": 3614, - "source": 813, + "teal": 3618, + "source": 819, "pc": [ 3591 ] }, { - "teal": 3615, - "source": 813, + "teal": 3619, + "source": 819, "pc": [ 3592 ] }, { - "teal": 3616, - "source": 813, + "teal": 3620, + "source": 819, "pc": [ 3593 ] }, { - "teal": 3617, - "source": 813, + "teal": 3621, + "source": 819, "pc": [ 3594 ] }, { - "teal": 3618, - "source": 813, + "teal": 3622, + "source": 819, "pc": [ 3595 ] }, { - "teal": 3619, - "source": 813, + "teal": 3623, + "source": 819, "pc": [ 3596, 3597, @@ -16219,8 +16219,8 @@ ] }, { - "teal": 3622, - "source": 814, + "teal": 3626, + "source": 820, "pc": [ 3599, 3600, @@ -16228,103 +16228,103 @@ ] }, { - "teal": 3627, - "source": 816, + "teal": 3631, + "source": 822, "pc": [ 3602 ] }, { - "teal": 3628, - "source": 816, + "teal": 3632, + "source": 822, "pc": [ 3603, 3604 ] }, { - "teal": 3633, - "source": 817, + "teal": 3637, + "source": 823, "pc": [ 3605, 3606 ] }, { - "teal": 3634, - "source": 817, + "teal": 3638, + "source": 823, "pc": [ 3607, 3608 ] }, { - "teal": 3635, - "source": 817, + "teal": 3639, + "source": 823, "pc": [ 3609 ] }, { - "teal": 3636, - "source": 817, + "teal": 3640, + "source": 823, "pc": [ 3610 ] }, { - "teal": 3637, - "source": 817, + "teal": 3641, + "source": 823, "pc": [ 3611 ] }, { - "teal": 3638, - "source": 817, + "teal": 3642, + "source": 823, "pc": [ 3612 ] }, { - "teal": 3639, - "source": 817, + "teal": 3643, + "source": 823, "pc": [ 3613 ] }, { - "teal": 3640, - "source": 817, + "teal": 3644, + "source": 823, "pc": [ 3614 ] }, { - "teal": 3641, - "source": 817, + "teal": 3645, + "source": 823, "pc": [ 3615 ] }, { - "teal": 3642, - "source": 817, + "teal": 3646, + "source": 823, "pc": [ 3616, 3617 ] }, { - "teal": 3643, - "source": 817, + "teal": 3647, + "source": 823, "pc": [ 3618 ] }, { - "teal": 3644, - "source": 817, + "teal": 3648, + "source": 823, "pc": [ 3619, 3620, @@ -16332,235 +16332,235 @@ ] }, { - "teal": 3649, - "source": 819, + "teal": 3653, + "source": 825, "pc": [ 3622 ] }, { - "teal": 3650, - "source": 819, + "teal": 3654, + "source": 825, "pc": [ 3623, 3624 ] }, { - "teal": 3657, - "source": 821, + "teal": 3661, + "source": 827, "pc": [ 3625, 3626 ] }, { - "teal": 3658, - "source": 821, + "teal": 3662, + "source": 827, "pc": [ 3627, 3628 ] }, { - "teal": 3659, - "source": 821, + "teal": 3663, + "source": 827, "pc": [ 3629, 3630 ] }, { - "teal": 3660, - "source": 821, + "teal": 3664, + "source": 827, "pc": [ 3631 ] }, { - "teal": 3661, - "source": 821, + "teal": 3665, + "source": 827, "pc": [ 3632 ] }, { - "teal": 3662, - "source": 821, + "teal": 3666, + "source": 827, "pc": [ 3633 ] }, { - "teal": 3663, - "source": 821, + "teal": 3667, + "source": 827, "pc": [ 3634 ] }, { - "teal": 3664, - "source": 821, + "teal": 3668, + "source": 827, "pc": [ 3635 ] }, { - "teal": 3665, - "source": 821, + "teal": 3669, + "source": 827, "pc": [ 3636 ] }, { - "teal": 3666, - "source": 821, + "teal": 3670, + "source": 827, "pc": [ 3637 ] }, { - "teal": 3667, - "source": 821, + "teal": 3671, + "source": 827, "pc": [ 3638 ] }, { - "teal": 3668, - "source": 821, + "teal": 3672, + "source": 827, "pc": [ 3639 ] }, { - "teal": 3669, - "source": 821, + "teal": 3673, + "source": 827, "pc": [ 3640, 3641 ] }, { - "teal": 3670, - "source": 821, + "teal": 3674, + "source": 827, "pc": [ 3642 ] }, { - "teal": 3671, - "source": 821, + "teal": 3675, + "source": 827, "pc": [ 3643 ] }, { - "teal": 3672, - "source": 821, + "teal": 3676, + "source": 827, "pc": [ 3644, 3645 ] }, { - "teal": 3673, - "source": 821, + "teal": 3677, + "source": 827, "pc": [ 3646 ] }, { - "teal": 3674, - "source": 821, + "teal": 3678, + "source": 827, "pc": [ 3647 ] }, { - "teal": 3675, - "source": 821, + "teal": 3679, + "source": 827, "pc": [ 3648 ] }, { - "teal": 3676, - "source": 821, + "teal": 3680, + "source": 827, "pc": [ 3649, 3650 ] }, { - "teal": 3677, - "source": 821, + "teal": 3681, + "source": 827, "pc": [ 3651 ] }, { - "teal": 3678, - "source": 821, + "teal": 3682, + "source": 827, "pc": [ 3652 ] }, { - "teal": 3679, - "source": 821, + "teal": 3683, + "source": 827, "pc": [ 3653, 3654 ] }, { - "teal": 3680, - "source": 821, + "teal": 3684, + "source": 827, "pc": [ 3655 ] }, { - "teal": 3681, - "source": 821, + "teal": 3685, + "source": 827, "pc": [ 3656 ] }, { - "teal": 3682, - "source": 822, + "teal": 3686, + "source": 828, "pc": [ 3657, 3658 ] }, { - "teal": 3683, - "source": 821, + "teal": 3687, + "source": 827, "pc": [ 3659 ] }, { - "teal": 3684, - "source": 823, + "teal": 3688, + "source": 829, "pc": [ 3660, 3661 ] }, { - "teal": 3685, - "source": 822, + "teal": 3689, + "source": 828, "pc": [ 3662 ] }, { - "teal": 3686, - "source": 820, + "teal": 3690, + "source": 826, "pc": [ 3663, 3664, @@ -16568,111 +16568,111 @@ ] }, { - "teal": 3691, - "source": 825, + "teal": 3695, + "source": 831, "pc": [ 3666, 3667 ] }, { - "teal": 3692, - "source": 825, + "teal": 3696, + "source": 831, "pc": [ 3668, 3669 ] }, { - "teal": 3693, - "source": 825, + "teal": 3697, + "source": 831, "pc": [ 3670 ] }, { - "teal": 3694, - "source": 825, + "teal": 3698, + "source": 831, "pc": [ 3671 ] }, { - "teal": 3695, - "source": 825, + "teal": 3699, + "source": 831, "pc": [ 3672 ] }, { - "teal": 3696, - "source": 825, + "teal": 3700, + "source": 831, "pc": [ 3673 ] }, { - "teal": 3697, - "source": 825, + "teal": 3701, + "source": 831, "pc": [ 3674, 3675 ] }, { - "teal": 3698, - "source": 825, + "teal": 3702, + "source": 831, "pc": [ 3676 ] }, { - "teal": 3699, - "source": 825, + "teal": 3703, + "source": 831, "pc": [ 3677, 3678 ] }, { - "teal": 3700, - "source": 825, + "teal": 3704, + "source": 831, "pc": [ 3679 ] }, { - "teal": 3701, - "source": 825, + "teal": 3705, + "source": 831, "pc": [ 3680 ] }, { - "teal": 3702, - "source": 825, + "teal": 3706, + "source": 831, "pc": [ 3681, 3682 ] }, { - "teal": 3703, - "source": 825, + "teal": 3707, + "source": 831, "pc": [ 3683 ] }, { - "teal": 3704, - "source": 825, + "teal": 3708, + "source": 831, "pc": [ 3684 ] }, { - "teal": 3705, - "source": 825, + "teal": 3709, + "source": 831, "pc": [ 3685, 3686, @@ -16680,38 +16680,38 @@ ] }, { - "teal": 3714, - "source": 809, + "teal": 3718, + "source": 815, "pc": [ 3688, 3689 ] }, { - "teal": 3715, - "source": 809, + "teal": 3719, + "source": 815, "pc": [ 3690 ] }, { - "teal": 3716, - "source": 809, + "teal": 3720, + "source": 815, "pc": [ 3691 ] }, { - "teal": 3717, - "source": 809, + "teal": 3721, + "source": 815, "pc": [ 3692, 3693 ] }, { - "teal": 3718, - "source": 809, + "teal": 3722, + "source": 815, "pc": [ 3694, 3695, @@ -16719,278 +16719,278 @@ ] }, { - "teal": 3728, - "source": 833, + "teal": 3732, + "source": 839, "pc": [ 3697, 3698 ] }, { - "teal": 3729, - "source": 833, + "teal": 3733, + "source": 839, "pc": [ 3699, 3700 ] }, { - "teal": 3730, - "source": 833, + "teal": 3734, + "source": 839, "pc": [ 3701 ] }, { - "teal": 3731, - "source": 833, + "teal": 3735, + "source": 839, "pc": [ 3702 ] }, { - "teal": 3732, - "source": 833, + "teal": 3736, + "source": 839, "pc": [ 3703, 3704 ] }, { - "teal": 3733, - "source": 833, + "teal": 3737, + "source": 839, "pc": [ 3705 ] }, { - "teal": 3734, - "source": 833, + "teal": 3738, + "source": 839, "pc": [ 3706 ] }, { - "teal": 3735, - "source": 833, + "teal": 3739, + "source": 839, "pc": [ 3707, 3708 ] }, { - "teal": 3736, - "source": 833, + "teal": 3740, + "source": 839, "pc": [ 3709 ] }, { - "teal": 3737, - "source": 833, + "teal": 3741, + "source": 839, "pc": [ 3710 ] }, { - "teal": 3738, - "source": 833, + "teal": 3742, + "source": 839, "pc": [ 3711 ] }, { - "teal": 3741, - "source": 832, + "teal": 3745, + "source": 838, "errorMessage": "must stake at least the minimum for this pool", "pc": [ 3712 ] }, { - "teal": 3745, - "source": 838, + "teal": 3749, + "source": 844, "pc": [ 3713, 3714 ] }, { - "teal": 3746, - "source": 838, + "teal": 3750, + "source": 844, "pc": [ 3715, 3716 ] }, { - "teal": 3747, - "source": 838, + "teal": 3751, + "source": 844, "pc": [ 3717 ] }, { - "teal": 3748, - "source": 838, + "teal": 3752, + "source": 844, "pc": [ 3718, 3719 ] }, { - "teal": 3749, - "source": 838, + "teal": 3753, + "source": 844, "pc": [ 3720 ] }, { - "teal": 3750, - "source": 838, + "teal": 3754, + "source": 844, "pc": [ 3721 ] }, { - "teal": 3751, - "source": 838, + "teal": 3755, + "source": 844, "pc": [ 3722, 3723 ] }, { - "teal": 3752, - "source": 838, + "teal": 3756, + "source": 844, "pc": [ 3724 ] }, { - "teal": 3753, - "source": 838, + "teal": 3757, + "source": 844, "pc": [ 3725, 3726 ] }, { - "teal": 3757, - "source": 839, + "teal": 3761, + "source": 845, "pc": [ 3727, 3728 ] }, { - "teal": 3758, - "source": 839, + "teal": 3762, + "source": 845, "pc": [ 3729, 3730 ] }, { - "teal": 3759, - "source": 839, + "teal": 3763, + "source": 845, "pc": [ 3731 ] }, { - "teal": 3760, - "source": 839, + "teal": 3764, + "source": 845, "pc": [ 3732, 3733 ] }, { - "teal": 3761, - "source": 839, + "teal": 3765, + "source": 845, "pc": [ 3734 ] }, { - "teal": 3762, - "source": 839, + "teal": 3766, + "source": 845, "pc": [ 3735 ] }, { - "teal": 3763, - "source": 839, + "teal": 3767, + "source": 845, "pc": [ 3736, 3737 ] }, { - "teal": 3764, - "source": 839, + "teal": 3768, + "source": 845, "pc": [ 3738 ] }, { - "teal": 3765, - "source": 839, + "teal": 3769, + "source": 845, "pc": [ 3739 ] }, { - "teal": 3766, - "source": 839, + "teal": 3770, + "source": 845, "pc": [ 3740, 3741 ] }, { - "teal": 3770, - "source": 840, + "teal": 3774, + "source": 846, "pc": [ 3742 ] }, { - "teal": 3771, - "source": 840, + "teal": 3775, + "source": 846, "pc": [ 3743, 3744 ] }, { - "teal": 3776, - "source": 840, + "teal": 3780, + "source": 846, "pc": [ 3745, 3746 ] }, { - "teal": 3777, - "source": 840, + "teal": 3781, + "source": 846, "pc": [ 3747, 3748 ] }, { - "teal": 3778, - "source": 840, + "teal": 3782, + "source": 846, "pc": [ 3749 ] }, { - "teal": 3779, - "source": 840, + "teal": 3783, + "source": 846, "pc": [ 3750, 3751, @@ -16998,105 +16998,105 @@ ] }, { - "teal": 3784, - "source": 841, + "teal": 3788, + "source": 847, "pc": [ 3753, 3754 ] }, { - "teal": 3785, - "source": 841, + "teal": 3789, + "source": 847, "pc": [ 3755, 3756 ] }, { - "teal": 3786, - "source": 841, + "teal": 3790, + "source": 847, "pc": [ 3757, 3758 ] }, { - "teal": 3787, - "source": 841, + "teal": 3791, + "source": 847, "pc": [ 3759 ] }, { - "teal": 3788, - "source": 841, + "teal": 3792, + "source": 847, "pc": [ 3760, 3761 ] }, { - "teal": 3789, - "source": 841, + "teal": 3793, + "source": 847, "pc": [ 3762 ] }, { - "teal": 3790, - "source": 841, + "teal": 3794, + "source": 847, "pc": [ 3763 ] }, { - "teal": 3791, - "source": 841, + "teal": 3795, + "source": 847, "pc": [ 3764 ] }, { - "teal": 3792, - "source": 841, + "teal": 3796, + "source": 847, "pc": [ 3765 ] }, { - "teal": 3793, - "source": 841, + "teal": 3797, + "source": 847, "pc": [ 3766, 3767 ] }, { - "teal": 3794, - "source": 841, + "teal": 3798, + "source": 847, "pc": [ 3768 ] }, { - "teal": 3795, - "source": 841, + "teal": 3799, + "source": 847, "pc": [ 3769, 3770 ] }, { - "teal": 3796, - "source": 841, + "teal": 3800, + "source": 847, "pc": [ 3771 ] }, { - "teal": 3797, - "source": 841, + "teal": 3801, + "source": 847, "pc": [ 3772, 3773, @@ -17104,198 +17104,198 @@ ] }, { - "teal": 3806, - "source": 843, + "teal": 3810, + "source": 849, "pc": [ 3775, 3776 ] }, { - "teal": 3807, - "source": 843, + "teal": 3811, + "source": 849, "pc": [ 3777 ] }, { - "teal": 3808, - "source": 843, + "teal": 3812, + "source": 849, "pc": [ 3778, 3779 ] }, { - "teal": 3809, - "source": 843, + "teal": 3813, + "source": 849, "pc": [ 3780 ] }, { - "teal": 3810, - "source": 843, + "teal": 3814, + "source": 849, "pc": [ 3781 ] }, { - "teal": 3811, - "source": 843, + "teal": 3815, + "source": 849, "pc": [ 3782 ] }, { - "teal": 3812, - "source": 843, + "teal": 3816, + "source": 849, "pc": [ 3783 ] }, { - "teal": 3813, - "source": 843, + "teal": 3817, + "source": 849, "pc": [ 3784, 3785 ] }, { - "teal": 3814, - "source": 843, + "teal": 3818, + "source": 849, "pc": [ 3786, 3787 ] }, { - "teal": 3815, - "source": 843, + "teal": 3819, + "source": 849, "pc": [ 3788, 3789 ] }, { - "teal": 3816, - "source": 843, + "teal": 3820, + "source": 849, "pc": [ 3790 ] }, { - "teal": 3817, - "source": 843, + "teal": 3821, + "source": 849, "pc": [ 3791 ] }, { - "teal": 3818, - "source": 843, + "teal": 3822, + "source": 849, "pc": [ 3792 ] }, { - "teal": 3819, - "source": 843, + "teal": 3823, + "source": 849, "pc": [ 3793 ] }, { - "teal": 3820, - "source": 843, + "teal": 3824, + "source": 849, "pc": [ 3794 ] }, { - "teal": 3821, - "source": 843, + "teal": 3825, + "source": 849, "pc": [ 3795 ] }, { - "teal": 3822, - "source": 843, + "teal": 3826, + "source": 849, "pc": [ 3796 ] }, { - "teal": 3823, - "source": 843, + "teal": 3827, + "source": 849, "pc": [ 3797 ] }, { - "teal": 3824, - "source": 844, + "teal": 3828, + "source": 850, "pc": [ 3798, 3799 ] }, { - "teal": 3825, - "source": 844, + "teal": 3829, + "source": 850, "pc": [ 3800 ] }, { - "teal": 3826, - "source": 844, + "teal": 3830, + "source": 850, "pc": [ 3801, 3802 ] }, { - "teal": 3827, - "source": 844, + "teal": 3831, + "source": 850, "pc": [ 3803 ] }, { - "teal": 3828, - "source": 845, + "teal": 3832, + "source": 851, "pc": [ 3804 ] }, { - "teal": 3829, - "source": 845, + "teal": 3833, + "source": 851, "pc": [ 3805, 3806 ] }, { - "teal": 3830, - "source": 845, + "teal": 3834, + "source": 851, "pc": [ 3807 ] }, { - "teal": 3831, - "source": 842, + "teal": 3835, + "source": 848, "pc": [ 3808 ] }, { - "teal": 3832, - "source": 842, + "teal": 3836, + "source": 848, "pc": [ 3809, 3810, @@ -17303,38 +17303,38 @@ ] }, { - "teal": 3839, - "source": 840, + "teal": 3843, + "source": 846, "pc": [ 3812, 3813 ] }, { - "teal": 3840, - "source": 840, + "teal": 3844, + "source": 846, "pc": [ 3814 ] }, { - "teal": 3841, - "source": 840, + "teal": 3845, + "source": 846, "pc": [ 3815 ] }, { - "teal": 3842, - "source": 840, + "teal": 3846, + "source": 846, "pc": [ 3816, 3817 ] }, { - "teal": 3843, - "source": 840, + "teal": 3847, + "source": 846, "pc": [ 3818, 3819, @@ -17342,135 +17342,135 @@ ] }, { - "teal": 3848, - "source": 850, + "teal": 3852, + "source": 856, "pc": [ 3821, 3822 ] }, { - "teal": 3849, - "source": 850, + "teal": 3853, + "source": 856, "pc": [ 3823 ] }, { - "teal": 3850, - "source": 850, + "teal": 3854, + "source": 856, "pc": [ 3824, 3825 ] }, { - "teal": 3851, - "source": 850, + "teal": 3855, + "source": 856, "pc": [ 3826 ] }, { - "teal": 3852, - "source": 850, + "teal": 3856, + "source": 856, "pc": [ 3827, 3828 ] }, { - "teal": 3853, - "source": 850, + "teal": 3857, + "source": 856, "pc": [ 3829 ] }, { - "teal": 3854, - "source": 850, + "teal": 3858, + "source": 856, "pc": [ 3830, 3831 ] }, { - "teal": 3855, - "source": 850, + "teal": 3859, + "source": 856, "pc": [ 3832 ] }, { - "teal": 3856, - "source": 850, + "teal": 3860, + "source": 856, "pc": [ 3833, 3834 ] }, { - "teal": 3857, - "source": 850, + "teal": 3861, + "source": 856, "pc": [ 3835 ] }, { - "teal": 3858, - "source": 850, + "teal": 3862, + "source": 856, "pc": [ 3836 ] }, { - "teal": 3859, - "source": 850, + "teal": 3863, + "source": 856, "pc": [ 3837, 3838 ] }, { - "teal": 3860, - "source": 850, + "teal": 3864, + "source": 856, "pc": [ 3839 ] }, { - "teal": 3861, - "source": 850, + "teal": 3865, + "source": 856, "pc": [ 3840 ] }, { - "teal": 3865, - "source": 789, + "teal": 3869, + "source": 794, "pc": [ 3841, 3842 ] }, { - "teal": 3868, - "source": 789, + "teal": 3872, + "source": 794, "pc": [ 3843, 3844 ] }, { - "teal": 3869, - "source": 789, + "teal": 3873, + "source": 794, "pc": [ 3845 ] }, { - "teal": 3874, - "source": 864, + "teal": 3878, + "source": 870, "pc": [ 3846, 3847, @@ -17478,15 +17478,15 @@ ] }, { - "teal": 3875, - "source": 864, + "teal": 3879, + "source": 870, "pc": [ 3849 ] }, { - "teal": 3878, - "source": 864, + "teal": 3882, + "source": 870, "pc": [ 3850, 3851, @@ -17494,15 +17494,15 @@ ] }, { - "teal": 3879, - "source": 864, + "teal": 3883, + "source": 870, "pc": [ 3853 ] }, { - "teal": 3882, - "source": 864, + "teal": 3886, + "source": 870, "pc": [ 3854, 3855, @@ -17510,15 +17510,15 @@ ] }, { - "teal": 3883, - "source": 864, + "teal": 3887, + "source": 870, "pc": [ 3857 ] }, { - "teal": 3886, - "source": 864, + "teal": 3890, + "source": 870, "pc": [ 3858, 3859, @@ -17526,22 +17526,22 @@ ] }, { - "teal": 3887, - "source": 864, + "teal": 3891, + "source": 870, "pc": [ 3861 ] }, { - "teal": 3888, - "source": 864, + "teal": 3892, + "source": 870, "pc": [ 3862 ] }, { - "teal": 3902, - "source": 864, + "teal": 3906, + "source": 870, "pc": [ 3863, 3864, @@ -17549,31 +17549,31 @@ ] }, { - "teal": 3905, - "source": 864, + "teal": 3909, + "source": 870, "pc": [ 3866 ] }, { - "teal": 3906, - "source": 864, + "teal": 3910, + "source": 870, "pc": [ 3867, 3868 ] }, { - "teal": 3910, - "source": 865, + "teal": 3914, + "source": 871, "pc": [ 3869, 3870 ] }, { - "teal": 3911, - "source": 865, + "teal": 3915, + "source": 871, "pc": [ 3871, 3872, @@ -17581,105 +17581,105 @@ ] }, { - "teal": 3915, - "source": 867, + "teal": 3919, + "source": 873, "pc": [ 3874, 3875 ] }, { - "teal": 3916, - "source": 867, + "teal": 3920, + "source": 873, "pc": [ 3876, 3877 ] }, { - "teal": 3917, - "source": 867, + "teal": 3921, + "source": 873, "pc": [ 3878 ] }, { - "teal": 3918, - "source": 867, + "teal": 3922, + "source": 873, "pc": [ 3879, 3880 ] }, { - "teal": 3919, - "source": 867, + "teal": 3923, + "source": 873, "pc": [ 3881 ] }, { - "teal": 3920, - "source": 867, + "teal": 3924, + "source": 873, "pc": [ 3882 ] }, { - "teal": 3921, - "source": 867, + "teal": 3925, + "source": 873, "pc": [ 3883, 3884 ] }, { - "teal": 3922, - "source": 867, + "teal": 3926, + "source": 873, "pc": [ 3885 ] }, { - "teal": 3923, - "source": 867, + "teal": 3927, + "source": 873, "pc": [ 3886, 3887 ] }, { - "teal": 3927, - "source": 868, + "teal": 3931, + "source": 874, "pc": [ 3888, 3889 ] }, { - "teal": 3928, - "source": 868, + "teal": 3932, + "source": 874, "pc": [ 3890 ] }, { - "teal": 3929, - "source": 868, + "teal": 3933, + "source": 874, "pc": [ 3891 ] }, { - "teal": 3930, - "source": 868, + "teal": 3934, + "source": 874, "pc": [ 3892 ] }, { - "teal": 3931, - "source": 868, + "teal": 3935, + "source": 874, "pc": [ 3893, 3894, @@ -17687,82 +17687,82 @@ ] }, { - "teal": 3932, - "source": 868, + "teal": 3936, + "source": 874, "pc": [ 3896, 3897 ] }, { - "teal": 3933, - "source": 868, + "teal": 3937, + "source": 874, "pc": [ 3898 ] }, { - "teal": 3934, - "source": 868, + "teal": 3938, + "source": 874, "pc": [ 3899 ] }, { - "teal": 3935, - "source": 868, + "teal": 3939, + "source": 874, "pc": [ 3900 ] }, { - "teal": 3939, - "source": 868, + "teal": 3943, + "source": 874, "errorMessage": "node number out of allowable range", "pc": [ 3901 ] }, { - "teal": 3943, - "source": 870, + "teal": 3947, + "source": 876, "pc": [ 3902 ] }, { - "teal": 3944, - "source": 870, + "teal": 3948, + "source": 876, "pc": [ 3903, 3904 ] }, { - "teal": 3949, - "source": 870, + "teal": 3953, + "source": 876, "pc": [ 3905, 3906 ] }, { - "teal": 3950, - "source": 870, + "teal": 3954, + "source": 876, "pc": [ 3907 ] }, { - "teal": 3951, - "source": 870, + "teal": 3955, + "source": 876, "pc": [ 3908 ] }, { - "teal": 3952, - "source": 870, + "teal": 3956, + "source": 876, "pc": [ 3909, 3910, @@ -17770,46 +17770,46 @@ ] }, { - "teal": 3956, - "source": 871, + "teal": 3960, + "source": 877, "pc": [ 3912 ] }, { - "teal": 3957, - "source": 871, + "teal": 3961, + "source": 877, "pc": [ 3913, 3914 ] }, { - "teal": 3962, - "source": 871, + "teal": 3966, + "source": 877, "pc": [ 3915, 3916 ] }, { - "teal": 3963, - "source": 871, + "teal": 3967, + "source": 877, "pc": [ 3917, 3918 ] }, { - "teal": 3964, - "source": 871, + "teal": 3968, + "source": 877, "pc": [ 3919 ] }, { - "teal": 3965, - "source": 871, + "teal": 3969, + "source": 877, "pc": [ 3920, 3921, @@ -17817,131 +17817,131 @@ ] }, { - "teal": 3970, - "source": 872, + "teal": 3974, + "source": 878, "pc": [ 3923, 3924 ] }, { - "teal": 3971, - "source": 872, + "teal": 3975, + "source": 878, "pc": [ 3925 ] }, { - "teal": 3972, - "source": 872, + "teal": 3976, + "source": 878, "pc": [ 3926, 3927 ] }, { - "teal": 3973, - "source": 872, + "teal": 3977, + "source": 878, "pc": [ 3928 ] }, { - "teal": 3974, - "source": 872, + "teal": 3978, + "source": 878, "pc": [ 3929 ] }, { - "teal": 3975, - "source": 872, + "teal": 3979, + "source": 878, "pc": [ 3930 ] }, { - "teal": 3976, - "source": 872, + "teal": 3980, + "source": 878, "pc": [ 3931 ] }, { - "teal": 3977, - "source": 872, + "teal": 3981, + "source": 878, "pc": [ 3932 ] }, { - "teal": 3978, - "source": 872, + "teal": 3982, + "source": 878, "pc": [ 3933, 3934 ] }, { - "teal": 3979, - "source": 872, + "teal": 3983, + "source": 878, "pc": [ 3935 ] }, { - "teal": 3980, - "source": 872, + "teal": 3984, + "source": 878, "pc": [ 3936 ] }, { - "teal": 3981, - "source": 872, + "teal": 3985, + "source": 878, "pc": [ 3937 ] }, { - "teal": 3982, - "source": 872, + "teal": 3986, + "source": 878, "pc": [ 3938 ] }, { - "teal": 3983, - "source": 872, + "teal": 3987, + "source": 878, "pc": [ 3939 ] }, { - "teal": 3984, - "source": 872, + "teal": 3988, + "source": 878, "pc": [ 3940 ] }, { - "teal": 3985, - "source": 872, + "teal": 3989, + "source": 878, "pc": [ 3941, 3942 ] }, { - "teal": 3986, - "source": 872, + "teal": 3990, + "source": 878, "pc": [ 3943 ] }, { - "teal": 3987, - "source": 872, + "teal": 3991, + "source": 878, "pc": [ 3944, 3945, @@ -17949,208 +17949,208 @@ ] }, { - "teal": 3992, - "source": 873, + "teal": 3996, + "source": 879, "pc": [ 3947, 3948 ] }, { - "teal": 3993, - "source": 873, + "teal": 3997, + "source": 879, "pc": [ 3949 ] }, { - "teal": 3994, - "source": 873, + "teal": 3998, + "source": 879, "pc": [ 3950 ] }, { - "teal": 3995, - "source": 873, + "teal": 3999, + "source": 879, "pc": [ 3951, 3952 ] }, { - "teal": 3996, - "source": 873, + "teal": 4000, + "source": 879, "pc": [ 3953 ] }, { - "teal": 3999, - "source": 873, + "teal": 4003, + "source": 879, "errorMessage": "can't move to same node", "pc": [ 3954 ] }, { - "teal": 4003, - "source": 875, + "teal": 4007, + "source": 881, "pc": [ 3955, 3956 ] }, { - "teal": 4004, - "source": 875, + "teal": 4008, + "source": 881, "pc": [ 3957, 3958 ] }, { - "teal": 4005, - "source": 875, + "teal": 4009, + "source": 881, "pc": [ 3959 ] }, { - "teal": 4006, - "source": 875, + "teal": 4010, + "source": 881, "pc": [ 3960 ] }, { - "teal": 4007, - "source": 875, + "teal": 4011, + "source": 881, "pc": [ 3961 ] }, { - "teal": 4008, - "source": 875, + "teal": 4012, + "source": 881, "pc": [ 3962 ] }, { - "teal": 4009, - "source": 875, + "teal": 4013, + "source": 881, "pc": [ 3963 ] }, { - "teal": 4010, - "source": 875, + "teal": 4014, + "source": 881, "pc": [ 3964, 3965 ] }, { - "teal": 4011, - "source": 875, + "teal": 4015, + "source": 881, "pc": [ 3966 ] }, { - "teal": 4012, - "source": 875, + "teal": 4016, + "source": 881, "pc": [ 3967 ] }, { - "teal": 4013, - "source": 875, + "teal": 4017, + "source": 881, "pc": [ 3968 ] }, { - "teal": 4014, - "source": 875, + "teal": 4018, + "source": 881, "pc": [ 3969, 3970 ] }, { - "teal": 4015, - "source": 875, + "teal": 4019, + "source": 881, "pc": [ 3971 ] }, { - "teal": 4016, - "source": 875, + "teal": 4020, + "source": 881, "pc": [ 3972, 3973 ] }, { - "teal": 4017, - "source": 875, + "teal": 4021, + "source": 881, "pc": [ 3974 ] }, { - "teal": 4018, - "source": 875, + "teal": 4022, + "source": 881, "pc": [ 3975 ] }, { - "teal": 4019, - "source": 875, + "teal": 4023, + "source": 881, "pc": [ 3976, 3977 ] }, { - "teal": 4020, - "source": 875, + "teal": 4024, + "source": 881, "pc": [ 3978 ] }, { - "teal": 4026, - "source": 878, + "teal": 4030, + "source": 884, "pc": [ 3979 ] }, { - "teal": 4027, - "source": 878, + "teal": 4031, + "source": 884, "pc": [ 3980, 3981 ] }, { - "teal": 4028, - "source": 878, + "teal": 4032, + "source": 884, "pc": [ 3982, 3983 ] }, { - "teal": 4029, - "source": 878, + "teal": 4033, + "source": 884, "pc": [ 3984, 3985, @@ -18161,78 +18161,78 @@ ] }, { - "teal": 4030, - "source": 878, + "teal": 4034, + "source": 884, "pc": [ 3990, 3991 ] }, { - "teal": 4034, - "source": 879, + "teal": 4038, + "source": 885, "pc": [ 3992, 3993 ] }, { - "teal": 4035, - "source": 879, + "teal": 4039, + "source": 885, "pc": [ 3994, 3995 ] }, { - "teal": 4038, - "source": 878, + "teal": 4042, + "source": 884, "pc": [ 3996 ] }, { - "teal": 4039, - "source": 878, + "teal": 4043, + "source": 884, "pc": [ 3997, 3998 ] }, { - "teal": 4042, - "source": 878, + "teal": 4046, + "source": 884, "pc": [ 3999 ] }, { - "teal": 4046, - "source": 883, + "teal": 4050, + "source": 889, "pc": [ 4000, 4001 ] }, { - "teal": 4047, - "source": 883, + "teal": 4051, + "source": 889, "pc": [ 4002, 4003 ] }, { - "teal": 4048, - "source": 883, + "teal": 4052, + "source": 889, "pc": [ 4004, 4005 ] }, { - "teal": 4049, - "source": 883, + "teal": 4053, + "source": 889, "pc": [ 4006, 4007, @@ -18240,45 +18240,45 @@ ] }, { - "teal": 4053, - "source": 884, + "teal": 4057, + "source": 890, "pc": [ 4009 ] }, { - "teal": 4060, - "source": 871, + "teal": 4064, + "source": 877, "pc": [ 4010, 4011 ] }, { - "teal": 4061, - "source": 871, + "teal": 4065, + "source": 877, "pc": [ 4012 ] }, { - "teal": 4062, - "source": 871, + "teal": 4066, + "source": 877, "pc": [ 4013 ] }, { - "teal": 4063, - "source": 871, + "teal": 4067, + "source": 877, "pc": [ 4014, 4015 ] }, { - "teal": 4064, - "source": 871, + "teal": 4068, + "source": 877, "pc": [ 4016, 4017, @@ -18286,38 +18286,38 @@ ] }, { - "teal": 4071, - "source": 870, + "teal": 4075, + "source": 876, "pc": [ 4019, 4020 ] }, { - "teal": 4072, - "source": 870, + "teal": 4076, + "source": 876, "pc": [ 4021 ] }, { - "teal": 4073, - "source": 870, + "teal": 4077, + "source": 876, "pc": [ 4022 ] }, { - "teal": 4074, - "source": 870, + "teal": 4078, + "source": 876, "pc": [ 4023, 4024 ] }, { - "teal": 4075, - "source": 870, + "teal": 4079, + "source": 876, "pc": [ 4025, 4026, @@ -18325,30 +18325,30 @@ ] }, { - "teal": 4079, - "source": 888, + "teal": 4083, + "source": 894, "errorMessage": "couldn't find pool app id in nodes to move", "pc": [ 4028 ] }, { - "teal": 4080, - "source": 864, + "teal": 4084, + "source": 870, "pc": [ 4029 ] }, { - "teal": 4085, - "source": 902, + "teal": 4089, + "source": 908, "pc": [ 4030 ] }, { - "teal": 4088, - "source": 902, + "teal": 4092, + "source": 908, "pc": [ 4031, 4032, @@ -18356,45 +18356,45 @@ ] }, { - "teal": 4089, - "source": 902, + "teal": 4093, + "source": 908, "pc": [ 4034 ] }, { - "teal": 4090, - "source": 902, + "teal": 4094, + "source": 908, "pc": [ 4035 ] }, { - "teal": 4091, - "source": 902, + "teal": 4095, + "source": 908, "pc": [ 4036, 4037 ] }, { - "teal": 4092, - "source": 902, + "teal": 4096, + "source": 908, "pc": [ 4038 ] }, { - "teal": 4095, - "source": 902, + "teal": 4099, + "source": 908, "errorMessage": "argument 0 (receiver) for emptyTokenRewards must be a address", "pc": [ 4039 ] }, { - "teal": 4098, - "source": 902, + "teal": 4102, + "source": 908, "pc": [ 4040, 4041, @@ -18402,15 +18402,15 @@ ] }, { - "teal": 4099, - "source": 902, + "teal": 4103, + "source": 908, "pc": [ 4043 ] }, { - "teal": 4102, - "source": 902, + "teal": 4106, + "source": 908, "pc": [ 4044, 4045, @@ -18418,43 +18418,43 @@ ] }, { - "teal": 4103, - "source": 902, + "teal": 4107, + "source": 908, "pc": [ 4047 ] }, { - "teal": 4104, - "source": 902, + "teal": 4108, + "source": 908, "pc": [ 4048 ] }, { - "teal": 4105, - "source": 902, + "teal": 4109, + "source": 908, "pc": [ 4049 ] }, { - "teal": 4106, - "source": 902, + "teal": 4110, + "source": 908, "pc": [ 4050 ] }, { - "teal": 4107, - "source": 902, + "teal": 4111, + "source": 908, "pc": [ 4051 ] }, { - "teal": 4121, - "source": 902, + "teal": 4125, + "source": 908, "pc": [ 4052, 4053, @@ -18462,31 +18462,31 @@ ] }, { - "teal": 4124, - "source": 902, + "teal": 4128, + "source": 908, "pc": [ 4055 ] }, { - "teal": 4125, - "source": 902, + "teal": 4129, + "source": 908, "pc": [ 4056, 4057 ] }, { - "teal": 4129, - "source": 903, + "teal": 4133, + "source": 909, "pc": [ 4058, 4059 ] }, { - "teal": 4130, - "source": 903, + "teal": 4134, + "source": 909, "pc": [ 4060, 4061, @@ -18494,568 +18494,568 @@ ] }, { - "teal": 4134, - "source": 904, + "teal": 4138, + "source": 910, "pc": [ 4063, 4064 ] }, { - "teal": 4135, - "source": 904, + "teal": 4139, + "source": 910, "pc": [ 4065 ] }, { - "teal": 4136, - "source": 904, + "teal": 4140, + "source": 910, "pc": [ 4066 ] }, { - "teal": 4137, - "source": 904, + "teal": 4141, + "source": 910, "pc": [ 4067, 4068 ] }, { - "teal": 4138, - "source": 904, + "teal": 4142, + "source": 910, "pc": [ 4069 ] }, { - "teal": 4139, - "source": 904, + "teal": 4143, + "source": 910, "pc": [ 4070 ] }, { - "teal": 4140, - "source": 904, + "teal": 4144, + "source": 910, "pc": [ 4071, 4072 ] }, { - "teal": 4141, - "source": 904, + "teal": 4145, + "source": 910, "pc": [ 4073 ] }, { - "teal": 4142, - "source": 904, + "teal": 4146, + "source": 910, "pc": [ 4074 ] }, { - "teal": 4143, - "source": 904, + "teal": 4147, + "source": 910, "pc": [ 4075, 4076 ] }, { - "teal": 4147, - "source": 905, + "teal": 4151, + "source": 911, "pc": [ 4077, 4078 ] }, { - "teal": 4148, - "source": 905, + "teal": 4152, + "source": 911, "pc": [ 4079 ] }, { - "teal": 4149, - "source": 905, + "teal": 4153, + "source": 911, "pc": [ 4080 ] }, { - "teal": 4150, - "source": 905, + "teal": 4154, + "source": 911, "pc": [ 4081, 4082 ] }, { - "teal": 4151, - "source": 905, + "teal": 4155, + "source": 911, "pc": [ 4083 ] }, { - "teal": 4152, - "source": 905, + "teal": 4156, + "source": 911, "pc": [ 4084 ] }, { - "teal": 4153, - "source": 905, + "teal": 4157, + "source": 911, "pc": [ 4085, 4086 ] }, { - "teal": 4154, - "source": 905, + "teal": 4158, + "source": 911, "pc": [ 4087 ] }, { - "teal": 4155, - "source": 905, + "teal": 4159, + "source": 911, "pc": [ 4088 ] }, { - "teal": 4156, - "source": 905, + "teal": 4160, + "source": 911, "pc": [ 4089, 4090 ] }, { - "teal": 4160, - "source": 906, + "teal": 4164, + "source": 912, "pc": [ 4091, 4092 ] }, { - "teal": 4161, - "source": 906, + "teal": 4165, + "source": 912, "pc": [ 4093 ] }, { - "teal": 4162, - "source": 906, + "teal": 4166, + "source": 912, "pc": [ 4094 ] }, { - "teal": 4165, - "source": 906, + "teal": 4169, + "source": 912, "errorMessage": "this validator doesn't have a reward token defined", "pc": [ 4095 ] }, { - "teal": 4169, - "source": 907, + "teal": 4173, + "source": 913, "pc": [ 4096, 4097 ] }, { - "teal": 4170, - "source": 907, + "teal": 4174, + "source": 913, "pc": [ 4098 ] }, { - "teal": 4171, - "source": 907, + "teal": 4175, + "source": 913, "pc": [ 4099 ] }, { - "teal": 4172, - "source": 907, + "teal": 4176, + "source": 913, "pc": [ 4100, 4101 ] }, { - "teal": 4173, - "source": 907, + "teal": 4177, + "source": 913, "pc": [ 4102 ] }, { - "teal": 4174, - "source": 907, + "teal": 4178, + "source": 913, "pc": [ 4103 ] }, { - "teal": 4175, - "source": 907, + "teal": 4179, + "source": 913, "pc": [ 4104, 4105 ] }, { - "teal": 4176, - "source": 907, + "teal": 4180, + "source": 913, "pc": [ 4106 ] }, { - "teal": 4177, - "source": 907, + "teal": 4181, + "source": 913, "pc": [ 4107 ] }, { - "teal": 4178, - "source": 907, + "teal": 4182, + "source": 913, "pc": [ 4108, 4109 ] }, { - "teal": 4183, - "source": 910, + "teal": 4187, + "source": 916, "pc": [ 4110, 4111 ] }, { - "teal": 4184, - "source": 910, + "teal": 4188, + "source": 916, "pc": [ 4112, 4113 ] }, { - "teal": 4185, - "source": 910, + "teal": 4189, + "source": 916, "pc": [ 4114 ] }, { - "teal": 4186, - "source": 910, + "teal": 4190, + "source": 916, "pc": [ 4115, 4116 ] }, { - "teal": 4187, - "source": 910, + "teal": 4191, + "source": 916, "pc": [ 4117, 4118 ] }, { - "teal": 4188, - "source": 910, + "teal": 4192, + "source": 916, "pc": [ 4119 ] }, { - "teal": 4189, - "source": 910, + "teal": 4193, + "source": 916, "pc": [ 4120, 4121 ] }, { - "teal": 4190, - "source": 910, + "teal": 4194, + "source": 916, "pc": [ 4122 ] }, { - "teal": 4191, - "source": 909, + "teal": 4195, + "source": 915, "pc": [ 4123, 4124 ] }, { - "teal": 4198, - "source": 913, + "teal": 4202, + "source": 919, "pc": [ 4125 ] }, { - "teal": 4199, - "source": 913, + "teal": 4203, + "source": 919, "pc": [ 4126, 4127 ] }, { - "teal": 4200, - "source": 913, + "teal": 4204, + "source": 919, "pc": [ 4128, 4129 ] }, { - "teal": 4201, - "source": 913, + "teal": 4205, + "source": 919, "pc": [ 4130, 4131 ] }, { - "teal": 4202, - "source": 913, + "teal": 4206, + "source": 919, "pc": [ 4132, 4133 ] }, { - "teal": 4206, - "source": 914, + "teal": 4210, + "source": 920, "pc": [ 4134, 4135 ] }, { - "teal": 4207, - "source": 914, + "teal": 4211, + "source": 920, "pc": [ 4136, 4137 ] }, { - "teal": 4211, - "source": 915, + "teal": 4215, + "source": 921, "pc": [ 4138, 4139 ] }, { - "teal": 4212, - "source": 915, + "teal": 4216, + "source": 921, "pc": [ 4140, 4141 ] }, { - "teal": 4213, - "source": 915, + "teal": 4217, + "source": 921, "pc": [ 4142, 4143 ] }, { - "teal": 4214, - "source": 915, + "teal": 4218, + "source": 921, "pc": [ 4144 ] }, { - "teal": 4215, - "source": 915, + "teal": 4219, + "source": 921, "pc": [ 4145, 4146 ] }, { - "teal": 4216, - "source": 915, + "teal": 4220, + "source": 921, "pc": [ 4147, 4148 ] }, { - "teal": 4217, - "source": 915, + "teal": 4221, + "source": 921, "pc": [ 4149 ] }, { - "teal": 4218, - "source": 915, + "teal": 4222, + "source": 921, "pc": [ 4150, 4151 ] }, { - "teal": 4221, - "source": 913, + "teal": 4225, + "source": 919, "pc": [ 4152 ] }, { - "teal": 4222, - "source": 913, + "teal": 4226, + "source": 919, "pc": [ 4153, 4154 ] }, { - "teal": 4225, - "source": 913, + "teal": 4229, + "source": 919, "pc": [ 4155 ] }, { - "teal": 4232, - "source": 918, + "teal": 4236, + "source": 924, "pc": [ 4156, 4157 ] }, { - "teal": 4233, - "source": 918, + "teal": 4237, + "source": 924, "pc": [ 4158, 4159 ] }, { - "teal": 4234, - "source": 918, + "teal": 4238, + "source": 924, "pc": [ 4160 ] }, { - "teal": 4235, - "source": 918, + "teal": 4239, + "source": 924, "pc": [ 4161, 4162 ] }, { - "teal": 4236, - "source": 918, + "teal": 4240, + "source": 924, "pc": [ 4163, 4164 ] }, { - "teal": 4237, - "source": 918, + "teal": 4241, + "source": 924, "pc": [ 4165 ] }, { - "teal": 4238, - "source": 918, + "teal": 4242, + "source": 924, "pc": [ 4166, 4167 ] }, { - "teal": 4239, - "source": 918, + "teal": 4243, + "source": 924, "pc": [ 4168 ] }, { - "teal": 4242, - "source": 917, + "teal": 4246, + "source": 923, "errorMessage": "balance of remaining reward tokens should match the held back amount", "pc": [ 4169 ] }, { - "teal": 4246, - "source": 921, + "teal": 4250, + "source": 927, "pc": [ 4170, 4171 ] }, { - "teal": 4249, - "source": 902, + "teal": 4253, + "source": 908, "pc": [ 4172, 4173 ] }, { - "teal": 4252, - "source": 902, + "teal": 4256, + "source": 908, "pc": [ 4174, 4175 ] }, { - "teal": 4253, - "source": 902, + "teal": 4257, + "source": 908, "pc": [ 4176 ] }, { - "teal": 4257, - "source": 1013, + "teal": 4261, + "source": 1019, "pc": [ 4177, 4178, @@ -19063,97 +19063,97 @@ ] }, { - "teal": 4264, - "source": 1015, + "teal": 4268, + "source": 1021, "pc": [ 4180, 4181 ] }, { - "teal": 4265, - "source": 1015, + "teal": 4269, + "source": 1021, "pc": [ 4182 ] }, { - "teal": 4266, - "source": 1015, + "teal": 4270, + "source": 1021, "pc": [ 4183, 4184 ] }, { - "teal": 4267, - "source": 1015, + "teal": 4271, + "source": 1021, "pc": [ 4185 ] }, { - "teal": 4268, - "source": 1015, + "teal": 4272, + "source": 1021, "pc": [ 4186, 4187 ] }, { - "teal": 4269, - "source": 1015, + "teal": 4273, + "source": 1021, "pc": [ 4188 ] }, { - "teal": 4270, - "source": 1015, + "teal": 4274, + "source": 1021, "pc": [ 4189 ] }, { - "teal": 4271, - "source": 1015, + "teal": 4275, + "source": 1021, "pc": [ 4190, 4191 ] }, { - "teal": 4272, - "source": 1015, + "teal": 4276, + "source": 1021, "pc": [ 4192 ] }, { - "teal": 4273, - "source": 1015, + "teal": 4277, + "source": 1021, "pc": [ 4193 ] }, { - "teal": 4276, - "source": 1014, + "teal": 4280, + "source": 1020, "errorMessage": "can only be called by validator owner", "pc": [ 4194 ] }, { - "teal": 4277, - "source": 1013, + "teal": 4281, + "source": 1019, "pc": [ 4195 ] }, { - "teal": 4281, - "source": 1020, + "teal": 4285, + "source": 1026, "pc": [ 4196, 4197, @@ -19161,89 +19161,89 @@ ] }, { - "teal": 4289, - "source": 1022, + "teal": 4293, + "source": 1028, "pc": [ 4199, 4200 ] }, { - "teal": 4290, - "source": 1022, + "teal": 4294, + "source": 1028, "pc": [ 4201 ] }, { - "teal": 4291, - "source": 1022, + "teal": 4295, + "source": 1028, "pc": [ 4202, 4203 ] }, { - "teal": 4292, - "source": 1022, + "teal": 4296, + "source": 1028, "pc": [ 4204 ] }, { - "teal": 4293, - "source": 1022, + "teal": 4297, + "source": 1028, "pc": [ 4205, 4206 ] }, { - "teal": 4294, - "source": 1022, + "teal": 4298, + "source": 1028, "pc": [ 4207 ] }, { - "teal": 4295, - "source": 1022, + "teal": 4299, + "source": 1028, "pc": [ 4208 ] }, { - "teal": 4296, - "source": 1022, + "teal": 4300, + "source": 1028, "pc": [ 4209, 4210 ] }, { - "teal": 4297, - "source": 1022, + "teal": 4301, + "source": 1028, "pc": [ 4211 ] }, { - "teal": 4298, - "source": 1022, + "teal": 4302, + "source": 1028, "pc": [ 4212 ] }, { - "teal": 4299, - "source": 1022, + "teal": 4303, + "source": 1028, "pc": [ 4213 ] }, { - "teal": 4300, - "source": 1022, + "teal": 4304, + "source": 1028, "pc": [ 4214, 4215, @@ -19251,105 +19251,105 @@ ] }, { - "teal": 4301, - "source": 1023, + "teal": 4305, + "source": 1029, "pc": [ 4217, 4218 ] }, { - "teal": 4302, - "source": 1023, + "teal": 4306, + "source": 1029, "pc": [ 4219, 4220 ] }, { - "teal": 4303, - "source": 1023, + "teal": 4307, + "source": 1029, "pc": [ 4221, 4222 ] }, { - "teal": 4304, - "source": 1023, + "teal": 4308, + "source": 1029, "pc": [ 4223 ] }, { - "teal": 4305, - "source": 1023, + "teal": 4309, + "source": 1029, "pc": [ 4224, 4225 ] }, { - "teal": 4306, - "source": 1023, + "teal": 4310, + "source": 1029, "pc": [ 4226 ] }, { - "teal": 4307, - "source": 1023, + "teal": 4311, + "source": 1029, "pc": [ 4227 ] }, { - "teal": 4308, - "source": 1023, + "teal": 4312, + "source": 1029, "pc": [ 4228, 4229 ] }, { - "teal": 4309, - "source": 1023, + "teal": 4313, + "source": 1029, "pc": [ 4230 ] }, { - "teal": 4310, - "source": 1023, + "teal": 4314, + "source": 1029, "pc": [ 4231 ] }, { - "teal": 4311, - "source": 1022, + "teal": 4315, + "source": 1028, "pc": [ 4232 ] }, { - "teal": 4315, - "source": 1021, + "teal": 4319, + "source": 1027, "errorMessage": "can only be called by owner or manager of validator", "pc": [ 4233 ] }, { - "teal": 4316, - "source": 1020, + "teal": 4320, + "source": 1026, "pc": [ 4234 ] }, { - "teal": 4324, - "source": 1033, + "teal": 4328, + "source": 1039, "pc": [ 4235, 4236, @@ -19357,23 +19357,23 @@ ] }, { - "teal": 4328, - "source": 1034, + "teal": 4332, + "source": 1040, "pc": [ 4238 ] }, { - "teal": 4329, - "source": 1034, + "teal": 4333, + "source": 1040, "pc": [ 4239, 4240 ] }, { - "teal": 4330, - "source": 1034, + "teal": 4334, + "source": 1040, "pc": [ 4241, 4242, @@ -19381,66 +19381,66 @@ ] }, { - "teal": 4331, - "source": 1034, + "teal": 4335, + "source": 1040, "pc": [ 4244 ] }, { - "teal": 4332, - "source": 1034, + "teal": 4336, + "source": 1040, "pc": [ 4245 ] }, { - "teal": 4333, - "source": 1034, + "teal": 4337, + "source": 1040, "pc": [ 4246 ] }, { - "teal": 4334, - "source": 1034, + "teal": 4338, + "source": 1040, "pc": [ 4247 ] }, { - "teal": 4335, - "source": 1034, + "teal": 4339, + "source": 1040, "pc": [ 4248 ] }, { - "teal": 4336, - "source": 1034, + "teal": 4340, + "source": 1040, "pc": [ 4249 ] }, { - "teal": 4339, - "source": 1034, + "teal": 4343, + "source": 1040, "errorMessage": "the specified validator id isn't valid", "pc": [ 4250 ] }, { - "teal": 4343, - "source": 1035, + "teal": 4347, + "source": 1041, "pc": [ 4251, 4252 ] }, { - "teal": 4344, - "source": 1035, + "teal": 4348, + "source": 1041, "pc": [ 4253, 4254, @@ -19448,45 +19448,45 @@ ] }, { - "teal": 4345, - "source": 1035, + "teal": 4349, + "source": 1041, "pc": [ 4256 ] }, { - "teal": 4346, + "teal": 4350, "source": 58, "pc": [ 4257 ] }, { - "teal": 4347, - "source": 1035, + "teal": 4351, + "source": 1041, "pc": [ 4258 ] }, { - "teal": 4350, - "source": 1035, + "teal": 4354, + "source": 1041, "errorMessage": "pool id not in valid range", "pc": [ 4259 ] }, { - "teal": 4357, - "source": 1037, + "teal": 4361, + "source": 1043, "pc": [ 4260, 4261 ] }, { - "teal": 4358, - "source": 1037, + "teal": 4362, + "source": 1043, "pc": [ 4262, 4263, @@ -19494,36 +19494,36 @@ ] }, { - "teal": 4359, - "source": 1037, + "teal": 4363, + "source": 1043, "pc": [ 4265 ] }, { - "teal": 4360, - "source": 1037, + "teal": 4364, + "source": 1043, "pc": [ 4266 ] }, { - "teal": 4361, - "source": 1037, + "teal": 4365, + "source": 1043, "pc": [ 4267 ] }, { - "teal": 4362, - "source": 1037, + "teal": 4366, + "source": 1043, "pc": [ 4268 ] }, { - "teal": 4363, - "source": 1037, + "teal": 4367, + "source": 1043, "pc": [ 4269, 4270, @@ -19531,16 +19531,16 @@ ] }, { - "teal": 4364, - "source": 1037, + "teal": 4368, + "source": 1043, "pc": [ 4272, 4273 ] }, { - "teal": 4365, - "source": 1037, + "teal": 4369, + "source": 1043, "pc": [ 4274, 4275, @@ -19548,46 +19548,46 @@ ] }, { - "teal": 4366, - "source": 1037, + "teal": 4370, + "source": 1043, "pc": [ 4277 ] }, { - "teal": 4367, - "source": 1037, + "teal": 4371, + "source": 1043, "pc": [ 4278, 4279 ] }, { - "teal": 4368, - "source": 1037, + "teal": 4372, + "source": 1043, "pc": [ 4280, 4281 ] }, { - "teal": 4369, - "source": 1037, + "teal": 4373, + "source": 1043, "pc": [ 4282 ] }, { - "teal": 4370, - "source": 1037, + "teal": 4374, + "source": 1043, "pc": [ 4283, 4284 ] }, { - "teal": 4371, - "source": 1037, + "teal": 4375, + "source": 1043, "pc": [ 4285, 4286, @@ -19595,81 +19595,81 @@ ] }, { - "teal": 4372, - "source": 1037, + "teal": 4376, + "source": 1043, "pc": [ 4288 ] }, { - "teal": 4373, - "source": 1037, + "teal": 4377, + "source": 1043, "pc": [ 4289 ] }, { - "teal": 4374, - "source": 1037, + "teal": 4378, + "source": 1043, "pc": [ 4290 ] }, { - "teal": 4375, - "source": 1037, + "teal": 4379, + "source": 1043, "pc": [ 4291, 4292 ] }, { - "teal": 4376, - "source": 1037, + "teal": 4380, + "source": 1043, "pc": [ 4293 ] }, { - "teal": 4377, - "source": 1037, + "teal": 4381, + "source": 1043, "pc": [ 4294 ] }, { - "teal": 4378, - "source": 1037, + "teal": 4382, + "source": 1043, "pc": [ 4295 ] }, { - "teal": 4379, - "source": 1037, + "teal": 4383, + "source": 1043, "pc": [ 4296 ] }, { - "teal": 4383, - "source": 1036, + "teal": 4387, + "source": 1042, "errorMessage": "pool id outside of range of pools created for this validator", "pc": [ 4297 ] }, { - "teal": 4390, - "source": 1043, + "teal": 4394, + "source": 1049, "pc": [ 4298, 4299 ] }, { - "teal": 4391, - "source": 1043, + "teal": 4395, + "source": 1049, "pc": [ 4300, 4301, @@ -19677,31 +19677,31 @@ ] }, { - "teal": 4392, - "source": 1043, + "teal": 4396, + "source": 1049, "pc": [ 4303 ] }, { - "teal": 4393, - "source": 1043, + "teal": 4397, + "source": 1049, "pc": [ 4304, 4305 ] }, { - "teal": 4394, - "source": 1043, + "teal": 4398, + "source": 1049, "pc": [ 4306, 4307 ] }, { - "teal": 4395, - "source": 1043, + "teal": 4399, + "source": 1049, "pc": [ 4308, 4309, @@ -19709,87 +19709,87 @@ ] }, { - "teal": 4396, - "source": 1043, + "teal": 4400, + "source": 1049, "pc": [ 4311 ] }, { - "teal": 4397, - "source": 1043, + "teal": 4401, + "source": 1049, "pc": [ 4312 ] }, { - "teal": 4398, - "source": 1043, + "teal": 4402, + "source": 1049, "pc": [ 4313 ] }, { - "teal": 4399, - "source": 1043, + "teal": 4403, + "source": 1049, "pc": [ 4314, 4315 ] }, { - "teal": 4400, - "source": 1043, + "teal": 4404, + "source": 1049, "pc": [ 4316 ] }, { - "teal": 4401, - "source": 1043, + "teal": 4405, + "source": 1049, "pc": [ 4317 ] }, { - "teal": 4402, - "source": 1043, + "teal": 4406, + "source": 1049, "pc": [ 4318 ] }, { - "teal": 4403, - "source": 1043, + "teal": 4407, + "source": 1049, "pc": [ 4319 ] }, { - "teal": 4404, - "source": 1043, + "teal": 4408, + "source": 1049, "pc": [ 4320 ] }, { - "teal": 4405, - "source": 1043, + "teal": 4409, + "source": 1049, "pc": [ 4321 ] }, { - "teal": 4406, - "source": 1043, + "teal": 4410, + "source": 1049, "pc": [ 4322, 4323 ] }, { - "teal": 4407, - "source": 1043, + "teal": 4411, + "source": 1049, "pc": [ 4324, 4325, @@ -19797,82 +19797,82 @@ ] }, { - "teal": 4408, - "source": 1043, + "teal": 4412, + "source": 1049, "pc": [ 4327 ] }, { - "teal": 4409, - "source": 1043, + "teal": 4413, + "source": 1049, "pc": [ 4328 ] }, { - "teal": 4410, - "source": 1043, + "teal": 4414, + "source": 1049, "pc": [ 4329 ] }, { - "teal": 4411, - "source": 1043, + "teal": 4415, + "source": 1049, "pc": [ 4330, 4331 ] }, { - "teal": 4412, - "source": 1043, + "teal": 4416, + "source": 1049, "pc": [ 4332 ] }, { - "teal": 4413, - "source": 1043, + "teal": 4417, + "source": 1049, "pc": [ 4333 ] }, { - "teal": 4414, - "source": 1043, + "teal": 4418, + "source": 1049, "pc": [ 4334 ] }, { - "teal": 4417, - "source": 1042, + "teal": 4421, + "source": 1048, "errorMessage": "The passed in app id doesn't match the passed in ids", "pc": [ 4335 ] }, { - "teal": 4421, - "source": 1047, + "teal": 4425, + "source": 1053, "pc": [ 4336, 4337 ] }, { - "teal": 4422, - "source": 1047, + "teal": 4426, + "source": 1053, "pc": [ 4338, 4339 ] }, { - "teal": 4423, - "source": 1047, + "teal": 4427, + "source": 1053, "pc": [ 4340, 4341, @@ -19880,52 +19880,52 @@ ] }, { - "teal": 4424, - "source": 1047, + "teal": 4428, + "source": 1053, "pc": [ 4343 ] }, { - "teal": 4425, - "source": 1047, + "teal": 4429, + "source": 1053, "pc": [ 4344, 4345 ] }, { - "teal": 4426, - "source": 1047, + "teal": 4430, + "source": 1053, "pc": [ 4346 ] }, { - "teal": 4427, - "source": 1047, + "teal": 4431, + "source": 1053, "pc": [ 4347 ] }, { - "teal": 4428, - "source": 1047, + "teal": 4432, + "source": 1053, "pc": [ 4348 ] }, { - "teal": 4432, - "source": 1049, + "teal": 4436, + "source": 1055, "pc": [ 4349, 4350 ] }, { - "teal": 4433, - "source": 1049, + "teal": 4437, + "source": 1055, "pc": [ 4351, 4352, @@ -19933,23 +19933,23 @@ ] }, { - "teal": 4434, - "source": 1049, + "teal": 4438, + "source": 1055, "pc": [ 4354 ] }, { - "teal": 4435, - "source": 1049, + "teal": 4439, + "source": 1055, "pc": [ 4355, 4356 ] }, { - "teal": 4436, - "source": 1049, + "teal": 4440, + "source": 1055, "pc": [ 4357, 4358, @@ -19957,15 +19957,15 @@ ] }, { - "teal": 4437, - "source": 1049, + "teal": 4441, + "source": 1055, "pc": [ 4360 ] }, { - "teal": 4438, - "source": 1049, + "teal": 4442, + "source": 1055, "pc": [ 4361, 4362, @@ -19983,45 +19983,45 @@ ] }, { - "teal": 4439, - "source": 1049, + "teal": 4443, + "source": 1055, "pc": [ 4374 ] }, { - "teal": 4442, - "source": 1049, + "teal": 4446, + "source": 1055, "errorMessage": "global state value does not exist: AppID.fromUint64(poolKey.poolAppId).globalState('validatorId')", "pc": [ 4375 ] }, { - "teal": 4443, - "source": 1049, + "teal": 4447, + "source": 1055, "pc": [ 4376 ] }, { - "teal": 4444, - "source": 1049, + "teal": 4448, + "source": 1055, "pc": [ 4377 ] }, { - "teal": 4448, - "source": 1050, + "teal": 4452, + "source": 1056, "pc": [ 4378, 4379 ] }, { - "teal": 4449, - "source": 1050, + "teal": 4453, + "source": 1056, "pc": [ 4380, 4381, @@ -20029,23 +20029,23 @@ ] }, { - "teal": 4450, - "source": 1050, + "teal": 4454, + "source": 1056, "pc": [ 4383 ] }, { - "teal": 4451, - "source": 1050, + "teal": 4455, + "source": 1056, "pc": [ 4384, 4385 ] }, { - "teal": 4452, - "source": 1050, + "teal": 4456, + "source": 1056, "pc": [ 4386, 4387, @@ -20053,15 +20053,15 @@ ] }, { - "teal": 4453, - "source": 1050, + "teal": 4457, + "source": 1056, "pc": [ 4389 ] }, { - "teal": 4454, - "source": 1050, + "teal": 4458, + "source": 1056, "pc": [ 4390, 4391, @@ -20074,44 +20074,44 @@ ] }, { - "teal": 4455, - "source": 1050, + "teal": 4459, + "source": 1056, "pc": [ 4398 ] }, { - "teal": 4458, - "source": 1050, + "teal": 4462, + "source": 1056, "errorMessage": "global state value does not exist: AppID.fromUint64(poolKey.poolAppId).globalState('poolId')", "pc": [ 4399 ] }, { - "teal": 4459, - "source": 1050, + "teal": 4463, + "source": 1056, "pc": [ 4400 ] }, { - "teal": 4460, - "source": 1050, + "teal": 4464, + "source": 1056, "pc": [ 4401 ] }, { - "teal": 4461, - "source": 1033, + "teal": 4465, + "source": 1039, "pc": [ 4402 ] }, { - "teal": 4470, - "source": 1059, + "teal": 4474, + "source": 1065, "pc": [ 4403, 4404, @@ -20119,139 +20119,139 @@ ] }, { - "teal": 4473, - "source": 1059, + "teal": 4477, + "source": 1065, "pc": [ 4406 ] }, { - "teal": 4474, - "source": 1059, + "teal": 4478, + "source": 1065, "pc": [ 4407 ] }, { - "teal": 4478, - "source": 1060, + "teal": 4482, + "source": 1066, "pc": [ 4408 ] }, { - "teal": 4479, - "source": 1060, + "teal": 4483, + "source": 1066, "pc": [ 4409, 4410 ] }, { - "teal": 4480, - "source": 1060, + "teal": 4484, + "source": 1066, "pc": [ 4411 ] }, { - "teal": 4481, - "source": 1060, + "teal": 4485, + "source": 1066, "pc": [ 4412 ] }, { - "teal": 4482, - "source": 1060, + "teal": 4486, + "source": 1066, "pc": [ 4413, 4414 ] }, { - "teal": 4487, - "source": 1061, + "teal": 4491, + "source": 1067, "pc": [ 4415, 4416 ] }, { - "teal": 4488, - "source": 1061, + "teal": 4492, + "source": 1067, "pc": [ 4417 ] }, { - "teal": 4489, - "source": 1060, + "teal": 4493, + "source": 1066, "pc": [ 4418 ] }, { - "teal": 4490, - "source": 1060, + "teal": 4494, + "source": 1066, "pc": [ 4419, 4420 ] }, { - "teal": 4491, - "source": 1060, + "teal": 4495, + "source": 1066, "pc": [ 4421 ] }, { - "teal": 4492, - "source": 1060, + "teal": 4496, + "source": 1066, "pc": [ 4422 ] }, { - "teal": 4493, - "source": 1060, + "teal": 4497, + "source": 1066, "pc": [ 4423, 4424 ] }, { - "teal": 4494, - "source": 1060, + "teal": 4498, + "source": 1066, "pc": [ 4425 ] }, { - "teal": 4495, - "source": 1061, + "teal": 4499, + "source": 1067, "pc": [ 4426 ] }, { - "teal": 4496, - "source": 1061, + "teal": 4500, + "source": 1067, "pc": [ 4427 ] }, { - "teal": 4497, - "source": 1061, + "teal": 4501, + "source": 1067, "pc": [ 4428 ] }, { - "teal": 4498, - "source": 1061, + "teal": 4502, + "source": 1067, "pc": [ 4429, 4430, @@ -20259,186 +20259,186 @@ ] }, { - "teal": 4503, - "source": 1064, + "teal": 4507, + "source": 1070, "pc": [ 4432, 4433 ] }, { - "teal": 4504, - "source": 1064, + "teal": 4508, + "source": 1070, "pc": [ 4434 ] }, { - "teal": 4505, - "source": 1060, + "teal": 4509, + "source": 1066, "pc": [ 4435 ] }, { - "teal": 4506, - "source": 1060, + "teal": 4510, + "source": 1066, "pc": [ 4436, 4437 ] }, { - "teal": 4507, - "source": 1060, + "teal": 4511, + "source": 1066, "pc": [ 4438 ] }, { - "teal": 4508, - "source": 1060, + "teal": 4512, + "source": 1066, "pc": [ 4439 ] }, { - "teal": 4509, - "source": 1060, + "teal": 4513, + "source": 1066, "pc": [ 4440, 4441 ] }, { - "teal": 4510, - "source": 1060, + "teal": 4514, + "source": 1066, "pc": [ 4442 ] }, { - "teal": 4511, - "source": 1064, + "teal": 4515, + "source": 1070, "pc": [ 4443 ] }, { - "teal": 4512, - "source": 1064, + "teal": 4516, + "source": 1070, "pc": [ 4444, 4445 ] }, { - "teal": 4513, - "source": 1064, + "teal": 4517, + "source": 1070, "pc": [ 4446 ] }, { - "teal": 4516, - "source": 1064, + "teal": 4520, + "source": 1070, "errorMessage": "global state value does not exist: AppID.fromUint64(validatorConfig.nfdForInfo).globalState('i.owner.a')", "pc": [ 4447 ] }, { - "teal": 4517, - "source": 1064, + "teal": 4521, + "source": 1070, "pc": [ 4448, 4449 ] }, { - "teal": 4522, - "source": 1066, + "teal": 4526, + "source": 1072, "pc": [ 4450 ] }, { - "teal": 4523, - "source": 1066, + "teal": 4527, + "source": 1072, "pc": [ 4451, 4452 ] }, { - "teal": 4524, - "source": 1060, + "teal": 4528, + "source": 1066, "pc": [ 4453 ] }, { - "teal": 4525, - "source": 1060, + "teal": 4529, + "source": 1066, "pc": [ 4454, 4455 ] }, { - "teal": 4526, - "source": 1060, + "teal": 4530, + "source": 1066, "pc": [ 4456 ] }, { - "teal": 4527, - "source": 1060, + "teal": 4531, + "source": 1066, "pc": [ 4457 ] }, { - "teal": 4528, - "source": 1060, + "teal": 4532, + "source": 1066, "pc": [ 4458, 4459 ] }, { - "teal": 4529, - "source": 1060, + "teal": 4533, + "source": 1066, "pc": [ 4460 ] }, { - "teal": 4530, - "source": 1066, + "teal": 4534, + "source": 1072, "pc": [ 4461, 4462 ] }, { - "teal": 4531, - "source": 1066, + "teal": 4535, + "source": 1072, "pc": [ 4463 ] }, { - "teal": 4532, - "source": 1066, + "teal": 4536, + "source": 1072, "pc": [ 4464 ] }, { - "teal": 4533, - "source": 1066, + "teal": 4537, + "source": 1072, "pc": [ 4465, 4466, @@ -20446,90 +20446,90 @@ ] }, { - "teal": 4534, - "source": 1066, + "teal": 4538, + "source": 1072, "pc": [ 4468, 4469 ] }, { - "teal": 4535, - "source": 1066, + "teal": 4539, + "source": 1072, "pc": [ 4470, 4471 ] }, { - "teal": 4536, - "source": 1060, + "teal": 4540, + "source": 1066, "pc": [ 4472 ] }, { - "teal": 4537, - "source": 1060, + "teal": 4541, + "source": 1066, "pc": [ 4473, 4474 ] }, { - "teal": 4538, - "source": 1060, + "teal": 4542, + "source": 1066, "pc": [ 4475 ] }, { - "teal": 4539, - "source": 1060, + "teal": 4543, + "source": 1066, "pc": [ 4476 ] }, { - "teal": 4540, - "source": 1060, + "teal": 4544, + "source": 1066, "pc": [ 4477, 4478 ] }, { - "teal": 4541, - "source": 1060, + "teal": 4545, + "source": 1066, "pc": [ 4479 ] }, { - "teal": 4542, - "source": 1066, + "teal": 4546, + "source": 1072, "pc": [ 4480, 4481 ] }, { - "teal": 4543, - "source": 1066, + "teal": 4547, + "source": 1072, "pc": [ 4482 ] }, { - "teal": 4544, - "source": 1066, + "teal": 4548, + "source": 1072, "pc": [ 4483 ] }, { - "teal": 4547, - "source": 1066, + "teal": 4551, + "source": 1072, "pc": [ 4484, 4485, @@ -20537,75 +20537,75 @@ ] }, { - "teal": 4552, - "source": 1068, + "teal": 4556, + "source": 1074, "pc": [ 4487, 4488 ] }, { - "teal": 4553, - "source": 1068, + "teal": 4557, + "source": 1074, "pc": [ 4489, 4490 ] }, { - "teal": 4554, - "source": 1068, + "teal": 4558, + "source": 1074, "pc": [ 4491 ] }, { - "teal": 4555, - "source": 1068, + "teal": 4559, + "source": 1074, "pc": [ 4492, 4493 ] }, { - "teal": 4556, - "source": 1068, + "teal": 4560, + "source": 1074, "pc": [ 4494 ] }, { - "teal": 4557, - "source": 1068, + "teal": 4561, + "source": 1074, "pc": [ 4495 ] }, { - "teal": 4558, - "source": 1068, + "teal": 4562, + "source": 1074, "pc": [ 4496, 4497 ] }, { - "teal": 4559, - "source": 1068, + "teal": 4563, + "source": 1074, "pc": [ 4498 ] }, { - "teal": 4564, - "source": 1059, + "teal": 4568, + "source": 1065, "pc": [ 4499 ] }, { - "teal": 4568, - "source": 1073, + "teal": 4572, + "source": 1079, "pc": [ 4500, 4501, @@ -20613,16 +20613,16 @@ ] }, { - "teal": 4572, - "source": 1075, + "teal": 4576, + "source": 1081, "pc": [ 4503, 4504 ] }, { - "teal": 4573, - "source": 1075, + "teal": 4577, + "source": 1081, "pc": [ 4505, 4506, @@ -20630,38 +20630,38 @@ ] }, { - "teal": 4574, - "source": 1075, + "teal": 4578, + "source": 1081, "pc": [ 4508, 4509 ] }, { - "teal": 4575, - "source": 1075, + "teal": 4579, + "source": 1081, "pc": [ 4510 ] }, { - "teal": 4576, - "source": 1075, + "teal": 4580, + "source": 1081, "pc": [ 4511 ] }, { - "teal": 4580, - "source": 1076, + "teal": 4584, + "source": 1082, "pc": [ 4512, 4513 ] }, { - "teal": 4581, - "source": 1076, + "teal": 4585, + "source": 1082, "pc": [ 4514, 4515, @@ -20669,46 +20669,46 @@ ] }, { - "teal": 4582, - "source": 1076, + "teal": 4586, + "source": 1082, "pc": [ 4517, 4518 ] }, { - "teal": 4583, - "source": 1076, + "teal": 4587, + "source": 1082, "pc": [ 4519 ] }, { - "teal": 4584, - "source": 1076, + "teal": 4588, + "source": 1082, "pc": [ 4520 ] }, { - "teal": 4588, - "source": 1077, + "teal": 4592, + "source": 1083, "pc": [ 4521, 4522 ] }, { - "teal": 4589, - "source": 1077, + "teal": 4593, + "source": 1083, "pc": [ 4523, 4524 ] }, { - "teal": 4590, - "source": 1077, + "teal": 4594, + "source": 1083, "pc": [ 4525, 4526, @@ -20716,31 +20716,31 @@ ] }, { - "teal": 4591, - "source": 1077, + "teal": 4595, + "source": 1083, "pc": [ 4528 ] }, { - "teal": 4594, - "source": 1077, + "teal": 4598, + "source": 1083, "errorMessage": "sender must be owner to add new validator", "pc": [ 4529 ] }, { - "teal": 4601, - "source": 1080, + "teal": 4605, + "source": 1086, "pc": [ 4530, 4531 ] }, { - "teal": 4602, - "source": 1080, + "teal": 4606, + "source": 1086, "pc": [ 4532, 4533, @@ -20748,36 +20748,36 @@ ] }, { - "teal": 4603, - "source": 1080, + "teal": 4607, + "source": 1086, "pc": [ 4535 ] }, { - "teal": 4604, - "source": 1080, + "teal": 4608, + "source": 1086, "pc": [ 4536 ] }, { - "teal": 4605, - "source": 1080, + "teal": 4609, + "source": 1086, "pc": [ 4537 ] }, { - "teal": 4606, - "source": 1080, + "teal": 4610, + "source": 1086, "pc": [ 4538 ] }, { - "teal": 4607, - "source": 1080, + "teal": 4611, + "source": 1086, "pc": [ 4539, 4540, @@ -20785,16 +20785,16 @@ ] }, { - "teal": 4608, - "source": 1080, + "teal": 4612, + "source": 1086, "pc": [ 4542, 4543 ] }, { - "teal": 4609, - "source": 1080, + "teal": 4613, + "source": 1086, "pc": [ 4544, 4545, @@ -20802,53 +20802,53 @@ ] }, { - "teal": 4610, - "source": 1080, + "teal": 4614, + "source": 1086, "pc": [ 4547 ] }, { - "teal": 4611, - "source": 1080, + "teal": 4615, + "source": 1086, "pc": [ 4548, 4549 ] }, { - "teal": 4612, - "source": 1080, + "teal": 4616, + "source": 1086, "pc": [ 4550 ] }, { - "teal": 4613, - "source": 1080, + "teal": 4617, + "source": 1086, "pc": [ 4551 ] }, { - "teal": 4617, - "source": 1079, + "teal": 4621, + "source": 1085, "errorMessage": "gating type not valid", "pc": [ 4552 ] }, { - "teal": 4624, - "source": 1084, + "teal": 4628, + "source": 1090, "pc": [ 4553, 4554 ] }, { - "teal": 4625, - "source": 1084, + "teal": 4629, + "source": 1090, "pc": [ 4555, 4556, @@ -20856,36 +20856,36 @@ ] }, { - "teal": 4626, - "source": 1084, + "teal": 4630, + "source": 1090, "pc": [ 4558 ] }, { - "teal": 4627, - "source": 1084, + "teal": 4631, + "source": 1090, "pc": [ 4559 ] }, { - "teal": 4628, - "source": 1084, + "teal": 4632, + "source": 1090, "pc": [ 4560 ] }, { - "teal": 4629, - "source": 1084, + "teal": 4633, + "source": 1090, "pc": [ 4561 ] }, { - "teal": 4630, - "source": 1084, + "teal": 4634, + "source": 1090, "pc": [ 4562, 4563, @@ -20893,16 +20893,16 @@ ] }, { - "teal": 4631, - "source": 1084, + "teal": 4635, + "source": 1090, "pc": [ 4565, 4566 ] }, { - "teal": 4632, - "source": 1084, + "teal": 4636, + "source": 1090, "pc": [ 4567, 4568, @@ -20910,53 +20910,53 @@ ] }, { - "teal": 4633, - "source": 1084, + "teal": 4637, + "source": 1090, "pc": [ 4570 ] }, { - "teal": 4634, - "source": 1084, + "teal": 4638, + "source": 1090, "pc": [ 4571, 4572 ] }, { - "teal": 4635, - "source": 1084, + "teal": 4639, + "source": 1090, "pc": [ 4573 ] }, { - "teal": 4636, - "source": 1084, + "teal": 4640, + "source": 1090, "pc": [ 4574 ] }, { - "teal": 4640, - "source": 1083, + "teal": 4644, + "source": 1089, "errorMessage": "epoch length not in allowable range", "pc": [ 4575 ] }, { - "teal": 4647, - "source": 1088, + "teal": 4651, + "source": 1094, "pc": [ 4576, 4577 ] }, { - "teal": 4648, - "source": 1088, + "teal": 4652, + "source": 1094, "pc": [ 4578, 4579, @@ -20964,36 +20964,36 @@ ] }, { - "teal": 4649, - "source": 1088, + "teal": 4653, + "source": 1094, "pc": [ 4581 ] }, { - "teal": 4650, - "source": 1088, + "teal": 4654, + "source": 1094, "pc": [ 4582 ] }, { - "teal": 4651, - "source": 1088, + "teal": 4655, + "source": 1094, "pc": [ 4583 ] }, { - "teal": 4652, - "source": 1088, + "teal": 4656, + "source": 1094, "pc": [ 4584 ] }, { - "teal": 4653, - "source": 1088, + "teal": 4657, + "source": 1094, "pc": [ 4585, 4586, @@ -21001,16 +21001,16 @@ ] }, { - "teal": 4654, - "source": 1088, + "teal": 4658, + "source": 1094, "pc": [ 4588, 4589 ] }, { - "teal": 4655, - "source": 1088, + "teal": 4659, + "source": 1094, "pc": [ 4590, 4591, @@ -21018,53 +21018,53 @@ ] }, { - "teal": 4656, - "source": 1088, + "teal": 4660, + "source": 1094, "pc": [ 4593 ] }, { - "teal": 4657, - "source": 1088, + "teal": 4661, + "source": 1094, "pc": [ 4594, 4595 ] }, { - "teal": 4658, - "source": 1088, + "teal": 4662, + "source": 1094, "pc": [ 4596 ] }, { - "teal": 4659, - "source": 1088, + "teal": 4663, + "source": 1094, "pc": [ 4597 ] }, { - "teal": 4663, - "source": 1087, + "teal": 4667, + "source": 1093, "errorMessage": "commission percentage not valid", "pc": [ 4598 ] }, { - "teal": 4668, - "source": 1091, + "teal": 4672, + "source": 1097, "pc": [ 4599, 4600 ] }, { - "teal": 4669, - "source": 1091, + "teal": 4673, + "source": 1097, "pc": [ 4601, 4602, @@ -21072,29 +21072,29 @@ ] }, { - "teal": 4670, - "source": 1091, + "teal": 4674, + "source": 1097, "pc": [ 4604 ] }, { - "teal": 4671, - "source": 1091, + "teal": 4675, + "source": 1097, "pc": [ 4605 ] }, { - "teal": 4672, - "source": 1091, + "teal": 4676, + "source": 1097, "pc": [ 4606 ] }, { - "teal": 4673, - "source": 1091, + "teal": 4677, + "source": 1097, "pc": [ 4607, 4608, @@ -21102,16 +21102,16 @@ ] }, { - "teal": 4681, - "source": 1093, + "teal": 4685, + "source": 1099, "pc": [ 4610, 4611 ] }, { - "teal": 4682, - "source": 1093, + "teal": 4686, + "source": 1099, "pc": [ 4612, 4613, @@ -21119,39 +21119,39 @@ ] }, { - "teal": 4683, - "source": 1093, + "teal": 4687, + "source": 1099, "pc": [ 4615, 4616 ] }, { - "teal": 4684, - "source": 1093, + "teal": 4688, + "source": 1099, "pc": [ 4617 ] }, { - "teal": 4687, - "source": 1092, + "teal": 4691, + "source": 1098, "errorMessage": "validatorCommissionAddress must be set if percent to validator is not 0", "pc": [ 4618 ] }, { - "teal": 4692, - "source": 1097, + "teal": 4696, + "source": 1103, "pc": [ 4619, 4620 ] }, { - "teal": 4693, - "source": 1097, + "teal": 4697, + "source": 1103, "pc": [ 4621, 4622, @@ -21159,46 +21159,46 @@ ] }, { - "teal": 4694, - "source": 1097, + "teal": 4698, + "source": 1103, "pc": [ 4624 ] }, { - "teal": 4695, - "source": 1097, + "teal": 4699, + "source": 1103, "pc": [ 4625, 4626 ] }, { - "teal": 4696, - "source": 1097, + "teal": 4700, + "source": 1103, "pc": [ 4627 ] }, { - "teal": 4699, - "source": 1097, + "teal": 4703, + "source": 1103, "errorMessage": "staking pool must have minimum entry of 1 algo", "pc": [ 4628 ] }, { - "teal": 4706, - "source": 1100, + "teal": 4710, + "source": 1106, "pc": [ 4629, 4630 ] }, { - "teal": 4707, - "source": 1100, + "teal": 4711, + "source": 1106, "pc": [ 4631, 4632, @@ -21206,36 +21206,36 @@ ] }, { - "teal": 4708, - "source": 1100, + "teal": 4712, + "source": 1106, "pc": [ 4634 ] }, { - "teal": 4709, - "source": 1100, + "teal": 4713, + "source": 1106, "pc": [ 4635 ] }, { - "teal": 4710, - "source": 1100, + "teal": 4714, + "source": 1106, "pc": [ 4636 ] }, { - "teal": 4711, - "source": 1100, + "teal": 4715, + "source": 1106, "pc": [ 4637 ] }, { - "teal": 4712, - "source": 1100, + "teal": 4716, + "source": 1106, "pc": [ 4638, 4639, @@ -21243,16 +21243,16 @@ ] }, { - "teal": 4713, - "source": 1100, + "teal": 4717, + "source": 1106, "pc": [ 4641, 4642 ] }, { - "teal": 4714, - "source": 1100, + "teal": 4718, + "source": 1106, "pc": [ 4643, 4644, @@ -21260,53 +21260,53 @@ ] }, { - "teal": 4715, - "source": 1100, + "teal": 4719, + "source": 1106, "pc": [ 4646 ] }, { - "teal": 4716, - "source": 1100, + "teal": 4720, + "source": 1106, "pc": [ 4647, 4648 ] }, { - "teal": 4717, - "source": 1100, + "teal": 4721, + "source": 1106, "pc": [ 4649 ] }, { - "teal": 4718, - "source": 1100, + "teal": 4722, + "source": 1106, "pc": [ 4650 ] }, { - "teal": 4722, - "source": 1099, + "teal": 4726, + "source": 1105, "errorMessage": "number of pools per node must be be between 1 and the maximum allowed number", "pc": [ 4651 ] }, { - "teal": 4727, - "source": 1103, + "teal": 4731, + "source": 1109, "pc": [ 4652, 4653 ] }, { - "teal": 4728, - "source": 1103, + "teal": 4732, + "source": 1109, "pc": [ 4654, 4655, @@ -21314,29 +21314,29 @@ ] }, { - "teal": 4729, - "source": 1103, + "teal": 4733, + "source": 1109, "pc": [ 4657 ] }, { - "teal": 4730, - "source": 1103, + "teal": 4734, + "source": 1109, "pc": [ 4658 ] }, { - "teal": 4731, - "source": 1103, + "teal": 4735, + "source": 1109, "pc": [ 4659 ] }, { - "teal": 4732, - "source": 1103, + "teal": 4736, + "source": 1109, "pc": [ 4660, 4661, @@ -21344,16 +21344,16 @@ ] }, { - "teal": 4737, - "source": 1104, + "teal": 4741, + "source": 1110, "pc": [ 4663, 4664 ] }, { - "teal": 4738, - "source": 1104, + "teal": 4742, + "source": 1110, "pc": [ 4665, 4666, @@ -21361,45 +21361,45 @@ ] }, { - "teal": 4739, - "source": 1104, + "teal": 4743, + "source": 1110, "pc": [ 4668 ] }, { - "teal": 4740, - "source": 1104, + "teal": 4744, + "source": 1110, "pc": [ 4669, 4670 ] }, { - "teal": 4741, - "source": 1104, + "teal": 4745, + "source": 1110, "pc": [ 4671 ] }, { - "teal": 4744, - "source": 1104, + "teal": 4748, + "source": 1110, "errorMessage": "sunsettingOn must be later than now if set", "pc": [ 4672 ] }, { - "teal": 4747, - "source": 1073, + "teal": 4751, + "source": 1079, "pc": [ 4673 ] }, { - "teal": 4761, - "source": 1119, + "teal": 4765, + "source": 1125, "pc": [ 4674, 4675, @@ -21407,39 +21407,39 @@ ] }, { - "teal": 4764, - "source": 1119, + "teal": 4768, + "source": 1125, "pc": [ 4677 ] }, { - "teal": 4765, - "source": 1119, + "teal": 4769, + "source": 1125, "pc": [ 4678, 4679 ] }, { - "teal": 4769, - "source": 1126, + "teal": 4773, + "source": 1132, "pc": [ 4680, 4681 ] }, { - "teal": 4770, - "source": 1126, + "teal": 4774, + "source": 1132, "pc": [ 4682, 4683 ] }, { - "teal": 4771, - "source": 1126, + "teal": 4775, + "source": 1132, "pc": [ 4684, 4685, @@ -21447,87 +21447,87 @@ ] }, { - "teal": 4772, - "source": 1126, + "teal": 4776, + "source": 1132, "pc": [ 4687 ] }, { - "teal": 4773, - "source": 1126, + "teal": 4777, + "source": 1132, "pc": [ 4688 ] }, { - "teal": 4774, - "source": 1126, + "teal": 4778, + "source": 1132, "pc": [ 4689 ] }, { - "teal": 4775, - "source": 1126, + "teal": 4779, + "source": 1132, "pc": [ 4690, 4691 ] }, { - "teal": 4776, - "source": 1126, + "teal": 4780, + "source": 1132, "pc": [ 4692 ] }, { - "teal": 4777, - "source": 1126, + "teal": 4781, + "source": 1132, "pc": [ 4693 ] }, { - "teal": 4778, - "source": 1126, + "teal": 4782, + "source": 1132, "pc": [ 4694 ] }, { - "teal": 4779, - "source": 1126, + "teal": 4783, + "source": 1132, "pc": [ 4695 ] }, { - "teal": 4780, - "source": 1126, + "teal": 4784, + "source": 1132, "pc": [ 4696 ] }, { - "teal": 4781, - "source": 1126, + "teal": 4785, + "source": 1132, "pc": [ 4697 ] }, { - "teal": 4782, - "source": 1126, + "teal": 4786, + "source": 1132, "pc": [ 4698, 4699 ] }, { - "teal": 4783, - "source": 1126, + "teal": 4787, + "source": 1132, "pc": [ 4700, 4701, @@ -21535,189 +21535,189 @@ ] }, { - "teal": 4784, - "source": 1126, + "teal": 4788, + "source": 1132, "pc": [ 4703 ] }, { - "teal": 4785, - "source": 1126, + "teal": 4789, + "source": 1132, "pc": [ 4704 ] }, { - "teal": 4786, - "source": 1126, + "teal": 4790, + "source": 1132, "pc": [ 4705 ] }, { - "teal": 4787, - "source": 1126, + "teal": 4791, + "source": 1132, "pc": [ 4706, 4707 ] }, { - "teal": 4788, - "source": 1126, + "teal": 4792, + "source": 1132, "pc": [ 4708 ] }, { - "teal": 4789, - "source": 1126, + "teal": 4793, + "source": 1132, "pc": [ 4709 ] }, { - "teal": 4790, - "source": 1126, + "teal": 4794, + "source": 1132, "pc": [ 4710, 4711 ] }, { - "teal": 4803, - "source": 1135, + "teal": 4807, + "source": 1141, "pc": [ 4712 ] }, { - "teal": 4804, - "source": 1135, + "teal": 4808, + "source": 1141, "pc": [ 4713 ] }, { - "teal": 4805, - "source": 1135, + "teal": 4809, + "source": 1141, "pc": [ 4714, 4715 ] }, { - "teal": 4809, - "source": 1135, + "teal": 4813, + "source": 1141, "pc": [ 4716, 4717 ] }, { - "teal": 4810, - "source": 1135, + "teal": 4814, + "source": 1141, "pc": [ 4718, 4719 ] }, { - "teal": 4811, - "source": 1135, + "teal": 4815, + "source": 1141, "pc": [ 4720, 4721 ] }, { - "teal": 4812, - "source": 1135, + "teal": 4816, + "source": 1141, "pc": [ 4722 ] }, { - "teal": 4813, - "source": 1135, + "teal": 4817, + "source": 1141, "pc": [ 4723, 4724 ] }, { - "teal": 4817, - "source": 1135, + "teal": 4821, + "source": 1141, "pc": [ 4725, 4726 ] }, { - "teal": 4818, - "source": 1135, + "teal": 4822, + "source": 1141, "pc": [ 4727, 4728 ] }, { - "teal": 4819, - "source": 1135, + "teal": 4823, + "source": 1141, "pc": [ 4729 ] }, { - "teal": 4820, - "source": 1135, + "teal": 4824, + "source": 1141, "pc": [ 4730, 4731 ] }, { - "teal": 4823, - "source": 1135, + "teal": 4827, + "source": 1141, "pc": [ 4732 ] }, { - "teal": 4824, - "source": 1135, + "teal": 4828, + "source": 1141, "pc": [ 4733, 4734 ] }, { - "teal": 4825, - "source": 1130, + "teal": 4829, + "source": 1136, "pc": [ 4735 ] }, { - "teal": 4826, - "source": 1130, + "teal": 4830, + "source": 1136, "pc": [ 4736, 4737 ] }, { - "teal": 4827, - "source": 1130, + "teal": 4831, + "source": 1136, "pc": [ 4738, 4739 ] }, { - "teal": 4828, - "source": 1130, + "teal": 4832, + "source": 1136, "pc": [ 4740, 4741, @@ -21728,108 +21728,108 @@ ] }, { - "teal": 4829, - "source": 1130, + "teal": 4833, + "source": 1136, "pc": [ 4746, 4747 ] }, { - "teal": 4833, - "source": 1131, + "teal": 4837, + "source": 1137, "pc": [ 4748, 4749 ] }, { - "teal": 4834, - "source": 1131, + "teal": 4838, + "source": 1137, "pc": [ 4750, 4751 ] }, { - "teal": 4844, - "source": 1137, + "teal": 4848, + "source": 1143, "pc": [ 4752, 4753 ] }, { - "teal": 4845, - "source": 1137, + "teal": 4849, + "source": 1143, "pc": [ 4754, 4755 ] }, { - "teal": 4846, - "source": 1137, + "teal": 4850, + "source": 1143, "pc": [ 4756, 4757 ] }, { - "teal": 4849, - "source": 1130, + "teal": 4853, + "source": 1136, "pc": [ 4758 ] }, { - "teal": 4850, - "source": 1130, + "teal": 4854, + "source": 1136, "pc": [ 4759, 4760 ] }, { - "teal": 4853, - "source": 1130, + "teal": 4857, + "source": 1136, "pc": [ 4761 ] }, { - "teal": 4854, - "source": 1130, + "teal": 4858, + "source": 1136, "pc": [ 4762, 4763 ] }, { - "teal": 4855, - "source": 1130, + "teal": 4859, + "source": 1136, "pc": [ 4764 ] }, { - "teal": 4856, - "source": 1130, + "teal": 4860, + "source": 1136, "pc": [ 4765 ] }, { - "teal": 4857, - "source": 1130, + "teal": 4861, + "source": 1136, "pc": [ 4766, 4767 ] }, { - "teal": 4858, - "source": 1130, + "teal": 4862, + "source": 1136, "pc": [ 4768, 4769, @@ -21837,23 +21837,23 @@ ] }, { - "teal": 4859, - "source": 1130, + "teal": 4863, + "source": 1136, "pc": [ 4771 ] }, { - "teal": 4864, - "source": 1140, + "teal": 4868, + "source": 1146, "pc": [ 4772, 4773 ] }, { - "teal": 4865, - "source": 1140, + "teal": 4869, + "source": 1146, "pc": [ 4774, 4775, @@ -21861,15 +21861,15 @@ ] }, { - "teal": 4866, - "source": 1140, + "teal": 4870, + "source": 1146, "pc": [ 4777 ] }, { - "teal": 4867, - "source": 1140, + "teal": 4871, + "source": 1146, "pc": [ 4778, 4779, @@ -21877,194 +21877,194 @@ ] }, { - "teal": 4872, - "source": 1141, + "teal": 4876, + "source": 1147, "pc": [ 4781 ] }, { - "teal": 4873, - "source": 1141, + "teal": 4877, + "source": 1147, "pc": [ 4782, 4783 ] }, { - "teal": 4874, - "source": 1141, + "teal": 4878, + "source": 1147, "pc": [ 4784, 4785 ] }, { - "teal": 4875, - "source": 1141, + "teal": 4879, + "source": 1147, "pc": [ 4786 ] }, { - "teal": 4876, - "source": 1141, + "teal": 4880, + "source": 1147, "pc": [ 4787, 4788 ] }, { - "teal": 4877, - "source": 1141, + "teal": 4881, + "source": 1147, "pc": [ 4789, 4790 ] }, { - "teal": 4878, - "source": 1141, + "teal": 4882, + "source": 1147, "pc": [ 4791 ] }, { - "teal": 4879, - "source": 1141, + "teal": 4883, + "source": 1147, "pc": [ 4792, 4793 ] }, { - "teal": 4880, - "source": 1141, + "teal": 4884, + "source": 1147, "pc": [ 4794, 4795 ] }, { - "teal": 4881, - "source": 1141, + "teal": 4885, + "source": 1147, "pc": [ 4796, 4797 ] }, { - "teal": 4882, - "source": 1141, + "teal": 4886, + "source": 1147, "pc": [ 4798, 4799 ] }, { - "teal": 4883, - "source": 1141, + "teal": 4887, + "source": 1147, "pc": [ 4800 ] }, { - "teal": 4888, - "source": 1145, + "teal": 4892, + "source": 1151, "pc": [ 4801, 4802 ] }, { - "teal": 4889, - "source": 1145, + "teal": 4893, + "source": 1151, "pc": [ 4803, 4804 ] }, { - "teal": 4890, - "source": 1145, + "teal": 4894, + "source": 1151, "pc": [ 4805 ] }, { - "teal": 4893, - "source": 1145, + "teal": 4897, + "source": 1151, "errorMessage": "global state value does not exist: AppID.fromUint64(poolAppId).globalState('numStakers')", "pc": [ 4806 ] }, { - "teal": 4894, - "source": 1145, + "teal": 4898, + "source": 1151, "pc": [ 4807, 4808 ] }, { - "teal": 4898, - "source": 1146, + "teal": 4902, + "source": 1152, "pc": [ 4809, 4810 ] }, { - "teal": 4899, - "source": 1146, + "teal": 4903, + "source": 1152, "pc": [ 4811, 4812 ] }, { - "teal": 4900, - "source": 1146, + "teal": 4904, + "source": 1152, "pc": [ 4813 ] }, { - "teal": 4903, - "source": 1146, + "teal": 4907, + "source": 1152, "errorMessage": "global state value does not exist: AppID.fromUint64(poolAppId).globalState('staked')", "pc": [ 4814 ] }, { - "teal": 4904, - "source": 1146, + "teal": 4908, + "source": 1152, "pc": [ 4815, 4816 ] }, { - "teal": 4908, - "source": 1147, + "teal": 4912, + "source": 1153, "pc": [ 4817, 4818 ] }, { - "teal": 4909, - "source": 1147, + "teal": 4913, + "source": 1153, "pc": [ 4819, 4820 ] }, { - "teal": 4910, - "source": 1147, + "teal": 4914, + "source": 1153, "pc": [ 4821, 4822, @@ -22072,80 +22072,80 @@ ] }, { - "teal": 4911, - "source": 1147, + "teal": 4915, + "source": 1153, "pc": [ 4824 ] }, { - "teal": 4912, - "source": 1147, + "teal": 4916, + "source": 1153, "pc": [ 4825 ] }, { - "teal": 4913, - "source": 1147, + "teal": 4917, + "source": 1153, "pc": [ 4826 ] }, { - "teal": 4914, - "source": 1147, + "teal": 4918, + "source": 1153, "pc": [ 4827, 4828 ] }, { - "teal": 4915, - "source": 1147, + "teal": 4919, + "source": 1153, "pc": [ 4829 ] }, { - "teal": 4916, - "source": 1147, + "teal": 4920, + "source": 1153, "pc": [ 4830 ] }, { - "teal": 4917, - "source": 1147, + "teal": 4921, + "source": 1153, "pc": [ 4831 ] }, { - "teal": 4918, - "source": 1147, + "teal": 4922, + "source": 1153, "pc": [ 4832 ] }, { - "teal": 4919, - "source": 1147, + "teal": 4923, + "source": 1153, "pc": [ 4833, 4834 ] }, { - "teal": 4920, - "source": 1147, + "teal": 4924, + "source": 1153, "pc": [ 4835 ] }, { - "teal": 4921, - "source": 1147, + "teal": 4925, + "source": 1153, "pc": [ 4836, 4837, @@ -22153,23 +22153,23 @@ ] }, { - "teal": 4922, - "source": 1147, + "teal": 4926, + "source": 1153, "pc": [ 4839 ] }, { - "teal": 4923, - "source": 1147, + "teal": 4927, + "source": 1153, "pc": [ 4840, 4841 ] }, { - "teal": 4924, - "source": 1147, + "teal": 4928, + "source": 1153, "pc": [ 4842, 4843, @@ -22177,60 +22177,60 @@ ] }, { - "teal": 4925, - "source": 1147, + "teal": 4929, + "source": 1153, "pc": [ 4845 ] }, { - "teal": 4926, - "source": 1147, + "teal": 4930, + "source": 1153, "pc": [ 4846 ] }, { - "teal": 4927, - "source": 1147, + "teal": 4931, + "source": 1153, "pc": [ 4847 ] }, { - "teal": 4928, - "source": 1147, + "teal": 4932, + "source": 1153, "pc": [ 4848, 4849 ] }, { - "teal": 4929, - "source": 1147, + "teal": 4933, + "source": 1153, "pc": [ 4850 ] }, { - "teal": 4933, - "source": 1148, + "teal": 4937, + "source": 1154, "pc": [ 4851, 4852 ] }, { - "teal": 4934, - "source": 1148, + "teal": 4938, + "source": 1154, "pc": [ 4853, 4854 ] }, { - "teal": 4935, - "source": 1148, + "teal": 4939, + "source": 1154, "pc": [ 4855, 4856, @@ -22238,96 +22238,96 @@ ] }, { - "teal": 4936, - "source": 1148, + "teal": 4940, + "source": 1154, "pc": [ 4858 ] }, { - "teal": 4937, - "source": 1148, + "teal": 4941, + "source": 1154, "pc": [ 4859 ] }, { - "teal": 4938, - "source": 1148, + "teal": 4942, + "source": 1154, "pc": [ 4860 ] }, { - "teal": 4939, - "source": 1148, + "teal": 4943, + "source": 1154, "pc": [ 4861, 4862 ] }, { - "teal": 4940, - "source": 1148, + "teal": 4944, + "source": 1154, "pc": [ 4863 ] }, { - "teal": 4941, - "source": 1148, + "teal": 4945, + "source": 1154, "pc": [ 4864 ] }, { - "teal": 4942, - "source": 1148, + "teal": 4946, + "source": 1154, "pc": [ 4865, 4866 ] }, { - "teal": 4943, - "source": 1148, + "teal": 4947, + "source": 1154, "pc": [ 4867 ] }, { - "teal": 4944, - "source": 1148, + "teal": 4948, + "source": 1154, "pc": [ 4868, 4869 ] }, { - "teal": 4945, - "source": 1148, + "teal": 4949, + "source": 1154, "pc": [ 4870 ] }, { - "teal": 4946, - "source": 1148, + "teal": 4950, + "source": 1154, "pc": [ 4871 ] }, { - "teal": 4947, - "source": 1148, + "teal": 4951, + "source": 1154, "pc": [ 4872, 4873 ] }, { - "teal": 4948, - "source": 1148, + "teal": 4952, + "source": 1154, "pc": [ 4874, 4875, @@ -22335,52 +22335,52 @@ ] }, { - "teal": 4949, - "source": 1148, + "teal": 4953, + "source": 1154, "pc": [ 4877 ] }, { - "teal": 4950, - "source": 1148, + "teal": 4954, + "source": 1154, "pc": [ 4878 ] }, { - "teal": 4951, - "source": 1148, + "teal": 4955, + "source": 1154, "pc": [ 4879 ] }, { - "teal": 4952, - "source": 1148, + "teal": 4956, + "source": 1154, "pc": [ 4880, 4881 ] }, { - "teal": 4953, - "source": 1148, + "teal": 4957, + "source": 1154, "pc": [ 4882 ] }, { - "teal": 4958, - "source": 1151, + "teal": 4962, + "source": 1157, "pc": [ 4883, 4884 ] }, { - "teal": 4959, - "source": 1151, + "teal": 4963, + "source": 1157, "pc": [ 4885, 4886, @@ -22388,45 +22388,45 @@ ] }, { - "teal": 4964, - "source": 1152, + "teal": 4968, + "source": 1158, "pc": [ 4888, 4889 ] }, { - "teal": 4965, - "source": 1152, + "teal": 4969, + "source": 1158, "pc": [ 4890 ] }, { - "teal": 4966, - "source": 1152, + "teal": 4970, + "source": 1158, "pc": [ 4891 ] }, { - "teal": 4967, - "source": 1152, + "teal": 4971, + "source": 1158, "pc": [ 4892 ] }, { - "teal": 4968, - "source": 1152, + "teal": 4972, + "source": 1158, "pc": [ 4893, 4894 ] }, { - "teal": 4969, - "source": 1152, + "teal": 4973, + "source": 1158, "pc": [ 4895, 4896, @@ -22434,87 +22434,87 @@ ] }, { - "teal": 4970, - "source": 1152, + "teal": 4974, + "source": 1158, "pc": [ 4898 ] }, { - "teal": 4971, - "source": 1152, + "teal": 4975, + "source": 1158, "pc": [ 4899 ] }, { - "teal": 4972, - "source": 1152, + "teal": 4976, + "source": 1158, "pc": [ 4900 ] }, { - "teal": 4973, - "source": 1152, + "teal": 4977, + "source": 1158, "pc": [ 4901, 4902 ] }, { - "teal": 4974, - "source": 1152, + "teal": 4978, + "source": 1158, "pc": [ 4903 ] }, { - "teal": 4975, - "source": 1152, + "teal": 4979, + "source": 1158, "pc": [ 4904 ] }, { - "teal": 4976, - "source": 1152, + "teal": 4980, + "source": 1158, "pc": [ 4905 ] }, { - "teal": 4977, - "source": 1152, + "teal": 4981, + "source": 1158, "pc": [ 4906 ] }, { - "teal": 4978, - "source": 1152, + "teal": 4982, + "source": 1158, "pc": [ 4907 ] }, { - "teal": 4979, - "source": 1152, + "teal": 4983, + "source": 1158, "pc": [ 4908 ] }, { - "teal": 4980, - "source": 1152, + "teal": 4984, + "source": 1158, "pc": [ 4909, 4910 ] }, { - "teal": 4981, - "source": 1152, + "teal": 4985, + "source": 1158, "pc": [ 4911, 4912, @@ -22522,52 +22522,52 @@ ] }, { - "teal": 4982, - "source": 1152, + "teal": 4986, + "source": 1158, "pc": [ 4914 ] }, { - "teal": 4983, - "source": 1152, + "teal": 4987, + "source": 1158, "pc": [ 4915 ] }, { - "teal": 4984, - "source": 1152, + "teal": 4988, + "source": 1158, "pc": [ 4916 ] }, { - "teal": 4985, - "source": 1152, + "teal": 4989, + "source": 1158, "pc": [ 4917, 4918 ] }, { - "teal": 4986, - "source": 1152, + "teal": 4990, + "source": 1158, "pc": [ 4919 ] }, { - "teal": 4992, - "source": 1154, + "teal": 4996, + "source": 1160, "pc": [ 4920, 4921 ] }, { - "teal": 4993, - "source": 1154, + "teal": 4997, + "source": 1160, "pc": [ 4922, 4923, @@ -22575,96 +22575,96 @@ ] }, { - "teal": 4998, - "source": 1155, + "teal": 5002, + "source": 1161, "pc": [ 4925, 4926 ] }, { - "teal": 4999, - "source": 1155, + "teal": 5003, + "source": 1161, "pc": [ 4927 ] }, { - "teal": 5000, - "source": 1155, + "teal": 5004, + "source": 1161, "pc": [ 4928 ] }, { - "teal": 5001, - "source": 1155, + "teal": 5005, + "source": 1161, "pc": [ 4929 ] }, { - "teal": 5002, - "source": 1155, + "teal": 5006, + "source": 1161, "pc": [ 4930, 4931 ] }, { - "teal": 5003, - "source": 1155, + "teal": 5007, + "source": 1161, "pc": [ 4932 ] }, { - "teal": 5004, - "source": 1155, + "teal": 5008, + "source": 1161, "pc": [ 4933 ] }, { - "teal": 5009, - "source": 1157, + "teal": 5013, + "source": 1163, "pc": [ 4934, 4935 ] }, { - "teal": 5010, - "source": 1157, + "teal": 5014, + "source": 1163, "pc": [ 4936 ] }, { - "teal": 5011, - "source": 1157, + "teal": 5015, + "source": 1163, "pc": [ 4937 ] }, { - "teal": 5012, - "source": 1157, + "teal": 5016, + "source": 1163, "pc": [ 4938 ] }, { - "teal": 5013, - "source": 1157, + "teal": 5017, + "source": 1163, "pc": [ 4939, 4940 ] }, { - "teal": 5014, - "source": 1157, + "teal": 5018, + "source": 1163, "pc": [ 4941, 4942, @@ -22672,111 +22672,111 @@ ] }, { - "teal": 5015, - "source": 1157, + "teal": 5019, + "source": 1163, "pc": [ 4944 ] }, { - "teal": 5016, - "source": 1157, + "teal": 5020, + "source": 1163, "pc": [ 4945 ] }, { - "teal": 5017, - "source": 1157, + "teal": 5021, + "source": 1163, "pc": [ 4946 ] }, { - "teal": 5018, - "source": 1157, + "teal": 5022, + "source": 1163, "pc": [ 4947, 4948 ] }, { - "teal": 5019, - "source": 1157, + "teal": 5023, + "source": 1163, "pc": [ 4949 ] }, { - "teal": 5020, - "source": 1157, + "teal": 5024, + "source": 1163, "pc": [ 4950 ] }, { - "teal": 5021, - "source": 1157, + "teal": 5025, + "source": 1163, "pc": [ 4951, 4952 ] }, { - "teal": 5022, - "source": 1157, + "teal": 5026, + "source": 1163, "pc": [ 4953, 4954 ] }, { - "teal": 5023, - "source": 1157, + "teal": 5027, + "source": 1163, "pc": [ 4955, 4956 ] }, { - "teal": 5024, - "source": 1157, + "teal": 5028, + "source": 1163, "pc": [ 4957 ] }, { - "teal": 5025, - "source": 1157, + "teal": 5029, + "source": 1163, "pc": [ 4958 ] }, { - "teal": 5026, - "source": 1157, + "teal": 5030, + "source": 1163, "pc": [ 4959 ] }, { - "teal": 5027, - "source": 1157, + "teal": 5031, + "source": 1163, "pc": [ 4960 ] }, { - "teal": 5028, - "source": 1157, + "teal": 5032, + "source": 1163, "pc": [ 4961, 4962 ] }, { - "teal": 5029, - "source": 1157, + "teal": 5033, + "source": 1163, "pc": [ 4963, 4964, @@ -22784,126 +22784,126 @@ ] }, { - "teal": 5030, - "source": 1157, + "teal": 5034, + "source": 1163, "pc": [ 4966 ] }, { - "teal": 5031, - "source": 1157, + "teal": 5035, + "source": 1163, "pc": [ 4967 ] }, { - "teal": 5032, - "source": 1157, + "teal": 5036, + "source": 1163, "pc": [ 4968 ] }, { - "teal": 5033, - "source": 1157, + "teal": 5037, + "source": 1163, "pc": [ 4969, 4970 ] }, { - "teal": 5034, - "source": 1157, + "teal": 5038, + "source": 1163, "pc": [ 4971 ] }, { - "teal": 5038, - "source": 1158, + "teal": 5042, + "source": 1164, "pc": [ 4972, 4973 ] }, { - "teal": 5039, - "source": 1158, + "teal": 5043, + "source": 1164, "pc": [ 4974 ] }, { - "teal": 5040, - "source": 1158, + "teal": 5044, + "source": 1164, "pc": [ 4975, 4976 ] }, { - "teal": 5041, - "source": 1158, + "teal": 5045, + "source": 1164, "pc": [ 4977, 4978 ] }, { - "teal": 5042, - "source": 1158, + "teal": 5046, + "source": 1164, "pc": [ 4979, 4980 ] }, { - "teal": 5043, - "source": 1158, + "teal": 5047, + "source": 1164, "pc": [ 4981 ] }, { - "teal": 5044, - "source": 1158, + "teal": 5048, + "source": 1164, "pc": [ 4982 ] }, { - "teal": 5045, - "source": 1158, + "teal": 5049, + "source": 1164, "pc": [ 4983, 4984 ] }, { - "teal": 5046, - "source": 1158, + "teal": 5050, + "source": 1164, "pc": [ 4985 ] }, { - "teal": 5047, - "source": 1158, + "teal": 5051, + "source": 1164, "pc": [ 4986 ] }, { - "teal": 5048, - "source": 1119, + "teal": 5052, + "source": 1125, "pc": [ 4987 ] }, { - "teal": 5052, - "source": 1161, + "teal": 5056, + "source": 1167, "pc": [ 4988, 4989, @@ -22911,171 +22911,171 @@ ] }, { - "teal": 5055, - "source": 1161, + "teal": 5059, + "source": 1167, "pc": [ 4991 ] }, { - "teal": 5056, - "source": 1161, + "teal": 5060, + "source": 1167, "pc": [ 4992, 4993 ] }, { - "teal": 5060, - "source": 1162, + "teal": 5064, + "source": 1168, "pc": [ 4994 ] }, { - "teal": 5061, - "source": 1162, + "teal": 5065, + "source": 1168, "pc": [ 4995, 4996 ] }, { - "teal": 5062, - "source": 1162, + "teal": 5066, + "source": 1168, "pc": [ 4997 ] }, { - "teal": 5063, - "source": 1162, + "teal": 5067, + "source": 1168, "pc": [ 4998 ] }, { - "teal": 5064, - "source": 1162, + "teal": 5068, + "source": 1168, "pc": [ 4999 ] }, { - "teal": 5065, - "source": 1162, + "teal": 5069, + "source": 1168, "pc": [ 5000 ] }, { - "teal": 5066, - "source": 1162, + "teal": 5070, + "source": 1168, "pc": [ 5001 ] }, { - "teal": 5070, - "source": 1164, + "teal": 5074, + "source": 1170, "pc": [ 5002 ] }, { - "teal": 5071, - "source": 1164, + "teal": 5075, + "source": 1170, "pc": [ 5003, 5004 ] }, { - "teal": 5072, - "source": 1164, + "teal": 5076, + "source": 1170, "pc": [ 5005 ] }, { - "teal": 5073, - "source": 1164, + "teal": 5077, + "source": 1170, "pc": [ 5006 ] }, - { - "teal": 5076, - "source": 1164, + { + "teal": 5080, + "source": 1170, "errorMessage": "box value does not exist: this.stakerPoolSet(staker).value", "pc": [ 5007 ] }, { - "teal": 5077, - "source": 1164, + "teal": 5081, + "source": 1170, "pc": [ 5008, 5009 ] }, { - "teal": 5081, - "source": 1165, + "teal": 5085, + "source": 1171, "pc": [ 5010 ] }, { - "teal": 5082, - "source": 1165, + "teal": 5086, + "source": 1171, "pc": [ 5011, 5012 ] }, { - "teal": 5086, - "source": 1166, + "teal": 5090, + "source": 1172, "pc": [ 5013 ] }, { - "teal": 5087, - "source": 1166, + "teal": 5091, + "source": 1172, "pc": [ 5014, 5015 ] }, { - "teal": 5092, - "source": 1166, + "teal": 5096, + "source": 1172, "pc": [ 5016, 5017 ] }, { - "teal": 5093, - "source": 1166, + "teal": 5097, + "source": 1172, "pc": [ 5018, 5019 ] }, { - "teal": 5094, - "source": 1166, + "teal": 5098, + "source": 1172, "pc": [ 5020 ] }, { - "teal": 5095, - "source": 1166, + "teal": 5099, + "source": 1172, "pc": [ 5021, 5022, @@ -23083,67 +23083,67 @@ ] }, { - "teal": 5100, - "source": 1167, + "teal": 5104, + "source": 1173, "pc": [ 5024, 5025 ] }, { - "teal": 5101, - "source": 1167, + "teal": 5105, + "source": 1173, "pc": [ 5026, 5027 ] }, { - "teal": 5102, - "source": 1167, + "teal": 5106, + "source": 1173, "pc": [ 5028 ] }, { - "teal": 5103, - "source": 1167, + "teal": 5107, + "source": 1173, "pc": [ 5029 ] }, { - "teal": 5104, - "source": 1167, + "teal": 5108, + "source": 1173, "pc": [ 5030 ] }, { - "teal": 5105, - "source": 1167, + "teal": 5109, + "source": 1173, "pc": [ 5031 ] }, { - "teal": 5106, - "source": 1167, + "teal": 5110, + "source": 1173, "pc": [ 5032, 5033 ] }, { - "teal": 5107, - "source": 1167, + "teal": 5111, + "source": 1173, "pc": [ 5034 ] }, { - "teal": 5108, - "source": 1167, + "teal": 5112, + "source": 1173, "pc": [ 5035, 5036, @@ -23151,44 +23151,44 @@ ] }, { - "teal": 5113, - "source": 1169, + "teal": 5117, + "source": 1175, "pc": [ 5038 ] }, { - "teal": 5119, - "source": 1171, + "teal": 5123, + "source": 1177, "pc": [ 5039, 5040 ] }, { - "teal": 5120, - "source": 1171, + "teal": 5124, + "source": 1177, "pc": [ 5041 ] }, { - "teal": 5121, - "source": 1171, + "teal": 5125, + "source": 1177, "pc": [ 5042 ] }, { - "teal": 5122, - "source": 1171, + "teal": 5126, + "source": 1177, "pc": [ 5043 ] }, { - "teal": 5123, - "source": 1171, + "teal": 5127, + "source": 1177, "pc": [ 5044, 5045, @@ -23196,94 +23196,94 @@ ] }, { - "teal": 5124, - "source": 1171, + "teal": 5128, + "source": 1177, "pc": [ 5047, 5048 ] }, { - "teal": 5125, - "source": 1171, + "teal": 5129, + "source": 1177, "pc": [ 5049, 5050 ] }, { - "teal": 5126, - "source": 1171, + "teal": 5130, + "source": 1177, "pc": [ 5051 ] }, { - "teal": 5127, - "source": 1171, + "teal": 5131, + "source": 1177, "pc": [ 5052 ] }, { - "teal": 5128, - "source": 1171, + "teal": 5132, + "source": 1177, "pc": [ 5053 ] }, { - "teal": 5129, - "source": 1171, + "teal": 5133, + "source": 1177, "pc": [ 5054 ] }, { - "teal": 5130, - "source": 1171, + "teal": 5134, + "source": 1177, "pc": [ 5055 ] }, { - "teal": 5131, - "source": 1171, + "teal": 5135, + "source": 1177, "pc": [ 5056 ] }, { - "teal": 5132, - "source": 1171, + "teal": 5136, + "source": 1177, "pc": [ 5057 ] }, { - "teal": 5133, - "source": 1171, + "teal": 5137, + "source": 1177, "pc": [ 5058 ] }, { - "teal": 5134, - "source": 1171, + "teal": 5138, + "source": 1177, "pc": [ 5059 ] }, { - "teal": 5135, - "source": 1171, + "teal": 5139, + "source": 1177, "pc": [ 5060 ] }, { - "teal": 5138, - "source": 1171, + "teal": 5142, + "source": 1177, "pc": [ 5061, 5062, @@ -23291,68 +23291,68 @@ ] }, { - "teal": 5143, - "source": 1172, + "teal": 5147, + "source": 1178, "pc": [ 5064, 5065 ] }, { - "teal": 5144, - "source": 1172, + "teal": 5148, + "source": 1178, "pc": [ 5066 ] }, { - "teal": 5145, - "source": 1172, + "teal": 5149, + "source": 1178, "pc": [ 5067 ] }, { - "teal": 5146, - "source": 1172, + "teal": 5150, + "source": 1178, "pc": [ 5068, 5069 ] }, { - "teal": 5153, - "source": 1166, + "teal": 5157, + "source": 1172, "pc": [ 5070, 5071 ] }, { - "teal": 5154, - "source": 1166, + "teal": 5158, + "source": 1172, "pc": [ 5072 ] }, { - "teal": 5155, - "source": 1166, + "teal": 5159, + "source": 1172, "pc": [ 5073 ] }, { - "teal": 5156, - "source": 1166, + "teal": 5160, + "source": 1172, "pc": [ 5074, 5075 ] }, { - "teal": 5157, - "source": 1166, + "teal": 5161, + "source": 1172, "pc": [ 5076, 5077, @@ -23360,30 +23360,30 @@ ] }, { - "teal": 5163, - "source": 1175, + "teal": 5167, + "source": 1181, "pc": [ 5079, 5080 ] }, { - "teal": 5164, - "source": 1175, + "teal": 5168, + "source": 1181, "pc": [ 5081 ] }, { - "teal": 5165, - "source": 1175, + "teal": 5169, + "source": 1181, "pc": [ 5082 ] }, { - "teal": 5166, - "source": 1175, + "teal": 5170, + "source": 1181, "pc": [ 5083, 5084, @@ -23391,104 +23391,104 @@ ] }, { - "teal": 5170, - "source": 1176, + "teal": 5174, + "source": 1182, "errorMessage": "No empty slot available in the staker pool set", "pc": [ 5086 ] }, { - "teal": 5175, - "source": 1178, + "teal": 5179, + "source": 1184, "pc": [ 5087, 5088 ] }, { - "teal": 5176, - "source": 1178, + "teal": 5180, + "source": 1184, "pc": [ 5089 ] }, { - "teal": 5177, - "source": 1178, + "teal": 5181, + "source": 1184, "pc": [ 5090 ] }, { - "teal": 5178, - "source": 1178, + "teal": 5182, + "source": 1184, "pc": [ 5091 ] }, { - "teal": 5179, - "source": 1178, + "teal": 5183, + "source": 1184, "pc": [ 5092 ] }, { - "teal": 5180, - "source": 1178, + "teal": 5184, + "source": 1184, "pc": [ 5093, 5094 ] }, { - "teal": 5181, - "source": 1178, + "teal": 5185, + "source": 1184, "pc": [ 5095 ] }, { - "teal": 5182, - "source": 1178, + "teal": 5186, + "source": 1184, "pc": [ 5096, 5097 ] }, { - "teal": 5183, - "source": 1178, + "teal": 5187, + "source": 1184, "pc": [ 5098 ] }, { - "teal": 5184, - "source": 1178, + "teal": 5188, + "source": 1184, "pc": [ 5099, 5100 ] }, { - "teal": 5185, - "source": 1178, + "teal": 5189, + "source": 1184, "pc": [ 5101 ] }, { - "teal": 5186, - "source": 1161, + "teal": 5190, + "source": 1167, "pc": [ 5102 ] }, { - "teal": 5197, - "source": 1189, + "teal": 5201, + "source": 1195, "pc": [ 5103, 5104, @@ -23496,151 +23496,151 @@ ] }, { - "teal": 5200, - "source": 1189, + "teal": 5204, + "source": 1195, "pc": [ 5106 ] }, { - "teal": 5201, - "source": 1189, + "teal": 5205, + "source": 1195, "pc": [ 5107, 5108 ] }, { - "teal": 5205, - "source": 1191, + "teal": 5209, + "source": 1197, "pc": [ 5109 ] }, { - "teal": 5206, - "source": 1191, + "teal": 5210, + "source": 1197, "pc": [ 5110, 5111 ] }, { - "teal": 5210, - "source": 1192, + "teal": 5214, + "source": 1198, "pc": [ 5112 ] }, { - "teal": 5211, - "source": 1192, + "teal": 5215, + "source": 1198, "pc": [ 5113, 5114 ] }, { - "teal": 5215, - "source": 1193, + "teal": 5219, + "source": 1199, "pc": [ 5115 ] }, { - "teal": 5216, - "source": 1193, + "teal": 5220, + "source": 1199, "pc": [ 5116, 5117 ] }, { - "teal": 5220, - "source": 1195, + "teal": 5224, + "source": 1201, "pc": [ 5118 ] }, { - "teal": 5221, - "source": 1195, + "teal": 5225, + "source": 1201, "pc": [ 5119, 5120 ] }, { - "teal": 5222, - "source": 1195, + "teal": 5226, + "source": 1201, "pc": [ 5121 ] }, { - "teal": 5223, - "source": 1195, + "teal": 5227, + "source": 1201, "pc": [ 5122 ] }, { - "teal": 5226, - "source": 1195, + "teal": 5230, + "source": 1201, "errorMessage": "box value does not exist: this.stakerPoolSet(staker).value", "pc": [ 5123 ] }, { - "teal": 5227, - "source": 1195, + "teal": 5231, + "source": 1201, "pc": [ 5124, 5125 ] }, { - "teal": 5231, - "source": 1196, + "teal": 5235, + "source": 1202, "pc": [ 5126 ] }, { - "teal": 5232, - "source": 1196, + "teal": 5236, + "source": 1202, "pc": [ 5127, 5128 ] }, { - "teal": 5237, - "source": 1196, + "teal": 5241, + "source": 1202, "pc": [ 5129, 5130 ] }, { - "teal": 5238, - "source": 1196, + "teal": 5242, + "source": 1202, "pc": [ 5131, 5132 ] }, { - "teal": 5239, - "source": 1196, + "teal": 5243, + "source": 1202, "pc": [ 5133 ] }, { - "teal": 5240, - "source": 1196, + "teal": 5244, + "source": 1202, "pc": [ 5134, 5135, @@ -23648,87 +23648,87 @@ ] }, { - "teal": 5245, - "source": 1197, + "teal": 5249, + "source": 1203, "pc": [ 5137, 5138 ] }, { - "teal": 5246, - "source": 1197, + "teal": 5250, + "source": 1203, "pc": [ 5139, 5140 ] }, { - "teal": 5247, - "source": 1197, + "teal": 5251, + "source": 1203, "pc": [ 5141 ] }, { - "teal": 5248, - "source": 1197, + "teal": 5252, + "source": 1203, "pc": [ 5142 ] }, { - "teal": 5249, - "source": 1197, + "teal": 5253, + "source": 1203, "pc": [ 5143 ] }, { - "teal": 5250, - "source": 1197, + "teal": 5254, + "source": 1203, "pc": [ 5144 ] }, { - "teal": 5251, - "source": 1197, + "teal": 5255, + "source": 1203, "pc": [ 5145 ] }, { - "teal": 5252, - "source": 1197, + "teal": 5256, + "source": 1203, "pc": [ 5146 ] }, { - "teal": 5253, - "source": 1197, + "teal": 5257, + "source": 1203, "pc": [ 5147 ] }, { - "teal": 5254, - "source": 1197, + "teal": 5258, + "source": 1203, "pc": [ 5148 ] }, { - "teal": 5255, - "source": 1197, + "teal": 5259, + "source": 1203, "pc": [ 5149 ] }, { - "teal": 5256, - "source": 1197, + "teal": 5260, + "source": 1203, "pc": [ 5150, 5151, @@ -23736,8 +23736,8 @@ ] }, { - "teal": 5259, - "source": 1198, + "teal": 5263, + "source": 1204, "pc": [ 5153, 5154, @@ -23745,111 +23745,111 @@ ] }, { - "teal": 5264, - "source": 1200, + "teal": 5268, + "source": 1206, "pc": [ 5156, 5157 ] }, { - "teal": 5265, - "source": 1200, + "teal": 5269, + "source": 1206, "pc": [ 5158 ] }, { - "teal": 5266, - "source": 1200, + "teal": 5270, + "source": 1206, "pc": [ 5159 ] }, { - "teal": 5267, - "source": 1200, + "teal": 5271, + "source": 1206, "pc": [ 5160, 5161 ] }, { - "teal": 5272, - "source": 1201, + "teal": 5276, + "source": 1207, "pc": [ 5162, 5163 ] }, { - "teal": 5273, - "source": 1201, + "teal": 5277, + "source": 1207, "pc": [ 5164, 5165 ] }, { - "teal": 5274, - "source": 1201, + "teal": 5278, + "source": 1207, "pc": [ 5166 ] }, { - "teal": 5275, - "source": 1201, + "teal": 5279, + "source": 1207, "pc": [ 5167 ] }, { - "teal": 5276, - "source": 1201, + "teal": 5280, + "source": 1207, "pc": [ 5168 ] }, { - "teal": 5277, - "source": 1201, + "teal": 5281, + "source": 1207, "pc": [ 5169 ] }, { - "teal": 5278, - "source": 1201, + "teal": 5282, + "source": 1207, "pc": [ 5170 ] }, { - "teal": 5279, - "source": 1201, + "teal": 5283, + "source": 1207, "pc": [ 5171 ] }, { - "teal": 5280, - "source": 1201, + "teal": 5284, + "source": 1207, "pc": [ 5172 ] }, { - "teal": 5281, - "source": 1201, + "teal": 5285, + "source": 1207, "pc": [ 5173, 5174 ] }, { - "teal": 5282, - "source": 1201, + "teal": 5286, + "source": 1207, "pc": [ 5175, 5176, @@ -23857,22 +23857,22 @@ ] }, { - "teal": 5283, - "source": 1201, + "teal": 5287, + "source": 1207, "pc": [ 5178 ] }, { - "teal": 5284, - "source": 1201, + "teal": 5288, + "source": 1207, "pc": [ 5179 ] }, { - "teal": 5285, - "source": 1201, + "teal": 5289, + "source": 1207, "pc": [ 5180, 5181, @@ -23880,67 +23880,67 @@ ] }, { - "teal": 5291, - "source": 1202, + "teal": 5295, + "source": 1208, "pc": [ 5183, 5184 ] }, { - "teal": 5292, - "source": 1202, + "teal": 5296, + "source": 1208, "pc": [ 5185, 5186 ] }, { - "teal": 5293, - "source": 1202, + "teal": 5297, + "source": 1208, "pc": [ 5187 ] }, { - "teal": 5294, - "source": 1202, + "teal": 5298, + "source": 1208, "pc": [ 5188 ] }, { - "teal": 5295, - "source": 1202, + "teal": 5299, + "source": 1208, "pc": [ 5189 ] }, { - "teal": 5296, - "source": 1202, + "teal": 5300, + "source": 1208, "pc": [ 5190 ] }, { - "teal": 5297, - "source": 1202, + "teal": 5301, + "source": 1208, "pc": [ 5191, 5192 ] }, { - "teal": 5298, - "source": 1202, + "teal": 5302, + "source": 1208, "pc": [ 5193 ] }, { - "teal": 5299, - "source": 1202, + "teal": 5303, + "source": 1208, "pc": [ 5194, 5195, @@ -23948,45 +23948,45 @@ ] }, { - "teal": 5304, - "source": 1203, + "teal": 5308, + "source": 1209, "pc": [ 5197 ] }, { - "teal": 5305, - "source": 1203, + "teal": 5309, + "source": 1209, "pc": [ 5198, 5199 ] }, { - "teal": 5309, - "source": 1205, + "teal": 5313, + "source": 1211, "pc": [ 5200, 5201 ] }, { - "teal": 5310, - "source": 1205, + "teal": 5314, + "source": 1211, "pc": [ 5202 ] }, { - "teal": 5311, - "source": 1205, + "teal": 5315, + "source": 1211, "pc": [ 5203 ] }, { - "teal": 5312, - "source": 1205, + "teal": 5316, + "source": 1211, "pc": [ 5204, 5205, @@ -24017,45 +24017,45 @@ ] }, { - "teal": 5313, - "source": 1205, + "teal": 5317, + "source": 1211, "pc": [ 5230 ] }, { - "teal": 5314, - "source": 1205, + "teal": 5318, + "source": 1211, "pc": [ 5231, 5232 ] }, { - "teal": 5315, - "source": 1205, + "teal": 5319, + "source": 1211, "pc": [ 5233 ] }, { - "teal": 5316, - "source": 1205, + "teal": 5320, + "source": 1211, "pc": [ 5234, 5235 ] }, { - "teal": 5317, - "source": 1205, + "teal": 5321, + "source": 1211, "pc": [ 5236 ] }, { - "teal": 5318, - "source": 1202, + "teal": 5322, + "source": 1208, "pc": [ 5237, 5238, @@ -24063,68 +24063,68 @@ ] }, { - "teal": 5323, - "source": 1207, + "teal": 5327, + "source": 1213, "pc": [ 5240, 5241 ] }, { - "teal": 5324, - "source": 1207, + "teal": 5328, + "source": 1213, "pc": [ 5242 ] }, { - "teal": 5325, - "source": 1207, + "teal": 5329, + "source": 1213, "pc": [ 5243 ] }, { - "teal": 5326, - "source": 1207, + "teal": 5330, + "source": 1213, "pc": [ 5244, 5245 ] }, { - "teal": 5335, - "source": 1196, + "teal": 5339, + "source": 1202, "pc": [ 5246, 5247 ] }, { - "teal": 5336, - "source": 1196, + "teal": 5340, + "source": 1202, "pc": [ 5248 ] }, { - "teal": 5337, - "source": 1196, + "teal": 5341, + "source": 1202, "pc": [ 5249 ] }, { - "teal": 5338, - "source": 1196, + "teal": 5342, + "source": 1202, "pc": [ 5250, 5251 ] }, { - "teal": 5339, - "source": 1196, + "teal": 5343, + "source": 1202, "pc": [ 5252, 5253, @@ -24132,23 +24132,23 @@ ] }, { - "teal": 5345, - "source": 1211, + "teal": 5349, + "source": 1217, "pc": [ 5255, 5256 ] }, { - "teal": 5346, - "source": 1211, + "teal": 5350, + "source": 1217, "pc": [ 5257 ] }, { - "teal": 5347, - "source": 1211, + "teal": 5351, + "source": 1217, "pc": [ 5258, 5259, @@ -24156,119 +24156,119 @@ ] }, { - "teal": 5351, - "source": 1212, + "teal": 5355, + "source": 1218, "errorMessage": "No matching slot found when told to remove a pool from the stakers set", "pc": [ 5261 ] }, { - "teal": 5356, - "source": 1215, + "teal": 5360, + "source": 1221, "pc": [ 5262, 5263 ] }, { - "teal": 5357, - "source": 1215, + "teal": 5361, + "source": 1221, "pc": [ 5264 ] }, { - "teal": 5358, - "source": 1215, + "teal": 5362, + "source": 1221, "pc": [ 5265, 5266 ] }, { - "teal": 5359, - "source": 1215, + "teal": 5363, + "source": 1221, "pc": [ 5267 ] }, { - "teal": 5360, - "source": 1215, + "teal": 5364, + "source": 1221, "pc": [ 5268 ] }, { - "teal": 5361, - "source": 1215, + "teal": 5365, + "source": 1221, "pc": [ 5269 ] }, { - "teal": 5362, - "source": 1215, + "teal": 5366, + "source": 1221, "pc": [ 5270 ] }, { - "teal": 5363, - "source": 1215, + "teal": 5367, + "source": 1221, "pc": [ 5271, 5272 ] }, { - "teal": 5364, - "source": 1215, + "teal": 5368, + "source": 1221, "pc": [ 5273 ] }, { - "teal": 5365, - "source": 1215, + "teal": 5369, + "source": 1221, "pc": [ 5274 ] }, { - "teal": 5366, - "source": 1215, + "teal": 5370, + "source": 1221, "pc": [ 5275 ] }, { - "teal": 5369, - "source": 1189, + "teal": 5373, + "source": 1195, "pc": [ 5276, 5277 ] }, { - "teal": 5372, - "source": 1189, + "teal": 5376, + "source": 1195, "pc": [ 5278, 5279 ] }, { - "teal": 5373, - "source": 1189, + "teal": 5377, + "source": 1195, "pc": [ 5280 ] }, { - "teal": 5377, - "source": 1218, + "teal": 5381, + "source": 1224, "pc": [ 5281, 5282, @@ -24276,91 +24276,91 @@ ] }, { - "teal": 5380, - "source": 1218, + "teal": 5384, + "source": 1224, "pc": [ 5284 ] }, { - "teal": 5381, - "source": 1218, + "teal": 5385, + "source": 1224, "pc": [ 5285, 5286 ] }, { - "teal": 5385, - "source": 1219, + "teal": 5389, + "source": 1225, "pc": [ 5287, 5288 ] }, { - "teal": 5386, - "source": 1219, + "teal": 5390, + "source": 1225, "pc": [ 5289, 5290 ] }, { - "teal": 5387, - "source": 1219, + "teal": 5391, + "source": 1225, "pc": [ 5291 ] }, { - "teal": 5388, - "source": 1219, + "teal": 5392, + "source": 1225, "pc": [ 5292, 5293 ] }, { - "teal": 5389, - "source": 1219, + "teal": 5393, + "source": 1225, "pc": [ 5294 ] }, { - "teal": 5390, - "source": 1219, + "teal": 5394, + "source": 1225, "pc": [ 5295 ] }, { - "teal": 5391, - "source": 1219, + "teal": 5395, + "source": 1225, "pc": [ 5296, 5297 ] }, { - "teal": 5392, - "source": 1219, + "teal": 5396, + "source": 1225, "pc": [ 5298 ] }, { - "teal": 5393, - "source": 1219, + "teal": 5397, + "source": 1225, "pc": [ 5299, 5300 ] }, { - "teal": 5397, - "source": 1220, + "teal": 5401, + "source": 1226, "pc": [ 5301, 5302, @@ -24368,103 +24368,103 @@ ] }, { - "teal": 5398, - "source": 1220, + "teal": 5402, + "source": 1226, "pc": [ 5304 ] }, { - "teal": 5399, - "source": 1220, + "teal": 5403, + "source": 1226, "pc": [ 5305 ] }, { - "teal": 5400, - "source": 1220, + "teal": 5404, + "source": 1226, "pc": [ 5306, 5307 ] }, { - "teal": 5401, - "source": 1220, + "teal": 5405, + "source": 1226, "pc": [ 5308 ] }, { - "teal": 5402, - "source": 1220, + "teal": 5406, + "source": 1226, "pc": [ 5309 ] }, { - "teal": 5403, - "source": 1220, + "teal": 5407, + "source": 1226, "pc": [ 5310, 5311 ] }, { - "teal": 5404, - "source": 1220, + "teal": 5408, + "source": 1226, "pc": [ 5312 ] }, { - "teal": 5405, - "source": 1220, + "teal": 5409, + "source": 1226, "pc": [ 5313 ] }, { - "teal": 5406, - "source": 1220, + "teal": 5410, + "source": 1226, "pc": [ 5314, 5315 ] }, { - "teal": 5410, - "source": 1222, + "teal": 5414, + "source": 1228, "pc": [ 5316, 5317 ] }, { - "teal": 5411, - "source": 1222, + "teal": 5415, + "source": 1228, "pc": [ 5318 ] }, { - "teal": 5412, - "source": 1222, + "teal": 5416, + "source": 1228, "pc": [ 5319 ] }, { - "teal": 5413, - "source": 1222, + "teal": 5417, + "source": 1228, "pc": [ 5320 ] }, { - "teal": 5414, - "source": 1222, + "teal": 5418, + "source": 1228, "pc": [ 5321, 5322, @@ -24472,83 +24472,83 @@ ] }, { - "teal": 5415, - "source": 1222, + "teal": 5419, + "source": 1228, "pc": [ 5324, 5325 ] }, { - "teal": 5416, - "source": 1222, + "teal": 5420, + "source": 1228, "pc": [ 5326 ] }, { - "teal": 5417, - "source": 1222, + "teal": 5421, + "source": 1228, "pc": [ 5327 ] }, { - "teal": 5418, - "source": 1222, + "teal": 5422, + "source": 1228, "pc": [ 5328 ] }, { - "teal": 5422, - "source": 1222, + "teal": 5426, + "source": 1228, "errorMessage": "node number not in valid range", "pc": [ 5329 ] }, { - "teal": 5426, - "source": 1224, + "teal": 5430, + "source": 1230, "pc": [ 5330 ] }, { - "teal": 5427, - "source": 1224, + "teal": 5431, + "source": 1230, "pc": [ 5331, 5332 ] }, { - "teal": 5432, - "source": 1224, + "teal": 5436, + "source": 1230, "pc": [ 5333, 5334 ] }, { - "teal": 5433, - "source": 1224, + "teal": 5437, + "source": 1230, "pc": [ 5335, 5336 ] }, { - "teal": 5434, - "source": 1224, + "teal": 5438, + "source": 1230, "pc": [ 5337 ] }, { - "teal": 5435, - "source": 1224, + "teal": 5439, + "source": 1230, "pc": [ 5338, 5339, @@ -24556,144 +24556,144 @@ ] }, { - "teal": 5440, - "source": 1225, + "teal": 5444, + "source": 1231, "pc": [ 5341, 5342 ] }, { - "teal": 5441, - "source": 1225, + "teal": 5445, + "source": 1231, "pc": [ 5343 ] }, { - "teal": 5442, - "source": 1225, + "teal": 5446, + "source": 1231, "pc": [ 5344, 5345 ] }, { - "teal": 5443, - "source": 1225, + "teal": 5447, + "source": 1231, "pc": [ 5346 ] }, { - "teal": 5444, - "source": 1225, + "teal": 5448, + "source": 1231, "pc": [ 5347 ] }, { - "teal": 5445, - "source": 1225, + "teal": 5449, + "source": 1231, "pc": [ 5348 ] }, { - "teal": 5446, - "source": 1225, + "teal": 5450, + "source": 1231, "pc": [ 5349 ] }, { - "teal": 5447, - "source": 1225, + "teal": 5451, + "source": 1231, "pc": [ 5350 ] }, { - "teal": 5448, - "source": 1225, + "teal": 5452, + "source": 1231, "pc": [ 5351 ] }, { - "teal": 5449, - "source": 1225, + "teal": 5453, + "source": 1231, "pc": [ 5352 ] }, { - "teal": 5450, - "source": 1225, + "teal": 5454, + "source": 1231, "pc": [ 5353, 5354 ] }, { - "teal": 5451, - "source": 1225, + "teal": 5455, + "source": 1231, "pc": [ 5355 ] }, { - "teal": 5452, - "source": 1225, + "teal": 5456, + "source": 1231, "pc": [ 5356 ] }, { - "teal": 5453, - "source": 1225, + "teal": 5457, + "source": 1231, "pc": [ 5357 ] }, { - "teal": 5454, - "source": 1225, + "teal": 5458, + "source": 1231, "pc": [ 5358 ] }, { - "teal": 5455, - "source": 1225, + "teal": 5459, + "source": 1231, "pc": [ 5359 ] }, { - "teal": 5456, - "source": 1225, + "teal": 5460, + "source": 1231, "pc": [ 5360 ] }, { - "teal": 5457, - "source": 1225, + "teal": 5461, + "source": 1231, "pc": [ 5361 ] }, { - "teal": 5458, - "source": 1225, + "teal": 5462, + "source": 1231, "pc": [ 5362 ] }, { - "teal": 5459, - "source": 1225, + "teal": 5463, + "source": 1231, "pc": [ 5363, 5364, @@ -24701,198 +24701,198 @@ ] }, { - "teal": 5464, - "source": 1227, + "teal": 5468, + "source": 1233, "pc": [ 5366, 5367 ] }, { - "teal": 5465, - "source": 1227, + "teal": 5469, + "source": 1233, "pc": [ 5368, 5369 ] }, { - "teal": 5466, - "source": 1227, + "teal": 5470, + "source": 1233, "pc": [ 5370 ] }, { - "teal": 5467, - "source": 1227, + "teal": 5471, + "source": 1233, "pc": [ 5371 ] }, { - "teal": 5468, - "source": 1227, + "teal": 5472, + "source": 1233, "pc": [ 5372 ] }, { - "teal": 5469, - "source": 1227, + "teal": 5473, + "source": 1233, "pc": [ 5373 ] }, { - "teal": 5470, - "source": 1227, + "teal": 5474, + "source": 1233, "pc": [ 5374 ] }, { - "teal": 5471, - "source": 1227, + "teal": 5475, + "source": 1233, "pc": [ 5375 ] }, { - "teal": 5472, - "source": 1227, + "teal": 5476, + "source": 1233, "pc": [ 5376 ] }, { - "teal": 5473, - "source": 1227, + "teal": 5477, + "source": 1233, "pc": [ 5377, 5378 ] }, { - "teal": 5474, - "source": 1227, + "teal": 5478, + "source": 1233, "pc": [ 5379 ] }, { - "teal": 5475, - "source": 1227, + "teal": 5479, + "source": 1233, "pc": [ 5380 ] }, { - "teal": 5476, - "source": 1227, + "teal": 5480, + "source": 1233, "pc": [ 5381 ] }, { - "teal": 5477, - "source": 1227, + "teal": 5481, + "source": 1233, "pc": [ 5382, 5383 ] }, { - "teal": 5478, - "source": 1227, + "teal": 5482, + "source": 1233, "pc": [ 5384 ] }, { - "teal": 5479, - "source": 1227, + "teal": 5483, + "source": 1233, "pc": [ 5385 ] }, { - "teal": 5480, - "source": 1227, + "teal": 5484, + "source": 1233, "pc": [ 5386, 5387 ] }, { - "teal": 5481, - "source": 1227, + "teal": 5485, + "source": 1233, "pc": [ 5388 ] }, { - "teal": 5482, - "source": 1227, + "teal": 5486, + "source": 1233, "pc": [ 5389 ] }, { - "teal": 5483, - "source": 1227, + "teal": 5487, + "source": 1233, "pc": [ 5390, 5391 ] }, { - "teal": 5484, - "source": 1227, + "teal": 5488, + "source": 1233, "pc": [ 5392 ] }, { - "teal": 5488, - "source": 1228, + "teal": 5492, + "source": 1234, "pc": [ 5393 ] }, { - "teal": 5495, - "source": 1224, + "teal": 5499, + "source": 1230, "pc": [ 5394, 5395 ] }, { - "teal": 5496, - "source": 1224, + "teal": 5500, + "source": 1230, "pc": [ 5396 ] }, { - "teal": 5497, - "source": 1224, + "teal": 5501, + "source": 1230, "pc": [ 5397 ] }, { - "teal": 5498, - "source": 1224, + "teal": 5502, + "source": 1230, "pc": [ 5398, 5399 ] }, { - "teal": 5499, - "source": 1224, + "teal": 5503, + "source": 1230, "pc": [ 5400, 5401, @@ -24900,23 +24900,23 @@ ] }, { - "teal": 5503, - "source": 1231, + "teal": 5507, + "source": 1237, "errorMessage": "no available space in specified node for this pool", "pc": [ 5403 ] }, { - "teal": 5504, - "source": 1218, + "teal": 5508, + "source": 1224, "pc": [ 5404 ] }, { - "teal": 5514, - "source": 1241, + "teal": 5518, + "source": 1247, "pc": [ 5405, 5406, @@ -24924,119 +24924,119 @@ ] }, { - "teal": 5517, - "source": 1241, + "teal": 5521, + "source": 1247, "pc": [ 5408 ] }, { - "teal": 5518, - "source": 1241, + "teal": 5522, + "source": 1247, "pc": [ 5409, 5410 ] }, { - "teal": 5522, - "source": 1242, + "teal": 5526, + "source": 1248, "pc": [ 5411, 5412 ] }, { - "teal": 5523, - "source": 1242, + "teal": 5527, + "source": 1248, "pc": [ 5413 ] }, { - "teal": 5524, - "source": 1242, + "teal": 5528, + "source": 1248, "pc": [ 5414 ] }, { - "teal": 5525, - "source": 1242, + "teal": 5529, + "source": 1248, "pc": [ 5415, 5416 ] }, { - "teal": 5526, - "source": 1242, + "teal": 5530, + "source": 1248, "pc": [ 5417 ] }, { - "teal": 5527, - "source": 1242, + "teal": 5531, + "source": 1248, "pc": [ 5418 ] }, { - "teal": 5528, - "source": 1242, + "teal": 5532, + "source": 1248, "pc": [ 5419, 5420 ] }, { - "teal": 5529, - "source": 1242, + "teal": 5533, + "source": 1248, "pc": [ 5421 ] }, { - "teal": 5530, - "source": 1242, + "teal": 5534, + "source": 1248, "pc": [ 5422 ] }, { - "teal": 5531, - "source": 1242, + "teal": 5535, + "source": 1248, "pc": [ 5423, 5424 ] }, { - "teal": 5536, - "source": 1243, + "teal": 5540, + "source": 1249, "pc": [ 5425, 5426 ] }, { - "teal": 5537, - "source": 1243, + "teal": 5541, + "source": 1249, "pc": [ 5427 ] }, { - "teal": 5538, - "source": 1243, + "teal": 5542, + "source": 1249, "pc": [ 5428 ] }, { - "teal": 5539, - "source": 1243, + "teal": 5543, + "source": 1249, "pc": [ 5429, 5430, @@ -25044,127 +25044,127 @@ ] }, { - "teal": 5544, - "source": 1244, + "teal": 5548, + "source": 1250, "pc": [ 5432 ] }, { - "teal": 5549, - "source": 1246, + "teal": 5553, + "source": 1252, "pc": [ 5433, 5434 ] }, { - "teal": 5550, - "source": 1246, + "teal": 5554, + "source": 1252, "pc": [ 5435, 5436 ] }, { - "teal": 5554, - "source": 1247, + "teal": 5558, + "source": 1253, "pc": [ 5437 ] }, { - "teal": 5555, - "source": 1247, + "teal": 5559, + "source": 1253, "pc": [ 5438, 5439 ] }, { - "teal": 5556, - "source": 1247, + "teal": 5560, + "source": 1253, "pc": [ 5440 ] }, { - "teal": 5557, - "source": 1247, + "teal": 5561, + "source": 1253, "pc": [ 5441, 5442 ] }, { - "teal": 5558, - "source": 1247, + "teal": 5562, + "source": 1253, "pc": [ 5443 ] }, { - "teal": 5559, - "source": 1247, + "teal": 5563, + "source": 1253, "pc": [ 5444 ] }, { - "teal": 5560, - "source": 1247, + "teal": 5564, + "source": 1253, "pc": [ 5445, 5446 ] }, { - "teal": 5561, - "source": 1247, + "teal": 5565, + "source": 1253, "pc": [ 5447 ] }, { - "teal": 5562, - "source": 1247, + "teal": 5566, + "source": 1253, "pc": [ 5448, 5449 ] }, { - "teal": 5569, - "source": 1251, + "teal": 5573, + "source": 1257, "pc": [ 5450, 5451 ] }, { - "teal": 5570, - "source": 1251, + "teal": 5574, + "source": 1257, "pc": [ 5452 ] }, { - "teal": 5571, - "source": 1251, + "teal": 5575, + "source": 1257, "pc": [ 5453 ] }, { - "teal": 5572, - "source": 1251, + "teal": 5576, + "source": 1257, "pc": [ 5454 ] }, { - "teal": 5573, - "source": 1251, + "teal": 5577, + "source": 1257, "pc": [ 5455, 5456, @@ -25172,45 +25172,45 @@ ] }, { - "teal": 5574, - "source": 1252, + "teal": 5578, + "source": 1258, "pc": [ 5458, 5459 ] }, { - "teal": 5575, - "source": 1252, + "teal": 5579, + "source": 1258, "pc": [ 5460, 5461 ] }, { - "teal": 5576, - "source": 1252, + "teal": 5580, + "source": 1258, "pc": [ 5462 ] }, { - "teal": 5577, - "source": 1251, + "teal": 5581, + "source": 1257, "pc": [ 5463 ] }, { - "teal": 5580, - "source": 1252, + "teal": 5584, + "source": 1258, "pc": [ 5464 ] }, { - "teal": 5581, - "source": 1252, + "teal": 5585, + "source": 1258, "pc": [ 5465, 5466, @@ -25218,38 +25218,38 @@ ] }, { - "teal": 5582, - "source": 1253, + "teal": 5586, + "source": 1259, "pc": [ 5468, 5469 ] }, { - "teal": 5583, - "source": 1253, + "teal": 5587, + "source": 1259, "pc": [ 5470, 5471 ] }, { - "teal": 5584, - "source": 1253, + "teal": 5588, + "source": 1259, "pc": [ 5472 ] }, { - "teal": 5585, - "source": 1252, + "teal": 5589, + "source": 1258, "pc": [ 5473 ] }, { - "teal": 5588, - "source": 1250, + "teal": 5592, + "source": 1256, "pc": [ 5474, 5475, @@ -25257,133 +25257,133 @@ ] }, { - "teal": 5593, - "source": 1255, + "teal": 5597, + "source": 1261, "pc": [ 5477, 5478 ] }, { - "teal": 5594, - "source": 1255, + "teal": 5598, + "source": 1261, "pc": [ 5479 ] }, { - "teal": 5595, - "source": 1255, + "teal": 5599, + "source": 1261, "pc": [ 5480 ] }, { - "teal": 5596, - "source": 1255, + "teal": 5600, + "source": 1261, "pc": [ 5481 ] }, { - "teal": 5600, - "source": 1256, + "teal": 5604, + "source": 1262, "pc": [ 5482, 5483 ] }, { - "teal": 5601, - "source": 1256, + "teal": 5605, + "source": 1262, "pc": [ 5484 ] }, { - "teal": 5602, - "source": 1256, + "teal": 5606, + "source": 1262, "pc": [ 5485 ] }, { - "teal": 5603, - "source": 1256, + "teal": 5607, + "source": 1262, "pc": [ 5486, 5487 ] }, { - "teal": 5604, - "source": 1256, + "teal": 5608, + "source": 1262, "pc": [ 5488 ] }, { - "teal": 5605, - "source": 1256, + "teal": 5609, + "source": 1262, "pc": [ 5489 ] }, { - "teal": 5606, - "source": 1256, + "teal": 5610, + "source": 1262, "pc": [ 5490, 5491 ] }, { - "teal": 5607, - "source": 1256, + "teal": 5611, + "source": 1262, "pc": [ 5492 ] }, { - "teal": 5608, - "source": 1256, + "teal": 5612, + "source": 1262, "pc": [ 5493 ] }, { - "teal": 5609, - "source": 1256, + "teal": 5613, + "source": 1262, "pc": [ 5494, 5495 ] }, { - "teal": 5614, - "source": 1257, + "teal": 5618, + "source": 1263, "pc": [ 5496, 5497 ] }, { - "teal": 5615, - "source": 1257, + "teal": 5619, + "source": 1263, "pc": [ 5498 ] }, { - "teal": 5616, - "source": 1257, + "teal": 5620, + "source": 1263, "pc": [ 5499 ] }, { - "teal": 5617, - "source": 1257, + "teal": 5621, + "source": 1263, "pc": [ 5500, 5501, @@ -25391,99 +25391,99 @@ ] }, { - "teal": 5622, - "source": 1258, + "teal": 5626, + "source": 1264, "pc": [ 5503 ] }, { - "teal": 5623, - "source": 1258, + "teal": 5627, + "source": 1264, "pc": [ 5504, 5505 ] }, { - "teal": 5631, - "source": 1261, + "teal": 5635, + "source": 1267, "pc": [ 5506, 5507 ] }, { - "teal": 5632, - "source": 1261, + "teal": 5636, + "source": 1267, "pc": [ 5508, 5509 ] }, { - "teal": 5633, - "source": 1261, + "teal": 5637, + "source": 1267, "pc": [ 5510, 5511 ] }, { - "teal": 5634, - "source": 1261, + "teal": 5638, + "source": 1267, "pc": [ 5512 ] }, { - "teal": 5635, - "source": 1261, + "teal": 5639, + "source": 1267, "pc": [ 5513, 5514 ] }, { - "teal": 5636, - "source": 1261, + "teal": 5640, + "source": 1267, "pc": [ 5515 ] }, { - "teal": 5639, - "source": 1260, + "teal": 5643, + "source": 1266, "errorMessage": "must have required minimum balance of validator defined token to add stake", "pc": [ 5516 ] }, { - "teal": 5645, - "source": 1265, + "teal": 5649, + "source": 1271, "pc": [ 5517, 5518 ] }, { - "teal": 5646, - "source": 1265, + "teal": 5650, + "source": 1271, "pc": [ 5519 ] }, { - "teal": 5647, - "source": 1265, + "teal": 5651, + "source": 1271, "pc": [ 5520 ] }, { - "teal": 5648, - "source": 1265, + "teal": 5652, + "source": 1271, "pc": [ 5521, 5522, @@ -25491,39 +25491,39 @@ ] }, { - "teal": 5656, - "source": 1267, + "teal": 5660, + "source": 1273, "pc": [ 5524, 5525 ] }, { - "teal": 5657, - "source": 1267, + "teal": 5661, + "source": 1273, "pc": [ 5526, 5527 ] }, { - "teal": 5658, - "source": 1267, + "teal": 5662, + "source": 1273, "pc": [ 5528 ] }, { - "teal": 5659, - "source": 1267, + "teal": 5663, + "source": 1273, "pc": [ 5529, 5530 ] }, { - "teal": 5660, - "source": 1267, + "teal": 5664, + "source": 1273, "pc": [ 5531, 5532, @@ -25531,46 +25531,46 @@ ] }, { - "teal": 5661, - "source": 1267, + "teal": 5665, + "source": 1273, "pc": [ 5534 ] }, { - "teal": 5664, - "source": 1266, + "teal": 5668, + "source": 1272, "errorMessage": "specified asset must be created by creator that the validator defined as a requirement to stake", "pc": [ 5535 ] }, { - "teal": 5670, - "source": 1271, + "teal": 5674, + "source": 1277, "pc": [ 5536, 5537 ] }, { - "teal": 5671, - "source": 1271, + "teal": 5675, + "source": 1277, "pc": [ 5538, 5539 ] }, { - "teal": 5672, - "source": 1271, + "teal": 5676, + "source": 1277, "pc": [ 5540 ] }, { - "teal": 5673, - "source": 1271, + "teal": 5677, + "source": 1277, "pc": [ 5541, 5542, @@ -25578,31 +25578,31 @@ ] }, { - "teal": 5678, - "source": 1272, + "teal": 5682, + "source": 1278, "pc": [ 5544 ] }, { - "teal": 5679, - "source": 1272, + "teal": 5683, + "source": 1278, "pc": [ 5545, 5546 ] }, { - "teal": 5683, - "source": 1273, + "teal": 5687, + "source": 1279, "pc": [ 5547, 5548 ] }, { - "teal": 5684, - "source": 1273, + "teal": 5688, + "source": 1279, "pc": [ 5549, 5550, @@ -25610,23 +25610,23 @@ ] }, { - "teal": 5685, - "source": 1273, + "teal": 5689, + "source": 1279, "pc": [ 5552 ] }, { - "teal": 5686, - "source": 1273, + "teal": 5690, + "source": 1279, "pc": [ 5553, 5554 ] }, { - "teal": 5687, - "source": 1273, + "teal": 5691, + "source": 1279, "pc": [ 5555, 5556, @@ -25634,61 +25634,61 @@ ] }, { - "teal": 5688, - "source": 1273, + "teal": 5692, + "source": 1279, "pc": [ 5558 ] }, { - "teal": 5689, - "source": 1273, + "teal": 5693, + "source": 1279, "pc": [ 5559, 5560 ] }, { - "teal": 5690, - "source": 1273, + "teal": 5694, + "source": 1279, "pc": [ 5561 ] }, { - "teal": 5691, - "source": 1273, + "teal": 5695, + "source": 1279, "pc": [ 5562, 5563 ] }, { - "teal": 5697, - "source": 1274, + "teal": 5701, + "source": 1280, "pc": [ 5564, 5565 ] }, { - "teal": 5698, - "source": 1274, + "teal": 5702, + "source": 1280, "pc": [ 5566, 5567 ] }, { - "teal": 5699, - "source": 1274, + "teal": 5703, + "source": 1280, "pc": [ 5568 ] }, { - "teal": 5700, - "source": 1274, + "teal": 5704, + "source": 1280, "pc": [ 5569, 5570, @@ -25696,23 +25696,23 @@ ] }, { - "teal": 5705, - "source": 1275, + "teal": 5709, + "source": 1281, "pc": [ 5572 ] }, { - "teal": 5706, - "source": 1275, + "teal": 5710, + "source": 1281, "pc": [ 5573, 5574 ] }, { - "teal": 5707, - "source": 1276, + "teal": 5711, + "source": 1282, "pc": [ 5575, 5576, @@ -25720,52 +25720,52 @@ ] }, { - "teal": 5713, - "source": 1273, + "teal": 5717, + "source": 1279, "pc": [ 5578, 5579 ] }, { - "teal": 5714, - "source": 1273, + "teal": 5718, + "source": 1279, "pc": [ 5580 ] }, { - "teal": 5715, - "source": 1273, + "teal": 5719, + "source": 1279, "pc": [ 5581 ] }, { - "teal": 5716, - "source": 1273, + "teal": 5720, + "source": 1279, "pc": [ 5582 ] }, { - "teal": 5717, - "source": 1273, + "teal": 5721, + "source": 1279, "pc": [ 5583, 5584 ] }, { - "teal": 5718, - "source": 1273, + "teal": 5722, + "source": 1279, "pc": [ 5585 ] }, { - "teal": 5719, - "source": 1273, + "teal": 5723, + "source": 1279, "pc": [ 5586, 5587, @@ -25773,61 +25773,61 @@ ] }, { - "teal": 5720, - "source": 1273, + "teal": 5724, + "source": 1279, "pc": [ 5589, 5590 ] }, { - "teal": 5721, - "source": 1273, + "teal": 5725, + "source": 1279, "pc": [ 5591, 5592 ] }, { - "teal": 5722, - "source": 1273, + "teal": 5726, + "source": 1279, "pc": [ 5593, 5594 ] }, { - "teal": 5723, - "source": 1273, + "teal": 5727, + "source": 1279, "pc": [ 5595 ] }, { - "teal": 5724, - "source": 1273, + "teal": 5728, + "source": 1279, "pc": [ 5596 ] }, { - "teal": 5725, - "source": 1273, + "teal": 5729, + "source": 1279, "pc": [ 5597 ] }, { - "teal": 5726, - "source": 1273, + "teal": 5730, + "source": 1279, "pc": [ 5598, 5599 ] }, { - "teal": 5727, - "source": 1273, + "teal": 5731, + "source": 1279, "pc": [ 5600, 5601, @@ -25835,47 +25835,47 @@ ] }, { - "teal": 5732, - "source": 1279, + "teal": 5736, + "source": 1285, "pc": [ 5603, 5604 ] }, { - "teal": 5735, - "source": 1279, + "teal": 5739, + "source": 1285, "errorMessage": "specified asset must be identical to the asset id defined as a requirement to stake", "pc": [ 5605 ] }, { - "teal": 5741, - "source": 1281, + "teal": 5745, + "source": 1287, "pc": [ 5606, 5607 ] }, { - "teal": 5742, - "source": 1281, + "teal": 5746, + "source": 1287, "pc": [ 5608, 5609 ] }, { - "teal": 5743, - "source": 1281, + "teal": 5747, + "source": 1287, "pc": [ 5610 ] }, { - "teal": 5744, - "source": 1281, + "teal": 5748, + "source": 1287, "pc": [ 5611, 5612, @@ -25883,39 +25883,39 @@ ] }, { - "teal": 5752, - "source": 1285, + "teal": 5756, + "source": 1291, "pc": [ 5614, 5615 ] }, { - "teal": 5753, - "source": 1285, + "teal": 5757, + "source": 1291, "pc": [ 5616, 5617 ] }, { - "teal": 5754, - "source": 1285, + "teal": 5758, + "source": 1291, "pc": [ 5618 ] }, { - "teal": 5755, - "source": 1285, + "teal": 5759, + "source": 1291, "pc": [ 5619, 5620 ] }, { - "teal": 5756, - "source": 1285, + "teal": 5760, + "source": 1291, "pc": [ 5621, 5622, @@ -25923,15 +25923,15 @@ ] }, { - "teal": 5757, - "source": 1285, + "teal": 5761, + "source": 1291, "pc": [ 5624 ] }, { - "teal": 5758, - "source": 1285, + "teal": 5762, + "source": 1291, "pc": [ 5625, 5626, @@ -25939,39 +25939,39 @@ ] }, { - "teal": 5761, - "source": 1284, + "teal": 5765, + "source": 1290, "errorMessage": "specified asset must be created by creator that is one of the linked addresses in an nfd", "pc": [ 5628 ] }, { - "teal": 5767, - "source": 1289, + "teal": 5771, + "source": 1295, "pc": [ 5629, 5630 ] }, { - "teal": 5768, - "source": 1289, + "teal": 5772, + "source": 1295, "pc": [ 5631, 5632 ] }, { - "teal": 5769, - "source": 1289, + "teal": 5773, + "source": 1295, "pc": [ 5633 ] }, { - "teal": 5770, - "source": 1289, + "teal": 5774, + "source": 1295, "pc": [ 5634, 5635, @@ -25979,32 +25979,32 @@ ] }, { - "teal": 5775, - "source": 1291, + "teal": 5779, + "source": 1297, "pc": [ 5637, 5638 ] }, { - "teal": 5776, - "source": 1291, + "teal": 5780, + "source": 1297, "pc": [ 5639, 5640 ] }, { - "teal": 5780, - "source": 1292, + "teal": 5784, + "source": 1298, "pc": [ 5641, 5642 ] }, { - "teal": 5781, - "source": 1292, + "teal": 5785, + "source": 1298, "pc": [ 5643, 5644, @@ -26012,69 +26012,69 @@ ] }, { - "teal": 5784, - "source": 1292, + "teal": 5788, + "source": 1298, "errorMessage": "provided NFD must be valid", "pc": [ 5646 ] }, { - "teal": 5792, - "source": 1296, + "teal": 5796, + "source": 1302, "pc": [ 5647, 5648 ] }, { - "teal": 5793, - "source": 1296, + "teal": 5797, + "source": 1302, "pc": [ 5649, 5650 ] }, { - "teal": 5794, - "source": 1296, + "teal": 5798, + "source": 1302, "pc": [ 5651 ] }, { - "teal": 5797, - "source": 1296, + "teal": 5801, + "source": 1302, "errorMessage": "global state value does not exist: AppID.fromUint64(userOfferedNFDAppID).globalState('i.owner.a')", "pc": [ 5652 ] }, { - "teal": 5798, - "source": 1297, + "teal": 5802, + "source": 1303, "pc": [ 5653, 5654 ] }, { - "teal": 5799, - "source": 1296, + "teal": 5803, + "source": 1302, "pc": [ 5655 ] }, { - "teal": 5800, - "source": 1297, + "teal": 5804, + "source": 1303, "pc": [ 5656 ] }, { - "teal": 5801, - "source": 1297, + "teal": 5805, + "source": 1303, "pc": [ 5657, 5658, @@ -26082,24 +26082,24 @@ ] }, { - "teal": 5802, - "source": 1297, + "teal": 5806, + "source": 1303, "pc": [ 5660, 5661 ] }, { - "teal": 5803, - "source": 1297, + "teal": 5807, + "source": 1303, "pc": [ 5662, 5663 ] }, { - "teal": 5804, - "source": 1297, + "teal": 5808, + "source": 1303, "pc": [ 5664, 5665, @@ -26107,31 +26107,31 @@ ] }, { - "teal": 5805, - "source": 1297, + "teal": 5809, + "source": 1303, "pc": [ 5667 ] }, { - "teal": 5809, - "source": 1295, + "teal": 5813, + "source": 1301, "errorMessage": "provided nfd for entry isn't owned or linked to the staker", "pc": [ 5668 ] }, { - "teal": 5817, - "source": 1303, + "teal": 5821, + "source": 1309, "pc": [ 5669, 5670 ] }, { - "teal": 5818, - "source": 1303, + "teal": 5822, + "source": 1309, "pc": [ 5671, 5672, @@ -26151,38 +26151,38 @@ ] }, { - "teal": 5819, - "source": 1303, + "teal": 5823, + "source": 1309, "pc": [ 5686 ] }, { - "teal": 5822, - "source": 1303, + "teal": 5826, + "source": 1309, "errorMessage": "global state value does not exist: AppID.fromUint64(userOfferedNFDAppID).globalState('i.parentAppID')", "pc": [ 5687 ] }, { - "teal": 5823, - "source": 1303, + "teal": 5827, + "source": 1309, "pc": [ 5688 ] }, { - "teal": 5824, - "source": 1304, + "teal": 5828, + "source": 1310, "pc": [ 5689, 5690 ] }, { - "teal": 5825, - "source": 1304, + "teal": 5829, + "source": 1310, "pc": [ 5691, 5692, @@ -26190,37 +26190,37 @@ ] }, { - "teal": 5826, - "source": 1304, + "teal": 5830, + "source": 1310, "pc": [ 5694 ] }, { - "teal": 5827, - "source": 1303, + "teal": 5831, + "source": 1309, "pc": [ 5695 ] }, { - "teal": 5830, - "source": 1302, + "teal": 5834, + "source": 1308, "errorMessage": "specified nfd must be a segment of the nfd the validator specified as a requirement", "pc": [ 5696 ] }, { - "teal": 5833, - "source": 1241, + "teal": 5837, + "source": 1247, "pc": [ 5697 ] }, { - "teal": 5845, - "source": 1319, + "teal": 5849, + "source": 1325, "pc": [ 5698, 5699, @@ -26228,23 +26228,23 @@ ] }, { - "teal": 5848, - "source": 1319, + "teal": 5852, + "source": 1325, "pc": [ 5701 ] }, { - "teal": 5852, - "source": 1321, + "teal": 5856, + "source": 1327, "pc": [ 5702, 5703 ] }, { - "teal": 5853, - "source": 1321, + "teal": 5857, + "source": 1327, "pc": [ 5704, 5705, @@ -26257,54 +26257,54 @@ ] }, { - "teal": 5854, - "source": 1321, + "teal": 5858, + "source": 1327, "pc": [ 5712 ] }, { - "teal": 5857, - "source": 1321, + "teal": 5861, + "source": 1327, "errorMessage": "global state value does not exist: AppID.fromUint64(nfdAppID).globalState('i.name')", "pc": [ 5713 ] }, { - "teal": 5858, - "source": 1321, + "teal": 5862, + "source": 1327, "pc": [ 5714, 5715 ] }, { - "teal": 5866, - "source": 1323, + "teal": 5870, + "source": 1329, "pc": [ 5716 ] }, { - "teal": 5867, - "source": 1323, + "teal": 5871, + "source": 1329, "pc": [ 5717, 5718 ] }, { - "teal": 5868, - "source": 1323, + "teal": 5872, + "source": 1329, "pc": [ 5719, 5720 ] }, { - "teal": 5869, - "source": 1325, + "teal": 5873, + "source": 1331, "pc": [ 5721, 5722, @@ -26315,61 +26315,61 @@ ] }, { - "teal": 5870, - "source": 1325, + "teal": 5874, + "source": 1331, "pc": [ 5727, 5728 ] }, { - "teal": 5874, - "source": 1324, + "teal": 5878, + "source": 1330, "pc": [ 5729, 5730 ] }, { - "teal": 5875, - "source": 1324, + "teal": 5879, + "source": 1330, "pc": [ 5731, 5732 ] }, { - "teal": 5879, - "source": 1326, + "teal": 5883, + "source": 1332, "pc": [ 5733, 5734 ] }, { - "teal": 5880, - "source": 1326, + "teal": 5884, + "source": 1332, "pc": [ 5735 ] }, { - "teal": 5881, - "source": 1326, + "teal": 5885, + "source": 1332, "pc": [ 5736 ] }, { - "teal": 5882, - "source": 1326, + "teal": 5886, + "source": 1332, "pc": [ 5737 ] }, { - "teal": 5883, - "source": 1326, + "teal": 5887, + "source": 1332, "pc": [ 5738, 5739, @@ -26377,105 +26377,105 @@ ] }, { - "teal": 5884, - "source": 1326, + "teal": 5888, + "source": 1332, "pc": [ 5741 ] }, { - "teal": 5885, - "source": 1326, + "teal": 5889, + "source": 1332, "pc": [ 5742 ] }, { - "teal": 5886, - "source": 1326, + "teal": 5890, + "source": 1332, "pc": [ 5743, 5744 ] }, { - "teal": 5887, - "source": 1326, + "teal": 5891, + "source": 1332, "pc": [ 5745, 5746 ] }, { - "teal": 5888, - "source": 1326, + "teal": 5892, + "source": 1332, "pc": [ 5747 ] }, { - "teal": 5889, - "source": 1326, + "teal": 5893, + "source": 1332, "pc": [ 5748, 5749 ] }, { - "teal": 5892, - "source": 1323, + "teal": 5896, + "source": 1329, "pc": [ 5750 ] }, { - "teal": 5893, - "source": 1323, + "teal": 5897, + "source": 1329, "pc": [ 5751, 5752 ] }, { - "teal": 5896, - "source": 1323, + "teal": 5900, + "source": 1329, "pc": [ 5753 ] }, { - "teal": 5897, - "source": 1323, + "teal": 5901, + "source": 1329, "pc": [ 5754, 5755 ] }, { - "teal": 5898, - "source": 1323, + "teal": 5902, + "source": 1329, "pc": [ 5756 ] }, { - "teal": 5899, - "source": 1323, + "teal": 5903, + "source": 1329, "pc": [ 5757 ] }, { - "teal": 5900, - "source": 1323, + "teal": 5904, + "source": 1329, "pc": [ 5758, 5759 ] }, { - "teal": 5901, - "source": 1323, + "teal": 5905, + "source": 1329, "pc": [ 5760, 5761, @@ -26483,37 +26483,37 @@ ] }, { - "teal": 5902, - "source": 1323, + "teal": 5906, + "source": 1329, "pc": [ 5763 ] }, { - "teal": 5903, - "source": 1323, + "teal": 5907, + "source": 1329, "pc": [ 5764 ] }, { - "teal": 5906, - "source": 1319, + "teal": 5910, + "source": 1325, "pc": [ 5765, 5766 ] }, { - "teal": 5907, - "source": 1319, + "teal": 5911, + "source": 1325, "pc": [ 5767 ] }, { - "teal": 5918, - "source": 1338, + "teal": 5922, + "source": 1344, "pc": [ 5768, 5769, @@ -26521,62 +26521,62 @@ ] }, { - "teal": 5921, - "source": 1338, + "teal": 5925, + "source": 1344, "pc": [ 5771 ] }, { - "teal": 5922, - "source": 1338, + "teal": 5926, + "source": 1344, "pc": [ 5772, 5773 ] }, { - "teal": 5929, - "source": 1339, + "teal": 5933, + "source": 1345, "pc": [ 5774 ] }, { - "teal": 5930, - "source": 1339, + "teal": 5934, + "source": 1345, "pc": [ 5775, 5776 ] }, { - "teal": 5931, - "source": 1339, + "teal": 5935, + "source": 1345, "pc": [ 5777, 5778 ] }, { - "teal": 5935, - "source": 1340, + "teal": 5939, + "source": 1346, "pc": [ 5779, 5780 ] }, { - "teal": 5936, - "source": 1340, + "teal": 5940, + "source": 1346, "pc": [ 5781, 5782 ] }, { - "teal": 5940, - "source": 1341, + "teal": 5944, + "source": 1347, "pc": [ 5783, 5784, @@ -26596,16 +26596,16 @@ ] }, { - "teal": 5941, - "source": 1341, + "teal": 5945, + "source": 1347, "pc": [ 5798, 5799 ] }, { - "teal": 5942, - "source": 1341, + "teal": 5946, + "source": 1347, "pc": [ 5800, 5801, @@ -26625,99 +26625,99 @@ ] }, { - "teal": 5943, - "source": 1341, + "teal": 5947, + "source": 1347, "pc": [ 5815, 5816 ] }, { - "teal": 5946, - "source": 1339, + "teal": 5950, + "source": 1345, "pc": [ 5817 ] }, { - "teal": 5947, - "source": 1339, + "teal": 5951, + "source": 1345, "pc": [ 5818, 5819 ] }, { - "teal": 5950, - "source": 1339, + "teal": 5954, + "source": 1345, "pc": [ 5820 ] }, { - "teal": 5954, - "source": 1343, + "teal": 5958, + "source": 1349, "pc": [ 5821, 5822 ] }, { - "teal": 5955, - "source": 1343, + "teal": 5959, + "source": 1349, "pc": [ 5823, 5824 ] }, { - "teal": 5959, - "source": 1344, + "teal": 5963, + "source": 1350, "pc": [ 5825 ] }, { - "teal": 5960, - "source": 1344, + "teal": 5964, + "source": 1350, "pc": [ 5826, 5827 ] }, { - "teal": 5965, - "source": 1344, + "teal": 5969, + "source": 1350, "pc": [ 5828, 5829 ] }, { - "teal": 5966, - "source": 1344, + "teal": 5970, + "source": 1350, "pc": [ 5830, 5831 ] }, { - "teal": 5967, - "source": 1344, + "teal": 5971, + "source": 1350, "pc": [ 5832 ] }, { - "teal": 5968, - "source": 1344, + "teal": 5972, + "source": 1350, "pc": [ 5833 ] }, { - "teal": 5969, - "source": 1344, + "teal": 5973, + "source": 1350, "pc": [ 5834, 5835, @@ -26725,116 +26725,116 @@ ] }, { - "teal": 5973, - "source": 1345, + "teal": 5977, + "source": 1351, "pc": [ 5837, 5838 ] }, { - "teal": 5974, - "source": 1345, + "teal": 5978, + "source": 1351, "pc": [ 5839, 5840 ] }, { - "teal": 5975, - "source": 1345, + "teal": 5979, + "source": 1351, "pc": [ 5841, 5842 ] }, { - "teal": 5976, - "source": 1345, + "teal": 5980, + "source": 1351, "pc": [ 5843 ] }, { - "teal": 5977, - "source": 1345, + "teal": 5981, + "source": 1351, "pc": [ 5844, 5845 ] }, { - "teal": 5982, - "source": 1346, + "teal": 5986, + "source": 1352, "pc": [ 5846, 5847 ] }, { - "teal": 5983, - "source": 1346, + "teal": 5987, + "source": 1352, "pc": [ 5848, 5849 ] }, { - "teal": 5984, - "source": 1346, + "teal": 5988, + "source": 1352, "pc": [ 5850 ] }, { - "teal": 5985, - "source": 1346, + "teal": 5989, + "source": 1352, "pc": [ 5851 ] }, { - "teal": 5986, - "source": 1346, + "teal": 5990, + "source": 1352, "pc": [ 5852, 5853, 5854 ] }, - { - "teal": 5987, - "source": 1346, + { + "teal": 5991, + "source": 1352, "pc": [ 5855, 5856 ] }, { - "teal": 5988, - "source": 1346, + "teal": 5992, + "source": 1352, "pc": [ 5857, 5858 ] }, { - "teal": 5989, - "source": 1346, + "teal": 5993, + "source": 1352, "pc": [ 5859 ] }, { - "teal": 5990, - "source": 1346, + "teal": 5994, + "source": 1352, "pc": [ 5860 ] }, { - "teal": 5993, - "source": 1346, + "teal": 5997, + "source": 1352, "pc": [ 5861, 5862, @@ -26842,15 +26842,15 @@ ] }, { - "teal": 5998, - "source": 1347, + "teal": 6002, + "source": 1353, "pc": [ 5864 ] }, { - "teal": 5999, - "source": 1347, + "teal": 6003, + "source": 1353, "pc": [ 5865, 5866, @@ -26858,39 +26858,39 @@ ] }, { - "teal": 6006, - "source": 1344, + "teal": 6010, + "source": 1350, "pc": [ 5868, 5869 ] }, { - "teal": 6007, - "source": 1344, + "teal": 6011, + "source": 1350, "pc": [ 5870, 5871 ] }, { - "teal": 6008, - "source": 1344, + "teal": 6012, + "source": 1350, "pc": [ 5872 ] }, { - "teal": 6009, - "source": 1344, + "teal": 6013, + "source": 1350, "pc": [ 5873, 5874 ] }, { - "teal": 6010, - "source": 1344, + "teal": 6014, + "source": 1350, "pc": [ 5875, 5876, @@ -26898,38 +26898,38 @@ ] }, { - "teal": 6015, - "source": 1350, + "teal": 6019, + "source": 1356, "pc": [ 5878 ] }, { - "teal": 6019, - "source": 1338, + "teal": 6023, + "source": 1344, "pc": [ 5879, 5880 ] }, { - "teal": 6022, - "source": 1338, + "teal": 6026, + "source": 1344, "pc": [ 5881, 5882 ] }, { - "teal": 6023, - "source": 1338, + "teal": 6027, + "source": 1344, "pc": [ 5883 ] }, { - "teal": 6031, - "source": 1358, + "teal": 6035, + "source": 1364, "pc": [ 5884, 5885, @@ -26937,15 +26937,15 @@ ] }, { - "teal": 6034, - "source": 1358, + "teal": 6038, + "source": 1364, "pc": [ 5887 ] }, { - "teal": 6038, - "source": 1359, + "teal": 6042, + "source": 1365, "pc": [ 5888, 5889, @@ -26953,112 +26953,112 @@ ] }, { - "teal": 6039, - "source": 1359, + "teal": 6043, + "source": 1365, "pc": [ 5891, 5892 ] }, { - "teal": 6043, - "source": 1361, + "teal": 6047, + "source": 1367, "pc": [ 5893, 5894 ] }, { - "teal": 6044, - "source": 1361, + "teal": 6048, + "source": 1367, "pc": [ 5895, 5896 ] }, { - "teal": 6045, - "source": 1361, + "teal": 6049, + "source": 1367, "pc": [ 5897 ] }, { - "teal": 6046, - "source": 1361, + "teal": 6050, + "source": 1367, "pc": [ 5898 ] }, { - "teal": 6047, - "source": 1361, + "teal": 6051, + "source": 1367, "pc": [ 5899, 5900 ] }, { - "teal": 6048, - "source": 1361, + "teal": 6052, + "source": 1367, "pc": [ 5901 ] }, { - "teal": 6049, - "source": 1361, + "teal": 6053, + "source": 1367, "pc": [ 5902 ] }, { - "teal": 6050, - "source": 1361, + "teal": 6054, + "source": 1367, "pc": [ 5903 ] }, { - "teal": 6051, - "source": 1361, + "teal": 6055, + "source": 1367, "pc": [ 5904 ] }, { - "teal": 6052, - "source": 1361, + "teal": 6056, + "source": 1367, "pc": [ 5905 ] }, { - "teal": 6055, - "source": 1361, + "teal": 6059, + "source": 1367, "errorMessage": "wideRatio failed", "pc": [ 5906 ] }, { - "teal": 6058, - "source": 1358, + "teal": 6062, + "source": 1364, "pc": [ 5907, 5908 ] }, { - "teal": 6059, - "source": 1358, + "teal": 6063, + "source": 1364, "pc": [ 5909 ] }, { - "teal": 6066, - "source": 1368, + "teal": 6070, + "source": 1374, "pc": [ 5910, 5911, @@ -27066,15 +27066,15 @@ ] }, { - "teal": 6069, - "source": 1368, + "teal": 6073, + "source": 1374, "pc": [ 5913 ] }, { - "teal": 6073, - "source": 1369, + "teal": 6077, + "source": 1375, "pc": [ 5914, 5915, @@ -27082,24 +27082,24 @@ ] }, { - "teal": 6074, - "source": 1369, + "teal": 6078, + "source": 1375, "pc": [ 5917, 5918 ] }, { - "teal": 6078, - "source": 1371, + "teal": 6082, + "source": 1377, "pc": [ 5919, 5920 ] }, { - "teal": 6079, - "source": 1371, + "teal": 6083, + "source": 1377, "pc": [ 5921, 5922, @@ -27107,88 +27107,88 @@ ] }, { - "teal": 6080, - "source": 1371, + "teal": 6084, + "source": 1377, "pc": [ 5924 ] }, { - "teal": 6081, - "source": 1371, + "teal": 6085, + "source": 1377, "pc": [ 5925 ] }, { - "teal": 6082, - "source": 1371, + "teal": 6086, + "source": 1377, "pc": [ 5926, 5927 ] }, { - "teal": 6083, - "source": 1371, + "teal": 6087, + "source": 1377, "pc": [ 5928 ] }, { - "teal": 6084, - "source": 1371, + "teal": 6088, + "source": 1377, "pc": [ 5929 ] }, { - "teal": 6085, - "source": 1371, + "teal": 6089, + "source": 1377, "pc": [ 5930 ] }, { - "teal": 6086, - "source": 1371, + "teal": 6090, + "source": 1377, "pc": [ 5931 ] }, { - "teal": 6087, - "source": 1371, + "teal": 6091, + "source": 1377, "pc": [ 5932 ] }, { - "teal": 6090, - "source": 1371, + "teal": 6094, + "source": 1377, "errorMessage": "wideRatio failed", "pc": [ 5933 ] }, { - "teal": 6093, - "source": 1368, + "teal": 6097, + "source": 1374, "pc": [ 5934, 5935 ] }, { - "teal": 6094, - "source": 1368, + "teal": 6098, + "source": 1374, "pc": [ 5936 ] }, { - "teal": 6100, - "source": 1377, + "teal": 6104, + "source": 1383, "pc": [ 5937, 5938, @@ -27196,23 +27196,23 @@ ] }, { - "teal": 6104, - "source": 1378, + "teal": 6108, + "source": 1384, "pc": [ 5940, 5941 ] }, { - "teal": 6105, - "source": 1377, + "teal": 6109, + "source": 1383, "pc": [ 5942 ] }, { - "teal": 6109, - "source": 1381, + "teal": 6113, + "source": 1387, "pc": [ 5943, 5944, @@ -27220,22 +27220,22 @@ ] }, { - "teal": 6113, - "source": 1382, + "teal": 6117, + "source": 1388, "pc": [ 5946 ] }, { - "teal": 6114, - "source": 1381, + "teal": 6118, + "source": 1387, "pc": [ 5947 ] }, { - "teal": 6118, - "source": 1385, + "teal": 6122, + "source": 1391, "pc": [ 5948, 5949, @@ -27243,376 +27243,376 @@ ] }, { - "teal": 6121, - "source": 1385, + "teal": 6125, + "source": 1391, "pc": [ 5951 ] }, { - "teal": 6125, - "source": 1394, + "teal": 6129, + "source": 1400, "pc": [ 5952, 5953 ] }, { - "teal": 6126, - "source": 1394, + "teal": 6130, + "source": 1400, "pc": [ 5954, 5955 ] }, { - "teal": 6130, - "source": 1395, + "teal": 6134, + "source": 1401, "pc": [ 5956, 5957 ] }, { - "teal": 6131, - "source": 1395, + "teal": 6135, + "source": 1401, "pc": [ 5958, 5959 ] }, { - "teal": 6132, - "source": 1395, + "teal": 6136, + "source": 1401, "pc": [ 5960, 5961 ] }, { - "teal": 6133, - "source": 1395, + "teal": 6137, + "source": 1401, "pc": [ 5962 ] }, { - "teal": 6134, - "source": 1395, + "teal": 6138, + "source": 1401, "pc": [ 5963 ] }, { - "teal": 6135, - "source": 1395, + "teal": 6139, + "source": 1401, "pc": [ 5964, 5965 ] }, { - "teal": 6139, - "source": 1396, + "teal": 6143, + "source": 1402, "pc": [ 5966, 5967 ] }, { - "teal": 6140, - "source": 1396, + "teal": 6144, + "source": 1402, "pc": [ 5968, 5969 ] }, { - "teal": 6141, - "source": 1396, + "teal": 6145, + "source": 1402, "pc": [ 5970, 5971 ] }, { - "teal": 6142, - "source": 1396, + "teal": 6146, + "source": 1402, "pc": [ 5972 ] }, { - "teal": 6143, - "source": 1396, + "teal": 6147, + "source": 1402, "pc": [ 5973 ] }, { - "teal": 6144, - "source": 1396, + "teal": 6148, + "source": 1402, "pc": [ 5974, 5975 ] }, { - "teal": 6148, - "source": 1397, + "teal": 6152, + "source": 1403, "pc": [ 5976, 5977 ] }, { - "teal": 6149, - "source": 1397, + "teal": 6153, + "source": 1403, "pc": [ 5978, 5979 ] }, { - "teal": 6150, - "source": 1397, + "teal": 6154, + "source": 1403, "pc": [ 5980, 5981 ] }, { - "teal": 6151, - "source": 1397, + "teal": 6155, + "source": 1403, "pc": [ 5982 ] }, { - "teal": 6152, - "source": 1397, + "teal": 6156, + "source": 1403, "pc": [ 5983 ] }, { - "teal": 6153, - "source": 1397, + "teal": 6157, + "source": 1403, "pc": [ 5984, 5985 ] }, { - "teal": 6157, - "source": 1398, + "teal": 6161, + "source": 1404, "pc": [ 5986, 5987 ] }, { - "teal": 6158, - "source": 1398, + "teal": 6162, + "source": 1404, "pc": [ 5988, 5989 ] }, { - "teal": 6159, - "source": 1398, + "teal": 6163, + "source": 1404, "pc": [ 5990, 5991 ] }, { - "teal": 6160, - "source": 1398, + "teal": 6164, + "source": 1404, "pc": [ 5992 ] }, { - "teal": 6161, - "source": 1398, + "teal": 6165, + "source": 1404, "pc": [ 5993 ] }, { - "teal": 6162, - "source": 1398, + "teal": 6166, + "source": 1404, "pc": [ 5994, 5995 ] }, { - "teal": 6166, - "source": 1399, + "teal": 6170, + "source": 1405, "pc": [ 5996, 5997 ] }, { - "teal": 6167, - "source": 1399, + "teal": 6171, + "source": 1405, "pc": [ 5998, 5999 ] }, { - "teal": 6168, - "source": 1399, + "teal": 6172, + "source": 1405, "pc": [ 6000, 6001 ] }, { - "teal": 6169, - "source": 1399, + "teal": 6173, + "source": 1405, "pc": [ 6002 ] }, { - "teal": 6170, - "source": 1399, + "teal": 6174, + "source": 1405, "pc": [ 6003 ] }, { - "teal": 6171, - "source": 1399, + "teal": 6175, + "source": 1405, "pc": [ 6004, 6005 ] }, { - "teal": 6175, - "source": 1400, + "teal": 6179, + "source": 1406, "pc": [ 6006, 6007 ] }, { - "teal": 6176, - "source": 1400, + "teal": 6180, + "source": 1406, "pc": [ 6008, 6009 ] }, { - "teal": 6177, - "source": 1400, + "teal": 6181, + "source": 1406, "pc": [ 6010, 6011 ] }, { - "teal": 6178, - "source": 1400, + "teal": 6182, + "source": 1406, "pc": [ 6012 ] }, { - "teal": 6179, - "source": 1400, + "teal": 6183, + "source": 1406, "pc": [ 6013 ] }, { - "teal": 6180, - "source": 1400, + "teal": 6184, + "source": 1406, "pc": [ 6014, 6015 ] }, { - "teal": 6184, - "source": 1401, + "teal": 6188, + "source": 1407, "pc": [ 6016, 6017 ] }, { - "teal": 6185, - "source": 1401, + "teal": 6189, + "source": 1407, "pc": [ 6018, 6019 ] }, { - "teal": 6186, - "source": 1401, + "teal": 6190, + "source": 1407, "pc": [ 6020, 6021 ] }, { - "teal": 6187, - "source": 1401, + "teal": 6191, + "source": 1407, "pc": [ 6022 ] }, { - "teal": 6188, - "source": 1401, + "teal": 6192, + "source": 1407, "pc": [ 6023 ] }, { - "teal": 6189, - "source": 1401, + "teal": 6193, + "source": 1407, "pc": [ 6024, 6025 ] }, { - "teal": 6193, - "source": 1402, + "teal": 6197, + "source": 1408, "pc": [ 6026, 6027 ] }, { - "teal": 6196, - "source": 1385, + "teal": 6200, + "source": 1391, "pc": [ 6028, 6029 ] }, { - "teal": 6197, - "source": 1385, + "teal": 6201, + "source": 1391, "pc": [ 6030 ] }, { - "teal": 6201, - "source": 1405, + "teal": 6205, + "source": 1411, "pc": [ 6031, 6032, @@ -27620,8 +27620,8 @@ ] }, { - "teal": 6205, - "source": 1409, + "teal": 6209, + "source": 1415, "pc": [ 6034, 6035, @@ -27629,16 +27629,16 @@ ] }, { - "teal": 6206, - "source": 1409, + "teal": 6210, + "source": 1415, "pc": [ 6037, 6038 ] }, { - "teal": 6207, - "source": 1409, + "teal": 6211, + "source": 1415, "pc": [ 6039, 6040, @@ -27646,28 +27646,28 @@ ] }, { - "teal": 6208, - "source": 1409, + "teal": 6212, + "source": 1415, "pc": [ 6042 ] }, { - "teal": 6209, - "source": 1409, + "teal": 6213, + "source": 1415, "pc": [ 6043 ] }, { - "teal": 6210, - "source": 1405, + "teal": 6214, + "source": 1411, "pc": [ 6044 ] }, { - "teal": 6213, + "teal": 6217, "source": 50, "pc": [ 6045, @@ -27679,7 +27679,7 @@ ] }, { - "teal": 6214, + "teal": 6218, "source": 50, "pc": [ 6051, @@ -27688,7 +27688,7 @@ ] }, { - "teal": 6215, + "teal": 6219, "source": 50, "pc": [ 6054, @@ -27698,7 +27698,7 @@ ] }, { - "teal": 6218, + "teal": 6222, "source": 50, "errorMessage": "this contract does not implement the given ABI method for create NoOp", "pc": [ @@ -27706,7 +27706,7 @@ ] }, { - "teal": 6221, + "teal": 6225, "source": 50, "pc": [ 6059, @@ -27718,7 +27718,7 @@ ] }, { - "teal": 6222, + "teal": 6226, "source": 50, "pc": [ 6065, @@ -27730,7 +27730,7 @@ ] }, { - "teal": 6223, + "teal": 6227, "source": 50, "pc": [ 6071, @@ -27742,7 +27742,7 @@ ] }, { - "teal": 6224, + "teal": 6228, "source": 50, "pc": [ 6077, @@ -27754,7 +27754,7 @@ ] }, { - "teal": 6225, + "teal": 6229, "source": 50, "pc": [ 6083, @@ -27766,7 +27766,7 @@ ] }, { - "teal": 6226, + "teal": 6230, "source": 50, "pc": [ 6089, @@ -27778,7 +27778,7 @@ ] }, { - "teal": 6227, + "teal": 6231, "source": 50, "pc": [ 6095, @@ -27790,7 +27790,7 @@ ] }, { - "teal": 6228, + "teal": 6232, "source": 50, "pc": [ 6101, @@ -27802,7 +27802,7 @@ ] }, { - "teal": 6229, + "teal": 6233, "source": 50, "pc": [ 6107, @@ -27814,7 +27814,7 @@ ] }, { - "teal": 6230, + "teal": 6234, "source": 50, "pc": [ 6113, @@ -27826,7 +27826,7 @@ ] }, { - "teal": 6231, + "teal": 6235, "source": 50, "pc": [ 6119, @@ -27838,7 +27838,7 @@ ] }, { - "teal": 6232, + "teal": 6236, "source": 50, "pc": [ 6125, @@ -27850,7 +27850,7 @@ ] }, { - "teal": 6233, + "teal": 6237, "source": 50, "pc": [ 6131, @@ -27862,7 +27862,7 @@ ] }, { - "teal": 6234, + "teal": 6238, "source": 50, "pc": [ 6137, @@ -27874,7 +27874,7 @@ ] }, { - "teal": 6235, + "teal": 6239, "source": 50, "pc": [ 6143, @@ -27886,7 +27886,7 @@ ] }, { - "teal": 6236, + "teal": 6240, "source": 50, "pc": [ 6149, @@ -27898,7 +27898,7 @@ ] }, { - "teal": 6237, + "teal": 6241, "source": 50, "pc": [ 6155, @@ -27910,7 +27910,7 @@ ] }, { - "teal": 6238, + "teal": 6242, "source": 50, "pc": [ 6161, @@ -27922,7 +27922,7 @@ ] }, { - "teal": 6239, + "teal": 6243, "source": 50, "pc": [ 6167, @@ -27934,7 +27934,7 @@ ] }, { - "teal": 6240, + "teal": 6244, "source": 50, "pc": [ 6173, @@ -27946,7 +27946,7 @@ ] }, { - "teal": 6241, + "teal": 6245, "source": 50, "pc": [ 6179, @@ -27958,7 +27958,7 @@ ] }, { - "teal": 6242, + "teal": 6246, "source": 50, "pc": [ 6185, @@ -27970,7 +27970,7 @@ ] }, { - "teal": 6243, + "teal": 6247, "source": 50, "pc": [ 6191, @@ -27982,7 +27982,7 @@ ] }, { - "teal": 6244, + "teal": 6248, "source": 50, "pc": [ 6197, @@ -27994,7 +27994,7 @@ ] }, { - "teal": 6245, + "teal": 6249, "source": 50, "pc": [ 6203, @@ -28006,7 +28006,7 @@ ] }, { - "teal": 6246, + "teal": 6250, "source": 50, "pc": [ 6209, @@ -28018,7 +28018,7 @@ ] }, { - "teal": 6247, + "teal": 6251, "source": 50, "pc": [ 6215, @@ -28030,7 +28030,7 @@ ] }, { - "teal": 6248, + "teal": 6252, "source": 50, "pc": [ 6221, @@ -28042,7 +28042,7 @@ ] }, { - "teal": 6249, + "teal": 6253, "source": 50, "pc": [ 6227, @@ -28054,7 +28054,7 @@ ] }, { - "teal": 6250, + "teal": 6254, "source": 50, "pc": [ 6233, @@ -28066,7 +28066,7 @@ ] }, { - "teal": 6251, + "teal": 6255, "source": 50, "pc": [ 6239, @@ -28078,7 +28078,7 @@ ] }, { - "teal": 6252, + "teal": 6256, "source": 50, "pc": [ 6245, @@ -28090,7 +28090,7 @@ ] }, { - "teal": 6253, + "teal": 6257, "source": 50, "pc": [ 6251, @@ -28102,7 +28102,7 @@ ] }, { - "teal": 6254, + "teal": 6258, "source": 50, "pc": [ 6257, @@ -28111,7 +28111,7 @@ ] }, { - "teal": 6255, + "teal": 6259, "source": 50, "pc": [ 6260, @@ -28185,7 +28185,7 @@ ] }, { - "teal": 6258, + "teal": 6262, "source": 50, "errorMessage": "this contract does not implement the given ABI method for call NoOp", "pc": [ diff --git a/contracts/contracts/clients/StakingPoolClient.ts b/contracts/contracts/clients/StakingPoolClient.ts index 20e64e4a..c96f051e 100644 --- a/contracts/contracts/clients/StakingPoolClient.ts +++ b/contracts/contracts/clients/StakingPoolClient.ts @@ -295,6 +295,7 @@ export const APP_SPEC: AppSpec = { { "name": "getStakerInfo", "desc": "Retrieves the staked information for a given staker.", + "readonly": true, "args": [ { "name": "staker", diff --git a/contracts/contracts/clients/ValidatorRegistryClient.ts b/contracts/contracts/clients/ValidatorRegistryClient.ts index f93de7ea..9f4c7d9c 100644 --- a/contracts/contracts/clients/ValidatorRegistryClient.ts +++ b/contracts/contracts/clients/ValidatorRegistryClient.ts @@ -247,7 +247,7 @@ export const APP_SPEC: AppSpec = { } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCgovLyBUaGlzIFRFQUwgd2FzIGdlbmVyYXRlZCBieSBURUFMU2NyaXB0IHYwLjEwMy4wCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbGdvcmFuZGZvdW5kYXRpb24vVEVBTFNjcmlwdAoKLy8gVGhpcyBjb250cmFjdCBpcyBjb21wbGlhbnQgd2l0aCBhbmQvb3IgaW1wbGVtZW50cyB0aGUgZm9sbG93aW5nIEFSQ3M6IFsgQVJDNCBdCgovLyBUaGUgZm9sbG93aW5nIGxpbmVzIG9mIFRFQUwgYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0ZW1wbGF0ZSB2YXJpYWJsZXMgaW4gc2NyYXRjaCBzbG90cwpwdXNoYnl0ZXMgVE1QTF9uZmRSZWdpc3RyeUFwcElkCmJ0b2kKc3RvcmUgMjAwCgovLyBUaGUgZm9sbG93aW5nIHRlbiBsaW5lcyBvZiBURUFMIGhhbmRsZSBpbml0aWFsIHByb2dyYW0gZmxvdwovLyBUaGlzIHBhdHRlcm4gaXMgdXNlZCB0byBtYWtlIGl0IGVhc3kgZm9yIGFueW9uZSB0byBwYXJzZSB0aGUgc3RhcnQgb2YgdGhlIHByb2dyYW0gYW5kIGRldGVybWluZSBpZiBhIHNwZWNpZmljIGFjdGlvbiBpcyBhbGxvd2VkCi8vIEhlcmUsIGFjdGlvbiByZWZlcnMgdG8gdGhlIE9uQ29tcGxldGUgaW4gY29tYmluYXRpb24gd2l0aCB3aGV0aGVyIHRoZSBhcHAgaXMgYmVpbmcgY3JlYXRlZCBvciBjYWxsZWQKLy8gRXZlcnkgcG9zc2libGUgYWN0aW9uIGZvciB0aGlzIGNvbnRyYWN0IGlzIHJlcHJlc2VudGVkIGluIHRoZSBzd2l0Y2ggc3RhdGVtZW50Ci8vIElmIHRoZSBhY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIGluIHRoZSBjb250cmFjdCwgaXRzIHJlc3BlY3RpdmUgYnJhbmNoIHdpbGwgYmUgIipOT1RfSU1QTEVNRU5URUQiIHdoaWNoIGp1c3QgY29udGFpbnMgImVyciIKdHhuIEFwcGxpY2F0aW9uSUQKIQppbnQgNgoqCnR4biBPbkNvbXBsZXRpb24KKwpzd2l0Y2ggKmNhbGxfTm9PcCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKmNyZWF0ZV9Ob09wICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRAoKKk5PVF9JTVBMRU1FTlRFRDoKCS8vIFRoZSByZXF1ZXN0ZWQgYWN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIGNvbnRyYWN0LiBBcmUgeW91IHVzaW5nIHRoZSBjb3JyZWN0IE9uQ29tcGxldGU/IERpZCB5b3Ugc2V0IHlvdXIgYXBwIElEPwoJZXJyCgovLyBjcmVhdGVBcHBsaWNhdGlvbigpdm9pZAoqYWJpX3JvdXRlX2NyZWF0ZUFwcGxpY2F0aW9uOgoJLy8gZXhlY3V0ZSBjcmVhdGVBcHBsaWNhdGlvbigpdm9pZAoJY2FsbHN1YiBjcmVhdGVBcHBsaWNhdGlvbgoJaW50IDEKCXJldHVybgoKLy8gY3JlYXRlQXBwbGljYXRpb24oKTogdm9pZApjcmVhdGVBcHBsaWNhdGlvbjoKCXByb3RvIDAgMAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyCgkvLyB0aGlzLnN0YWtpbmdQb29sSW5pdGlhbGl6ZWQudmFsdWUgPSBmYWxzZQoJYnl0ZSAweDY5NmU2OTc0IC8vICJpbml0IgoJaW50IDAKCWJ5dGUgMHgwMAoJaW50IDAKCXVuY292ZXIgMgoJc2V0Yml0CglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgzCgkvLyB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgPSAwCglieXRlIDB4NmU3NTZkNTYgLy8gIm51bVYiCglpbnQgMAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NAoJLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlID0gMAoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJaW50IDAKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODUKCS8vIHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlID0gMAoJYnl0ZSAweDczNzQ2MTZiNjU2NCAvLyAic3Rha2VkIgoJaW50IDAKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIGluaXRTdGFraW5nQ29udHJhY3QodWludDY0KXZvaWQKKmFiaV9yb3V0ZV9pbml0U3Rha2luZ0NvbnRyYWN0OgoJLy8gYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBpbml0U3Rha2luZ0NvbnRyYWN0KHVpbnQ2NCl2b2lkCgljYWxsc3ViIGluaXRTdGFraW5nQ29udHJhY3QKCWludCAxCglyZXR1cm4KCi8vIGluaXRTdGFraW5nQ29udHJhY3QoYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0KTogdm9pZAppbml0U3Rha2luZ0NvbnRyYWN0OgoJcHJvdG8gMSAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTAKCS8vIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uY3JlYXRlKGFwcHJvdmFsUHJvZ3JhbVNpemUpCglieXRlIDB4NzA2ZjZmNmM1NDY1NmQ3MDZjNjE3NDY1NDE3MDcwNzI2Zjc2NjE2YzQyNzk3NDY1NzMgLy8gInBvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMiCglmcmFtZV9kaWcgLTEgLy8gYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0Cglib3hfY3JlYXRlCglwb3AKCXJldHN1YgoKLy8gbG9hZFN0YWtpbmdDb250cmFjdERhdGEodWludDY0LGJ5dGVbXSl2b2lkCiphYmlfcm91dGVfbG9hZFN0YWtpbmdDb250cmFjdERhdGE6CgkvLyBkYXRhOiBieXRlW10KCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWV4dHJhY3QgMiAwCgoJLy8gb2Zmc2V0OiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGxvYWRTdGFraW5nQ29udHJhY3REYXRhKHVpbnQ2NCxieXRlW10pdm9pZAoJY2FsbHN1YiBsb2FkU3Rha2luZ0NvbnRyYWN0RGF0YQoJaW50IDEKCXJldHVybgoKLy8gbG9hZFN0YWtpbmdDb250cmFjdERhdGEob2Zmc2V0OiB1aW50NjQsIGRhdGE6IGJ5dGVzKTogdm9pZApsb2FkU3Rha2luZ0NvbnRyYWN0RGF0YToKCXByb3RvIDIgMAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk0CgkvLyBhc3NlcnQoIXRoaXMuc3Rha2luZ1Bvb2xJbml0aWFsaXplZC52YWx1ZSkKCWJ5dGUgMHg2OTZlNjk3NCAvLyAiaW5pdCIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMAoJZ2V0Yml0CgkhCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5NQoJLy8gdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5yZXBsYWNlKG9mZnNldCwgZGF0YSkKCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWZyYW1lX2RpZyAtMSAvLyBvZmZzZXQ6IHVpbnQ2NAoJZnJhbWVfZGlnIC0yIC8vIGRhdGE6IGJ5dGVzCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdCgpdm9pZAoqYWJpX3JvdXRlX2ZpbmFsaXplU3Rha2luZ0NvbnRyYWN0OgoJLy8gZXhlY3V0ZSBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdCgpdm9pZAoJY2FsbHN1YiBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdAoJaW50IDEKCXJldHVybgoKLy8gZmluYWxpemVTdGFraW5nQ29udHJhY3QoKTogdm9pZApmaW5hbGl6ZVN0YWtpbmdDb250cmFjdDoKCXByb3RvIDAgMAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk5CgkvLyB0aGlzLnN0YWtpbmdQb29sSW5pdGlhbGl6ZWQudmFsdWUgPSB0cnVlCglieXRlIDB4Njk2ZTY5NzQgLy8gImluaXQiCglpbnQgMQoJYnl0ZSAweDAwCglpbnQgMAoJdW5jb3ZlciAyCglzZXRiaXQKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIGdhcygpdm9pZAoqYWJpX3JvdXRlX2dhczoKCS8vIGV4ZWN1dGUgZ2FzKCl2b2lkCgljYWxsc3ViIGdhcwoJaW50IDEKCXJldHVybgoKLy8gZ2FzKCk6IHZvaWQKLy8KLy8gZ2FzIGlzIGEgZHVtbXkgbm8tb3AgY2FsbCB0aGF0IGNhbiBiZSB1c2VkIHRvIHBvb2wtdXAgcmVzb3VyY2UgcmVmZXJlbmNlcyBhbmQgb3Bjb2RlIGNvc3QKZ2FzOgoJcHJvdG8gMCAwCglyZXRzdWIKCi8vIGdldE1ickFtb3VudHMoKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0TWJyQW1vdW50czoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXRNYnJBbW91bnRzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0TWJyQW1vdW50cygpOiBNYnJBbW91bnRzCi8vCi8vIFJldHVybnMgdGhlIE1CUiBhbW91bnRzIG5lZWRlZCBmb3IgdmFyaW91cyBhY3Rpb25zOgovLyBbCi8vIGFkZFZhbGlkYXRvck1icjogdWludDY0IC0gbWJyIG5lZWRlZCB0byBhZGQgYSBuZXcgdmFsaWRhdG9yIC0gcGFpZCB0byB2YWxpZGF0b3IgY29udHJhY3QKLy8gYWRkUG9vbE1icjogdWludDY0IC0gbWJyIG5lZWRlZCB0byBhZGQgYSBuZXcgcG9vbCAtIHBhaWQgdG8gdmFsaWRhdG9yCi8vIHBvb2xJbml0TWJyOiB1aW50NjQgLSBtYnIgbmVlZGVkIHRvIGluaXRTdG9yYWdlKCkgb2YgcG9vbCAtIHBhaWQgdG8gcG9vbCBpdHNlbGYKLy8gYWRkU3Rha2VyTWJyOiB1aW50NjQgLSBtYnIgc3Rha2VyIG5lZWRzIHRvIGFkZCB0byBmaXJzdCBzdGFraW5nIHBheW1lbnQgKHN0YXlzIHcvIHZhbGlkYXRvcikKLy8gXQpnZXRNYnJBbW91bnRzOgoJcHJvdG8gMCAxCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5CgkvLyByZXR1cm4gewoJLy8gICAgICAgICAgICAgYWRkVmFsaWRhdG9yTWJyOiB0aGlzLmNvc3RGb3JCb3hTdG9yYWdlKDEgLyogdiBwcmVmaXggKi8gKyBsZW48VmFsaWRhdG9ySWRUeXBlPigpICsgbGVuPFZhbGlkYXRvckluZm8+KCkpLAoJLy8gICAgICAgICAgICAgYWRkUG9vbE1icjogdGhpcy5taW5CYWxhbmNlRm9yQWNjb3VudCgKCS8vICAgICAgICAgICAgICAgICAxLAoJLy8gICAgICAgICAgICAgICAgIC8vIHdlIGNvdWxkIGNhbGN1bGF0ZSB0aGlzIGRpcmVjdGx5IGJ5IHJlZmVyZW5jaW5nIHRoZSBzaXplIG9mIHN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtIGJ1dCBpdCB3b3VsZAoJLy8gICAgICAgICAgICAgICAgIC8vIG1lYW4gb3VyIGNhbGxlcnMgd291bGQgaGF2ZSB0byByZWZlcmVuY2UgdGhlIGJveCBBTkQgYnV5IHVwIGkvbyAtIHNvIGp1c3QgZ28gbWF4IG9uIGV4dHJhIHBhZ2VzCgkvLyAgICAgICAgICAgICAgICAgMywKCS8vICAgICAgICAgICAgICAgICAwLAoJLy8gICAgICAgICAgICAgICAgIDAsCgkvLyAgICAgICAgICAgICAgICAgMCwKCS8vICAgICAgICAgICAgICAgICBTdGFraW5nUG9vbC5zY2hlbWEuZ2xvYmFsLm51bVVpbnQsCgkvLyAgICAgICAgICAgICAgICAgU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1CeXRlU2xpY2UsCgkvLyAgICAgICAgICAgICApLAoJLy8gICAgICAgICAgICAgcG9vbEluaXRNYnI6CgkvLyAgICAgICAgICAgICAgICAgQUxHT1JBTkRfQUNDT1VOVF9NSU5fQkFMQU5DRSArCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5jb3N0Rm9yQm94U3RvcmFnZSg3IC8qICdzdGFrZXJzJyBuYW1lICovICsgbGVuPFN0YWtlZEluZm8+KCkgKiBNQVhfU1RBS0VSU19QRVJfUE9PTCksCgkvLyAgICAgICAgICAgICBhZGRTdGFrZXJNYnI6CgkvLyAgICAgICAgICAgICAgICAgLy8gaG93IG11Y2ggdG8gY2hhcmdlIGZvciBmaXJzdCB0aW1lIGEgc3Rha2VyIGFkZHMgc3Rha2UgLSBzaW5jZSB3ZSBhZGQgYSB0cmFja2luZyBib3ggcGVyIHN0YWtlcgoJLy8gICAgICAgICAgICAgICAgIHRoaXMuY29zdEZvckJveFN0b3JhZ2UoCgkvLyAgICAgICAgICAgICAgICAgICAgIDMgLyogJ3NwcycgcHJlZml4ICovICsgbGVuPEFkZHJlc3M+KCkgKyBsZW48VmFsaWRhdG9yUG9vbEtleT4oKSAqIE1BWF9QT09MU19QRVJfU1RBS0VSLAoJLy8gICAgICAgICAgICAgICAgICksIC8vIHNpemUgb2Yga2V5ICsgYWxsIHZhbHVlcwoJLy8gICAgICAgICB9CglpbnQgMTEwMQoJY2FsbHN1YiBjb3N0Rm9yQm94U3RvcmFnZQoJaXRvYgoJaW50IDMKCWludCAxMQoJaW50IDAKCWR1cG4gMgoJaW50IDMKCWludCAxCgljYWxsc3ViIG1pbkJhbGFuY2VGb3JBY2NvdW50CglpdG9iCgljb25jYXQKCWludCAxMDAwMDAKCWludCAxMjgwNwoJY2FsbHN1YiBjb3N0Rm9yQm94U3RvcmFnZQoJKwoJaXRvYgoJY29uY2F0CglpbnQgMTc5CgljYWxsc3ViIGNvc3RGb3JCb3hTdG9yYWdlCglpdG9iCgljb25jYXQKCXJldHN1YgoKLy8gZ2V0UHJvdG9jb2xDb25zdHJhaW50cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0UHJvdG9jb2xDb25zdHJhaW50czoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXRQcm90b2NvbENvbnN0cmFpbnRzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWNhbGxzdWIgZ2V0UHJvdG9jb2xDb25zdHJhaW50cwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFByb3RvY29sQ29uc3RyYWludHMoKTogQ29uc3RyYWludHMKLy8KLy8gUmV0dXJucyB0aGUgcHJvdG9jb2wgY29uc3RyYWludHMgc28gdGhhdCBVSXMgY2FuIGxpbWl0IHdoYXQgdXNlcnMgc3BlY2lmeSBmb3IgdmFsaWRhdG9yIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KZ2V0UHJvdG9jb2xDb25zdHJhaW50czoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0NwoJLy8gcmV0dXJuIHsKCS8vICAgICAgICAgICAgIGVwb2NoUGF5b3V0Um91bmRzTWluOiBNSU5fRVBPQ0hfTEVOR1RILAoJLy8gICAgICAgICAgICAgZXBvY2hQYXlvdXRSb3VuZHNNYXg6IE1BWF9FUE9DSF9MRU5HVEgsCgkvLyAgICAgICAgICAgICBtaW5QY3RUb1ZhbGlkYXRvcldGb3VyRGVjaW1hbHM6IE1JTl9QQ1RfVE9fVkFMSURBVE9SLAoJLy8gICAgICAgICAgICAgbWF4UGN0VG9WYWxpZGF0b3JXRm91ckRlY2ltYWxzOiBNQVhfUENUX1RPX1ZBTElEQVRPUiwKCS8vICAgICAgICAgICAgIG1pbkVudHJ5U3Rha2U6IE1JTl9BTEdPX1NUQUtFX1BFUl9QT09MLAoJLy8gICAgICAgICAgICAgbWF4QWxnb1BlclBvb2w6IHRoaXMubWF4QWxnb0FsbG93ZWRQZXJQb29sKCksCgkvLyAgICAgICAgICAgICBtYXhBbGdvUGVyVmFsaWRhdG9yOiB0aGlzLm1heEFsbG93ZWRTdGFrZSgpLAoJLy8gICAgICAgICAgICAgYW10Q29uc2lkZXJlZFNhdHVyYXRlZDogdGhpcy5hbGdvU2F0dXJhdGlvbkxldmVsKCksCgkvLyAgICAgICAgICAgICBtYXhOb2RlczogTUFYX05PREVTLAoJLy8gICAgICAgICAgICAgbWF4UG9vbHNQZXJOb2RlOiBNQVhfUE9PTFNfUEVSX05PREUsCgkvLyAgICAgICAgICAgICBtYXhTdGFrZXJzUGVyUG9vbDogTUFYX1NUQUtFUlNfUEVSX1BPT0wsCgkvLyAgICAgICAgIH0KCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDBmNDI0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGY0MjQwMDAwMDAwMDAwMDBmNDI0MAoJY2FsbHN1YiBtYXhBbGdvQWxsb3dlZFBlclBvb2wKCWl0b2IKCWNvbmNhdAoJY2FsbHN1YiBtYXhBbGxvd2VkU3Rha2UKCWl0b2IKCWNvbmNhdAoJY2FsbHN1YiBhbGdvU2F0dXJhdGlvbkxldmVsCglpdG9iCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDA4Cgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAzCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMGM4Cgljb25jYXQKCXJldHN1YgoKLy8gZ2V0TnVtVmFsaWRhdG9ycygpdWludDY0CiphYmlfcm91dGVfZ2V0TnVtVmFsaWRhdG9yczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXROdW1WYWxpZGF0b3JzKCl1aW50NjQKCWNhbGxzdWIgZ2V0TnVtVmFsaWRhdG9ycwoJaXRvYgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldE51bVZhbGlkYXRvcnMoKTogdWludDY0Ci8vCi8vIFJldHVybnMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHZhbGlkYXRvcnMKZ2V0TnVtVmFsaWRhdG9yczoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE2NwoJLy8gcmV0dXJuIHRoaXMubnVtVmFsaWRhdG9ycy52YWx1ZQoJYnl0ZSAweDZlNzU2ZDU2IC8vICJudW1WIgoJYXBwX2dsb2JhbF9nZXQKCXJldHN1YgoKLy8gZ2V0VmFsaWRhdG9yQ29uZmlnKHVpbnQ2NCkodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKKmFiaV9yb3V0ZV9nZXRWYWxpZGF0b3JDb25maWc6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFZhbGlkYXRvckNvbmZpZyh1aW50NjQpKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCgljYWxsc3ViIGdldFZhbGlkYXRvckNvbmZpZwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvckNvbmZpZyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogVmFsaWRhdG9yQ29uZmlnCmdldFZhbGlkYXRvckNvbmZpZzoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE3MgoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnCglpbnQgMAoJaW50IDI0MgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCXJldHN1YgoKLy8gZ2V0VmFsaWRhdG9yU3RhdGUodWludDY0KSh1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0VmFsaWRhdG9yU3RhdGU6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFZhbGlkYXRvclN0YXRlKHVpbnQ2NCkodWludDE2LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBnZXRWYWxpZGF0b3JTdGF0ZQoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvclN0YXRlKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBWYWxpZGF0b3JDdXJTdGF0ZQpnZXRWYWxpZGF0b3JTdGF0ZToKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE3NwoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUKCWludCAyNDIgLy8gaGVhZE9mZnNldAoJaW50IDI2CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpCiphYmlfcm91dGVfZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpCgljYWxsc3ViIGdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcih2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogW0FkZHJlc3MsIEFkZHJlc3NdCmdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcjoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE4MgoJLy8gcmV0dXJuIFsKCS8vICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLAoJLy8gICAgICAgICAgICAgdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWFuYWdlciwKCS8vICAgICAgICAgXQoJaW50IDgKCWludCAzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWludCA0MAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJY29uY2F0CglyZXRzdWIKCi8vIGdldFBvb2xzKHVpbnQ2NCkodWludDY0LHVpbnQxNix1aW50NjQpW10KKmFiaV9yb3V0ZV9nZXRQb29sczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0UG9vbHModWludDY0KSh1aW50NjQsdWludDE2LHVpbnQ2NClbXQoJY2FsbHN1YiBnZXRQb29scwoJZHVwCglsZW4KCWludCAxOAoJLwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFBvb2xzKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBQb29sSW5mb1tdCi8vCi8vIFJldHVybiBsaXN0IG9mIGFsbCBwb29scyBmb3IgdGhpcyB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWxpZGF0b3JJZAovLyBAcmV0dXJuIHtQb29sSW5mb1tdfSAtIGFycmF5IG9mIHBvb2xzCi8vIE5vdCBjYWxsYWJsZSBmcm9tIG90aGVyIGNvbnRyYWN0cyBiZWNhdXNlID4xSyByZXR1cm4gYnV0IGNhbiBiZSBjYWxsZWQgdy8gc2ltdWxhdGUgd2hpY2ggYnVtcHMgbG9nIHJldHVybnMKZ2V0UG9vbHM6Cglwcm90byAxIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiAyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk2CgkvLyByZXREYXRhOiBQb29sSW5mb1tdID0gW10KCWJ5dGUgMHgKCWZyYW1lX2J1cnkgMCAvLyByZXREYXRhOiBQb29sSW5mb1tdCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk3CgkvLyBwb29sU2V0ID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29scykKCWludCAyNjggLy8gaGVhZE9mZnNldAoJaW50IDQzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWZyYW1lX2J1cnkgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE5OAoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBwb29sU2V0Lmxlbmd0aDsgaSArPSAxKQoJaW50IDAKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCipmb3JfMDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE5OAoJLy8gaSA8IHBvb2xTZXQubGVuZ3RoCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCAyNAoJPAoJYnogKmZvcl8wX2VuZAoKCS8vICppZjBfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxOTkKCS8vIHBvb2xTZXRbaV0ucG9vbEFwcElkID09PSAwCglmcmFtZV9kaWcgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWYwX2VuZAoKCS8vICppZjBfY29uc2VxdWVudAoJYiAqZm9yXzBfZW5kCgoqaWYwX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIwMwoJLy8gcmV0RGF0YS5wdXNoKHBvb2xTZXRbaV0pCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBQb29sSW5mb1tdCglmcmFtZV9kaWcgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDE4CglleHRyYWN0MwoJY29uY2F0CglmcmFtZV9idXJ5IDAgLy8gcmV0RGF0YTogUG9vbEluZm9bXQoKKmZvcl8wX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk4CgkvLyBpICs9IDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCWIgKmZvcl8wCgoqZm9yXzBfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjA1CgkvLyByZXR1cm4gcmV0RGF0YQoJZnJhbWVfZGlnIDAgLy8gcmV0RGF0YTogUG9vbEluZm9bXQoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDIKCXJldHN1YgoKLy8gZ2V0UG9vbEFwcElkKHVpbnQ2NCx1aW50NjQpdWludDY0CiphYmlfcm91dGVfZ2V0UG9vbEFwcElkOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBwb29sSWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJYnRvaQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFBvb2xBcHBJZCh1aW50NjQsdWludDY0KXVpbnQ2NAoJY2FsbHN1YiBnZXRQb29sQXBwSWQKCWl0b2IKCWNvbmNhdAoJbG9nCglpbnQgMQoJcmV0dXJuCgovLyBnZXRQb29sQXBwSWQodmFsaWRhdG9ySWQ6IHVpbnQ2NCwgcG9vbElkOiB1aW50NjQpOiB1aW50NjQKZ2V0UG9vbEFwcElkOgoJcHJvdG8gMiAxCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjEzCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBwb29sSWQgIT09IDAgJiYgcG9vbElkIDw9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHMubGVuZ3RoLAoJLy8gICAgICAgICAgICAgJ3Bvb2wgaWQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIG51bWJlciBvZiBwb29scyBmb3IgdGhpcyB2YWxpZGF0b3InLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTIgLy8gcG9vbElkOiB1aW50NjQKCWludCAwCgkhPQoJZHVwCglieiAqc2tpcF9hbmQwCglmcmFtZV9kaWcgLTIgLy8gcG9vbElkOiB1aW50NjQKCWludCAyNAoJPD0KCSYmCgoqc2tpcF9hbmQwOgoJLy8gcG9vbCBpZCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgbnVtYmVyIG9mIHBvb2xzIGZvciB0aGlzIHZhbGlkYXRvcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjE3CgkvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1twb29sSWQgLSAxXS5wb29sQXBwSWQKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0yIC8vIHBvb2xJZDogdWludDY0CglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCXJldHN1YgoKLy8gZ2V0UG9vbEluZm8oKHVpbnQ2NCx1aW50NjQsdWludDY0KSkodWludDY0LHVpbnQxNix1aW50NjQpCiphYmlfcm91dGVfZ2V0UG9vbEluZm86CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHBvb2xLZXk6ICh1aW50NjQsdWludDY0LHVpbnQ2NCkKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWR1cAoJbGVuCglpbnQgMjQKCT09CgoJLy8gYXJndW1lbnQgMCAocG9vbEtleSkgZm9yIGdldFBvb2xJbmZvIG11c3QgYmUgYSAodWludDY0LHVpbnQ2NCx1aW50NjQpCglhc3NlcnQKCgkvLyBleGVjdXRlIGdldFBvb2xJbmZvKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpKHVpbnQ2NCx1aW50MTYsdWludDY0KQoJY2FsbHN1YiBnZXRQb29sSW5mbwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFBvb2xJbmZvKHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkpOiBQb29sSW5mbwpnZXRQb29sSW5mbzoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIyMgoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRDdXJNYXhTdGFrZVBlclBvb2wodWludDY0KXVpbnQ2NAoqYWJpX3JvdXRlX2dldEN1ck1heFN0YWtlUGVyUG9vbDoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHVpbnQ2NCl1aW50NjQKCWNhbGxzdWIgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sCglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiB1aW50NjQKLy8KLy8gQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIHN0YWtlIHBlciBwb29sIGZvciBhIGdpdmVuIHZhbGlkYXRvci4KLy8gTm9ybWFsbHkgdGhpcyB3b3VsZCBiZSBtYXhBbGdvUGVyUG9vbCwgYnV0IGl0IHNob3VsZCBhbHNvIG5ldmVyIGdvIGFib3ZlIE1heEFsbG93ZWRTdGFrZSAvIG51bVBvb2xzIHNvCi8vIGFzIHBvb2xzIGFyZSBhZGRlZCB0aGUgbWF4IGFsbG93ZWQgcGVyIHBvb2wgY2FuIHJlZHVjZS4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCmdldEN1ck1heFN0YWtlUGVyUG9vbDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzMKCS8vIG51bVBvb2xzID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyBhcyB1aW50NjQKCWludCAyNDIKCWludCAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIG51bVBvb2xzOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzQKCS8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzID0gdGhpcy5tYXhBbGxvd2VkU3Rha2UoKSAvIG51bVBvb2xzCgljYWxsc3ViIG1heEFsbG93ZWRTdGFrZQoJZnJhbWVfZGlnIDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoJLwoJZnJhbWVfYnVyeSAxIC8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzUKCS8vIG1heFBlclBvb2w6IHVpbnQ2NCA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1heEFsZ29QZXJQb29sCglpbnQgMjE3CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCgkvLyAqaWYxX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjM2CgkvLyBtYXhQZXJQb29sID09PSAwCglmcmFtZV9kaWcgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCWludCAwCgk9PQoJYnogKmlmMV9lbmQKCgkvLyAqaWYxX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIzNwoJLy8gbWF4UGVyUG9vbCA9IHRoaXMubWF4QWxnb0FsbG93ZWRQZXJQb29sKCkKCWNhbGxzdWIgbWF4QWxnb0FsbG93ZWRQZXJQb29sCglmcmFtZV9idXJ5IDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoqaWYxX2VuZDoKCS8vICppZjJfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzkKCS8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzIDwgbWF4UGVyUG9vbAoJZnJhbWVfZGlnIDEgLy8gaGFyZE1heERpdmlkZWRCZXR3ZWVuUG9vbHM6IHVpbnQ2NAoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8CglieiAqaWYyX2VuZAoKCS8vICppZjJfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjQwCgkvLyBtYXhQZXJQb29sID0gaGFyZE1heERpdmlkZWRCZXR3ZWVuUG9vbHMKCWZyYW1lX2RpZyAxIC8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzOiB1aW50NjQKCWZyYW1lX2J1cnkgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCippZjJfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjQyCgkvLyByZXR1cm4gbWF4UGVyUG9vbAoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCgoJLy8gcG9wIGFsbCBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUgc3RhY2sKCXBvcG4gMgoJcmV0c3ViCgovLyBkb2VzU3Rha2VyTmVlZFRvUGF5TUJSKGFkZHJlc3MpYm9vbAoqYWJpX3JvdXRlX2RvZXNTdGFrZXJOZWVkVG9QYXlNQlI6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHN0YWtlcjogYWRkcmVzcwoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZHVwCglsZW4KCWludCAzMgoJPT0KCgkvLyBhcmd1bWVudCAwIChzdGFrZXIpIGZvciBkb2VzU3Rha2VyTmVlZFRvUGF5TUJSIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBleGVjdXRlIGRvZXNTdGFrZXJOZWVkVG9QYXlNQlIoYWRkcmVzcylib29sCgljYWxsc3ViIGRvZXNTdGFrZXJOZWVkVG9QYXlNQlIKCWJ5dGUgMHgwMAoJaW50IDAKCXVuY292ZXIgMgoJc2V0Yml0Cgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZG9lc1N0YWtlck5lZWRUb1BheU1CUihzdGFrZXI6IEFkZHJlc3MpOiBib29sZWFuCi8vCi8vIEhlbHBlciBjYWxsZXJzIGNhbiBjYWxsIHcvIHNpbXVsYXRlIHRvIGRldGVybWluZSBpZiAnQWRkU3Rha2VyJyBNQlIgc2hvdWxkIGJlIGluY2x1ZGVkIHcvIHN0YWtpbmcgYW1vdW50Ci8vIEBwYXJhbSBzdGFrZXIKZG9lc1N0YWtlck5lZWRUb1BheU1CUjoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI1MQoJLy8gcmV0dXJuICF0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS5leGlzdHMKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZXI6IEFkZHJlc3MKCWNvbmNhdAoJYm94X2xlbgoJc3dhcAoJcG9wCgkhCglyZXRzdWIKCi8vIGdldFN0YWtlZFBvb2xzRm9yQWNjb3VudChhZGRyZXNzKSh1aW50NjQsdWludDY0LHVpbnQ2NClbXQoqYWJpX3JvdXRlX2dldFN0YWtlZFBvb2xzRm9yQWNjb3VudDoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gc3Rha2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKHN0YWtlcikgZm9yIGdldFN0YWtlZFBvb2xzRm9yQWNjb3VudCBtdXN0IGJlIGEgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBnZXRTdGFrZWRQb29sc0ZvckFjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCx1aW50NjQpW10KCWNhbGxzdWIgZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50CglkdXAKCWxlbgoJaW50IDI0CgkvCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0Cgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50KHN0YWtlcjogQWRkcmVzcyk6IFZhbGlkYXRvclBvb2xLZXlbXQovLwovLyBSZXRyaWV2ZXMgdGhlIHN0YWtlZCBwb29scyBmb3IgYW4gYWNjb3VudC4KLy8KLy8gQHBhcmFtIHtBZGRyZXNzfSBzdGFrZXIgLSBUaGUgYWNjb3VudCB0byByZXRyaWV2ZSBzdGFrZWQgcG9vbHMgZm9yLgovLyBAcmV0dXJuIHtWYWxpZGF0b3JQb29sS2V5W119IC0gVGhlIGFycmF5IG9mIHN0YWtlZCBwb29scyBmb3IgdGhlIGFjY291bnQuCmdldFN0YWtlZFBvb2xzRm9yQWNjb3VudDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyAqaWYzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjYxCgkvLyAhdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikuZXhpc3RzCglieXRlIDB4NzM3MDczIC8vICJzcHMiCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoJIQoJYnogKmlmM19lbmQKCgkvLyAqaWYzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2MgoJLy8gcmV0dXJuIFtdCglieXRlIDB4CgliICpnZXRTdGFrZWRQb29sc0ZvckFjY291bnQqcmV0dXJuCgoqaWYzX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2NAoJLy8gcmV0RGF0YTogVmFsaWRhdG9yUG9vbEtleVtdID0gW10KCWJ5dGUgMHgKCWZyYW1lX2J1cnkgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjUKCS8vIHBvb2xTZXQgPSBjbG9uZSh0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZSkKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZXI6IEFkZHJlc3MKCWNvbmNhdAoJYm94X2dldAoKCS8vIGJveCB2YWx1ZSBkb2VzIG5vdCBleGlzdDogdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUKCWFzc2VydAoJZnJhbWVfYnVyeSAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjYKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgcG9vbFNldC5sZW5ndGg7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzE6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjYKCS8vIGkgPCBwb29sU2V0Lmxlbmd0aAoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl8xX2VuZAoKCS8vICppZjRfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjcKCS8vIHBvb2xTZXRbaV0uaWQgIT09IDAKCWZyYW1lX2RpZyAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgkhPQoJYnogKmlmNF9lbmQKCgkvLyAqaWY0X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2OAoJLy8gcmV0RGF0YS5wdXNoKHBvb2xTZXRbaV0pCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCWZyYW1lX2RpZyAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWNvbmNhdAoJZnJhbWVfYnVyeSAwIC8vIHJldERhdGE6IFZhbGlkYXRvclBvb2xLZXlbXQoKKmlmNF9lbmQ6CgoqZm9yXzFfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjYKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzEKCipmb3JfMV9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzEKCS8vIHJldHVybiByZXREYXRhCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCipnZXRTdGFrZWRQb29sc0ZvckFjY291bnQqcmV0dXJuOgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCgoJLy8gcG9wIGFsbCBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUgc3RhY2sKCXBvcG4gMgoJcmV0c3ViCgovLyBnZXRUb2tlblBheW91dFJhdGlvKHVpbnQ2NCkodWludDY0WzI0XSx1aW50NjQpCiphYmlfcm91dGVfZ2V0VG9rZW5QYXlvdXRSYXRpbzoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KQoJY2FsbHN1YiBnZXRUb2tlblBheW91dFJhdGlvCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0VG9rZW5QYXlvdXRSYXRpbyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogUG9vbFRva2VuUGF5b3V0UmF0aW8KLy8KLy8gUmV0cmlldmVzIHRoZSB0b2tlbiBwYXlvdXQgcmF0aW8gZm9yIGEgZ2l2ZW4gdmFsaWRhdG9yIC0gcmV0dXJuaW5nIHRoZSBwb29sIHJhdGlvcyBvZiB3aG9sZSBzbyB0aGF0IHRva2VuCi8vIHBheW91dHMgYWNyb3NzIHBvb2xzIGNhbiBiZSBiYXNlZCBvbiBhIHN0YWJsZSBzbmFwaG9zdCBvZiBzdGFrZS4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEByZXR1cm4ge1Bvb2xUb2tlblBheW91dFJhdGlvfSAtIFRoZSB0b2tlbiBwYXlvdXQgcmF0aW8gZm9yIHRoZSB2YWxpZGF0b3IuCmdldFRva2VuUGF5b3V0UmF0aW86Cglwcm90byAxIDEKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyODMKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCXJldHN1YgoKLy8gZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cyh1aW50NjQpKCh1aW50NjRbM10pWzhdKQoqYWJpX3JvdXRlX2dldE5vZGVQb29sQXNzaWdubWVudHM6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldE5vZGVQb29sQXNzaWdubWVudHModWludDY0KSgodWludDY0WzNdKVs4XSkKCWNhbGxzdWIgZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldE5vZGVQb29sQXNzaWdubWVudHModmFsaWRhdG9ySWQ6IHVpbnQ2NCk6IE5vZGVQb29sQXNzaWdubWVudENvbmZpZwpnZXROb2RlUG9vbEFzc2lnbm1lbnRzOgoJcHJvdG8gMSAxCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mjg4CgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS5leGlzdHMsICJ0aGUgc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBkb2Vzbid0IGV4aXN0IikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoKCS8vIHRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGRvZXNuJ3QgZXhpc3QKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI5MAoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUubm9kZVBvb2xBc3NpZ25tZW50cwoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRORkRSZWdpc3RyeUlEKCl1aW50NjQKKmFiaV9yb3V0ZV9nZXRORkRSZWdpc3RyeUlEOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBleGVjdXRlIGdldE5GRFJlZ2lzdHJ5SUQoKXVpbnQ2NAoJY2FsbHN1YiBnZXRORkRSZWdpc3RyeUlECglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0TkZEUmVnaXN0cnlJRCgpOiB1aW50NjQKZ2V0TkZEUmVnaXN0cnlJRDoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI5NAoJLy8gcmV0dXJuIHRoaXMubmZkUmVnaXN0cnlBcHBJZAoJbG9hZCAyMDAgLy8gVE1QTF9uZmRSZWdpc3RyeUFwcElkCglyZXRzdWIKCi8vIGFkZFZhbGlkYXRvcihwYXksc3RyaW5nLCh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KSl1aW50NjQKKmFiaV9yb3V0ZV9hZGRWYWxpZGF0b3I6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIGNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDI0MgoJPT0KCgkvLyBhcmd1bWVudCAwIChjb25maWcpIGZvciBhZGRWYWxpZGF0b3IgbXVzdCBiZSBhICh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KQoJYXNzZXJ0CgoJLy8gbmZkTmFtZTogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglleHRyYWN0IDIgMAoKCS8vIG1iclBheW1lbnQ6IHBheQoJdHhuIEdyb3VwSW5kZXgKCWludCAxCgktCglkdXAKCWd0eG5zIFR5cGVFbnVtCglpbnQgcGF5Cgk9PQoKCS8vIGFyZ3VtZW50IDIgKG1iclBheW1lbnQpIGZvciBhZGRWYWxpZGF0b3IgbXVzdCBiZSBhIHBheSB0cmFuc2FjdGlvbgoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBhZGRWYWxpZGF0b3IocGF5LHN0cmluZywodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkpdWludDY0CgljYWxsc3ViIGFkZFZhbGlkYXRvcgoJaXRvYgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFZhbGlkYXRvcihtYnJQYXltZW50OiBQYXlUeG4sIG5mZE5hbWU6IHN0cmluZywgY29uZmlnOiBWYWxpZGF0b3JDb25maWcpOiB1aW50NjQKLy8KLy8gQWRkcyBhIG5ldyB2YWxpZGF0b3IKLy8gUmVxdWlyZXMgYXQgbGVhc3QgMTAgQUxHTyBhcyB0aGUgJ2ZlZScgZm9yIHRoZSB0cmFuc2FjdGlvbiB0byBoZWxwIGRpc3N1YWRlIHNwYW1tZWQgdmFsaWRhdG9yIGFkZHMuCi8vCi8vIEBwYXJhbSB7UGF5VHhufSBtYnJQYXltZW50IHBheW1lbnQgZnJvbSBjYWxsZXIgd2hpY2ggY292ZXJzIG1iciBpbmNyZWFzZSBvZiBuZXcgdmFsaWRhdG9yIHN0b3JhZ2UKLy8gQHBhcmFtIHtzdHJpbmd9IG5mZE5hbWUgKE9wdGlvbmFsKSBOYW1lIG9mIG5mZCAodXNlZCBhcyBkb3VibGUtY2hlY2sgYWdhaW5zdCBpZCBzcGVjaWZpZWQgaW4gY29uZmlnKQovLyBAcGFyYW0ge1ZhbGlkYXRvckNvbmZpZ30gY29uZmlnIFZhbGlkYXRvckNvbmZpZyBzdHJ1Y3QKLy8gQHJldHVybnMge3VpbnQ2NH0gdmFsaWRhdG9yIGlkCmFkZFZhbGlkYXRvcjoKCXByb3RvIDMgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzA2CgkvLyB0aGlzLnZhbGlkYXRlQ29uZmlnKGNvbmZpZykKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJY2FsbHN1YiB2YWxpZGF0ZUNvbmZpZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMwOAoJLy8gdmVyaWZ5UGF5VHhuKG1iclBheW1lbnQsIHsgcmVjZWl2ZXI6IHRoaXMuYXBwLmFkZHJlc3MsIGFtb3VudDogdGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkVmFsaWRhdG9yTWJyIH0pCgkvLyB2ZXJpZnkgcmVjZWl2ZXIKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIFJlY2VpdmVyCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6InJlY2VpdmVyIiwiZXhwZWN0ZWQiOiJ0aGlzLmFwcC5hZGRyZXNzIn0KCWFzc2VydAoKCS8vIHZlcmlmeSBhbW91bnQKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCglleHRyYWN0IDAgOAoJYnRvaQoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6ImFtb3VudCIsImV4cGVjdGVkIjoidGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkVmFsaWRhdG9yTWJyIn0KCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxMAoJLy8gYXNzZXJ0KG1iclBheW1lbnQuZmVlID4gMTAgKiAxMDAwMDAwLCAnZmVlIG11c3QgYmUgMTAgQUxHTyBvciBtb3JlIHRvIHByZXZlbnQgc3BhbW1pbmcgb2YgdmFsaWRhdG9ycycpCglmcmFtZV9kaWcgLTEgLy8gbWJyUGF5bWVudDogUGF5VHhuCglndHhucyBGZWUKCWludCAxMDAwMDAwMAoJPgoKCS8vIGZlZSBtdXN0IGJlIDEwIEFMR08gb3IgbW9yZSB0byBwcmV2ZW50IHNwYW1taW5nIG9mIHZhbGlkYXRvcnMKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxMwoJLy8gdmFsaWRhdG9ySWQgPSB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgKyAxCglieXRlIDB4NmU3NTZkNTYgLy8gIm51bVYiCglhcHBfZ2xvYmFsX2dldAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzE0CgkvLyB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgPSB2YWxpZGF0b3JJZAoJYnl0ZSAweDZlNzU2ZDU2IC8vICJudW1WIgoJZnJhbWVfZGlnIDAgLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMTYKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkuY3JlYXRlKCkKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJaW50IDEwOTIKCWJveF9jcmVhdGUKCXBvcAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxNwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcgPSBjb25maWcKCWludCAwCglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMTgKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLmlkID0gdmFsaWRhdG9ySWQKCWludCAwCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gKmlmNV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMyMQoJLy8gY29uZmlnLm5mZEZvckluZm8gIT09IDAKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA3MiA4CglidG9pCglpbnQgMAoJIT0KCWJ6ICppZjVfZW5kCgoJLy8gKmlmNV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMjMKCS8vIGFzc2VydCh0aGlzLmlzTkZEQXBwSURWYWxpZChjb25maWcubmZkRm9ySW5mbyksICdwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZCcpCglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgNzIgOAoJYnRvaQoJY2FsbHN1YiBpc05GREFwcElEVmFsaWQKCgkvLyBwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzI1CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgdGhpcy50eG4uc2VuZGVyID09PSAoQXBwSUQuZnJvbVVpbnQ2NChjb25maWcubmZkRm9ySW5mbykuZ2xvYmFsU3RhdGUoJ2kub3duZXIuYScpIGFzIEFkZHJlc3MpLAoJLy8gICAgICAgICAgICAgICAgICdJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXInLAoJLy8gICAgICAgICAgICAgKQoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIC0zIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDcyIDgKCWJ0b2kKCWJ5dGUgMHg2OTJlNmY3NzZlNjU3MjJlNjEgLy8gImkub3duZXIuYSIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KGNvbmZpZy5uZmRGb3JJbmZvKS5nbG9iYWxTdGF0ZSgnaS5vd25lci5hJykKCWFzc2VydAoJPT0KCgkvLyBJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXIKCWFzc2VydAoKKmlmNV9lbmQ6CgkvLyAqaWY2X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzMxCgkvLyBjb25maWcuZW50cnlHYXRpbmdUeXBlID09PSBHQVRJTkdfVFlQRV9DUkVBVEVEX0JZX05GRF9BRERSRVNTRVMgfHwKCS8vICAgICAgICAgICAgIGNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX1NFR01FTlRfT0ZfTkZECglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgODAgMQoJYnRvaQoJaW50IDMKCT09CglkdXAKCWJueiAqc2tpcF9vcjAKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4MCAxCglidG9pCglpbnQgNAoJPT0KCXx8Cgoqc2tpcF9vcjA6CglieiAqaWY2X2VuZAoKCS8vICppZjZfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzM1CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5pc05GREFwcElEVmFsaWQoY29uZmlnLmVudHJ5R2F0aW5nQXNzZXRzWzBdKSwKCS8vICAgICAgICAgICAgICAgICAncHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZEJywKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAxMTMgOAoJYnRvaQoJY2FsbHN1YiBpc05GREFwcElEVmFsaWQKCgkvLyBwcm92aWRlZCBORkQgQXBwIGlkIGZvciBnYXRpbmcgbXVzdCBiZSB2YWxpZCBORkQKCWFzc2VydAoKKmlmNl9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNDAKCS8vIHRoaXMucmV0aU9QX2FkZGVkVmFsaWRhdG9yLmxvZyh7IGlkOiB2YWxpZGF0b3JJZCwgb3duZXI6IGNvbmZpZy5vd25lciwgbWFuYWdlcjogY29uZmlnLm1hbmFnZXIgfSkKCWJ5dGUgMHhhOGRkMjFjYiAvLyByZXRpT1BfYWRkZWRWYWxpZGF0b3IodWludDY0LGFkZHJlc3MsYWRkcmVzcykKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4IDMyCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA0MCAzMgoJY29uY2F0Cgljb25jYXQKCWxvZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM0MQoJLy8gcmV0dXJuIHZhbGlkYXRvcklkCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvck1hbmFnZXIodWludDY0LGFkZHJlc3Mpdm9pZAoqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvck1hbmFnZXI6CgkvLyBtYW5hZ2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKG1hbmFnZXIpIGZvciBjaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyKHVpbnQ2NCxhZGRyZXNzKXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yTWFuYWdlcgoJaW50IDEKCXJldHVybgoKLy8gY2hhbmdlVmFsaWRhdG9yTWFuYWdlcih2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBtYW5hZ2VyOiBBZGRyZXNzKTogdm9pZAovLwovLyBDaGFuZ2VzIHRoZSBWYWxpZGF0b3IgbWFuYWdlciBmb3IgYSBzcGVjaWZpYyBWYWxpZGF0b3IgaWQuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gY2hhbmdlIHRoZSBtYW5hZ2VyIGZvci4KLy8gQHBhcmFtIHtBZGRyZXNzfSBtYW5hZ2VyIC0gVGhlIG5ldyBtYW5hZ2VyIGFkZHJlc3MuCmNoYW5nZVZhbGlkYXRvck1hbmFnZXI6Cglwcm90byAyIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNTIKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM1MwoJLy8gYXNzZXJ0KG1hbmFnZXIgIT09IGdsb2JhbHMuemVyb0FkZHJlc3MsICduZWVkcyB0byBhdCBsZWFzdCBiZSB2YWxpZCBhZGRyZXNzJykKCWZyYW1lX2RpZyAtMiAvLyBtYW5hZ2VyOiBBZGRyZXNzCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CgoJLy8gbmVlZHMgdG8gYXQgbGVhc3QgYmUgdmFsaWQgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzU0CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5tYW5hZ2VyID0gbWFuYWdlcgoJaW50IDQwCglmcmFtZV9kaWcgLTIgLy8gbWFuYWdlcjogQWRkcmVzcwoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCXJldHN1YgoKLy8gY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyh1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkCiphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbzoKCS8vIHN1bnNldHRpbmdUbzogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglidG9pCgoJLy8gc3Vuc2V0dGluZ09uOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbwoJaW50IDEKCXJldHVybgoKLy8gY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBzdW5zZXR0aW5nT246IHVpbnQ2NCwgc3Vuc2V0dGluZ1RvOiBWYWxpZGF0b3JJZFR5cGUpOiB2b2lkCi8vCi8vIFVwZGF0ZXMgdGhlIHN1bnNldCBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiB2YWxpZGF0b3IuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gdXBkYXRlLgovLyBAcGFyYW0ge3VpbnQ2NH0gc3Vuc2V0dGluZ09uIC0gVGhlIG5ldyBzdW5zZXQgdGltZXN0YW1wLgovLyBAcGFyYW0ge3VpbnQ2NH0gc3Vuc2V0dGluZ1RvIC0gVGhlIG5ldyBzdW5zZXQgdG8gdmFsaWRhdG9yIGlkLgpjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvOgoJcHJvdG8gMyAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzY2CgkvLyB0aGlzLmNhbGxlck11c3RCZU93bmVyKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgY2FsbGVyTXVzdEJlT3duZXIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNjcKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnN1bnNldHRpbmdPbiA9IHN1bnNldHRpbmdPbgoJaW50IDIyNgoJZnJhbWVfZGlnIC0yIC8vIHN1bnNldHRpbmdPbjogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM2OAoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcuc3Vuc2V0dGluZ1RvID0gc3Vuc2V0dGluZ1RvCglpbnQgMjM0CglmcmFtZV9kaWcgLTMgLy8gc3Vuc2V0dGluZ1RvOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvck5GRCh1aW50NjQsdWludDY0LHN0cmluZyl2b2lkCiphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yTkZEOgoJLy8gbmZkTmFtZTogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglleHRyYWN0IDIgMAoKCS8vIG5mZEFwcElEOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JORkQodWludDY0LHVpbnQ2NCxzdHJpbmcpdm9pZAoJY2FsbHN1YiBjaGFuZ2VWYWxpZGF0b3JORkQKCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvck5GRCh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBuZmRBcHBJRDogdWludDY0LCBuZmROYW1lOiBzdHJpbmcpOiB2b2lkCi8vCi8vIENoYW5nZXMgdGhlIE5GRCBmb3IgYSB2YWxpZGF0b3IgaW4gdGhlIHZhbGlkYXRvckxpc3QgY29udHJhY3QuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gdXBkYXRlLgovLyBAcGFyYW0ge3VpbnQ2NH0gbmZkQXBwSUQgLSBUaGUgYXBwbGljYXRpb24gaWQgb2YgdGhlIE5GRCB0byBhc3NpZ24gdG8gdGhlIHZhbGlkYXRvci4KLy8gQHBhcmFtIHtzdHJpbmd9IG5mZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgTkZEICh3aGljaCBtdXN0IG1hdGNoKQpjaGFuZ2VWYWxpZGF0b3JORkQ6Cglwcm90byAzIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozODAKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM4MgoJLy8gYXNzZXJ0KHRoaXMuaXNORkRBcHBJRFZhbGlkKG5mZEFwcElEKSwgJ3Byb3ZpZGVkIE5GRCBtdXN0IGJlIHZhbGlkJykKCWZyYW1lX2RpZyAtMiAvLyBuZmRBcHBJRDogdWludDY0CgljYWxsc3ViIGlzTkZEQXBwSURWYWxpZAoKCS8vIHByb3ZpZGVkIE5GRCBtdXN0IGJlIHZhbGlkCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozODQKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHRoaXMudHhuLnNlbmRlciA9PT0gKEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzKSwKCS8vICAgICAgICAgICAgICdJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXInLAoJLy8gICAgICAgICApCgl0eG4gU2VuZGVyCglmcmFtZV9kaWcgLTIgLy8gbmZkQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKQoJYXNzZXJ0Cgk9PQoKCS8vIElmIHNwZWNpZnlpbmcgTkZELCBhY2NvdW50IGFkZGluZyB2YWxpZGF0b3IgbXVzdCBiZSBvd25lcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mzg4CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5uZmRGb3JJbmZvID0gbmZkQXBwSUQKCWludCA3MgoJZnJhbWVfZGlnIC0yIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHVpbnQ2NCxhZGRyZXNzKXZvaWQKKmFiaV9yb3V0ZV9jaGFuZ2VWYWxpZGF0b3JDb21taXNzaW9uQWRkcmVzczoKCS8vIGNvbW1pc3Npb25BZGRyZXNzOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKGNvbW1pc3Npb25BZGRyZXNzKSBmb3IgY2hhbmdlVmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MgbXVzdCBiZSBhIGFkZHJlc3MKCWFzc2VydAoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHVpbnQ2NCxhZGRyZXNzKXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MKCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIGNvbW1pc3Npb25BZGRyZXNzOiBBZGRyZXNzKTogdm9pZAovLwovLyBDaGFuZ2UgdGhlIGNvbW1pc3Npb24gYWRkcmVzcyB0aGF0IHZhbGlkYXRvciByZXdhcmRzIGFyZSBzZW50IHRvLgovLyBbIE9OTFkgT1dORVIgQ0FOIENIQU5HRSBdCmNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzOgoJcHJvdG8gMiAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mzk2CgkvLyB0aGlzLmNhbGxlck11c3RCZU93bmVyKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgY2FsbGVyTXVzdEJlT3duZXIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozOTcKCS8vIGFzc2VydChjb21taXNzaW9uQWRkcmVzcyAhPT0gQWRkcmVzcy56ZXJvQWRkcmVzcykKCWZyYW1lX2RpZyAtMiAvLyBjb21taXNzaW9uQWRkcmVzczogQWRkcmVzcwoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mzk4CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy52YWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyA9IGNvbW1pc3Npb25BZGRyZXNzCglpbnQgMTc3CglmcmFtZV9kaWcgLTIgLy8gY29tbWlzc2lvbkFkZHJlc3M6IEFkZHJlc3MKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8odWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQpdm9pZAoqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvclJld2FyZEluZm86CgkvLyBSZXdhcmRQZXJQYXlvdXQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgoJYnRvaQoKCS8vIEdhdGluZ0Fzc2V0TWluQmFsYW5jZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyA1CglidG9pCgoJLy8gRW50cnlHYXRpbmdBc3NldHM6IHVpbnQ2NFs0XQoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAoJZHVwCglsZW4KCWludCAzMgoJPT0KCgkvLyBhcmd1bWVudCAyIChFbnRyeUdhdGluZ0Fzc2V0cykgZm9yIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8gbXVzdCBiZSBhIHVpbnQ2NFs0XQoJYXNzZXJ0CgoJLy8gRW50cnlHYXRpbmdBZGRyZXNzOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDMgKEVudHJ5R2F0aW5nQWRkcmVzcykgZm9yIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8gbXVzdCBiZSBhIGFkZHJlc3MKCWFzc2VydAoKCS8vIEVudHJ5R2F0aW5nVHlwZTogdWludDgKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMQoJPT0KCgkvLyBhcmd1bWVudCA0IChFbnRyeUdhdGluZ1R5cGUpIGZvciBjaGFuZ2VWYWxpZGF0b3JSZXdhcmRJbmZvIG11c3QgYmUgYSB1aW50OAoJYXNzZXJ0CglidG9pCgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mbyh1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCl2b2lkCgljYWxsc3ViIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8KCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8odmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgRW50cnlHYXRpbmdUeXBlOiB1aW50OCwgRW50cnlHYXRpbmdBZGRyZXNzOiBBZGRyZXNzLCBFbnRyeUdhdGluZ0Fzc2V0czogU3RhdGljQXJyYXk8dWludDY0LCA0PiwgR2F0aW5nQXNzZXRNaW5CYWxhbmNlOiB1aW50NjQsIFJld2FyZFBlclBheW91dDogdWludDY0KTogdm9pZAovLwovLyBBbGxvdyB0aGUgYWRkaXRpb25hbCByZXdhcmRzIChnYXRpbmcgZW50cnksIGFkZGl0aW9uYWwgdG9rZW4gcmV3YXJkcykgaW5mb3JtYXRpb24gYmUgY2hhbmdlZCBhdCB3aWxsLgovLyBbIE9OTFkgT1dORVIgQ0FOIENIQU5HRSBdCmNoYW5nZVZhbGlkYXRvclJld2FyZEluZm86Cglwcm90byA2IDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MTMKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQxNQoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgRW50cnlHYXRpbmdUeXBlID49IEdBVElOR19UWVBFX05PTkUgJiYgRW50cnlHYXRpbmdUeXBlIDwgR0FUSU5HX1RZUEVfQ09OU1RfTUFYLAoJLy8gICAgICAgICAgICAgJ2ludmFsaWQgRW50cnkgZ2F0aW5nIHR5cGUnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDAKCT49CglkdXAKCWJ6ICpza2lwX2FuZDEKCWZyYW1lX2RpZyAtMiAvLyBFbnRyeUdhdGluZ1R5cGU6IHVpbnQ4CglpbnQgNAoJPAoJJiYKCipza2lwX2FuZDE6CgkvLyBpbnZhbGlkIEVudHJ5IGdhdGluZyB0eXBlCglhc3NlcnQKCgkvLyAqaWY3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDE5CgkvLyBFbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX0FTU0VUU19DUkVBVEVEX0JZCglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDEKCT09CglieiAqaWY3X2VuZAoKCS8vICppZjdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDIwCgkvLyBhc3NlcnQoRW50cnlHYXRpbmdBZGRyZXNzICE9PSBnbG9iYWxzLnplcm9BZGRyZXNzKQoJZnJhbWVfZGlnIC0zIC8vIEVudHJ5R2F0aW5nQWRkcmVzczogQWRkcmVzcwoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoqaWY3X2VuZDoKCS8vICppZjhfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MjMKCS8vIEVudHJ5R2F0aW5nVHlwZSA9PT0gR0FUSU5HX1RZUEVfQ1JFQVRFRF9CWV9ORkRfQUREUkVTU0VTIHx8CgkvLyAgICAgICAgICAgICBFbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX1NFR01FTlRfT0ZfTkZECglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDMKCT09CglkdXAKCWJueiAqc2tpcF9vcjEKCWZyYW1lX2RpZyAtMiAvLyBFbnRyeUdhdGluZ1R5cGU6IHVpbnQ4CglpbnQgNAoJPT0KCXx8Cgoqc2tpcF9vcjE6CglieiAqaWY4X2VuZAoKCS8vICppZjhfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDI2CgkvLyBhc3NlcnQodGhpcy5pc05GREFwcElEVmFsaWQoRW50cnlHYXRpbmdBc3NldHNbMF0pLCAncHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZEJykKCWZyYW1lX2RpZyAtNCAvLyBFbnRyeUdhdGluZ0Fzc2V0czogU3RhdGljQXJyYXk8dWludDY0LCA0PgoJZXh0cmFjdCAwIDgKCWJ0b2kKCWNhbGxzdWIgaXNORkRBcHBJRFZhbGlkCgoJLy8gcHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZECglhc3NlcnQKCippZjhfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDI4CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPSBFbnRyeUdhdGluZ1R5cGUKCWludCA4MAoJZnJhbWVfZGlnIC0yIC8vIEVudHJ5R2F0aW5nVHlwZTogdWludDgKCWl0b2IKCWV4dHJhY3QgNyAxCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQyOQoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcuZW50cnlHYXRpbmdBZGRyZXNzID0gRW50cnlHYXRpbmdBZGRyZXNzCglpbnQgODEKCWZyYW1lX2RpZyAtMyAvLyBFbnRyeUdhdGluZ0FkZHJlc3M6IEFkZHJlc3MKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDMwCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0cyA9IEVudHJ5R2F0aW5nQXNzZXRzCglpbnQgMTEzCglmcmFtZV9kaWcgLTQgLy8gRW50cnlHYXRpbmdBc3NldHM6IFN0YXRpY0FycmF5PHVpbnQ2NCwgND4KCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDMxCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5nYXRpbmdBc3NldE1pbkJhbGFuY2UgPSBHYXRpbmdBc3NldE1pbkJhbGFuY2UKCWludCAxNDUKCWZyYW1lX2RpZyAtNSAvLyBHYXRpbmdBc3NldE1pbkJhbGFuY2U6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MzIKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnJld2FyZFBlclBheW91dCA9IFJld2FyZFBlclBheW91dAoJaW50IDE2MQoJZnJhbWVfZGlnIC02IC8vIFJld2FyZFBlclBheW91dDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyBhZGRQb29sKHBheSx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCkKKmFiaV9yb3V0ZV9hZGRQb29sOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBub2RlTnVtOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gbWJyUGF5bWVudDogcGF5Cgl0eG4gR3JvdXBJbmRleAoJaW50IDEKCS0KCWR1cAoJZ3R4bnMgVHlwZUVudW0KCWludCBwYXkKCT09CgoJLy8gYXJndW1lbnQgMiAobWJyUGF5bWVudCkgZm9yIGFkZFBvb2wgbXVzdCBiZSBhIHBheSB0cmFuc2FjdGlvbgoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBhZGRQb29sKHBheSx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCkKCWNhbGxzdWIgYWRkUG9vbAoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFBvb2wobWJyUGF5bWVudDogUGF5VHhuLCB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBub2RlTnVtOiB1aW50NjQpOiBWYWxpZGF0b3JQb29sS2V5Ci8vCi8vIEFkZHMgYSBuZXcgcG9vbCB0byBhIHZhbGlkYXRvcidzIHBvb2wgc2V0LCByZXR1cm5pbmcgdGhlICdrZXknIHRvIHJlZmVyZW5jZSB0aGUgcG9vbCBpbiB0aGUgZnV0dXJlIGZvciBzdGFraW5nLCBldGMuCi8vIFRoZSBjYWxsZXIgbXVzdCBwYXkgdGhlIGNvc3Qgb2YgdGhlIHZhbGlkYXRvcnMgTUJSIGluY3JlYXNlIGFzIHdlbGwgYXMgdGhlIE1CUiB0aGF0IHdpbGwgYmUgbmVlZGVkIGZvciB0aGUgcG9vbCBpdHNlbGYuCi8vCi8vIFsgT05MWSBPV05FUiBPUiBNQU5BR0VSIENBTiBjYWxsIF0KLy8gQHBhcmFtIHtQYXlUeG59IG1iclBheW1lbnQgcGF5bWVudCBmcm9tIGNhbGxlciB3aGljaCBjb3ZlcnMgbWJyIGluY3JlYXNlIG9mIGFkZGluZyBhIG5ldyBwb29sCi8vIEBwYXJhbSB7dWludDY0fSB2YWxpZGF0b3JJZCBpcyBpZCBvZiB2YWxpZGF0b3IgdG8gcG9vbCB0byAobXVzdCBiZSBvd25lciBvciBtYW5hZ2VyKQovLyBAcGFyYW0ge3VpbnQ2NH0gbm9kZU51bSBpcyBub2RlIG51bWJlciB0byBhZGQgdG8KLy8gQHJldHVybnMge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2wga2V5IHRvIGNyZWF0ZWQgcG9vbAphZGRQb29sOgoJcHJvdG8gMyAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ0NwoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lck9yTWFuYWdlcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyT3JNYW5hZ2VyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDUwCgkvLyB2ZXJpZnlQYXlUeG4obWJyUGF5bWVudCwgeyByZWNlaXZlcjogdGhpcy5hcHAuYWRkcmVzcywgYW1vdW50OiB0aGlzLmdldE1ickFtb3VudHMoKS5hZGRQb29sTWJyIH0pCgkvLyB2ZXJpZnkgcmVjZWl2ZXIKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIFJlY2VpdmVyCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6InJlY2VpdmVyIiwiZXhwZWN0ZWQiOiJ0aGlzLmFwcC5hZGRyZXNzIn0KCWFzc2VydAoKCS8vIHZlcmlmeSBhbW91bnQKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCglleHRyYWN0IDggOAoJYnRvaQoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6ImFtb3VudCIsImV4cGVjdGVkIjoidGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkUG9vbE1iciJ9Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NTIKCS8vIGFzc2VydCh0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLmV4aXN0cywgInNwZWNpZmllZCB2YWxpZGF0b3IgaWQgaXNuJ3QgdmFsaWQiKQoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJYm94X2xlbgoJc3dhcAoJcG9wCgoJLy8gc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBpc24ndCB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDU0CgkvLyBudW1Qb29sczogdWludDY0ID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyBhcyB1aW50NjQKCWludCAyNDIKCWludCAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIG51bVBvb2xzOiB1aW50NjQKCgkvLyAqaWY5X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDU1CgkvLyAobnVtUG9vbHMgYXMgdWludDY0KSA+PSBNQVhfUE9PTFMKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWludCAyNAoJPj0KCWJ6ICppZjlfZW5kCgoJLy8gKmlmOV9jb25zZXF1ZW50CgkvLyBhbHJlYWR5IGF0IG1heCBwb29sIHNpemUKCWVycgoKKmlmOV9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NTgKCS8vIG51bVBvb2xzICs9IDEKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ2MQoJLy8gc2VuZEFwcENhbGwoewoJLy8gICAgICAgICAgICAgb25Db21wbGV0aW9uOiBPbkNvbXBsZXRpb24uTm9PcCwKCS8vICAgICAgICAgICAgIGFwcHJvdmFsUHJvZ3JhbTogWwoJLy8gICAgICAgICAgICAgICAgIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uZXh0cmFjdCgwLCA0MDk2KSwKCS8vICAgICAgICAgICAgICAgICB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLmV4dHJhY3QoNDA5NiwgdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5zaXplIC0gNDA5NiksCgkvLyAgICAgICAgICAgICBdLAoJLy8gICAgICAgICAgICAgY2xlYXJTdGF0ZVByb2dyYW06IFN0YWtpbmdQb29sLmNsZWFyUHJvZ3JhbSgpLAoJLy8gICAgICAgICAgICAgZ2xvYmFsTnVtVWludDogU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1VaW50LAoJLy8gICAgICAgICAgICAgZ2xvYmFsTnVtQnl0ZVNsaWNlOiBTdGFraW5nUG9vbC5zY2hlbWEuZ2xvYmFsLm51bUJ5dGVTbGljZSwKCS8vICAgICAgICAgICAgIGV4dHJhUHJvZ3JhbVBhZ2VzOiAzLAoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25BcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gY3JlYXRpbmdDb250cmFjdElELCB2YWxpZGF0b3JJZCwgcG9vbElkLCBtaW5FbnRyeVN0YWtlCgkvLyAgICAgICAgICAgICAgICAgbWV0aG9kKCdjcmVhdGVBcHBsaWNhdGlvbih1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCcpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodGhpcy5hcHAuaWQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodmFsaWRhdG9ySWQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IobnVtUG9vbHMgYXMgdWludDY0KSwKCS8vICAgICAgICAgICAgICAgICBpdG9iKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1pbkVudHJ5U3Rha2UpLAoJLy8gICAgICAgICAgICAgXSwKCS8vICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDYyCgkvLyBvbkNvbXBsZXRpb246IE9uQ29tcGxldGlvbi5Ob09wCglpbnQgMCAvLyBOb09wCglpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ2MwoJLy8gYXBwcm92YWxQcm9ncmFtOiBbCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5leHRyYWN0KDAsIDQwOTYpLAoJLy8gICAgICAgICAgICAgICAgIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uZXh0cmFjdCg0MDk2LCB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLnNpemUgLSA0MDk2KSwKCS8vICAgICAgICAgICAgIF0KCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWludCAwCglpbnQgNDA5NgoJYm94X2V4dHJhY3QKCWl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWludCA0MDk2CglieXRlIDB4NzA2ZjZmNmM1NDY1NmQ3MDZjNjE3NDY1NDE3MDcwNzI2Zjc2NjE2YzQyNzk3NDY1NzMgLy8gInBvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMiCglib3hfbGVuCgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLnNpemUKCWFzc2VydAoJaW50IDQwOTYKCS0KCWJveF9leHRyYWN0CglpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDY3CgkvLyBjbGVhclN0YXRlUHJvZ3JhbTogU3Rha2luZ1Bvb2wuY2xlYXJQcm9ncmFtKCkKCWJ5dGUgYjY0IEN3PT0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NjgKCS8vIGdsb2JhbE51bVVpbnQ6IFN0YWtpbmdQb29sLnNjaGVtYS5nbG9iYWwubnVtVWludAoJaW50IDExCglpdHhuX2ZpZWxkIEdsb2JhbE51bVVpbnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NjkKCS8vIGdsb2JhbE51bUJ5dGVTbGljZTogU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1CeXRlU2xpY2UKCWludCAzCglpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ3MAoJLy8gZXh0cmFQcm9ncmFtUGFnZXM6IDMKCWludCAzCglpdHhuX2ZpZWxkIEV4dHJhUHJvZ3JhbVBhZ2VzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDcxCgkvLyBhcHBsaWNhdGlvbkFyZ3M6IFsKCS8vICAgICAgICAgICAgICAgICAvLyBjcmVhdGluZ0NvbnRyYWN0SUQsIHZhbGlkYXRvcklkLCBwb29sSWQsIG1pbkVudHJ5U3Rha2UKCS8vICAgICAgICAgICAgICAgICBtZXRob2QoJ2NyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkJyksCgkvLyAgICAgICAgICAgICAgICAgaXRvYih0aGlzLmFwcC5pZCksCgkvLyAgICAgICAgICAgICAgICAgaXRvYih2YWxpZGF0b3JJZCksCgkvLyAgICAgICAgICAgICAgICAgaXRvYihudW1Qb29scyBhcyB1aW50NjQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWluRW50cnlTdGFrZSksCgkvLyAgICAgICAgICAgICBdCgltZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCXR4bmEgQXBwbGljYXRpb25zIDAKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglpbnQgMjA5CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ4MQoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyA9IG51bVBvb2xzIGFzIHVpbnQxNgoJaW50IDI0MgoJZnJhbWVfZGlnIDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoJaXRvYgoJZXh0cmFjdCA2IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDg0CgkvLyBwb29sQXBwSWQgPSB0aGlzLml0eG4uY3JlYXRlZEFwcGxpY2F0aW9uSUQuaWQKCWl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKCWZyYW1lX2J1cnkgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ4NQoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1tudW1Qb29scyAtIDFdLnBvb2xBcHBJZCA9IHBvb2xBcHBJZAoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgMCAvLyBudW1Qb29sczogdWludDY0CglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0ODYKCS8vIHRoaXMuYWRkUG9vbFRvTm9kZSh2YWxpZGF0b3JJZCwgcG9vbEFwcElkLCBub2RlTnVtKQoJZnJhbWVfZGlnIC0zIC8vIG5vZGVOdW06IHVpbnQ2NAoJZnJhbWVfZGlnIDEgLy8gcG9vbEFwcElkOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGFkZFBvb2xUb05vZGUKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0ODgKCS8vIHRoaXMucmV0aU9QX3ZhbGlkYXRvckFkZGVkUG9vbC5sb2coewoJLy8gICAgICAgICAgICAgaWQ6IHZhbGlkYXRvcklkLAoJLy8gICAgICAgICAgICAgbnVtOiBudW1Qb29scyBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKSwKCS8vICAgICAgICAgfSkKCWJ5dGUgMHhmYmNjMGY2YiAvLyByZXRpT1BfdmFsaWRhdG9yQWRkZWRQb29sKHVpbnQ2NCx1aW50MTYsdWludDY0KQoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWl0b2IKCWR1cAoJYml0bGVuCglpbnQgMTYKCTw9CgoJLy8gbnVtUG9vbHMgYXMgdWludDE2IG92ZXJmbG93ZWQgMTYgYml0cwoJYXNzZXJ0CglleHRyYWN0IDYgMgoJY29uY2F0CglmcmFtZV9kaWcgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cgljb25jYXQKCWxvZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ5NAoJLy8gcmV0dXJuIHsgaWQ6IHZhbGlkYXRvcklkLCBwb29sSWQ6IG51bVBvb2xzIGFzIHVpbnQ2NCwgcG9vbEFwcElkOiB0aGlzLml0eG4hLmNyZWF0ZWRBcHBsaWNhdGlvbklELmlkIH0KCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCglmcmFtZV9kaWcgMCAvLyBudW1Qb29sczogdWludDY0CglpdG9iCgljb25jYXQKCWl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKCWl0b2IKCWNvbmNhdAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDEKCXJldHN1YgoKLy8gYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KQoqYWJpX3JvdXRlX2FkZFN0YWtlOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gc3Rha2VkQW1vdW50UGF5bWVudDogcGF5Cgl0eG4gR3JvdXBJbmRleAoJaW50IDEKCS0KCWR1cAoJZ3R4bnMgVHlwZUVudW0KCWludCBwYXkKCT09CgoJLy8gYXJndW1lbnQgMiAoc3Rha2VkQW1vdW50UGF5bWVudCkgZm9yIGFkZFN0YWtlIG11c3QgYmUgYSBwYXkgdHJhbnNhY3Rpb24KCWFzc2VydAoKCS8vIGV4ZWN1dGUgYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBhZGRTdGFrZQoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFN0YWtlKHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4biwgdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgdmFsdWVUb1ZlcmlmeTogdWludDY0KTogVmFsaWRhdG9yUG9vbEtleQovLwovLyBBZGRzIHN0YWtlIHRvIGEgdmFsaWRhdG9yIHBvb2wuCi8vCi8vIEBwYXJhbSB7UGF5VHhufSBzdGFrZWRBbW91bnRQYXltZW50IC0gcGF5bWVudCBjb21pbmcgZnJvbSBzdGFrZXIgdG8gcGxhY2UgaW50byBhIHBvb2wKLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWx1ZVRvVmVyaWZ5IC0gb25seSBpZiB2YWxpZGF0b3IgaGFzIGdhdGluZyB0byBlbnRlciAtIHRoaXMgaXMgYXNzZXQgaWQgb3IgbmZkIGlkIHRoYXQgY29ycmVzcG9uZHMgdG8gZ2F0aW5nLgovLyBUeG4gc2VuZGVyIGlzIGZhY3RvcmVkIGluIGFzIHdlbGwgaWYgdGhhdCBpcyBwYXJ0IG9mIGdhdGluZy4KLy8gKiBAcmV0dXJucyB7VmFsaWRhdG9yUG9vbEtleX0gLSBUaGUga2V5IG9mIHRoZSB2YWxpZGF0b3IgcG9vbC4KYWRkU3Rha2U6Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA1CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTA3CgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS5leGlzdHMsICJzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGlzbid0IHZhbGlkIikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoKCS8vIHNwZWNpZmllZCB2YWxpZGF0b3IgaWQgaXNuJ3QgdmFsaWQKCWFzc2VydAoKCS8vICppZjEwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTEwCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5zdW5zZXR0aW5nT24gPiAwCglpbnQgMjI2CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWludCAwCgk+CglieiAqaWYxMF9lbmQKCgkvLyAqaWYxMF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MTIKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5zdW5zZXR0aW5nT24gPiBnbG9iYWxzLmxhdGVzdFRpbWVzdGFtcCwKCS8vICAgICAgICAgICAgICAgICAiY2FuJ3Qgc3Rha2Ugd2l0aCBhIHZhbGlkYXRvciB0aGF0IGlzIHBhc3QgaXRzIHN1bnNldHRpbmcgdGltZSIsCgkvLyAgICAgICAgICAgICApCglpbnQgMjI2CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKCT4KCgkvLyBjYW4ndCBzdGFrZSB3aXRoIGEgdmFsaWRhdG9yIHRoYXQgaXMgcGFzdCBpdHMgc3Vuc2V0dGluZyB0aW1lCglhc3NlcnQKCippZjEwX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUxOAoJLy8gc3Rha2VyID0gdGhpcy50eG4uc2VuZGVyCgl0eG4gU2VuZGVyCglmcmFtZV9idXJ5IDAgLy8gc3Rha2VyOiBhZGRyZXNzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTIyCgkvLyB2ZXJpZnlQYXlUeG4oc3Rha2VkQW1vdW50UGF5bWVudCwgewoJLy8gICAgICAgICAgICAgc2VuZGVyOiBzdGFrZXIsCgkvLyAgICAgICAgICAgICByZWNlaXZlcjogdGhpcy5hcHAuYWRkcmVzcywKCS8vICAgICAgICAgfSkKCS8vIHZlcmlmeSBzZW5kZXIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIFNlbmRlcgoJZnJhbWVfZGlnIDAgLy8gc3Rha2VyOiBhZGRyZXNzCgk9PQoKCS8vIHRyYW5zYWN0aW9uIHZlcmlmaWNhdGlvbiBmYWlsZWQ6IHsidHhuIjoic3Rha2VkQW1vdW50UGF5bWVudCIsImZpZWxkIjoic2VuZGVyIiwiZXhwZWN0ZWQiOiJzdGFrZXIifQoJYXNzZXJ0CgoJLy8gdmVyaWZ5IHJlY2VpdmVyCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBSZWNlaXZlcgoJZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCT09CgoJLy8gdHJhbnNhY3Rpb24gdmVyaWZpY2F0aW9uIGZhaWxlZDogeyJ0eG4iOiJzdGFrZWRBbW91bnRQYXltZW50IiwiZmllbGQiOiJyZWNlaXZlciIsImV4cGVjdGVkIjoidGhpcy5hcHAuYWRkcmVzcyJ9Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzAKCS8vIHRoaXMuZG9lc1N0YWtlck1lZXRHYXRpbmcodmFsaWRhdG9ySWQsIHZhbHVlVG9WZXJpZnkpCglmcmFtZV9kaWcgLTMgLy8gdmFsdWVUb1ZlcmlmeTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBkb2VzU3Rha2VyTWVldEdhdGluZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUzMgoJLy8gcmVhbEFtb3VudCA9IHN0YWtlZEFtb3VudFBheW1lbnQuYW1vdW50CglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBBbW91bnQKCWZyYW1lX2J1cnkgMSAvLyByZWFsQW1vdW50OiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzMKCS8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NCA9IDAKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gbWJyQW10TGVmdEJlaGluZDogdWludDY0CgoJLy8gKmlmMTFfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzUKCS8vIHRoaXMuZG9lc1N0YWtlck5lZWRUb1BheU1CUihzdGFrZXIpCglmcmFtZV9kaWcgMCAvLyBzdGFrZXI6IGFkZHJlc3MKCWNhbGxzdWIgZG9lc1N0YWtlck5lZWRUb1BheU1CUgoJYnogKmlmMTFfZW5kCgoJLy8gKmlmMTFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTM4CgkvLyBtYnJBbXRMZWZ0QmVoaW5kID0gdGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkU3Rha2VyTWJyCgljYWxsc3ViIGdldE1ickFtb3VudHMKCWV4dHJhY3QgMjQgOAoJYnRvaQoJZnJhbWVfYnVyeSAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUzOQoJLy8gcmVhbEFtb3VudCAtPSBtYnJBbXRMZWZ0QmVoaW5kCglmcmFtZV9kaWcgMSAvLyByZWFsQW1vdW50OiB1aW50NjQKCWZyYW1lX2RpZyAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoJLQoJZnJhbWVfYnVyeSAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU0MAoJLy8gdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikuY3JlYXRlKCkKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAwIC8vIHN0YWtlcjogYWRkcmVzcwoJY29uY2F0CglpbnQgMTQ0Cglib3hfY3JlYXRlCglwb3AKCippZjExX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU0NAoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS50b3RhbEFsZ29TdGFrZWQgKyByZWFsQW1vdW50IDwgdGhpcy5tYXhBbGxvd2VkU3Rha2UoKSwKCS8vICAgICAgICAgICAgICd0b3RhbCBzdGFrZWQgZm9yIGFsbCBvZiBhIHZhbGlkYXRvcnMgcG9vbHMgbWF5IG5vdCBleGNlZWQgaGFyZCBjYXAnLAoJLy8gICAgICAgICApCglpbnQgMjUyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoJKwoJY2FsbHN1YiBtYXhBbGxvd2VkU3Rha2UKCTwKCgkvLyB0b3RhbCBzdGFrZWQgZm9yIGFsbCBvZiBhIHZhbGlkYXRvcnMgcG9vbHMgbWF5IG5vdCBleGNlZWQgaGFyZCBjYXAKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU1MQoJLy8gZmluZFJldCA9IHRoaXMuZmluZFBvb2xGb3JTdGFrZXIodmFsaWRhdG9ySWQsIHN0YWtlciwgcmVhbEFtb3VudCkKCWZyYW1lX2RpZyAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoJZnJhbWVfZGlnIDAgLy8gc3Rha2VyOiBhZGRyZXNzCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBmaW5kUG9vbEZvclN0YWtlcgoJZnJhbWVfYnVyeSAzIC8vIGZpbmRSZXQ6ICgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NTIKCS8vIHBvb2xLZXkgPSBmaW5kUmV0WzBdCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NTMKCS8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IgPSBmaW5kUmV0WzFdCglmcmFtZV9kaWcgMyAvLyBmaW5kUmV0OiAoKHVpbnQ2NCx1aW50NjQsdWludDY0KSxib29sLGJvb2wpCglzdG9yZSAyNTUgLy8gZnVsbCBhcnJheQoJbG9hZCAyNTUgLy8gZnVsbCBhcnJheQoJaW50IDE5MgoJZ2V0Yml0CglmcmFtZV9idXJ5IDQgLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU1NAoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sID0gZmluZFJldFsyXQoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWludCAxOTMKCWdldGJpdAoJZnJhbWVfYnVyeSA1IC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoKCS8vICppZjEyX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTU1CgkvLyBwb29sS2V5LnBvb2xJZCA9PT0gMAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMAoJPT0KCWJ6ICppZjEyX2VuZAoKCS8vICppZjEyX2NvbnNlcXVlbnQKCS8vIE5vIHBvb2wgYXZhaWxhYmxlIHdpdGggZnJlZSBzdGFrZS4gIFZhbGlkYXRvciBuZWVkcyB0byBhZGQgYW5vdGhlciBwb29sCgllcnIKCippZjEyX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU2MAoJLy8gdGhpcy51cGRhdGVTdGFrZXJQb29sU2V0KHN0YWtlciwgcG9vbEtleSkKCWZyYW1lX2RpZyAzIC8vIGZpbmRSZXQ6ICgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKCXN0b3JlIDI1NSAvLyBmdWxsIGFycmF5Cglsb2FkIDI1NSAvLyBmdWxsIGFycmF5CglleHRyYWN0IDAgMjQKCWZyYW1lX2RpZyAwIC8vIHN0YWtlcjogYWRkcmVzcwoJY2FsbHN1YiB1cGRhdGVTdGFrZXJQb29sU2V0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTYzCgkvLyB0aGlzLmNhbGxQb29sQWRkU3Rha2UoCgkvLyAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LAoJLy8gICAgICAgICAgICAgcG9vbEtleSwKCS8vICAgICAgICAgICAgIG1ickFtdExlZnRCZWhpbmQsCgkvLyAgICAgICAgICAgICBpc05ld1N0YWtlclRvVmFsaWRhdG9yLAoJLy8gICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1Byb3RvY29sLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgNSAvLyBpc05ld1N0YWtlclRvUHJvdG9jb2w6IGJvb2wKCWZyYW1lX2RpZyA0IC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCWZyYW1lX2RpZyAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMCAyNAoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4bgoJY2FsbHN1YiBjYWxsUG9vbEFkZFN0YWtlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTcwCgkvLyB0aGlzLnJldGlPUF9zdGFrZUFkZGVkLmxvZyh7CgkvLyAgICAgICAgICAgICBpZDogdmFsaWRhdG9ySWQsCgkvLyAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLAoJLy8gICAgICAgICAgICAgYW1vdW50U3Rha2VkOiByZWFsQW1vdW50LAoJLy8gICAgICAgICAgICAgc3Rha2VyOiBzdGFrZXIsCgkvLyAgICAgICAgIH0pCglieXRlIDB4OTYyYjQxNDMgLy8gcmV0aU9QX3N0YWtlQWRkZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQpCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgMCAvLyBzdGFrZXI6IGFkZHJlc3MKCWNvbmNhdAoJZnJhbWVfZGlnIDEgLy8gcmVhbEFtb3VudDogdWludDY0CglpdG9iCgljb25jYXQKCWNvbmNhdAoJbG9nCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTc4CgkvLyByZXR1cm4gcG9vbEtleQoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMCAyNAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDUKCXJldHN1YgoKLy8gc2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KQoqYWJpX3JvdXRlX3NldFRva2VuUGF5b3V0UmF0aW86CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIHNldFRva2VuUGF5b3V0UmF0aW8odWludDY0KSh1aW50NjRbMjRdLHVpbnQ2NCkKCWNhbGxzdWIgc2V0VG9rZW5QYXlvdXRSYXRpbwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIHNldFRva2VuUGF5b3V0UmF0aW8odmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IFBvb2xUb2tlblBheW91dFJhdGlvCi8vCi8vIHNldFRva2VuUGF5b3V0UmF0aW8gaXMgY2FsbGVkIGJ5IFN0YWtpbmcgUG9vbCAjIDEgKE9OTFkpIHRvIGFzayB0aGUgdmFsaWRhdG9yICh1cykgdG8gY2FsY3VsYXRlIHRoZSByYXRpb3MKLy8gb2Ygc3Rha2UgaW4gdGhlIHBvb2xzIGZvciBzdWJzZXF1ZW50IHRva2VuIHBheW91dHMgKGllOiAyIHBvb2xzLCAnMTAwJyBhbGdvIHRvdGFsIHN0YWtlZCwgNjAgaW4gcG9vbCAxLCBhbmQgNDAKLy8gaW4gcG9vbCAyKSAgVGhpcyBpcyBkb25lIHNvIHdlIGhhdmUgYSBzdGFibGUgc25hcHNob3Qgb2Ygc3Rha2UgLSB0YWtlbiBvbmNlIHBlciBlcG9jaCAtIG9ubHkgdHJpZ2dlcmVkIGJ5Ci8vIHBvb2wgMSBkb2luZyBwYXlvdXQuICBwb29scyBvdGhlciB0aGFuIDEgZG9pbmcgcGF5b3V0IGNhbGwgcG9vbCAxIHRvIGFzayBpdCBkbyBpdCBmaXJzdC4KLy8gSXQgd291bGQgYmUgNjAvNDAlIGluIHRoZSBwb29sUGN0T2ZXaG9sZSB2YWx1ZXMuICBUaGUgdG9rZW4gcmV3YXJkIHBheW91dHMgdGhlbiB1c2UgdGhlc2UgdmFsdWVzIGluc3RlYWQgb2YKLy8gdGhlaXIgJ2N1cnJlbnQnIHN0YWtlIHdoaWNoIGNoYW5nZXMgYXMgcGFydCBvZiB0aGUgcGF5b3V0cyB0aGVtc2VsdmVzIChhbmQgcGVvcGxlIGNvdWxkIGJlIGNoYW5naW5nIHN0YWtlCi8vIGR1cmluZyB0aGUgZXBvY2ggdXBkYXRlcyBhY3Jvc3MgcG9vbHMpCi8vCi8vIE11bHRpcGxlIHBvb2xzIHdpbGwgY2FsbCB1cyB2aWEgcG9vbCAxIChwb29sMi0+cG9vbDEtPnZhbGlkYXRvciwgZXRjLikgc28gZG9uJ3QgYXNzZXJ0IG9uIHBvb2wxIGNhbGxpbmcgbXVsdGlwbGUKLy8gdGltZXMgaW4gc2FtZSBlcG9jaC4gIEp1c3QgcmV0dXJuLgovLwovLyBAcGFyYW0gdmFsaWRhdG9ySWQgLSB2YWxpZGF0b3IgaWQgKGFuZCB0aHVzIHBvb2wpIGNhbGxpbmcgdXMuICBWZXJpZmllZCBzbyB0aGF0IHNlbmRlciBNVVNUIGJlIHBvb2wgMSBvZiB0aGlzIHZhbGlkYXRvci4KLy8gQHJldHVybnMgUG9vbFRva2VuUGF5b3V0UmF0aW8gLSB0aGUgZmluaXNoZWQgcmF0aW8gZGF0YQpzZXRUb2tlblBheW91dFJhdGlvOgoJcHJvdG8gMSAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gOAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU5OAoJLy8gcG9vbDFBcHBJRCA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkCglpbnQgMjY4CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMCAvLyBwb29sMUFwcElEOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1OTkKCS8vIGFzc2VydChwb29sMUFwcElEICE9PSAwKQoJZnJhbWVfZGlnIDAgLy8gcG9vbDFBcHBJRDogdWludDY0CglpbnQgMAoJIT0KCWFzc2VydAoKCS8vICppZjEzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjAxCgkvLyB0aGlzLnR4bi5zZW5kZXIgIT09IEFwcElELmZyb21VaW50NjQocG9vbDFBcHBJRCkuYWRkcmVzcwoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIDAgLy8gcG9vbDFBcHBJRDogdWludDY0CglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCSE9CglieiAqaWYxM19lbmQKCgkvLyAqaWYxM19jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MDIKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWIgKnNldFRva2VuUGF5b3V0UmF0aW8qcmV0dXJuCgoqaWYxM19lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MDgKCS8vIGN1clJvdW5kID0gZ2xvYmFscy5yb3VuZAoJZ2xvYmFsIFJvdW5kCglmcmFtZV9idXJ5IDEgLy8gY3VyUm91bmQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYwOQoJLy8gbGFzdFBheW91dFVwZGF0ZSA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUudG9rZW5QYXlvdXRSYXRpby51cGRhdGVkRm9yUGF5b3V0CglpbnQgODkyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCgkvLyAqaWYxNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYxMAoJLy8gbGFzdFBheW91dFVwZGF0ZSAhPT0gMAoJZnJhbWVfZGlnIDIgLy8gbGFzdFBheW91dFVwZGF0ZTogdWludDY0CglpbnQgMAoJIT0KCWJ6ICppZjE0X2VuZAoKCS8vICppZjE0X2NvbnNlcXVlbnQKCS8vICppZjE1X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjEyCgkvLyAoQXBwSUQuZnJvbVVpbnQ2NChwb29sMUFwcElEKS5nbG9iYWxTdGF0ZSgnbGFzdFBheW91dCcpIGFzIHVpbnQ2NCkgPT09IGxhc3RQYXlvdXRVcGRhdGUKCWZyYW1lX2RpZyAwIC8vIHBvb2wxQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDZjNjE3Mzc0NTA2MTc5NmY3NTc0IC8vICJsYXN0UGF5b3V0IgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQocG9vbDFBcHBJRCkuZ2xvYmFsU3RhdGUoJ2xhc3RQYXlvdXQnKQoJYXNzZXJ0CglmcmFtZV9kaWcgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCT09CglieiAqaWYxNV9lbmQKCgkvLyAqaWYxNV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MTMKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWIgKnNldFRva2VuUGF5b3V0UmF0aW8qcmV0dXJuCgoqaWYxNV9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MTUKCS8vIGVwb2NoUm91bmRMZW5ndGggPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lcG9jaFJvdW5kTGVuZ3RoIGFzIHVpbnQ2NAoJaW50IDE2OQoJaW50IDQKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDMgLy8gZXBvY2hSb3VuZExlbmd0aDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjE2CgkvLyB0aGlzRXBvY2hCZWdpbiA9IGN1clJvdW5kIC0gKGN1clJvdW5kICUgZXBvY2hSb3VuZExlbmd0aCkKCWZyYW1lX2RpZyAxIC8vIGN1clJvdW5kOiB1aW50NjQKCWZyYW1lX2RpZyAxIC8vIGN1clJvdW5kOiB1aW50NjQKCWZyYW1lX2RpZyAzIC8vIGVwb2NoUm91bmRMZW5ndGg6IHVpbnQ2NAoJJQoJLQoJZnJhbWVfYnVyeSA0IC8vIHRoaXNFcG9jaEJlZ2luOiB1aW50NjQKCgkvLyAqaWYxNl9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYxOAoJLy8gbGFzdFBheW91dFVwZGF0ZSAtIChsYXN0UGF5b3V0VXBkYXRlICUgZXBvY2hSb3VuZExlbmd0aCkgPT09IHRoaXNFcG9jaEJlZ2luCglmcmFtZV9kaWcgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCWZyYW1lX2RpZyAyIC8vIGxhc3RQYXlvdXRVcGRhdGU6IHVpbnQ2NAoJZnJhbWVfZGlnIDMgLy8gZXBvY2hSb3VuZExlbmd0aDogdWludDY0CgklCgktCglmcmFtZV9kaWcgNCAvLyB0aGlzRXBvY2hCZWdpbjogdWludDY0Cgk9PQoJYnogKmlmMTZfZW5kCgoJLy8gKmlmMTZfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjE5CgkvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS50b2tlblBheW91dFJhdGlvCglpbnQgNzAwIC8vIGhlYWRPZmZzZXQKCWludCAyMDAKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CgliICpzZXRUb2tlblBheW91dFJhdGlvKnJldHVybgoKKmlmMTZfZW5kOgoKKmlmMTRfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjIyCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8udXBkYXRlZEZvclBheW91dCA9IGN1clJvdW5kCglpbnQgODkyCglmcmFtZV9kaWcgMSAvLyBjdXJSb3VuZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYyNAoJLy8gY3VyTnVtUG9vbHMgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnN0YXRlLm51bVBvb2xzIGFzIHVpbnQ2NAoJaW50IDI0MgoJaW50IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDUgLy8gY3VyTnVtUG9vbHM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYyNQoJLy8gdG90YWxTdGFrZUZvclZhbGlkYXRvciA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUudG90YWxBbGdvU3Rha2VkCglpbnQgMjUyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgNiAvLyB0b3RhbFN0YWtlRm9yVmFsaWRhdG9yOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MjYKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgY3VyTnVtUG9vbHM7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDcgLy8gaTogdWludDY0CgoqZm9yXzI6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MjYKCS8vIGkgPCBjdXJOdW1Qb29scwoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglmcmFtZV9kaWcgNSAvLyBjdXJOdW1Qb29sczogdWludDY0Cgk8CglieiAqZm9yXzJfZW5kCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjMxCgkvLyBvdXJQb29sUGN0T2ZXaG9sZSA9IHdpZGVSYXRpbygKCS8vICAgICAgICAgICAgICAgICBbdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1tpXS50b3RhbEFsZ29TdGFrZWQsIDFfMDAwXzAwMF0sCgkvLyAgICAgICAgICAgICAgICAgW3RvdGFsU3Rha2VGb3JWYWxpZGF0b3JdLAoJLy8gICAgICAgICAgICAgKQoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglpbnQgMV8wMDBfMDAwCgltdWx3CglpbnQgMAoJZnJhbWVfZGlnIDYgLy8gdG90YWxTdGFrZUZvclZhbGlkYXRvcjogdWludDY0CglkaXZtb2R3Cglwb3AKCXBvcAoJc3dhcAoJIQoKCS8vIHdpZGVSYXRpbyBmYWlsZWQKCWFzc2VydAoJZnJhbWVfYnVyeSA4IC8vIG91clBvb2xQY3RPZldob2xlOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MzUKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUudG9rZW5QYXlvdXRSYXRpby5wb29sUGN0T2ZXaG9sZVtpXSA9IG91clBvb2xQY3RPZldob2xlCglpbnQgNzAwCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWZyYW1lX2RpZyA4IC8vIG91clBvb2xQY3RPZldob2xlOiB1aW50NjQKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoqZm9yXzJfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MjYKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSA3IC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzIKCipmb3JfMl9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MzcKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCipzZXRUb2tlblBheW91dFJhdGlvKnJldHVybjoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDgKCXJldHN1YgoKLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcygodWludDY0LHVpbnQ2NCx1aW50NjQpLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkCiphYmlfcm91dGVfc3Rha2VVcGRhdGVkVmlhUmV3YXJkczoKCS8vIHNhdHVyYXRlZEJ1cm5Ub0ZlZVNpbms6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQoJYnRvaQoKCS8vIHZhbGlkYXRvckNvbW1pc3Npb246IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAoJYnRvaQoKCS8vIHJld2FyZFRva2VuQW1vdW50UmVzZXJ2ZWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwoJYnRvaQoKCS8vIGFsZ29Ub0FkZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglidG9pCgoJLy8gcG9vbEtleTogKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZHVwCglsZW4KCWludCAyNAoJPT0KCgkvLyBhcmd1bWVudCA0IChwb29sS2V5KSBmb3Igc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyBtdXN0IGJlIGEgKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBzdGFrZVVwZGF0ZWRWaWFSZXdhcmRzKCh1aW50NjQsdWludDY0LHVpbnQ2NCksdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKCWNhbGxzdWIgc3Rha2VVcGRhdGVkVmlhUmV3YXJkcwoJaW50IDEKCXJldHVybgoKLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyhwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5LCBhbGdvVG9BZGQ6IHVpbnQ2NCwgcmV3YXJkVG9rZW5BbW91bnRSZXNlcnZlZDogdWludDY0LCB2YWxpZGF0b3JDb21taXNzaW9uOiB1aW50NjQsIHNhdHVyYXRlZEJ1cm5Ub0ZlZVNpbms6IHVpbnQ2NCk6IHZvaWQKLy8KLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyBpcyBjYWxsZWQgYnkgU3Rha2luZyBwb29scyB0byBpbmZvcm0gdGhlIHZhbGlkYXRvciAodXMpIHRoYXQgYSBwYXJ0aWN1bGFyIGFtb3VudCBvZiB0b3RhbAovLyBzdGFrZSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgc3BlY2lmaWVkIHBvb2wuICBUaGlzIGlzIHVzZWQgdG8gdXBkYXRlIHRoZSBzdGF0cyB3ZSBoYXZlIGluIG91ciBQb29sSW5mbyBzdG9yYWdlLgovLyBUaGUgY2FsbGluZyBBcHAgaWQgaXMgdmFsaWRhdGVkIGFnYWluc3Qgb3VyIHBvb2wgbGlzdCBhcyB3ZWxsLgovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBWYWxpZGF0b3JQb29sS2V5IHR5cGUKLy8gQHBhcmFtIHt1aW50NjR9IGFsZ29Ub0FkZCAtIGFtb3VudCB0aGlzIHZhbGlkYXRvcidzIHRvdGFsIHN0YWtlIGluY3JlYXNlZCB2aWEgcmV3YXJkcwovLyBAcGFyYW0ge3VpbnQ2NH0gcmV3YXJkVG9rZW5BbW91bnRSZXNlcnZlZCAtIGFtb3VudCB0aGlzIHZhbGlkYXRvcidzIHRvdGFsIHN0YWtlIGluY3JlYXNlZCB2aWEgcmV3YXJkcyAodGhhdCBzaG91bGQgYmUKLy8gQHBhcmFtIHt1aW50NjR9IHZhbGlkYXRvckNvbW1pc3Npb24gLSB0aGUgY29tbWlzc2lvbiBhbW91bnQgdGhlIHZhbGlkYXRvciB3YXMgcGFpZCwgaWYgYW55Ci8vIEBwYXJhbSB7dWludDY0fSBzYXR1cmF0ZWRCdXJuVG9GZWVTaW5rIC0gaWYgdGhlIHBvb2wgd2FzIGluIHNhdHVyYXRlZCBzdGF0ZSwgdGhlIGFtb3VudCBzZW50IGJhY2sgdG8gdGhlIGZlZSBzaW5rLgovLyBzZWVuIGFzICdhY2NvdW50ZWQgZm9yL3BlbmRpbmcgc3BlbnQnKQpzdGFrZVVwZGF0ZWRWaWFSZXdhcmRzOgoJcHJvdG8gNSAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjU4CgkvLyB0aGlzLnZlcmlmeVBvb2xLZXlDYWxsZXIocG9vbEtleSkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CgljYWxsc3ViIHZlcmlmeVBvb2xLZXlDYWxsZXIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NjEKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCArPSBhbGdvVG9BZGQKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAxMCAvLyBoZWFkT2Zmc2V0CgkrCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NjIKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS50b3RhbEFsZ29TdGFrZWQgKz0gYWxnb1RvQWRkCglpbnQgMjUyCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMiAvLyBhbGdvVG9BZGQ6IHVpbnQ2NAoJKwoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjYzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUucmV3YXJkVG9rZW5IZWxkQmFjayArPSByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkCglpbnQgMjYwCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkOiB1aW50NjQKCSsKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY2NQoJLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgKz0gYWxnb1RvQWRkCglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglhcHBfZ2xvYmFsX2dldAoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CgkrCglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglzd2FwCglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY2OAoJLy8gdGhpcy5yZXZlcmlmeU5GRE93bmVyc2hpcChwb29sS2V5LmlkKQoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCgljYWxsc3ViIHJldmVyaWZ5TkZET3duZXJzaGlwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjcwCgkvLyB0aGlzLnJldGlPUF9lcG9jaFJld2FyZFVwZGF0ZS5sb2coewoJLy8gICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLAoJLy8gICAgICAgICAgICAgYWxnb0FkZGVkOiBhbGdvVG9BZGQsCgkvLyAgICAgICAgICAgICByZXdhcmRUb2tlbkhlbGRCYWNrOiByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkLAoJLy8gICAgICAgICAgICAgc2F0dXJhdGVkQnVyblRvRmVlU2luazogc2F0dXJhdGVkQnVyblRvRmVlU2luaywKCS8vICAgICAgICAgICAgIHZhbGlkYXRvckNvbW1pc3Npb246IHZhbGlkYXRvckNvbW1pc3Npb24sCgkvLyAgICAgICAgIH0pCglieXRlIDB4YjNlNDdjM2QgLy8gcmV0aU9QX2Vwb2NoUmV3YXJkVXBkYXRlKHVpbnQ2NCx1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTQgLy8gdmFsaWRhdG9yQ29tbWlzc2lvbjogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtNSAvLyBzYXR1cmF0ZWRCdXJuVG9GZWVTaW5rOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY29uY2F0Cglsb2cKCXJldHN1YgoKLy8gc3Rha2VSZW1vdmVkKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wpdm9pZAoqYWJpX3JvdXRlX3N0YWtlUmVtb3ZlZDoKCS8vIHN0YWtlclJlbW92ZWQ6IGJvb2wKCXR4bmEgQXBwbGljYXRpb25BcmdzIDUKCWR1cAoJbGVuCglpbnQgMQoJPT0KCgkvLyBhcmd1bWVudCAwIChzdGFrZXJSZW1vdmVkKSBmb3Igc3Rha2VSZW1vdmVkIG11c3QgYmUgYSBib29sCglhc3NlcnQKCWludCAwCglnZXRiaXQKCgkvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDQKCWJ0b2kKCgkvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDMKCWJ0b2kKCgkvLyBzdGFrZXI6IGFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMzIKCT09CgoJLy8gYXJndW1lbnQgMyAoc3Rha2VyKSBmb3Igc3Rha2VSZW1vdmVkIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBwb29sS2V5OiAodWludDY0LHVpbnQ2NCx1aW50NjQpCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDI0Cgk9PQoKCS8vIGFyZ3VtZW50IDQgKHBvb2xLZXkpIGZvciBzdGFrZVJlbW92ZWQgbXVzdCBiZSBhICh1aW50NjQsdWludDY0LHVpbnQ2NCkKCWFzc2VydAoKCS8vIGV4ZWN1dGUgc3Rha2VSZW1vdmVkKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wpdm9pZAoJY2FsbHN1YiBzdGFrZVJlbW92ZWQKCWludCAxCglyZXR1cm4KCi8vIHN0YWtlUmVtb3ZlZChwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5LCBzdGFrZXI6IEFkZHJlc3MsIGFtb3VudFJlbW92ZWQ6IHVpbnQ2NCwgcmV3YXJkUmVtb3ZlZDogdWludDY0LCBzdGFrZXJSZW1vdmVkOiBib29sZWFuKTogdm9pZAovLwovLyBzdGFrZVJlbW92ZWQgaXMgY2FsbGVkIGJ5IFN0YWtpbmcgcG9vbHMgdG8gaW5mb3JtIHRoZSB2YWxpZGF0b3IgKHVzKSB0aGF0IGEgcGFydGljdWxhciBhbW91bnQgb2YgdG90YWwgc3Rha2UgaGFzIGJlZW4gcmVtb3ZlZAovLyBmcm9tIHRoZSBzcGVjaWZpZWQgcG9vbC4gIFRoaXMgaXMgdXNlZCB0byB1cGRhdGUgdGhlIHN0YXRzIHdlIGhhdmUgaW4gb3VyIFBvb2xJbmZvIHN0b3JhZ2UuCi8vIElmIGFueSBhbW91bnQgb2YgcmV3YXJkUmVtb3ZlZCBpcyBzcGVjaWZpZWQsIHRoZW4gdGhhdCBhbW91bnQgb2YgcmV3YXJkIGlzIHNlbnQgdG8gdGhlIHVzZQovLyBUaGUgY2FsbGluZyBBcHAgaWQgaXMgdmFsaWRhdGVkIGFnYWluc3Qgb3VyIHBvb2wgbGlzdCBhcyB3ZWxsLgovLwovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgY2FsbGluZyB1cyBmcm9tIHdoaWNoIHN0YWtlIHdhcyByZW1vdmVkCi8vIEBwYXJhbSB7QWRkcmVzc30gc3Rha2VyCi8vIEBwYXJhbSB7dWludDY0fSBhbW91bnRSZW1vdmVkIC0gYWxnbyBhbW91bnQgcmVtb3ZlZAovLyBAcGFyYW0ge3VpbnQ2NH0gcmV3YXJkUmVtb3ZlZCAtIGlmIGFwcGxpY2FibGUsIGFtb3VudCBvZiB0b2tlbiByZXdhcmQgcmVtb3ZlZCAoYnkgcG9vbCAxIGNhbGxlcikgb3IgVE8gcmVtb3ZlIGFuZCBwYXkgb3V0ICh2aWEgcG9vbCAxIGZyb20gZGlmZmVyZW50IHBvb2wgY2FsbGVyKQovLyBAcGFyYW0ge2Jvb2xlYW59IHN0YWtlclJlbW92ZWQKc3Rha2VSZW1vdmVkOgoJcHJvdG8gNSAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMwoKCS8vICppZjE3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzAwCgkvLyBnbG9iYWxzLm9wY29kZUJ1ZGdldCA8IDMwMAoJZ2xvYmFsIE9wY29kZUJ1ZGdldAoJaW50IDMwMAoJPAoJYnogKmlmMTdfZW5kCgoJLy8gKmlmMTdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzAxCgkvLyBpbmNyZWFzZU9wY29kZUJ1ZGdldCgpCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJaW50IDAKCWl0eG5fZmllbGQgRmVlCglieXRlIGI2NCBDb0VCIC8vICNwcmFnbWEgdmVyc2lvbiAxMDsgaW50IDEKCWR1cAoJaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCWludCBEZWxldGVBcHBsaWNhdGlvbgoJaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KCWl0eG5fc3VibWl0CgoqaWYxN19lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MDMKCS8vIHRoaXMudmVyaWZ5UG9vbEtleUNhbGxlcihwb29sS2V5KQoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWNhbGxzdWIgdmVyaWZ5UG9vbEtleUNhbGxlcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcwNwoJLy8gYXNzZXJ0KGFtb3VudFJlbW92ZWQgPiAwIHx8IHJld2FyZFJlbW92ZWQgPiAwLCAnc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGFsZ28gb3IgcmV3YXJkIHdhcyByZW1vdmVkJykKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWludCAwCgk+CglkdXAKCWJueiAqc2tpcF9vcjIKCWZyYW1lX2RpZyAtNCAvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCWludCAwCgk+Cgl8fAoKKnNraXBfb3IyOgoJLy8gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGFsZ28gb3IgcmV3YXJkIHdhcyByZW1vdmVkCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MTAKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCAtPSBhbW91bnRSZW1vdmVkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxMQoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsQWxnb1N0YWtlZCAtPSBhbW91bnRSZW1vdmVkCglpbnQgMjUyCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxMgoJLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgLT0gYW1vdW50UmVtb3ZlZAoJYnl0ZSAweDczNzQ2MTZiNjU2NCAvLyAic3Rha2VkIgoJYXBwX2dsb2JhbF9nZXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCXN3YXAKCWFwcF9nbG9iYWxfcHV0CgoJLy8gKmlmMThfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MTQKCS8vIHJld2FyZFJlbW92ZWQgPiAwCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CglpbnQgMAoJPgoJYnogKmlmMThfZWxzZQoKCS8vICppZjE4X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxNQoJLy8gcmV3YXJkVG9rZW5JRCA9IHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5jb25maWcucmV3YXJkVG9rZW5JZAoJaW50IDE1MwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIHJld2FyZFRva2VuSUQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxNgoJLy8gYXNzZXJ0KHJld2FyZFRva2VuSUQgIT09IDAsICJyZXdhcmRSZW1vdmVkIGNhbid0IGJlIHNldCBpZiB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIHJld2FyZCB0b2tlbiEiKQoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JRDogdWludDY0CglpbnQgMAoJIT0KCgkvLyByZXdhcmRSZW1vdmVkIGNhbid0IGJlIHNldCBpZiB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIHJld2FyZCB0b2tlbiEKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxNwoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS5yZXdhcmRUb2tlbkhlbGRCYWNrID49IHJld2FyZFJlbW92ZWQsCgkvLyAgICAgICAgICAgICAgICAgJ3Jld2FyZCBiZWluZyByZW1vdmVkIG11c3QgYmUgY292ZXJlZCBieSBob2xkIGJhY2sgYW1vdW50JywKCS8vICAgICAgICAgICAgICkKCWludCAyNjAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtNCAvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCT49CgoJLy8gcmV3YXJkIGJlaW5nIHJlbW92ZWQgbXVzdCBiZSBjb3ZlcmVkIGJ5IGhvbGQgYmFjayBhbW91bnQKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyMwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnJld2FyZFRva2VuSGVsZEJhY2sgLT0gcmV3YXJkUmVtb3ZlZAoJaW50IDI2MAoJZHVwCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CgktCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyAqaWYxOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyOAoJLy8gcG9vbEtleS5wb29sSWQgIT09IDEKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCSE9CglieiAqaWYxOV9lbmQKCgkvLyAqaWYxOV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MjkKCS8vIHNlbmRNZXRob2RDYWxsPHR5cGVvZiBTdGFraW5nUG9vbC5wcm90b3R5cGUucGF5VG9rZW5SZXdhcmQ+KHsKCS8vICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRDogQXBwSUQuZnJvbVVpbnQ2NCh0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJnczogW3N0YWtlciwgcmV3YXJkVG9rZW5JRCwgcmV3YXJkUmVtb3ZlZF0sCgkvLyAgICAgICAgICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgltZXRob2QgInBheVRva2VuUmV3YXJkKGFkZHJlc3MsdWludDY0LHVpbnQ2NCl2b2lkIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MzAKCS8vIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQodGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzWzBdLnBvb2xBcHBJZCkKCWludCAyNjgKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczMQoJLy8gbWV0aG9kQXJnczogW3N0YWtlciwgcmV3YXJkVG9rZW5JRCwgcmV3YXJkUmVtb3ZlZF0KCWZyYW1lX2RpZyAtMiAvLyBzdGFrZXI6IEFkZHJlc3MKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklEOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCippZjE5X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczNAoJLy8gdGhpcy5yZXRpT1Bfc3Rha2VSZW1vdmVkLmxvZyh7CgkvLyAgICAgICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICAgICAgcG9vbE51bTogcG9vbEtleS5wb29sSWQgYXMgdWludDE2LAoJLy8gICAgICAgICAgICAgICAgIHBvb2xBcHBJZDogQXBwSUQuZnJvbVVpbnQ2NChwb29sS2V5LnBvb2xBcHBJZCksCgkvLyAgICAgICAgICAgICAgICAgc3Rha2VyOiBzdGFrZXIsCgkvLyAgICAgICAgICAgICAgICAgYW1vdW50VW5zdGFrZWQ6IGFtb3VudFJlbW92ZWQsCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5Bc3NldElkOiBBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JRCksCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5zUmVjZWl2ZWQ6IHJld2FyZFJlbW92ZWQsCgkvLyAgICAgICAgICAgICB9KQoJYnl0ZSAweDEyZjRiZDRiIC8vIHJldGlPUF9zdGFrZVJlbW92ZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTIgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC00IC8vIHJld2FyZFJlbW92ZWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklEOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWIgKmlmMThfZW5kCgoqaWYxOF9lbHNlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzQ0CgkvLyB0aGlzLnJldGlPUF9zdGFrZVJlbW92ZWQubG9nKHsKCS8vICAgICAgICAgICAgICAgICBpZDogcG9vbEtleS5pZCwKCS8vICAgICAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICAgICAgcG9vbEFwcElkOiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICBzdGFrZXI6IHN0YWtlciwKCS8vICAgICAgICAgICAgICAgICBhbW91bnRVbnN0YWtlZDogYW1vdW50UmVtb3ZlZCwKCS8vICAgICAgICAgICAgICAgICAvLyBubyB0b2tlbnMgcmV3YXJkZWQuLgoJLy8gICAgICAgICAgICAgICAgIHJld2FyZFRva2VuQXNzZXRJZDogQXNzZXRJRC56ZXJvSW5kZXgsCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5zUmVjZWl2ZWQ6IDAsCgkvLyAgICAgICAgICAgICB9KQoJYnl0ZSAweDEyZjRiZDRiIC8vIHJldGlPUF9zdGFrZVJlbW92ZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTIgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAKCWNvbmNhdAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCippZjE4X2VuZDoKCS8vICppZjIwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzU2CgkvLyBzdGFrZXJSZW1vdmVkCglmcmFtZV9kaWcgLTUgLy8gc3Rha2VyUmVtb3ZlZDogYm9vbGVhbgoJYnogKmlmMjBfZW5kCgoJLy8gKmlmMjBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzU4CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbcG9vbEtleS5wb29sSWQgLSAxXS50b3RhbFN0YWtlcnMgLT0gMQoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJaW50IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDEKCS0KCWl0b2IKCWV4dHJhY3QgNiAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NjAKCS8vIHJlbW92ZVJldCA9IHRoaXMucmVtb3ZlRnJvbVN0YWtlclBvb2xTZXQoc3Rha2VyLCA8VmFsaWRhdG9yUG9vbEtleT57CgkvLyAgICAgICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICAgICAgcG9vbElkOiBwb29sS2V5LnBvb2xJZCwKCS8vICAgICAgICAgICAgICAgICBwb29sQXBwSWQ6IHBvb2xLZXkucG9vbEFwcElkLAoJLy8gICAgICAgICAgICAgfSkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY2FsbHN1YiByZW1vdmVGcm9tU3Rha2VyUG9vbFNldAoJZnJhbWVfYnVyeSAxIC8vIHJlbW92ZVJldDogKGJvb2wsYm9vbCkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NjUKCS8vIHN0YWtlck91dE9mVGhpc1ZhbGlkYXRvciA9IHJlbW92ZVJldFswXQoJZnJhbWVfZGlnIDEgLy8gcmVtb3ZlUmV0OiAoYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWludCAwCglnZXRiaXQKCWZyYW1lX2J1cnkgMiAvLyBzdGFrZXJPdXRPZlRoaXNWYWxpZGF0b3I6IGJvb2wKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NjYKCS8vIHN0YWtlck91dE9mUHJvdG9jb2wgPSByZW1vdmVSZXRbMV0KCWZyYW1lX2RpZyAxIC8vIHJlbW92ZVJldDogKGJvb2wsYm9vbCkKCXN0b3JlIDI1NSAvLyBmdWxsIGFycmF5Cglsb2FkIDI1NSAvLyBmdWxsIGFycmF5CglpbnQgMQoJZ2V0Yml0CglmcmFtZV9idXJ5IDMgLy8gc3Rha2VyT3V0T2ZQcm90b2NvbDogYm9vbAoKCS8vICppZjIxX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzY4CgkvLyBzdGFrZXJPdXRPZlRoaXNWYWxpZGF0b3IKCWZyYW1lX2RpZyAyIC8vIHN0YWtlck91dE9mVGhpc1ZhbGlkYXRvcjogYm9vbAoJYnogKmlmMjFfZW5kCgoJLy8gKmlmMjFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzY5CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUudG90YWxTdGFrZXJzIC09IDEKCWludCAyNDQKCWR1cAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDEKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKKmlmMjFfZW5kOgoJLy8gKmlmMjJfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NzIKCS8vIHN0YWtlck91dE9mUHJvdG9jb2wKCWZyYW1lX2RpZyAzIC8vIHN0YWtlck91dE9mUHJvdG9jb2w6IGJvb2wKCWJ6ICppZjIyX2VuZAoKCS8vICppZjIyX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc3MwoJLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlIC09IDEKCWJ5dGUgMHg2ZTc1NmQ1Mzc0NjE2YjY1NzI3MyAvLyAibnVtU3Rha2VycyIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMQoJLQoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJc3dhcAoJYXBwX2dsb2JhbF9wdXQKCippZjIyX2VuZDoKCippZjIwX2VuZDoKCXJldHN1YgoKLy8gZmluZFBvb2xGb3JTdGFrZXIodWludDY0LGFkZHJlc3MsdWludDY0KSgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKKmFiaV9yb3V0ZV9maW5kUG9vbEZvclN0YWtlcjoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gYW1vdW50VG9TdGFrZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglidG9pCgoJLy8gc3Rha2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDEgKHN0YWtlcikgZm9yIGZpbmRQb29sRm9yU3Rha2VyIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBmaW5kUG9vbEZvclN0YWtlcih1aW50NjQsYWRkcmVzcyx1aW50NjQpKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJY2FsbHN1YiBmaW5kUG9vbEZvclN0YWtlcgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGZpbmRQb29sRm9yU3Rha2VyKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIHN0YWtlcjogQWRkcmVzcywgYW1vdW50VG9TdGFrZTogdWludDY0KTogW1ZhbGlkYXRvclBvb2xLZXksIGJvb2xlYW4sIGJvb2xlYW5dCi8vCi8vIEZpbmRzIHRoZSBwb29sIGZvciBhIHN0YWtlciBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgdmFsaWRhdG9yIGlkLCBzdGFrZXIgYWRkcmVzcywgYW5kIGFtb3VudCB0byBzdGFrZS4KLy8gRmlyc3QgY2hlY2tzIHRoZSBzdGFrZXJzICdhbHJlYWR5IHN0YWtlZCBsaXN0JyBmb3IgdGhlIHZhbGlkYXRvciBwcmVmZXJyaW5nIHRob3NlIChhZGRpbmcgaWYgcG9zc2libGUpIHRoZW4gYWRkcwovLyB0byBuZXcgcG9vbCBpZiBuZWNlc3NhcnkuCi8vCi8vIEBwYXJhbSB7VmFsaWRhdG9ySWRUeXBlfSB2YWxpZGF0b3JJZCAtIFRoZSBpZCBvZiB0aGUgdmFsaWRhdG9yLgovLyBAcGFyYW0ge0FkZHJlc3N9IHN0YWtlciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzdGFrZXIuCi8vIEBwYXJhbSB7dWludDY0fSBhbW91bnRUb1N0YWtlIC0gVGhlIGFtb3VudCB0byBzdGFrZS4KLy8gQHJldHVybnMge1ZhbGlkYXRvclBvb2xLZXksIGJvb2xlYW4sIGJvb2xlYW59IC0gVGhlIHBvb2wgZm9yIHRoZSBzdGFrZXIsIHRydWUvZmFsc2Ugb24gd2hldGhlciB0aGUgc3Rha2VyIGlzICduZXcnCi8vIHRvIHRoaXMgVkFMSURBVE9SLCBhbmQgdHJ1ZS9mYWxzZSBpZiBzdGFrZXIgaXMgbmV3IHRvIHRoZSBwcm90b2NvbC4KZmluZFBvb2xGb3JTdGFrZXI6Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA3CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Nzk0CgkvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yID0gdHJ1ZQoJaW50IDEKCWZyYW1lX2J1cnkgMCAvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yOiBib29sCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Nzk1CgkvLyBpc05ld1N0YWtlclRvUHJvdG9jb2wgPSB0cnVlCglpbnQgMQoJZnJhbWVfYnVyeSAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgwMwoJLy8gbWF4UGVyUG9vbCA9IHRoaXMuZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sCglmcmFtZV9idXJ5IDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoJLy8gKmlmMjNfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MDYKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLmV4aXN0cwoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfbGVuCglzd2FwCglwb3AKCWJ6ICppZjIzX2VuZAoKCS8vICppZjIzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgwNwoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgwOAoJLy8gYXNzZXJ0KHZhbGlkYXRvcklkICE9PSAwKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWludCAwCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODA5CgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IHBvb2xTZXQubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoKKmZvcl8zOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODA5CgkvLyBpIDwgcG9vbFNldC5sZW5ndGgKCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDYKCTwKCWJ6ICpmb3JfM19lbmQKCgkvLyAqaWYyNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxMAoJLy8gZ2xvYmFscy5vcGNvZGVCdWRnZXQgPCAzMDAKCWdsb2JhbCBPcGNvZGVCdWRnZXQKCWludCAzMDAKCTwKCWJ6ICppZjI0X2VuZAoKCS8vICppZjI0X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxMQoJLy8gaW5jcmVhc2VPcGNvZGVCdWRnZXQoKQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCWludCAwCglpdHhuX2ZpZWxkIEZlZQoJYnl0ZSBiNjQgQ29FQiAvLyAjcHJhZ21hIHZlcnNpb24gMTA7IGludCAxCglkdXAKCWl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCglpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCglpbnQgRGVsZXRlQXBwbGljYXRpb24KCWl0eG5fZmllbGQgT25Db21wbGV0aW9uCglpdHhuX3N1Ym1pdAoKKmlmMjRfZW5kOgoJLy8gKmlmMjVfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MTMKCS8vIHBvb2xTZXRbaV0uaWQgPT09IDAKCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgk9PQoJYnogKmlmMjVfZW5kCgoJLy8gKmlmMjVfY29uc2VxdWVudAoJYiAqZm9yXzNfY29udGludWUKCippZjI1X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxNgoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sID0gZmFsc2UKCWludCAwCglmcmFtZV9idXJ5IDEgLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sCgoJLy8gKmlmMjZfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MTcKCS8vIHBvb2xTZXRbaV0uaWQgPT09IHZhbGlkYXRvcklkCglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgMAoJKwoJaW50IDgKCWV4dHJhY3QzCglidG9pCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJPT0KCWJ6ICppZjI2X2VuZAoKCS8vICppZjI2X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxOQoJLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciA9IGZhbHNlCglpbnQgMAoJZnJhbWVfYnVyeSAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCgkvLyAqaWYyN19jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyMQoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1twb29sU2V0W2ldLnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCArCgkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50VG9TdGFrZSA8PQoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4UGVyUG9vbAoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgOCAvLyBoZWFkT2Zmc2V0CgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJKwoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8PQoJYnogKmlmMjdfZW5kCgoJLy8gKmlmMjdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODI1CgkvLyByZXR1cm4gW3Bvb2xTZXRbaV0sIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IsIGlzTmV3U3Rha2VyVG9Qcm90b2NvbF0KCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWJ5dGUgMHgwMAoJaW50IDAKCWZyYW1lX2RpZyAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCXNldGJpdAoJaW50IDEKCWZyYW1lX2RpZyAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoJc2V0Yml0Cgljb25jYXQKCWIgKmZpbmRQb29sRm9yU3Rha2VyKnJldHVybgoKKmlmMjdfZW5kOgoKKmlmMjZfZW5kOgoKKmZvcl8zX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODA5CgkvLyBpICs9IDEKCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgNCAvLyBpOiB1aW50NjQKCWIgKmZvcl8zCgoqZm9yXzNfZW5kOgoKKmlmMjNfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODMyCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBhbW91bnRUb1N0YWtlID49IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1pbkVudHJ5U3Rha2UsCgkvLyAgICAgICAgICAgICAnbXVzdCBzdGFrZSBhdCBsZWFzdCB0aGUgbWluaW11bSBmb3IgdGhpcyBwb29sJywKCS8vICAgICAgICAgKQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJaW50IDIwOQoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk+PQoKCS8vIG11c3Qgc3Rha2UgYXQgbGVhc3QgdGhlIG1pbmltdW0gZm9yIHRoaXMgcG9vbAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODM4CgkvLyBwb29scyA9IGNsb25lKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHMpCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWludCA0MzIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglmcmFtZV9idXJ5IDUgLy8gcG9vbHM6ICh1aW50NjQsdWludDE2LHVpbnQ2NClbMjRdCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODM5CgkvLyBjdXJOdW1Qb29scyA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUubnVtUG9vbHMgYXMgdWludDY0CglpbnQgMjQyCglpbnQgMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgNiAvLyBjdXJOdW1Qb29sczogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQwCgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IGN1ck51bVBvb2xzOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA3IC8vIGk6IHVpbnQ2NAoKKmZvcl80OgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQwCgkvLyBpIDwgY3VyTnVtUG9vbHMKCWZyYW1lX2RpZyA3IC8vIGk6IHVpbnQ2NAoJZnJhbWVfZGlnIDYgLy8gY3VyTnVtUG9vbHM6IHVpbnQ2NAoJPAoJYnogKmZvcl80X2VuZAoKCS8vICppZjI4X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQxCgkvLyBwb29sc1tpXS50b3RhbEFsZ29TdGFrZWQgKyBhbW91bnRUb1N0YWtlIDw9IG1heFBlclBvb2wKCWZyYW1lX2RpZyA1IC8vIHBvb2xzOiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJKwoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8PQoJYnogKmlmMjhfZW5kCgoJLy8gKmlmMjhfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQyCgkvLyByZXR1cm4gWwoJLy8gICAgICAgICAgICAgICAgICAgICB7IGlkOiB2YWxpZGF0b3JJZCwgcG9vbElkOiBpICsgMSwgcG9vbEFwcElkOiBwb29sc1tpXS5wb29sQXBwSWQgfSwKCS8vICAgICAgICAgICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciwKCS8vICAgICAgICAgICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1Byb3RvY29sLAoJLy8gICAgICAgICAgICAgICAgIF0KCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxCgkrCglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyA1IC8vIHBvb2xzOiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglieXRlIDB4MDAKCWludCAwCglmcmFtZV9kaWcgMCAvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yOiBib29sCglzZXRiaXQKCWludCAxCglmcmFtZV9kaWcgMSAvLyBpc05ld1N0YWtlclRvUHJvdG9jb2w6IGJvb2wKCXNldGJpdAoJY29uY2F0CgliICpmaW5kUG9vbEZvclN0YWtlcipyZXR1cm4KCippZjI4X2VuZDoKCipmb3JfNF9jb250aW51ZToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg0MAoJLy8gaSArPSAxCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDcgLy8gaTogdWludDY0CgliICpmb3JfNAoKKmZvcl80X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg1MAoJLy8gcmV0dXJuIFt7IGlkOiB2YWxpZGF0b3JJZCwgcG9vbElkOiAwLCBwb29sQXBwSWQ6IDAgfSwgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciwgaXNOZXdTdGFrZXJUb1Byb3RvY29sXQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCgljb25jYXQKCWJ5dGUgMHgwMAoJaW50IDAKCWZyYW1lX2RpZyAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCXNldGJpdAoJaW50IDEKCWZyYW1lX2RpZyAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoJc2V0Yml0Cgljb25jYXQKCipmaW5kUG9vbEZvclN0YWtlcipyZXR1cm46CgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCgkvLyBwb3AgYWxsIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHRoZSBzdGFjawoJcG9wbiA3CglyZXRzdWIKCi8vIG1vdmVQb29sVG9Ob2RlKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKKmFiaV9yb3V0ZV9tb3ZlUG9vbFRvTm9kZToKCS8vIG5vZGVOdW06IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwoJYnRvaQoKCS8vIHBvb2xBcHBJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglidG9pCgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgbW92ZVBvb2xUb05vZGUodWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZAoJY2FsbHN1YiBtb3ZlUG9vbFRvTm9kZQoJaW50IDEKCXJldHVybgoKLy8gbW92ZVBvb2xUb05vZGUodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcG9vbEFwcElkOiB1aW50NjQsIG5vZGVOdW06IHVpbnQ2NCk6IHZvaWQKLy8KLy8gRmluZCB0aGUgc3BlY2lmaWVkIHBvb2wgKGluIGFueSBub2RlIG51bWJlcikgYW5kIG1vdmUgaXQgdG8gdGhlIHNwZWNpZmllZCBub2RlLgovLyBUaGUgcG9vbCBhY2NvdW50IGlzIGZvcmNlZCBvZmZsaW5lIGlmIG1vdmVkIHNvIHByaW9yIG5vZGUgd2lsbCBzdGlsbCBydW4gZm9yIDMyMCByb3VuZHMgYnV0Ci8vIG5ldyBrZXkgZ29lcyBvbmxpbmUgb24gbmV3IG5vZGUgc29vbiBhZnRlciAoMzIwIHJvdW5kcyBhZnRlciBpdCBnb2VzIG9ubGluZSkKLy8gTm8tb3AgaWYgc3VjY2VzcywgYXNzZXJ0cyBpZiBub3QgZm91bmQgb3IgY2FuJ3QgbW92ZSAgKG5vIHNwYWNlIGluIHRhcmdldCkKLy8gWyBPTkxZIE9XTkVSIE9SIE1BTkFHRVIgQ0FOIENIQU5HRSBdCi8vCi8vIEBwYXJhbSB7VmFsaWRhdG9ySWRUeXBlfSB2YWxpZGF0b3JJZCAtIFRoZSBpZCBvZiB0aGUgdmFsaWRhdG9yLgovLyBAcGFyYW0ge3VpbnQ2NH0gcG9vbEFwcElkCi8vIEBwYXJhbSB7dWludDY0fSBub2RlTnVtCm1vdmVQb29sVG9Ob2RlOgoJcHJvdG8gMyAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg2NQoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lck9yTWFuYWdlcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyT3JNYW5hZ2VyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODY3CgkvLyBub2RlUG9vbEFzc2lnbm1lbnRzID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5ub2RlUG9vbEFzc2lnbm1lbnRzKQoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfYnVyeSAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NjgKCS8vIGFzc2VydChub2RlTnVtID49IDEgJiYgbm9kZU51bSA8PSBNQVhfTk9ERVMsICdub2RlIG51bWJlciBvdXQgb2YgYWxsb3dhYmxlIHJhbmdlJykKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCAxCgk+PQoJZHVwCglieiAqc2tpcF9hbmQyCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgOAoJPD0KCSYmCgoqc2tpcF9hbmQyOgoJLy8gbm9kZSBudW1iZXIgb3V0IG9mIGFsbG93YWJsZSByYW5nZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODcwCgkvLyBmb3IgKGxldCBzcmNOb2RlSWR4ID0gMDsgc3JjTm9kZUlkeCA8IE1BWF9OT0RFUzsgc3JjTm9kZUlkeCArPSAxKQoJaW50IDAKCWZyYW1lX2J1cnkgMSAvLyBzcmNOb2RlSWR4OiB1aW50NjQKCipmb3JfNToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3MAoJLy8gc3JjTm9kZUlkeCA8IE1BWF9OT0RFUwoJZnJhbWVfZGlnIDEgLy8gc3JjTm9kZUlkeDogdWludDY0CglpbnQgOAoJPAoJYnogKmZvcl81X2VuZAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3MQoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBNQVhfUE9PTFNfUEVSX05PREU7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzY6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzEKCS8vIGkgPCBNQVhfUE9PTFNfUEVSX05PREUKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDMKCTwKCWJ6ICpmb3JfNl9lbmQKCgkvLyAqaWYyOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3MgoJLy8gbm9kZVBvb2xBc3NpZ25tZW50cy5ub2Rlc1tzcmNOb2RlSWR4XS5wb29sQXBwSWRzW2ldID09PSBwb29sQXBwSWQKCWZyYW1lX2RpZyAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCWludCAwCglmcmFtZV9kaWcgMSAvLyBzcmNOb2RlSWR4OiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMAoJKwoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWZyYW1lX2RpZyAtMiAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJPT0KCWJ6ICppZjI5X2VuZAoKCS8vICppZjI5X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3MwoJLy8gYXNzZXJ0KG5vZGVOdW0gLSAxICE9PSBzcmNOb2RlSWR4LCAiY2FuJ3QgbW92ZSB0byBzYW1lIG5vZGUiKQoJZnJhbWVfZGlnIC0zIC8vIG5vZGVOdW06IHVpbnQ2NAoJaW50IDEKCS0KCWZyYW1lX2RpZyAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJIT0KCgkvLyBjYW4ndCBtb3ZlIHRvIHNhbWUgbm9kZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODc1CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLm5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbc3JjTm9kZUlkeF0ucG9vbEFwcElkc1tpXSA9IDAKCWludCA5MDAKCWZyYW1lX2RpZyAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3OAoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5nb09mZmxpbmU+KHsKCS8vICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgltZXRob2QgImdvT2ZmbGluZSgpdm9pZCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODc5CgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkKCWZyYW1lX2RpZyAtMiAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4MwoJLy8gdGhpcy5hZGRQb29sVG9Ob2RlKHZhbGlkYXRvcklkLCBwb29sQXBwSWQsIG5vZGVOdW0pCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gcG9vbEFwcElkOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGFkZFBvb2xUb05vZGUKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4ODQKCS8vIHJldHVybgoJcmV0c3ViCgoqaWYyOV9lbmQ6CgoqZm9yXzZfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzEKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzYKCipmb3JfNl9lbmQ6CgoqZm9yXzVfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzAKCS8vIHNyY05vZGVJZHggKz0gMQoJZnJhbWVfZGlnIDEgLy8gc3JjTm9kZUlkeDogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJYiAqZm9yXzUKCipmb3JfNV9lbmQ6CgkvLyBjb3VsZG4ndCBmaW5kIHBvb2wgYXBwIGlkIGluIG5vZGVzIHRvIG1vdmUKCWVycgoJcmV0c3ViCgovLyBlbXB0eVRva2VuUmV3YXJkcyh1aW50NjQsYWRkcmVzcyl1aW50NjQKKmFiaV9yb3V0ZV9lbXB0eVRva2VuUmV3YXJkczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gcmVjZWl2ZXI6IGFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMzIKCT09CgoJLy8gYXJndW1lbnQgMCAocmVjZWl2ZXIpIGZvciBlbXB0eVRva2VuUmV3YXJkcyBtdXN0IGJlIGEgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZW1wdHlUb2tlblJld2FyZHModWludDY0LGFkZHJlc3MpdWludDY0CgljYWxsc3ViIGVtcHR5VG9rZW5SZXdhcmRzCglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZW1wdHlUb2tlblJld2FyZHModmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcmVjZWl2ZXI6IEFkZHJlc3MpOiB1aW50NjQKLy8KLy8gU2VuZHMgdGhlIHJld2FyZCB0b2tlbnMgaGVsZCBpbiBwb29sIDEgdG8gc3BlY2lmaWVkIHJlY2VpdmVyLgovLyBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgdGhlIG93bmVyIHdoZW4gdGhleSB3YW50IHRvIGdldCByZXdhcmQgdG9rZW5zICdiYWNrJyB3aGljaCB0aGV5IHNlbnQgdG8KLy8gdGhlIGZpcnN0IHBvb2wgKGxpa2VseSBiZWNhdXNlIHZhbGlkYXRvciBpcyBzdW5zZXR0aW5nLiAgQW55IHRva2VucyBjdXJyZW50bHkgJ3Jlc2VydmVkJyBmb3Igc3Rha2VycyB0byBjbGFpbSB3aWxsCi8vIE5PVCBiZSBzZW50IGFzIHRoZXkgbXVzdCBiZSBoZWxkIGJhY2sgZm9yIHN0YWtlcnMgdG8gbGF0ZXIgY2xhaW0uCi8vIFsgT05MWSBPV05FUiBDQU4gQ0FMTF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7QWRkcmVzc30gcmVjZWl2ZXIgLSB0aGUgYWNjb3VudCB0byBzZW5kIHRoZSB0b2tlbnMgdG8gKG11c3QgYWxyZWFkeSBiZSBvcHRlZC1pbiB0byB0aGUgcmV3YXJkIHRva2VuKQovLyBAcmV0dXJucyB7dWludDY0fSB0aGUgYW1vdW50IG9mIHJld2FyZCB0b2tlbiBzZW50CmVtcHR5VG9rZW5SZXdhcmRzOgoJcHJvdG8gMiAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkwMwoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTA0CgkvLyByZXdhcmRUb2tlbklkID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcucmV3YXJkVG9rZW5JZAoJaW50IDE1MwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTA1CgkvLyByZXdhcmRUb2tlbkhlbGRCYWNrID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5yZXdhcmRUb2tlbkhlbGRCYWNrCglpbnQgMjYwCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMSAvLyByZXdhcmRUb2tlbkhlbGRCYWNrOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MDYKCS8vIGFzc2VydChyZXdhcmRUb2tlbklkICE9PSAwLCAidGhpcyB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIGEgcmV3YXJkIHRva2VuIGRlZmluZWQiKQoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0CglpbnQgMAoJIT0KCgkvLyB0aGlzIHZhbGlkYXRvciBkb2Vzbid0IGhhdmUgYSByZXdhcmQgdG9rZW4gZGVmaW5lZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTA3CgkvLyBwb29sT25lQXBwSWQgPSBBcHBJRC5mcm9tVWludDY0KHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkKQoJaW50IDI2OAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MDkKCS8vIHRva2VuUmV3YXJkQmFsID0KCS8vICAgICAgICAgICAgIHBvb2xPbmVBcHBJZC5hZGRyZXNzLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JZCkpIC0gcmV3YXJkVG9rZW5IZWxkQmFjawoJZnJhbWVfZGlnIDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCXBvcAoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0Cglhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKCXBvcAoJZnJhbWVfZGlnIDEgLy8gcmV3YXJkVG9rZW5IZWxkQmFjazogdWludDY0CgktCglmcmFtZV9idXJ5IDMgLy8gdG9rZW5SZXdhcmRCYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkxMwoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5wYXlUb2tlblJld2FyZD4oewoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25JRDogcG9vbE9uZUFwcElkLAoJLy8gICAgICAgICAgICAgbWV0aG9kQXJnczogW3JlY2VpdmVyLCByZXdhcmRUb2tlbklkLCB0b2tlblJld2FyZEJhbF0sCgkvLyAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJbWV0aG9kICJwYXlUb2tlblJld2FyZChhZGRyZXNzLHVpbnQ2NCx1aW50NjQpdm9pZCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTE0CgkvLyBhcHBsaWNhdGlvbklEOiBwb29sT25lQXBwSWQKCWZyYW1lX2RpZyAyIC8vIHBvb2xPbmVBcHBJZDogdWludDY0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MTUKCS8vIG1ldGhvZEFyZ3M6IFtyZWNlaXZlciwgcmV3YXJkVG9rZW5JZCwgdG9rZW5SZXdhcmRCYWxdCglmcmFtZV9kaWcgLTIgLy8gcmVjZWl2ZXI6IEFkZHJlc3MKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklkOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMyAvLyB0b2tlblJld2FyZEJhbDogdWludDY0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MTcKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHBvb2xPbmVBcHBJZC5hZGRyZXNzLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JZCkpID09PSByZXdhcmRUb2tlbkhlbGRCYWNrLAoJLy8gICAgICAgICAgICAgJ2JhbGFuY2Ugb2YgcmVtYWluaW5nIHJld2FyZCB0b2tlbnMgc2hvdWxkIG1hdGNoIHRoZSBoZWxkIGJhY2sgYW1vdW50JywKCS8vICAgICAgICAgKQoJZnJhbWVfZGlnIDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCXBvcAoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0Cglhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKCXBvcAoJZnJhbWVfZGlnIDEgLy8gcmV3YXJkVG9rZW5IZWxkQmFjazogdWludDY0Cgk9PQoKCS8vIGJhbGFuY2Ugb2YgcmVtYWluaW5nIHJld2FyZCB0b2tlbnMgc2hvdWxkIG1hdGNoIHRoZSBoZWxkIGJhY2sgYW1vdW50Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MjEKCS8vIHJldHVybiB0b2tlblJld2FyZEJhbAoJZnJhbWVfZGlnIDMgLy8gdG9rZW5SZXdhcmRCYWw6IHVpbnQ2NAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDMKCXJldHN1YgoKLy8gY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IHZvaWQKY2FsbGVyTXVzdEJlT3duZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDE0CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICB0aGlzLnR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLAoJLy8gICAgICAgICAgICAgJ2NhbiBvbmx5IGJlIGNhbGxlZCBieSB2YWxpZGF0b3Igb3duZXInLAoJLy8gICAgICAgICApCgl0eG4gU2VuZGVyCglpbnQgOAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJPT0KCgkvLyBjYW4gb25seSBiZSBjYWxsZWQgYnkgdmFsaWRhdG9yIG93bmVyCglhc3NlcnQKCXJldHN1YgoKLy8gY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXIodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IHZvaWQKY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDIxCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICB0aGlzLnR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyIHx8CgkvLyAgICAgICAgICAgICAgICAgdGhpcy50eG4uc2VuZGVyID09PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5tYW5hZ2VyLAoJLy8gICAgICAgICAgICAgJ2NhbiBvbmx5IGJlIGNhbGxlZCBieSBvd25lciBvciBtYW5hZ2VyIG9mIHZhbGlkYXRvcicsCgkvLyAgICAgICAgICkKCXR4biBTZW5kZXIKCWludCA4CglpbnQgMzIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0Cgk9PQoJZHVwCglibnogKnNraXBfb3IzCgl0eG4gU2VuZGVyCglpbnQgNDAKCWludCAzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCT09Cgl8fAoKKnNraXBfb3IzOgoJLy8gY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IG93bmVyIG9yIG1hbmFnZXIgb2YgdmFsaWRhdG9yCglhc3NlcnQKCXJldHN1YgoKLy8gdmVyaWZ5UG9vbEtleUNhbGxlcihwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5KTogdm9pZAovLwovLyB2ZXJpZnlQb29sS2V5Q2FsbGVyIHZlcmlmaWVzIHRoZSBwYXNzZWQgaW4ga2V5IChmcm9tIGEgc3Rha2luZyBwb29sIGNhbGxpbmcgdXMgdG8gdXBkYXRlIG1ldHJpY3MpIGlzIHZhbGlkCi8vIGFuZCBtYXRjaGVzIHRoZSBpbmZvcm1hdGlvbiB3ZSBoYXZlIGluIG91ciBzdGF0ZS4gICdGYWtlJyBwb29scyBjb3VsZCBjYWxsIHVzIHRvIHVwZGF0ZSBvdXIgZGF0YSwgYnV0IHRoZXkKLy8gY2FuJ3QgZmFrZSB0aGUgaWRzIGFuZCBtb3N0IGltcG9ydGFudGx5IGFwcGxpY2F0aW9uIGlkKCEpIG9mIHRoZSBjYWxsZXIgdGhhdCBoYXMgdG8gbWF0Y2guCnZlcmlmeVBvb2xLZXlDYWxsZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDM0CgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLmV4aXN0cywgInRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGlzbid0IHZhbGlkIikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cglib3hfbGVuCglzd2FwCglwb3AKCgkvLyB0aGUgc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBpc24ndCB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTAzNQoJLy8gYXNzZXJ0KHBvb2xLZXkucG9vbElkIDw9IE1BWF9QT09MUywgJ3Bvb2wgaWQgbm90IGluIHZhbGlkIHJhbmdlJykKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDI0Cgk8PQoKCS8vIHBvb2wgaWQgbm90IGluIHZhbGlkIHJhbmdlCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDM2CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBwb29sS2V5LnBvb2xJZCA+IDAgJiYgKHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNikgPD0gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLm51bVBvb2xzLAoJLy8gICAgICAgICAgICAgJ3Bvb2wgaWQgb3V0c2lkZSBvZiByYW5nZSBvZiBwb29scyBjcmVhdGVkIGZvciB0aGlzIHZhbGlkYXRvcicsCgkvLyAgICAgICAgICkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDAKCT4KCWR1cAoJYnogKnNraXBfYW5kMwoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMjQyCglpbnQgMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk8PQoJJiYKCipza2lwX2FuZDM6CgkvLyBwb29sIGlkIG91dHNpZGUgb2YgcmFuZ2Ugb2YgcG9vbHMgY3JlYXRlZCBmb3IgdGhpcyB2YWxpZGF0b3IKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNDIKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHBvb2xLZXkucG9vbEFwcElkID09PSB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbcG9vbEtleS5wb29sSWQgLSAxXS5wb29sQXBwSWQsCgkvLyAgICAgICAgICAgICAiVGhlIHBhc3NlZCBpbiBhcHAgaWQgZG9lc24ndCBtYXRjaCB0aGUgcGFzc2VkIGluIGlkcyIsCgkvLyAgICAgICAgICkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk9PQoKCS8vIFRoZSBwYXNzZWQgaW4gYXBwIGlkIGRvZXNuJ3QgbWF0Y2ggdGhlIHBhc3NlZCBpbiBpZHMKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNDcKCS8vIGFzc2VydCh0aGlzLnR4bi5zZW5kZXIgPT09IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLmFkZHJlc3MpCgl0eG4gU2VuZGVyCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAxNiA4CglidG9pCglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCT09Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDQ5CgkvLyBhc3NlcnQocG9vbEtleS5pZCA9PT0gKEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLmdsb2JhbFN0YXRlKCd2YWxpZGF0b3JJZCcpIGFzIHVpbnQ2NCkpCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWJ5dGUgMHg3NjYxNmM2OTY0NjE3NDZmNzI0OTY0IC8vICJ2YWxpZGF0b3JJZCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgndmFsaWRhdG9ySWQnKQoJYXNzZXJ0Cgk9PQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA1MAoJLy8gYXNzZXJ0KHBvb2xLZXkucG9vbElkID09PSAoQXBwSUQuZnJvbVVpbnQ2NChwb29sS2V5LnBvb2xBcHBJZCkuZ2xvYmFsU3RhdGUoJ3Bvb2xJZCcpIGFzIHVpbnQ2NCkpCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWJ5dGUgMHg3MDZmNmY2YzQ5NjQgLy8gInBvb2xJZCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgncG9vbElkJykKCWFzc2VydAoJPT0KCWFzc2VydAoJcmV0c3ViCgovLyByZXZlcmlmeU5GRE93bmVyc2hpcCh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogdm9pZAovLwovLyBUaGlzIG1ldGhvZCB2ZXJpZmllcyB0aGUgb3duZXJzaGlwIG9mIE5GRCAoTmFtZWQgRnVuY3Rpb24gRGF0YSkgYnkgYSB2YWxpZGF0b3IuCi8vIElmIHRoZSBvd25lcnNoaXAgaXMgbm8gbG9uZ2VyIHZhbGlkLCBpdCByZW1vdmVzIHRoZSBORkQgZnJvbSB0aGUgdmFsaWRhdG9yJ3MgY29uZmlndXJhdGlvbi4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3Igd2hvc2UgZGF0YSBzaG91bGQgYmUgcmUtZXZhbHVhdGVkLgpyZXZlcmlmeU5GRE93bmVyc2hpcDoKCXByb3RvIDEgMAoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDYwCgkvLyB2YWxpZGF0b3JDb25maWcgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZwoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJZnJhbWVfYnVyeSAwIC8vIHN0b3JhZ2Uga2V5Ly92YWxpZGF0b3JDb25maWcKCgkvLyAqaWYzMF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNjEKCS8vIHZhbGlkYXRvckNvbmZpZy5uZmRGb3JJbmZvICE9PSAwCglpbnQgNzIKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDAKCSE9CglieiAqaWYzMF9lbmQKCgkvLyAqaWYzMF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDY0CgkvLyBuZmRPd25lciA9IEFwcElELmZyb21VaW50NjQodmFsaWRhdG9yQ29uZmlnLm5mZEZvckluZm8pLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzCglpbnQgNzIKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQodmFsaWRhdG9yQ29uZmlnLm5mZEZvckluZm8pLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCgkvLyAqaWYzMV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNjYKCS8vIHZhbGlkYXRvckNvbmZpZy5vd25lciAhPT0gbmZkT3duZXIgJiYgdmFsaWRhdG9yQ29uZmlnLm1hbmFnZXIgIT09IG5mZE93bmVyCglpbnQgOAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfZGlnIDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCSE9CglkdXAKCWJ6ICpza2lwX2FuZDQKCWludCA0MAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfZGlnIDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCSE9CgkmJgoKKnNraXBfYW5kNDoKCWJ6ICppZjMxX2VuZAoKCS8vICppZjMxX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNjgKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm5mZEZvckluZm8gPSAwCglpbnQgNzIKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKKmlmMzFfZW5kOgoKKmlmMzBfZW5kOgoJcmV0c3ViCgovLyB2YWxpZGF0ZUNvbmZpZyhjb25maWc6IFZhbGlkYXRvckNvbmZpZyk6IHZvaWQKdmFsaWRhdGVDb25maWc6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDc1CgkvLyBhc3NlcnQoY29uZmlnLm93bmVyICE9PSBBZGRyZXNzLnplcm9BZGRyZXNzKQoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDggMzIKCWdsb2JhbCBaZXJvQWRkcmVzcwoJIT0KCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNzYKCS8vIGFzc2VydChjb25maWcubWFuYWdlciAhPT0gQWRkcmVzcy56ZXJvQWRkcmVzcykKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA0MCAzMgoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA3NwoJLy8gYXNzZXJ0KHRoaXMudHhuLnNlbmRlciA9PT0gY29uZmlnLm93bmVyLCAnc2VuZGVyIG11c3QgYmUgb3duZXIgdG8gYWRkIG5ldyB2YWxpZGF0b3InKQoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDggMzIKCT09CgoJLy8gc2VuZGVyIG11c3QgYmUgb3duZXIgdG8gYWRkIG5ldyB2YWxpZGF0b3IKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNzkKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIGNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPj0gR0FUSU5HX1RZUEVfTk9ORSAmJiBjb25maWcuZW50cnlHYXRpbmdUeXBlIDw9IEdBVElOR19UWVBFX0NPTlNUX01BWCwKCS8vICAgICAgICAgICAgICdnYXRpbmcgdHlwZSBub3QgdmFsaWQnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgODAgMQoJYnRvaQoJaW50IDAKCT49CglkdXAKCWJ6ICpza2lwX2FuZDUKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4MCAxCglidG9pCglpbnQgNAoJPD0KCSYmCgoqc2tpcF9hbmQ1OgoJLy8gZ2F0aW5nIHR5cGUgbm90IHZhbGlkCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDgzCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBjb25maWcuZXBvY2hSb3VuZExlbmd0aCA+PSBNSU5fRVBPQ0hfTEVOR1RIICYmIGNvbmZpZy5lcG9jaFJvdW5kTGVuZ3RoIDw9IE1BWF9FUE9DSF9MRU5HVEgsCgkvLyAgICAgICAgICAgICAnZXBvY2ggbGVuZ3RoIG5vdCBpbiBhbGxvd2FibGUgcmFuZ2UnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTY5IDQKCWJ0b2kKCWludCAxCgk+PQoJZHVwCglieiAqc2tpcF9hbmQ2CglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTY5IDQKCWJ0b2kKCWludCAxMDAwMDAwCgk8PQoJJiYKCipza2lwX2FuZDY6CgkvLyBlcG9jaCBsZW5ndGggbm90IGluIGFsbG93YWJsZSByYW5nZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA4NwoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgY29uZmlnLnBlcmNlbnRUb1ZhbGlkYXRvciA+PSBNSU5fUENUX1RPX1ZBTElEQVRPUiAmJiBjb25maWcucGVyY2VudFRvVmFsaWRhdG9yIDw9IE1BWF9QQ1RfVE9fVkFMSURBVE9SLAoJLy8gICAgICAgICAgICAgJ2NvbW1pc3Npb24gcGVyY2VudGFnZSBub3QgdmFsaWQnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTczIDQKCWJ0b2kKCWludCAwCgk+PQoJZHVwCglieiAqc2tpcF9hbmQ3CglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTczIDQKCWJ0b2kKCWludCAxMDAwMDAwCgk8PQoJJiYKCipza2lwX2FuZDc6CgkvLyBjb21taXNzaW9uIHBlcmNlbnRhZ2Ugbm90IHZhbGlkCglhc3NlcnQKCgkvLyAqaWYzMl9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwOTEKCS8vIGNvbmZpZy5wZXJjZW50VG9WYWxpZGF0b3IgIT09IDAKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAxNzMgNAoJYnRvaQoJaW50IDAKCSE9CglieiAqaWYzMl9lbmQKCgkvLyAqaWYzMl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDkyCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgY29uZmlnLnZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzICE9PSBBZGRyZXNzLnplcm9BZGRyZXNzLAoJLy8gICAgICAgICAgICAgICAgICd2YWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyBtdXN0IGJlIHNldCBpZiBwZXJjZW50IHRvIHZhbGlkYXRvciBpcyBub3QgMCcsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTc3IDMyCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CgoJLy8gdmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MgbXVzdCBiZSBzZXQgaWYgcGVyY2VudCB0byB2YWxpZGF0b3IgaXMgbm90IDAKCWFzc2VydAoKKmlmMzJfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA5NwoJLy8gYXNzZXJ0KGNvbmZpZy5taW5FbnRyeVN0YWtlID49IE1JTl9BTEdPX1NUQUtFX1BFUl9QT09MLCAnc3Rha2luZyBwb29sIG11c3QgaGF2ZSBtaW5pbXVtIGVudHJ5IG9mIDEgYWxnbycpCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMjA5IDgKCWJ0b2kKCWludCAxMDAwMDAwCgk+PQoKCS8vIHN0YWtpbmcgcG9vbCBtdXN0IGhhdmUgbWluaW11bSBlbnRyeSBvZiAxIGFsZ28KCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwOTkKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIGNvbmZpZy5wb29sc1Blck5vZGUgPiAwICYmIGNvbmZpZy5wb29sc1Blck5vZGUgPD0gTUFYX1BPT0xTX1BFUl9OT0RFLAoJLy8gICAgICAgICAgICAgJ251bWJlciBvZiBwb29scyBwZXIgbm9kZSBtdXN0IGJlIGJlIGJldHdlZW4gMSBhbmQgdGhlIG1heGltdW0gYWxsb3dlZCBudW1iZXInLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMjI1IDEKCWJ0b2kKCWludCAwCgk+CglkdXAKCWJ6ICpza2lwX2FuZDgKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAyMjUgMQoJYnRvaQoJaW50IDMKCTw9CgkmJgoKKnNraXBfYW5kODoKCS8vIG51bWJlciBvZiBwb29scyBwZXIgbm9kZSBtdXN0IGJlIGJlIGJldHdlZW4gMSBhbmQgdGhlIG1heGltdW0gYWxsb3dlZCBudW1iZXIKCWFzc2VydAoKCS8vICppZjMzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEwMwoJLy8gY29uZmlnLnN1bnNldHRpbmdPbiAhPT0gMAoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDIyNiA4CglidG9pCglpbnQgMAoJIT0KCWJ6ICppZjMzX2VuZAoKCS8vICppZjMzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMDQKCS8vIGFzc2VydChjb25maWcuc3Vuc2V0dGluZ09uID4gZ2xvYmFscy5sYXRlc3RUaW1lc3RhbXAsICdzdW5zZXR0aW5nT24gbXVzdCBiZSBsYXRlciB0aGFuIG5vdyBpZiBzZXQnKQoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDIyNiA4CglidG9pCglnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCgk+CgoJLy8gc3Vuc2V0dGluZ09uIG11c3QgYmUgbGF0ZXIgdGhhbiBub3cgaWYgc2V0Cglhc3NlcnQKCippZjMzX2VuZDoKCXJldHN1YgoKLy8gY2FsbFBvb2xBZGRTdGFrZShzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4sIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXksIG1ickFtdFBhaWQ6IHVpbnQ2NCwgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbGVhbiwgaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sZWFuKTogdm9pZAovLwovLyBBZGRzIGEgc3Rha2VycyBhbW91bnQgb2YgYWxnbyB0byBhIHZhbGlkYXRvciBwb29sLCB0cmFuc2ZlcnJpbmcgdGhlIGFsZ28gd2UgcmVjZWl2ZWQgZnJvbSB0aGVtIChhbHJlYWR5IHZlcmlmaWVkCi8vIGJ5IG91ciBjYWxsZXIpIHRvIHRoZSBzdGFraW5nIHBvb2wgYWNjb3VudCwgYW5kIHRoZW4gdGVsbGluZyBpdCBhYm91dCB0aGUgYW1vdW50IGJlaW5nIGFkZGVkIGZvciB0aGUgc3BlY2lmaWVkCi8vIHN0YWtlci4KLy8KLy8gQHBhcmFtIHtQYXlUeG59IHN0YWtlZEFtb3VudFBheW1lbnQgLSBwYXltZW50IGNvbWluZyBmcm9tIHN0YWtlciB0byBwbGFjZSBpbnRvIGEgcG9vbAovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBUaGUga2V5IG9mIHRoZSB2YWxpZGF0b3IgcG9vbC4KLy8gQHBhcmFtIHt1aW50NjR9IG1ickFtdFBhaWQgLSBBbW91bnQgdGhlIHVzZXIgaXMgbGVhdmluZyBiZWhpbmQgaW4gdGhlIHZhbGlkYXRvciB0byBwYXkgZm9yIHRoZWlyIHN0YWtlciBNQlIgY29zdAovLyBAcGFyYW0ge2Jvb2xlYW59IGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IgLSBpZiB0aGlzIGlzIGEgbmV3LCBmaXJzdC10aW1lIHN0YWtlciB0byB0aGUgdmFsaWRhdG9yCi8vIEBwYXJhbSB7Ym9vbGVhbn0gaXNOZXdTdGFrZXJUb1Byb3RvY29sIC0gaWYgdGhpcyBpcyBhIG5ldywgZmlyc3QtdGltZSBzdGFrZXIgdG8gdGhlIHByb3RvY29sCmNhbGxQb29sQWRkU3Rha2U6Cglwcm90byA1IDAKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiAyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEyNgoJLy8gcG9vbEFwcElkID0gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzW3Bvb2xLZXkucG9vbElkIC0gMV0ucG9vbEFwcElkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIHBvb2xBcHBJZDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEzMAoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5hZGRTdGFrZSwgdWludDY0Pih7CgkvLyAgICAgICAgICAgICBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCksCgkvLyAgICAgICAgICAgICBtZXRob2RBcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gPT09PT09PQoJLy8gICAgICAgICAgICAgICAgIC8vIFRISVMgSVMgQSBTRU5EIG9mIHRoZSBhbW91bnQgcmVjZWl2ZWQgcmlnaHQgYmFjayBvdXQgYW5kIGludG8gdGhlIHN0YWtpbmcgcG9vbCBjb250cmFjdCBhY2NvdW50LgoJLy8gICAgICAgICAgICAgICAgIHsgYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQsIHJlY2VpdmVyOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuYWRkcmVzcyB9LAoJLy8gICAgICAgICAgICAgICAgIC8vID09PT09PT0KCS8vICAgICAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LnNlbmRlciwKCS8vICAgICAgICAgICAgIF0sCgkvLyAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgcGF5CglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEzNQoJLy8gYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJZnJhbWVfZGlnIC0zIC8vIG1ickFtdFBhaWQ6IHVpbnQ2NAoJLQoJaXR4bl9maWVsZCBBbW91bnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTM1CgkvLyByZWNlaXZlcjogQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmFkZHJlc3MKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCWl0eG5fZmllbGQgUmVjZWl2ZXIKCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCWl0eG5fbmV4dAoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAiYWRkU3Rha2UocGF5LGFkZHJlc3MpdWludDY0IgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTMxCgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTMyCgkvLyBtZXRob2RBcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gPT09PT09PQoJLy8gICAgICAgICAgICAgICAgIC8vIFRISVMgSVMgQSBTRU5EIG9mIHRoZSBhbW91bnQgcmVjZWl2ZWQgcmlnaHQgYmFjayBvdXQgYW5kIGludG8gdGhlIHN0YWtpbmcgcG9vbCBjb250cmFjdCBhY2NvdW50LgoJLy8gICAgICAgICAgICAgICAgIHsgYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQsIHJlY2VpdmVyOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuYWRkcmVzcyB9LAoJLy8gICAgICAgICAgICAgICAgIC8vID09PT09PT0KCS8vICAgICAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LnNlbmRlciwKCS8vICAgICAgICAgICAgIF0KCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIFNlbmRlcgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCgkvLyBTdWJtaXQgaW5uZXIgdHJhbnNhY3Rpb24KCWl0eG5fc3VibWl0CglpdHhuIE51bUxvZ3MKCWludCAxCgktCglpdHhuYXMgTG9ncwoJZXh0cmFjdCA0IDAKCWJ0b2kKCgkvLyAqaWYzNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNDAKCS8vIGdsb2JhbHMub3Bjb2RlQnVkZ2V0IDwgNTAwCglnbG9iYWwgT3Bjb2RlQnVkZ2V0CglpbnQgNTAwCgk8CglieiAqaWYzNF9lbmQKCgkvLyAqaWYzNF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTQxCgkvLyBpbmNyZWFzZU9wY29kZUJ1ZGdldCgpCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJaW50IDAKCWl0eG5fZmllbGQgRmVlCglieXRlIGI2NCBDb0VCIC8vICNwcmFnbWEgdmVyc2lvbiAxMDsgaW50IDEKCWR1cAoJaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCWludCBEZWxldGVBcHBsaWNhdGlvbgoJaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KCWl0eG5fc3VibWl0CgoqaWYzNF9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTQ1CgkvLyBwb29sTnVtU3Rha2VycyA9IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgnbnVtU3Rha2VycycpIGFzIHVpbnQ2NAoJZnJhbWVfZGlnIDAgLy8gcG9vbEFwcElkOiB1aW50NjQKCWJ5dGUgMHg2ZTc1NmQ1Mzc0NjE2YjY1NzI3MyAvLyAibnVtU3Rha2VycyIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuZ2xvYmFsU3RhdGUoJ251bVN0YWtlcnMnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDEgLy8gcG9vbE51bVN0YWtlcnM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNDYKCS8vIHBvb2xBbGdvU3Rha2VkID0gQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmdsb2JhbFN0YXRlKCdzdGFrZWQnKSBhcyB1aW50NjQKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglhcHBfZ2xvYmFsX2dldF9leAoKCS8vIGdsb2JhbCBzdGF0ZSB2YWx1ZSBkb2VzIG5vdCBleGlzdDogQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmdsb2JhbFN0YXRlKCdzdGFrZWQnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDIgLy8gcG9vbEFsZ29TdGFrZWQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNDcKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsU3Rha2VycyA9IHBvb2xOdW1TdGFrZXJzIGFzIHVpbnQxNgoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJZnJhbWVfZGlnIDEgLy8gcG9vbE51bVN0YWtlcnM6IHVpbnQ2NAoJaXRvYgoJZXh0cmFjdCA2IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNDgKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCA9IHBvb2xBbGdvU3Rha2VkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJZnJhbWVfZGlnIDIgLy8gcG9vbEFsZ29TdGFrZWQ6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gKmlmMzVfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTUxCgkvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yCglmcmFtZV9kaWcgLTQgLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbGVhbgoJYnogKmlmMzVfZW5kCgoJLy8gKmlmMzVfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE1MgoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsU3Rha2VycyArPSAxCglpbnQgMjQ0CglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWludCAxCgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCippZjM1X2VuZDoKCS8vICppZjM2X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE1NAoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sCglmcmFtZV9kaWcgLTUgLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sZWFuCglieiAqaWYzNl9lbmQKCgkvLyAqaWYzNl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTU1CgkvLyB0aGlzLm51bVN0YWtlcnMudmFsdWUgKz0gMQoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJYXBwX2dsb2JhbF9nZXQKCWludCAxCgkrCglieXRlIDB4NmU3NTZkNTM3NDYxNmI2NTcyNzMgLy8gIm51bVN0YWtlcnMiCglzd2FwCglhcHBfZ2xvYmFsX3B1dAoKKmlmMzZfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE1NwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsQWxnb1N0YWtlZCArPSBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWludCAyNTIKCWR1cAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4bgoJZ3R4bnMgQW1vdW50CglmcmFtZV9kaWcgLTMgLy8gbWJyQW10UGFpZDogdWludDY0CgktCgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTU4CgkvLyB0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSArPSBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCWFwcF9nbG9iYWxfZ2V0CglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBBbW91bnQKCWZyYW1lX2RpZyAtMyAvLyBtYnJBbXRQYWlkOiB1aW50NjQKCS0KCSsKCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCXN3YXAKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIHVwZGF0ZVN0YWtlclBvb2xTZXQoc3Rha2VyOiBBZGRyZXNzLCBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5KTogdm9pZAp1cGRhdGVTdGFrZXJQb29sU2V0OgoJcHJvdG8gMiAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjIKCS8vIGFzc2VydCh0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS5leGlzdHMpCglieXRlIDB4NzM3MDczIC8vICJzcHMiCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE2NAoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDAgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjUKCS8vIGZpcnN0RW1wdHkgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjYKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoKKmZvcl83OgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE2NgoJLy8gaSA8IHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlLmxlbmd0aAoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl83X2VuZAoKCS8vICppZjM3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE2NwoJLy8gcG9vbFNldFtpXSA9PT0gcG9vbEtleQoJZnJhbWVfZGlnIDAgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDI0CglleHRyYWN0MwoJZnJhbWVfZGlnIC0yIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCT09CglieiAqaWYzN19lbmQKCgkvLyAqaWYzN19jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTY5CgkvLyByZXR1cm4KCXJldHN1YgoKKmlmMzdfZW5kOgoJLy8gKmlmMzhfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTcxCgkvLyBmaXJzdEVtcHR5ID09PSAwICYmIHBvb2xTZXRbaV0uaWQgPT09IDAKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDAKCT09CglkdXAKCWJ6ICpza2lwX2FuZDkKCWZyYW1lX2RpZyAwIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgk9PQoJJiYKCipza2lwX2FuZDk6CglieiAqaWYzOF9lbmQKCgkvLyAqaWYzOF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTcyCgkvLyBmaXJzdEVtcHR5ID0gaSArIDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMSAvLyBmaXJzdEVtcHR5OiB1aW50NjQKCippZjM4X2VuZDoKCipmb3JfN19jb250aW51ZToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjYKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzcKCipmb3JfN19lbmQ6CgkvLyAqaWYzOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNzUKCS8vIGZpcnN0RW1wdHkgPT09IDAKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDAKCT09CglieiAqaWYzOV9lbmQKCgkvLyAqaWYzOV9jb25zZXF1ZW50CgkvLyBObyBlbXB0eSBzbG90IGF2YWlsYWJsZSBpbiB0aGUgc3Rha2VyIHBvb2wgc2V0CgllcnIKCippZjM5X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNzgKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlW2ZpcnN0RW1wdHkgLSAxXSA9IHBvb2xLZXkKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDEKCS0KCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyByZW1vdmVGcm9tU3Rha2VyUG9vbFNldChzdGFrZXI6IEFkZHJlc3MsIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkpOiBbYm9vbGVhbiwgYm9vbGVhbl0KLy8KLy8gUmVtb3ZlcyBhIHBvb2wga2V5IGZyb20gdGhlIHN0YWtlcidzIGFjdGl2ZSBwb29sIHNldCAtIGZhaWxzIGlmIG5vdCBmb3VuZCAoISkKLy8KLy8gQHBhcmFtIHtBZGRyZXNzfSBzdGFrZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgc3Rha2VyLgovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBUaGUgcG9vbCBrZXkgdGhleSBzaG91bGQgYmUgc3RvcmVkIGluCi8vCi8vIEByZXR1cm4gW2Jvb2xlYW4sIGJvb2xlYW5dIFtpcyB0aGUgc3Rha2VyIGdvbmUgZnJvbSBBTEwgcG9vbHMgb2YgdGhlIGdpdmVuIFZBTElEQVRPUiwgYW5kIGlzIHN0YWtlciBnb25lIGZyb20gQUxMIHBvb2xzXQpyZW1vdmVGcm9tU3Rha2VyUG9vbFNldDoKCXByb3RvIDIgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTkxCgkvLyBpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAwIC8vIGluU2FtZVZhbGlkYXRvclBvb2xDb3VudDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5MgoJLy8gaW5BbnlQb29sQ291bnQgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAxIC8vIGluQW55UG9vbENvdW50OiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTkzCgkvLyBmb3VuZCA9IGZhbHNlCglpbnQgMAoJZnJhbWVfYnVyeSAyIC8vIGZvdW5kOiBib29sCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5NQoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExOTYKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoKKmZvcl84OgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5NgoJLy8gaSA8IHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlLmxlbmd0aAoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl84X2VuZAoKCS8vICppZjQwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5NwoJLy8gcG9vbFNldFtpXS5pZCA9PT0gMAoJZnJhbWVfZGlnIDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWY0MF9lbmQKCgkvLyAqaWY0MF9jb25zZXF1ZW50CgliICpmb3JfOF9jb250aW51ZQoKKmlmNDBfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwMAoJLy8gaW5BbnlQb29sQ291bnQgKz0gMQoJZnJhbWVfZGlnIDEgLy8gaW5BbnlQb29sQ291bnQ6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMSAvLyBpbkFueVBvb2xDb3VudDogdWludDY0CgoJLy8gKmlmNDFfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjAxCgkvLyBwb29sU2V0W2ldLmlkID09PSBwb29sS2V5LmlkCglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgMAoJKwoJaW50IDgKCWV4dHJhY3QzCglidG9pCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCT09CglieiAqaWY0MV9lbmQKCgkvLyAqaWY0MV9jb25zZXF1ZW50CgkvLyAqaWY0Ml9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDIKCS8vIHBvb2xTZXRbaV0gPT09IHBvb2xLZXkKCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5Cgk9PQoJYnogKmlmNDJfZWxzZQoKCS8vICppZjQyX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDMKCS8vIGZvdW5kID0gdHJ1ZQoJaW50IDEKCWZyYW1lX2J1cnkgMiAvLyBmb3VuZDogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDUKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlW2ldID0geyBpZDogMCwgcG9vbElkOiAwLCBwb29sQXBwSWQ6IDAgfQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJYiAqaWY0Ml9lbmQKCippZjQyX2Vsc2U6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjA3CgkvLyBpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgKz0gMQoJZnJhbWVfZGlnIDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCippZjQyX2VuZDoKCippZjQxX2VuZDoKCipmb3JfOF9jb250aW51ZToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExOTYKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzgKCipmb3JfOF9lbmQ6CgkvLyAqaWY0M19jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMTEKCS8vICFmb3VuZAoJZnJhbWVfZGlnIDIgLy8gZm91bmQ6IGJvb2wKCSEKCWJ6ICppZjQzX2VuZAoKCS8vICppZjQzX2NvbnNlcXVlbnQKCS8vIE5vIG1hdGNoaW5nIHNsb3QgZm91bmQgd2hlbiB0b2xkIHRvIHJlbW92ZSBhIHBvb2wgZnJvbSB0aGUgc3Rha2VycyBzZXQKCWVycgoKKmlmNDNfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIxNQoJLy8gcmV0dXJuIFtpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgPT09IDAsIGluQW55UG9vbENvdW50ID09PSAwXQoJYnl0ZSAweDAwCglpbnQgMAoJZnJhbWVfZGlnIDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCWludCAwCgk9PQoJc2V0Yml0CglpbnQgMQoJZnJhbWVfZGlnIDEgLy8gaW5BbnlQb29sQ291bnQ6IHVpbnQ2NAoJaW50IDAKCT09CglzZXRiaXQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCgkvLyBwb3AgYWxsIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHRoZSBzdGFjawoJcG9wbiA0CglyZXRzdWIKCi8vIGFkZFBvb2xUb05vZGUodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcG9vbEFwcElkOiB1aW50NjQsIG5vZGVOdW06IHVpbnQ2NCk6IHZvaWQKYWRkUG9vbFRvTm9kZToKCXByb3RvIDMgMAoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjE5CgkvLyBub2RlUG9vbEFzc2lnbm1lbnRzID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5ub2RlUG9vbEFzc2lnbm1lbnRzKQoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfYnVyeSAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjIwCgkvLyBtYXhQb29sc1Blck5vZGVGb3JUaGlzVmFsaWRhdG9yID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcucG9vbHNQZXJOb2RlIGFzIHVpbnQ2NAoJaW50IDIyNQoJaW50IDEKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDEgLy8gbWF4UG9vbHNQZXJOb2RlRm9yVGhpc1ZhbGlkYXRvcjogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIyMgoJLy8gYXNzZXJ0KG5vZGVOdW0gPj0gMSAmJiBub2RlTnVtIDw9IE1BWF9OT0RFUywgJ25vZGUgbnVtYmVyIG5vdCBpbiB2YWxpZCByYW5nZScpCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgMQoJPj0KCWR1cAoJYnogKnNraXBfYW5kMTAKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCA4Cgk8PQoJJiYKCipza2lwX2FuZDEwOgoJLy8gbm9kZSBudW1iZXIgbm90IGluIHZhbGlkIHJhbmdlCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI0CgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IG1heFBvb2xzUGVyTm9kZUZvclRoaXNWYWxpZGF0b3I7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzk6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI0CgkvLyBpIDwgbWF4UG9vbHNQZXJOb2RlRm9yVGhpc1ZhbGlkYXRvcgoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglmcmFtZV9kaWcgMSAvLyBtYXhQb29sc1Blck5vZGVGb3JUaGlzVmFsaWRhdG9yOiB1aW50NjQKCTwKCWJ6ICpmb3JfOV9lbmQKCgkvLyAqaWY0NF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMjUKCS8vIG5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbbm9kZU51bSAtIDFdLnBvb2xBcHBJZHNbaV0gPT09IDAKCWZyYW1lX2RpZyAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCWludCAwCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgMQoJLQoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWY0NF9lbmQKCgkvLyAqaWY0NF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI3CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLm5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbbm9kZU51bSAtIDFdLnBvb2xBcHBJZHNbaV0gPSBwb29sQXBwSWQKCWludCA5MDAKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCAxCgktCglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDAKCSsKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJZnJhbWVfZGlnIC0yIC8vIHBvb2xBcHBJZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMjgKCS8vIHJldHVybgoJcmV0c3ViCgoqaWY0NF9lbmQ6CgoqZm9yXzlfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI0CgkvLyBpICs9IDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCWIgKmZvcl85CgoqZm9yXzlfZW5kOgoJLy8gbm8gYXZhaWxhYmxlIHNwYWNlIGluIHNwZWNpZmllZCBub2RlIGZvciB0aGlzIHBvb2wKCWVycgoJcmV0c3ViCgovLyBkb2VzU3Rha2VyTWVldEdhdGluZyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQpOiB2b2lkCi8vCi8vIENoZWNrcyBpZiBhIHN0YWtlciBtZWV0cyB0aGUgZ2F0aW5nIHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgYnkgdGhlIHZhbGlkYXRvci4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWx1ZVRvVmVyaWZ5IC0gVGhlIHZhbHVlIHRvIHZlcmlmeSBhZ2FpbnN0IHRoZSBnYXRpbmcgcmVxdWlyZW1lbnRzLgovLyBAcmV0dXJucyB7dm9pZH0gb3IgYXNzZXJ0cyBpZiByZXF1aXJlbWVudHMgbm90IG1ldC4KZG9lc1N0YWtlck1lZXRHYXRpbmc6Cglwcm90byAyIDAKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA4CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI0MgoJLy8gdHlwZSA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLmVudHJ5R2F0aW5nVHlwZQoJaW50IDgwCglpbnQgMQoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMCAvLyB0eXBlOiB1aW50OAoKCS8vICppZjQ1X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI0MwoJLy8gdHlwZSA9PT0gR0FUSU5HX1RZUEVfTk9ORQoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAwCgk9PQoJYnogKmlmNDVfZW5kCgoJLy8gKmlmNDVfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI0NAoJLy8gcmV0dXJuCglyZXRzdWIKCippZjQ1X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNDYKCS8vIHN0YWtlciA9IHRoaXMudHhuLnNlbmRlcgoJdHhuIFNlbmRlcgoJZnJhbWVfYnVyeSAxIC8vIHN0YWtlcjogYWRkcmVzcwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNDcKCS8vIGNvbmZpZyA9IGNsb25lKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnKQoJaW50IDAKCWludCAyNDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglmcmFtZV9idXJ5IDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCgkvLyAqaWY0Nl9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTEKCS8vIHR5cGUgPT09IEdBVElOR19UWVBFX0FTU0VUU19DUkVBVEVEX0JZIHx8CgkvLyAgICAgICAgICAgICB0eXBlID09PSBHQVRJTkdfVFlQRV9BU1NFVF9JRCB8fAoJLy8gICAgICAgICAgICAgdHlwZSA9PT0gR0FUSU5HX1RZUEVfQ1JFQVRFRF9CWV9ORkRfQUREUkVTU0VTCglmcmFtZV9kaWcgMCAvLyB0eXBlOiB1aW50OAoJaW50IDEKCT09CglkdXAKCWJueiAqc2tpcF9vcjQKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMgoJPT0KCXx8Cgoqc2tpcF9vcjQ6CglkdXAKCWJueiAqc2tpcF9vcjUKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMwoJPT0KCXx8Cgoqc2tpcF9vcjU6CglieiAqaWY0Nl9lbmQKCgkvLyAqaWY0Nl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjU1CgkvLyBhc3NlcnQodmFsdWVUb1ZlcmlmeSAhPT0gMCkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWludCAwCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI1NgoJLy8gYmFsUmVxdWlyZWQgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5nYXRpbmdBc3NldE1pbkJhbGFuY2UKCWludCAxNDUKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAzIC8vIGJhbFJlcXVpcmVkOiB1aW50NjQKCgkvLyAqaWY0N19jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTcKCS8vIGJhbFJlcXVpcmVkID09PSAwCglmcmFtZV9kaWcgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0CglpbnQgMAoJPT0KCWJ6ICppZjQ3X2VuZAoKCS8vICppZjQ3X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTgKCS8vIGJhbFJlcXVpcmVkID0gMQoJaW50IDEKCWZyYW1lX2J1cnkgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0CgoqaWY0N19lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjYwCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgc3Rha2VyLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQodmFsdWVUb1ZlcmlmeSkpID49IGJhbFJlcXVpcmVkLAoJLy8gICAgICAgICAgICAgICAgICdtdXN0IGhhdmUgcmVxdWlyZWQgbWluaW11bSBiYWxhbmNlIG9mIHZhbGlkYXRvciBkZWZpbmVkIHRva2VuIHRvIGFkZCBzdGFrZScsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgMSAvLyBzdGFrZXI6IGFkZHJlc3MKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQoJcG9wCglmcmFtZV9kaWcgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0Cgk+PQoKCS8vIG11c3QgaGF2ZSByZXF1aXJlZCBtaW5pbXVtIGJhbGFuY2Ugb2YgdmFsaWRhdG9yIGRlZmluZWQgdG9rZW4gdG8gYWRkIHN0YWtlCglhc3NlcnQKCippZjQ2X2VuZDoKCS8vICppZjQ4X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI2NQoJLy8gdHlwZSA9PT0gR0FUSU5HX1RZUEVfQVNTRVRTX0NSRUFURURfQlkKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMQoJPT0KCWJ6ICppZjQ4X2VuZAoKCS8vICppZjQ4X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNjYKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICBBc3NldElELmZyb21VaW50NjQodmFsdWVUb1ZlcmlmeSkuY3JlYXRvciA9PT0gY29uZmlnLmVudHJ5R2F0aW5nQWRkcmVzcywKCS8vICAgICAgICAgICAgICAgICAnc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgY3JlYXRlZCBieSBjcmVhdG9yIHRoYXQgdGhlIHZhbGlkYXRvciBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UnLAoJLy8gICAgICAgICAgICAgKQoJZnJhbWVfZGlnIC0yIC8vIHZhbHVlVG9WZXJpZnk6IHVpbnQ2NAoJYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKCXBvcAoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgODEgMzIKCT09CgoJLy8gc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgY3JlYXRlZCBieSBjcmVhdG9yIHRoYXQgdGhlIHZhbGlkYXRvciBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UKCWFzc2VydAoKKmlmNDhfZW5kOgoJLy8gKmlmNDlfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjcxCgkvLyB0eXBlID09PSBHQVRJTkdfVFlQRV9BU1NFVF9JRAoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAyCgk9PQoJYnogKmlmNDlfZW5kCgoJLy8gKmlmNDlfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3MgoJLy8gZm91bmQgPSBmYWxzZQoJaW50IDAKCWZyYW1lX2J1cnkgNCAvLyBmb3VuZDogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNzMKCS8vIGNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0cwoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMTEzIDMyCglkdXAKCWZyYW1lX2J1cnkgNSAvLyBjb3B5IG9mIHRoZSBhcnJheSB3ZSBhcmUgaXRlcmF0aW5nIG92ZXIKCWV4dHJhY3QgMCA4CglidG9pCglmcmFtZV9idXJ5IDYgLy8gYXNzZXRJZDogdWludDY0CglpbnQgMAoJZnJhbWVfYnVyeSA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCgoqZm9yT2ZfMDoKCS8vICppZjUwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3NAoJLy8gdmFsdWVUb1ZlcmlmeSA9PT0gYXNzZXRJZAoJZnJhbWVfZGlnIC0yIC8vIHZhbHVlVG9WZXJpZnk6IHVpbnQ2NAoJZnJhbWVfZGlnIDYgLy8gYXNzZXRJZDogdWludDY0Cgk9PQoJYnogKmlmNTBfZW5kCgoJLy8gKmlmNTBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3NQoJLy8gZm91bmQgPSB0cnVlCglpbnQgMQoJZnJhbWVfYnVyeSA0IC8vIGZvdW5kOiBib29sCgliICpmb3JPZl8wX2VuZAoKKmlmNTBfZW5kOgoKKmZvck9mXzBfY29udGludWU6CgkvLyBpbmNyZW1lbnQgb2Zmc2V0IGFuZCBsb29wIGlmIG5vdCBvdXQgb2YgYm91bmRzCglmcmFtZV9kaWcgNyAvLyB0aGUgb2Zmc2V0IHdlIGFyZSBleHRyYWN0aW5nIHRoZSBuZXh0IGVsZW1lbnQgZnJvbQoJaW50IDgKCSsKCWR1cAoJaW50IDMyIC8vIG9mZnNldCBvZiBsYXN0IGVsZW1lbnQKCTwKCWJ6ICpmb3JPZl8wX2VuZAoJZnJhbWVfYnVyeSA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCglmcmFtZV9kaWcgNSAvLyBjb3B5IG9mIHRoZSBhcnJheSB3ZSBhcmUgaXRlcmF0aW5nIG92ZXIKCWZyYW1lX2RpZyA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCglpbnQgOAoJZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSA2IC8vIGFzc2V0SWQ6IHVpbnQ2NAoJYiAqZm9yT2ZfMAoKKmZvck9mXzBfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3OQoJLy8gYXNzZXJ0KGZvdW5kLCAnc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgaWRlbnRpY2FsIHRvIHRoZSBhc3NldCBpZCBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UnKQoJZnJhbWVfZGlnIDQgLy8gZm91bmQ6IGJvb2wKCgkvLyBzcGVjaWZpZWQgYXNzZXQgbXVzdCBiZSBpZGVudGljYWwgdG8gdGhlIGFzc2V0IGlkIGRlZmluZWQgYXMgYSByZXF1aXJlbWVudCB0byBzdGFrZQoJYXNzZXJ0CgoqaWY0OV9lbmQ6CgkvLyAqaWY1MV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyODEKCS8vIHR5cGUgPT09IEdBVElOR19UWVBFX0NSRUFURURfQllfTkZEX0FERFJFU1NFUwoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAzCgk9PQoJYnogKmlmNTFfZW5kCgoJLy8gKmlmNTFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI4NAoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIHRoaXMuaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0KGNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0c1swXSwgQXNzZXRJRC5mcm9tVWludDY0KHZhbHVlVG9WZXJpZnkpLmNyZWF0b3IpLAoJLy8gICAgICAgICAgICAgICAgICdzcGVjaWZpZWQgYXNzZXQgbXVzdCBiZSBjcmVhdGVkIGJ5IGNyZWF0b3IgdGhhdCBpcyBvbmUgb2YgdGhlIGxpbmtlZCBhZGRyZXNzZXMgaW4gYW4gbmZkJywKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCglwb3AKCWZyYW1lX2RpZyAyIC8vIGNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCglleHRyYWN0IDExMyA4CglidG9pCgljYWxsc3ViIGlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdAoKCS8vIHNwZWNpZmllZCBhc3NldCBtdXN0IGJlIGNyZWF0ZWQgYnkgY3JlYXRvciB0aGF0IGlzIG9uZSBvZiB0aGUgbGlua2VkIGFkZHJlc3NlcyBpbiBhbiBuZmQKCWFzc2VydAoKKmlmNTFfZW5kOgoJLy8gKmlmNTJfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjg5CgkvLyB0eXBlID09PSBHQVRJTkdfVFlQRV9TRUdNRU5UX09GX05GRAoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCA0Cgk9PQoJYnogKmlmNTJfZW5kCgoJLy8gKmlmNTJfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI5MQoJLy8gdXNlck9mZmVyZWRORkRBcHBJRCA9IHZhbHVlVG9WZXJpZnkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWZyYW1lX2J1cnkgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjkyCgkvLyBhc3NlcnQodGhpcy5pc05GREFwcElEVmFsaWQodXNlck9mZmVyZWRORkRBcHBJRCksICdwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZCcpCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWNhbGxzdWIgaXNORkRBcHBJRFZhbGlkCgoJLy8gcHJvdmlkZWQgTkZEIG11c3QgYmUgdmFsaWQKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyOTUKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICByYXdCeXRlcyhBcHBJRC5mcm9tVWludDY0KHVzZXJPZmZlcmVkTkZEQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzKSA9PT0KCS8vICAgICAgICAgICAgICAgICAgICAgcmF3Qnl0ZXMoc3Rha2VyKSB8fCB0aGlzLmlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdCh1c2VyT2ZmZXJlZE5GREFwcElELCBzdGFrZXIpLAoJLy8gICAgICAgICAgICAgICAgICJwcm92aWRlZCBuZmQgZm9yIGVudHJ5IGlzbid0IG93bmVkIG9yIGxpbmtlZCB0byB0aGUgc3Rha2VyIiwKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyA4IC8vIHVzZXJPZmZlcmVkTkZEQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQodXNlck9mZmVyZWRORkRBcHBJRCkuZ2xvYmFsU3RhdGUoJ2kub3duZXIuYScpCglhc3NlcnQKCWZyYW1lX2RpZyAxIC8vIHN0YWtlcjogYWRkcmVzcwoJPT0KCWR1cAoJYm56ICpza2lwX29yNgoJZnJhbWVfZGlnIDEgLy8gc3Rha2VyOiBhZGRyZXNzCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWNhbGxzdWIgaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0Cgl8fAoKKnNraXBfb3I2OgoJLy8gcHJvdmlkZWQgbmZkIGZvciBlbnRyeSBpc24ndCBvd25lZCBvciBsaW5rZWQgdG8gdGhlIHN0YWtlcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMwMgoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIGJ0b2koQXBwSUQuZnJvbVVpbnQ2NCh1c2VyT2ZmZXJlZE5GREFwcElEKS5nbG9iYWxTdGF0ZSgnaS5wYXJlbnRBcHBJRCcpIGFzIGJ5dGVzKSA9PT0KCS8vICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmVudHJ5R2F0aW5nQXNzZXRzWzBdLAoJLy8gICAgICAgICAgICAgICAgICdzcGVjaWZpZWQgbmZkIG11c3QgYmUgYSBzZWdtZW50IG9mIHRoZSBuZmQgdGhlIHZhbGlkYXRvciBzcGVjaWZpZWQgYXMgYSByZXF1aXJlbWVudCcsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWJ5dGUgMHg2OTJlNzA2MTcyNjU2ZTc0NDE3MDcwNDk0NCAvLyAiaS5wYXJlbnRBcHBJRCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHVzZXJPZmZlcmVkTkZEQXBwSUQpLmdsb2JhbFN0YXRlKCdpLnBhcmVudEFwcElEJykKCWFzc2VydAoJYnRvaQoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMTEzIDgKCWJ0b2kKCT09CgoJLy8gc3BlY2lmaWVkIG5mZCBtdXN0IGJlIGEgc2VnbWVudCBvZiB0aGUgbmZkIHRoZSB2YWxpZGF0b3Igc3BlY2lmaWVkIGFzIGEgcmVxdWlyZW1lbnQKCWFzc2VydAoKKmlmNTJfZW5kOgoJcmV0c3ViCgovLyBpc05GREFwcElEVmFsaWQobmZkQXBwSUQ6IHVpbnQ2NCk6IGJvb2xlYW4KLy8KLy8gQ2hlY2tzIGlmIHRoZSBnaXZlbiBORkQgQXBwIGlkIGlzIHZhbGlkLiAgVXNpbmcgb25seSB0aGUgQXBwIGlkIHRoZXJlJ3Mgbm8gdmFsaWRhdGlvbiBhZ2FpbnN0IHRoZSBuYW1lIChpZTogdGhhdCBuZmQgWCBpcyBuYW1lIFkpCi8vIFNvIGl0J3MgYXNzdW1lZCBmb3IgdGhlIGNhbGxlciwgdGhlIGFwcCBpZCBhbG9uZSBpcyBmaW5lLiAgVGhlIG5hbWUgaXMgZmV0Y2hlZCBmcm9tIHRoZSBzcGVjaWZpZWQgYXBwIGlkIGFuZCB0aGUgdHdvCi8vIHRvZ2V0aGVyIGFyZSB1c2VkIGZvciB2YWxpZGl0eSBjaGVjayBjYWxsIHRvIHRoZSBuZmQgcmVnaXN0cnkuCi8vCi8vIEBwYXJhbSB7dWludDY0fSBuZmRBcHBJRCAtIFRoZSBORkQgQXBwIGlkIHRvIHZlcmlmeS4KLy8KLy8gQHJldHVybnMge2Jvb2xlYW59IC0gUmV0dXJucyB0cnVlIGlmIHRoZSBORkQgQXBwIGlkIGlzIHZhbGlkLCBvdGhlcndpc2UgZmFsc2UuCmlzTkZEQXBwSURWYWxpZDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMyMQoJLy8gdXNlck9mZmVyZWRORkROYW1lID0gQXBwSUQuZnJvbVVpbnQ2NChuZmRBcHBJRCkuZ2xvYmFsU3RhdGUoJ2kubmFtZScpIGFzIHN0cmluZwoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWJ5dGUgMHg2OTJlNmU2MTZkNjUgLy8gImkubmFtZSIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KG5mZEFwcElEKS5nbG9iYWxTdGF0ZSgnaS5uYW1lJykKCWFzc2VydAoJZnJhbWVfYnVyeSAwIC8vIHVzZXJPZmZlcmVkTkZETmFtZTogc3RyaW5nCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMyMwoJLy8gcmV0dXJuIHNlbmRNZXRob2RDYWxsPFtzdHJpbmcsIHVpbnQ2NF0sIGJvb2xlYW4+KHsKCS8vICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQodGhpcy5uZmRSZWdpc3RyeUFwcElkKSwKCS8vICAgICAgICAgICAgIG5hbWU6ICdpc1ZhbGlkTmZkQXBwSWQnLAoJLy8gICAgICAgICAgICAgbWV0aG9kQXJnczogW3VzZXJPZmZlcmVkTkZETmFtZSwgbmZkQXBwSURdLAoJLy8gICAgICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAiaXNWYWxpZE5mZEFwcElkKHN0cmluZyx1aW50NjQpYm9vbCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMyNAoJLy8gYXBwbGljYXRpb25JRDogQXBwSUQuZnJvbVVpbnQ2NCh0aGlzLm5mZFJlZ2lzdHJ5QXBwSWQpCglsb2FkIDIwMCAvLyBUTVBMX25mZFJlZ2lzdHJ5QXBwSWQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMjYKCS8vIG1ldGhvZEFyZ3M6IFt1c2VyT2ZmZXJlZE5GRE5hbWUsIG5mZEFwcElEXQoJZnJhbWVfZGlnIDAgLy8gdXNlck9mZmVyZWRORkROYW1lOiBzdHJpbmcKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoJaXR4biBOdW1Mb2dzCglpbnQgMQoJLQoJaXR4bmFzIExvZ3MKCWV4dHJhY3QgNCAwCglpbnQgMAoJZ2V0Yml0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCglyZXRzdWIKCi8vIGlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdChuZmRBcHBJRDogdWludDY0LCBhZGRyVG9GaW5kOiBBZGRyZXNzKTogYm9vbGVhbgovLwovLyBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBhZGRyZXNzIGlzIHByZXNlbnQgaW4gYW4gTkZEcyBsaXN0IG9mIHZlcmlmaWVkIGFkZHJlc3Nlcy4KLy8gVGhlIE5GRCBpcyBhc3N1bWVkIHRvIGhhdmUgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcyBvZmZpY2lhbC4KLy8KLy8gQHBhcmFtIHt1aW50NjR9IG5mZEFwcElEIC0gVGhlIE5GRCBhcHBsaWNhdGlvbiBpZC4KLy8gQHBhcmFtIHtBZGRyZXNzfSBhZGRyVG9GaW5kIC0gVGhlIGFkZHJlc3MgdG8gZmluZCBpbiB0aGUgdi5jYUFsZ28uMC5hcyBwcm9wZXJ0eQovLyBAcmV0dXJuIHtib29sZWFufSAtIGB0cnVlYCBpZiB0aGUgYWRkcmVzcyBpcyBwcmVzZW50LCBgZmFsc2VgIG90aGVyd2lzZS4KaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0OgoJcHJvdG8gMiAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMzkKCS8vIHNlbmRBcHBDYWxsKHsKCS8vICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLAoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25BcmdzOiBbJ3JlYWRfcHJvcGVydHknLCAndi5jYUFsZ28uMC5hcyddLAoJLy8gICAgICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzQwCgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KG5mZEFwcElEKQoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDEKCS8vIGFwcGxpY2F0aW9uQXJnczogWydyZWFkX3Byb3BlcnR5JywgJ3YuY2FBbGdvLjAuYXMnXQoJYnl0ZSAweDcyNjU2MTY0NWY3MDcyNmY3MDY1NzI3NDc5IC8vICJyZWFkX3Byb3BlcnR5IgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWJ5dGUgMHg3NjJlNjM2MTQxNmM2NzZmMmUzMDJlNjE3MyAvLyAidi5jYUFsZ28uMC5hcyIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDMKCS8vIGNhQWxnb0RhdGEgPSB0aGlzLml0eG4ubGFzdExvZwoJaXR4biBMYXN0TG9nCglmcmFtZV9idXJ5IDAgLy8gY2FBbGdvRGF0YTogYnl0ZVtdCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM0NAoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBjYUFsZ29EYXRhLmxlbmd0aDsgaSArPSAzMikKCWludCAwCglmcmFtZV9idXJ5IDEgLy8gaTogdWludDY0CgoqZm9yXzEwOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM0NAoJLy8gaSA8IGNhQWxnb0RhdGEubGVuZ3RoCglmcmFtZV9kaWcgMSAvLyBpOiB1aW50NjQKCWZyYW1lX2RpZyAwIC8vIGNhQWxnb0RhdGE6IGJ5dGVbXQoJbGVuCgk8CglieiAqZm9yXzEwX2VuZAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDUKCS8vIGFkZHIgPSBleHRyYWN0MyhjYUFsZ29EYXRhLCBpLCAzMikKCWZyYW1lX2RpZyAwIC8vIGNhQWxnb0RhdGE6IGJ5dGVbXQoJZnJhbWVfZGlnIDEgLy8gaTogdWludDY0CglpbnQgMzIKCWV4dHJhY3QzCglmcmFtZV9idXJ5IDIgLy8gYWRkcjogYnl0ZVtdCgoJLy8gKmlmNTNfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzQ2CgkvLyBhZGRyICE9PSByYXdCeXRlcyhnbG9iYWxzLnplcm9BZGRyZXNzKSAmJiBhZGRyID09PSByYXdCeXRlcyhhZGRyVG9GaW5kKQoJZnJhbWVfZGlnIDIgLy8gYWRkcjogYnl0ZVtdCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CglkdXAKCWJ6ICpza2lwX2FuZDExCglmcmFtZV9kaWcgMiAvLyBhZGRyOiBieXRlW10KCWZyYW1lX2RpZyAtMiAvLyBhZGRyVG9GaW5kOiBBZGRyZXNzCgk9PQoJJiYKCipza2lwX2FuZDExOgoJYnogKmlmNTNfZW5kCgoJLy8gKmlmNTNfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM0NwoJLy8gcmV0dXJuIHRydWUKCWludCAxCgliICppc0FkZHJlc3NJbk5GRENBQWxnb0xpc3QqcmV0dXJuCgoqaWY1M19lbmQ6CgoqZm9yXzEwX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM0NAoJLy8gaSArPSAzMgoJZnJhbWVfZGlnIDEgLy8gaTogdWludDY0CglpbnQgMzIKCSsKCWZyYW1lX2J1cnkgMSAvLyBpOiB1aW50NjQKCWIgKmZvcl8xMAoKKmZvcl8xMF9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzUwCgkvLyByZXR1cm4gZmFsc2UKCWludCAwCgoqaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0KnJldHVybjoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDIKCXJldHN1YgoKLy8gYWxnb1NhdHVyYXRpb25MZXZlbCgpOiB1aW50NjQKLy8KLy8gUmV0dXJucyB0aGUgbWF4aW11bSBhbGxvd2VkIHN0YWtlIHBlciB2YWxpZGF0b3IgYmFzZWQgb24gYSBwZXJjZW50YWdlIG9mIGFsbCBjdXJyZW50IG9ubGluZSBzdGFrZSBiZWZvcmUKLy8gdGhlIHZhbGlkYXRvciBpcyBjb25zaWRlcmVkIHNhdHVyYXRlZCAtIHdoZXJlIHJld2FyZHMgYXJlIGRpbWluaXNoZWQuCi8vIE5PVEU6IHRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCB0d2ljZSAtIGhlcmUgYW5kIGluIHN0YWtpbmcgcG9vbCBjb250cmFjdC4gIEJvdGggbXVzdCBiZSBpZGVudGljYWwuCmFsZ29TYXR1cmF0aW9uTGV2ZWw6Cglwcm90byAwIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNTkKCS8vIG9ubGluZSA9IHRoaXMuZ2V0Q3VycmVudE9ubGluZVN0YWtlKCkKCWNhbGxzdWIgZ2V0Q3VycmVudE9ubGluZVN0YWtlCglmcmFtZV9idXJ5IDAgLy8gb25saW5lOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzYxCgkvLyByZXR1cm4gd2lkZVJhdGlvKFtvbmxpbmUsIE1BWF9WQUxJREFUT1JfU09GVF9QQ1RfT0ZfT05MSU5FXzFERUNJTUFMXSwgWzEwMDBdKQoJZnJhbWVfZGlnIDAgLy8gb25saW5lOiB1aW50NjQKCWludCAxMDAKCW11bHcKCWludCAwCglpbnQgMTAwMAoJZGl2bW9kdwoJcG9wCglwb3AKCXN3YXAKCSEKCgkvLyB3aWRlUmF0aW8gZmFpbGVkCglhc3NlcnQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gbWF4QWxsb3dlZFN0YWtlKCk6IHVpbnQ2NAovLwovLyBSZXR1cm5zIHRoZSBNQVhJTVVNIGFsbG93ZWQgc3Rha2UgcGVyIHZhbGlkYXRvciBiYXNlZCBvbiBhIHBlcmNlbnRhZ2Ugb2YgYWxsIGN1cnJlbnQgb25saW5lIHN0YWtlLgovLyBBZGRpbmcgc3Rha2UgaXMgY29tcGxldGVseSBibG9ja2VkIGF0IHRoaXMgYW1vdW50LgptYXhBbGxvd2VkU3Rha2U6Cglwcm90byAwIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNjkKCS8vIG9ubGluZSA9IHRoaXMuZ2V0Q3VycmVudE9ubGluZVN0YWtlKCkKCWNhbGxzdWIgZ2V0Q3VycmVudE9ubGluZVN0YWtlCglmcmFtZV9idXJ5IDAgLy8gb25saW5lOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzcxCgkvLyByZXR1cm4gd2lkZVJhdGlvKFtvbmxpbmUsIE1BWF9WQUxJREFUT1JfSEFSRF9QQ1RfT0ZfT05MSU5FXzFERUNJTUFMXSwgWzEwMDBdKQoJZnJhbWVfZGlnIDAgLy8gb25saW5lOiB1aW50NjQKCWludCAxNTAKCW11bHcKCWludCAwCglpbnQgMTAwMAoJZGl2bW9kdwoJcG9wCglwb3AKCXN3YXAKCSEKCgkvLyB3aWRlUmF0aW8gZmFpbGVkCglhc3NlcnQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gbWF4QWxnb0FsbG93ZWRQZXJQb29sKCk6IHVpbnQ2NAovLwovLyBSZXR1cm5zIHRoZSBNQVhJTVVNIGFsbG93ZWQgc3Rha2UgcGVyIHBvb2wgYW5kIHN0aWxsIHJlY2VpdmUgaW5jZW50aXZlcyAtIHdlJ2xsIHRyZWF0IHRoaXMgYXMgdGhlICdtYXggcGVyIHBvb2wnCm1heEFsZ29BbGxvd2VkUGVyUG9vbDoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNzgKCS8vIHJldHVybiBnbG9iYWxzLnBheW91dHNNYXhCYWxhbmNlCglnbG9iYWwgUGF5b3V0c01heEJhbGFuY2UKCXJldHN1YgoKLy8gZ2V0Q3VycmVudE9ubGluZVN0YWtlKCk6IHVpbnQ2NApnZXRDdXJyZW50T25saW5lU3Rha2U6Cglwcm90byAwIDEKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzgyCgkvLyByZXR1cm4gb25saW5lU3Rha2UoKQoJb25saW5lX3N0YWtlCglyZXRzdWIKCi8vIG1pbkJhbGFuY2VGb3JBY2NvdW50KGNvbnRyYWN0czogdWludDY0LCBleHRyYVBhZ2VzOiB1aW50NjQsIGFzc2V0czogdWludDY0LCBsb2NhbEludHM6IHVpbnQ2NCwgbG9jYWxCeXRlczogdWludDY0LCBnbG9iYWxJbnRzOiB1aW50NjQsIGdsb2JhbEJ5dGVzOiB1aW50NjQpOiB1aW50NjQKbWluQmFsYW5jZUZvckFjY291bnQ6Cglwcm90byA3IDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzOTQKCS8vIG1pbkJhbCA9IEFMR09SQU5EX0FDQ09VTlRfTUlOX0JBTEFOQ0UKCWludCAxMDAwMDAKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzOTUKCS8vIG1pbkJhbCArPSBjb250cmFjdHMgKiBBUFBMSUNBVElPTl9CQVNFX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyBjb250cmFjdHM6IHVpbnQ2NAoJaW50IDEwMDAwMAoJKgoJKwoJZnJhbWVfYnVyeSAwIC8vIG1pbkJhbDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM5NgoJLy8gbWluQmFsICs9IGV4dHJhUGFnZXMgKiBBUFBMSUNBVElPTl9CQVNFX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyBleHRyYVBhZ2VzOiB1aW50NjQKCWludCAxMDAwMDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzOTcKCS8vIG1pbkJhbCArPSBhc3NldHMgKiBBU1NFVF9IT0xESU5HX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMyAvLyBhc3NldHM6IHVpbnQ2NAoJaW50IDEwMDAwMAoJKgoJKwoJZnJhbWVfYnVyeSAwIC8vIG1pbkJhbDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM5OAoJLy8gbWluQmFsICs9IGxvY2FsSW50cyAqIFNTQ19WQUxVRV9VSU5UCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoJZnJhbWVfZGlnIC00IC8vIGxvY2FsSW50czogdWludDY0CglpbnQgMjg1MDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzOTkKCS8vIG1pbkJhbCArPSBnbG9iYWxJbnRzICogU1NDX1ZBTFVFX1VJTlQKCWZyYW1lX2RpZyAwIC8vIG1pbkJhbDogdWludDY0CglmcmFtZV9kaWcgLTYgLy8gZ2xvYmFsSW50czogdWludDY0CglpbnQgMjg1MDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDAKCS8vIG1pbkJhbCArPSBsb2NhbEJ5dGVzICogU1NDX1ZBTFVFX0JZVEVTCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoJZnJhbWVfZGlnIC01IC8vIGxvY2FsQnl0ZXM6IHVpbnQ2NAoJaW50IDUwMDAwCgkqCgkrCglmcmFtZV9idXJ5IDAgLy8gbWluQmFsOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDAxCgkvLyBtaW5CYWwgKz0gZ2xvYmFsQnl0ZXMgKiBTU0NfVkFMVUVfQllURVMKCWZyYW1lX2RpZyAwIC8vIG1pbkJhbDogdWludDY0CglmcmFtZV9kaWcgLTcgLy8gZ2xvYmFsQnl0ZXM6IHVpbnQ2NAoJaW50IDUwMDAwCgkqCgkrCglmcmFtZV9idXJ5IDAgLy8gbWluQmFsOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDAyCgkvLyByZXR1cm4gbWluQmFsCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoJcmV0c3ViCgovLyBjb3N0Rm9yQm94U3RvcmFnZSh0b3RhbE51bUJ5dGVzOiB1aW50NjQpOiB1aW50NjQKY29zdEZvckJveFN0b3JhZ2U6Cglwcm90byAxIDEKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDA5CgkvLyByZXR1cm4gU0NCT1hfUEVSQk9YICsgdG90YWxOdW1CeXRlcyAqIFNDQk9YX1BFUkJZVEUKCWludCAyNTAwCglmcmFtZV9kaWcgLTEgLy8gdG90YWxOdW1CeXRlczogdWludDY0CglpbnQgNDAwCgkqCgkrCglyZXRzdWIKCipjcmVhdGVfTm9PcDoKCW1ldGhvZCAiY3JlYXRlQXBwbGljYXRpb24oKXZvaWQiCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAwCgltYXRjaCAqYWJpX3JvdXRlX2NyZWF0ZUFwcGxpY2F0aW9uCgoJLy8gdGhpcyBjb250cmFjdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGdpdmVuIEFCSSBtZXRob2QgZm9yIGNyZWF0ZSBOb09wCgllcnIKCipjYWxsX05vT3A6CgltZXRob2QgImluaXRTdGFraW5nQ29udHJhY3QodWludDY0KXZvaWQiCgltZXRob2QgImxvYWRTdGFraW5nQ29udHJhY3REYXRhKHVpbnQ2NCxieXRlW10pdm9pZCIKCW1ldGhvZCAiZmluYWxpemVTdGFraW5nQ29udHJhY3QoKXZvaWQiCgltZXRob2QgImdhcygpdm9pZCIKCW1ldGhvZCAiZ2V0TWJyQW1vdW50cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCgltZXRob2QgImdldFByb3RvY29sQ29uc3RyYWludHMoKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiZ2V0TnVtVmFsaWRhdG9ycygpdWludDY0IgoJbWV0aG9kICJnZXRWYWxpZGF0b3JDb25maWcodWludDY0KSh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiZ2V0VmFsaWRhdG9yU3RhdGUodWludDY0KSh1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQpIgoJbWV0aG9kICJnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpIgoJbWV0aG9kICJnZXRQb29scyh1aW50NjQpKHVpbnQ2NCx1aW50MTYsdWludDY0KVtdIgoJbWV0aG9kICJnZXRQb29sQXBwSWQodWludDY0LHVpbnQ2NCl1aW50NjQiCgltZXRob2QgImdldFBvb2xJbmZvKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpKHVpbnQ2NCx1aW50MTYsdWludDY0KSIKCW1ldGhvZCAiZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHVpbnQ2NCl1aW50NjQiCgltZXRob2QgImRvZXNTdGFrZXJOZWVkVG9QYXlNQlIoYWRkcmVzcylib29sIgoJbWV0aG9kICJnZXRTdGFrZWRQb29sc0ZvckFjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCx1aW50NjQpW10iCgltZXRob2QgImdldFRva2VuUGF5b3V0UmF0aW8odWludDY0KSh1aW50NjRbMjRdLHVpbnQ2NCkiCgltZXRob2QgImdldE5vZGVQb29sQXNzaWdubWVudHModWludDY0KSgodWludDY0WzNdKVs4XSkiCgltZXRob2QgImdldE5GRFJlZ2lzdHJ5SUQoKXVpbnQ2NCIKCW1ldGhvZCAiYWRkVmFsaWRhdG9yKHBheSxzdHJpbmcsKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIKCW1ldGhvZCAiY2hhbmdlVmFsaWRhdG9yTWFuYWdlcih1aW50NjQsYWRkcmVzcyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQiCgltZXRob2QgImNoYW5nZVZhbGlkYXRvck5GRCh1aW50NjQsdWludDY0LHN0cmluZyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyh1aW50NjQsYWRkcmVzcyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JSZXdhcmRJbmZvKHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0KXZvaWQiCgltZXRob2QgImFkZFBvb2wocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAic2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KSIKCW1ldGhvZCAic3Rha2VVcGRhdGVkVmlhUmV3YXJkcygodWludDY0LHVpbnQ2NCx1aW50NjQpLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIgoJbWV0aG9kICJzdGFrZVJlbW92ZWQoKHVpbnQ2NCx1aW50NjQsdWludDY0KSxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCl2b2lkIgoJbWV0aG9kICJmaW5kUG9vbEZvclN0YWtlcih1aW50NjQsYWRkcmVzcyx1aW50NjQpKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKSIKCW1ldGhvZCAibW92ZVBvb2xUb05vZGUodWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIKCW1ldGhvZCAiZW1wdHlUb2tlblJld2FyZHModWludDY0LGFkZHJlc3MpdWludDY0IgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggKmFiaV9yb3V0ZV9pbml0U3Rha2luZ0NvbnRyYWN0ICphYmlfcm91dGVfbG9hZFN0YWtpbmdDb250cmFjdERhdGEgKmFiaV9yb3V0ZV9maW5hbGl6ZVN0YWtpbmdDb250cmFjdCAqYWJpX3JvdXRlX2dhcyAqYWJpX3JvdXRlX2dldE1ickFtb3VudHMgKmFiaV9yb3V0ZV9nZXRQcm90b2NvbENvbnN0cmFpbnRzICphYmlfcm91dGVfZ2V0TnVtVmFsaWRhdG9ycyAqYWJpX3JvdXRlX2dldFZhbGlkYXRvckNvbmZpZyAqYWJpX3JvdXRlX2dldFZhbGlkYXRvclN0YXRlICphYmlfcm91dGVfZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyICphYmlfcm91dGVfZ2V0UG9vbHMgKmFiaV9yb3V0ZV9nZXRQb29sQXBwSWQgKmFiaV9yb3V0ZV9nZXRQb29sSW5mbyAqYWJpX3JvdXRlX2dldEN1ck1heFN0YWtlUGVyUG9vbCAqYWJpX3JvdXRlX2RvZXNTdGFrZXJOZWVkVG9QYXlNQlIgKmFiaV9yb3V0ZV9nZXRTdGFrZWRQb29sc0ZvckFjY291bnQgKmFiaV9yb3V0ZV9nZXRUb2tlblBheW91dFJhdGlvICphYmlfcm91dGVfZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cyAqYWJpX3JvdXRlX2dldE5GRFJlZ2lzdHJ5SUQgKmFiaV9yb3V0ZV9hZGRWYWxpZGF0b3IgKmFiaV9yb3V0ZV9jaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyICphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyAqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvck5GRCAqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzICphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mbyAqYWJpX3JvdXRlX2FkZFBvb2wgKmFiaV9yb3V0ZV9hZGRTdGFrZSAqYWJpX3JvdXRlX3NldFRva2VuUGF5b3V0UmF0aW8gKmFiaV9yb3V0ZV9zdGFrZVVwZGF0ZWRWaWFSZXdhcmRzICphYmlfcm91dGVfc3Rha2VSZW1vdmVkICphYmlfcm91dGVfZmluZFBvb2xGb3JTdGFrZXIgKmFiaV9yb3V0ZV9tb3ZlUG9vbFRvTm9kZSAqYWJpX3JvdXRlX2VtcHR5VG9rZW5SZXdhcmRzCgoJLy8gdGhpcyBjb250cmFjdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGdpdmVuIEFCSSBtZXRob2QgZm9yIGNhbGwgTm9PcAoJZXJy", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCgovLyBUaGlzIFRFQUwgd2FzIGdlbmVyYXRlZCBieSBURUFMU2NyaXB0IHYwLjEwMy4wCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbGdvcmFuZGZvdW5kYXRpb24vVEVBTFNjcmlwdAoKLy8gVGhpcyBjb250cmFjdCBpcyBjb21wbGlhbnQgd2l0aCBhbmQvb3IgaW1wbGVtZW50cyB0aGUgZm9sbG93aW5nIEFSQ3M6IFsgQVJDNCBdCgovLyBUaGUgZm9sbG93aW5nIGxpbmVzIG9mIFRFQUwgYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0ZW1wbGF0ZSB2YXJpYWJsZXMgaW4gc2NyYXRjaCBzbG90cwpwdXNoYnl0ZXMgVE1QTF9uZmRSZWdpc3RyeUFwcElkCmJ0b2kKc3RvcmUgMjAwCgovLyBUaGUgZm9sbG93aW5nIHRlbiBsaW5lcyBvZiBURUFMIGhhbmRsZSBpbml0aWFsIHByb2dyYW0gZmxvdwovLyBUaGlzIHBhdHRlcm4gaXMgdXNlZCB0byBtYWtlIGl0IGVhc3kgZm9yIGFueW9uZSB0byBwYXJzZSB0aGUgc3RhcnQgb2YgdGhlIHByb2dyYW0gYW5kIGRldGVybWluZSBpZiBhIHNwZWNpZmljIGFjdGlvbiBpcyBhbGxvd2VkCi8vIEhlcmUsIGFjdGlvbiByZWZlcnMgdG8gdGhlIE9uQ29tcGxldGUgaW4gY29tYmluYXRpb24gd2l0aCB3aGV0aGVyIHRoZSBhcHAgaXMgYmVpbmcgY3JlYXRlZCBvciBjYWxsZWQKLy8gRXZlcnkgcG9zc2libGUgYWN0aW9uIGZvciB0aGlzIGNvbnRyYWN0IGlzIHJlcHJlc2VudGVkIGluIHRoZSBzd2l0Y2ggc3RhdGVtZW50Ci8vIElmIHRoZSBhY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIGluIHRoZSBjb250cmFjdCwgaXRzIHJlc3BlY3RpdmUgYnJhbmNoIHdpbGwgYmUgIipOT1RfSU1QTEVNRU5URUQiIHdoaWNoIGp1c3QgY29udGFpbnMgImVyciIKdHhuIEFwcGxpY2F0aW9uSUQKIQppbnQgNgoqCnR4biBPbkNvbXBsZXRpb24KKwpzd2l0Y2ggKmNhbGxfTm9PcCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKmNyZWF0ZV9Ob09wICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRAoKKk5PVF9JTVBMRU1FTlRFRDoKCS8vIFRoZSByZXF1ZXN0ZWQgYWN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIGNvbnRyYWN0LiBBcmUgeW91IHVzaW5nIHRoZSBjb3JyZWN0IE9uQ29tcGxldGU/IERpZCB5b3Ugc2V0IHlvdXIgYXBwIElEPwoJZXJyCgovLyBjcmVhdGVBcHBsaWNhdGlvbigpdm9pZAoqYWJpX3JvdXRlX2NyZWF0ZUFwcGxpY2F0aW9uOgoJLy8gZXhlY3V0ZSBjcmVhdGVBcHBsaWNhdGlvbigpdm9pZAoJY2FsbHN1YiBjcmVhdGVBcHBsaWNhdGlvbgoJaW50IDEKCXJldHVybgoKLy8gY3JlYXRlQXBwbGljYXRpb24oKTogdm9pZApjcmVhdGVBcHBsaWNhdGlvbjoKCXByb3RvIDAgMAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyCgkvLyB0aGlzLnN0YWtpbmdQb29sSW5pdGlhbGl6ZWQudmFsdWUgPSBmYWxzZQoJYnl0ZSAweDY5NmU2OTc0IC8vICJpbml0IgoJaW50IDAKCWJ5dGUgMHgwMAoJaW50IDAKCXVuY292ZXIgMgoJc2V0Yml0CglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgzCgkvLyB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgPSAwCglieXRlIDB4NmU3NTZkNTYgLy8gIm51bVYiCglpbnQgMAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NAoJLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlID0gMAoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJaW50IDAKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODUKCS8vIHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlID0gMAoJYnl0ZSAweDczNzQ2MTZiNjU2NCAvLyAic3Rha2VkIgoJaW50IDAKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIGluaXRTdGFraW5nQ29udHJhY3QodWludDY0KXZvaWQKKmFiaV9yb3V0ZV9pbml0U3Rha2luZ0NvbnRyYWN0OgoJLy8gYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBpbml0U3Rha2luZ0NvbnRyYWN0KHVpbnQ2NCl2b2lkCgljYWxsc3ViIGluaXRTdGFraW5nQ29udHJhY3QKCWludCAxCglyZXR1cm4KCi8vIGluaXRTdGFraW5nQ29udHJhY3QoYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0KTogdm9pZAppbml0U3Rha2luZ0NvbnRyYWN0OgoJcHJvdG8gMSAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTAKCS8vIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uY3JlYXRlKGFwcHJvdmFsUHJvZ3JhbVNpemUpCglieXRlIDB4NzA2ZjZmNmM1NDY1NmQ3MDZjNjE3NDY1NDE3MDcwNzI2Zjc2NjE2YzQyNzk3NDY1NzMgLy8gInBvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMiCglmcmFtZV9kaWcgLTEgLy8gYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0Cglib3hfY3JlYXRlCglwb3AKCXJldHN1YgoKLy8gbG9hZFN0YWtpbmdDb250cmFjdERhdGEodWludDY0LGJ5dGVbXSl2b2lkCiphYmlfcm91dGVfbG9hZFN0YWtpbmdDb250cmFjdERhdGE6CgkvLyBkYXRhOiBieXRlW10KCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWV4dHJhY3QgMiAwCgoJLy8gb2Zmc2V0OiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGxvYWRTdGFraW5nQ29udHJhY3REYXRhKHVpbnQ2NCxieXRlW10pdm9pZAoJY2FsbHN1YiBsb2FkU3Rha2luZ0NvbnRyYWN0RGF0YQoJaW50IDEKCXJldHVybgoKLy8gbG9hZFN0YWtpbmdDb250cmFjdERhdGEob2Zmc2V0OiB1aW50NjQsIGRhdGE6IGJ5dGVzKTogdm9pZApsb2FkU3Rha2luZ0NvbnRyYWN0RGF0YToKCXByb3RvIDIgMAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk0CgkvLyBhc3NlcnQoIXRoaXMuc3Rha2luZ1Bvb2xJbml0aWFsaXplZC52YWx1ZSkKCWJ5dGUgMHg2OTZlNjk3NCAvLyAiaW5pdCIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMAoJZ2V0Yml0CgkhCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5NQoJLy8gdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5yZXBsYWNlKG9mZnNldCwgZGF0YSkKCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWZyYW1lX2RpZyAtMSAvLyBvZmZzZXQ6IHVpbnQ2NAoJZnJhbWVfZGlnIC0yIC8vIGRhdGE6IGJ5dGVzCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdCgpdm9pZAoqYWJpX3JvdXRlX2ZpbmFsaXplU3Rha2luZ0NvbnRyYWN0OgoJLy8gZXhlY3V0ZSBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdCgpdm9pZAoJY2FsbHN1YiBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdAoJaW50IDEKCXJldHVybgoKLy8gZmluYWxpemVTdGFraW5nQ29udHJhY3QoKTogdm9pZApmaW5hbGl6ZVN0YWtpbmdDb250cmFjdDoKCXByb3RvIDAgMAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk5CgkvLyB0aGlzLnN0YWtpbmdQb29sSW5pdGlhbGl6ZWQudmFsdWUgPSB0cnVlCglieXRlIDB4Njk2ZTY5NzQgLy8gImluaXQiCglpbnQgMQoJYnl0ZSAweDAwCglpbnQgMAoJdW5jb3ZlciAyCglzZXRiaXQKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIGdhcygpdm9pZAoqYWJpX3JvdXRlX2dhczoKCS8vIGV4ZWN1dGUgZ2FzKCl2b2lkCgljYWxsc3ViIGdhcwoJaW50IDEKCXJldHVybgoKLy8gZ2FzKCk6IHZvaWQKLy8KLy8gZ2FzIGlzIGEgZHVtbXkgbm8tb3AgY2FsbCB0aGF0IGNhbiBiZSB1c2VkIHRvIHBvb2wtdXAgcmVzb3VyY2UgcmVmZXJlbmNlcyBhbmQgb3Bjb2RlIGNvc3QKZ2FzOgoJcHJvdG8gMCAwCglyZXRzdWIKCi8vIGdldE1ickFtb3VudHMoKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0TWJyQW1vdW50czoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXRNYnJBbW91bnRzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0TWJyQW1vdW50cygpOiBNYnJBbW91bnRzCi8vCi8vIFJldHVybnMgdGhlIE1CUiBhbW91bnRzIG5lZWRlZCBmb3IgdmFyaW91cyBhY3Rpb25zOgovLyBbCi8vIGFkZFZhbGlkYXRvck1icjogdWludDY0IC0gbWJyIG5lZWRlZCB0byBhZGQgYSBuZXcgdmFsaWRhdG9yIC0gcGFpZCB0byB2YWxpZGF0b3IgY29udHJhY3QKLy8gYWRkUG9vbE1icjogdWludDY0IC0gbWJyIG5lZWRlZCB0byBhZGQgYSBuZXcgcG9vbCAtIHBhaWQgdG8gdmFsaWRhdG9yCi8vIHBvb2xJbml0TWJyOiB1aW50NjQgLSBtYnIgbmVlZGVkIHRvIGluaXRTdG9yYWdlKCkgb2YgcG9vbCAtIHBhaWQgdG8gcG9vbCBpdHNlbGYKLy8gYWRkU3Rha2VyTWJyOiB1aW50NjQgLSBtYnIgc3Rha2VyIG5lZWRzIHRvIGFkZCB0byBmaXJzdCBzdGFraW5nIHBheW1lbnQgKHN0YXlzIHcvIHZhbGlkYXRvcikKLy8gXQpnZXRNYnJBbW91bnRzOgoJcHJvdG8gMCAxCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5CgkvLyByZXR1cm4gewoJLy8gICAgICAgICAgICAgYWRkVmFsaWRhdG9yTWJyOiB0aGlzLmNvc3RGb3JCb3hTdG9yYWdlKDEgLyogdiBwcmVmaXggKi8gKyBsZW48VmFsaWRhdG9ySWRUeXBlPigpICsgbGVuPFZhbGlkYXRvckluZm8+KCkpLAoJLy8gICAgICAgICAgICAgYWRkUG9vbE1icjogdGhpcy5taW5CYWxhbmNlRm9yQWNjb3VudCgKCS8vICAgICAgICAgICAgICAgICAxLAoJLy8gICAgICAgICAgICAgICAgIC8vIHdlIGNvdWxkIGNhbGN1bGF0ZSB0aGlzIGRpcmVjdGx5IGJ5IHJlZmVyZW5jaW5nIHRoZSBzaXplIG9mIHN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtIGJ1dCBpdCB3b3VsZAoJLy8gICAgICAgICAgICAgICAgIC8vIG1lYW4gb3VyIGNhbGxlcnMgd291bGQgaGF2ZSB0byByZWZlcmVuY2UgdGhlIGJveCBBTkQgYnV5IHVwIGkvbyAtIHNvIGp1c3QgZ28gbWF4IG9uIGV4dHJhIHBhZ2VzCgkvLyAgICAgICAgICAgICAgICAgMywKCS8vICAgICAgICAgICAgICAgICAwLAoJLy8gICAgICAgICAgICAgICAgIDAsCgkvLyAgICAgICAgICAgICAgICAgMCwKCS8vICAgICAgICAgICAgICAgICBTdGFraW5nUG9vbC5zY2hlbWEuZ2xvYmFsLm51bVVpbnQsCgkvLyAgICAgICAgICAgICAgICAgU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1CeXRlU2xpY2UsCgkvLyAgICAgICAgICAgICApLAoJLy8gICAgICAgICAgICAgcG9vbEluaXRNYnI6CgkvLyAgICAgICAgICAgICAgICAgQUxHT1JBTkRfQUNDT1VOVF9NSU5fQkFMQU5DRSArCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5jb3N0Rm9yQm94U3RvcmFnZSg3IC8qICdzdGFrZXJzJyBuYW1lICovICsgbGVuPFN0YWtlZEluZm8+KCkgKiBNQVhfU1RBS0VSU19QRVJfUE9PTCksCgkvLyAgICAgICAgICAgICBhZGRTdGFrZXJNYnI6CgkvLyAgICAgICAgICAgICAgICAgLy8gaG93IG11Y2ggdG8gY2hhcmdlIGZvciBmaXJzdCB0aW1lIGEgc3Rha2VyIGFkZHMgc3Rha2UgLSBzaW5jZSB3ZSBhZGQgYSB0cmFja2luZyBib3ggcGVyIHN0YWtlcgoJLy8gICAgICAgICAgICAgICAgIHRoaXMuY29zdEZvckJveFN0b3JhZ2UoCgkvLyAgICAgICAgICAgICAgICAgICAgIDMgLyogJ3NwcycgcHJlZml4ICovICsgbGVuPEFkZHJlc3M+KCkgKyBsZW48VmFsaWRhdG9yUG9vbEtleT4oKSAqIE1BWF9QT09MU19QRVJfU1RBS0VSLAoJLy8gICAgICAgICAgICAgICAgICksIC8vIHNpemUgb2Yga2V5ICsgYWxsIHZhbHVlcwoJLy8gICAgICAgICB9CglpbnQgMTEwMQoJY2FsbHN1YiBjb3N0Rm9yQm94U3RvcmFnZQoJaXRvYgoJaW50IDMKCWludCAxMQoJaW50IDAKCWR1cG4gMgoJaW50IDMKCWludCAxCgljYWxsc3ViIG1pbkJhbGFuY2VGb3JBY2NvdW50CglpdG9iCgljb25jYXQKCWludCAxMDAwMDAKCWludCAxMjgwNwoJY2FsbHN1YiBjb3N0Rm9yQm94U3RvcmFnZQoJKwoJaXRvYgoJY29uY2F0CglpbnQgMTc5CgljYWxsc3ViIGNvc3RGb3JCb3hTdG9yYWdlCglpdG9iCgljb25jYXQKCXJldHN1YgoKLy8gZ2V0UHJvdG9jb2xDb25zdHJhaW50cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0UHJvdG9jb2xDb25zdHJhaW50czoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXRQcm90b2NvbENvbnN0cmFpbnRzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWNhbGxzdWIgZ2V0UHJvdG9jb2xDb25zdHJhaW50cwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFByb3RvY29sQ29uc3RyYWludHMoKTogQ29uc3RyYWludHMKLy8KLy8gUmV0dXJucyB0aGUgcHJvdG9jb2wgY29uc3RyYWludHMgc28gdGhhdCBVSXMgY2FuIGxpbWl0IHdoYXQgdXNlcnMgc3BlY2lmeSBmb3IgdmFsaWRhdG9yIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KZ2V0UHJvdG9jb2xDb25zdHJhaW50czoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0NwoJLy8gcmV0dXJuIHsKCS8vICAgICAgICAgICAgIGVwb2NoUGF5b3V0Um91bmRzTWluOiBNSU5fRVBPQ0hfTEVOR1RILAoJLy8gICAgICAgICAgICAgZXBvY2hQYXlvdXRSb3VuZHNNYXg6IE1BWF9FUE9DSF9MRU5HVEgsCgkvLyAgICAgICAgICAgICBtaW5QY3RUb1ZhbGlkYXRvcldGb3VyRGVjaW1hbHM6IE1JTl9QQ1RfVE9fVkFMSURBVE9SLAoJLy8gICAgICAgICAgICAgbWF4UGN0VG9WYWxpZGF0b3JXRm91ckRlY2ltYWxzOiBNQVhfUENUX1RPX1ZBTElEQVRPUiwKCS8vICAgICAgICAgICAgIG1pbkVudHJ5U3Rha2U6IE1JTl9BTEdPX1NUQUtFX1BFUl9QT09MLAoJLy8gICAgICAgICAgICAgbWF4QWxnb1BlclBvb2w6IHRoaXMubWF4QWxnb0FsbG93ZWRQZXJQb29sKCksCgkvLyAgICAgICAgICAgICBtYXhBbGdvUGVyVmFsaWRhdG9yOiB0aGlzLm1heEFsbG93ZWRTdGFrZSgpLAoJLy8gICAgICAgICAgICAgYW10Q29uc2lkZXJlZFNhdHVyYXRlZDogdGhpcy5hbGdvU2F0dXJhdGlvbkxldmVsKCksCgkvLyAgICAgICAgICAgICBtYXhOb2RlczogTUFYX05PREVTLAoJLy8gICAgICAgICAgICAgbWF4UG9vbHNQZXJOb2RlOiBNQVhfUE9PTFNfUEVSX05PREUsCgkvLyAgICAgICAgICAgICBtYXhTdGFrZXJzUGVyUG9vbDogTUFYX1NUQUtFUlNfUEVSX1BPT0wsCgkvLyAgICAgICAgIH0KCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDBmNDI0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGY0MjQwMDAwMDAwMDAwMDBmNDI0MAoJY2FsbHN1YiBtYXhBbGdvQWxsb3dlZFBlclBvb2wKCWl0b2IKCWNvbmNhdAoJY2FsbHN1YiBtYXhBbGxvd2VkU3Rha2UKCWl0b2IKCWNvbmNhdAoJY2FsbHN1YiBhbGdvU2F0dXJhdGlvbkxldmVsCglpdG9iCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDA4Cgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAzCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMGM4Cgljb25jYXQKCXJldHN1YgoKLy8gZ2V0TnVtVmFsaWRhdG9ycygpdWludDY0CiphYmlfcm91dGVfZ2V0TnVtVmFsaWRhdG9yczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXROdW1WYWxpZGF0b3JzKCl1aW50NjQKCWNhbGxzdWIgZ2V0TnVtVmFsaWRhdG9ycwoJaXRvYgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldE51bVZhbGlkYXRvcnMoKTogdWludDY0Ci8vCi8vIFJldHVybnMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHZhbGlkYXRvcnMKZ2V0TnVtVmFsaWRhdG9yczoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE2NwoJLy8gcmV0dXJuIHRoaXMubnVtVmFsaWRhdG9ycy52YWx1ZQoJYnl0ZSAweDZlNzU2ZDU2IC8vICJudW1WIgoJYXBwX2dsb2JhbF9nZXQKCXJldHN1YgoKLy8gZ2V0VmFsaWRhdG9yQ29uZmlnKHVpbnQ2NCkodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKKmFiaV9yb3V0ZV9nZXRWYWxpZGF0b3JDb25maWc6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFZhbGlkYXRvckNvbmZpZyh1aW50NjQpKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCgljYWxsc3ViIGdldFZhbGlkYXRvckNvbmZpZwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvckNvbmZpZyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogVmFsaWRhdG9yQ29uZmlnCmdldFZhbGlkYXRvckNvbmZpZzoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE3MgoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnCglpbnQgMAoJaW50IDI0MgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCXJldHN1YgoKLy8gZ2V0VmFsaWRhdG9yU3RhdGUodWludDY0KSh1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0VmFsaWRhdG9yU3RhdGU6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFZhbGlkYXRvclN0YXRlKHVpbnQ2NCkodWludDE2LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBnZXRWYWxpZGF0b3JTdGF0ZQoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvclN0YXRlKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBWYWxpZGF0b3JDdXJTdGF0ZQpnZXRWYWxpZGF0b3JTdGF0ZToKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE3NwoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUKCWludCAyNDIgLy8gaGVhZE9mZnNldAoJaW50IDI2CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpCiphYmlfcm91dGVfZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpCgljYWxsc3ViIGdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcih2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogW0FkZHJlc3MsIEFkZHJlc3NdCmdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcjoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE4MgoJLy8gcmV0dXJuIFsKCS8vICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLAoJLy8gICAgICAgICAgICAgdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWFuYWdlciwKCS8vICAgICAgICAgXQoJaW50IDgKCWludCAzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWludCA0MAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJY29uY2F0CglyZXRzdWIKCi8vIGdldFBvb2xzKHVpbnQ2NCkodWludDY0LHVpbnQxNix1aW50NjQpW10KKmFiaV9yb3V0ZV9nZXRQb29sczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0UG9vbHModWludDY0KSh1aW50NjQsdWludDE2LHVpbnQ2NClbXQoJY2FsbHN1YiBnZXRQb29scwoJZHVwCglsZW4KCWludCAxOAoJLwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFBvb2xzKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBQb29sSW5mb1tdCi8vCi8vIFJldHVybiBsaXN0IG9mIGFsbCBwb29scyBmb3IgdGhpcyB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWxpZGF0b3JJZAovLyBAcmV0dXJuIHtQb29sSW5mb1tdfSAtIGFycmF5IG9mIHBvb2xzCi8vIE5vdCBjYWxsYWJsZSBmcm9tIG90aGVyIGNvbnRyYWN0cyBiZWNhdXNlID4xSyByZXR1cm4gYnV0IGNhbiBiZSBjYWxsZWQgdy8gc2ltdWxhdGUgd2hpY2ggYnVtcHMgbG9nIHJldHVybnMKZ2V0UG9vbHM6Cglwcm90byAxIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiAyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk2CgkvLyByZXREYXRhOiBQb29sSW5mb1tdID0gW10KCWJ5dGUgMHgKCWZyYW1lX2J1cnkgMCAvLyByZXREYXRhOiBQb29sSW5mb1tdCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk3CgkvLyBwb29sU2V0ID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29scykKCWludCAyNjggLy8gaGVhZE9mZnNldAoJaW50IDQzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWZyYW1lX2J1cnkgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE5OAoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBwb29sU2V0Lmxlbmd0aDsgaSArPSAxKQoJaW50IDAKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCipmb3JfMDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE5OAoJLy8gaSA8IHBvb2xTZXQubGVuZ3RoCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCAyNAoJPAoJYnogKmZvcl8wX2VuZAoKCS8vICppZjBfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxOTkKCS8vIHBvb2xTZXRbaV0ucG9vbEFwcElkID09PSAwCglmcmFtZV9kaWcgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWYwX2VuZAoKCS8vICppZjBfY29uc2VxdWVudAoJYiAqZm9yXzBfZW5kCgoqaWYwX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIwMwoJLy8gcmV0RGF0YS5wdXNoKHBvb2xTZXRbaV0pCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBQb29sSW5mb1tdCglmcmFtZV9kaWcgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDE4CglleHRyYWN0MwoJY29uY2F0CglmcmFtZV9idXJ5IDAgLy8gcmV0RGF0YTogUG9vbEluZm9bXQoKKmZvcl8wX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk4CgkvLyBpICs9IDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCWIgKmZvcl8wCgoqZm9yXzBfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjA1CgkvLyByZXR1cm4gcmV0RGF0YQoJZnJhbWVfZGlnIDAgLy8gcmV0RGF0YTogUG9vbEluZm9bXQoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDIKCXJldHN1YgoKLy8gZ2V0UG9vbEFwcElkKHVpbnQ2NCx1aW50NjQpdWludDY0CiphYmlfcm91dGVfZ2V0UG9vbEFwcElkOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBwb29sSWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJYnRvaQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFBvb2xBcHBJZCh1aW50NjQsdWludDY0KXVpbnQ2NAoJY2FsbHN1YiBnZXRQb29sQXBwSWQKCWl0b2IKCWNvbmNhdAoJbG9nCglpbnQgMQoJcmV0dXJuCgovLyBnZXRQb29sQXBwSWQodmFsaWRhdG9ySWQ6IHVpbnQ2NCwgcG9vbElkOiB1aW50NjQpOiB1aW50NjQKLy8KLy8gZ2V0UG9vbEFwcElkIGlzIHVzZWZ1bCBmb3IgY2FsbGVycyB0byBkZXRlcm1pbmUgYXBwIHRvIGNhbGwgZm9yIHJlbW92aW5nIHN0YWtlIGlmIHRoZXkgZG9uJ3QgaGF2ZSBzdGFraW5nIG9yCi8vIHdhbnQgdG8gZ2V0IHN0YWtlciBsaXN0IGZvciBhbiBhY2NvdW50LiAgVGhlIHN0YWtpbmcgcG9vbCBhbHNvIHVzZXMgaXQgdG8gZ2V0IHRoZSBhcHAgaWQgb2Ygc3Rha2luZyBwb29sIDEKLy8gKHdoaWNoIGNvbnRhaW5zIHJld2FyZCB0b2tlbnMgaWYgYmVpbmcgdXNlZCkgc28gdGhhdCB0aGUgYW1vdW50IGF2YWlsYWJsZSBjYW4gYmUgZGV0ZXJtaW5lZC4KZ2V0UG9vbEFwcElkOgoJcHJvdG8gMiAxCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjE1CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBwb29sSWQgIT09IDAgJiYgcG9vbElkIDw9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHMubGVuZ3RoLAoJLy8gICAgICAgICAgICAgJ3Bvb2wgaWQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIG51bWJlciBvZiBwb29scyBmb3IgdGhpcyB2YWxpZGF0b3InLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTIgLy8gcG9vbElkOiB1aW50NjQKCWludCAwCgkhPQoJZHVwCglieiAqc2tpcF9hbmQwCglmcmFtZV9kaWcgLTIgLy8gcG9vbElkOiB1aW50NjQKCWludCAyNAoJPD0KCSYmCgoqc2tpcF9hbmQwOgoJLy8gcG9vbCBpZCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgbnVtYmVyIG9mIHBvb2xzIGZvciB0aGlzIHZhbGlkYXRvcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjE5CgkvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1twb29sSWQgLSAxXS5wb29sQXBwSWQKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0yIC8vIHBvb2xJZDogdWludDY0CglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCXJldHN1YgoKLy8gZ2V0UG9vbEluZm8oKHVpbnQ2NCx1aW50NjQsdWludDY0KSkodWludDY0LHVpbnQxNix1aW50NjQpCiphYmlfcm91dGVfZ2V0UG9vbEluZm86CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHBvb2xLZXk6ICh1aW50NjQsdWludDY0LHVpbnQ2NCkKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWR1cAoJbGVuCglpbnQgMjQKCT09CgoJLy8gYXJndW1lbnQgMCAocG9vbEtleSkgZm9yIGdldFBvb2xJbmZvIG11c3QgYmUgYSAodWludDY0LHVpbnQ2NCx1aW50NjQpCglhc3NlcnQKCgkvLyBleGVjdXRlIGdldFBvb2xJbmZvKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpKHVpbnQ2NCx1aW50MTYsdWludDY0KQoJY2FsbHN1YiBnZXRQb29sSW5mbwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFBvb2xJbmZvKHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkpOiBQb29sSW5mbwpnZXRQb29sSW5mbzoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIyNAoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRDdXJNYXhTdGFrZVBlclBvb2wodWludDY0KXVpbnQ2NAoqYWJpX3JvdXRlX2dldEN1ck1heFN0YWtlUGVyUG9vbDoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHVpbnQ2NCl1aW50NjQKCWNhbGxzdWIgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sCglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiB1aW50NjQKLy8KLy8gQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIHN0YWtlIHBlciBwb29sIGZvciBhIGdpdmVuIHZhbGlkYXRvci4KLy8gTm9ybWFsbHkgdGhpcyB3b3VsZCBiZSBtYXhBbGdvUGVyUG9vbCwgYnV0IGl0IHNob3VsZCBhbHNvIG5ldmVyIGdvIGFib3ZlIE1heEFsbG93ZWRTdGFrZSAvIG51bVBvb2xzIHNvCi8vIGFzIHBvb2xzIGFyZSBhZGRlZCB0aGUgbWF4IGFsbG93ZWQgcGVyIHBvb2wgY2FuIHJlZHVjZS4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCmdldEN1ck1heFN0YWtlUGVyUG9vbDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzYKCS8vIG51bVBvb2xzID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyBhcyB1aW50NjQKCWludCAyNDIKCWludCAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIG51bVBvb2xzOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzcKCS8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzID0gdGhpcy5tYXhBbGxvd2VkU3Rha2UoKSAvIG51bVBvb2xzCgljYWxsc3ViIG1heEFsbG93ZWRTdGFrZQoJZnJhbWVfZGlnIDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoJLwoJZnJhbWVfYnVyeSAxIC8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzgKCS8vIG1heFBlclBvb2w6IHVpbnQ2NCA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1heEFsZ29QZXJQb29sCglpbnQgMjE3CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCgkvLyAqaWYxX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjM5CgkvLyBtYXhQZXJQb29sID09PSAwCglmcmFtZV9kaWcgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCWludCAwCgk9PQoJYnogKmlmMV9lbmQKCgkvLyAqaWYxX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI0MAoJLy8gbWF4UGVyUG9vbCA9IHRoaXMubWF4QWxnb0FsbG93ZWRQZXJQb29sKCkKCWNhbGxzdWIgbWF4QWxnb0FsbG93ZWRQZXJQb29sCglmcmFtZV9idXJ5IDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoqaWYxX2VuZDoKCS8vICppZjJfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNDIKCS8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzIDwgbWF4UGVyUG9vbAoJZnJhbWVfZGlnIDEgLy8gaGFyZE1heERpdmlkZWRCZXR3ZWVuUG9vbHM6IHVpbnQ2NAoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8CglieiAqaWYyX2VuZAoKCS8vICppZjJfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjQzCgkvLyBtYXhQZXJQb29sID0gaGFyZE1heERpdmlkZWRCZXR3ZWVuUG9vbHMKCWZyYW1lX2RpZyAxIC8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzOiB1aW50NjQKCWZyYW1lX2J1cnkgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCippZjJfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjQ1CgkvLyByZXR1cm4gbWF4UGVyUG9vbAoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCgoJLy8gcG9wIGFsbCBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUgc3RhY2sKCXBvcG4gMgoJcmV0c3ViCgovLyBkb2VzU3Rha2VyTmVlZFRvUGF5TUJSKGFkZHJlc3MpYm9vbAoqYWJpX3JvdXRlX2RvZXNTdGFrZXJOZWVkVG9QYXlNQlI6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHN0YWtlcjogYWRkcmVzcwoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZHVwCglsZW4KCWludCAzMgoJPT0KCgkvLyBhcmd1bWVudCAwIChzdGFrZXIpIGZvciBkb2VzU3Rha2VyTmVlZFRvUGF5TUJSIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBleGVjdXRlIGRvZXNTdGFrZXJOZWVkVG9QYXlNQlIoYWRkcmVzcylib29sCgljYWxsc3ViIGRvZXNTdGFrZXJOZWVkVG9QYXlNQlIKCWJ5dGUgMHgwMAoJaW50IDAKCXVuY292ZXIgMgoJc2V0Yml0Cgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZG9lc1N0YWtlck5lZWRUb1BheU1CUihzdGFrZXI6IEFkZHJlc3MpOiBib29sZWFuCi8vCi8vIEhlbHBlciBjYWxsZXJzIGNhbiBjYWxsIHcvIHNpbXVsYXRlIHRvIGRldGVybWluZSBpZiAnQWRkU3Rha2VyJyBNQlIgc2hvdWxkIGJlIGluY2x1ZGVkIHcvIHN0YWtpbmcgYW1vdW50Ci8vIEBwYXJhbSBzdGFrZXIKZG9lc1N0YWtlck5lZWRUb1BheU1CUjoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI1NAoJLy8gcmV0dXJuICF0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS5leGlzdHMKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZXI6IEFkZHJlc3MKCWNvbmNhdAoJYm94X2xlbgoJc3dhcAoJcG9wCgkhCglyZXRzdWIKCi8vIGdldFN0YWtlZFBvb2xzRm9yQWNjb3VudChhZGRyZXNzKSh1aW50NjQsdWludDY0LHVpbnQ2NClbXQoqYWJpX3JvdXRlX2dldFN0YWtlZFBvb2xzRm9yQWNjb3VudDoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gc3Rha2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKHN0YWtlcikgZm9yIGdldFN0YWtlZFBvb2xzRm9yQWNjb3VudCBtdXN0IGJlIGEgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBnZXRTdGFrZWRQb29sc0ZvckFjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCx1aW50NjQpW10KCWNhbGxzdWIgZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50CglkdXAKCWxlbgoJaW50IDI0CgkvCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0Cgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50KHN0YWtlcjogQWRkcmVzcyk6IFZhbGlkYXRvclBvb2xLZXlbXQovLwovLyBSZXRyaWV2ZXMgdGhlIHN0YWtlZCBwb29scyBmb3IgYW4gYWNjb3VudC4KLy8KLy8gQHBhcmFtIHtBZGRyZXNzfSBzdGFrZXIgLSBUaGUgYWNjb3VudCB0byByZXRyaWV2ZSBzdGFrZWQgcG9vbHMgZm9yLgovLyBAcmV0dXJuIHtWYWxpZGF0b3JQb29sS2V5W119IC0gVGhlIGFycmF5IG9mIHN0YWtlZCBwb29scyBmb3IgdGhlIGFjY291bnQuCmdldFN0YWtlZFBvb2xzRm9yQWNjb3VudDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyAqaWYzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjY1CgkvLyAhdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikuZXhpc3RzCglieXRlIDB4NzM3MDczIC8vICJzcHMiCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoJIQoJYnogKmlmM19lbmQKCgkvLyAqaWYzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2NgoJLy8gcmV0dXJuIFtdCglieXRlIDB4CgliICpnZXRTdGFrZWRQb29sc0ZvckFjY291bnQqcmV0dXJuCgoqaWYzX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2OAoJLy8gcmV0RGF0YTogVmFsaWRhdG9yUG9vbEtleVtdID0gW10KCWJ5dGUgMHgKCWZyYW1lX2J1cnkgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjkKCS8vIHBvb2xTZXQgPSBjbG9uZSh0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZSkKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZXI6IEFkZHJlc3MKCWNvbmNhdAoJYm94X2dldAoKCS8vIGJveCB2YWx1ZSBkb2VzIG5vdCBleGlzdDogdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUKCWFzc2VydAoJZnJhbWVfYnVyeSAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzAKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgcG9vbFNldC5sZW5ndGg7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzE6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzAKCS8vIGkgPCBwb29sU2V0Lmxlbmd0aAoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl8xX2VuZAoKCS8vICppZjRfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzEKCS8vIHBvb2xTZXRbaV0uaWQgIT09IDAKCWZyYW1lX2RpZyAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgkhPQoJYnogKmlmNF9lbmQKCgkvLyAqaWY0X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI3MgoJLy8gcmV0RGF0YS5wdXNoKHBvb2xTZXRbaV0pCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCWZyYW1lX2RpZyAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWNvbmNhdAoJZnJhbWVfYnVyeSAwIC8vIHJldERhdGE6IFZhbGlkYXRvclBvb2xLZXlbXQoKKmlmNF9lbmQ6CgoqZm9yXzFfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzAKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzEKCipmb3JfMV9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzUKCS8vIHJldHVybiByZXREYXRhCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCipnZXRTdGFrZWRQb29sc0ZvckFjY291bnQqcmV0dXJuOgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCgoJLy8gcG9wIGFsbCBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUgc3RhY2sKCXBvcG4gMgoJcmV0c3ViCgovLyBnZXRUb2tlblBheW91dFJhdGlvKHVpbnQ2NCkodWludDY0WzI0XSx1aW50NjQpCiphYmlfcm91dGVfZ2V0VG9rZW5QYXlvdXRSYXRpbzoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KQoJY2FsbHN1YiBnZXRUb2tlblBheW91dFJhdGlvCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0VG9rZW5QYXlvdXRSYXRpbyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogUG9vbFRva2VuUGF5b3V0UmF0aW8KLy8KLy8gUmV0cmlldmVzIHRoZSB0b2tlbiBwYXlvdXQgcmF0aW8gZm9yIGEgZ2l2ZW4gdmFsaWRhdG9yIC0gcmV0dXJuaW5nIHRoZSBwb29sIHJhdGlvcyBvZiB3aG9sZSBzbyB0aGF0IHRva2VuCi8vIHBheW91dHMgYWNyb3NzIHBvb2xzIGNhbiBiZSBiYXNlZCBvbiBhIHN0YWJsZSBzbmFwaG9zdCBvZiBzdGFrZS4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEByZXR1cm4ge1Bvb2xUb2tlblBheW91dFJhdGlvfSAtIFRoZSB0b2tlbiBwYXlvdXQgcmF0aW8gZm9yIHRoZSB2YWxpZGF0b3IuCmdldFRva2VuUGF5b3V0UmF0aW86Cglwcm90byAxIDEKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyODcKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCXJldHN1YgoKLy8gZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cyh1aW50NjQpKCh1aW50NjRbM10pWzhdKQoqYWJpX3JvdXRlX2dldE5vZGVQb29sQXNzaWdubWVudHM6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldE5vZGVQb29sQXNzaWdubWVudHModWludDY0KSgodWludDY0WzNdKVs4XSkKCWNhbGxzdWIgZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldE5vZGVQb29sQXNzaWdubWVudHModmFsaWRhdG9ySWQ6IHVpbnQ2NCk6IE5vZGVQb29sQXNzaWdubWVudENvbmZpZwpnZXROb2RlUG9vbEFzc2lnbm1lbnRzOgoJcHJvdG8gMSAxCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjkyCgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS5leGlzdHMsICJ0aGUgc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBkb2Vzbid0IGV4aXN0IikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoKCS8vIHRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGRvZXNuJ3QgZXhpc3QKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI5NAoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUubm9kZVBvb2xBc3NpZ25tZW50cwoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRORkRSZWdpc3RyeUlEKCl1aW50NjQKKmFiaV9yb3V0ZV9nZXRORkRSZWdpc3RyeUlEOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBleGVjdXRlIGdldE5GRFJlZ2lzdHJ5SUQoKXVpbnQ2NAoJY2FsbHN1YiBnZXRORkRSZWdpc3RyeUlECglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0TkZEUmVnaXN0cnlJRCgpOiB1aW50NjQKZ2V0TkZEUmVnaXN0cnlJRDoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI5OQoJLy8gcmV0dXJuIHRoaXMubmZkUmVnaXN0cnlBcHBJZAoJbG9hZCAyMDAgLy8gVE1QTF9uZmRSZWdpc3RyeUFwcElkCglyZXRzdWIKCi8vIGFkZFZhbGlkYXRvcihwYXksc3RyaW5nLCh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KSl1aW50NjQKKmFiaV9yb3V0ZV9hZGRWYWxpZGF0b3I6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIGNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDI0MgoJPT0KCgkvLyBhcmd1bWVudCAwIChjb25maWcpIGZvciBhZGRWYWxpZGF0b3IgbXVzdCBiZSBhICh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KQoJYXNzZXJ0CgoJLy8gbmZkTmFtZTogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglleHRyYWN0IDIgMAoKCS8vIG1iclBheW1lbnQ6IHBheQoJdHhuIEdyb3VwSW5kZXgKCWludCAxCgktCglkdXAKCWd0eG5zIFR5cGVFbnVtCglpbnQgcGF5Cgk9PQoKCS8vIGFyZ3VtZW50IDIgKG1iclBheW1lbnQpIGZvciBhZGRWYWxpZGF0b3IgbXVzdCBiZSBhIHBheSB0cmFuc2FjdGlvbgoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBhZGRWYWxpZGF0b3IocGF5LHN0cmluZywodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkpdWludDY0CgljYWxsc3ViIGFkZFZhbGlkYXRvcgoJaXRvYgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFZhbGlkYXRvcihtYnJQYXltZW50OiBQYXlUeG4sIG5mZE5hbWU6IHN0cmluZywgY29uZmlnOiBWYWxpZGF0b3JDb25maWcpOiB1aW50NjQKLy8KLy8gQWRkcyBhIG5ldyB2YWxpZGF0b3IKLy8gUmVxdWlyZXMgYXQgbGVhc3QgMTAgQUxHTyBhcyB0aGUgJ2ZlZScgZm9yIHRoZSB0cmFuc2FjdGlvbiB0byBoZWxwIGRpc3N1YWRlIHNwYW1tZWQgdmFsaWRhdG9yIGFkZHMuCi8vCi8vIEBwYXJhbSB7UGF5VHhufSBtYnJQYXltZW50IHBheW1lbnQgZnJvbSBjYWxsZXIgd2hpY2ggY292ZXJzIG1iciBpbmNyZWFzZSBvZiBuZXcgdmFsaWRhdG9yIHN0b3JhZ2UKLy8gQHBhcmFtIHtzdHJpbmd9IG5mZE5hbWUgKE9wdGlvbmFsKSBOYW1lIG9mIG5mZCAodXNlZCBhcyBkb3VibGUtY2hlY2sgYWdhaW5zdCBpZCBzcGVjaWZpZWQgaW4gY29uZmlnKQovLyBAcGFyYW0ge1ZhbGlkYXRvckNvbmZpZ30gY29uZmlnIFZhbGlkYXRvckNvbmZpZyBzdHJ1Y3QKLy8gQHJldHVybnMge3VpbnQ2NH0gdmFsaWRhdG9yIGlkCmFkZFZhbGlkYXRvcjoKCXByb3RvIDMgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzExCgkvLyB0aGlzLnZhbGlkYXRlQ29uZmlnKGNvbmZpZykKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJY2FsbHN1YiB2YWxpZGF0ZUNvbmZpZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxMwoJLy8gdmVyaWZ5UGF5VHhuKG1iclBheW1lbnQsIHsgcmVjZWl2ZXI6IHRoaXMuYXBwLmFkZHJlc3MsIGFtb3VudDogdGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkVmFsaWRhdG9yTWJyIH0pCgkvLyB2ZXJpZnkgcmVjZWl2ZXIKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIFJlY2VpdmVyCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6InJlY2VpdmVyIiwiZXhwZWN0ZWQiOiJ0aGlzLmFwcC5hZGRyZXNzIn0KCWFzc2VydAoKCS8vIHZlcmlmeSBhbW91bnQKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCglleHRyYWN0IDAgOAoJYnRvaQoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6ImFtb3VudCIsImV4cGVjdGVkIjoidGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkVmFsaWRhdG9yTWJyIn0KCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxNQoJLy8gYXNzZXJ0KG1iclBheW1lbnQuZmVlID4gMTAgKiAxMDAwMDAwLCAnZmVlIG11c3QgYmUgMTAgQUxHTyBvciBtb3JlIHRvIHByZXZlbnQgc3BhbW1pbmcgb2YgdmFsaWRhdG9ycycpCglmcmFtZV9kaWcgLTEgLy8gbWJyUGF5bWVudDogUGF5VHhuCglndHhucyBGZWUKCWludCAxMDAwMDAwMAoJPgoKCS8vIGZlZSBtdXN0IGJlIDEwIEFMR08gb3IgbW9yZSB0byBwcmV2ZW50IHNwYW1taW5nIG9mIHZhbGlkYXRvcnMKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxOAoJLy8gdmFsaWRhdG9ySWQgPSB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgKyAxCglieXRlIDB4NmU3NTZkNTYgLy8gIm51bVYiCglhcHBfZ2xvYmFsX2dldAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzE5CgkvLyB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgPSB2YWxpZGF0b3JJZAoJYnl0ZSAweDZlNzU2ZDU2IC8vICJudW1WIgoJZnJhbWVfZGlnIDAgLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMjEKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkuY3JlYXRlKCkKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJaW50IDEwOTIKCWJveF9jcmVhdGUKCXBvcAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMyMgoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcgPSBjb25maWcKCWludCAwCglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMjMKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLmlkID0gdmFsaWRhdG9ySWQKCWludCAwCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gKmlmNV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMyNgoJLy8gY29uZmlnLm5mZEZvckluZm8gIT09IDAKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA3MiA4CglidG9pCglpbnQgMAoJIT0KCWJ6ICppZjVfZW5kCgoJLy8gKmlmNV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMjgKCS8vIGFzc2VydCh0aGlzLmlzTkZEQXBwSURWYWxpZChjb25maWcubmZkRm9ySW5mbyksICdwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZCcpCglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgNzIgOAoJYnRvaQoJY2FsbHN1YiBpc05GREFwcElEVmFsaWQKCgkvLyBwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzMwCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgdGhpcy50eG4uc2VuZGVyID09PSAoQXBwSUQuZnJvbVVpbnQ2NChjb25maWcubmZkRm9ySW5mbykuZ2xvYmFsU3RhdGUoJ2kub3duZXIuYScpIGFzIEFkZHJlc3MpLAoJLy8gICAgICAgICAgICAgICAgICdJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXInLAoJLy8gICAgICAgICAgICAgKQoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIC0zIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDcyIDgKCWJ0b2kKCWJ5dGUgMHg2OTJlNmY3NzZlNjU3MjJlNjEgLy8gImkub3duZXIuYSIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KGNvbmZpZy5uZmRGb3JJbmZvKS5nbG9iYWxTdGF0ZSgnaS5vd25lci5hJykKCWFzc2VydAoJPT0KCgkvLyBJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXIKCWFzc2VydAoKKmlmNV9lbmQ6CgkvLyAqaWY2X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzM2CgkvLyBjb25maWcuZW50cnlHYXRpbmdUeXBlID09PSBHQVRJTkdfVFlQRV9DUkVBVEVEX0JZX05GRF9BRERSRVNTRVMgfHwKCS8vICAgICAgICAgICAgIGNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX1NFR01FTlRfT0ZfTkZECglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgODAgMQoJYnRvaQoJaW50IDMKCT09CglkdXAKCWJueiAqc2tpcF9vcjAKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4MCAxCglidG9pCglpbnQgNAoJPT0KCXx8Cgoqc2tpcF9vcjA6CglieiAqaWY2X2VuZAoKCS8vICppZjZfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzQwCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5pc05GREFwcElEVmFsaWQoY29uZmlnLmVudHJ5R2F0aW5nQXNzZXRzWzBdKSwKCS8vICAgICAgICAgICAgICAgICAncHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZEJywKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAxMTMgOAoJYnRvaQoJY2FsbHN1YiBpc05GREFwcElEVmFsaWQKCgkvLyBwcm92aWRlZCBORkQgQXBwIGlkIGZvciBnYXRpbmcgbXVzdCBiZSB2YWxpZCBORkQKCWFzc2VydAoKKmlmNl9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNDUKCS8vIHRoaXMucmV0aU9QX2FkZGVkVmFsaWRhdG9yLmxvZyh7IGlkOiB2YWxpZGF0b3JJZCwgb3duZXI6IGNvbmZpZy5vd25lciwgbWFuYWdlcjogY29uZmlnLm1hbmFnZXIgfSkKCWJ5dGUgMHhhOGRkMjFjYiAvLyByZXRpT1BfYWRkZWRWYWxpZGF0b3IodWludDY0LGFkZHJlc3MsYWRkcmVzcykKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4IDMyCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA0MCAzMgoJY29uY2F0Cgljb25jYXQKCWxvZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM0NgoJLy8gcmV0dXJuIHZhbGlkYXRvcklkCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvck1hbmFnZXIodWludDY0LGFkZHJlc3Mpdm9pZAoqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvck1hbmFnZXI6CgkvLyBtYW5hZ2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKG1hbmFnZXIpIGZvciBjaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyKHVpbnQ2NCxhZGRyZXNzKXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yTWFuYWdlcgoJaW50IDEKCXJldHVybgoKLy8gY2hhbmdlVmFsaWRhdG9yTWFuYWdlcih2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBtYW5hZ2VyOiBBZGRyZXNzKTogdm9pZAovLwovLyBDaGFuZ2VzIHRoZSBWYWxpZGF0b3IgbWFuYWdlciBmb3IgYSBzcGVjaWZpYyBWYWxpZGF0b3IgaWQuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gY2hhbmdlIHRoZSBtYW5hZ2VyIGZvci4KLy8gQHBhcmFtIHtBZGRyZXNzfSBtYW5hZ2VyIC0gVGhlIG5ldyBtYW5hZ2VyIGFkZHJlc3MuCmNoYW5nZVZhbGlkYXRvck1hbmFnZXI6Cglwcm90byAyIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNTcKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM1OAoJLy8gYXNzZXJ0KG1hbmFnZXIgIT09IGdsb2JhbHMuemVyb0FkZHJlc3MsICduZWVkcyB0byBhdCBsZWFzdCBiZSB2YWxpZCBhZGRyZXNzJykKCWZyYW1lX2RpZyAtMiAvLyBtYW5hZ2VyOiBBZGRyZXNzCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CgoJLy8gbmVlZHMgdG8gYXQgbGVhc3QgYmUgdmFsaWQgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzU5CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5tYW5hZ2VyID0gbWFuYWdlcgoJaW50IDQwCglmcmFtZV9kaWcgLTIgLy8gbWFuYWdlcjogQWRkcmVzcwoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCXJldHN1YgoKLy8gY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyh1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkCiphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbzoKCS8vIHN1bnNldHRpbmdUbzogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglidG9pCgoJLy8gc3Vuc2V0dGluZ09uOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbwoJaW50IDEKCXJldHVybgoKLy8gY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBzdW5zZXR0aW5nT246IHVpbnQ2NCwgc3Vuc2V0dGluZ1RvOiBWYWxpZGF0b3JJZFR5cGUpOiB2b2lkCi8vCi8vIFVwZGF0ZXMgdGhlIHN1bnNldCBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiB2YWxpZGF0b3IuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gdXBkYXRlLgovLyBAcGFyYW0ge3VpbnQ2NH0gc3Vuc2V0dGluZ09uIC0gVGhlIG5ldyBzdW5zZXQgdGltZXN0YW1wLgovLyBAcGFyYW0ge3VpbnQ2NH0gc3Vuc2V0dGluZ1RvIC0gVGhlIG5ldyBzdW5zZXQgdG8gdmFsaWRhdG9yIGlkLgpjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvOgoJcHJvdG8gMyAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzcxCgkvLyB0aGlzLmNhbGxlck11c3RCZU93bmVyKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgY2FsbGVyTXVzdEJlT3duZXIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNzIKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnN1bnNldHRpbmdPbiA9IHN1bnNldHRpbmdPbgoJaW50IDIyNgoJZnJhbWVfZGlnIC0yIC8vIHN1bnNldHRpbmdPbjogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM3MwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcuc3Vuc2V0dGluZ1RvID0gc3Vuc2V0dGluZ1RvCglpbnQgMjM0CglmcmFtZV9kaWcgLTMgLy8gc3Vuc2V0dGluZ1RvOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvck5GRCh1aW50NjQsdWludDY0LHN0cmluZyl2b2lkCiphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yTkZEOgoJLy8gbmZkTmFtZTogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglleHRyYWN0IDIgMAoKCS8vIG5mZEFwcElEOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JORkQodWludDY0LHVpbnQ2NCxzdHJpbmcpdm9pZAoJY2FsbHN1YiBjaGFuZ2VWYWxpZGF0b3JORkQKCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvck5GRCh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBuZmRBcHBJRDogdWludDY0LCBuZmROYW1lOiBzdHJpbmcpOiB2b2lkCi8vCi8vIENoYW5nZXMgdGhlIE5GRCBmb3IgYSB2YWxpZGF0b3IgaW4gdGhlIHZhbGlkYXRvckxpc3QgY29udHJhY3QuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gdXBkYXRlLgovLyBAcGFyYW0ge3VpbnQ2NH0gbmZkQXBwSUQgLSBUaGUgYXBwbGljYXRpb24gaWQgb2YgdGhlIE5GRCB0byBhc3NpZ24gdG8gdGhlIHZhbGlkYXRvci4KLy8gQHBhcmFtIHtzdHJpbmd9IG5mZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgTkZEICh3aGljaCBtdXN0IG1hdGNoKQpjaGFuZ2VWYWxpZGF0b3JORkQ6Cglwcm90byAzIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozODUKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM4NwoJLy8gYXNzZXJ0KHRoaXMuaXNORkRBcHBJRFZhbGlkKG5mZEFwcElEKSwgJ3Byb3ZpZGVkIE5GRCBtdXN0IGJlIHZhbGlkJykKCWZyYW1lX2RpZyAtMiAvLyBuZmRBcHBJRDogdWludDY0CgljYWxsc3ViIGlzTkZEQXBwSURWYWxpZAoKCS8vIHByb3ZpZGVkIE5GRCBtdXN0IGJlIHZhbGlkCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozODkKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHRoaXMudHhuLnNlbmRlciA9PT0gKEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzKSwKCS8vICAgICAgICAgICAgICdJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXInLAoJLy8gICAgICAgICApCgl0eG4gU2VuZGVyCglmcmFtZV9kaWcgLTIgLy8gbmZkQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKQoJYXNzZXJ0Cgk9PQoKCS8vIElmIHNwZWNpZnlpbmcgTkZELCBhY2NvdW50IGFkZGluZyB2YWxpZGF0b3IgbXVzdCBiZSBvd25lcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzkzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5uZmRGb3JJbmZvID0gbmZkQXBwSUQKCWludCA3MgoJZnJhbWVfZGlnIC0yIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHVpbnQ2NCxhZGRyZXNzKXZvaWQKKmFiaV9yb3V0ZV9jaGFuZ2VWYWxpZGF0b3JDb21taXNzaW9uQWRkcmVzczoKCS8vIGNvbW1pc3Npb25BZGRyZXNzOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKGNvbW1pc3Npb25BZGRyZXNzKSBmb3IgY2hhbmdlVmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MgbXVzdCBiZSBhIGFkZHJlc3MKCWFzc2VydAoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHVpbnQ2NCxhZGRyZXNzKXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MKCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIGNvbW1pc3Npb25BZGRyZXNzOiBBZGRyZXNzKTogdm9pZAovLwovLyBDaGFuZ2UgdGhlIGNvbW1pc3Npb24gYWRkcmVzcyB0aGF0IHZhbGlkYXRvciByZXdhcmRzIGFyZSBzZW50IHRvLgovLyBbIE9OTFkgT1dORVIgQ0FOIENIQU5HRSBdCmNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzOgoJcHJvdG8gMiAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDAxCgkvLyB0aGlzLmNhbGxlck11c3RCZU93bmVyKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgY2FsbGVyTXVzdEJlT3duZXIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MDIKCS8vIGFzc2VydChjb21taXNzaW9uQWRkcmVzcyAhPT0gQWRkcmVzcy56ZXJvQWRkcmVzcykKCWZyYW1lX2RpZyAtMiAvLyBjb21taXNzaW9uQWRkcmVzczogQWRkcmVzcwoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDAzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy52YWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyA9IGNvbW1pc3Npb25BZGRyZXNzCglpbnQgMTc3CglmcmFtZV9kaWcgLTIgLy8gY29tbWlzc2lvbkFkZHJlc3M6IEFkZHJlc3MKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8odWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQpdm9pZAoqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvclJld2FyZEluZm86CgkvLyBSZXdhcmRQZXJQYXlvdXQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgoJYnRvaQoKCS8vIEdhdGluZ0Fzc2V0TWluQmFsYW5jZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyA1CglidG9pCgoJLy8gRW50cnlHYXRpbmdBc3NldHM6IHVpbnQ2NFs0XQoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAoJZHVwCglsZW4KCWludCAzMgoJPT0KCgkvLyBhcmd1bWVudCAyIChFbnRyeUdhdGluZ0Fzc2V0cykgZm9yIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8gbXVzdCBiZSBhIHVpbnQ2NFs0XQoJYXNzZXJ0CgoJLy8gRW50cnlHYXRpbmdBZGRyZXNzOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDMgKEVudHJ5R2F0aW5nQWRkcmVzcykgZm9yIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8gbXVzdCBiZSBhIGFkZHJlc3MKCWFzc2VydAoKCS8vIEVudHJ5R2F0aW5nVHlwZTogdWludDgKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMQoJPT0KCgkvLyBhcmd1bWVudCA0IChFbnRyeUdhdGluZ1R5cGUpIGZvciBjaGFuZ2VWYWxpZGF0b3JSZXdhcmRJbmZvIG11c3QgYmUgYSB1aW50OAoJYXNzZXJ0CglidG9pCgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mbyh1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCl2b2lkCgljYWxsc3ViIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8KCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8odmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgRW50cnlHYXRpbmdUeXBlOiB1aW50OCwgRW50cnlHYXRpbmdBZGRyZXNzOiBBZGRyZXNzLCBFbnRyeUdhdGluZ0Fzc2V0czogU3RhdGljQXJyYXk8dWludDY0LCA0PiwgR2F0aW5nQXNzZXRNaW5CYWxhbmNlOiB1aW50NjQsIFJld2FyZFBlclBheW91dDogdWludDY0KTogdm9pZAovLwovLyBBbGxvdyB0aGUgYWRkaXRpb25hbCByZXdhcmRzIChnYXRpbmcgZW50cnksIGFkZGl0aW9uYWwgdG9rZW4gcmV3YXJkcykgaW5mb3JtYXRpb24gYmUgY2hhbmdlZCBhdCB3aWxsLgovLyBbIE9OTFkgT1dORVIgQ0FOIENIQU5HRSBdCmNoYW5nZVZhbGlkYXRvclJld2FyZEluZm86Cglwcm90byA2IDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MTgKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQyMAoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgRW50cnlHYXRpbmdUeXBlID49IEdBVElOR19UWVBFX05PTkUgJiYgRW50cnlHYXRpbmdUeXBlIDwgR0FUSU5HX1RZUEVfQ09OU1RfTUFYLAoJLy8gICAgICAgICAgICAgJ2ludmFsaWQgRW50cnkgZ2F0aW5nIHR5cGUnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDAKCT49CglkdXAKCWJ6ICpza2lwX2FuZDEKCWZyYW1lX2RpZyAtMiAvLyBFbnRyeUdhdGluZ1R5cGU6IHVpbnQ4CglpbnQgNAoJPAoJJiYKCipza2lwX2FuZDE6CgkvLyBpbnZhbGlkIEVudHJ5IGdhdGluZyB0eXBlCglhc3NlcnQKCgkvLyAqaWY3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDI0CgkvLyBFbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX0FTU0VUU19DUkVBVEVEX0JZCglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDEKCT09CglieiAqaWY3X2VuZAoKCS8vICppZjdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDI1CgkvLyBhc3NlcnQoRW50cnlHYXRpbmdBZGRyZXNzICE9PSBnbG9iYWxzLnplcm9BZGRyZXNzKQoJZnJhbWVfZGlnIC0zIC8vIEVudHJ5R2F0aW5nQWRkcmVzczogQWRkcmVzcwoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoqaWY3X2VuZDoKCS8vICppZjhfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MjgKCS8vIEVudHJ5R2F0aW5nVHlwZSA9PT0gR0FUSU5HX1RZUEVfQ1JFQVRFRF9CWV9ORkRfQUREUkVTU0VTIHx8CgkvLyAgICAgICAgICAgICBFbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX1NFR01FTlRfT0ZfTkZECglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDMKCT09CglkdXAKCWJueiAqc2tpcF9vcjEKCWZyYW1lX2RpZyAtMiAvLyBFbnRyeUdhdGluZ1R5cGU6IHVpbnQ4CglpbnQgNAoJPT0KCXx8Cgoqc2tpcF9vcjE6CglieiAqaWY4X2VuZAoKCS8vICppZjhfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDMxCgkvLyBhc3NlcnQodGhpcy5pc05GREFwcElEVmFsaWQoRW50cnlHYXRpbmdBc3NldHNbMF0pLCAncHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZEJykKCWZyYW1lX2RpZyAtNCAvLyBFbnRyeUdhdGluZ0Fzc2V0czogU3RhdGljQXJyYXk8dWludDY0LCA0PgoJZXh0cmFjdCAwIDgKCWJ0b2kKCWNhbGxzdWIgaXNORkRBcHBJRFZhbGlkCgoJLy8gcHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZECglhc3NlcnQKCippZjhfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDMzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPSBFbnRyeUdhdGluZ1R5cGUKCWludCA4MAoJZnJhbWVfZGlnIC0yIC8vIEVudHJ5R2F0aW5nVHlwZTogdWludDgKCWl0b2IKCWV4dHJhY3QgNyAxCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQzNAoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcuZW50cnlHYXRpbmdBZGRyZXNzID0gRW50cnlHYXRpbmdBZGRyZXNzCglpbnQgODEKCWZyYW1lX2RpZyAtMyAvLyBFbnRyeUdhdGluZ0FkZHJlc3M6IEFkZHJlc3MKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDM1CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0cyA9IEVudHJ5R2F0aW5nQXNzZXRzCglpbnQgMTEzCglmcmFtZV9kaWcgLTQgLy8gRW50cnlHYXRpbmdBc3NldHM6IFN0YXRpY0FycmF5PHVpbnQ2NCwgND4KCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDM2CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5nYXRpbmdBc3NldE1pbkJhbGFuY2UgPSBHYXRpbmdBc3NldE1pbkJhbGFuY2UKCWludCAxNDUKCWZyYW1lX2RpZyAtNSAvLyBHYXRpbmdBc3NldE1pbkJhbGFuY2U6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MzcKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnJld2FyZFBlclBheW91dCA9IFJld2FyZFBlclBheW91dAoJaW50IDE2MQoJZnJhbWVfZGlnIC02IC8vIFJld2FyZFBlclBheW91dDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyBhZGRQb29sKHBheSx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCkKKmFiaV9yb3V0ZV9hZGRQb29sOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBub2RlTnVtOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gbWJyUGF5bWVudDogcGF5Cgl0eG4gR3JvdXBJbmRleAoJaW50IDEKCS0KCWR1cAoJZ3R4bnMgVHlwZUVudW0KCWludCBwYXkKCT09CgoJLy8gYXJndW1lbnQgMiAobWJyUGF5bWVudCkgZm9yIGFkZFBvb2wgbXVzdCBiZSBhIHBheSB0cmFuc2FjdGlvbgoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBhZGRQb29sKHBheSx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCkKCWNhbGxzdWIgYWRkUG9vbAoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFBvb2wobWJyUGF5bWVudDogUGF5VHhuLCB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBub2RlTnVtOiB1aW50NjQpOiBWYWxpZGF0b3JQb29sS2V5Ci8vCi8vIEFkZHMgYSBuZXcgcG9vbCB0byBhIHZhbGlkYXRvcidzIHBvb2wgc2V0LCByZXR1cm5pbmcgdGhlICdrZXknIHRvIHJlZmVyZW5jZSB0aGUgcG9vbCBpbiB0aGUgZnV0dXJlIGZvciBzdGFraW5nLCBldGMuCi8vIFRoZSBjYWxsZXIgbXVzdCBwYXkgdGhlIGNvc3Qgb2YgdGhlIHZhbGlkYXRvcnMgTUJSIGluY3JlYXNlIGFzIHdlbGwgYXMgdGhlIE1CUiB0aGF0IHdpbGwgYmUgbmVlZGVkIGZvciB0aGUgcG9vbCBpdHNlbGYuCi8vCi8vIFsgT05MWSBPV05FUiBPUiBNQU5BR0VSIENBTiBjYWxsIF0KLy8gQHBhcmFtIHtQYXlUeG59IG1iclBheW1lbnQgcGF5bWVudCBmcm9tIGNhbGxlciB3aGljaCBjb3ZlcnMgbWJyIGluY3JlYXNlIG9mIGFkZGluZyBhIG5ldyBwb29sCi8vIEBwYXJhbSB7dWludDY0fSB2YWxpZGF0b3JJZCBpcyBpZCBvZiB2YWxpZGF0b3IgdG8gcG9vbCB0byAobXVzdCBiZSBvd25lciBvciBtYW5hZ2VyKQovLyBAcGFyYW0ge3VpbnQ2NH0gbm9kZU51bSBpcyBub2RlIG51bWJlciB0byBhZGQgdG8KLy8gQHJldHVybnMge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2wga2V5IHRvIGNyZWF0ZWQgcG9vbAphZGRQb29sOgoJcHJvdG8gMyAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ1MgoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lck9yTWFuYWdlcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyT3JNYW5hZ2VyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDU1CgkvLyB2ZXJpZnlQYXlUeG4obWJyUGF5bWVudCwgeyByZWNlaXZlcjogdGhpcy5hcHAuYWRkcmVzcywgYW1vdW50OiB0aGlzLmdldE1ickFtb3VudHMoKS5hZGRQb29sTWJyIH0pCgkvLyB2ZXJpZnkgcmVjZWl2ZXIKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIFJlY2VpdmVyCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6InJlY2VpdmVyIiwiZXhwZWN0ZWQiOiJ0aGlzLmFwcC5hZGRyZXNzIn0KCWFzc2VydAoKCS8vIHZlcmlmeSBhbW91bnQKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCglleHRyYWN0IDggOAoJYnRvaQoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6ImFtb3VudCIsImV4cGVjdGVkIjoidGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkUG9vbE1iciJ9Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NTcKCS8vIGFzc2VydCh0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLmV4aXN0cywgInNwZWNpZmllZCB2YWxpZGF0b3IgaWQgaXNuJ3QgdmFsaWQiKQoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJYm94X2xlbgoJc3dhcAoJcG9wCgoJLy8gc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBpc24ndCB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDU5CgkvLyBudW1Qb29sczogdWludDY0ID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyBhcyB1aW50NjQKCWludCAyNDIKCWludCAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIG51bVBvb2xzOiB1aW50NjQKCgkvLyAqaWY5X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDYwCgkvLyAobnVtUG9vbHMgYXMgdWludDY0KSA+PSBNQVhfUE9PTFMKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWludCAyNAoJPj0KCWJ6ICppZjlfZW5kCgoJLy8gKmlmOV9jb25zZXF1ZW50CgkvLyBhbHJlYWR5IGF0IG1heCBwb29sIHNpemUKCWVycgoKKmlmOV9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NjMKCS8vIG51bVBvb2xzICs9IDEKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ2NgoJLy8gc2VuZEFwcENhbGwoewoJLy8gICAgICAgICAgICAgb25Db21wbGV0aW9uOiBPbkNvbXBsZXRpb24uTm9PcCwKCS8vICAgICAgICAgICAgIGFwcHJvdmFsUHJvZ3JhbTogWwoJLy8gICAgICAgICAgICAgICAgIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uZXh0cmFjdCgwLCA0MDk2KSwKCS8vICAgICAgICAgICAgICAgICB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLmV4dHJhY3QoNDA5NiwgdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5zaXplIC0gNDA5NiksCgkvLyAgICAgICAgICAgICBdLAoJLy8gICAgICAgICAgICAgY2xlYXJTdGF0ZVByb2dyYW06IFN0YWtpbmdQb29sLmNsZWFyUHJvZ3JhbSgpLAoJLy8gICAgICAgICAgICAgZ2xvYmFsTnVtVWludDogU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1VaW50LAoJLy8gICAgICAgICAgICAgZ2xvYmFsTnVtQnl0ZVNsaWNlOiBTdGFraW5nUG9vbC5zY2hlbWEuZ2xvYmFsLm51bUJ5dGVTbGljZSwKCS8vICAgICAgICAgICAgIGV4dHJhUHJvZ3JhbVBhZ2VzOiAzLAoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25BcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gY3JlYXRpbmdDb250cmFjdElELCB2YWxpZGF0b3JJZCwgcG9vbElkLCBtaW5FbnRyeVN0YWtlCgkvLyAgICAgICAgICAgICAgICAgbWV0aG9kKCdjcmVhdGVBcHBsaWNhdGlvbih1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCcpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodGhpcy5hcHAuaWQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodmFsaWRhdG9ySWQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IobnVtUG9vbHMgYXMgdWludDY0KSwKCS8vICAgICAgICAgICAgICAgICBpdG9iKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1pbkVudHJ5U3Rha2UpLAoJLy8gICAgICAgICAgICAgXSwKCS8vICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDY3CgkvLyBvbkNvbXBsZXRpb246IE9uQ29tcGxldGlvbi5Ob09wCglpbnQgMCAvLyBOb09wCglpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ2OAoJLy8gYXBwcm92YWxQcm9ncmFtOiBbCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5leHRyYWN0KDAsIDQwOTYpLAoJLy8gICAgICAgICAgICAgICAgIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uZXh0cmFjdCg0MDk2LCB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLnNpemUgLSA0MDk2KSwKCS8vICAgICAgICAgICAgIF0KCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWludCAwCglpbnQgNDA5NgoJYm94X2V4dHJhY3QKCWl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWludCA0MDk2CglieXRlIDB4NzA2ZjZmNmM1NDY1NmQ3MDZjNjE3NDY1NDE3MDcwNzI2Zjc2NjE2YzQyNzk3NDY1NzMgLy8gInBvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMiCglib3hfbGVuCgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLnNpemUKCWFzc2VydAoJaW50IDQwOTYKCS0KCWJveF9leHRyYWN0CglpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDcyCgkvLyBjbGVhclN0YXRlUHJvZ3JhbTogU3Rha2luZ1Bvb2wuY2xlYXJQcm9ncmFtKCkKCWJ5dGUgYjY0IEN3PT0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NzMKCS8vIGdsb2JhbE51bVVpbnQ6IFN0YWtpbmdQb29sLnNjaGVtYS5nbG9iYWwubnVtVWludAoJaW50IDExCglpdHhuX2ZpZWxkIEdsb2JhbE51bVVpbnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NzQKCS8vIGdsb2JhbE51bUJ5dGVTbGljZTogU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1CeXRlU2xpY2UKCWludCAzCglpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ3NQoJLy8gZXh0cmFQcm9ncmFtUGFnZXM6IDMKCWludCAzCglpdHhuX2ZpZWxkIEV4dHJhUHJvZ3JhbVBhZ2VzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDc2CgkvLyBhcHBsaWNhdGlvbkFyZ3M6IFsKCS8vICAgICAgICAgICAgICAgICAvLyBjcmVhdGluZ0NvbnRyYWN0SUQsIHZhbGlkYXRvcklkLCBwb29sSWQsIG1pbkVudHJ5U3Rha2UKCS8vICAgICAgICAgICAgICAgICBtZXRob2QoJ2NyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkJyksCgkvLyAgICAgICAgICAgICAgICAgaXRvYih0aGlzLmFwcC5pZCksCgkvLyAgICAgICAgICAgICAgICAgaXRvYih2YWxpZGF0b3JJZCksCgkvLyAgICAgICAgICAgICAgICAgaXRvYihudW1Qb29scyBhcyB1aW50NjQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWluRW50cnlTdGFrZSksCgkvLyAgICAgICAgICAgICBdCgltZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCXR4bmEgQXBwbGljYXRpb25zIDAKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglpbnQgMjA5CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ4NgoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyA9IG51bVBvb2xzIGFzIHVpbnQxNgoJaW50IDI0MgoJZnJhbWVfZGlnIDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoJaXRvYgoJZXh0cmFjdCA2IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDg5CgkvLyBwb29sQXBwSWQgPSB0aGlzLml0eG4uY3JlYXRlZEFwcGxpY2F0aW9uSUQuaWQKCWl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKCWZyYW1lX2J1cnkgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ5MAoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1tudW1Qb29scyAtIDFdLnBvb2xBcHBJZCA9IHBvb2xBcHBJZAoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgMCAvLyBudW1Qb29sczogdWludDY0CglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0OTEKCS8vIHRoaXMuYWRkUG9vbFRvTm9kZSh2YWxpZGF0b3JJZCwgcG9vbEFwcElkLCBub2RlTnVtKQoJZnJhbWVfZGlnIC0zIC8vIG5vZGVOdW06IHVpbnQ2NAoJZnJhbWVfZGlnIDEgLy8gcG9vbEFwcElkOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGFkZFBvb2xUb05vZGUKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0OTMKCS8vIHRoaXMucmV0aU9QX3ZhbGlkYXRvckFkZGVkUG9vbC5sb2coewoJLy8gICAgICAgICAgICAgaWQ6IHZhbGlkYXRvcklkLAoJLy8gICAgICAgICAgICAgbnVtOiBudW1Qb29scyBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKSwKCS8vICAgICAgICAgfSkKCWJ5dGUgMHhmYmNjMGY2YiAvLyByZXRpT1BfdmFsaWRhdG9yQWRkZWRQb29sKHVpbnQ2NCx1aW50MTYsdWludDY0KQoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWl0b2IKCWR1cAoJYml0bGVuCglpbnQgMTYKCTw9CgoJLy8gbnVtUG9vbHMgYXMgdWludDE2IG92ZXJmbG93ZWQgMTYgYml0cwoJYXNzZXJ0CglleHRyYWN0IDYgMgoJY29uY2F0CglmcmFtZV9kaWcgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cgljb25jYXQKCWxvZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ5OQoJLy8gcmV0dXJuIHsgaWQ6IHZhbGlkYXRvcklkLCBwb29sSWQ6IG51bVBvb2xzIGFzIHVpbnQ2NCwgcG9vbEFwcElkOiB0aGlzLml0eG4hLmNyZWF0ZWRBcHBsaWNhdGlvbklELmlkIH0KCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCglmcmFtZV9kaWcgMCAvLyBudW1Qb29sczogdWludDY0CglpdG9iCgljb25jYXQKCWl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKCWl0b2IKCWNvbmNhdAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDEKCXJldHN1YgoKLy8gYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KQoqYWJpX3JvdXRlX2FkZFN0YWtlOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gc3Rha2VkQW1vdW50UGF5bWVudDogcGF5Cgl0eG4gR3JvdXBJbmRleAoJaW50IDEKCS0KCWR1cAoJZ3R4bnMgVHlwZUVudW0KCWludCBwYXkKCT09CgoJLy8gYXJndW1lbnQgMiAoc3Rha2VkQW1vdW50UGF5bWVudCkgZm9yIGFkZFN0YWtlIG11c3QgYmUgYSBwYXkgdHJhbnNhY3Rpb24KCWFzc2VydAoKCS8vIGV4ZWN1dGUgYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBhZGRTdGFrZQoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFN0YWtlKHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4biwgdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgdmFsdWVUb1ZlcmlmeTogdWludDY0KTogVmFsaWRhdG9yUG9vbEtleQovLwovLyBBZGRzIHN0YWtlIHRvIGEgdmFsaWRhdG9yIHBvb2wuCi8vCi8vIEBwYXJhbSB7UGF5VHhufSBzdGFrZWRBbW91bnRQYXltZW50IC0gcGF5bWVudCBjb21pbmcgZnJvbSBzdGFrZXIgdG8gcGxhY2UgaW50byBhIHBvb2wKLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWx1ZVRvVmVyaWZ5IC0gb25seSBpZiB2YWxpZGF0b3IgaGFzIGdhdGluZyB0byBlbnRlciAtIHRoaXMgaXMgYXNzZXQgaWQgb3IgbmZkIGlkIHRoYXQgY29ycmVzcG9uZHMgdG8gZ2F0aW5nLgovLyBUeG4gc2VuZGVyIGlzIGZhY3RvcmVkIGluIGFzIHdlbGwgaWYgdGhhdCBpcyBwYXJ0IG9mIGdhdGluZy4KLy8gKiBAcmV0dXJucyB7VmFsaWRhdG9yUG9vbEtleX0gLSBUaGUga2V5IG9mIHRoZSB2YWxpZGF0b3IgcG9vbC4KYWRkU3Rha2U6Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA1CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTEyCgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS5leGlzdHMsICJzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGlzbid0IHZhbGlkIikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoKCS8vIHNwZWNpZmllZCB2YWxpZGF0b3IgaWQgaXNuJ3QgdmFsaWQKCWFzc2VydAoKCS8vICppZjEwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTE1CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5zdW5zZXR0aW5nT24gPiAwCglpbnQgMjI2CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWludCAwCgk+CglieiAqaWYxMF9lbmQKCgkvLyAqaWYxMF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MTcKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5zdW5zZXR0aW5nT24gPiBnbG9iYWxzLmxhdGVzdFRpbWVzdGFtcCwKCS8vICAgICAgICAgICAgICAgICAiY2FuJ3Qgc3Rha2Ugd2l0aCBhIHZhbGlkYXRvciB0aGF0IGlzIHBhc3QgaXRzIHN1bnNldHRpbmcgdGltZSIsCgkvLyAgICAgICAgICAgICApCglpbnQgMjI2CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKCT4KCgkvLyBjYW4ndCBzdGFrZSB3aXRoIGEgdmFsaWRhdG9yIHRoYXQgaXMgcGFzdCBpdHMgc3Vuc2V0dGluZyB0aW1lCglhc3NlcnQKCippZjEwX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUyMwoJLy8gc3Rha2VyID0gdGhpcy50eG4uc2VuZGVyCgl0eG4gU2VuZGVyCglmcmFtZV9idXJ5IDAgLy8gc3Rha2VyOiBhZGRyZXNzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTI3CgkvLyB2ZXJpZnlQYXlUeG4oc3Rha2VkQW1vdW50UGF5bWVudCwgewoJLy8gICAgICAgICAgICAgc2VuZGVyOiBzdGFrZXIsCgkvLyAgICAgICAgICAgICByZWNlaXZlcjogdGhpcy5hcHAuYWRkcmVzcywKCS8vICAgICAgICAgfSkKCS8vIHZlcmlmeSBzZW5kZXIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIFNlbmRlcgoJZnJhbWVfZGlnIDAgLy8gc3Rha2VyOiBhZGRyZXNzCgk9PQoKCS8vIHRyYW5zYWN0aW9uIHZlcmlmaWNhdGlvbiBmYWlsZWQ6IHsidHhuIjoic3Rha2VkQW1vdW50UGF5bWVudCIsImZpZWxkIjoic2VuZGVyIiwiZXhwZWN0ZWQiOiJzdGFrZXIifQoJYXNzZXJ0CgoJLy8gdmVyaWZ5IHJlY2VpdmVyCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBSZWNlaXZlcgoJZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCT09CgoJLy8gdHJhbnNhY3Rpb24gdmVyaWZpY2F0aW9uIGZhaWxlZDogeyJ0eG4iOiJzdGFrZWRBbW91bnRQYXltZW50IiwiZmllbGQiOiJyZWNlaXZlciIsImV4cGVjdGVkIjoidGhpcy5hcHAuYWRkcmVzcyJ9Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzUKCS8vIHRoaXMuZG9lc1N0YWtlck1lZXRHYXRpbmcodmFsaWRhdG9ySWQsIHZhbHVlVG9WZXJpZnkpCglmcmFtZV9kaWcgLTMgLy8gdmFsdWVUb1ZlcmlmeTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBkb2VzU3Rha2VyTWVldEdhdGluZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUzNwoJLy8gcmVhbEFtb3VudCA9IHN0YWtlZEFtb3VudFBheW1lbnQuYW1vdW50CglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBBbW91bnQKCWZyYW1lX2J1cnkgMSAvLyByZWFsQW1vdW50OiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzgKCS8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NCA9IDAKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gbWJyQW10TGVmdEJlaGluZDogdWludDY0CgoJLy8gKmlmMTFfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NDAKCS8vIHRoaXMuZG9lc1N0YWtlck5lZWRUb1BheU1CUihzdGFrZXIpCglmcmFtZV9kaWcgMCAvLyBzdGFrZXI6IGFkZHJlc3MKCWNhbGxzdWIgZG9lc1N0YWtlck5lZWRUb1BheU1CUgoJYnogKmlmMTFfZW5kCgoJLy8gKmlmMTFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTQzCgkvLyBtYnJBbXRMZWZ0QmVoaW5kID0gdGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkU3Rha2VyTWJyCgljYWxsc3ViIGdldE1ickFtb3VudHMKCWV4dHJhY3QgMjQgOAoJYnRvaQoJZnJhbWVfYnVyeSAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU0NAoJLy8gcmVhbEFtb3VudCAtPSBtYnJBbXRMZWZ0QmVoaW5kCglmcmFtZV9kaWcgMSAvLyByZWFsQW1vdW50OiB1aW50NjQKCWZyYW1lX2RpZyAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoJLQoJZnJhbWVfYnVyeSAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU0NQoJLy8gdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikuY3JlYXRlKCkKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAwIC8vIHN0YWtlcjogYWRkcmVzcwoJY29uY2F0CglpbnQgMTQ0Cglib3hfY3JlYXRlCglwb3AKCippZjExX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU0OQoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS50b3RhbEFsZ29TdGFrZWQgKyByZWFsQW1vdW50IDwgdGhpcy5tYXhBbGxvd2VkU3Rha2UoKSwKCS8vICAgICAgICAgICAgICd0b3RhbCBzdGFrZWQgZm9yIGFsbCBvZiBhIHZhbGlkYXRvcnMgcG9vbHMgbWF5IG5vdCBleGNlZWQgaGFyZCBjYXAnLAoJLy8gICAgICAgICApCglpbnQgMjUyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoJKwoJY2FsbHN1YiBtYXhBbGxvd2VkU3Rha2UKCTwKCgkvLyB0b3RhbCBzdGFrZWQgZm9yIGFsbCBvZiBhIHZhbGlkYXRvcnMgcG9vbHMgbWF5IG5vdCBleGNlZWQgaGFyZCBjYXAKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU1NgoJLy8gZmluZFJldCA9IHRoaXMuZmluZFBvb2xGb3JTdGFrZXIodmFsaWRhdG9ySWQsIHN0YWtlciwgcmVhbEFtb3VudCkKCWZyYW1lX2RpZyAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoJZnJhbWVfZGlnIDAgLy8gc3Rha2VyOiBhZGRyZXNzCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBmaW5kUG9vbEZvclN0YWtlcgoJZnJhbWVfYnVyeSAzIC8vIGZpbmRSZXQ6ICgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NTcKCS8vIHBvb2xLZXkgPSBmaW5kUmV0WzBdCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NTgKCS8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IgPSBmaW5kUmV0WzFdCglmcmFtZV9kaWcgMyAvLyBmaW5kUmV0OiAoKHVpbnQ2NCx1aW50NjQsdWludDY0KSxib29sLGJvb2wpCglzdG9yZSAyNTUgLy8gZnVsbCBhcnJheQoJbG9hZCAyNTUgLy8gZnVsbCBhcnJheQoJaW50IDE5MgoJZ2V0Yml0CglmcmFtZV9idXJ5IDQgLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU1OQoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sID0gZmluZFJldFsyXQoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWludCAxOTMKCWdldGJpdAoJZnJhbWVfYnVyeSA1IC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoKCS8vICppZjEyX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTYwCgkvLyBwb29sS2V5LnBvb2xJZCA9PT0gMAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMAoJPT0KCWJ6ICppZjEyX2VuZAoKCS8vICppZjEyX2NvbnNlcXVlbnQKCS8vIE5vIHBvb2wgYXZhaWxhYmxlIHdpdGggZnJlZSBzdGFrZS4gIFZhbGlkYXRvciBuZWVkcyB0byBhZGQgYW5vdGhlciBwb29sCgllcnIKCippZjEyX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU2NQoJLy8gdGhpcy51cGRhdGVTdGFrZXJQb29sU2V0KHN0YWtlciwgcG9vbEtleSkKCWZyYW1lX2RpZyAzIC8vIGZpbmRSZXQ6ICgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKCXN0b3JlIDI1NSAvLyBmdWxsIGFycmF5Cglsb2FkIDI1NSAvLyBmdWxsIGFycmF5CglleHRyYWN0IDAgMjQKCWZyYW1lX2RpZyAwIC8vIHN0YWtlcjogYWRkcmVzcwoJY2FsbHN1YiB1cGRhdGVTdGFrZXJQb29sU2V0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTY4CgkvLyB0aGlzLmNhbGxQb29sQWRkU3Rha2UoCgkvLyAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LAoJLy8gICAgICAgICAgICAgcG9vbEtleSwKCS8vICAgICAgICAgICAgIG1ickFtdExlZnRCZWhpbmQsCgkvLyAgICAgICAgICAgICBpc05ld1N0YWtlclRvVmFsaWRhdG9yLAoJLy8gICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1Byb3RvY29sLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgNSAvLyBpc05ld1N0YWtlclRvUHJvdG9jb2w6IGJvb2wKCWZyYW1lX2RpZyA0IC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCWZyYW1lX2RpZyAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMCAyNAoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4bgoJY2FsbHN1YiBjYWxsUG9vbEFkZFN0YWtlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTc1CgkvLyB0aGlzLnJldGlPUF9zdGFrZUFkZGVkLmxvZyh7CgkvLyAgICAgICAgICAgICBpZDogdmFsaWRhdG9ySWQsCgkvLyAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLAoJLy8gICAgICAgICAgICAgYW1vdW50U3Rha2VkOiByZWFsQW1vdW50LAoJLy8gICAgICAgICAgICAgc3Rha2VyOiBzdGFrZXIsCgkvLyAgICAgICAgIH0pCglieXRlIDB4OTYyYjQxNDMgLy8gcmV0aU9QX3N0YWtlQWRkZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQpCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgMCAvLyBzdGFrZXI6IGFkZHJlc3MKCWNvbmNhdAoJZnJhbWVfZGlnIDEgLy8gcmVhbEFtb3VudDogdWludDY0CglpdG9iCgljb25jYXQKCWNvbmNhdAoJbG9nCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTgzCgkvLyByZXR1cm4gcG9vbEtleQoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMCAyNAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDUKCXJldHN1YgoKLy8gc2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KQoqYWJpX3JvdXRlX3NldFRva2VuUGF5b3V0UmF0aW86CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIHNldFRva2VuUGF5b3V0UmF0aW8odWludDY0KSh1aW50NjRbMjRdLHVpbnQ2NCkKCWNhbGxzdWIgc2V0VG9rZW5QYXlvdXRSYXRpbwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIHNldFRva2VuUGF5b3V0UmF0aW8odmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IFBvb2xUb2tlblBheW91dFJhdGlvCi8vCi8vIHNldFRva2VuUGF5b3V0UmF0aW8gaXMgY2FsbGVkIGJ5IFN0YWtpbmcgUG9vbCAjIDEgKE9OTFkpIHRvIGFzayB0aGUgdmFsaWRhdG9yICh1cykgdG8gY2FsY3VsYXRlIHRoZSByYXRpb3MKLy8gb2Ygc3Rha2UgaW4gdGhlIHBvb2xzIGZvciBzdWJzZXF1ZW50IHRva2VuIHBheW91dHMgKGllOiAyIHBvb2xzLCAnMTAwJyBhbGdvIHRvdGFsIHN0YWtlZCwgNjAgaW4gcG9vbCAxLCBhbmQgNDAKLy8gaW4gcG9vbCAyKSAgVGhpcyBpcyBkb25lIHNvIHdlIGhhdmUgYSBzdGFibGUgc25hcHNob3Qgb2Ygc3Rha2UgLSB0YWtlbiBvbmNlIHBlciBlcG9jaCAtIG9ubHkgdHJpZ2dlcmVkIGJ5Ci8vIHBvb2wgMSBkb2luZyBwYXlvdXQuICBwb29scyBvdGhlciB0aGFuIDEgZG9pbmcgcGF5b3V0IGNhbGwgcG9vbCAxIHRvIGFzayBpdCBkbyBpdCBmaXJzdC4KLy8gSXQgd291bGQgYmUgNjAvNDAlIGluIHRoZSBwb29sUGN0T2ZXaG9sZSB2YWx1ZXMuICBUaGUgdG9rZW4gcmV3YXJkIHBheW91dHMgdGhlbiB1c2UgdGhlc2UgdmFsdWVzIGluc3RlYWQgb2YKLy8gdGhlaXIgJ2N1cnJlbnQnIHN0YWtlIHdoaWNoIGNoYW5nZXMgYXMgcGFydCBvZiB0aGUgcGF5b3V0cyB0aGVtc2VsdmVzIChhbmQgcGVvcGxlIGNvdWxkIGJlIGNoYW5naW5nIHN0YWtlCi8vIGR1cmluZyB0aGUgZXBvY2ggdXBkYXRlcyBhY3Jvc3MgcG9vbHMpCi8vCi8vIE11bHRpcGxlIHBvb2xzIHdpbGwgY2FsbCB1cyB2aWEgcG9vbCAxIChwb29sMi0+cG9vbDEtPnZhbGlkYXRvciwgZXRjLikgc28gZG9uJ3QgYXNzZXJ0IG9uIHBvb2wxIGNhbGxpbmcgbXVsdGlwbGUKLy8gdGltZXMgaW4gc2FtZSBlcG9jaC4gIEp1c3QgcmV0dXJuLgovLwovLyBAcGFyYW0gdmFsaWRhdG9ySWQgLSB2YWxpZGF0b3IgaWQgKGFuZCB0aHVzIHBvb2wpIGNhbGxpbmcgdXMuICBWZXJpZmllZCBzbyB0aGF0IHNlbmRlciBNVVNUIGJlIHBvb2wgMSBvZiB0aGlzIHZhbGlkYXRvci4KLy8gQHJldHVybnMgUG9vbFRva2VuUGF5b3V0UmF0aW8gLSB0aGUgZmluaXNoZWQgcmF0aW8gZGF0YQpzZXRUb2tlblBheW91dFJhdGlvOgoJcHJvdG8gMSAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gOAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYwMwoJLy8gcG9vbDFBcHBJRCA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkCglpbnQgMjY4CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMCAvLyBwb29sMUFwcElEOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MDQKCS8vIGFzc2VydChwb29sMUFwcElEICE9PSAwKQoJZnJhbWVfZGlnIDAgLy8gcG9vbDFBcHBJRDogdWludDY0CglpbnQgMAoJIT0KCWFzc2VydAoKCS8vICppZjEzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjA2CgkvLyB0aGlzLnR4bi5zZW5kZXIgIT09IEFwcElELmZyb21VaW50NjQocG9vbDFBcHBJRCkuYWRkcmVzcwoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIDAgLy8gcG9vbDFBcHBJRDogdWludDY0CglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCSE9CglieiAqaWYxM19lbmQKCgkvLyAqaWYxM19jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MDcKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWIgKnNldFRva2VuUGF5b3V0UmF0aW8qcmV0dXJuCgoqaWYxM19lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MTMKCS8vIGN1clJvdW5kID0gZ2xvYmFscy5yb3VuZAoJZ2xvYmFsIFJvdW5kCglmcmFtZV9idXJ5IDEgLy8gY3VyUm91bmQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYxNAoJLy8gbGFzdFBheW91dFVwZGF0ZSA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUudG9rZW5QYXlvdXRSYXRpby51cGRhdGVkRm9yUGF5b3V0CglpbnQgODkyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCgkvLyAqaWYxNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYxNQoJLy8gbGFzdFBheW91dFVwZGF0ZSAhPT0gMAoJZnJhbWVfZGlnIDIgLy8gbGFzdFBheW91dFVwZGF0ZTogdWludDY0CglpbnQgMAoJIT0KCWJ6ICppZjE0X2VuZAoKCS8vICppZjE0X2NvbnNlcXVlbnQKCS8vICppZjE1X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjE3CgkvLyAoQXBwSUQuZnJvbVVpbnQ2NChwb29sMUFwcElEKS5nbG9iYWxTdGF0ZSgnbGFzdFBheW91dCcpIGFzIHVpbnQ2NCkgPT09IGxhc3RQYXlvdXRVcGRhdGUKCWZyYW1lX2RpZyAwIC8vIHBvb2wxQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDZjNjE3Mzc0NTA2MTc5NmY3NTc0IC8vICJsYXN0UGF5b3V0IgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQocG9vbDFBcHBJRCkuZ2xvYmFsU3RhdGUoJ2xhc3RQYXlvdXQnKQoJYXNzZXJ0CglmcmFtZV9kaWcgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCT09CglieiAqaWYxNV9lbmQKCgkvLyAqaWYxNV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MTgKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWIgKnNldFRva2VuUGF5b3V0UmF0aW8qcmV0dXJuCgoqaWYxNV9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MjAKCS8vIGVwb2NoUm91bmRMZW5ndGggPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lcG9jaFJvdW5kTGVuZ3RoIGFzIHVpbnQ2NAoJaW50IDE2OQoJaW50IDQKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDMgLy8gZXBvY2hSb3VuZExlbmd0aDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjIxCgkvLyB0aGlzRXBvY2hCZWdpbiA9IGN1clJvdW5kIC0gKGN1clJvdW5kICUgZXBvY2hSb3VuZExlbmd0aCkKCWZyYW1lX2RpZyAxIC8vIGN1clJvdW5kOiB1aW50NjQKCWZyYW1lX2RpZyAxIC8vIGN1clJvdW5kOiB1aW50NjQKCWZyYW1lX2RpZyAzIC8vIGVwb2NoUm91bmRMZW5ndGg6IHVpbnQ2NAoJJQoJLQoJZnJhbWVfYnVyeSA0IC8vIHRoaXNFcG9jaEJlZ2luOiB1aW50NjQKCgkvLyAqaWYxNl9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYyMwoJLy8gbGFzdFBheW91dFVwZGF0ZSAtIChsYXN0UGF5b3V0VXBkYXRlICUgZXBvY2hSb3VuZExlbmd0aCkgPT09IHRoaXNFcG9jaEJlZ2luCglmcmFtZV9kaWcgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCWZyYW1lX2RpZyAyIC8vIGxhc3RQYXlvdXRVcGRhdGU6IHVpbnQ2NAoJZnJhbWVfZGlnIDMgLy8gZXBvY2hSb3VuZExlbmd0aDogdWludDY0CgklCgktCglmcmFtZV9kaWcgNCAvLyB0aGlzRXBvY2hCZWdpbjogdWludDY0Cgk9PQoJYnogKmlmMTZfZW5kCgoJLy8gKmlmMTZfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjI0CgkvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS50b2tlblBheW91dFJhdGlvCglpbnQgNzAwIC8vIGhlYWRPZmZzZXQKCWludCAyMDAKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CgliICpzZXRUb2tlblBheW91dFJhdGlvKnJldHVybgoKKmlmMTZfZW5kOgoKKmlmMTRfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjI3CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8udXBkYXRlZEZvclBheW91dCA9IGN1clJvdW5kCglpbnQgODkyCglmcmFtZV9kaWcgMSAvLyBjdXJSb3VuZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYyOQoJLy8gY3VyTnVtUG9vbHMgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnN0YXRlLm51bVBvb2xzIGFzIHVpbnQ2NAoJaW50IDI0MgoJaW50IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDUgLy8gY3VyTnVtUG9vbHM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYzMAoJLy8gdG90YWxTdGFrZUZvclZhbGlkYXRvciA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUudG90YWxBbGdvU3Rha2VkCglpbnQgMjUyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgNiAvLyB0b3RhbFN0YWtlRm9yVmFsaWRhdG9yOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MzEKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgY3VyTnVtUG9vbHM7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDcgLy8gaTogdWludDY0CgoqZm9yXzI6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MzEKCS8vIGkgPCBjdXJOdW1Qb29scwoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglmcmFtZV9kaWcgNSAvLyBjdXJOdW1Qb29sczogdWludDY0Cgk8CglieiAqZm9yXzJfZW5kCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjM2CgkvLyBvdXJQb29sUGN0T2ZXaG9sZSA9IHdpZGVSYXRpbygKCS8vICAgICAgICAgICAgICAgICBbdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1tpXS50b3RhbEFsZ29TdGFrZWQsIDFfMDAwXzAwMF0sCgkvLyAgICAgICAgICAgICAgICAgW3RvdGFsU3Rha2VGb3JWYWxpZGF0b3JdLAoJLy8gICAgICAgICAgICAgKQoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglpbnQgMV8wMDBfMDAwCgltdWx3CglpbnQgMAoJZnJhbWVfZGlnIDYgLy8gdG90YWxTdGFrZUZvclZhbGlkYXRvcjogdWludDY0CglkaXZtb2R3Cglwb3AKCXBvcAoJc3dhcAoJIQoKCS8vIHdpZGVSYXRpbyBmYWlsZWQKCWFzc2VydAoJZnJhbWVfYnVyeSA4IC8vIG91clBvb2xQY3RPZldob2xlOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NDAKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUudG9rZW5QYXlvdXRSYXRpby5wb29sUGN0T2ZXaG9sZVtpXSA9IG91clBvb2xQY3RPZldob2xlCglpbnQgNzAwCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWZyYW1lX2RpZyA4IC8vIG91clBvb2xQY3RPZldob2xlOiB1aW50NjQKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoqZm9yXzJfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MzEKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSA3IC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzIKCipmb3JfMl9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NDIKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCipzZXRUb2tlblBheW91dFJhdGlvKnJldHVybjoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDgKCXJldHN1YgoKLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcygodWludDY0LHVpbnQ2NCx1aW50NjQpLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkCiphYmlfcm91dGVfc3Rha2VVcGRhdGVkVmlhUmV3YXJkczoKCS8vIHNhdHVyYXRlZEJ1cm5Ub0ZlZVNpbms6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQoJYnRvaQoKCS8vIHZhbGlkYXRvckNvbW1pc3Npb246IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAoJYnRvaQoKCS8vIHJld2FyZFRva2VuQW1vdW50UmVzZXJ2ZWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwoJYnRvaQoKCS8vIGFsZ29Ub0FkZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglidG9pCgoJLy8gcG9vbEtleTogKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZHVwCglsZW4KCWludCAyNAoJPT0KCgkvLyBhcmd1bWVudCA0IChwb29sS2V5KSBmb3Igc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyBtdXN0IGJlIGEgKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBzdGFrZVVwZGF0ZWRWaWFSZXdhcmRzKCh1aW50NjQsdWludDY0LHVpbnQ2NCksdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKCWNhbGxzdWIgc3Rha2VVcGRhdGVkVmlhUmV3YXJkcwoJaW50IDEKCXJldHVybgoKLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyhwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5LCBhbGdvVG9BZGQ6IHVpbnQ2NCwgcmV3YXJkVG9rZW5BbW91bnRSZXNlcnZlZDogdWludDY0LCB2YWxpZGF0b3JDb21taXNzaW9uOiB1aW50NjQsIHNhdHVyYXRlZEJ1cm5Ub0ZlZVNpbms6IHVpbnQ2NCk6IHZvaWQKLy8KLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyBpcyBjYWxsZWQgYnkgU3Rha2luZyBwb29scyB0byBpbmZvcm0gdGhlIHZhbGlkYXRvciAodXMpIHRoYXQgYSBwYXJ0aWN1bGFyIGFtb3VudCBvZiB0b3RhbAovLyBzdGFrZSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgc3BlY2lmaWVkIHBvb2wuICBUaGlzIGlzIHVzZWQgdG8gdXBkYXRlIHRoZSBzdGF0cyB3ZSBoYXZlIGluIG91ciBQb29sSW5mbyBzdG9yYWdlLgovLyBUaGUgY2FsbGluZyBBcHAgaWQgaXMgdmFsaWRhdGVkIGFnYWluc3Qgb3VyIHBvb2wgbGlzdCBhcyB3ZWxsLgovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBWYWxpZGF0b3JQb29sS2V5IHR5cGUKLy8gQHBhcmFtIHt1aW50NjR9IGFsZ29Ub0FkZCAtIGFtb3VudCB0aGlzIHZhbGlkYXRvcidzIHRvdGFsIHN0YWtlIGluY3JlYXNlZCB2aWEgcmV3YXJkcwovLyBAcGFyYW0ge3VpbnQ2NH0gcmV3YXJkVG9rZW5BbW91bnRSZXNlcnZlZCAtIGFtb3VudCB0aGlzIHZhbGlkYXRvcidzIHRvdGFsIHN0YWtlIGluY3JlYXNlZCB2aWEgcmV3YXJkcyAodGhhdCBzaG91bGQgYmUKLy8gQHBhcmFtIHt1aW50NjR9IHZhbGlkYXRvckNvbW1pc3Npb24gLSB0aGUgY29tbWlzc2lvbiBhbW91bnQgdGhlIHZhbGlkYXRvciB3YXMgcGFpZCwgaWYgYW55Ci8vIEBwYXJhbSB7dWludDY0fSBzYXR1cmF0ZWRCdXJuVG9GZWVTaW5rIC0gaWYgdGhlIHBvb2wgd2FzIGluIHNhdHVyYXRlZCBzdGF0ZSwgdGhlIGFtb3VudCBzZW50IGJhY2sgdG8gdGhlIGZlZSBzaW5rLgovLyBzZWVuIGFzICdhY2NvdW50ZWQgZm9yL3BlbmRpbmcgc3BlbnQnKQpzdGFrZVVwZGF0ZWRWaWFSZXdhcmRzOgoJcHJvdG8gNSAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjYzCgkvLyB0aGlzLnZlcmlmeVBvb2xLZXlDYWxsZXIocG9vbEtleSkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CgljYWxsc3ViIHZlcmlmeVBvb2xLZXlDYWxsZXIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NjYKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCArPSBhbGdvVG9BZGQKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAxMCAvLyBoZWFkT2Zmc2V0CgkrCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NjcKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS50b3RhbEFsZ29TdGFrZWQgKz0gYWxnb1RvQWRkCglpbnQgMjUyCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMiAvLyBhbGdvVG9BZGQ6IHVpbnQ2NAoJKwoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjY4CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUucmV3YXJkVG9rZW5IZWxkQmFjayArPSByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkCglpbnQgMjYwCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkOiB1aW50NjQKCSsKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY3MAoJLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgKz0gYWxnb1RvQWRkCglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglhcHBfZ2xvYmFsX2dldAoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CgkrCglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglzd2FwCglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY3MwoJLy8gdGhpcy5yZXZlcmlmeU5GRE93bmVyc2hpcChwb29sS2V5LmlkKQoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCgljYWxsc3ViIHJldmVyaWZ5TkZET3duZXJzaGlwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Njc1CgkvLyB0aGlzLnJldGlPUF9lcG9jaFJld2FyZFVwZGF0ZS5sb2coewoJLy8gICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLAoJLy8gICAgICAgICAgICAgYWxnb0FkZGVkOiBhbGdvVG9BZGQsCgkvLyAgICAgICAgICAgICByZXdhcmRUb2tlbkhlbGRCYWNrOiByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkLAoJLy8gICAgICAgICAgICAgc2F0dXJhdGVkQnVyblRvRmVlU2luazogc2F0dXJhdGVkQnVyblRvRmVlU2luaywKCS8vICAgICAgICAgICAgIHZhbGlkYXRvckNvbW1pc3Npb246IHZhbGlkYXRvckNvbW1pc3Npb24sCgkvLyAgICAgICAgIH0pCglieXRlIDB4YjNlNDdjM2QgLy8gcmV0aU9QX2Vwb2NoUmV3YXJkVXBkYXRlKHVpbnQ2NCx1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTQgLy8gdmFsaWRhdG9yQ29tbWlzc2lvbjogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtNSAvLyBzYXR1cmF0ZWRCdXJuVG9GZWVTaW5rOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY29uY2F0Cglsb2cKCXJldHN1YgoKLy8gc3Rha2VSZW1vdmVkKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wpdm9pZAoqYWJpX3JvdXRlX3N0YWtlUmVtb3ZlZDoKCS8vIHN0YWtlclJlbW92ZWQ6IGJvb2wKCXR4bmEgQXBwbGljYXRpb25BcmdzIDUKCWR1cAoJbGVuCglpbnQgMQoJPT0KCgkvLyBhcmd1bWVudCAwIChzdGFrZXJSZW1vdmVkKSBmb3Igc3Rha2VSZW1vdmVkIG11c3QgYmUgYSBib29sCglhc3NlcnQKCWludCAwCglnZXRiaXQKCgkvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDQKCWJ0b2kKCgkvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDMKCWJ0b2kKCgkvLyBzdGFrZXI6IGFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMzIKCT09CgoJLy8gYXJndW1lbnQgMyAoc3Rha2VyKSBmb3Igc3Rha2VSZW1vdmVkIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBwb29sS2V5OiAodWludDY0LHVpbnQ2NCx1aW50NjQpCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDI0Cgk9PQoKCS8vIGFyZ3VtZW50IDQgKHBvb2xLZXkpIGZvciBzdGFrZVJlbW92ZWQgbXVzdCBiZSBhICh1aW50NjQsdWludDY0LHVpbnQ2NCkKCWFzc2VydAoKCS8vIGV4ZWN1dGUgc3Rha2VSZW1vdmVkKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wpdm9pZAoJY2FsbHN1YiBzdGFrZVJlbW92ZWQKCWludCAxCglyZXR1cm4KCi8vIHN0YWtlUmVtb3ZlZChwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5LCBzdGFrZXI6IEFkZHJlc3MsIGFtb3VudFJlbW92ZWQ6IHVpbnQ2NCwgcmV3YXJkUmVtb3ZlZDogdWludDY0LCBzdGFrZXJSZW1vdmVkOiBib29sZWFuKTogdm9pZAovLwovLyBzdGFrZVJlbW92ZWQgaXMgY2FsbGVkIGJ5IFN0YWtpbmcgcG9vbHMgdG8gaW5mb3JtIHRoZSB2YWxpZGF0b3IgKHVzKSB0aGF0IGEgcGFydGljdWxhciBhbW91bnQgb2YgdG90YWwgc3Rha2UgaGFzIGJlZW4gcmVtb3ZlZAovLyBmcm9tIHRoZSBzcGVjaWZpZWQgcG9vbC4gIFRoaXMgaXMgdXNlZCB0byB1cGRhdGUgdGhlIHN0YXRzIHdlIGhhdmUgaW4gb3VyIFBvb2xJbmZvIHN0b3JhZ2UuCi8vIElmIGFueSBhbW91bnQgb2YgcmV3YXJkUmVtb3ZlZCBpcyBzcGVjaWZpZWQsIHRoZW4gdGhhdCBhbW91bnQgb2YgcmV3YXJkIGlzIHNlbnQgdG8gdGhlIHVzZQovLyBUaGUgY2FsbGluZyBBcHAgaWQgaXMgdmFsaWRhdGVkIGFnYWluc3Qgb3VyIHBvb2wgbGlzdCBhcyB3ZWxsLgovLwovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgY2FsbGluZyB1cyBmcm9tIHdoaWNoIHN0YWtlIHdhcyByZW1vdmVkCi8vIEBwYXJhbSB7QWRkcmVzc30gc3Rha2VyCi8vIEBwYXJhbSB7dWludDY0fSBhbW91bnRSZW1vdmVkIC0gYWxnbyBhbW91bnQgcmVtb3ZlZAovLyBAcGFyYW0ge3VpbnQ2NH0gcmV3YXJkUmVtb3ZlZCAtIGlmIGFwcGxpY2FibGUsIGFtb3VudCBvZiB0b2tlbiByZXdhcmQgcmVtb3ZlZCAoYnkgcG9vbCAxIGNhbGxlcikgb3IgVE8gcmVtb3ZlIGFuZCBwYXkgb3V0ICh2aWEgcG9vbCAxIGZyb20gZGlmZmVyZW50IHBvb2wgY2FsbGVyKQovLyBAcGFyYW0ge2Jvb2xlYW59IHN0YWtlclJlbW92ZWQKc3Rha2VSZW1vdmVkOgoJcHJvdG8gNSAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMwoKCS8vICppZjE3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzA1CgkvLyBnbG9iYWxzLm9wY29kZUJ1ZGdldCA8IDMwMAoJZ2xvYmFsIE9wY29kZUJ1ZGdldAoJaW50IDMwMAoJPAoJYnogKmlmMTdfZW5kCgoJLy8gKmlmMTdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzA2CgkvLyBpbmNyZWFzZU9wY29kZUJ1ZGdldCgpCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJaW50IDAKCWl0eG5fZmllbGQgRmVlCglieXRlIGI2NCBDb0VCIC8vICNwcmFnbWEgdmVyc2lvbiAxMDsgaW50IDEKCWR1cAoJaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCWludCBEZWxldGVBcHBsaWNhdGlvbgoJaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KCWl0eG5fc3VibWl0CgoqaWYxN19lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MDgKCS8vIHRoaXMudmVyaWZ5UG9vbEtleUNhbGxlcihwb29sS2V5KQoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWNhbGxzdWIgdmVyaWZ5UG9vbEtleUNhbGxlcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxMgoJLy8gYXNzZXJ0KGFtb3VudFJlbW92ZWQgPiAwIHx8IHJld2FyZFJlbW92ZWQgPiAwLCAnc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGFsZ28gb3IgcmV3YXJkIHdhcyByZW1vdmVkJykKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWludCAwCgk+CglkdXAKCWJueiAqc2tpcF9vcjIKCWZyYW1lX2RpZyAtNCAvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCWludCAwCgk+Cgl8fAoKKnNraXBfb3IyOgoJLy8gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGFsZ28gb3IgcmV3YXJkIHdhcyByZW1vdmVkCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MTUKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCAtPSBhbW91bnRSZW1vdmVkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxNgoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsQWxnb1N0YWtlZCAtPSBhbW91bnRSZW1vdmVkCglpbnQgMjUyCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxNwoJLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgLT0gYW1vdW50UmVtb3ZlZAoJYnl0ZSAweDczNzQ2MTZiNjU2NCAvLyAic3Rha2VkIgoJYXBwX2dsb2JhbF9nZXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCXN3YXAKCWFwcF9nbG9iYWxfcHV0CgoJLy8gKmlmMThfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MTkKCS8vIHJld2FyZFJlbW92ZWQgPiAwCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CglpbnQgMAoJPgoJYnogKmlmMThfZWxzZQoKCS8vICppZjE4X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyMAoJLy8gcmV3YXJkVG9rZW5JRCA9IHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5jb25maWcucmV3YXJkVG9rZW5JZAoJaW50IDE1MwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIHJld2FyZFRva2VuSUQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyMQoJLy8gYXNzZXJ0KHJld2FyZFRva2VuSUQgIT09IDAsICJyZXdhcmRSZW1vdmVkIGNhbid0IGJlIHNldCBpZiB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIHJld2FyZCB0b2tlbiEiKQoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JRDogdWludDY0CglpbnQgMAoJIT0KCgkvLyByZXdhcmRSZW1vdmVkIGNhbid0IGJlIHNldCBpZiB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIHJld2FyZCB0b2tlbiEKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyMgoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS5yZXdhcmRUb2tlbkhlbGRCYWNrID49IHJld2FyZFJlbW92ZWQsCgkvLyAgICAgICAgICAgICAgICAgJ3Jld2FyZCBiZWluZyByZW1vdmVkIG11c3QgYmUgY292ZXJlZCBieSBob2xkIGJhY2sgYW1vdW50JywKCS8vICAgICAgICAgICAgICkKCWludCAyNjAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtNCAvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCT49CgoJLy8gcmV3YXJkIGJlaW5nIHJlbW92ZWQgbXVzdCBiZSBjb3ZlcmVkIGJ5IGhvbGQgYmFjayBhbW91bnQKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyOAoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnJld2FyZFRva2VuSGVsZEJhY2sgLT0gcmV3YXJkUmVtb3ZlZAoJaW50IDI2MAoJZHVwCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CgktCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyAqaWYxOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczMwoJLy8gcG9vbEtleS5wb29sSWQgIT09IDEKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCSE9CglieiAqaWYxOV9lbmQKCgkvLyAqaWYxOV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MzQKCS8vIHNlbmRNZXRob2RDYWxsPHR5cGVvZiBTdGFraW5nUG9vbC5wcm90b3R5cGUucGF5VG9rZW5SZXdhcmQ+KHsKCS8vICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRDogQXBwSUQuZnJvbVVpbnQ2NCh0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJnczogW3N0YWtlciwgcmV3YXJkVG9rZW5JRCwgcmV3YXJkUmVtb3ZlZF0sCgkvLyAgICAgICAgICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgltZXRob2QgInBheVRva2VuUmV3YXJkKGFkZHJlc3MsdWludDY0LHVpbnQ2NCl2b2lkIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MzUKCS8vIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQodGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzWzBdLnBvb2xBcHBJZCkKCWludCAyNjgKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczNgoJLy8gbWV0aG9kQXJnczogW3N0YWtlciwgcmV3YXJkVG9rZW5JRCwgcmV3YXJkUmVtb3ZlZF0KCWZyYW1lX2RpZyAtMiAvLyBzdGFrZXI6IEFkZHJlc3MKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklEOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCippZjE5X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczOQoJLy8gdGhpcy5yZXRpT1Bfc3Rha2VSZW1vdmVkLmxvZyh7CgkvLyAgICAgICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICAgICAgcG9vbE51bTogcG9vbEtleS5wb29sSWQgYXMgdWludDE2LAoJLy8gICAgICAgICAgICAgICAgIHBvb2xBcHBJZDogQXBwSUQuZnJvbVVpbnQ2NChwb29sS2V5LnBvb2xBcHBJZCksCgkvLyAgICAgICAgICAgICAgICAgc3Rha2VyOiBzdGFrZXIsCgkvLyAgICAgICAgICAgICAgICAgYW1vdW50VW5zdGFrZWQ6IGFtb3VudFJlbW92ZWQsCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5Bc3NldElkOiBBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JRCksCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5zUmVjZWl2ZWQ6IHJld2FyZFJlbW92ZWQsCgkvLyAgICAgICAgICAgICB9KQoJYnl0ZSAweDEyZjRiZDRiIC8vIHJldGlPUF9zdGFrZVJlbW92ZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTIgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC00IC8vIHJld2FyZFJlbW92ZWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklEOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWIgKmlmMThfZW5kCgoqaWYxOF9lbHNlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzQ5CgkvLyB0aGlzLnJldGlPUF9zdGFrZVJlbW92ZWQubG9nKHsKCS8vICAgICAgICAgICAgICAgICBpZDogcG9vbEtleS5pZCwKCS8vICAgICAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICAgICAgcG9vbEFwcElkOiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICBzdGFrZXI6IHN0YWtlciwKCS8vICAgICAgICAgICAgICAgICBhbW91bnRVbnN0YWtlZDogYW1vdW50UmVtb3ZlZCwKCS8vICAgICAgICAgICAgICAgICAvLyBubyB0b2tlbnMgcmV3YXJkZWQuLgoJLy8gICAgICAgICAgICAgICAgIHJld2FyZFRva2VuQXNzZXRJZDogQXNzZXRJRC56ZXJvSW5kZXgsCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5zUmVjZWl2ZWQ6IDAsCgkvLyAgICAgICAgICAgICB9KQoJYnl0ZSAweDEyZjRiZDRiIC8vIHJldGlPUF9zdGFrZVJlbW92ZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTIgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAKCWNvbmNhdAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCippZjE4X2VuZDoKCS8vICppZjIwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzYxCgkvLyBzdGFrZXJSZW1vdmVkCglmcmFtZV9kaWcgLTUgLy8gc3Rha2VyUmVtb3ZlZDogYm9vbGVhbgoJYnogKmlmMjBfZW5kCgoJLy8gKmlmMjBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzYzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbcG9vbEtleS5wb29sSWQgLSAxXS50b3RhbFN0YWtlcnMgLT0gMQoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJaW50IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDEKCS0KCWl0b2IKCWV4dHJhY3QgNiAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NjUKCS8vIHJlbW92ZVJldCA9IHRoaXMucmVtb3ZlRnJvbVN0YWtlclBvb2xTZXQoc3Rha2VyLCA8VmFsaWRhdG9yUG9vbEtleT57CgkvLyAgICAgICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICAgICAgcG9vbElkOiBwb29sS2V5LnBvb2xJZCwKCS8vICAgICAgICAgICAgICAgICBwb29sQXBwSWQ6IHBvb2xLZXkucG9vbEFwcElkLAoJLy8gICAgICAgICAgICAgfSkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY2FsbHN1YiByZW1vdmVGcm9tU3Rha2VyUG9vbFNldAoJZnJhbWVfYnVyeSAxIC8vIHJlbW92ZVJldDogKGJvb2wsYm9vbCkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NzAKCS8vIHN0YWtlck91dE9mVGhpc1ZhbGlkYXRvciA9IHJlbW92ZVJldFswXQoJZnJhbWVfZGlnIDEgLy8gcmVtb3ZlUmV0OiAoYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWludCAwCglnZXRiaXQKCWZyYW1lX2J1cnkgMiAvLyBzdGFrZXJPdXRPZlRoaXNWYWxpZGF0b3I6IGJvb2wKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NzEKCS8vIHN0YWtlck91dE9mUHJvdG9jb2wgPSByZW1vdmVSZXRbMV0KCWZyYW1lX2RpZyAxIC8vIHJlbW92ZVJldDogKGJvb2wsYm9vbCkKCXN0b3JlIDI1NSAvLyBmdWxsIGFycmF5Cglsb2FkIDI1NSAvLyBmdWxsIGFycmF5CglpbnQgMQoJZ2V0Yml0CglmcmFtZV9idXJ5IDMgLy8gc3Rha2VyT3V0T2ZQcm90b2NvbDogYm9vbAoKCS8vICppZjIxX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzczCgkvLyBzdGFrZXJPdXRPZlRoaXNWYWxpZGF0b3IKCWZyYW1lX2RpZyAyIC8vIHN0YWtlck91dE9mVGhpc1ZhbGlkYXRvcjogYm9vbAoJYnogKmlmMjFfZW5kCgoJLy8gKmlmMjFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Nzc0CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUudG90YWxTdGFrZXJzIC09IDEKCWludCAyNDQKCWR1cAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDEKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKKmlmMjFfZW5kOgoJLy8gKmlmMjJfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NzcKCS8vIHN0YWtlck91dE9mUHJvdG9jb2wKCWZyYW1lX2RpZyAzIC8vIHN0YWtlck91dE9mUHJvdG9jb2w6IGJvb2wKCWJ6ICppZjIyX2VuZAoKCS8vICppZjIyX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc3OAoJLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlIC09IDEKCWJ5dGUgMHg2ZTc1NmQ1Mzc0NjE2YjY1NzI3MyAvLyAibnVtU3Rha2VycyIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMQoJLQoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJc3dhcAoJYXBwX2dsb2JhbF9wdXQKCippZjIyX2VuZDoKCippZjIwX2VuZDoKCXJldHN1YgoKLy8gZmluZFBvb2xGb3JTdGFrZXIodWludDY0LGFkZHJlc3MsdWludDY0KSgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKKmFiaV9yb3V0ZV9maW5kUG9vbEZvclN0YWtlcjoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gYW1vdW50VG9TdGFrZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglidG9pCgoJLy8gc3Rha2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDEgKHN0YWtlcikgZm9yIGZpbmRQb29sRm9yU3Rha2VyIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBmaW5kUG9vbEZvclN0YWtlcih1aW50NjQsYWRkcmVzcyx1aW50NjQpKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJY2FsbHN1YiBmaW5kUG9vbEZvclN0YWtlcgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGZpbmRQb29sRm9yU3Rha2VyKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIHN0YWtlcjogQWRkcmVzcywgYW1vdW50VG9TdGFrZTogdWludDY0KTogW1ZhbGlkYXRvclBvb2xLZXksIGJvb2xlYW4sIGJvb2xlYW5dCi8vCi8vIEZpbmRzIHRoZSBwb29sIGZvciBhIHN0YWtlciBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgdmFsaWRhdG9yIGlkLCBzdGFrZXIgYWRkcmVzcywgYW5kIGFtb3VudCB0byBzdGFrZS4KLy8gRmlyc3QgY2hlY2tzIHRoZSBzdGFrZXJzICdhbHJlYWR5IHN0YWtlZCBsaXN0JyBmb3IgdGhlIHZhbGlkYXRvciBwcmVmZXJyaW5nIHRob3NlIChhZGRpbmcgaWYgcG9zc2libGUpIHRoZW4gYWRkcwovLyB0byBuZXcgcG9vbCBpZiBuZWNlc3NhcnkuCi8vCi8vIEBwYXJhbSB7VmFsaWRhdG9ySWRUeXBlfSB2YWxpZGF0b3JJZCAtIFRoZSBpZCBvZiB0aGUgdmFsaWRhdG9yLgovLyBAcGFyYW0ge0FkZHJlc3N9IHN0YWtlciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzdGFrZXIuCi8vIEBwYXJhbSB7dWludDY0fSBhbW91bnRUb1N0YWtlIC0gVGhlIGFtb3VudCB0byBzdGFrZS4KLy8gQHJldHVybnMge1ZhbGlkYXRvclBvb2xLZXksIGJvb2xlYW4sIGJvb2xlYW59IC0gVGhlIHBvb2wgZm9yIHRoZSBzdGFrZXIsIHRydWUvZmFsc2Ugb24gd2hldGhlciB0aGUgc3Rha2VyIGlzICduZXcnCi8vIHRvIHRoaXMgVkFMSURBVE9SLCBhbmQgdHJ1ZS9mYWxzZSBpZiBzdGFrZXIgaXMgbmV3IHRvIHRoZSBwcm90b2NvbC4KZmluZFBvb2xGb3JTdGFrZXI6Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA3CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODAwCgkvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yID0gdHJ1ZQoJaW50IDEKCWZyYW1lX2J1cnkgMCAvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yOiBib29sCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODAxCgkvLyBpc05ld1N0YWtlclRvUHJvdG9jb2wgPSB0cnVlCglpbnQgMQoJZnJhbWVfYnVyeSAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgwOQoJLy8gbWF4UGVyUG9vbCA9IHRoaXMuZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sCglmcmFtZV9idXJ5IDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoJLy8gKmlmMjNfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MTIKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLmV4aXN0cwoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfbGVuCglzd2FwCglwb3AKCWJ6ICppZjIzX2VuZAoKCS8vICppZjIzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxMwoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxNAoJLy8gYXNzZXJ0KHZhbGlkYXRvcklkICE9PSAwKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWludCAwCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODE1CgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IHBvb2xTZXQubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoKKmZvcl8zOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODE1CgkvLyBpIDwgcG9vbFNldC5sZW5ndGgKCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDYKCTwKCWJ6ICpmb3JfM19lbmQKCgkvLyAqaWYyNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxNgoJLy8gZ2xvYmFscy5vcGNvZGVCdWRnZXQgPCAzMDAKCWdsb2JhbCBPcGNvZGVCdWRnZXQKCWludCAzMDAKCTwKCWJ6ICppZjI0X2VuZAoKCS8vICppZjI0X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxNwoJLy8gaW5jcmVhc2VPcGNvZGVCdWRnZXQoKQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCWludCAwCglpdHhuX2ZpZWxkIEZlZQoJYnl0ZSBiNjQgQ29FQiAvLyAjcHJhZ21hIHZlcnNpb24gMTA7IGludCAxCglkdXAKCWl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCglpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCglpbnQgRGVsZXRlQXBwbGljYXRpb24KCWl0eG5fZmllbGQgT25Db21wbGV0aW9uCglpdHhuX3N1Ym1pdAoKKmlmMjRfZW5kOgoJLy8gKmlmMjVfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MTkKCS8vIHBvb2xTZXRbaV0uaWQgPT09IDAKCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgk9PQoJYnogKmlmMjVfZW5kCgoJLy8gKmlmMjVfY29uc2VxdWVudAoJYiAqZm9yXzNfY29udGludWUKCippZjI1X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyMgoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sID0gZmFsc2UKCWludCAwCglmcmFtZV9idXJ5IDEgLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sCgoJLy8gKmlmMjZfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MjMKCS8vIHBvb2xTZXRbaV0uaWQgPT09IHZhbGlkYXRvcklkCglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgMAoJKwoJaW50IDgKCWV4dHJhY3QzCglidG9pCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJPT0KCWJ6ICppZjI2X2VuZAoKCS8vICppZjI2X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyNQoJLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciA9IGZhbHNlCglpbnQgMAoJZnJhbWVfYnVyeSAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCgkvLyAqaWYyN19jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyNwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1twb29sU2V0W2ldLnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCArCgkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50VG9TdGFrZSA8PQoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4UGVyUG9vbAoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgOCAvLyBoZWFkT2Zmc2V0CgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJKwoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8PQoJYnogKmlmMjdfZW5kCgoJLy8gKmlmMjdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODMxCgkvLyByZXR1cm4gW3Bvb2xTZXRbaV0sIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IsIGlzTmV3U3Rha2VyVG9Qcm90b2NvbF0KCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWJ5dGUgMHgwMAoJaW50IDAKCWZyYW1lX2RpZyAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCXNldGJpdAoJaW50IDEKCWZyYW1lX2RpZyAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoJc2V0Yml0Cgljb25jYXQKCWIgKmZpbmRQb29sRm9yU3Rha2VyKnJldHVybgoKKmlmMjdfZW5kOgoKKmlmMjZfZW5kOgoKKmZvcl8zX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODE1CgkvLyBpICs9IDEKCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgNCAvLyBpOiB1aW50NjQKCWIgKmZvcl8zCgoqZm9yXzNfZW5kOgoKKmlmMjNfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODM4CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBhbW91bnRUb1N0YWtlID49IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1pbkVudHJ5U3Rha2UsCgkvLyAgICAgICAgICAgICAnbXVzdCBzdGFrZSBhdCBsZWFzdCB0aGUgbWluaW11bSBmb3IgdGhpcyBwb29sJywKCS8vICAgICAgICAgKQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJaW50IDIwOQoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk+PQoKCS8vIG11c3Qgc3Rha2UgYXQgbGVhc3QgdGhlIG1pbmltdW0gZm9yIHRoaXMgcG9vbAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ0CgkvLyBwb29scyA9IGNsb25lKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHMpCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWludCA0MzIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglmcmFtZV9idXJ5IDUgLy8gcG9vbHM6ICh1aW50NjQsdWludDE2LHVpbnQ2NClbMjRdCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ1CgkvLyBjdXJOdW1Qb29scyA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUubnVtUG9vbHMgYXMgdWludDY0CglpbnQgMjQyCglpbnQgMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgNiAvLyBjdXJOdW1Qb29sczogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ2CgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IGN1ck51bVBvb2xzOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA3IC8vIGk6IHVpbnQ2NAoKKmZvcl80OgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ2CgkvLyBpIDwgY3VyTnVtUG9vbHMKCWZyYW1lX2RpZyA3IC8vIGk6IHVpbnQ2NAoJZnJhbWVfZGlnIDYgLy8gY3VyTnVtUG9vbHM6IHVpbnQ2NAoJPAoJYnogKmZvcl80X2VuZAoKCS8vICppZjI4X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ3CgkvLyBwb29sc1tpXS50b3RhbEFsZ29TdGFrZWQgKyBhbW91bnRUb1N0YWtlIDw9IG1heFBlclBvb2wKCWZyYW1lX2RpZyA1IC8vIHBvb2xzOiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJKwoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8PQoJYnogKmlmMjhfZW5kCgoJLy8gKmlmMjhfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ4CgkvLyByZXR1cm4gWwoJLy8gICAgICAgICAgICAgICAgICAgICB7IGlkOiB2YWxpZGF0b3JJZCwgcG9vbElkOiBpICsgMSwgcG9vbEFwcElkOiBwb29sc1tpXS5wb29sQXBwSWQgfSwKCS8vICAgICAgICAgICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciwKCS8vICAgICAgICAgICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1Byb3RvY29sLAoJLy8gICAgICAgICAgICAgICAgIF0KCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxCgkrCglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyA1IC8vIHBvb2xzOiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglieXRlIDB4MDAKCWludCAwCglmcmFtZV9kaWcgMCAvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yOiBib29sCglzZXRiaXQKCWludCAxCglmcmFtZV9kaWcgMSAvLyBpc05ld1N0YWtlclRvUHJvdG9jb2w6IGJvb2wKCXNldGJpdAoJY29uY2F0CgliICpmaW5kUG9vbEZvclN0YWtlcipyZXR1cm4KCippZjI4X2VuZDoKCipmb3JfNF9jb250aW51ZToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg0NgoJLy8gaSArPSAxCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDcgLy8gaTogdWludDY0CgliICpmb3JfNAoKKmZvcl80X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg1NgoJLy8gcmV0dXJuIFt7IGlkOiB2YWxpZGF0b3JJZCwgcG9vbElkOiAwLCBwb29sQXBwSWQ6IDAgfSwgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciwgaXNOZXdTdGFrZXJUb1Byb3RvY29sXQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCgljb25jYXQKCWJ5dGUgMHgwMAoJaW50IDAKCWZyYW1lX2RpZyAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCXNldGJpdAoJaW50IDEKCWZyYW1lX2RpZyAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoJc2V0Yml0Cgljb25jYXQKCipmaW5kUG9vbEZvclN0YWtlcipyZXR1cm46CgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCgkvLyBwb3AgYWxsIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHRoZSBzdGFjawoJcG9wbiA3CglyZXRzdWIKCi8vIG1vdmVQb29sVG9Ob2RlKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKKmFiaV9yb3V0ZV9tb3ZlUG9vbFRvTm9kZToKCS8vIG5vZGVOdW06IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwoJYnRvaQoKCS8vIHBvb2xBcHBJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglidG9pCgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgbW92ZVBvb2xUb05vZGUodWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZAoJY2FsbHN1YiBtb3ZlUG9vbFRvTm9kZQoJaW50IDEKCXJldHVybgoKLy8gbW92ZVBvb2xUb05vZGUodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcG9vbEFwcElkOiB1aW50NjQsIG5vZGVOdW06IHVpbnQ2NCk6IHZvaWQKLy8KLy8gRmluZCB0aGUgc3BlY2lmaWVkIHBvb2wgKGluIGFueSBub2RlIG51bWJlcikgYW5kIG1vdmUgaXQgdG8gdGhlIHNwZWNpZmllZCBub2RlLgovLyBUaGUgcG9vbCBhY2NvdW50IGlzIGZvcmNlZCBvZmZsaW5lIGlmIG1vdmVkIHNvIHByaW9yIG5vZGUgd2lsbCBzdGlsbCBydW4gZm9yIDMyMCByb3VuZHMgYnV0Ci8vIG5ldyBrZXkgZ29lcyBvbmxpbmUgb24gbmV3IG5vZGUgc29vbiBhZnRlciAoMzIwIHJvdW5kcyBhZnRlciBpdCBnb2VzIG9ubGluZSkKLy8gTm8tb3AgaWYgc3VjY2VzcywgYXNzZXJ0cyBpZiBub3QgZm91bmQgb3IgY2FuJ3QgbW92ZSAgKG5vIHNwYWNlIGluIHRhcmdldCkKLy8gWyBPTkxZIE9XTkVSIE9SIE1BTkFHRVIgQ0FOIENIQU5HRSBdCi8vCi8vIEBwYXJhbSB7VmFsaWRhdG9ySWRUeXBlfSB2YWxpZGF0b3JJZCAtIFRoZSBpZCBvZiB0aGUgdmFsaWRhdG9yLgovLyBAcGFyYW0ge3VpbnQ2NH0gcG9vbEFwcElkCi8vIEBwYXJhbSB7dWludDY0fSBub2RlTnVtCm1vdmVQb29sVG9Ob2RlOgoJcHJvdG8gMyAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3MQoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lck9yTWFuYWdlcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyT3JNYW5hZ2VyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODczCgkvLyBub2RlUG9vbEFzc2lnbm1lbnRzID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5ub2RlUG9vbEFzc2lnbm1lbnRzKQoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfYnVyeSAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzQKCS8vIGFzc2VydChub2RlTnVtID49IDEgJiYgbm9kZU51bSA8PSBNQVhfTk9ERVMsICdub2RlIG51bWJlciBvdXQgb2YgYWxsb3dhYmxlIHJhbmdlJykKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCAxCgk+PQoJZHVwCglieiAqc2tpcF9hbmQyCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgOAoJPD0KCSYmCgoqc2tpcF9hbmQyOgoJLy8gbm9kZSBudW1iZXIgb3V0IG9mIGFsbG93YWJsZSByYW5nZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODc2CgkvLyBmb3IgKGxldCBzcmNOb2RlSWR4ID0gMDsgc3JjTm9kZUlkeCA8IE1BWF9OT0RFUzsgc3JjTm9kZUlkeCArPSAxKQoJaW50IDAKCWZyYW1lX2J1cnkgMSAvLyBzcmNOb2RlSWR4OiB1aW50NjQKCipmb3JfNToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3NgoJLy8gc3JjTm9kZUlkeCA8IE1BWF9OT0RFUwoJZnJhbWVfZGlnIDEgLy8gc3JjTm9kZUlkeDogdWludDY0CglpbnQgOAoJPAoJYnogKmZvcl81X2VuZAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3NwoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBNQVhfUE9PTFNfUEVSX05PREU7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzY6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzcKCS8vIGkgPCBNQVhfUE9PTFNfUEVSX05PREUKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDMKCTwKCWJ6ICpmb3JfNl9lbmQKCgkvLyAqaWYyOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3OAoJLy8gbm9kZVBvb2xBc3NpZ25tZW50cy5ub2Rlc1tzcmNOb2RlSWR4XS5wb29sQXBwSWRzW2ldID09PSBwb29sQXBwSWQKCWZyYW1lX2RpZyAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCWludCAwCglmcmFtZV9kaWcgMSAvLyBzcmNOb2RlSWR4OiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMAoJKwoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWZyYW1lX2RpZyAtMiAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJPT0KCWJ6ICppZjI5X2VuZAoKCS8vICppZjI5X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3OQoJLy8gYXNzZXJ0KG5vZGVOdW0gLSAxICE9PSBzcmNOb2RlSWR4LCAiY2FuJ3QgbW92ZSB0byBzYW1lIG5vZGUiKQoJZnJhbWVfZGlnIC0zIC8vIG5vZGVOdW06IHVpbnQ2NAoJaW50IDEKCS0KCWZyYW1lX2RpZyAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJIT0KCgkvLyBjYW4ndCBtb3ZlIHRvIHNhbWUgbm9kZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODgxCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLm5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbc3JjTm9kZUlkeF0ucG9vbEFwcElkc1tpXSA9IDAKCWludCA5MDAKCWZyYW1lX2RpZyAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4NAoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5nb09mZmxpbmU+KHsKCS8vICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgltZXRob2QgImdvT2ZmbGluZSgpdm9pZCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODg1CgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkKCWZyYW1lX2RpZyAtMiAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4OQoJLy8gdGhpcy5hZGRQb29sVG9Ob2RlKHZhbGlkYXRvcklkLCBwb29sQXBwSWQsIG5vZGVOdW0pCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gcG9vbEFwcElkOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGFkZFBvb2xUb05vZGUKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4OTAKCS8vIHJldHVybgoJcmV0c3ViCgoqaWYyOV9lbmQ6CgoqZm9yXzZfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzcKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzYKCipmb3JfNl9lbmQ6CgoqZm9yXzVfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzYKCS8vIHNyY05vZGVJZHggKz0gMQoJZnJhbWVfZGlnIDEgLy8gc3JjTm9kZUlkeDogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJYiAqZm9yXzUKCipmb3JfNV9lbmQ6CgkvLyBjb3VsZG4ndCBmaW5kIHBvb2wgYXBwIGlkIGluIG5vZGVzIHRvIG1vdmUKCWVycgoJcmV0c3ViCgovLyBlbXB0eVRva2VuUmV3YXJkcyh1aW50NjQsYWRkcmVzcyl1aW50NjQKKmFiaV9yb3V0ZV9lbXB0eVRva2VuUmV3YXJkczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gcmVjZWl2ZXI6IGFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMzIKCT09CgoJLy8gYXJndW1lbnQgMCAocmVjZWl2ZXIpIGZvciBlbXB0eVRva2VuUmV3YXJkcyBtdXN0IGJlIGEgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZW1wdHlUb2tlblJld2FyZHModWludDY0LGFkZHJlc3MpdWludDY0CgljYWxsc3ViIGVtcHR5VG9rZW5SZXdhcmRzCglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZW1wdHlUb2tlblJld2FyZHModmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcmVjZWl2ZXI6IEFkZHJlc3MpOiB1aW50NjQKLy8KLy8gU2VuZHMgdGhlIHJld2FyZCB0b2tlbnMgaGVsZCBpbiBwb29sIDEgdG8gc3BlY2lmaWVkIHJlY2VpdmVyLgovLyBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgdGhlIG93bmVyIHdoZW4gdGhleSB3YW50IHRvIGdldCByZXdhcmQgdG9rZW5zICdiYWNrJyB3aGljaCB0aGV5IHNlbnQgdG8KLy8gdGhlIGZpcnN0IHBvb2wgKGxpa2VseSBiZWNhdXNlIHZhbGlkYXRvciBpcyBzdW5zZXR0aW5nLiAgQW55IHRva2VucyBjdXJyZW50bHkgJ3Jlc2VydmVkJyBmb3Igc3Rha2VycyB0byBjbGFpbSB3aWxsCi8vIE5PVCBiZSBzZW50IGFzIHRoZXkgbXVzdCBiZSBoZWxkIGJhY2sgZm9yIHN0YWtlcnMgdG8gbGF0ZXIgY2xhaW0uCi8vIFsgT05MWSBPV05FUiBDQU4gQ0FMTF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7QWRkcmVzc30gcmVjZWl2ZXIgLSB0aGUgYWNjb3VudCB0byBzZW5kIHRoZSB0b2tlbnMgdG8gKG11c3QgYWxyZWFkeSBiZSBvcHRlZC1pbiB0byB0aGUgcmV3YXJkIHRva2VuKQovLyBAcmV0dXJucyB7dWludDY0fSB0aGUgYW1vdW50IG9mIHJld2FyZCB0b2tlbiBzZW50CmVtcHR5VG9rZW5SZXdhcmRzOgoJcHJvdG8gMiAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkwOQoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTEwCgkvLyByZXdhcmRUb2tlbklkID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcucmV3YXJkVG9rZW5JZAoJaW50IDE1MwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTExCgkvLyByZXdhcmRUb2tlbkhlbGRCYWNrID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5yZXdhcmRUb2tlbkhlbGRCYWNrCglpbnQgMjYwCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMSAvLyByZXdhcmRUb2tlbkhlbGRCYWNrOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MTIKCS8vIGFzc2VydChyZXdhcmRUb2tlbklkICE9PSAwLCAidGhpcyB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIGEgcmV3YXJkIHRva2VuIGRlZmluZWQiKQoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0CglpbnQgMAoJIT0KCgkvLyB0aGlzIHZhbGlkYXRvciBkb2Vzbid0IGhhdmUgYSByZXdhcmQgdG9rZW4gZGVmaW5lZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTEzCgkvLyBwb29sT25lQXBwSWQgPSBBcHBJRC5mcm9tVWludDY0KHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkKQoJaW50IDI2OAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MTUKCS8vIHRva2VuUmV3YXJkQmFsID0KCS8vICAgICAgICAgICAgIHBvb2xPbmVBcHBJZC5hZGRyZXNzLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JZCkpIC0gcmV3YXJkVG9rZW5IZWxkQmFjawoJZnJhbWVfZGlnIDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCXBvcAoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0Cglhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKCXBvcAoJZnJhbWVfZGlnIDEgLy8gcmV3YXJkVG9rZW5IZWxkQmFjazogdWludDY0CgktCglmcmFtZV9idXJ5IDMgLy8gdG9rZW5SZXdhcmRCYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkxOQoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5wYXlUb2tlblJld2FyZD4oewoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25JRDogcG9vbE9uZUFwcElkLAoJLy8gICAgICAgICAgICAgbWV0aG9kQXJnczogW3JlY2VpdmVyLCByZXdhcmRUb2tlbklkLCB0b2tlblJld2FyZEJhbF0sCgkvLyAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJbWV0aG9kICJwYXlUb2tlblJld2FyZChhZGRyZXNzLHVpbnQ2NCx1aW50NjQpdm9pZCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTIwCgkvLyBhcHBsaWNhdGlvbklEOiBwb29sT25lQXBwSWQKCWZyYW1lX2RpZyAyIC8vIHBvb2xPbmVBcHBJZDogdWludDY0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MjEKCS8vIG1ldGhvZEFyZ3M6IFtyZWNlaXZlciwgcmV3YXJkVG9rZW5JZCwgdG9rZW5SZXdhcmRCYWxdCglmcmFtZV9kaWcgLTIgLy8gcmVjZWl2ZXI6IEFkZHJlc3MKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklkOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMyAvLyB0b2tlblJld2FyZEJhbDogdWludDY0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MjMKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHBvb2xPbmVBcHBJZC5hZGRyZXNzLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JZCkpID09PSByZXdhcmRUb2tlbkhlbGRCYWNrLAoJLy8gICAgICAgICAgICAgJ2JhbGFuY2Ugb2YgcmVtYWluaW5nIHJld2FyZCB0b2tlbnMgc2hvdWxkIG1hdGNoIHRoZSBoZWxkIGJhY2sgYW1vdW50JywKCS8vICAgICAgICAgKQoJZnJhbWVfZGlnIDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCXBvcAoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0Cglhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKCXBvcAoJZnJhbWVfZGlnIDEgLy8gcmV3YXJkVG9rZW5IZWxkQmFjazogdWludDY0Cgk9PQoKCS8vIGJhbGFuY2Ugb2YgcmVtYWluaW5nIHJld2FyZCB0b2tlbnMgc2hvdWxkIG1hdGNoIHRoZSBoZWxkIGJhY2sgYW1vdW50Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MjcKCS8vIHJldHVybiB0b2tlblJld2FyZEJhbAoJZnJhbWVfZGlnIDMgLy8gdG9rZW5SZXdhcmRCYWw6IHVpbnQ2NAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDMKCXJldHN1YgoKLy8gY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IHZvaWQKY2FsbGVyTXVzdEJlT3duZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDIwCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICB0aGlzLnR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLAoJLy8gICAgICAgICAgICAgJ2NhbiBvbmx5IGJlIGNhbGxlZCBieSB2YWxpZGF0b3Igb3duZXInLAoJLy8gICAgICAgICApCgl0eG4gU2VuZGVyCglpbnQgOAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJPT0KCgkvLyBjYW4gb25seSBiZSBjYWxsZWQgYnkgdmFsaWRhdG9yIG93bmVyCglhc3NlcnQKCXJldHN1YgoKLy8gY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXIodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IHZvaWQKY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDI3CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICB0aGlzLnR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyIHx8CgkvLyAgICAgICAgICAgICAgICAgdGhpcy50eG4uc2VuZGVyID09PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5tYW5hZ2VyLAoJLy8gICAgICAgICAgICAgJ2NhbiBvbmx5IGJlIGNhbGxlZCBieSBvd25lciBvciBtYW5hZ2VyIG9mIHZhbGlkYXRvcicsCgkvLyAgICAgICAgICkKCXR4biBTZW5kZXIKCWludCA4CglpbnQgMzIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0Cgk9PQoJZHVwCglibnogKnNraXBfb3IzCgl0eG4gU2VuZGVyCglpbnQgNDAKCWludCAzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCT09Cgl8fAoKKnNraXBfb3IzOgoJLy8gY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IG93bmVyIG9yIG1hbmFnZXIgb2YgdmFsaWRhdG9yCglhc3NlcnQKCXJldHN1YgoKLy8gdmVyaWZ5UG9vbEtleUNhbGxlcihwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5KTogdm9pZAovLwovLyB2ZXJpZnlQb29sS2V5Q2FsbGVyIHZlcmlmaWVzIHRoZSBwYXNzZWQgaW4ga2V5IChmcm9tIGEgc3Rha2luZyBwb29sIGNhbGxpbmcgdXMgdG8gdXBkYXRlIG1ldHJpY3MpIGlzIHZhbGlkCi8vIGFuZCBtYXRjaGVzIHRoZSBpbmZvcm1hdGlvbiB3ZSBoYXZlIGluIG91ciBzdGF0ZS4gICdGYWtlJyBwb29scyBjb3VsZCBjYWxsIHVzIHRvIHVwZGF0ZSBvdXIgZGF0YSwgYnV0IHRoZXkKLy8gY2FuJ3QgZmFrZSB0aGUgaWRzIGFuZCBtb3N0IGltcG9ydGFudGx5IGFwcGxpY2F0aW9uIGlkKCEpIG9mIHRoZSBjYWxsZXIgdGhhdCBoYXMgdG8gbWF0Y2guCnZlcmlmeVBvb2xLZXlDYWxsZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDQwCgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLmV4aXN0cywgInRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGlzbid0IHZhbGlkIikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cglib3hfbGVuCglzd2FwCglwb3AKCgkvLyB0aGUgc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBpc24ndCB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA0MQoJLy8gYXNzZXJ0KHBvb2xLZXkucG9vbElkIDw9IE1BWF9QT09MUywgJ3Bvb2wgaWQgbm90IGluIHZhbGlkIHJhbmdlJykKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDI0Cgk8PQoKCS8vIHBvb2wgaWQgbm90IGluIHZhbGlkIHJhbmdlCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDQyCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBwb29sS2V5LnBvb2xJZCA+IDAgJiYgKHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNikgPD0gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLm51bVBvb2xzLAoJLy8gICAgICAgICAgICAgJ3Bvb2wgaWQgb3V0c2lkZSBvZiByYW5nZSBvZiBwb29scyBjcmVhdGVkIGZvciB0aGlzIHZhbGlkYXRvcicsCgkvLyAgICAgICAgICkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDAKCT4KCWR1cAoJYnogKnNraXBfYW5kMwoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMjQyCglpbnQgMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk8PQoJJiYKCipza2lwX2FuZDM6CgkvLyBwb29sIGlkIG91dHNpZGUgb2YgcmFuZ2Ugb2YgcG9vbHMgY3JlYXRlZCBmb3IgdGhpcyB2YWxpZGF0b3IKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNDgKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHBvb2xLZXkucG9vbEFwcElkID09PSB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbcG9vbEtleS5wb29sSWQgLSAxXS5wb29sQXBwSWQsCgkvLyAgICAgICAgICAgICAiVGhlIHBhc3NlZCBpbiBhcHAgaWQgZG9lc24ndCBtYXRjaCB0aGUgcGFzc2VkIGluIGlkcyIsCgkvLyAgICAgICAgICkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk9PQoKCS8vIFRoZSBwYXNzZWQgaW4gYXBwIGlkIGRvZXNuJ3QgbWF0Y2ggdGhlIHBhc3NlZCBpbiBpZHMKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNTMKCS8vIGFzc2VydCh0aGlzLnR4bi5zZW5kZXIgPT09IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLmFkZHJlc3MpCgl0eG4gU2VuZGVyCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAxNiA4CglidG9pCglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCT09Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDU1CgkvLyBhc3NlcnQocG9vbEtleS5pZCA9PT0gKEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLmdsb2JhbFN0YXRlKCd2YWxpZGF0b3JJZCcpIGFzIHVpbnQ2NCkpCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWJ5dGUgMHg3NjYxNmM2OTY0NjE3NDZmNzI0OTY0IC8vICJ2YWxpZGF0b3JJZCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgndmFsaWRhdG9ySWQnKQoJYXNzZXJ0Cgk9PQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA1NgoJLy8gYXNzZXJ0KHBvb2xLZXkucG9vbElkID09PSAoQXBwSUQuZnJvbVVpbnQ2NChwb29sS2V5LnBvb2xBcHBJZCkuZ2xvYmFsU3RhdGUoJ3Bvb2xJZCcpIGFzIHVpbnQ2NCkpCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWJ5dGUgMHg3MDZmNmY2YzQ5NjQgLy8gInBvb2xJZCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgncG9vbElkJykKCWFzc2VydAoJPT0KCWFzc2VydAoJcmV0c3ViCgovLyByZXZlcmlmeU5GRE93bmVyc2hpcCh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogdm9pZAovLwovLyBUaGlzIG1ldGhvZCB2ZXJpZmllcyB0aGUgb3duZXJzaGlwIG9mIE5GRCAoTmFtZWQgRnVuY3Rpb24gRGF0YSkgYnkgYSB2YWxpZGF0b3IuCi8vIElmIHRoZSBvd25lcnNoaXAgaXMgbm8gbG9uZ2VyIHZhbGlkLCBpdCByZW1vdmVzIHRoZSBORkQgZnJvbSB0aGUgdmFsaWRhdG9yJ3MgY29uZmlndXJhdGlvbi4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3Igd2hvc2UgZGF0YSBzaG91bGQgYmUgcmUtZXZhbHVhdGVkLgpyZXZlcmlmeU5GRE93bmVyc2hpcDoKCXByb3RvIDEgMAoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDY2CgkvLyB2YWxpZGF0b3JDb25maWcgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZwoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJZnJhbWVfYnVyeSAwIC8vIHN0b3JhZ2Uga2V5Ly92YWxpZGF0b3JDb25maWcKCgkvLyAqaWYzMF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNjcKCS8vIHZhbGlkYXRvckNvbmZpZy5uZmRGb3JJbmZvICE9PSAwCglpbnQgNzIKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDAKCSE9CglieiAqaWYzMF9lbmQKCgkvLyAqaWYzMF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDcwCgkvLyBuZmRPd25lciA9IEFwcElELmZyb21VaW50NjQodmFsaWRhdG9yQ29uZmlnLm5mZEZvckluZm8pLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzCglpbnQgNzIKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQodmFsaWRhdG9yQ29uZmlnLm5mZEZvckluZm8pLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCgkvLyAqaWYzMV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNzIKCS8vIHZhbGlkYXRvckNvbmZpZy5vd25lciAhPT0gbmZkT3duZXIgJiYgdmFsaWRhdG9yQ29uZmlnLm1hbmFnZXIgIT09IG5mZE93bmVyCglpbnQgOAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfZGlnIDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCSE9CglkdXAKCWJ6ICpza2lwX2FuZDQKCWludCA0MAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfZGlnIDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCSE9CgkmJgoKKnNraXBfYW5kNDoKCWJ6ICppZjMxX2VuZAoKCS8vICppZjMxX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNzQKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm5mZEZvckluZm8gPSAwCglpbnQgNzIKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKKmlmMzFfZW5kOgoKKmlmMzBfZW5kOgoJcmV0c3ViCgovLyB2YWxpZGF0ZUNvbmZpZyhjb25maWc6IFZhbGlkYXRvckNvbmZpZyk6IHZvaWQKdmFsaWRhdGVDb25maWc6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDgxCgkvLyBhc3NlcnQoY29uZmlnLm93bmVyICE9PSBBZGRyZXNzLnplcm9BZGRyZXNzKQoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDggMzIKCWdsb2JhbCBaZXJvQWRkcmVzcwoJIT0KCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwODIKCS8vIGFzc2VydChjb25maWcubWFuYWdlciAhPT0gQWRkcmVzcy56ZXJvQWRkcmVzcykKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA0MCAzMgoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA4MwoJLy8gYXNzZXJ0KHRoaXMudHhuLnNlbmRlciA9PT0gY29uZmlnLm93bmVyLCAnc2VuZGVyIG11c3QgYmUgb3duZXIgdG8gYWRkIG5ldyB2YWxpZGF0b3InKQoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDggMzIKCT09CgoJLy8gc2VuZGVyIG11c3QgYmUgb3duZXIgdG8gYWRkIG5ldyB2YWxpZGF0b3IKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwODUKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIGNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPj0gR0FUSU5HX1RZUEVfTk9ORSAmJiBjb25maWcuZW50cnlHYXRpbmdUeXBlIDw9IEdBVElOR19UWVBFX0NPTlNUX01BWCwKCS8vICAgICAgICAgICAgICdnYXRpbmcgdHlwZSBub3QgdmFsaWQnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgODAgMQoJYnRvaQoJaW50IDAKCT49CglkdXAKCWJ6ICpza2lwX2FuZDUKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4MCAxCglidG9pCglpbnQgNAoJPD0KCSYmCgoqc2tpcF9hbmQ1OgoJLy8gZ2F0aW5nIHR5cGUgbm90IHZhbGlkCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDg5CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBjb25maWcuZXBvY2hSb3VuZExlbmd0aCA+PSBNSU5fRVBPQ0hfTEVOR1RIICYmIGNvbmZpZy5lcG9jaFJvdW5kTGVuZ3RoIDw9IE1BWF9FUE9DSF9MRU5HVEgsCgkvLyAgICAgICAgICAgICAnZXBvY2ggbGVuZ3RoIG5vdCBpbiBhbGxvd2FibGUgcmFuZ2UnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTY5IDQKCWJ0b2kKCWludCAxCgk+PQoJZHVwCglieiAqc2tpcF9hbmQ2CglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTY5IDQKCWJ0b2kKCWludCAxMDAwMDAwCgk8PQoJJiYKCipza2lwX2FuZDY6CgkvLyBlcG9jaCBsZW5ndGggbm90IGluIGFsbG93YWJsZSByYW5nZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA5MwoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgY29uZmlnLnBlcmNlbnRUb1ZhbGlkYXRvciA+PSBNSU5fUENUX1RPX1ZBTElEQVRPUiAmJiBjb25maWcucGVyY2VudFRvVmFsaWRhdG9yIDw9IE1BWF9QQ1RfVE9fVkFMSURBVE9SLAoJLy8gICAgICAgICAgICAgJ2NvbW1pc3Npb24gcGVyY2VudGFnZSBub3QgdmFsaWQnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTczIDQKCWJ0b2kKCWludCAwCgk+PQoJZHVwCglieiAqc2tpcF9hbmQ3CglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTczIDQKCWJ0b2kKCWludCAxMDAwMDAwCgk8PQoJJiYKCipza2lwX2FuZDc6CgkvLyBjb21taXNzaW9uIHBlcmNlbnRhZ2Ugbm90IHZhbGlkCglhc3NlcnQKCgkvLyAqaWYzMl9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwOTcKCS8vIGNvbmZpZy5wZXJjZW50VG9WYWxpZGF0b3IgIT09IDAKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAxNzMgNAoJYnRvaQoJaW50IDAKCSE9CglieiAqaWYzMl9lbmQKCgkvLyAqaWYzMl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDk4CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgY29uZmlnLnZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzICE9PSBBZGRyZXNzLnplcm9BZGRyZXNzLAoJLy8gICAgICAgICAgICAgICAgICd2YWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyBtdXN0IGJlIHNldCBpZiBwZXJjZW50IHRvIHZhbGlkYXRvciBpcyBub3QgMCcsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTc3IDMyCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CgoJLy8gdmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MgbXVzdCBiZSBzZXQgaWYgcGVyY2VudCB0byB2YWxpZGF0b3IgaXMgbm90IDAKCWFzc2VydAoKKmlmMzJfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEwMwoJLy8gYXNzZXJ0KGNvbmZpZy5taW5FbnRyeVN0YWtlID49IE1JTl9BTEdPX1NUQUtFX1BFUl9QT09MLCAnc3Rha2luZyBwb29sIG11c3QgaGF2ZSBtaW5pbXVtIGVudHJ5IG9mIDEgYWxnbycpCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMjA5IDgKCWJ0b2kKCWludCAxMDAwMDAwCgk+PQoKCS8vIHN0YWtpbmcgcG9vbCBtdXN0IGhhdmUgbWluaW11bSBlbnRyeSBvZiAxIGFsZ28KCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMDUKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIGNvbmZpZy5wb29sc1Blck5vZGUgPiAwICYmIGNvbmZpZy5wb29sc1Blck5vZGUgPD0gTUFYX1BPT0xTX1BFUl9OT0RFLAoJLy8gICAgICAgICAgICAgJ251bWJlciBvZiBwb29scyBwZXIgbm9kZSBtdXN0IGJlIGJlIGJldHdlZW4gMSBhbmQgdGhlIG1heGltdW0gYWxsb3dlZCBudW1iZXInLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMjI1IDEKCWJ0b2kKCWludCAwCgk+CglkdXAKCWJ6ICpza2lwX2FuZDgKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAyMjUgMQoJYnRvaQoJaW50IDMKCTw9CgkmJgoKKnNraXBfYW5kODoKCS8vIG51bWJlciBvZiBwb29scyBwZXIgbm9kZSBtdXN0IGJlIGJlIGJldHdlZW4gMSBhbmQgdGhlIG1heGltdW0gYWxsb3dlZCBudW1iZXIKCWFzc2VydAoKCS8vICppZjMzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEwOQoJLy8gY29uZmlnLnN1bnNldHRpbmdPbiAhPT0gMAoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDIyNiA4CglidG9pCglpbnQgMAoJIT0KCWJ6ICppZjMzX2VuZAoKCS8vICppZjMzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMTAKCS8vIGFzc2VydChjb25maWcuc3Vuc2V0dGluZ09uID4gZ2xvYmFscy5sYXRlc3RUaW1lc3RhbXAsICdzdW5zZXR0aW5nT24gbXVzdCBiZSBsYXRlciB0aGFuIG5vdyBpZiBzZXQnKQoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDIyNiA4CglidG9pCglnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCgk+CgoJLy8gc3Vuc2V0dGluZ09uIG11c3QgYmUgbGF0ZXIgdGhhbiBub3cgaWYgc2V0Cglhc3NlcnQKCippZjMzX2VuZDoKCXJldHN1YgoKLy8gY2FsbFBvb2xBZGRTdGFrZShzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4sIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXksIG1ickFtdFBhaWQ6IHVpbnQ2NCwgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbGVhbiwgaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sZWFuKTogdm9pZAovLwovLyBBZGRzIGEgc3Rha2VycyBhbW91bnQgb2YgYWxnbyB0byBhIHZhbGlkYXRvciBwb29sLCB0cmFuc2ZlcnJpbmcgdGhlIGFsZ28gd2UgcmVjZWl2ZWQgZnJvbSB0aGVtIChhbHJlYWR5IHZlcmlmaWVkCi8vIGJ5IG91ciBjYWxsZXIpIHRvIHRoZSBzdGFraW5nIHBvb2wgYWNjb3VudCwgYW5kIHRoZW4gdGVsbGluZyBpdCBhYm91dCB0aGUgYW1vdW50IGJlaW5nIGFkZGVkIGZvciB0aGUgc3BlY2lmaWVkCi8vIHN0YWtlci4KLy8KLy8gQHBhcmFtIHtQYXlUeG59IHN0YWtlZEFtb3VudFBheW1lbnQgLSBwYXltZW50IGNvbWluZyBmcm9tIHN0YWtlciB0byBwbGFjZSBpbnRvIGEgcG9vbAovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBUaGUga2V5IG9mIHRoZSB2YWxpZGF0b3IgcG9vbC4KLy8gQHBhcmFtIHt1aW50NjR9IG1ickFtdFBhaWQgLSBBbW91bnQgdGhlIHVzZXIgaXMgbGVhdmluZyBiZWhpbmQgaW4gdGhlIHZhbGlkYXRvciB0byBwYXkgZm9yIHRoZWlyIHN0YWtlciBNQlIgY29zdAovLyBAcGFyYW0ge2Jvb2xlYW59IGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IgLSBpZiB0aGlzIGlzIGEgbmV3LCBmaXJzdC10aW1lIHN0YWtlciB0byB0aGUgdmFsaWRhdG9yCi8vIEBwYXJhbSB7Ym9vbGVhbn0gaXNOZXdTdGFrZXJUb1Byb3RvY29sIC0gaWYgdGhpcyBpcyBhIG5ldywgZmlyc3QtdGltZSBzdGFrZXIgdG8gdGhlIHByb3RvY29sCmNhbGxQb29sQWRkU3Rha2U6Cglwcm90byA1IDAKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiAyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEzMgoJLy8gcG9vbEFwcElkID0gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzW3Bvb2xLZXkucG9vbElkIC0gMV0ucG9vbEFwcElkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIHBvb2xBcHBJZDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEzNgoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5hZGRTdGFrZSwgdWludDY0Pih7CgkvLyAgICAgICAgICAgICBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCksCgkvLyAgICAgICAgICAgICBtZXRob2RBcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gPT09PT09PQoJLy8gICAgICAgICAgICAgICAgIC8vIFRISVMgSVMgQSBTRU5EIG9mIHRoZSBhbW91bnQgcmVjZWl2ZWQgcmlnaHQgYmFjayBvdXQgYW5kIGludG8gdGhlIHN0YWtpbmcgcG9vbCBjb250cmFjdCBhY2NvdW50LgoJLy8gICAgICAgICAgICAgICAgIHsgYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQsIHJlY2VpdmVyOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuYWRkcmVzcyB9LAoJLy8gICAgICAgICAgICAgICAgIC8vID09PT09PT0KCS8vICAgICAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LnNlbmRlciwKCS8vICAgICAgICAgICAgIF0sCgkvLyAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgcGF5CglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE0MQoJLy8gYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJZnJhbWVfZGlnIC0zIC8vIG1ickFtdFBhaWQ6IHVpbnQ2NAoJLQoJaXR4bl9maWVsZCBBbW91bnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTQxCgkvLyByZWNlaXZlcjogQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmFkZHJlc3MKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCWl0eG5fZmllbGQgUmVjZWl2ZXIKCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCWl0eG5fbmV4dAoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAiYWRkU3Rha2UocGF5LGFkZHJlc3MpdWludDY0IgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTM3CgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTM4CgkvLyBtZXRob2RBcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gPT09PT09PQoJLy8gICAgICAgICAgICAgICAgIC8vIFRISVMgSVMgQSBTRU5EIG9mIHRoZSBhbW91bnQgcmVjZWl2ZWQgcmlnaHQgYmFjayBvdXQgYW5kIGludG8gdGhlIHN0YWtpbmcgcG9vbCBjb250cmFjdCBhY2NvdW50LgoJLy8gICAgICAgICAgICAgICAgIHsgYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQsIHJlY2VpdmVyOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuYWRkcmVzcyB9LAoJLy8gICAgICAgICAgICAgICAgIC8vID09PT09PT0KCS8vICAgICAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LnNlbmRlciwKCS8vICAgICAgICAgICAgIF0KCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIFNlbmRlcgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCgkvLyBTdWJtaXQgaW5uZXIgdHJhbnNhY3Rpb24KCWl0eG5fc3VibWl0CglpdHhuIE51bUxvZ3MKCWludCAxCgktCglpdHhuYXMgTG9ncwoJZXh0cmFjdCA0IDAKCWJ0b2kKCgkvLyAqaWYzNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNDYKCS8vIGdsb2JhbHMub3Bjb2RlQnVkZ2V0IDwgNTAwCglnbG9iYWwgT3Bjb2RlQnVkZ2V0CglpbnQgNTAwCgk8CglieiAqaWYzNF9lbmQKCgkvLyAqaWYzNF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTQ3CgkvLyBpbmNyZWFzZU9wY29kZUJ1ZGdldCgpCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJaW50IDAKCWl0eG5fZmllbGQgRmVlCglieXRlIGI2NCBDb0VCIC8vICNwcmFnbWEgdmVyc2lvbiAxMDsgaW50IDEKCWR1cAoJaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCWludCBEZWxldGVBcHBsaWNhdGlvbgoJaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KCWl0eG5fc3VibWl0CgoqaWYzNF9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTUxCgkvLyBwb29sTnVtU3Rha2VycyA9IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgnbnVtU3Rha2VycycpIGFzIHVpbnQ2NAoJZnJhbWVfZGlnIDAgLy8gcG9vbEFwcElkOiB1aW50NjQKCWJ5dGUgMHg2ZTc1NmQ1Mzc0NjE2YjY1NzI3MyAvLyAibnVtU3Rha2VycyIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuZ2xvYmFsU3RhdGUoJ251bVN0YWtlcnMnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDEgLy8gcG9vbE51bVN0YWtlcnM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNTIKCS8vIHBvb2xBbGdvU3Rha2VkID0gQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmdsb2JhbFN0YXRlKCdzdGFrZWQnKSBhcyB1aW50NjQKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglhcHBfZ2xvYmFsX2dldF9leAoKCS8vIGdsb2JhbCBzdGF0ZSB2YWx1ZSBkb2VzIG5vdCBleGlzdDogQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmdsb2JhbFN0YXRlKCdzdGFrZWQnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDIgLy8gcG9vbEFsZ29TdGFrZWQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNTMKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsU3Rha2VycyA9IHBvb2xOdW1TdGFrZXJzIGFzIHVpbnQxNgoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJZnJhbWVfZGlnIDEgLy8gcG9vbE51bVN0YWtlcnM6IHVpbnQ2NAoJaXRvYgoJZXh0cmFjdCA2IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNTQKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCA9IHBvb2xBbGdvU3Rha2VkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJZnJhbWVfZGlnIDIgLy8gcG9vbEFsZ29TdGFrZWQ6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gKmlmMzVfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTU3CgkvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yCglmcmFtZV9kaWcgLTQgLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbGVhbgoJYnogKmlmMzVfZW5kCgoJLy8gKmlmMzVfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE1OAoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsU3Rha2VycyArPSAxCglpbnQgMjQ0CglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWludCAxCgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCippZjM1X2VuZDoKCS8vICppZjM2X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE2MAoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sCglmcmFtZV9kaWcgLTUgLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sZWFuCglieiAqaWYzNl9lbmQKCgkvLyAqaWYzNl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTYxCgkvLyB0aGlzLm51bVN0YWtlcnMudmFsdWUgKz0gMQoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJYXBwX2dsb2JhbF9nZXQKCWludCAxCgkrCglieXRlIDB4NmU3NTZkNTM3NDYxNmI2NTcyNzMgLy8gIm51bVN0YWtlcnMiCglzd2FwCglhcHBfZ2xvYmFsX3B1dAoKKmlmMzZfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE2MwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsQWxnb1N0YWtlZCArPSBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWludCAyNTIKCWR1cAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4bgoJZ3R4bnMgQW1vdW50CglmcmFtZV9kaWcgLTMgLy8gbWJyQW10UGFpZDogdWludDY0CgktCgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTY0CgkvLyB0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSArPSBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCWFwcF9nbG9iYWxfZ2V0CglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBBbW91bnQKCWZyYW1lX2RpZyAtMyAvLyBtYnJBbXRQYWlkOiB1aW50NjQKCS0KCSsKCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCXN3YXAKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIHVwZGF0ZVN0YWtlclBvb2xTZXQoc3Rha2VyOiBBZGRyZXNzLCBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5KTogdm9pZAp1cGRhdGVTdGFrZXJQb29sU2V0OgoJcHJvdG8gMiAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjgKCS8vIGFzc2VydCh0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS5leGlzdHMpCglieXRlIDB4NzM3MDczIC8vICJzcHMiCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE3MAoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDAgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNzEKCS8vIGZpcnN0RW1wdHkgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNzIKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoKKmZvcl83OgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE3MgoJLy8gaSA8IHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlLmxlbmd0aAoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl83X2VuZAoKCS8vICppZjM3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE3MwoJLy8gcG9vbFNldFtpXSA9PT0gcG9vbEtleQoJZnJhbWVfZGlnIDAgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDI0CglleHRyYWN0MwoJZnJhbWVfZGlnIC0yIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCT09CglieiAqaWYzN19lbmQKCgkvLyAqaWYzN19jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTc1CgkvLyByZXR1cm4KCXJldHN1YgoKKmlmMzdfZW5kOgoJLy8gKmlmMzhfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTc3CgkvLyBmaXJzdEVtcHR5ID09PSAwICYmIHBvb2xTZXRbaV0uaWQgPT09IDAKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDAKCT09CglkdXAKCWJ6ICpza2lwX2FuZDkKCWZyYW1lX2RpZyAwIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgk9PQoJJiYKCipza2lwX2FuZDk6CglieiAqaWYzOF9lbmQKCgkvLyAqaWYzOF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTc4CgkvLyBmaXJzdEVtcHR5ID0gaSArIDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMSAvLyBmaXJzdEVtcHR5OiB1aW50NjQKCippZjM4X2VuZDoKCipmb3JfN19jb250aW51ZToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNzIKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzcKCipmb3JfN19lbmQ6CgkvLyAqaWYzOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExODEKCS8vIGZpcnN0RW1wdHkgPT09IDAKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDAKCT09CglieiAqaWYzOV9lbmQKCgkvLyAqaWYzOV9jb25zZXF1ZW50CgkvLyBObyBlbXB0eSBzbG90IGF2YWlsYWJsZSBpbiB0aGUgc3Rha2VyIHBvb2wgc2V0CgllcnIKCippZjM5X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExODQKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlW2ZpcnN0RW1wdHkgLSAxXSA9IHBvb2xLZXkKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDEKCS0KCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyByZW1vdmVGcm9tU3Rha2VyUG9vbFNldChzdGFrZXI6IEFkZHJlc3MsIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkpOiBbYm9vbGVhbiwgYm9vbGVhbl0KLy8KLy8gUmVtb3ZlcyBhIHBvb2wga2V5IGZyb20gdGhlIHN0YWtlcidzIGFjdGl2ZSBwb29sIHNldCAtIGZhaWxzIGlmIG5vdCBmb3VuZCAoISkKLy8KLy8gQHBhcmFtIHtBZGRyZXNzfSBzdGFrZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgc3Rha2VyLgovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBUaGUgcG9vbCBrZXkgdGhleSBzaG91bGQgYmUgc3RvcmVkIGluCi8vCi8vIEByZXR1cm4gW2Jvb2xlYW4sIGJvb2xlYW5dIFtpcyB0aGUgc3Rha2VyIGdvbmUgZnJvbSBBTEwgcG9vbHMgb2YgdGhlIGdpdmVuIFZBTElEQVRPUiwgYW5kIGlzIHN0YWtlciBnb25lIGZyb20gQUxMIHBvb2xzXQpyZW1vdmVGcm9tU3Rha2VyUG9vbFNldDoKCXByb3RvIDIgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTk3CgkvLyBpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAwIC8vIGluU2FtZVZhbGlkYXRvclBvb2xDb3VudDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5OAoJLy8gaW5BbnlQb29sQ291bnQgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAxIC8vIGluQW55UG9vbENvdW50OiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTk5CgkvLyBmb3VuZCA9IGZhbHNlCglpbnQgMAoJZnJhbWVfYnVyeSAyIC8vIGZvdW5kOiBib29sCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwMQoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDIKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoKKmZvcl84OgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwMgoJLy8gaSA8IHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlLmxlbmd0aAoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl84X2VuZAoKCS8vICppZjQwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwMwoJLy8gcG9vbFNldFtpXS5pZCA9PT0gMAoJZnJhbWVfZGlnIDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWY0MF9lbmQKCgkvLyAqaWY0MF9jb25zZXF1ZW50CgliICpmb3JfOF9jb250aW51ZQoKKmlmNDBfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwNgoJLy8gaW5BbnlQb29sQ291bnQgKz0gMQoJZnJhbWVfZGlnIDEgLy8gaW5BbnlQb29sQ291bnQ6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMSAvLyBpbkFueVBvb2xDb3VudDogdWludDY0CgoJLy8gKmlmNDFfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjA3CgkvLyBwb29sU2V0W2ldLmlkID09PSBwb29sS2V5LmlkCglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgMAoJKwoJaW50IDgKCWV4dHJhY3QzCglidG9pCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCT09CglieiAqaWY0MV9lbmQKCgkvLyAqaWY0MV9jb25zZXF1ZW50CgkvLyAqaWY0Ml9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDgKCS8vIHBvb2xTZXRbaV0gPT09IHBvb2xLZXkKCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5Cgk9PQoJYnogKmlmNDJfZWxzZQoKCS8vICppZjQyX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDkKCS8vIGZvdW5kID0gdHJ1ZQoJaW50IDEKCWZyYW1lX2J1cnkgMiAvLyBmb3VuZDogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMTEKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlW2ldID0geyBpZDogMCwgcG9vbElkOiAwLCBwb29sQXBwSWQ6IDAgfQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJYiAqaWY0Ml9lbmQKCippZjQyX2Vsc2U6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjEzCgkvLyBpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgKz0gMQoJZnJhbWVfZGlnIDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCippZjQyX2VuZDoKCippZjQxX2VuZDoKCipmb3JfOF9jb250aW51ZToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDIKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzgKCipmb3JfOF9lbmQ6CgkvLyAqaWY0M19jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMTcKCS8vICFmb3VuZAoJZnJhbWVfZGlnIDIgLy8gZm91bmQ6IGJvb2wKCSEKCWJ6ICppZjQzX2VuZAoKCS8vICppZjQzX2NvbnNlcXVlbnQKCS8vIE5vIG1hdGNoaW5nIHNsb3QgZm91bmQgd2hlbiB0b2xkIHRvIHJlbW92ZSBhIHBvb2wgZnJvbSB0aGUgc3Rha2VycyBzZXQKCWVycgoKKmlmNDNfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIyMQoJLy8gcmV0dXJuIFtpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgPT09IDAsIGluQW55UG9vbENvdW50ID09PSAwXQoJYnl0ZSAweDAwCglpbnQgMAoJZnJhbWVfZGlnIDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCWludCAwCgk9PQoJc2V0Yml0CglpbnQgMQoJZnJhbWVfZGlnIDEgLy8gaW5BbnlQb29sQ291bnQ6IHVpbnQ2NAoJaW50IDAKCT09CglzZXRiaXQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCgkvLyBwb3AgYWxsIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHRoZSBzdGFjawoJcG9wbiA0CglyZXRzdWIKCi8vIGFkZFBvb2xUb05vZGUodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcG9vbEFwcElkOiB1aW50NjQsIG5vZGVOdW06IHVpbnQ2NCk6IHZvaWQKYWRkUG9vbFRvTm9kZToKCXByb3RvIDMgMAoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI1CgkvLyBub2RlUG9vbEFzc2lnbm1lbnRzID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5ub2RlUG9vbEFzc2lnbm1lbnRzKQoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfYnVyeSAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI2CgkvLyBtYXhQb29sc1Blck5vZGVGb3JUaGlzVmFsaWRhdG9yID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcucG9vbHNQZXJOb2RlIGFzIHVpbnQ2NAoJaW50IDIyNQoJaW50IDEKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDEgLy8gbWF4UG9vbHNQZXJOb2RlRm9yVGhpc1ZhbGlkYXRvcjogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIyOAoJLy8gYXNzZXJ0KG5vZGVOdW0gPj0gMSAmJiBub2RlTnVtIDw9IE1BWF9OT0RFUywgJ25vZGUgbnVtYmVyIG5vdCBpbiB2YWxpZCByYW5nZScpCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgMQoJPj0KCWR1cAoJYnogKnNraXBfYW5kMTAKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCA4Cgk8PQoJJiYKCipza2lwX2FuZDEwOgoJLy8gbm9kZSBudW1iZXIgbm90IGluIHZhbGlkIHJhbmdlCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjMwCgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IG1heFBvb2xzUGVyTm9kZUZvclRoaXNWYWxpZGF0b3I7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzk6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjMwCgkvLyBpIDwgbWF4UG9vbHNQZXJOb2RlRm9yVGhpc1ZhbGlkYXRvcgoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglmcmFtZV9kaWcgMSAvLyBtYXhQb29sc1Blck5vZGVGb3JUaGlzVmFsaWRhdG9yOiB1aW50NjQKCTwKCWJ6ICpmb3JfOV9lbmQKCgkvLyAqaWY0NF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMzEKCS8vIG5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbbm9kZU51bSAtIDFdLnBvb2xBcHBJZHNbaV0gPT09IDAKCWZyYW1lX2RpZyAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCWludCAwCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgMQoJLQoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWY0NF9lbmQKCgkvLyAqaWY0NF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjMzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLm5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbbm9kZU51bSAtIDFdLnBvb2xBcHBJZHNbaV0gPSBwb29sQXBwSWQKCWludCA5MDAKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCAxCgktCglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDAKCSsKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJZnJhbWVfZGlnIC0yIC8vIHBvb2xBcHBJZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMzQKCS8vIHJldHVybgoJcmV0c3ViCgoqaWY0NF9lbmQ6CgoqZm9yXzlfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjMwCgkvLyBpICs9IDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCWIgKmZvcl85CgoqZm9yXzlfZW5kOgoJLy8gbm8gYXZhaWxhYmxlIHNwYWNlIGluIHNwZWNpZmllZCBub2RlIGZvciB0aGlzIHBvb2wKCWVycgoJcmV0c3ViCgovLyBkb2VzU3Rha2VyTWVldEdhdGluZyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQpOiB2b2lkCi8vCi8vIENoZWNrcyBpZiBhIHN0YWtlciBtZWV0cyB0aGUgZ2F0aW5nIHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgYnkgdGhlIHZhbGlkYXRvci4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWx1ZVRvVmVyaWZ5IC0gVGhlIHZhbHVlIHRvIHZlcmlmeSBhZ2FpbnN0IHRoZSBnYXRpbmcgcmVxdWlyZW1lbnRzLgovLyBAcmV0dXJucyB7dm9pZH0gb3IgYXNzZXJ0cyBpZiByZXF1aXJlbWVudHMgbm90IG1ldC4KZG9lc1N0YWtlck1lZXRHYXRpbmc6Cglwcm90byAyIDAKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA4CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI0OAoJLy8gdHlwZSA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLmVudHJ5R2F0aW5nVHlwZQoJaW50IDgwCglpbnQgMQoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMCAvLyB0eXBlOiB1aW50OAoKCS8vICppZjQ1X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI0OQoJLy8gdHlwZSA9PT0gR0FUSU5HX1RZUEVfTk9ORQoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAwCgk9PQoJYnogKmlmNDVfZW5kCgoJLy8gKmlmNDVfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI1MAoJLy8gcmV0dXJuCglyZXRzdWIKCippZjQ1X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTIKCS8vIHN0YWtlciA9IHRoaXMudHhuLnNlbmRlcgoJdHhuIFNlbmRlcgoJZnJhbWVfYnVyeSAxIC8vIHN0YWtlcjogYWRkcmVzcwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTMKCS8vIGNvbmZpZyA9IGNsb25lKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnKQoJaW50IDAKCWludCAyNDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglmcmFtZV9idXJ5IDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCgkvLyAqaWY0Nl9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTcKCS8vIHR5cGUgPT09IEdBVElOR19UWVBFX0FTU0VUU19DUkVBVEVEX0JZIHx8CgkvLyAgICAgICAgICAgICB0eXBlID09PSBHQVRJTkdfVFlQRV9BU1NFVF9JRCB8fAoJLy8gICAgICAgICAgICAgdHlwZSA9PT0gR0FUSU5HX1RZUEVfQ1JFQVRFRF9CWV9ORkRfQUREUkVTU0VTCglmcmFtZV9kaWcgMCAvLyB0eXBlOiB1aW50OAoJaW50IDEKCT09CglkdXAKCWJueiAqc2tpcF9vcjQKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMgoJPT0KCXx8Cgoqc2tpcF9vcjQ6CglkdXAKCWJueiAqc2tpcF9vcjUKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMwoJPT0KCXx8Cgoqc2tpcF9vcjU6CglieiAqaWY0Nl9lbmQKCgkvLyAqaWY0Nl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjYxCgkvLyBhc3NlcnQodmFsdWVUb1ZlcmlmeSAhPT0gMCkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWludCAwCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI2MgoJLy8gYmFsUmVxdWlyZWQgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5nYXRpbmdBc3NldE1pbkJhbGFuY2UKCWludCAxNDUKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAzIC8vIGJhbFJlcXVpcmVkOiB1aW50NjQKCgkvLyAqaWY0N19jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNjMKCS8vIGJhbFJlcXVpcmVkID09PSAwCglmcmFtZV9kaWcgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0CglpbnQgMAoJPT0KCWJ6ICppZjQ3X2VuZAoKCS8vICppZjQ3X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNjQKCS8vIGJhbFJlcXVpcmVkID0gMQoJaW50IDEKCWZyYW1lX2J1cnkgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0CgoqaWY0N19lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjY2CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgc3Rha2VyLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQodmFsdWVUb1ZlcmlmeSkpID49IGJhbFJlcXVpcmVkLAoJLy8gICAgICAgICAgICAgICAgICdtdXN0IGhhdmUgcmVxdWlyZWQgbWluaW11bSBiYWxhbmNlIG9mIHZhbGlkYXRvciBkZWZpbmVkIHRva2VuIHRvIGFkZCBzdGFrZScsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgMSAvLyBzdGFrZXI6IGFkZHJlc3MKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQoJcG9wCglmcmFtZV9kaWcgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0Cgk+PQoKCS8vIG11c3QgaGF2ZSByZXF1aXJlZCBtaW5pbXVtIGJhbGFuY2Ugb2YgdmFsaWRhdG9yIGRlZmluZWQgdG9rZW4gdG8gYWRkIHN0YWtlCglhc3NlcnQKCippZjQ2X2VuZDoKCS8vICppZjQ4X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3MQoJLy8gdHlwZSA9PT0gR0FUSU5HX1RZUEVfQVNTRVRTX0NSRUFURURfQlkKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMQoJPT0KCWJ6ICppZjQ4X2VuZAoKCS8vICppZjQ4X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNzIKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICBBc3NldElELmZyb21VaW50NjQodmFsdWVUb1ZlcmlmeSkuY3JlYXRvciA9PT0gY29uZmlnLmVudHJ5R2F0aW5nQWRkcmVzcywKCS8vICAgICAgICAgICAgICAgICAnc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgY3JlYXRlZCBieSBjcmVhdG9yIHRoYXQgdGhlIHZhbGlkYXRvciBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UnLAoJLy8gICAgICAgICAgICAgKQoJZnJhbWVfZGlnIC0yIC8vIHZhbHVlVG9WZXJpZnk6IHVpbnQ2NAoJYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKCXBvcAoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgODEgMzIKCT09CgoJLy8gc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgY3JlYXRlZCBieSBjcmVhdG9yIHRoYXQgdGhlIHZhbGlkYXRvciBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UKCWFzc2VydAoKKmlmNDhfZW5kOgoJLy8gKmlmNDlfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjc3CgkvLyB0eXBlID09PSBHQVRJTkdfVFlQRV9BU1NFVF9JRAoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAyCgk9PQoJYnogKmlmNDlfZW5kCgoJLy8gKmlmNDlfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3OAoJLy8gZm91bmQgPSBmYWxzZQoJaW50IDAKCWZyYW1lX2J1cnkgNCAvLyBmb3VuZDogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNzkKCS8vIGNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0cwoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMTEzIDMyCglkdXAKCWZyYW1lX2J1cnkgNSAvLyBjb3B5IG9mIHRoZSBhcnJheSB3ZSBhcmUgaXRlcmF0aW5nIG92ZXIKCWV4dHJhY3QgMCA4CglidG9pCglmcmFtZV9idXJ5IDYgLy8gYXNzZXRJZDogdWludDY0CglpbnQgMAoJZnJhbWVfYnVyeSA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCgoqZm9yT2ZfMDoKCS8vICppZjUwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI4MAoJLy8gdmFsdWVUb1ZlcmlmeSA9PT0gYXNzZXRJZAoJZnJhbWVfZGlnIC0yIC8vIHZhbHVlVG9WZXJpZnk6IHVpbnQ2NAoJZnJhbWVfZGlnIDYgLy8gYXNzZXRJZDogdWludDY0Cgk9PQoJYnogKmlmNTBfZW5kCgoJLy8gKmlmNTBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI4MQoJLy8gZm91bmQgPSB0cnVlCglpbnQgMQoJZnJhbWVfYnVyeSA0IC8vIGZvdW5kOiBib29sCgliICpmb3JPZl8wX2VuZAoKKmlmNTBfZW5kOgoKKmZvck9mXzBfY29udGludWU6CgkvLyBpbmNyZW1lbnQgb2Zmc2V0IGFuZCBsb29wIGlmIG5vdCBvdXQgb2YgYm91bmRzCglmcmFtZV9kaWcgNyAvLyB0aGUgb2Zmc2V0IHdlIGFyZSBleHRyYWN0aW5nIHRoZSBuZXh0IGVsZW1lbnQgZnJvbQoJaW50IDgKCSsKCWR1cAoJaW50IDMyIC8vIG9mZnNldCBvZiBsYXN0IGVsZW1lbnQKCTwKCWJ6ICpmb3JPZl8wX2VuZAoJZnJhbWVfYnVyeSA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCglmcmFtZV9kaWcgNSAvLyBjb3B5IG9mIHRoZSBhcnJheSB3ZSBhcmUgaXRlcmF0aW5nIG92ZXIKCWZyYW1lX2RpZyA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCglpbnQgOAoJZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSA2IC8vIGFzc2V0SWQ6IHVpbnQ2NAoJYiAqZm9yT2ZfMAoKKmZvck9mXzBfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI4NQoJLy8gYXNzZXJ0KGZvdW5kLCAnc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgaWRlbnRpY2FsIHRvIHRoZSBhc3NldCBpZCBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UnKQoJZnJhbWVfZGlnIDQgLy8gZm91bmQ6IGJvb2wKCgkvLyBzcGVjaWZpZWQgYXNzZXQgbXVzdCBiZSBpZGVudGljYWwgdG8gdGhlIGFzc2V0IGlkIGRlZmluZWQgYXMgYSByZXF1aXJlbWVudCB0byBzdGFrZQoJYXNzZXJ0CgoqaWY0OV9lbmQ6CgkvLyAqaWY1MV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyODcKCS8vIHR5cGUgPT09IEdBVElOR19UWVBFX0NSRUFURURfQllfTkZEX0FERFJFU1NFUwoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAzCgk9PQoJYnogKmlmNTFfZW5kCgoJLy8gKmlmNTFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI5MAoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIHRoaXMuaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0KGNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0c1swXSwgQXNzZXRJRC5mcm9tVWludDY0KHZhbHVlVG9WZXJpZnkpLmNyZWF0b3IpLAoJLy8gICAgICAgICAgICAgICAgICdzcGVjaWZpZWQgYXNzZXQgbXVzdCBiZSBjcmVhdGVkIGJ5IGNyZWF0b3IgdGhhdCBpcyBvbmUgb2YgdGhlIGxpbmtlZCBhZGRyZXNzZXMgaW4gYW4gbmZkJywKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCglwb3AKCWZyYW1lX2RpZyAyIC8vIGNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCglleHRyYWN0IDExMyA4CglidG9pCgljYWxsc3ViIGlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdAoKCS8vIHNwZWNpZmllZCBhc3NldCBtdXN0IGJlIGNyZWF0ZWQgYnkgY3JlYXRvciB0aGF0IGlzIG9uZSBvZiB0aGUgbGlua2VkIGFkZHJlc3NlcyBpbiBhbiBuZmQKCWFzc2VydAoKKmlmNTFfZW5kOgoJLy8gKmlmNTJfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjk1CgkvLyB0eXBlID09PSBHQVRJTkdfVFlQRV9TRUdNRU5UX09GX05GRAoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCA0Cgk9PQoJYnogKmlmNTJfZW5kCgoJLy8gKmlmNTJfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI5NwoJLy8gdXNlck9mZmVyZWRORkRBcHBJRCA9IHZhbHVlVG9WZXJpZnkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWZyYW1lX2J1cnkgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjk4CgkvLyBhc3NlcnQodGhpcy5pc05GREFwcElEVmFsaWQodXNlck9mZmVyZWRORkRBcHBJRCksICdwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZCcpCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWNhbGxzdWIgaXNORkRBcHBJRFZhbGlkCgoJLy8gcHJvdmlkZWQgTkZEIG11c3QgYmUgdmFsaWQKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMDEKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICByYXdCeXRlcyhBcHBJRC5mcm9tVWludDY0KHVzZXJPZmZlcmVkTkZEQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzKSA9PT0KCS8vICAgICAgICAgICAgICAgICAgICAgcmF3Qnl0ZXMoc3Rha2VyKSB8fCB0aGlzLmlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdCh1c2VyT2ZmZXJlZE5GREFwcElELCBzdGFrZXIpLAoJLy8gICAgICAgICAgICAgICAgICJwcm92aWRlZCBuZmQgZm9yIGVudHJ5IGlzbid0IG93bmVkIG9yIGxpbmtlZCB0byB0aGUgc3Rha2VyIiwKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyA4IC8vIHVzZXJPZmZlcmVkTkZEQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQodXNlck9mZmVyZWRORkRBcHBJRCkuZ2xvYmFsU3RhdGUoJ2kub3duZXIuYScpCglhc3NlcnQKCWZyYW1lX2RpZyAxIC8vIHN0YWtlcjogYWRkcmVzcwoJPT0KCWR1cAoJYm56ICpza2lwX29yNgoJZnJhbWVfZGlnIDEgLy8gc3Rha2VyOiBhZGRyZXNzCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWNhbGxzdWIgaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0Cgl8fAoKKnNraXBfb3I2OgoJLy8gcHJvdmlkZWQgbmZkIGZvciBlbnRyeSBpc24ndCBvd25lZCBvciBsaW5rZWQgdG8gdGhlIHN0YWtlcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMwOAoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIGJ0b2koQXBwSUQuZnJvbVVpbnQ2NCh1c2VyT2ZmZXJlZE5GREFwcElEKS5nbG9iYWxTdGF0ZSgnaS5wYXJlbnRBcHBJRCcpIGFzIGJ5dGVzKSA9PT0KCS8vICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmVudHJ5R2F0aW5nQXNzZXRzWzBdLAoJLy8gICAgICAgICAgICAgICAgICdzcGVjaWZpZWQgbmZkIG11c3QgYmUgYSBzZWdtZW50IG9mIHRoZSBuZmQgdGhlIHZhbGlkYXRvciBzcGVjaWZpZWQgYXMgYSByZXF1aXJlbWVudCcsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWJ5dGUgMHg2OTJlNzA2MTcyNjU2ZTc0NDE3MDcwNDk0NCAvLyAiaS5wYXJlbnRBcHBJRCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHVzZXJPZmZlcmVkTkZEQXBwSUQpLmdsb2JhbFN0YXRlKCdpLnBhcmVudEFwcElEJykKCWFzc2VydAoJYnRvaQoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMTEzIDgKCWJ0b2kKCT09CgoJLy8gc3BlY2lmaWVkIG5mZCBtdXN0IGJlIGEgc2VnbWVudCBvZiB0aGUgbmZkIHRoZSB2YWxpZGF0b3Igc3BlY2lmaWVkIGFzIGEgcmVxdWlyZW1lbnQKCWFzc2VydAoKKmlmNTJfZW5kOgoJcmV0c3ViCgovLyBpc05GREFwcElEVmFsaWQobmZkQXBwSUQ6IHVpbnQ2NCk6IGJvb2xlYW4KLy8KLy8gQ2hlY2tzIGlmIHRoZSBnaXZlbiBORkQgQXBwIGlkIGlzIHZhbGlkLiAgVXNpbmcgb25seSB0aGUgQXBwIGlkIHRoZXJlJ3Mgbm8gdmFsaWRhdGlvbiBhZ2FpbnN0IHRoZSBuYW1lIChpZTogdGhhdCBuZmQgWCBpcyBuYW1lIFkpCi8vIFNvIGl0J3MgYXNzdW1lZCBmb3IgdGhlIGNhbGxlciwgdGhlIGFwcCBpZCBhbG9uZSBpcyBmaW5lLiAgVGhlIG5hbWUgaXMgZmV0Y2hlZCBmcm9tIHRoZSBzcGVjaWZpZWQgYXBwIGlkIGFuZCB0aGUgdHdvCi8vIHRvZ2V0aGVyIGFyZSB1c2VkIGZvciB2YWxpZGl0eSBjaGVjayBjYWxsIHRvIHRoZSBuZmQgcmVnaXN0cnkuCi8vCi8vIEBwYXJhbSB7dWludDY0fSBuZmRBcHBJRCAtIFRoZSBORkQgQXBwIGlkIHRvIHZlcmlmeS4KLy8KLy8gQHJldHVybnMge2Jvb2xlYW59IC0gUmV0dXJucyB0cnVlIGlmIHRoZSBORkQgQXBwIGlkIGlzIHZhbGlkLCBvdGhlcndpc2UgZmFsc2UuCmlzTkZEQXBwSURWYWxpZDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMyNwoJLy8gdXNlck9mZmVyZWRORkROYW1lID0gQXBwSUQuZnJvbVVpbnQ2NChuZmRBcHBJRCkuZ2xvYmFsU3RhdGUoJ2kubmFtZScpIGFzIHN0cmluZwoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWJ5dGUgMHg2OTJlNmU2MTZkNjUgLy8gImkubmFtZSIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KG5mZEFwcElEKS5nbG9iYWxTdGF0ZSgnaS5uYW1lJykKCWFzc2VydAoJZnJhbWVfYnVyeSAwIC8vIHVzZXJPZmZlcmVkTkZETmFtZTogc3RyaW5nCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMyOQoJLy8gcmV0dXJuIHNlbmRNZXRob2RDYWxsPFtzdHJpbmcsIHVpbnQ2NF0sIGJvb2xlYW4+KHsKCS8vICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQodGhpcy5uZmRSZWdpc3RyeUFwcElkKSwKCS8vICAgICAgICAgICAgIG5hbWU6ICdpc1ZhbGlkTmZkQXBwSWQnLAoJLy8gICAgICAgICAgICAgbWV0aG9kQXJnczogW3VzZXJPZmZlcmVkTkZETmFtZSwgbmZkQXBwSURdLAoJLy8gICAgICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAiaXNWYWxpZE5mZEFwcElkKHN0cmluZyx1aW50NjQpYm9vbCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMzMAoJLy8gYXBwbGljYXRpb25JRDogQXBwSUQuZnJvbVVpbnQ2NCh0aGlzLm5mZFJlZ2lzdHJ5QXBwSWQpCglsb2FkIDIwMCAvLyBUTVBMX25mZFJlZ2lzdHJ5QXBwSWQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMzIKCS8vIG1ldGhvZEFyZ3M6IFt1c2VyT2ZmZXJlZE5GRE5hbWUsIG5mZEFwcElEXQoJZnJhbWVfZGlnIDAgLy8gdXNlck9mZmVyZWRORkROYW1lOiBzdHJpbmcKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoJaXR4biBOdW1Mb2dzCglpbnQgMQoJLQoJaXR4bmFzIExvZ3MKCWV4dHJhY3QgNCAwCglpbnQgMAoJZ2V0Yml0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCglyZXRzdWIKCi8vIGlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdChuZmRBcHBJRDogdWludDY0LCBhZGRyVG9GaW5kOiBBZGRyZXNzKTogYm9vbGVhbgovLwovLyBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBhZGRyZXNzIGlzIHByZXNlbnQgaW4gYW4gTkZEcyBsaXN0IG9mIHZlcmlmaWVkIGFkZHJlc3Nlcy4KLy8gVGhlIE5GRCBpcyBhc3N1bWVkIHRvIGhhdmUgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcyBvZmZpY2lhbC4KLy8KLy8gQHBhcmFtIHt1aW50NjR9IG5mZEFwcElEIC0gVGhlIE5GRCBhcHBsaWNhdGlvbiBpZC4KLy8gQHBhcmFtIHtBZGRyZXNzfSBhZGRyVG9GaW5kIC0gVGhlIGFkZHJlc3MgdG8gZmluZCBpbiB0aGUgdi5jYUFsZ28uMC5hcyBwcm9wZXJ0eQovLyBAcmV0dXJuIHtib29sZWFufSAtIGB0cnVlYCBpZiB0aGUgYWRkcmVzcyBpcyBwcmVzZW50LCBgZmFsc2VgIG90aGVyd2lzZS4KaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0OgoJcHJvdG8gMiAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDUKCS8vIHNlbmRBcHBDYWxsKHsKCS8vICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLAoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25BcmdzOiBbJ3JlYWRfcHJvcGVydHknLCAndi5jYUFsZ28uMC5hcyddLAoJLy8gICAgICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzQ2CgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KG5mZEFwcElEKQoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDcKCS8vIGFwcGxpY2F0aW9uQXJnczogWydyZWFkX3Byb3BlcnR5JywgJ3YuY2FBbGdvLjAuYXMnXQoJYnl0ZSAweDcyNjU2MTY0NWY3MDcyNmY3MDY1NzI3NDc5IC8vICJyZWFkX3Byb3BlcnR5IgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWJ5dGUgMHg3NjJlNjM2MTQxNmM2NzZmMmUzMDJlNjE3MyAvLyAidi5jYUFsZ28uMC5hcyIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDkKCS8vIGNhQWxnb0RhdGEgPSB0aGlzLml0eG4ubGFzdExvZwoJaXR4biBMYXN0TG9nCglmcmFtZV9idXJ5IDAgLy8gY2FBbGdvRGF0YTogYnl0ZVtdCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM1MAoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBjYUFsZ29EYXRhLmxlbmd0aDsgaSArPSAzMikKCWludCAwCglmcmFtZV9idXJ5IDEgLy8gaTogdWludDY0CgoqZm9yXzEwOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM1MAoJLy8gaSA8IGNhQWxnb0RhdGEubGVuZ3RoCglmcmFtZV9kaWcgMSAvLyBpOiB1aW50NjQKCWZyYW1lX2RpZyAwIC8vIGNhQWxnb0RhdGE6IGJ5dGVbXQoJbGVuCgk8CglieiAqZm9yXzEwX2VuZAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNTEKCS8vIGFkZHIgPSBleHRyYWN0MyhjYUFsZ29EYXRhLCBpLCAzMikKCWZyYW1lX2RpZyAwIC8vIGNhQWxnb0RhdGE6IGJ5dGVbXQoJZnJhbWVfZGlnIDEgLy8gaTogdWludDY0CglpbnQgMzIKCWV4dHJhY3QzCglmcmFtZV9idXJ5IDIgLy8gYWRkcjogYnl0ZVtdCgoJLy8gKmlmNTNfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzUyCgkvLyBhZGRyICE9PSByYXdCeXRlcyhnbG9iYWxzLnplcm9BZGRyZXNzKSAmJiBhZGRyID09PSByYXdCeXRlcyhhZGRyVG9GaW5kKQoJZnJhbWVfZGlnIDIgLy8gYWRkcjogYnl0ZVtdCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CglkdXAKCWJ6ICpza2lwX2FuZDExCglmcmFtZV9kaWcgMiAvLyBhZGRyOiBieXRlW10KCWZyYW1lX2RpZyAtMiAvLyBhZGRyVG9GaW5kOiBBZGRyZXNzCgk9PQoJJiYKCipza2lwX2FuZDExOgoJYnogKmlmNTNfZW5kCgoJLy8gKmlmNTNfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM1MwoJLy8gcmV0dXJuIHRydWUKCWludCAxCgliICppc0FkZHJlc3NJbk5GRENBQWxnb0xpc3QqcmV0dXJuCgoqaWY1M19lbmQ6CgoqZm9yXzEwX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM1MAoJLy8gaSArPSAzMgoJZnJhbWVfZGlnIDEgLy8gaTogdWludDY0CglpbnQgMzIKCSsKCWZyYW1lX2J1cnkgMSAvLyBpOiB1aW50NjQKCWIgKmZvcl8xMAoKKmZvcl8xMF9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzU2CgkvLyByZXR1cm4gZmFsc2UKCWludCAwCgoqaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0KnJldHVybjoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDIKCXJldHN1YgoKLy8gYWxnb1NhdHVyYXRpb25MZXZlbCgpOiB1aW50NjQKLy8KLy8gUmV0dXJucyB0aGUgbWF4aW11bSBhbGxvd2VkIHN0YWtlIHBlciB2YWxpZGF0b3IgYmFzZWQgb24gYSBwZXJjZW50YWdlIG9mIGFsbCBjdXJyZW50IG9ubGluZSBzdGFrZSBiZWZvcmUKLy8gdGhlIHZhbGlkYXRvciBpcyBjb25zaWRlcmVkIHNhdHVyYXRlZCAtIHdoZXJlIHJld2FyZHMgYXJlIGRpbWluaXNoZWQuCi8vIE5PVEU6IHRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCB0d2ljZSAtIGhlcmUgYW5kIGluIHN0YWtpbmcgcG9vbCBjb250cmFjdC4gIEJvdGggbXVzdCBiZSBpZGVudGljYWwuCmFsZ29TYXR1cmF0aW9uTGV2ZWw6Cglwcm90byAwIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNjUKCS8vIG9ubGluZSA9IHRoaXMuZ2V0Q3VycmVudE9ubGluZVN0YWtlKCkKCWNhbGxzdWIgZ2V0Q3VycmVudE9ubGluZVN0YWtlCglmcmFtZV9idXJ5IDAgLy8gb25saW5lOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzY3CgkvLyByZXR1cm4gd2lkZVJhdGlvKFtvbmxpbmUsIE1BWF9WQUxJREFUT1JfU09GVF9QQ1RfT0ZfT05MSU5FXzFERUNJTUFMXSwgWzEwMDBdKQoJZnJhbWVfZGlnIDAgLy8gb25saW5lOiB1aW50NjQKCWludCAxMDAKCW11bHcKCWludCAwCglpbnQgMTAwMAoJZGl2bW9kdwoJcG9wCglwb3AKCXN3YXAKCSEKCgkvLyB3aWRlUmF0aW8gZmFpbGVkCglhc3NlcnQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gbWF4QWxsb3dlZFN0YWtlKCk6IHVpbnQ2NAovLwovLyBSZXR1cm5zIHRoZSBNQVhJTVVNIGFsbG93ZWQgc3Rha2UgcGVyIHZhbGlkYXRvciBiYXNlZCBvbiBhIHBlcmNlbnRhZ2Ugb2YgYWxsIGN1cnJlbnQgb25saW5lIHN0YWtlLgovLyBBZGRpbmcgc3Rha2UgaXMgY29tcGxldGVseSBibG9ja2VkIGF0IHRoaXMgYW1vdW50LgptYXhBbGxvd2VkU3Rha2U6Cglwcm90byAwIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNzUKCS8vIG9ubGluZSA9IHRoaXMuZ2V0Q3VycmVudE9ubGluZVN0YWtlKCkKCWNhbGxzdWIgZ2V0Q3VycmVudE9ubGluZVN0YWtlCglmcmFtZV9idXJ5IDAgLy8gb25saW5lOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzc3CgkvLyByZXR1cm4gd2lkZVJhdGlvKFtvbmxpbmUsIE1BWF9WQUxJREFUT1JfSEFSRF9QQ1RfT0ZfT05MSU5FXzFERUNJTUFMXSwgWzEwMDBdKQoJZnJhbWVfZGlnIDAgLy8gb25saW5lOiB1aW50NjQKCWludCAxNTAKCW11bHcKCWludCAwCglpbnQgMTAwMAoJZGl2bW9kdwoJcG9wCglwb3AKCXN3YXAKCSEKCgkvLyB3aWRlUmF0aW8gZmFpbGVkCglhc3NlcnQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gbWF4QWxnb0FsbG93ZWRQZXJQb29sKCk6IHVpbnQ2NAovLwovLyBSZXR1cm5zIHRoZSBNQVhJTVVNIGFsbG93ZWQgc3Rha2UgcGVyIHBvb2wgYW5kIHN0aWxsIHJlY2VpdmUgaW5jZW50aXZlcyAtIHdlJ2xsIHRyZWF0IHRoaXMgYXMgdGhlICdtYXggcGVyIHBvb2wnCm1heEFsZ29BbGxvd2VkUGVyUG9vbDoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzODQKCS8vIHJldHVybiBnbG9iYWxzLnBheW91dHNNYXhCYWxhbmNlCglnbG9iYWwgUGF5b3V0c01heEJhbGFuY2UKCXJldHN1YgoKLy8gZ2V0Q3VycmVudE9ubGluZVN0YWtlKCk6IHVpbnQ2NApnZXRDdXJyZW50T25saW5lU3Rha2U6Cglwcm90byAwIDEKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzg4CgkvLyByZXR1cm4gb25saW5lU3Rha2UoKQoJb25saW5lX3N0YWtlCglyZXRzdWIKCi8vIG1pbkJhbGFuY2VGb3JBY2NvdW50KGNvbnRyYWN0czogdWludDY0LCBleHRyYVBhZ2VzOiB1aW50NjQsIGFzc2V0czogdWludDY0LCBsb2NhbEludHM6IHVpbnQ2NCwgbG9jYWxCeXRlczogdWludDY0LCBnbG9iYWxJbnRzOiB1aW50NjQsIGdsb2JhbEJ5dGVzOiB1aW50NjQpOiB1aW50NjQKbWluQmFsYW5jZUZvckFjY291bnQ6Cglwcm90byA3IDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDAKCS8vIG1pbkJhbCA9IEFMR09SQU5EX0FDQ09VTlRfTUlOX0JBTEFOQ0UKCWludCAxMDAwMDAKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDEKCS8vIG1pbkJhbCArPSBjb250cmFjdHMgKiBBUFBMSUNBVElPTl9CQVNFX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyBjb250cmFjdHM6IHVpbnQ2NAoJaW50IDEwMDAwMAoJKgoJKwoJZnJhbWVfYnVyeSAwIC8vIG1pbkJhbDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTQwMgoJLy8gbWluQmFsICs9IGV4dHJhUGFnZXMgKiBBUFBMSUNBVElPTl9CQVNFX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyBleHRyYVBhZ2VzOiB1aW50NjQKCWludCAxMDAwMDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDMKCS8vIG1pbkJhbCArPSBhc3NldHMgKiBBU1NFVF9IT0xESU5HX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMyAvLyBhc3NldHM6IHVpbnQ2NAoJaW50IDEwMDAwMAoJKgoJKwoJZnJhbWVfYnVyeSAwIC8vIG1pbkJhbDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTQwNAoJLy8gbWluQmFsICs9IGxvY2FsSW50cyAqIFNTQ19WQUxVRV9VSU5UCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoJZnJhbWVfZGlnIC00IC8vIGxvY2FsSW50czogdWludDY0CglpbnQgMjg1MDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDUKCS8vIG1pbkJhbCArPSBnbG9iYWxJbnRzICogU1NDX1ZBTFVFX1VJTlQKCWZyYW1lX2RpZyAwIC8vIG1pbkJhbDogdWludDY0CglmcmFtZV9kaWcgLTYgLy8gZ2xvYmFsSW50czogdWludDY0CglpbnQgMjg1MDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDYKCS8vIG1pbkJhbCArPSBsb2NhbEJ5dGVzICogU1NDX1ZBTFVFX0JZVEVTCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoJZnJhbWVfZGlnIC01IC8vIGxvY2FsQnl0ZXM6IHVpbnQ2NAoJaW50IDUwMDAwCgkqCgkrCglmcmFtZV9idXJ5IDAgLy8gbWluQmFsOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDA3CgkvLyBtaW5CYWwgKz0gZ2xvYmFsQnl0ZXMgKiBTU0NfVkFMVUVfQllURVMKCWZyYW1lX2RpZyAwIC8vIG1pbkJhbDogdWludDY0CglmcmFtZV9kaWcgLTcgLy8gZ2xvYmFsQnl0ZXM6IHVpbnQ2NAoJaW50IDUwMDAwCgkqCgkrCglmcmFtZV9idXJ5IDAgLy8gbWluQmFsOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDA4CgkvLyByZXR1cm4gbWluQmFsCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoJcmV0c3ViCgovLyBjb3N0Rm9yQm94U3RvcmFnZSh0b3RhbE51bUJ5dGVzOiB1aW50NjQpOiB1aW50NjQKY29zdEZvckJveFN0b3JhZ2U6Cglwcm90byAxIDEKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDE1CgkvLyByZXR1cm4gU0NCT1hfUEVSQk9YICsgdG90YWxOdW1CeXRlcyAqIFNDQk9YX1BFUkJZVEUKCWludCAyNTAwCglmcmFtZV9kaWcgLTEgLy8gdG90YWxOdW1CeXRlczogdWludDY0CglpbnQgNDAwCgkqCgkrCglyZXRzdWIKCipjcmVhdGVfTm9PcDoKCW1ldGhvZCAiY3JlYXRlQXBwbGljYXRpb24oKXZvaWQiCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAwCgltYXRjaCAqYWJpX3JvdXRlX2NyZWF0ZUFwcGxpY2F0aW9uCgoJLy8gdGhpcyBjb250cmFjdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGdpdmVuIEFCSSBtZXRob2QgZm9yIGNyZWF0ZSBOb09wCgllcnIKCipjYWxsX05vT3A6CgltZXRob2QgImluaXRTdGFraW5nQ29udHJhY3QodWludDY0KXZvaWQiCgltZXRob2QgImxvYWRTdGFraW5nQ29udHJhY3REYXRhKHVpbnQ2NCxieXRlW10pdm9pZCIKCW1ldGhvZCAiZmluYWxpemVTdGFraW5nQ29udHJhY3QoKXZvaWQiCgltZXRob2QgImdhcygpdm9pZCIKCW1ldGhvZCAiZ2V0TWJyQW1vdW50cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCgltZXRob2QgImdldFByb3RvY29sQ29uc3RyYWludHMoKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiZ2V0TnVtVmFsaWRhdG9ycygpdWludDY0IgoJbWV0aG9kICJnZXRWYWxpZGF0b3JDb25maWcodWludDY0KSh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiZ2V0VmFsaWRhdG9yU3RhdGUodWludDY0KSh1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQpIgoJbWV0aG9kICJnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpIgoJbWV0aG9kICJnZXRQb29scyh1aW50NjQpKHVpbnQ2NCx1aW50MTYsdWludDY0KVtdIgoJbWV0aG9kICJnZXRQb29sQXBwSWQodWludDY0LHVpbnQ2NCl1aW50NjQiCgltZXRob2QgImdldFBvb2xJbmZvKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpKHVpbnQ2NCx1aW50MTYsdWludDY0KSIKCW1ldGhvZCAiZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHVpbnQ2NCl1aW50NjQiCgltZXRob2QgImRvZXNTdGFrZXJOZWVkVG9QYXlNQlIoYWRkcmVzcylib29sIgoJbWV0aG9kICJnZXRTdGFrZWRQb29sc0ZvckFjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCx1aW50NjQpW10iCgltZXRob2QgImdldFRva2VuUGF5b3V0UmF0aW8odWludDY0KSh1aW50NjRbMjRdLHVpbnQ2NCkiCgltZXRob2QgImdldE5vZGVQb29sQXNzaWdubWVudHModWludDY0KSgodWludDY0WzNdKVs4XSkiCgltZXRob2QgImdldE5GRFJlZ2lzdHJ5SUQoKXVpbnQ2NCIKCW1ldGhvZCAiYWRkVmFsaWRhdG9yKHBheSxzdHJpbmcsKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIKCW1ldGhvZCAiY2hhbmdlVmFsaWRhdG9yTWFuYWdlcih1aW50NjQsYWRkcmVzcyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQiCgltZXRob2QgImNoYW5nZVZhbGlkYXRvck5GRCh1aW50NjQsdWludDY0LHN0cmluZyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyh1aW50NjQsYWRkcmVzcyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JSZXdhcmRJbmZvKHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0KXZvaWQiCgltZXRob2QgImFkZFBvb2wocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAic2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KSIKCW1ldGhvZCAic3Rha2VVcGRhdGVkVmlhUmV3YXJkcygodWludDY0LHVpbnQ2NCx1aW50NjQpLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIgoJbWV0aG9kICJzdGFrZVJlbW92ZWQoKHVpbnQ2NCx1aW50NjQsdWludDY0KSxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCl2b2lkIgoJbWV0aG9kICJmaW5kUG9vbEZvclN0YWtlcih1aW50NjQsYWRkcmVzcyx1aW50NjQpKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKSIKCW1ldGhvZCAibW92ZVBvb2xUb05vZGUodWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIKCW1ldGhvZCAiZW1wdHlUb2tlblJld2FyZHModWludDY0LGFkZHJlc3MpdWludDY0IgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggKmFiaV9yb3V0ZV9pbml0U3Rha2luZ0NvbnRyYWN0ICphYmlfcm91dGVfbG9hZFN0YWtpbmdDb250cmFjdERhdGEgKmFiaV9yb3V0ZV9maW5hbGl6ZVN0YWtpbmdDb250cmFjdCAqYWJpX3JvdXRlX2dhcyAqYWJpX3JvdXRlX2dldE1ickFtb3VudHMgKmFiaV9yb3V0ZV9nZXRQcm90b2NvbENvbnN0cmFpbnRzICphYmlfcm91dGVfZ2V0TnVtVmFsaWRhdG9ycyAqYWJpX3JvdXRlX2dldFZhbGlkYXRvckNvbmZpZyAqYWJpX3JvdXRlX2dldFZhbGlkYXRvclN0YXRlICphYmlfcm91dGVfZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyICphYmlfcm91dGVfZ2V0UG9vbHMgKmFiaV9yb3V0ZV9nZXRQb29sQXBwSWQgKmFiaV9yb3V0ZV9nZXRQb29sSW5mbyAqYWJpX3JvdXRlX2dldEN1ck1heFN0YWtlUGVyUG9vbCAqYWJpX3JvdXRlX2RvZXNTdGFrZXJOZWVkVG9QYXlNQlIgKmFiaV9yb3V0ZV9nZXRTdGFrZWRQb29sc0ZvckFjY291bnQgKmFiaV9yb3V0ZV9nZXRUb2tlblBheW91dFJhdGlvICphYmlfcm91dGVfZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cyAqYWJpX3JvdXRlX2dldE5GRFJlZ2lzdHJ5SUQgKmFiaV9yb3V0ZV9hZGRWYWxpZGF0b3IgKmFiaV9yb3V0ZV9jaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyICphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyAqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvck5GRCAqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzICphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mbyAqYWJpX3JvdXRlX2FkZFBvb2wgKmFiaV9yb3V0ZV9hZGRTdGFrZSAqYWJpX3JvdXRlX3NldFRva2VuUGF5b3V0UmF0aW8gKmFiaV9yb3V0ZV9zdGFrZVVwZGF0ZWRWaWFSZXdhcmRzICphYmlfcm91dGVfc3Rha2VSZW1vdmVkICphYmlfcm91dGVfZmluZFBvb2xGb3JTdGFrZXIgKmFiaV9yb3V0ZV9tb3ZlUG9vbFRvTm9kZSAqYWJpX3JvdXRlX2VtcHR5VG9rZW5SZXdhcmRzCgoJLy8gdGhpcyBjb250cmFjdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGdpdmVuIEFCSSBtZXRob2QgZm9yIGNhbGwgTm9PcAoJZXJy", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEx" }, "contract": { @@ -323,6 +323,7 @@ export const APP_SPEC: AppSpec = { { "name": "getNumValidators", "desc": "Returns the current number of validators", + "readonly": true, "args": [], "returns": { "type": "uint64" @@ -330,6 +331,7 @@ export const APP_SPEC: AppSpec = { }, { "name": "getValidatorConfig", + "readonly": true, "args": [ { "name": "validatorId", @@ -342,6 +344,7 @@ export const APP_SPEC: AppSpec = { }, { "name": "getValidatorState", + "readonly": true, "args": [ { "name": "validatorId", @@ -354,6 +357,7 @@ export const APP_SPEC: AppSpec = { }, { "name": "getValidatorOwnerAndManager", + "readonly": true, "args": [ { "name": "validatorId", @@ -367,6 +371,7 @@ export const APP_SPEC: AppSpec = { { "name": "getPools", "desc": "Return list of all pools for this validator.", + "readonly": true, "args": [ { "name": "validatorId", @@ -380,6 +385,8 @@ export const APP_SPEC: AppSpec = { }, { "name": "getPoolAppId", + "desc": "getPoolAppId is useful for callers to determine app to call for removing stake if they don't have staking or\nwant to get staker list for an account. The staking pool also uses it to get the app id of staking pool 1\n(which contains reward tokens if being used) so that the amount available can be determined.", + "readonly": true, "args": [ { "name": "validatorId", @@ -396,6 +403,7 @@ export const APP_SPEC: AppSpec = { }, { "name": "getPoolInfo", + "readonly": true, "args": [ { "name": "poolKey", @@ -409,6 +417,7 @@ export const APP_SPEC: AppSpec = { { "name": "getCurMaxStakePerPool", "desc": "Calculate the maximum stake per pool for a given validator.\nNormally this would be maxAlgoPerPool, but it should also never go above MaxAllowedStake / numPools so\nas pools are added the max allowed per pool can reduce.", + "readonly": true, "args": [ { "name": "validatorId", @@ -423,6 +432,7 @@ export const APP_SPEC: AppSpec = { { "name": "doesStakerNeedToPayMBR", "desc": "Helper callers can call w/ simulate to determine if 'AddStaker' MBR should be included w/ staking amount", + "readonly": true, "args": [ { "name": "staker", @@ -436,6 +446,7 @@ export const APP_SPEC: AppSpec = { { "name": "getStakedPoolsForAccount", "desc": "Retrieves the staked pools for an account.", + "readonly": true, "args": [ { "name": "staker", @@ -450,6 +461,7 @@ export const APP_SPEC: AppSpec = { { "name": "getTokenPayoutRatio", "desc": "Retrieves the token payout ratio for a given validator - returning the pool ratios of whole so that token\npayouts across pools can be based on a stable snaphost of stake.", + "readonly": true, "args": [ { "name": "validatorId", @@ -463,6 +475,7 @@ export const APP_SPEC: AppSpec = { }, { "name": "getNodePoolAssignments", + "readonly": true, "args": [ { "name": "validatorId", @@ -475,6 +488,7 @@ export const APP_SPEC: AppSpec = { }, { "name": "getNFDRegistryID", + "readonly": true, "args": [], "returns": { "type": "uint64" @@ -896,6 +910,7 @@ export const APP_SPEC: AppSpec = { { "name": "findPoolForStaker", "desc": "Finds the pool for a staker based on the provided validator id, staker address, and amount to stake.\nFirst checks the stakers 'already staked list' for the validator preferring those (adding if possible) then adds\nto new pool if necessary.", + "readonly": true, "args": [ { "name": "validatorId", @@ -1817,6 +1832,10 @@ export abstract class ValidatorRegistryCallFactory { } /** * Constructs a no op call for the getPoolAppId(uint64,uint64)uint64 ABI method + * + * getPoolAppId is useful for callers to determine app to call for removing stake if they don't have staking or +want to get staker list for an account. The staking pool also uses it to get the app id of staking pool 1 +(which contains reward tokens if being used) so that the amount available can be determined. * * @param args Any args for the contract call * @param params Any additional parameters for the call @@ -2435,6 +2454,10 @@ export class ValidatorRegistryClient { /** * Calls the getPoolAppId(uint64,uint64)uint64 ABI method. + * + * getPoolAppId is useful for callers to determine app to call for removing stake if they don't have staking or +want to get staker list for an account. The staking pool also uses it to get the app id of staking pool 1 +(which contains reward tokens if being used) so that the amount available can be determined. * * @param args The arguments for the contract call * @param params Any additional parameters for the call @@ -3136,6 +3159,10 @@ export type ValidatorRegistryComposer = { /** * Calls the getPoolAppId(uint64,uint64)uint64 ABI method. + * + * getPoolAppId is useful for callers to determine app to call for removing stake if they don't have staking or +want to get staker list for an account. The staking pool also uses it to get the app id of staking pool 1 +(which contains reward tokens if being used) so that the amount available can be determined. * * @param args The arguments for the contract call * @param params Any additional parameters for the call diff --git a/contracts/contracts/stakingPool.algo.ts b/contracts/contracts/stakingPool.algo.ts index 3b7224cb..8e3ba757 100644 --- a/contracts/contracts/stakingPool.algo.ts +++ b/contracts/contracts/stakingPool.algo.ts @@ -447,7 +447,7 @@ export class StakingPool extends Contract { * @returns {StakedInfo} - The staked information for the given staker. * @throws {Error} - If the staker's account is not found. */ - // @abi.readonly + @abi.readonly getStakerInfo(staker: Address): StakedInfo { for (let i = 0; i < this.stakers.value.length; i += 1) { if (globals.opcodeBudget < 200) { diff --git a/contracts/contracts/validatorRegistry.algo.ts b/contracts/contracts/validatorRegistry.algo.ts index b715c5b8..b023541e 100644 --- a/contracts/contracts/validatorRegistry.algo.ts +++ b/contracts/contracts/validatorRegistry.algo.ts @@ -162,22 +162,22 @@ export class ValidatorRegistry extends Contract { /** * Returns the current number of validators */ - // @abi.readonly + @abi.readonly getNumValidators(): uint64 { return this.numValidators.value } - // @abi.readonly + @abi.readonly getValidatorConfig(validatorId: ValidatorIdType): ValidatorConfig { return this.validatorList(validatorId).value.config } - // @abi.readonly + @abi.readonly getValidatorState(validatorId: ValidatorIdType): ValidatorCurState { return this.validatorList(validatorId).value.state } - // @abi.readonly + @abi.readonly getValidatorOwnerAndManager(validatorId: ValidatorIdType): [Address, Address] { return [ this.validatorList(validatorId).value.config.owner, @@ -185,13 +185,13 @@ export class ValidatorRegistry extends Contract { ] } - // @abi.readonly /** * Return list of all pools for this validator. * @param {uint64} validatorId * @return {PoolInfo[]} - array of pools * Not callable from other contracts because >1K return but can be called w/ simulate which bumps log returns */ + @abi.readonly getPools(validatorId: ValidatorIdType): PoolInfo[] { const retData: PoolInfo[] = [] const poolSet = clone(this.validatorList(validatorId).value.pools) @@ -205,10 +205,12 @@ export class ValidatorRegistry extends Contract { return retData } - // @abi.readonly - // getPoolAppId is useful for callers to determine app to call for removing stake if they don't have staking or - // want to get staker list for an account. The staking pool also uses it to get the app id of staking pool 1 - // (which contains reward tokens if being used) so that the amount available can be determined. + /** + * getPoolAppId is useful for callers to determine app to call for removing stake if they don't have staking or + * want to get staker list for an account. The staking pool also uses it to get the app id of staking pool 1 + * (which contains reward tokens if being used) so that the amount available can be determined. + */ + @abi.readonly getPoolAppId(validatorId: uint64, poolId: uint64): uint64 { assert( poolId !== 0 && poolId <= this.validatorList(validatorId).value.pools.length, @@ -217,7 +219,7 @@ export class ValidatorRegistry extends Contract { return this.validatorList(validatorId).value.pools[poolId - 1].poolAppId } - // @abi.readonly + @abi.readonly getPoolInfo(poolKey: ValidatorPoolKey): PoolInfo { return this.validatorList(poolKey.id).value.pools[poolKey.poolId - 1] } @@ -229,6 +231,7 @@ export class ValidatorRegistry extends Contract { * * @param {ValidatorIdType} validatorId - The id of the validator. */ + @abi.readonly getCurMaxStakePerPool(validatorId: ValidatorIdType): uint64 { const numPools = this.validatorList(validatorId).value.state.numPools as uint64 const hardMaxDividedBetweenPools = this.maxAllowedStake() / numPools @@ -242,11 +245,11 @@ export class ValidatorRegistry extends Contract { return maxPerPool } - // @abi.readonly /** * Helper callers can call w/ simulate to determine if 'AddStaker' MBR should be included w/ staking amount * @param staker */ + @abi.readonly doesStakerNeedToPayMBR(staker: Address): boolean { return !this.stakerPoolSet(staker).exists } @@ -257,6 +260,7 @@ export class ValidatorRegistry extends Contract { * @param {Address} staker - The account to retrieve staked pools for. * @return {ValidatorPoolKey[]} - The array of staked pools for the account. */ + @abi.readonly getStakedPoolsForAccount(staker: Address): ValidatorPoolKey[] { if (!this.stakerPoolSet(staker).exists) { return [] @@ -271,7 +275,6 @@ export class ValidatorRegistry extends Contract { return retData } - // @abi.readonly /** * Retrieves the token payout ratio for a given validator - returning the pool ratios of whole so that token * payouts across pools can be based on a stable snaphost of stake. @@ -279,17 +282,19 @@ export class ValidatorRegistry extends Contract { * @param {ValidatorIdType} validatorId - The id of the validator. * @return {PoolTokenPayoutRatio} - The token payout ratio for the validator. */ + @abi.readonly getTokenPayoutRatio(validatorId: ValidatorIdType): PoolTokenPayoutRatio { return this.validatorList(validatorId).value.tokenPayoutRatio } - // @abi.readonly + @abi.readonly getNodePoolAssignments(validatorId: uint64): NodePoolAssignmentConfig { assert(this.validatorList(validatorId).exists, "the specified validator id doesn't exist") return this.validatorList(validatorId).value.nodePoolAssignments } + @abi.readonly getNFDRegistryID(): uint64 { return this.nfdRegistryAppId } @@ -786,6 +791,7 @@ export class ValidatorRegistry extends Contract { * @returns {ValidatorPoolKey, boolean, boolean} - The pool for the staker, true/false on whether the staker is 'new' * to this VALIDATOR, and true/false if staker is new to the protocol. */ + @abi.readonly findPoolForStaker( validatorId: ValidatorIdType, staker: Address, diff --git a/nodemgr/internal/lib/reti/artifacts/contracts/StakingPool.arc32.json b/nodemgr/internal/lib/reti/artifacts/contracts/StakingPool.arc32.json index 11ea9c56..77efe2d4 100644 --- a/nodemgr/internal/lib/reti/artifacts/contracts/StakingPool.arc32.json +++ b/nodemgr/internal/lib/reti/artifacts/contracts/StakingPool.arc32.json @@ -264,6 +264,7 @@ { "name": "getStakerInfo", "desc": "Retrieves the staked information for a given staker.", + "readonly": true, "args": [ { "name": "staker", diff --git a/nodemgr/internal/lib/reti/artifacts/contracts/ValidatorRegistry.arc32.json b/nodemgr/internal/lib/reti/artifacts/contracts/ValidatorRegistry.arc32.json index 479210cd..3ee4523d 100644 --- a/nodemgr/internal/lib/reti/artifacts/contracts/ValidatorRegistry.arc32.json +++ b/nodemgr/internal/lib/reti/artifacts/contracts/ValidatorRegistry.arc32.json @@ -216,7 +216,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCgovLyBUaGlzIFRFQUwgd2FzIGdlbmVyYXRlZCBieSBURUFMU2NyaXB0IHYwLjEwMy4wCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbGdvcmFuZGZvdW5kYXRpb24vVEVBTFNjcmlwdAoKLy8gVGhpcyBjb250cmFjdCBpcyBjb21wbGlhbnQgd2l0aCBhbmQvb3IgaW1wbGVtZW50cyB0aGUgZm9sbG93aW5nIEFSQ3M6IFsgQVJDNCBdCgovLyBUaGUgZm9sbG93aW5nIGxpbmVzIG9mIFRFQUwgYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0ZW1wbGF0ZSB2YXJpYWJsZXMgaW4gc2NyYXRjaCBzbG90cwpwdXNoYnl0ZXMgVE1QTF9uZmRSZWdpc3RyeUFwcElkCmJ0b2kKc3RvcmUgMjAwCgovLyBUaGUgZm9sbG93aW5nIHRlbiBsaW5lcyBvZiBURUFMIGhhbmRsZSBpbml0aWFsIHByb2dyYW0gZmxvdwovLyBUaGlzIHBhdHRlcm4gaXMgdXNlZCB0byBtYWtlIGl0IGVhc3kgZm9yIGFueW9uZSB0byBwYXJzZSB0aGUgc3RhcnQgb2YgdGhlIHByb2dyYW0gYW5kIGRldGVybWluZSBpZiBhIHNwZWNpZmljIGFjdGlvbiBpcyBhbGxvd2VkCi8vIEhlcmUsIGFjdGlvbiByZWZlcnMgdG8gdGhlIE9uQ29tcGxldGUgaW4gY29tYmluYXRpb24gd2l0aCB3aGV0aGVyIHRoZSBhcHAgaXMgYmVpbmcgY3JlYXRlZCBvciBjYWxsZWQKLy8gRXZlcnkgcG9zc2libGUgYWN0aW9uIGZvciB0aGlzIGNvbnRyYWN0IGlzIHJlcHJlc2VudGVkIGluIHRoZSBzd2l0Y2ggc3RhdGVtZW50Ci8vIElmIHRoZSBhY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIGluIHRoZSBjb250cmFjdCwgaXRzIHJlc3BlY3RpdmUgYnJhbmNoIHdpbGwgYmUgIipOT1RfSU1QTEVNRU5URUQiIHdoaWNoIGp1c3QgY29udGFpbnMgImVyciIKdHhuIEFwcGxpY2F0aW9uSUQKIQppbnQgNgoqCnR4biBPbkNvbXBsZXRpb24KKwpzd2l0Y2ggKmNhbGxfTm9PcCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKmNyZWF0ZV9Ob09wICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRAoKKk5PVF9JTVBMRU1FTlRFRDoKCS8vIFRoZSByZXF1ZXN0ZWQgYWN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIGNvbnRyYWN0LiBBcmUgeW91IHVzaW5nIHRoZSBjb3JyZWN0IE9uQ29tcGxldGU/IERpZCB5b3Ugc2V0IHlvdXIgYXBwIElEPwoJZXJyCgovLyBjcmVhdGVBcHBsaWNhdGlvbigpdm9pZAoqYWJpX3JvdXRlX2NyZWF0ZUFwcGxpY2F0aW9uOgoJLy8gZXhlY3V0ZSBjcmVhdGVBcHBsaWNhdGlvbigpdm9pZAoJY2FsbHN1YiBjcmVhdGVBcHBsaWNhdGlvbgoJaW50IDEKCXJldHVybgoKLy8gY3JlYXRlQXBwbGljYXRpb24oKTogdm9pZApjcmVhdGVBcHBsaWNhdGlvbjoKCXByb3RvIDAgMAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyCgkvLyB0aGlzLnN0YWtpbmdQb29sSW5pdGlhbGl6ZWQudmFsdWUgPSBmYWxzZQoJYnl0ZSAweDY5NmU2OTc0IC8vICJpbml0IgoJaW50IDAKCWJ5dGUgMHgwMAoJaW50IDAKCXVuY292ZXIgMgoJc2V0Yml0CglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgzCgkvLyB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgPSAwCglieXRlIDB4NmU3NTZkNTYgLy8gIm51bVYiCglpbnQgMAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NAoJLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlID0gMAoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJaW50IDAKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODUKCS8vIHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlID0gMAoJYnl0ZSAweDczNzQ2MTZiNjU2NCAvLyAic3Rha2VkIgoJaW50IDAKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIGluaXRTdGFraW5nQ29udHJhY3QodWludDY0KXZvaWQKKmFiaV9yb3V0ZV9pbml0U3Rha2luZ0NvbnRyYWN0OgoJLy8gYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBpbml0U3Rha2luZ0NvbnRyYWN0KHVpbnQ2NCl2b2lkCgljYWxsc3ViIGluaXRTdGFraW5nQ29udHJhY3QKCWludCAxCglyZXR1cm4KCi8vIGluaXRTdGFraW5nQ29udHJhY3QoYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0KTogdm9pZAppbml0U3Rha2luZ0NvbnRyYWN0OgoJcHJvdG8gMSAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTAKCS8vIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uY3JlYXRlKGFwcHJvdmFsUHJvZ3JhbVNpemUpCglieXRlIDB4NzA2ZjZmNmM1NDY1NmQ3MDZjNjE3NDY1NDE3MDcwNzI2Zjc2NjE2YzQyNzk3NDY1NzMgLy8gInBvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMiCglmcmFtZV9kaWcgLTEgLy8gYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0Cglib3hfY3JlYXRlCglwb3AKCXJldHN1YgoKLy8gbG9hZFN0YWtpbmdDb250cmFjdERhdGEodWludDY0LGJ5dGVbXSl2b2lkCiphYmlfcm91dGVfbG9hZFN0YWtpbmdDb250cmFjdERhdGE6CgkvLyBkYXRhOiBieXRlW10KCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWV4dHJhY3QgMiAwCgoJLy8gb2Zmc2V0OiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGxvYWRTdGFraW5nQ29udHJhY3REYXRhKHVpbnQ2NCxieXRlW10pdm9pZAoJY2FsbHN1YiBsb2FkU3Rha2luZ0NvbnRyYWN0RGF0YQoJaW50IDEKCXJldHVybgoKLy8gbG9hZFN0YWtpbmdDb250cmFjdERhdGEob2Zmc2V0OiB1aW50NjQsIGRhdGE6IGJ5dGVzKTogdm9pZApsb2FkU3Rha2luZ0NvbnRyYWN0RGF0YToKCXByb3RvIDIgMAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk0CgkvLyBhc3NlcnQoIXRoaXMuc3Rha2luZ1Bvb2xJbml0aWFsaXplZC52YWx1ZSkKCWJ5dGUgMHg2OTZlNjk3NCAvLyAiaW5pdCIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMAoJZ2V0Yml0CgkhCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5NQoJLy8gdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5yZXBsYWNlKG9mZnNldCwgZGF0YSkKCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWZyYW1lX2RpZyAtMSAvLyBvZmZzZXQ6IHVpbnQ2NAoJZnJhbWVfZGlnIC0yIC8vIGRhdGE6IGJ5dGVzCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdCgpdm9pZAoqYWJpX3JvdXRlX2ZpbmFsaXplU3Rha2luZ0NvbnRyYWN0OgoJLy8gZXhlY3V0ZSBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdCgpdm9pZAoJY2FsbHN1YiBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdAoJaW50IDEKCXJldHVybgoKLy8gZmluYWxpemVTdGFraW5nQ29udHJhY3QoKTogdm9pZApmaW5hbGl6ZVN0YWtpbmdDb250cmFjdDoKCXByb3RvIDAgMAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk5CgkvLyB0aGlzLnN0YWtpbmdQb29sSW5pdGlhbGl6ZWQudmFsdWUgPSB0cnVlCglieXRlIDB4Njk2ZTY5NzQgLy8gImluaXQiCglpbnQgMQoJYnl0ZSAweDAwCglpbnQgMAoJdW5jb3ZlciAyCglzZXRiaXQKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIGdhcygpdm9pZAoqYWJpX3JvdXRlX2dhczoKCS8vIGV4ZWN1dGUgZ2FzKCl2b2lkCgljYWxsc3ViIGdhcwoJaW50IDEKCXJldHVybgoKLy8gZ2FzKCk6IHZvaWQKLy8KLy8gZ2FzIGlzIGEgZHVtbXkgbm8tb3AgY2FsbCB0aGF0IGNhbiBiZSB1c2VkIHRvIHBvb2wtdXAgcmVzb3VyY2UgcmVmZXJlbmNlcyBhbmQgb3Bjb2RlIGNvc3QKZ2FzOgoJcHJvdG8gMCAwCglyZXRzdWIKCi8vIGdldE1ickFtb3VudHMoKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0TWJyQW1vdW50czoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXRNYnJBbW91bnRzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0TWJyQW1vdW50cygpOiBNYnJBbW91bnRzCi8vCi8vIFJldHVybnMgdGhlIE1CUiBhbW91bnRzIG5lZWRlZCBmb3IgdmFyaW91cyBhY3Rpb25zOgovLyBbCi8vIGFkZFZhbGlkYXRvck1icjogdWludDY0IC0gbWJyIG5lZWRlZCB0byBhZGQgYSBuZXcgdmFsaWRhdG9yIC0gcGFpZCB0byB2YWxpZGF0b3IgY29udHJhY3QKLy8gYWRkUG9vbE1icjogdWludDY0IC0gbWJyIG5lZWRlZCB0byBhZGQgYSBuZXcgcG9vbCAtIHBhaWQgdG8gdmFsaWRhdG9yCi8vIHBvb2xJbml0TWJyOiB1aW50NjQgLSBtYnIgbmVlZGVkIHRvIGluaXRTdG9yYWdlKCkgb2YgcG9vbCAtIHBhaWQgdG8gcG9vbCBpdHNlbGYKLy8gYWRkU3Rha2VyTWJyOiB1aW50NjQgLSBtYnIgc3Rha2VyIG5lZWRzIHRvIGFkZCB0byBmaXJzdCBzdGFraW5nIHBheW1lbnQgKHN0YXlzIHcvIHZhbGlkYXRvcikKLy8gXQpnZXRNYnJBbW91bnRzOgoJcHJvdG8gMCAxCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5CgkvLyByZXR1cm4gewoJLy8gICAgICAgICAgICAgYWRkVmFsaWRhdG9yTWJyOiB0aGlzLmNvc3RGb3JCb3hTdG9yYWdlKDEgLyogdiBwcmVmaXggKi8gKyBsZW48VmFsaWRhdG9ySWRUeXBlPigpICsgbGVuPFZhbGlkYXRvckluZm8+KCkpLAoJLy8gICAgICAgICAgICAgYWRkUG9vbE1icjogdGhpcy5taW5CYWxhbmNlRm9yQWNjb3VudCgKCS8vICAgICAgICAgICAgICAgICAxLAoJLy8gICAgICAgICAgICAgICAgIC8vIHdlIGNvdWxkIGNhbGN1bGF0ZSB0aGlzIGRpcmVjdGx5IGJ5IHJlZmVyZW5jaW5nIHRoZSBzaXplIG9mIHN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtIGJ1dCBpdCB3b3VsZAoJLy8gICAgICAgICAgICAgICAgIC8vIG1lYW4gb3VyIGNhbGxlcnMgd291bGQgaGF2ZSB0byByZWZlcmVuY2UgdGhlIGJveCBBTkQgYnV5IHVwIGkvbyAtIHNvIGp1c3QgZ28gbWF4IG9uIGV4dHJhIHBhZ2VzCgkvLyAgICAgICAgICAgICAgICAgMywKCS8vICAgICAgICAgICAgICAgICAwLAoJLy8gICAgICAgICAgICAgICAgIDAsCgkvLyAgICAgICAgICAgICAgICAgMCwKCS8vICAgICAgICAgICAgICAgICBTdGFraW5nUG9vbC5zY2hlbWEuZ2xvYmFsLm51bVVpbnQsCgkvLyAgICAgICAgICAgICAgICAgU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1CeXRlU2xpY2UsCgkvLyAgICAgICAgICAgICApLAoJLy8gICAgICAgICAgICAgcG9vbEluaXRNYnI6CgkvLyAgICAgICAgICAgICAgICAgQUxHT1JBTkRfQUNDT1VOVF9NSU5fQkFMQU5DRSArCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5jb3N0Rm9yQm94U3RvcmFnZSg3IC8qICdzdGFrZXJzJyBuYW1lICovICsgbGVuPFN0YWtlZEluZm8+KCkgKiBNQVhfU1RBS0VSU19QRVJfUE9PTCksCgkvLyAgICAgICAgICAgICBhZGRTdGFrZXJNYnI6CgkvLyAgICAgICAgICAgICAgICAgLy8gaG93IG11Y2ggdG8gY2hhcmdlIGZvciBmaXJzdCB0aW1lIGEgc3Rha2VyIGFkZHMgc3Rha2UgLSBzaW5jZSB3ZSBhZGQgYSB0cmFja2luZyBib3ggcGVyIHN0YWtlcgoJLy8gICAgICAgICAgICAgICAgIHRoaXMuY29zdEZvckJveFN0b3JhZ2UoCgkvLyAgICAgICAgICAgICAgICAgICAgIDMgLyogJ3NwcycgcHJlZml4ICovICsgbGVuPEFkZHJlc3M+KCkgKyBsZW48VmFsaWRhdG9yUG9vbEtleT4oKSAqIE1BWF9QT09MU19QRVJfU1RBS0VSLAoJLy8gICAgICAgICAgICAgICAgICksIC8vIHNpemUgb2Yga2V5ICsgYWxsIHZhbHVlcwoJLy8gICAgICAgICB9CglpbnQgMTEwMQoJY2FsbHN1YiBjb3N0Rm9yQm94U3RvcmFnZQoJaXRvYgoJaW50IDMKCWludCAxMQoJaW50IDAKCWR1cG4gMgoJaW50IDMKCWludCAxCgljYWxsc3ViIG1pbkJhbGFuY2VGb3JBY2NvdW50CglpdG9iCgljb25jYXQKCWludCAxMDAwMDAKCWludCAxMjgwNwoJY2FsbHN1YiBjb3N0Rm9yQm94U3RvcmFnZQoJKwoJaXRvYgoJY29uY2F0CglpbnQgMTc5CgljYWxsc3ViIGNvc3RGb3JCb3hTdG9yYWdlCglpdG9iCgljb25jYXQKCXJldHN1YgoKLy8gZ2V0UHJvdG9jb2xDb25zdHJhaW50cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0UHJvdG9jb2xDb25zdHJhaW50czoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXRQcm90b2NvbENvbnN0cmFpbnRzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWNhbGxzdWIgZ2V0UHJvdG9jb2xDb25zdHJhaW50cwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFByb3RvY29sQ29uc3RyYWludHMoKTogQ29uc3RyYWludHMKLy8KLy8gUmV0dXJucyB0aGUgcHJvdG9jb2wgY29uc3RyYWludHMgc28gdGhhdCBVSXMgY2FuIGxpbWl0IHdoYXQgdXNlcnMgc3BlY2lmeSBmb3IgdmFsaWRhdG9yIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KZ2V0UHJvdG9jb2xDb25zdHJhaW50czoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0NwoJLy8gcmV0dXJuIHsKCS8vICAgICAgICAgICAgIGVwb2NoUGF5b3V0Um91bmRzTWluOiBNSU5fRVBPQ0hfTEVOR1RILAoJLy8gICAgICAgICAgICAgZXBvY2hQYXlvdXRSb3VuZHNNYXg6IE1BWF9FUE9DSF9MRU5HVEgsCgkvLyAgICAgICAgICAgICBtaW5QY3RUb1ZhbGlkYXRvcldGb3VyRGVjaW1hbHM6IE1JTl9QQ1RfVE9fVkFMSURBVE9SLAoJLy8gICAgICAgICAgICAgbWF4UGN0VG9WYWxpZGF0b3JXRm91ckRlY2ltYWxzOiBNQVhfUENUX1RPX1ZBTElEQVRPUiwKCS8vICAgICAgICAgICAgIG1pbkVudHJ5U3Rha2U6IE1JTl9BTEdPX1NUQUtFX1BFUl9QT09MLAoJLy8gICAgICAgICAgICAgbWF4QWxnb1BlclBvb2w6IHRoaXMubWF4QWxnb0FsbG93ZWRQZXJQb29sKCksCgkvLyAgICAgICAgICAgICBtYXhBbGdvUGVyVmFsaWRhdG9yOiB0aGlzLm1heEFsbG93ZWRTdGFrZSgpLAoJLy8gICAgICAgICAgICAgYW10Q29uc2lkZXJlZFNhdHVyYXRlZDogdGhpcy5hbGdvU2F0dXJhdGlvbkxldmVsKCksCgkvLyAgICAgICAgICAgICBtYXhOb2RlczogTUFYX05PREVTLAoJLy8gICAgICAgICAgICAgbWF4UG9vbHNQZXJOb2RlOiBNQVhfUE9PTFNfUEVSX05PREUsCgkvLyAgICAgICAgICAgICBtYXhTdGFrZXJzUGVyUG9vbDogTUFYX1NUQUtFUlNfUEVSX1BPT0wsCgkvLyAgICAgICAgIH0KCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDBmNDI0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGY0MjQwMDAwMDAwMDAwMDBmNDI0MAoJY2FsbHN1YiBtYXhBbGdvQWxsb3dlZFBlclBvb2wKCWl0b2IKCWNvbmNhdAoJY2FsbHN1YiBtYXhBbGxvd2VkU3Rha2UKCWl0b2IKCWNvbmNhdAoJY2FsbHN1YiBhbGdvU2F0dXJhdGlvbkxldmVsCglpdG9iCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDA4Cgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAzCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMGM4Cgljb25jYXQKCXJldHN1YgoKLy8gZ2V0TnVtVmFsaWRhdG9ycygpdWludDY0CiphYmlfcm91dGVfZ2V0TnVtVmFsaWRhdG9yczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXROdW1WYWxpZGF0b3JzKCl1aW50NjQKCWNhbGxzdWIgZ2V0TnVtVmFsaWRhdG9ycwoJaXRvYgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldE51bVZhbGlkYXRvcnMoKTogdWludDY0Ci8vCi8vIFJldHVybnMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHZhbGlkYXRvcnMKZ2V0TnVtVmFsaWRhdG9yczoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE2NwoJLy8gcmV0dXJuIHRoaXMubnVtVmFsaWRhdG9ycy52YWx1ZQoJYnl0ZSAweDZlNzU2ZDU2IC8vICJudW1WIgoJYXBwX2dsb2JhbF9nZXQKCXJldHN1YgoKLy8gZ2V0VmFsaWRhdG9yQ29uZmlnKHVpbnQ2NCkodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKKmFiaV9yb3V0ZV9nZXRWYWxpZGF0b3JDb25maWc6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFZhbGlkYXRvckNvbmZpZyh1aW50NjQpKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCgljYWxsc3ViIGdldFZhbGlkYXRvckNvbmZpZwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvckNvbmZpZyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogVmFsaWRhdG9yQ29uZmlnCmdldFZhbGlkYXRvckNvbmZpZzoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE3MgoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnCglpbnQgMAoJaW50IDI0MgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCXJldHN1YgoKLy8gZ2V0VmFsaWRhdG9yU3RhdGUodWludDY0KSh1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0VmFsaWRhdG9yU3RhdGU6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFZhbGlkYXRvclN0YXRlKHVpbnQ2NCkodWludDE2LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBnZXRWYWxpZGF0b3JTdGF0ZQoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvclN0YXRlKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBWYWxpZGF0b3JDdXJTdGF0ZQpnZXRWYWxpZGF0b3JTdGF0ZToKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE3NwoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUKCWludCAyNDIgLy8gaGVhZE9mZnNldAoJaW50IDI2CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpCiphYmlfcm91dGVfZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpCgljYWxsc3ViIGdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcih2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogW0FkZHJlc3MsIEFkZHJlc3NdCmdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcjoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE4MgoJLy8gcmV0dXJuIFsKCS8vICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLAoJLy8gICAgICAgICAgICAgdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWFuYWdlciwKCS8vICAgICAgICAgXQoJaW50IDgKCWludCAzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWludCA0MAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJY29uY2F0CglyZXRzdWIKCi8vIGdldFBvb2xzKHVpbnQ2NCkodWludDY0LHVpbnQxNix1aW50NjQpW10KKmFiaV9yb3V0ZV9nZXRQb29sczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0UG9vbHModWludDY0KSh1aW50NjQsdWludDE2LHVpbnQ2NClbXQoJY2FsbHN1YiBnZXRQb29scwoJZHVwCglsZW4KCWludCAxOAoJLwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFBvb2xzKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBQb29sSW5mb1tdCi8vCi8vIFJldHVybiBsaXN0IG9mIGFsbCBwb29scyBmb3IgdGhpcyB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWxpZGF0b3JJZAovLyBAcmV0dXJuIHtQb29sSW5mb1tdfSAtIGFycmF5IG9mIHBvb2xzCi8vIE5vdCBjYWxsYWJsZSBmcm9tIG90aGVyIGNvbnRyYWN0cyBiZWNhdXNlID4xSyByZXR1cm4gYnV0IGNhbiBiZSBjYWxsZWQgdy8gc2ltdWxhdGUgd2hpY2ggYnVtcHMgbG9nIHJldHVybnMKZ2V0UG9vbHM6Cglwcm90byAxIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiAyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk2CgkvLyByZXREYXRhOiBQb29sSW5mb1tdID0gW10KCWJ5dGUgMHgKCWZyYW1lX2J1cnkgMCAvLyByZXREYXRhOiBQb29sSW5mb1tdCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk3CgkvLyBwb29sU2V0ID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29scykKCWludCAyNjggLy8gaGVhZE9mZnNldAoJaW50IDQzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWZyYW1lX2J1cnkgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE5OAoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBwb29sU2V0Lmxlbmd0aDsgaSArPSAxKQoJaW50IDAKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCipmb3JfMDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE5OAoJLy8gaSA8IHBvb2xTZXQubGVuZ3RoCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCAyNAoJPAoJYnogKmZvcl8wX2VuZAoKCS8vICppZjBfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxOTkKCS8vIHBvb2xTZXRbaV0ucG9vbEFwcElkID09PSAwCglmcmFtZV9kaWcgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWYwX2VuZAoKCS8vICppZjBfY29uc2VxdWVudAoJYiAqZm9yXzBfZW5kCgoqaWYwX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIwMwoJLy8gcmV0RGF0YS5wdXNoKHBvb2xTZXRbaV0pCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBQb29sSW5mb1tdCglmcmFtZV9kaWcgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDE4CglleHRyYWN0MwoJY29uY2F0CglmcmFtZV9idXJ5IDAgLy8gcmV0RGF0YTogUG9vbEluZm9bXQoKKmZvcl8wX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk4CgkvLyBpICs9IDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCWIgKmZvcl8wCgoqZm9yXzBfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjA1CgkvLyByZXR1cm4gcmV0RGF0YQoJZnJhbWVfZGlnIDAgLy8gcmV0RGF0YTogUG9vbEluZm9bXQoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDIKCXJldHN1YgoKLy8gZ2V0UG9vbEFwcElkKHVpbnQ2NCx1aW50NjQpdWludDY0CiphYmlfcm91dGVfZ2V0UG9vbEFwcElkOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBwb29sSWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJYnRvaQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFBvb2xBcHBJZCh1aW50NjQsdWludDY0KXVpbnQ2NAoJY2FsbHN1YiBnZXRQb29sQXBwSWQKCWl0b2IKCWNvbmNhdAoJbG9nCglpbnQgMQoJcmV0dXJuCgovLyBnZXRQb29sQXBwSWQodmFsaWRhdG9ySWQ6IHVpbnQ2NCwgcG9vbElkOiB1aW50NjQpOiB1aW50NjQKZ2V0UG9vbEFwcElkOgoJcHJvdG8gMiAxCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjEzCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBwb29sSWQgIT09IDAgJiYgcG9vbElkIDw9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHMubGVuZ3RoLAoJLy8gICAgICAgICAgICAgJ3Bvb2wgaWQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIG51bWJlciBvZiBwb29scyBmb3IgdGhpcyB2YWxpZGF0b3InLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTIgLy8gcG9vbElkOiB1aW50NjQKCWludCAwCgkhPQoJZHVwCglieiAqc2tpcF9hbmQwCglmcmFtZV9kaWcgLTIgLy8gcG9vbElkOiB1aW50NjQKCWludCAyNAoJPD0KCSYmCgoqc2tpcF9hbmQwOgoJLy8gcG9vbCBpZCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgbnVtYmVyIG9mIHBvb2xzIGZvciB0aGlzIHZhbGlkYXRvcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjE3CgkvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1twb29sSWQgLSAxXS5wb29sQXBwSWQKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0yIC8vIHBvb2xJZDogdWludDY0CglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCXJldHN1YgoKLy8gZ2V0UG9vbEluZm8oKHVpbnQ2NCx1aW50NjQsdWludDY0KSkodWludDY0LHVpbnQxNix1aW50NjQpCiphYmlfcm91dGVfZ2V0UG9vbEluZm86CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHBvb2xLZXk6ICh1aW50NjQsdWludDY0LHVpbnQ2NCkKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWR1cAoJbGVuCglpbnQgMjQKCT09CgoJLy8gYXJndW1lbnQgMCAocG9vbEtleSkgZm9yIGdldFBvb2xJbmZvIG11c3QgYmUgYSAodWludDY0LHVpbnQ2NCx1aW50NjQpCglhc3NlcnQKCgkvLyBleGVjdXRlIGdldFBvb2xJbmZvKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpKHVpbnQ2NCx1aW50MTYsdWludDY0KQoJY2FsbHN1YiBnZXRQb29sSW5mbwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFBvb2xJbmZvKHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkpOiBQb29sSW5mbwpnZXRQb29sSW5mbzoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIyMgoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRDdXJNYXhTdGFrZVBlclBvb2wodWludDY0KXVpbnQ2NAoqYWJpX3JvdXRlX2dldEN1ck1heFN0YWtlUGVyUG9vbDoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHVpbnQ2NCl1aW50NjQKCWNhbGxzdWIgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sCglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiB1aW50NjQKLy8KLy8gQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIHN0YWtlIHBlciBwb29sIGZvciBhIGdpdmVuIHZhbGlkYXRvci4KLy8gTm9ybWFsbHkgdGhpcyB3b3VsZCBiZSBtYXhBbGdvUGVyUG9vbCwgYnV0IGl0IHNob3VsZCBhbHNvIG5ldmVyIGdvIGFib3ZlIE1heEFsbG93ZWRTdGFrZSAvIG51bVBvb2xzIHNvCi8vIGFzIHBvb2xzIGFyZSBhZGRlZCB0aGUgbWF4IGFsbG93ZWQgcGVyIHBvb2wgY2FuIHJlZHVjZS4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCmdldEN1ck1heFN0YWtlUGVyUG9vbDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzMKCS8vIG51bVBvb2xzID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyBhcyB1aW50NjQKCWludCAyNDIKCWludCAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIG51bVBvb2xzOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzQKCS8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzID0gdGhpcy5tYXhBbGxvd2VkU3Rha2UoKSAvIG51bVBvb2xzCgljYWxsc3ViIG1heEFsbG93ZWRTdGFrZQoJZnJhbWVfZGlnIDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoJLwoJZnJhbWVfYnVyeSAxIC8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzUKCS8vIG1heFBlclBvb2w6IHVpbnQ2NCA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1heEFsZ29QZXJQb29sCglpbnQgMjE3CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCgkvLyAqaWYxX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjM2CgkvLyBtYXhQZXJQb29sID09PSAwCglmcmFtZV9kaWcgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCWludCAwCgk9PQoJYnogKmlmMV9lbmQKCgkvLyAqaWYxX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIzNwoJLy8gbWF4UGVyUG9vbCA9IHRoaXMubWF4QWxnb0FsbG93ZWRQZXJQb29sKCkKCWNhbGxzdWIgbWF4QWxnb0FsbG93ZWRQZXJQb29sCglmcmFtZV9idXJ5IDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoqaWYxX2VuZDoKCS8vICppZjJfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzkKCS8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzIDwgbWF4UGVyUG9vbAoJZnJhbWVfZGlnIDEgLy8gaGFyZE1heERpdmlkZWRCZXR3ZWVuUG9vbHM6IHVpbnQ2NAoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8CglieiAqaWYyX2VuZAoKCS8vICppZjJfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjQwCgkvLyBtYXhQZXJQb29sID0gaGFyZE1heERpdmlkZWRCZXR3ZWVuUG9vbHMKCWZyYW1lX2RpZyAxIC8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzOiB1aW50NjQKCWZyYW1lX2J1cnkgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCippZjJfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjQyCgkvLyByZXR1cm4gbWF4UGVyUG9vbAoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCgoJLy8gcG9wIGFsbCBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUgc3RhY2sKCXBvcG4gMgoJcmV0c3ViCgovLyBkb2VzU3Rha2VyTmVlZFRvUGF5TUJSKGFkZHJlc3MpYm9vbAoqYWJpX3JvdXRlX2RvZXNTdGFrZXJOZWVkVG9QYXlNQlI6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHN0YWtlcjogYWRkcmVzcwoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZHVwCglsZW4KCWludCAzMgoJPT0KCgkvLyBhcmd1bWVudCAwIChzdGFrZXIpIGZvciBkb2VzU3Rha2VyTmVlZFRvUGF5TUJSIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBleGVjdXRlIGRvZXNTdGFrZXJOZWVkVG9QYXlNQlIoYWRkcmVzcylib29sCgljYWxsc3ViIGRvZXNTdGFrZXJOZWVkVG9QYXlNQlIKCWJ5dGUgMHgwMAoJaW50IDAKCXVuY292ZXIgMgoJc2V0Yml0Cgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZG9lc1N0YWtlck5lZWRUb1BheU1CUihzdGFrZXI6IEFkZHJlc3MpOiBib29sZWFuCi8vCi8vIEhlbHBlciBjYWxsZXJzIGNhbiBjYWxsIHcvIHNpbXVsYXRlIHRvIGRldGVybWluZSBpZiAnQWRkU3Rha2VyJyBNQlIgc2hvdWxkIGJlIGluY2x1ZGVkIHcvIHN0YWtpbmcgYW1vdW50Ci8vIEBwYXJhbSBzdGFrZXIKZG9lc1N0YWtlck5lZWRUb1BheU1CUjoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI1MQoJLy8gcmV0dXJuICF0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS5leGlzdHMKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZXI6IEFkZHJlc3MKCWNvbmNhdAoJYm94X2xlbgoJc3dhcAoJcG9wCgkhCglyZXRzdWIKCi8vIGdldFN0YWtlZFBvb2xzRm9yQWNjb3VudChhZGRyZXNzKSh1aW50NjQsdWludDY0LHVpbnQ2NClbXQoqYWJpX3JvdXRlX2dldFN0YWtlZFBvb2xzRm9yQWNjb3VudDoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gc3Rha2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKHN0YWtlcikgZm9yIGdldFN0YWtlZFBvb2xzRm9yQWNjb3VudCBtdXN0IGJlIGEgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBnZXRTdGFrZWRQb29sc0ZvckFjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCx1aW50NjQpW10KCWNhbGxzdWIgZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50CglkdXAKCWxlbgoJaW50IDI0CgkvCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0Cgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50KHN0YWtlcjogQWRkcmVzcyk6IFZhbGlkYXRvclBvb2xLZXlbXQovLwovLyBSZXRyaWV2ZXMgdGhlIHN0YWtlZCBwb29scyBmb3IgYW4gYWNjb3VudC4KLy8KLy8gQHBhcmFtIHtBZGRyZXNzfSBzdGFrZXIgLSBUaGUgYWNjb3VudCB0byByZXRyaWV2ZSBzdGFrZWQgcG9vbHMgZm9yLgovLyBAcmV0dXJuIHtWYWxpZGF0b3JQb29sS2V5W119IC0gVGhlIGFycmF5IG9mIHN0YWtlZCBwb29scyBmb3IgdGhlIGFjY291bnQuCmdldFN0YWtlZFBvb2xzRm9yQWNjb3VudDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyAqaWYzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjYxCgkvLyAhdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikuZXhpc3RzCglieXRlIDB4NzM3MDczIC8vICJzcHMiCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoJIQoJYnogKmlmM19lbmQKCgkvLyAqaWYzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2MgoJLy8gcmV0dXJuIFtdCglieXRlIDB4CgliICpnZXRTdGFrZWRQb29sc0ZvckFjY291bnQqcmV0dXJuCgoqaWYzX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2NAoJLy8gcmV0RGF0YTogVmFsaWRhdG9yUG9vbEtleVtdID0gW10KCWJ5dGUgMHgKCWZyYW1lX2J1cnkgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjUKCS8vIHBvb2xTZXQgPSBjbG9uZSh0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZSkKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZXI6IEFkZHJlc3MKCWNvbmNhdAoJYm94X2dldAoKCS8vIGJveCB2YWx1ZSBkb2VzIG5vdCBleGlzdDogdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUKCWFzc2VydAoJZnJhbWVfYnVyeSAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjYKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgcG9vbFNldC5sZW5ndGg7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzE6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjYKCS8vIGkgPCBwb29sU2V0Lmxlbmd0aAoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl8xX2VuZAoKCS8vICppZjRfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjcKCS8vIHBvb2xTZXRbaV0uaWQgIT09IDAKCWZyYW1lX2RpZyAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgkhPQoJYnogKmlmNF9lbmQKCgkvLyAqaWY0X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2OAoJLy8gcmV0RGF0YS5wdXNoKHBvb2xTZXRbaV0pCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCWZyYW1lX2RpZyAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWNvbmNhdAoJZnJhbWVfYnVyeSAwIC8vIHJldERhdGE6IFZhbGlkYXRvclBvb2xLZXlbXQoKKmlmNF9lbmQ6CgoqZm9yXzFfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjYKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzEKCipmb3JfMV9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzEKCS8vIHJldHVybiByZXREYXRhCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCipnZXRTdGFrZWRQb29sc0ZvckFjY291bnQqcmV0dXJuOgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCgoJLy8gcG9wIGFsbCBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUgc3RhY2sKCXBvcG4gMgoJcmV0c3ViCgovLyBnZXRUb2tlblBheW91dFJhdGlvKHVpbnQ2NCkodWludDY0WzI0XSx1aW50NjQpCiphYmlfcm91dGVfZ2V0VG9rZW5QYXlvdXRSYXRpbzoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KQoJY2FsbHN1YiBnZXRUb2tlblBheW91dFJhdGlvCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0VG9rZW5QYXlvdXRSYXRpbyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogUG9vbFRva2VuUGF5b3V0UmF0aW8KLy8KLy8gUmV0cmlldmVzIHRoZSB0b2tlbiBwYXlvdXQgcmF0aW8gZm9yIGEgZ2l2ZW4gdmFsaWRhdG9yIC0gcmV0dXJuaW5nIHRoZSBwb29sIHJhdGlvcyBvZiB3aG9sZSBzbyB0aGF0IHRva2VuCi8vIHBheW91dHMgYWNyb3NzIHBvb2xzIGNhbiBiZSBiYXNlZCBvbiBhIHN0YWJsZSBzbmFwaG9zdCBvZiBzdGFrZS4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEByZXR1cm4ge1Bvb2xUb2tlblBheW91dFJhdGlvfSAtIFRoZSB0b2tlbiBwYXlvdXQgcmF0aW8gZm9yIHRoZSB2YWxpZGF0b3IuCmdldFRva2VuUGF5b3V0UmF0aW86Cglwcm90byAxIDEKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyODMKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCXJldHN1YgoKLy8gZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cyh1aW50NjQpKCh1aW50NjRbM10pWzhdKQoqYWJpX3JvdXRlX2dldE5vZGVQb29sQXNzaWdubWVudHM6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldE5vZGVQb29sQXNzaWdubWVudHModWludDY0KSgodWludDY0WzNdKVs4XSkKCWNhbGxzdWIgZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldE5vZGVQb29sQXNzaWdubWVudHModmFsaWRhdG9ySWQ6IHVpbnQ2NCk6IE5vZGVQb29sQXNzaWdubWVudENvbmZpZwpnZXROb2RlUG9vbEFzc2lnbm1lbnRzOgoJcHJvdG8gMSAxCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mjg4CgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS5leGlzdHMsICJ0aGUgc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBkb2Vzbid0IGV4aXN0IikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoKCS8vIHRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGRvZXNuJ3QgZXhpc3QKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI5MAoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUubm9kZVBvb2xBc3NpZ25tZW50cwoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRORkRSZWdpc3RyeUlEKCl1aW50NjQKKmFiaV9yb3V0ZV9nZXRORkRSZWdpc3RyeUlEOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBleGVjdXRlIGdldE5GRFJlZ2lzdHJ5SUQoKXVpbnQ2NAoJY2FsbHN1YiBnZXRORkRSZWdpc3RyeUlECglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0TkZEUmVnaXN0cnlJRCgpOiB1aW50NjQKZ2V0TkZEUmVnaXN0cnlJRDoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI5NAoJLy8gcmV0dXJuIHRoaXMubmZkUmVnaXN0cnlBcHBJZAoJbG9hZCAyMDAgLy8gVE1QTF9uZmRSZWdpc3RyeUFwcElkCglyZXRzdWIKCi8vIGFkZFZhbGlkYXRvcihwYXksc3RyaW5nLCh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KSl1aW50NjQKKmFiaV9yb3V0ZV9hZGRWYWxpZGF0b3I6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIGNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDI0MgoJPT0KCgkvLyBhcmd1bWVudCAwIChjb25maWcpIGZvciBhZGRWYWxpZGF0b3IgbXVzdCBiZSBhICh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KQoJYXNzZXJ0CgoJLy8gbmZkTmFtZTogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglleHRyYWN0IDIgMAoKCS8vIG1iclBheW1lbnQ6IHBheQoJdHhuIEdyb3VwSW5kZXgKCWludCAxCgktCglkdXAKCWd0eG5zIFR5cGVFbnVtCglpbnQgcGF5Cgk9PQoKCS8vIGFyZ3VtZW50IDIgKG1iclBheW1lbnQpIGZvciBhZGRWYWxpZGF0b3IgbXVzdCBiZSBhIHBheSB0cmFuc2FjdGlvbgoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBhZGRWYWxpZGF0b3IocGF5LHN0cmluZywodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkpdWludDY0CgljYWxsc3ViIGFkZFZhbGlkYXRvcgoJaXRvYgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFZhbGlkYXRvcihtYnJQYXltZW50OiBQYXlUeG4sIG5mZE5hbWU6IHN0cmluZywgY29uZmlnOiBWYWxpZGF0b3JDb25maWcpOiB1aW50NjQKLy8KLy8gQWRkcyBhIG5ldyB2YWxpZGF0b3IKLy8gUmVxdWlyZXMgYXQgbGVhc3QgMTAgQUxHTyBhcyB0aGUgJ2ZlZScgZm9yIHRoZSB0cmFuc2FjdGlvbiB0byBoZWxwIGRpc3N1YWRlIHNwYW1tZWQgdmFsaWRhdG9yIGFkZHMuCi8vCi8vIEBwYXJhbSB7UGF5VHhufSBtYnJQYXltZW50IHBheW1lbnQgZnJvbSBjYWxsZXIgd2hpY2ggY292ZXJzIG1iciBpbmNyZWFzZSBvZiBuZXcgdmFsaWRhdG9yIHN0b3JhZ2UKLy8gQHBhcmFtIHtzdHJpbmd9IG5mZE5hbWUgKE9wdGlvbmFsKSBOYW1lIG9mIG5mZCAodXNlZCBhcyBkb3VibGUtY2hlY2sgYWdhaW5zdCBpZCBzcGVjaWZpZWQgaW4gY29uZmlnKQovLyBAcGFyYW0ge1ZhbGlkYXRvckNvbmZpZ30gY29uZmlnIFZhbGlkYXRvckNvbmZpZyBzdHJ1Y3QKLy8gQHJldHVybnMge3VpbnQ2NH0gdmFsaWRhdG9yIGlkCmFkZFZhbGlkYXRvcjoKCXByb3RvIDMgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzA2CgkvLyB0aGlzLnZhbGlkYXRlQ29uZmlnKGNvbmZpZykKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJY2FsbHN1YiB2YWxpZGF0ZUNvbmZpZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMwOAoJLy8gdmVyaWZ5UGF5VHhuKG1iclBheW1lbnQsIHsgcmVjZWl2ZXI6IHRoaXMuYXBwLmFkZHJlc3MsIGFtb3VudDogdGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkVmFsaWRhdG9yTWJyIH0pCgkvLyB2ZXJpZnkgcmVjZWl2ZXIKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIFJlY2VpdmVyCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6InJlY2VpdmVyIiwiZXhwZWN0ZWQiOiJ0aGlzLmFwcC5hZGRyZXNzIn0KCWFzc2VydAoKCS8vIHZlcmlmeSBhbW91bnQKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCglleHRyYWN0IDAgOAoJYnRvaQoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6ImFtb3VudCIsImV4cGVjdGVkIjoidGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkVmFsaWRhdG9yTWJyIn0KCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxMAoJLy8gYXNzZXJ0KG1iclBheW1lbnQuZmVlID4gMTAgKiAxMDAwMDAwLCAnZmVlIG11c3QgYmUgMTAgQUxHTyBvciBtb3JlIHRvIHByZXZlbnQgc3BhbW1pbmcgb2YgdmFsaWRhdG9ycycpCglmcmFtZV9kaWcgLTEgLy8gbWJyUGF5bWVudDogUGF5VHhuCglndHhucyBGZWUKCWludCAxMDAwMDAwMAoJPgoKCS8vIGZlZSBtdXN0IGJlIDEwIEFMR08gb3IgbW9yZSB0byBwcmV2ZW50IHNwYW1taW5nIG9mIHZhbGlkYXRvcnMKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxMwoJLy8gdmFsaWRhdG9ySWQgPSB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgKyAxCglieXRlIDB4NmU3NTZkNTYgLy8gIm51bVYiCglhcHBfZ2xvYmFsX2dldAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzE0CgkvLyB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgPSB2YWxpZGF0b3JJZAoJYnl0ZSAweDZlNzU2ZDU2IC8vICJudW1WIgoJZnJhbWVfZGlnIDAgLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMTYKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkuY3JlYXRlKCkKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJaW50IDEwOTIKCWJveF9jcmVhdGUKCXBvcAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxNwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcgPSBjb25maWcKCWludCAwCglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMTgKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLmlkID0gdmFsaWRhdG9ySWQKCWludCAwCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gKmlmNV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMyMQoJLy8gY29uZmlnLm5mZEZvckluZm8gIT09IDAKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA3MiA4CglidG9pCglpbnQgMAoJIT0KCWJ6ICppZjVfZW5kCgoJLy8gKmlmNV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMjMKCS8vIGFzc2VydCh0aGlzLmlzTkZEQXBwSURWYWxpZChjb25maWcubmZkRm9ySW5mbyksICdwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZCcpCglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgNzIgOAoJYnRvaQoJY2FsbHN1YiBpc05GREFwcElEVmFsaWQKCgkvLyBwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzI1CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgdGhpcy50eG4uc2VuZGVyID09PSAoQXBwSUQuZnJvbVVpbnQ2NChjb25maWcubmZkRm9ySW5mbykuZ2xvYmFsU3RhdGUoJ2kub3duZXIuYScpIGFzIEFkZHJlc3MpLAoJLy8gICAgICAgICAgICAgICAgICdJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXInLAoJLy8gICAgICAgICAgICAgKQoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIC0zIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDcyIDgKCWJ0b2kKCWJ5dGUgMHg2OTJlNmY3NzZlNjU3MjJlNjEgLy8gImkub3duZXIuYSIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KGNvbmZpZy5uZmRGb3JJbmZvKS5nbG9iYWxTdGF0ZSgnaS5vd25lci5hJykKCWFzc2VydAoJPT0KCgkvLyBJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXIKCWFzc2VydAoKKmlmNV9lbmQ6CgkvLyAqaWY2X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzMxCgkvLyBjb25maWcuZW50cnlHYXRpbmdUeXBlID09PSBHQVRJTkdfVFlQRV9DUkVBVEVEX0JZX05GRF9BRERSRVNTRVMgfHwKCS8vICAgICAgICAgICAgIGNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX1NFR01FTlRfT0ZfTkZECglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgODAgMQoJYnRvaQoJaW50IDMKCT09CglkdXAKCWJueiAqc2tpcF9vcjAKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4MCAxCglidG9pCglpbnQgNAoJPT0KCXx8Cgoqc2tpcF9vcjA6CglieiAqaWY2X2VuZAoKCS8vICppZjZfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzM1CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5pc05GREFwcElEVmFsaWQoY29uZmlnLmVudHJ5R2F0aW5nQXNzZXRzWzBdKSwKCS8vICAgICAgICAgICAgICAgICAncHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZEJywKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAxMTMgOAoJYnRvaQoJY2FsbHN1YiBpc05GREFwcElEVmFsaWQKCgkvLyBwcm92aWRlZCBORkQgQXBwIGlkIGZvciBnYXRpbmcgbXVzdCBiZSB2YWxpZCBORkQKCWFzc2VydAoKKmlmNl9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNDAKCS8vIHRoaXMucmV0aU9QX2FkZGVkVmFsaWRhdG9yLmxvZyh7IGlkOiB2YWxpZGF0b3JJZCwgb3duZXI6IGNvbmZpZy5vd25lciwgbWFuYWdlcjogY29uZmlnLm1hbmFnZXIgfSkKCWJ5dGUgMHhhOGRkMjFjYiAvLyByZXRpT1BfYWRkZWRWYWxpZGF0b3IodWludDY0LGFkZHJlc3MsYWRkcmVzcykKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4IDMyCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA0MCAzMgoJY29uY2F0Cgljb25jYXQKCWxvZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM0MQoJLy8gcmV0dXJuIHZhbGlkYXRvcklkCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvck1hbmFnZXIodWludDY0LGFkZHJlc3Mpdm9pZAoqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvck1hbmFnZXI6CgkvLyBtYW5hZ2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKG1hbmFnZXIpIGZvciBjaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyKHVpbnQ2NCxhZGRyZXNzKXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yTWFuYWdlcgoJaW50IDEKCXJldHVybgoKLy8gY2hhbmdlVmFsaWRhdG9yTWFuYWdlcih2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBtYW5hZ2VyOiBBZGRyZXNzKTogdm9pZAovLwovLyBDaGFuZ2VzIHRoZSBWYWxpZGF0b3IgbWFuYWdlciBmb3IgYSBzcGVjaWZpYyBWYWxpZGF0b3IgaWQuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gY2hhbmdlIHRoZSBtYW5hZ2VyIGZvci4KLy8gQHBhcmFtIHtBZGRyZXNzfSBtYW5hZ2VyIC0gVGhlIG5ldyBtYW5hZ2VyIGFkZHJlc3MuCmNoYW5nZVZhbGlkYXRvck1hbmFnZXI6Cglwcm90byAyIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNTIKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM1MwoJLy8gYXNzZXJ0KG1hbmFnZXIgIT09IGdsb2JhbHMuemVyb0FkZHJlc3MsICduZWVkcyB0byBhdCBsZWFzdCBiZSB2YWxpZCBhZGRyZXNzJykKCWZyYW1lX2RpZyAtMiAvLyBtYW5hZ2VyOiBBZGRyZXNzCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CgoJLy8gbmVlZHMgdG8gYXQgbGVhc3QgYmUgdmFsaWQgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzU0CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5tYW5hZ2VyID0gbWFuYWdlcgoJaW50IDQwCglmcmFtZV9kaWcgLTIgLy8gbWFuYWdlcjogQWRkcmVzcwoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCXJldHN1YgoKLy8gY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyh1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkCiphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbzoKCS8vIHN1bnNldHRpbmdUbzogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglidG9pCgoJLy8gc3Vuc2V0dGluZ09uOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbwoJaW50IDEKCXJldHVybgoKLy8gY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBzdW5zZXR0aW5nT246IHVpbnQ2NCwgc3Vuc2V0dGluZ1RvOiBWYWxpZGF0b3JJZFR5cGUpOiB2b2lkCi8vCi8vIFVwZGF0ZXMgdGhlIHN1bnNldCBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiB2YWxpZGF0b3IuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gdXBkYXRlLgovLyBAcGFyYW0ge3VpbnQ2NH0gc3Vuc2V0dGluZ09uIC0gVGhlIG5ldyBzdW5zZXQgdGltZXN0YW1wLgovLyBAcGFyYW0ge3VpbnQ2NH0gc3Vuc2V0dGluZ1RvIC0gVGhlIG5ldyBzdW5zZXQgdG8gdmFsaWRhdG9yIGlkLgpjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvOgoJcHJvdG8gMyAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzY2CgkvLyB0aGlzLmNhbGxlck11c3RCZU93bmVyKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgY2FsbGVyTXVzdEJlT3duZXIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNjcKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnN1bnNldHRpbmdPbiA9IHN1bnNldHRpbmdPbgoJaW50IDIyNgoJZnJhbWVfZGlnIC0yIC8vIHN1bnNldHRpbmdPbjogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM2OAoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcuc3Vuc2V0dGluZ1RvID0gc3Vuc2V0dGluZ1RvCglpbnQgMjM0CglmcmFtZV9kaWcgLTMgLy8gc3Vuc2V0dGluZ1RvOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvck5GRCh1aW50NjQsdWludDY0LHN0cmluZyl2b2lkCiphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yTkZEOgoJLy8gbmZkTmFtZTogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglleHRyYWN0IDIgMAoKCS8vIG5mZEFwcElEOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JORkQodWludDY0LHVpbnQ2NCxzdHJpbmcpdm9pZAoJY2FsbHN1YiBjaGFuZ2VWYWxpZGF0b3JORkQKCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvck5GRCh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBuZmRBcHBJRDogdWludDY0LCBuZmROYW1lOiBzdHJpbmcpOiB2b2lkCi8vCi8vIENoYW5nZXMgdGhlIE5GRCBmb3IgYSB2YWxpZGF0b3IgaW4gdGhlIHZhbGlkYXRvckxpc3QgY29udHJhY3QuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gdXBkYXRlLgovLyBAcGFyYW0ge3VpbnQ2NH0gbmZkQXBwSUQgLSBUaGUgYXBwbGljYXRpb24gaWQgb2YgdGhlIE5GRCB0byBhc3NpZ24gdG8gdGhlIHZhbGlkYXRvci4KLy8gQHBhcmFtIHtzdHJpbmd9IG5mZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgTkZEICh3aGljaCBtdXN0IG1hdGNoKQpjaGFuZ2VWYWxpZGF0b3JORkQ6Cglwcm90byAzIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozODAKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM4MgoJLy8gYXNzZXJ0KHRoaXMuaXNORkRBcHBJRFZhbGlkKG5mZEFwcElEKSwgJ3Byb3ZpZGVkIE5GRCBtdXN0IGJlIHZhbGlkJykKCWZyYW1lX2RpZyAtMiAvLyBuZmRBcHBJRDogdWludDY0CgljYWxsc3ViIGlzTkZEQXBwSURWYWxpZAoKCS8vIHByb3ZpZGVkIE5GRCBtdXN0IGJlIHZhbGlkCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozODQKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHRoaXMudHhuLnNlbmRlciA9PT0gKEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzKSwKCS8vICAgICAgICAgICAgICdJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXInLAoJLy8gICAgICAgICApCgl0eG4gU2VuZGVyCglmcmFtZV9kaWcgLTIgLy8gbmZkQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKQoJYXNzZXJ0Cgk9PQoKCS8vIElmIHNwZWNpZnlpbmcgTkZELCBhY2NvdW50IGFkZGluZyB2YWxpZGF0b3IgbXVzdCBiZSBvd25lcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mzg4CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5uZmRGb3JJbmZvID0gbmZkQXBwSUQKCWludCA3MgoJZnJhbWVfZGlnIC0yIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHVpbnQ2NCxhZGRyZXNzKXZvaWQKKmFiaV9yb3V0ZV9jaGFuZ2VWYWxpZGF0b3JDb21taXNzaW9uQWRkcmVzczoKCS8vIGNvbW1pc3Npb25BZGRyZXNzOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKGNvbW1pc3Npb25BZGRyZXNzKSBmb3IgY2hhbmdlVmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MgbXVzdCBiZSBhIGFkZHJlc3MKCWFzc2VydAoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHVpbnQ2NCxhZGRyZXNzKXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MKCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIGNvbW1pc3Npb25BZGRyZXNzOiBBZGRyZXNzKTogdm9pZAovLwovLyBDaGFuZ2UgdGhlIGNvbW1pc3Npb24gYWRkcmVzcyB0aGF0IHZhbGlkYXRvciByZXdhcmRzIGFyZSBzZW50IHRvLgovLyBbIE9OTFkgT1dORVIgQ0FOIENIQU5HRSBdCmNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzOgoJcHJvdG8gMiAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mzk2CgkvLyB0aGlzLmNhbGxlck11c3RCZU93bmVyKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgY2FsbGVyTXVzdEJlT3duZXIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozOTcKCS8vIGFzc2VydChjb21taXNzaW9uQWRkcmVzcyAhPT0gQWRkcmVzcy56ZXJvQWRkcmVzcykKCWZyYW1lX2RpZyAtMiAvLyBjb21taXNzaW9uQWRkcmVzczogQWRkcmVzcwoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mzk4CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy52YWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyA9IGNvbW1pc3Npb25BZGRyZXNzCglpbnQgMTc3CglmcmFtZV9kaWcgLTIgLy8gY29tbWlzc2lvbkFkZHJlc3M6IEFkZHJlc3MKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8odWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQpdm9pZAoqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvclJld2FyZEluZm86CgkvLyBSZXdhcmRQZXJQYXlvdXQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgoJYnRvaQoKCS8vIEdhdGluZ0Fzc2V0TWluQmFsYW5jZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyA1CglidG9pCgoJLy8gRW50cnlHYXRpbmdBc3NldHM6IHVpbnQ2NFs0XQoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAoJZHVwCglsZW4KCWludCAzMgoJPT0KCgkvLyBhcmd1bWVudCAyIChFbnRyeUdhdGluZ0Fzc2V0cykgZm9yIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8gbXVzdCBiZSBhIHVpbnQ2NFs0XQoJYXNzZXJ0CgoJLy8gRW50cnlHYXRpbmdBZGRyZXNzOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDMgKEVudHJ5R2F0aW5nQWRkcmVzcykgZm9yIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8gbXVzdCBiZSBhIGFkZHJlc3MKCWFzc2VydAoKCS8vIEVudHJ5R2F0aW5nVHlwZTogdWludDgKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMQoJPT0KCgkvLyBhcmd1bWVudCA0IChFbnRyeUdhdGluZ1R5cGUpIGZvciBjaGFuZ2VWYWxpZGF0b3JSZXdhcmRJbmZvIG11c3QgYmUgYSB1aW50OAoJYXNzZXJ0CglidG9pCgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mbyh1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCl2b2lkCgljYWxsc3ViIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8KCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8odmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgRW50cnlHYXRpbmdUeXBlOiB1aW50OCwgRW50cnlHYXRpbmdBZGRyZXNzOiBBZGRyZXNzLCBFbnRyeUdhdGluZ0Fzc2V0czogU3RhdGljQXJyYXk8dWludDY0LCA0PiwgR2F0aW5nQXNzZXRNaW5CYWxhbmNlOiB1aW50NjQsIFJld2FyZFBlclBheW91dDogdWludDY0KTogdm9pZAovLwovLyBBbGxvdyB0aGUgYWRkaXRpb25hbCByZXdhcmRzIChnYXRpbmcgZW50cnksIGFkZGl0aW9uYWwgdG9rZW4gcmV3YXJkcykgaW5mb3JtYXRpb24gYmUgY2hhbmdlZCBhdCB3aWxsLgovLyBbIE9OTFkgT1dORVIgQ0FOIENIQU5HRSBdCmNoYW5nZVZhbGlkYXRvclJld2FyZEluZm86Cglwcm90byA2IDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MTMKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQxNQoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgRW50cnlHYXRpbmdUeXBlID49IEdBVElOR19UWVBFX05PTkUgJiYgRW50cnlHYXRpbmdUeXBlIDwgR0FUSU5HX1RZUEVfQ09OU1RfTUFYLAoJLy8gICAgICAgICAgICAgJ2ludmFsaWQgRW50cnkgZ2F0aW5nIHR5cGUnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDAKCT49CglkdXAKCWJ6ICpza2lwX2FuZDEKCWZyYW1lX2RpZyAtMiAvLyBFbnRyeUdhdGluZ1R5cGU6IHVpbnQ4CglpbnQgNAoJPAoJJiYKCipza2lwX2FuZDE6CgkvLyBpbnZhbGlkIEVudHJ5IGdhdGluZyB0eXBlCglhc3NlcnQKCgkvLyAqaWY3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDE5CgkvLyBFbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX0FTU0VUU19DUkVBVEVEX0JZCglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDEKCT09CglieiAqaWY3X2VuZAoKCS8vICppZjdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDIwCgkvLyBhc3NlcnQoRW50cnlHYXRpbmdBZGRyZXNzICE9PSBnbG9iYWxzLnplcm9BZGRyZXNzKQoJZnJhbWVfZGlnIC0zIC8vIEVudHJ5R2F0aW5nQWRkcmVzczogQWRkcmVzcwoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoqaWY3X2VuZDoKCS8vICppZjhfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MjMKCS8vIEVudHJ5R2F0aW5nVHlwZSA9PT0gR0FUSU5HX1RZUEVfQ1JFQVRFRF9CWV9ORkRfQUREUkVTU0VTIHx8CgkvLyAgICAgICAgICAgICBFbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX1NFR01FTlRfT0ZfTkZECglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDMKCT09CglkdXAKCWJueiAqc2tpcF9vcjEKCWZyYW1lX2RpZyAtMiAvLyBFbnRyeUdhdGluZ1R5cGU6IHVpbnQ4CglpbnQgNAoJPT0KCXx8Cgoqc2tpcF9vcjE6CglieiAqaWY4X2VuZAoKCS8vICppZjhfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDI2CgkvLyBhc3NlcnQodGhpcy5pc05GREFwcElEVmFsaWQoRW50cnlHYXRpbmdBc3NldHNbMF0pLCAncHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZEJykKCWZyYW1lX2RpZyAtNCAvLyBFbnRyeUdhdGluZ0Fzc2V0czogU3RhdGljQXJyYXk8dWludDY0LCA0PgoJZXh0cmFjdCAwIDgKCWJ0b2kKCWNhbGxzdWIgaXNORkRBcHBJRFZhbGlkCgoJLy8gcHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZECglhc3NlcnQKCippZjhfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDI4CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPSBFbnRyeUdhdGluZ1R5cGUKCWludCA4MAoJZnJhbWVfZGlnIC0yIC8vIEVudHJ5R2F0aW5nVHlwZTogdWludDgKCWl0b2IKCWV4dHJhY3QgNyAxCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQyOQoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcuZW50cnlHYXRpbmdBZGRyZXNzID0gRW50cnlHYXRpbmdBZGRyZXNzCglpbnQgODEKCWZyYW1lX2RpZyAtMyAvLyBFbnRyeUdhdGluZ0FkZHJlc3M6IEFkZHJlc3MKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDMwCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0cyA9IEVudHJ5R2F0aW5nQXNzZXRzCglpbnQgMTEzCglmcmFtZV9kaWcgLTQgLy8gRW50cnlHYXRpbmdBc3NldHM6IFN0YXRpY0FycmF5PHVpbnQ2NCwgND4KCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDMxCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5nYXRpbmdBc3NldE1pbkJhbGFuY2UgPSBHYXRpbmdBc3NldE1pbkJhbGFuY2UKCWludCAxNDUKCWZyYW1lX2RpZyAtNSAvLyBHYXRpbmdBc3NldE1pbkJhbGFuY2U6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MzIKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnJld2FyZFBlclBheW91dCA9IFJld2FyZFBlclBheW91dAoJaW50IDE2MQoJZnJhbWVfZGlnIC02IC8vIFJld2FyZFBlclBheW91dDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyBhZGRQb29sKHBheSx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCkKKmFiaV9yb3V0ZV9hZGRQb29sOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBub2RlTnVtOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gbWJyUGF5bWVudDogcGF5Cgl0eG4gR3JvdXBJbmRleAoJaW50IDEKCS0KCWR1cAoJZ3R4bnMgVHlwZUVudW0KCWludCBwYXkKCT09CgoJLy8gYXJndW1lbnQgMiAobWJyUGF5bWVudCkgZm9yIGFkZFBvb2wgbXVzdCBiZSBhIHBheSB0cmFuc2FjdGlvbgoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBhZGRQb29sKHBheSx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCkKCWNhbGxzdWIgYWRkUG9vbAoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFBvb2wobWJyUGF5bWVudDogUGF5VHhuLCB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBub2RlTnVtOiB1aW50NjQpOiBWYWxpZGF0b3JQb29sS2V5Ci8vCi8vIEFkZHMgYSBuZXcgcG9vbCB0byBhIHZhbGlkYXRvcidzIHBvb2wgc2V0LCByZXR1cm5pbmcgdGhlICdrZXknIHRvIHJlZmVyZW5jZSB0aGUgcG9vbCBpbiB0aGUgZnV0dXJlIGZvciBzdGFraW5nLCBldGMuCi8vIFRoZSBjYWxsZXIgbXVzdCBwYXkgdGhlIGNvc3Qgb2YgdGhlIHZhbGlkYXRvcnMgTUJSIGluY3JlYXNlIGFzIHdlbGwgYXMgdGhlIE1CUiB0aGF0IHdpbGwgYmUgbmVlZGVkIGZvciB0aGUgcG9vbCBpdHNlbGYuCi8vCi8vIFsgT05MWSBPV05FUiBPUiBNQU5BR0VSIENBTiBjYWxsIF0KLy8gQHBhcmFtIHtQYXlUeG59IG1iclBheW1lbnQgcGF5bWVudCBmcm9tIGNhbGxlciB3aGljaCBjb3ZlcnMgbWJyIGluY3JlYXNlIG9mIGFkZGluZyBhIG5ldyBwb29sCi8vIEBwYXJhbSB7dWludDY0fSB2YWxpZGF0b3JJZCBpcyBpZCBvZiB2YWxpZGF0b3IgdG8gcG9vbCB0byAobXVzdCBiZSBvd25lciBvciBtYW5hZ2VyKQovLyBAcGFyYW0ge3VpbnQ2NH0gbm9kZU51bSBpcyBub2RlIG51bWJlciB0byBhZGQgdG8KLy8gQHJldHVybnMge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2wga2V5IHRvIGNyZWF0ZWQgcG9vbAphZGRQb29sOgoJcHJvdG8gMyAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ0NwoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lck9yTWFuYWdlcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyT3JNYW5hZ2VyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDUwCgkvLyB2ZXJpZnlQYXlUeG4obWJyUGF5bWVudCwgeyByZWNlaXZlcjogdGhpcy5hcHAuYWRkcmVzcywgYW1vdW50OiB0aGlzLmdldE1ickFtb3VudHMoKS5hZGRQb29sTWJyIH0pCgkvLyB2ZXJpZnkgcmVjZWl2ZXIKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIFJlY2VpdmVyCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6InJlY2VpdmVyIiwiZXhwZWN0ZWQiOiJ0aGlzLmFwcC5hZGRyZXNzIn0KCWFzc2VydAoKCS8vIHZlcmlmeSBhbW91bnQKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCglleHRyYWN0IDggOAoJYnRvaQoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6ImFtb3VudCIsImV4cGVjdGVkIjoidGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkUG9vbE1iciJ9Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NTIKCS8vIGFzc2VydCh0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLmV4aXN0cywgInNwZWNpZmllZCB2YWxpZGF0b3IgaWQgaXNuJ3QgdmFsaWQiKQoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJYm94X2xlbgoJc3dhcAoJcG9wCgoJLy8gc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBpc24ndCB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDU0CgkvLyBudW1Qb29sczogdWludDY0ID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyBhcyB1aW50NjQKCWludCAyNDIKCWludCAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIG51bVBvb2xzOiB1aW50NjQKCgkvLyAqaWY5X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDU1CgkvLyAobnVtUG9vbHMgYXMgdWludDY0KSA+PSBNQVhfUE9PTFMKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWludCAyNAoJPj0KCWJ6ICppZjlfZW5kCgoJLy8gKmlmOV9jb25zZXF1ZW50CgkvLyBhbHJlYWR5IGF0IG1heCBwb29sIHNpemUKCWVycgoKKmlmOV9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NTgKCS8vIG51bVBvb2xzICs9IDEKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ2MQoJLy8gc2VuZEFwcENhbGwoewoJLy8gICAgICAgICAgICAgb25Db21wbGV0aW9uOiBPbkNvbXBsZXRpb24uTm9PcCwKCS8vICAgICAgICAgICAgIGFwcHJvdmFsUHJvZ3JhbTogWwoJLy8gICAgICAgICAgICAgICAgIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uZXh0cmFjdCgwLCA0MDk2KSwKCS8vICAgICAgICAgICAgICAgICB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLmV4dHJhY3QoNDA5NiwgdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5zaXplIC0gNDA5NiksCgkvLyAgICAgICAgICAgICBdLAoJLy8gICAgICAgICAgICAgY2xlYXJTdGF0ZVByb2dyYW06IFN0YWtpbmdQb29sLmNsZWFyUHJvZ3JhbSgpLAoJLy8gICAgICAgICAgICAgZ2xvYmFsTnVtVWludDogU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1VaW50LAoJLy8gICAgICAgICAgICAgZ2xvYmFsTnVtQnl0ZVNsaWNlOiBTdGFraW5nUG9vbC5zY2hlbWEuZ2xvYmFsLm51bUJ5dGVTbGljZSwKCS8vICAgICAgICAgICAgIGV4dHJhUHJvZ3JhbVBhZ2VzOiAzLAoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25BcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gY3JlYXRpbmdDb250cmFjdElELCB2YWxpZGF0b3JJZCwgcG9vbElkLCBtaW5FbnRyeVN0YWtlCgkvLyAgICAgICAgICAgICAgICAgbWV0aG9kKCdjcmVhdGVBcHBsaWNhdGlvbih1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCcpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodGhpcy5hcHAuaWQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodmFsaWRhdG9ySWQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IobnVtUG9vbHMgYXMgdWludDY0KSwKCS8vICAgICAgICAgICAgICAgICBpdG9iKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1pbkVudHJ5U3Rha2UpLAoJLy8gICAgICAgICAgICAgXSwKCS8vICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDYyCgkvLyBvbkNvbXBsZXRpb246IE9uQ29tcGxldGlvbi5Ob09wCglpbnQgMCAvLyBOb09wCglpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ2MwoJLy8gYXBwcm92YWxQcm9ncmFtOiBbCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5leHRyYWN0KDAsIDQwOTYpLAoJLy8gICAgICAgICAgICAgICAgIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uZXh0cmFjdCg0MDk2LCB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLnNpemUgLSA0MDk2KSwKCS8vICAgICAgICAgICAgIF0KCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWludCAwCglpbnQgNDA5NgoJYm94X2V4dHJhY3QKCWl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWludCA0MDk2CglieXRlIDB4NzA2ZjZmNmM1NDY1NmQ3MDZjNjE3NDY1NDE3MDcwNzI2Zjc2NjE2YzQyNzk3NDY1NzMgLy8gInBvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMiCglib3hfbGVuCgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLnNpemUKCWFzc2VydAoJaW50IDQwOTYKCS0KCWJveF9leHRyYWN0CglpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDY3CgkvLyBjbGVhclN0YXRlUHJvZ3JhbTogU3Rha2luZ1Bvb2wuY2xlYXJQcm9ncmFtKCkKCWJ5dGUgYjY0IEN3PT0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NjgKCS8vIGdsb2JhbE51bVVpbnQ6IFN0YWtpbmdQb29sLnNjaGVtYS5nbG9iYWwubnVtVWludAoJaW50IDExCglpdHhuX2ZpZWxkIEdsb2JhbE51bVVpbnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NjkKCS8vIGdsb2JhbE51bUJ5dGVTbGljZTogU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1CeXRlU2xpY2UKCWludCAzCglpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ3MAoJLy8gZXh0cmFQcm9ncmFtUGFnZXM6IDMKCWludCAzCglpdHhuX2ZpZWxkIEV4dHJhUHJvZ3JhbVBhZ2VzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDcxCgkvLyBhcHBsaWNhdGlvbkFyZ3M6IFsKCS8vICAgICAgICAgICAgICAgICAvLyBjcmVhdGluZ0NvbnRyYWN0SUQsIHZhbGlkYXRvcklkLCBwb29sSWQsIG1pbkVudHJ5U3Rha2UKCS8vICAgICAgICAgICAgICAgICBtZXRob2QoJ2NyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkJyksCgkvLyAgICAgICAgICAgICAgICAgaXRvYih0aGlzLmFwcC5pZCksCgkvLyAgICAgICAgICAgICAgICAgaXRvYih2YWxpZGF0b3JJZCksCgkvLyAgICAgICAgICAgICAgICAgaXRvYihudW1Qb29scyBhcyB1aW50NjQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWluRW50cnlTdGFrZSksCgkvLyAgICAgICAgICAgICBdCgltZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCXR4bmEgQXBwbGljYXRpb25zIDAKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglpbnQgMjA5CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ4MQoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyA9IG51bVBvb2xzIGFzIHVpbnQxNgoJaW50IDI0MgoJZnJhbWVfZGlnIDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoJaXRvYgoJZXh0cmFjdCA2IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDg0CgkvLyBwb29sQXBwSWQgPSB0aGlzLml0eG4uY3JlYXRlZEFwcGxpY2F0aW9uSUQuaWQKCWl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKCWZyYW1lX2J1cnkgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ4NQoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1tudW1Qb29scyAtIDFdLnBvb2xBcHBJZCA9IHBvb2xBcHBJZAoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgMCAvLyBudW1Qb29sczogdWludDY0CglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0ODYKCS8vIHRoaXMuYWRkUG9vbFRvTm9kZSh2YWxpZGF0b3JJZCwgcG9vbEFwcElkLCBub2RlTnVtKQoJZnJhbWVfZGlnIC0zIC8vIG5vZGVOdW06IHVpbnQ2NAoJZnJhbWVfZGlnIDEgLy8gcG9vbEFwcElkOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGFkZFBvb2xUb05vZGUKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0ODgKCS8vIHRoaXMucmV0aU9QX3ZhbGlkYXRvckFkZGVkUG9vbC5sb2coewoJLy8gICAgICAgICAgICAgaWQ6IHZhbGlkYXRvcklkLAoJLy8gICAgICAgICAgICAgbnVtOiBudW1Qb29scyBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKSwKCS8vICAgICAgICAgfSkKCWJ5dGUgMHhmYmNjMGY2YiAvLyByZXRpT1BfdmFsaWRhdG9yQWRkZWRQb29sKHVpbnQ2NCx1aW50MTYsdWludDY0KQoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWl0b2IKCWR1cAoJYml0bGVuCglpbnQgMTYKCTw9CgoJLy8gbnVtUG9vbHMgYXMgdWludDE2IG92ZXJmbG93ZWQgMTYgYml0cwoJYXNzZXJ0CglleHRyYWN0IDYgMgoJY29uY2F0CglmcmFtZV9kaWcgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cgljb25jYXQKCWxvZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ5NAoJLy8gcmV0dXJuIHsgaWQ6IHZhbGlkYXRvcklkLCBwb29sSWQ6IG51bVBvb2xzIGFzIHVpbnQ2NCwgcG9vbEFwcElkOiB0aGlzLml0eG4hLmNyZWF0ZWRBcHBsaWNhdGlvbklELmlkIH0KCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCglmcmFtZV9kaWcgMCAvLyBudW1Qb29sczogdWludDY0CglpdG9iCgljb25jYXQKCWl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKCWl0b2IKCWNvbmNhdAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDEKCXJldHN1YgoKLy8gYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KQoqYWJpX3JvdXRlX2FkZFN0YWtlOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gc3Rha2VkQW1vdW50UGF5bWVudDogcGF5Cgl0eG4gR3JvdXBJbmRleAoJaW50IDEKCS0KCWR1cAoJZ3R4bnMgVHlwZUVudW0KCWludCBwYXkKCT09CgoJLy8gYXJndW1lbnQgMiAoc3Rha2VkQW1vdW50UGF5bWVudCkgZm9yIGFkZFN0YWtlIG11c3QgYmUgYSBwYXkgdHJhbnNhY3Rpb24KCWFzc2VydAoKCS8vIGV4ZWN1dGUgYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBhZGRTdGFrZQoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFN0YWtlKHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4biwgdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgdmFsdWVUb1ZlcmlmeTogdWludDY0KTogVmFsaWRhdG9yUG9vbEtleQovLwovLyBBZGRzIHN0YWtlIHRvIGEgdmFsaWRhdG9yIHBvb2wuCi8vCi8vIEBwYXJhbSB7UGF5VHhufSBzdGFrZWRBbW91bnRQYXltZW50IC0gcGF5bWVudCBjb21pbmcgZnJvbSBzdGFrZXIgdG8gcGxhY2UgaW50byBhIHBvb2wKLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWx1ZVRvVmVyaWZ5IC0gb25seSBpZiB2YWxpZGF0b3IgaGFzIGdhdGluZyB0byBlbnRlciAtIHRoaXMgaXMgYXNzZXQgaWQgb3IgbmZkIGlkIHRoYXQgY29ycmVzcG9uZHMgdG8gZ2F0aW5nLgovLyBUeG4gc2VuZGVyIGlzIGZhY3RvcmVkIGluIGFzIHdlbGwgaWYgdGhhdCBpcyBwYXJ0IG9mIGdhdGluZy4KLy8gKiBAcmV0dXJucyB7VmFsaWRhdG9yUG9vbEtleX0gLSBUaGUga2V5IG9mIHRoZSB2YWxpZGF0b3IgcG9vbC4KYWRkU3Rha2U6Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA1CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTA3CgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS5leGlzdHMsICJzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGlzbid0IHZhbGlkIikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoKCS8vIHNwZWNpZmllZCB2YWxpZGF0b3IgaWQgaXNuJ3QgdmFsaWQKCWFzc2VydAoKCS8vICppZjEwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTEwCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5zdW5zZXR0aW5nT24gPiAwCglpbnQgMjI2CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWludCAwCgk+CglieiAqaWYxMF9lbmQKCgkvLyAqaWYxMF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MTIKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5zdW5zZXR0aW5nT24gPiBnbG9iYWxzLmxhdGVzdFRpbWVzdGFtcCwKCS8vICAgICAgICAgICAgICAgICAiY2FuJ3Qgc3Rha2Ugd2l0aCBhIHZhbGlkYXRvciB0aGF0IGlzIHBhc3QgaXRzIHN1bnNldHRpbmcgdGltZSIsCgkvLyAgICAgICAgICAgICApCglpbnQgMjI2CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKCT4KCgkvLyBjYW4ndCBzdGFrZSB3aXRoIGEgdmFsaWRhdG9yIHRoYXQgaXMgcGFzdCBpdHMgc3Vuc2V0dGluZyB0aW1lCglhc3NlcnQKCippZjEwX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUxOAoJLy8gc3Rha2VyID0gdGhpcy50eG4uc2VuZGVyCgl0eG4gU2VuZGVyCglmcmFtZV9idXJ5IDAgLy8gc3Rha2VyOiBhZGRyZXNzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTIyCgkvLyB2ZXJpZnlQYXlUeG4oc3Rha2VkQW1vdW50UGF5bWVudCwgewoJLy8gICAgICAgICAgICAgc2VuZGVyOiBzdGFrZXIsCgkvLyAgICAgICAgICAgICByZWNlaXZlcjogdGhpcy5hcHAuYWRkcmVzcywKCS8vICAgICAgICAgfSkKCS8vIHZlcmlmeSBzZW5kZXIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIFNlbmRlcgoJZnJhbWVfZGlnIDAgLy8gc3Rha2VyOiBhZGRyZXNzCgk9PQoKCS8vIHRyYW5zYWN0aW9uIHZlcmlmaWNhdGlvbiBmYWlsZWQ6IHsidHhuIjoic3Rha2VkQW1vdW50UGF5bWVudCIsImZpZWxkIjoic2VuZGVyIiwiZXhwZWN0ZWQiOiJzdGFrZXIifQoJYXNzZXJ0CgoJLy8gdmVyaWZ5IHJlY2VpdmVyCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBSZWNlaXZlcgoJZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCT09CgoJLy8gdHJhbnNhY3Rpb24gdmVyaWZpY2F0aW9uIGZhaWxlZDogeyJ0eG4iOiJzdGFrZWRBbW91bnRQYXltZW50IiwiZmllbGQiOiJyZWNlaXZlciIsImV4cGVjdGVkIjoidGhpcy5hcHAuYWRkcmVzcyJ9Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzAKCS8vIHRoaXMuZG9lc1N0YWtlck1lZXRHYXRpbmcodmFsaWRhdG9ySWQsIHZhbHVlVG9WZXJpZnkpCglmcmFtZV9kaWcgLTMgLy8gdmFsdWVUb1ZlcmlmeTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBkb2VzU3Rha2VyTWVldEdhdGluZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUzMgoJLy8gcmVhbEFtb3VudCA9IHN0YWtlZEFtb3VudFBheW1lbnQuYW1vdW50CglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBBbW91bnQKCWZyYW1lX2J1cnkgMSAvLyByZWFsQW1vdW50OiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzMKCS8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NCA9IDAKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gbWJyQW10TGVmdEJlaGluZDogdWludDY0CgoJLy8gKmlmMTFfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzUKCS8vIHRoaXMuZG9lc1N0YWtlck5lZWRUb1BheU1CUihzdGFrZXIpCglmcmFtZV9kaWcgMCAvLyBzdGFrZXI6IGFkZHJlc3MKCWNhbGxzdWIgZG9lc1N0YWtlck5lZWRUb1BheU1CUgoJYnogKmlmMTFfZW5kCgoJLy8gKmlmMTFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTM4CgkvLyBtYnJBbXRMZWZ0QmVoaW5kID0gdGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkU3Rha2VyTWJyCgljYWxsc3ViIGdldE1ickFtb3VudHMKCWV4dHJhY3QgMjQgOAoJYnRvaQoJZnJhbWVfYnVyeSAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUzOQoJLy8gcmVhbEFtb3VudCAtPSBtYnJBbXRMZWZ0QmVoaW5kCglmcmFtZV9kaWcgMSAvLyByZWFsQW1vdW50OiB1aW50NjQKCWZyYW1lX2RpZyAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoJLQoJZnJhbWVfYnVyeSAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU0MAoJLy8gdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikuY3JlYXRlKCkKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAwIC8vIHN0YWtlcjogYWRkcmVzcwoJY29uY2F0CglpbnQgMTQ0Cglib3hfY3JlYXRlCglwb3AKCippZjExX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU0NAoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS50b3RhbEFsZ29TdGFrZWQgKyByZWFsQW1vdW50IDwgdGhpcy5tYXhBbGxvd2VkU3Rha2UoKSwKCS8vICAgICAgICAgICAgICd0b3RhbCBzdGFrZWQgZm9yIGFsbCBvZiBhIHZhbGlkYXRvcnMgcG9vbHMgbWF5IG5vdCBleGNlZWQgaGFyZCBjYXAnLAoJLy8gICAgICAgICApCglpbnQgMjUyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoJKwoJY2FsbHN1YiBtYXhBbGxvd2VkU3Rha2UKCTwKCgkvLyB0b3RhbCBzdGFrZWQgZm9yIGFsbCBvZiBhIHZhbGlkYXRvcnMgcG9vbHMgbWF5IG5vdCBleGNlZWQgaGFyZCBjYXAKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU1MQoJLy8gZmluZFJldCA9IHRoaXMuZmluZFBvb2xGb3JTdGFrZXIodmFsaWRhdG9ySWQsIHN0YWtlciwgcmVhbEFtb3VudCkKCWZyYW1lX2RpZyAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoJZnJhbWVfZGlnIDAgLy8gc3Rha2VyOiBhZGRyZXNzCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBmaW5kUG9vbEZvclN0YWtlcgoJZnJhbWVfYnVyeSAzIC8vIGZpbmRSZXQ6ICgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NTIKCS8vIHBvb2xLZXkgPSBmaW5kUmV0WzBdCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NTMKCS8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IgPSBmaW5kUmV0WzFdCglmcmFtZV9kaWcgMyAvLyBmaW5kUmV0OiAoKHVpbnQ2NCx1aW50NjQsdWludDY0KSxib29sLGJvb2wpCglzdG9yZSAyNTUgLy8gZnVsbCBhcnJheQoJbG9hZCAyNTUgLy8gZnVsbCBhcnJheQoJaW50IDE5MgoJZ2V0Yml0CglmcmFtZV9idXJ5IDQgLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU1NAoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sID0gZmluZFJldFsyXQoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWludCAxOTMKCWdldGJpdAoJZnJhbWVfYnVyeSA1IC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoKCS8vICppZjEyX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTU1CgkvLyBwb29sS2V5LnBvb2xJZCA9PT0gMAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMAoJPT0KCWJ6ICppZjEyX2VuZAoKCS8vICppZjEyX2NvbnNlcXVlbnQKCS8vIE5vIHBvb2wgYXZhaWxhYmxlIHdpdGggZnJlZSBzdGFrZS4gIFZhbGlkYXRvciBuZWVkcyB0byBhZGQgYW5vdGhlciBwb29sCgllcnIKCippZjEyX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU2MAoJLy8gdGhpcy51cGRhdGVTdGFrZXJQb29sU2V0KHN0YWtlciwgcG9vbEtleSkKCWZyYW1lX2RpZyAzIC8vIGZpbmRSZXQ6ICgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKCXN0b3JlIDI1NSAvLyBmdWxsIGFycmF5Cglsb2FkIDI1NSAvLyBmdWxsIGFycmF5CglleHRyYWN0IDAgMjQKCWZyYW1lX2RpZyAwIC8vIHN0YWtlcjogYWRkcmVzcwoJY2FsbHN1YiB1cGRhdGVTdGFrZXJQb29sU2V0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTYzCgkvLyB0aGlzLmNhbGxQb29sQWRkU3Rha2UoCgkvLyAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LAoJLy8gICAgICAgICAgICAgcG9vbEtleSwKCS8vICAgICAgICAgICAgIG1ickFtdExlZnRCZWhpbmQsCgkvLyAgICAgICAgICAgICBpc05ld1N0YWtlclRvVmFsaWRhdG9yLAoJLy8gICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1Byb3RvY29sLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgNSAvLyBpc05ld1N0YWtlclRvUHJvdG9jb2w6IGJvb2wKCWZyYW1lX2RpZyA0IC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCWZyYW1lX2RpZyAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMCAyNAoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4bgoJY2FsbHN1YiBjYWxsUG9vbEFkZFN0YWtlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTcwCgkvLyB0aGlzLnJldGlPUF9zdGFrZUFkZGVkLmxvZyh7CgkvLyAgICAgICAgICAgICBpZDogdmFsaWRhdG9ySWQsCgkvLyAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLAoJLy8gICAgICAgICAgICAgYW1vdW50U3Rha2VkOiByZWFsQW1vdW50LAoJLy8gICAgICAgICAgICAgc3Rha2VyOiBzdGFrZXIsCgkvLyAgICAgICAgIH0pCglieXRlIDB4OTYyYjQxNDMgLy8gcmV0aU9QX3N0YWtlQWRkZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQpCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgMCAvLyBzdGFrZXI6IGFkZHJlc3MKCWNvbmNhdAoJZnJhbWVfZGlnIDEgLy8gcmVhbEFtb3VudDogdWludDY0CglpdG9iCgljb25jYXQKCWNvbmNhdAoJbG9nCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTc4CgkvLyByZXR1cm4gcG9vbEtleQoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMCAyNAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDUKCXJldHN1YgoKLy8gc2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KQoqYWJpX3JvdXRlX3NldFRva2VuUGF5b3V0UmF0aW86CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIHNldFRva2VuUGF5b3V0UmF0aW8odWludDY0KSh1aW50NjRbMjRdLHVpbnQ2NCkKCWNhbGxzdWIgc2V0VG9rZW5QYXlvdXRSYXRpbwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIHNldFRva2VuUGF5b3V0UmF0aW8odmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IFBvb2xUb2tlblBheW91dFJhdGlvCi8vCi8vIHNldFRva2VuUGF5b3V0UmF0aW8gaXMgY2FsbGVkIGJ5IFN0YWtpbmcgUG9vbCAjIDEgKE9OTFkpIHRvIGFzayB0aGUgdmFsaWRhdG9yICh1cykgdG8gY2FsY3VsYXRlIHRoZSByYXRpb3MKLy8gb2Ygc3Rha2UgaW4gdGhlIHBvb2xzIGZvciBzdWJzZXF1ZW50IHRva2VuIHBheW91dHMgKGllOiAyIHBvb2xzLCAnMTAwJyBhbGdvIHRvdGFsIHN0YWtlZCwgNjAgaW4gcG9vbCAxLCBhbmQgNDAKLy8gaW4gcG9vbCAyKSAgVGhpcyBpcyBkb25lIHNvIHdlIGhhdmUgYSBzdGFibGUgc25hcHNob3Qgb2Ygc3Rha2UgLSB0YWtlbiBvbmNlIHBlciBlcG9jaCAtIG9ubHkgdHJpZ2dlcmVkIGJ5Ci8vIHBvb2wgMSBkb2luZyBwYXlvdXQuICBwb29scyBvdGhlciB0aGFuIDEgZG9pbmcgcGF5b3V0IGNhbGwgcG9vbCAxIHRvIGFzayBpdCBkbyBpdCBmaXJzdC4KLy8gSXQgd291bGQgYmUgNjAvNDAlIGluIHRoZSBwb29sUGN0T2ZXaG9sZSB2YWx1ZXMuICBUaGUgdG9rZW4gcmV3YXJkIHBheW91dHMgdGhlbiB1c2UgdGhlc2UgdmFsdWVzIGluc3RlYWQgb2YKLy8gdGhlaXIgJ2N1cnJlbnQnIHN0YWtlIHdoaWNoIGNoYW5nZXMgYXMgcGFydCBvZiB0aGUgcGF5b3V0cyB0aGVtc2VsdmVzIChhbmQgcGVvcGxlIGNvdWxkIGJlIGNoYW5naW5nIHN0YWtlCi8vIGR1cmluZyB0aGUgZXBvY2ggdXBkYXRlcyBhY3Jvc3MgcG9vbHMpCi8vCi8vIE11bHRpcGxlIHBvb2xzIHdpbGwgY2FsbCB1cyB2aWEgcG9vbCAxIChwb29sMi0+cG9vbDEtPnZhbGlkYXRvciwgZXRjLikgc28gZG9uJ3QgYXNzZXJ0IG9uIHBvb2wxIGNhbGxpbmcgbXVsdGlwbGUKLy8gdGltZXMgaW4gc2FtZSBlcG9jaC4gIEp1c3QgcmV0dXJuLgovLwovLyBAcGFyYW0gdmFsaWRhdG9ySWQgLSB2YWxpZGF0b3IgaWQgKGFuZCB0aHVzIHBvb2wpIGNhbGxpbmcgdXMuICBWZXJpZmllZCBzbyB0aGF0IHNlbmRlciBNVVNUIGJlIHBvb2wgMSBvZiB0aGlzIHZhbGlkYXRvci4KLy8gQHJldHVybnMgUG9vbFRva2VuUGF5b3V0UmF0aW8gLSB0aGUgZmluaXNoZWQgcmF0aW8gZGF0YQpzZXRUb2tlblBheW91dFJhdGlvOgoJcHJvdG8gMSAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gOAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU5OAoJLy8gcG9vbDFBcHBJRCA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkCglpbnQgMjY4CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMCAvLyBwb29sMUFwcElEOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1OTkKCS8vIGFzc2VydChwb29sMUFwcElEICE9PSAwKQoJZnJhbWVfZGlnIDAgLy8gcG9vbDFBcHBJRDogdWludDY0CglpbnQgMAoJIT0KCWFzc2VydAoKCS8vICppZjEzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjAxCgkvLyB0aGlzLnR4bi5zZW5kZXIgIT09IEFwcElELmZyb21VaW50NjQocG9vbDFBcHBJRCkuYWRkcmVzcwoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIDAgLy8gcG9vbDFBcHBJRDogdWludDY0CglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCSE9CglieiAqaWYxM19lbmQKCgkvLyAqaWYxM19jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MDIKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWIgKnNldFRva2VuUGF5b3V0UmF0aW8qcmV0dXJuCgoqaWYxM19lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MDgKCS8vIGN1clJvdW5kID0gZ2xvYmFscy5yb3VuZAoJZ2xvYmFsIFJvdW5kCglmcmFtZV9idXJ5IDEgLy8gY3VyUm91bmQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYwOQoJLy8gbGFzdFBheW91dFVwZGF0ZSA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUudG9rZW5QYXlvdXRSYXRpby51cGRhdGVkRm9yUGF5b3V0CglpbnQgODkyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCgkvLyAqaWYxNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYxMAoJLy8gbGFzdFBheW91dFVwZGF0ZSAhPT0gMAoJZnJhbWVfZGlnIDIgLy8gbGFzdFBheW91dFVwZGF0ZTogdWludDY0CglpbnQgMAoJIT0KCWJ6ICppZjE0X2VuZAoKCS8vICppZjE0X2NvbnNlcXVlbnQKCS8vICppZjE1X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjEyCgkvLyAoQXBwSUQuZnJvbVVpbnQ2NChwb29sMUFwcElEKS5nbG9iYWxTdGF0ZSgnbGFzdFBheW91dCcpIGFzIHVpbnQ2NCkgPT09IGxhc3RQYXlvdXRVcGRhdGUKCWZyYW1lX2RpZyAwIC8vIHBvb2wxQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDZjNjE3Mzc0NTA2MTc5NmY3NTc0IC8vICJsYXN0UGF5b3V0IgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQocG9vbDFBcHBJRCkuZ2xvYmFsU3RhdGUoJ2xhc3RQYXlvdXQnKQoJYXNzZXJ0CglmcmFtZV9kaWcgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCT09CglieiAqaWYxNV9lbmQKCgkvLyAqaWYxNV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MTMKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWIgKnNldFRva2VuUGF5b3V0UmF0aW8qcmV0dXJuCgoqaWYxNV9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MTUKCS8vIGVwb2NoUm91bmRMZW5ndGggPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lcG9jaFJvdW5kTGVuZ3RoIGFzIHVpbnQ2NAoJaW50IDE2OQoJaW50IDQKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDMgLy8gZXBvY2hSb3VuZExlbmd0aDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjE2CgkvLyB0aGlzRXBvY2hCZWdpbiA9IGN1clJvdW5kIC0gKGN1clJvdW5kICUgZXBvY2hSb3VuZExlbmd0aCkKCWZyYW1lX2RpZyAxIC8vIGN1clJvdW5kOiB1aW50NjQKCWZyYW1lX2RpZyAxIC8vIGN1clJvdW5kOiB1aW50NjQKCWZyYW1lX2RpZyAzIC8vIGVwb2NoUm91bmRMZW5ndGg6IHVpbnQ2NAoJJQoJLQoJZnJhbWVfYnVyeSA0IC8vIHRoaXNFcG9jaEJlZ2luOiB1aW50NjQKCgkvLyAqaWYxNl9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYxOAoJLy8gbGFzdFBheW91dFVwZGF0ZSAtIChsYXN0UGF5b3V0VXBkYXRlICUgZXBvY2hSb3VuZExlbmd0aCkgPT09IHRoaXNFcG9jaEJlZ2luCglmcmFtZV9kaWcgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCWZyYW1lX2RpZyAyIC8vIGxhc3RQYXlvdXRVcGRhdGU6IHVpbnQ2NAoJZnJhbWVfZGlnIDMgLy8gZXBvY2hSb3VuZExlbmd0aDogdWludDY0CgklCgktCglmcmFtZV9kaWcgNCAvLyB0aGlzRXBvY2hCZWdpbjogdWludDY0Cgk9PQoJYnogKmlmMTZfZW5kCgoJLy8gKmlmMTZfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjE5CgkvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS50b2tlblBheW91dFJhdGlvCglpbnQgNzAwIC8vIGhlYWRPZmZzZXQKCWludCAyMDAKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CgliICpzZXRUb2tlblBheW91dFJhdGlvKnJldHVybgoKKmlmMTZfZW5kOgoKKmlmMTRfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjIyCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8udXBkYXRlZEZvclBheW91dCA9IGN1clJvdW5kCglpbnQgODkyCglmcmFtZV9kaWcgMSAvLyBjdXJSb3VuZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYyNAoJLy8gY3VyTnVtUG9vbHMgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnN0YXRlLm51bVBvb2xzIGFzIHVpbnQ2NAoJaW50IDI0MgoJaW50IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDUgLy8gY3VyTnVtUG9vbHM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYyNQoJLy8gdG90YWxTdGFrZUZvclZhbGlkYXRvciA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUudG90YWxBbGdvU3Rha2VkCglpbnQgMjUyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgNiAvLyB0b3RhbFN0YWtlRm9yVmFsaWRhdG9yOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MjYKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgY3VyTnVtUG9vbHM7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDcgLy8gaTogdWludDY0CgoqZm9yXzI6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MjYKCS8vIGkgPCBjdXJOdW1Qb29scwoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglmcmFtZV9kaWcgNSAvLyBjdXJOdW1Qb29sczogdWludDY0Cgk8CglieiAqZm9yXzJfZW5kCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjMxCgkvLyBvdXJQb29sUGN0T2ZXaG9sZSA9IHdpZGVSYXRpbygKCS8vICAgICAgICAgICAgICAgICBbdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1tpXS50b3RhbEFsZ29TdGFrZWQsIDFfMDAwXzAwMF0sCgkvLyAgICAgICAgICAgICAgICAgW3RvdGFsU3Rha2VGb3JWYWxpZGF0b3JdLAoJLy8gICAgICAgICAgICAgKQoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglpbnQgMV8wMDBfMDAwCgltdWx3CglpbnQgMAoJZnJhbWVfZGlnIDYgLy8gdG90YWxTdGFrZUZvclZhbGlkYXRvcjogdWludDY0CglkaXZtb2R3Cglwb3AKCXBvcAoJc3dhcAoJIQoKCS8vIHdpZGVSYXRpbyBmYWlsZWQKCWFzc2VydAoJZnJhbWVfYnVyeSA4IC8vIG91clBvb2xQY3RPZldob2xlOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MzUKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUudG9rZW5QYXlvdXRSYXRpby5wb29sUGN0T2ZXaG9sZVtpXSA9IG91clBvb2xQY3RPZldob2xlCglpbnQgNzAwCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWZyYW1lX2RpZyA4IC8vIG91clBvb2xQY3RPZldob2xlOiB1aW50NjQKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoqZm9yXzJfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MjYKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSA3IC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzIKCipmb3JfMl9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MzcKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCipzZXRUb2tlblBheW91dFJhdGlvKnJldHVybjoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDgKCXJldHN1YgoKLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcygodWludDY0LHVpbnQ2NCx1aW50NjQpLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkCiphYmlfcm91dGVfc3Rha2VVcGRhdGVkVmlhUmV3YXJkczoKCS8vIHNhdHVyYXRlZEJ1cm5Ub0ZlZVNpbms6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQoJYnRvaQoKCS8vIHZhbGlkYXRvckNvbW1pc3Npb246IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAoJYnRvaQoKCS8vIHJld2FyZFRva2VuQW1vdW50UmVzZXJ2ZWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwoJYnRvaQoKCS8vIGFsZ29Ub0FkZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglidG9pCgoJLy8gcG9vbEtleTogKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZHVwCglsZW4KCWludCAyNAoJPT0KCgkvLyBhcmd1bWVudCA0IChwb29sS2V5KSBmb3Igc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyBtdXN0IGJlIGEgKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBzdGFrZVVwZGF0ZWRWaWFSZXdhcmRzKCh1aW50NjQsdWludDY0LHVpbnQ2NCksdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKCWNhbGxzdWIgc3Rha2VVcGRhdGVkVmlhUmV3YXJkcwoJaW50IDEKCXJldHVybgoKLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyhwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5LCBhbGdvVG9BZGQ6IHVpbnQ2NCwgcmV3YXJkVG9rZW5BbW91bnRSZXNlcnZlZDogdWludDY0LCB2YWxpZGF0b3JDb21taXNzaW9uOiB1aW50NjQsIHNhdHVyYXRlZEJ1cm5Ub0ZlZVNpbms6IHVpbnQ2NCk6IHZvaWQKLy8KLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyBpcyBjYWxsZWQgYnkgU3Rha2luZyBwb29scyB0byBpbmZvcm0gdGhlIHZhbGlkYXRvciAodXMpIHRoYXQgYSBwYXJ0aWN1bGFyIGFtb3VudCBvZiB0b3RhbAovLyBzdGFrZSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgc3BlY2lmaWVkIHBvb2wuICBUaGlzIGlzIHVzZWQgdG8gdXBkYXRlIHRoZSBzdGF0cyB3ZSBoYXZlIGluIG91ciBQb29sSW5mbyBzdG9yYWdlLgovLyBUaGUgY2FsbGluZyBBcHAgaWQgaXMgdmFsaWRhdGVkIGFnYWluc3Qgb3VyIHBvb2wgbGlzdCBhcyB3ZWxsLgovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBWYWxpZGF0b3JQb29sS2V5IHR5cGUKLy8gQHBhcmFtIHt1aW50NjR9IGFsZ29Ub0FkZCAtIGFtb3VudCB0aGlzIHZhbGlkYXRvcidzIHRvdGFsIHN0YWtlIGluY3JlYXNlZCB2aWEgcmV3YXJkcwovLyBAcGFyYW0ge3VpbnQ2NH0gcmV3YXJkVG9rZW5BbW91bnRSZXNlcnZlZCAtIGFtb3VudCB0aGlzIHZhbGlkYXRvcidzIHRvdGFsIHN0YWtlIGluY3JlYXNlZCB2aWEgcmV3YXJkcyAodGhhdCBzaG91bGQgYmUKLy8gQHBhcmFtIHt1aW50NjR9IHZhbGlkYXRvckNvbW1pc3Npb24gLSB0aGUgY29tbWlzc2lvbiBhbW91bnQgdGhlIHZhbGlkYXRvciB3YXMgcGFpZCwgaWYgYW55Ci8vIEBwYXJhbSB7dWludDY0fSBzYXR1cmF0ZWRCdXJuVG9GZWVTaW5rIC0gaWYgdGhlIHBvb2wgd2FzIGluIHNhdHVyYXRlZCBzdGF0ZSwgdGhlIGFtb3VudCBzZW50IGJhY2sgdG8gdGhlIGZlZSBzaW5rLgovLyBzZWVuIGFzICdhY2NvdW50ZWQgZm9yL3BlbmRpbmcgc3BlbnQnKQpzdGFrZVVwZGF0ZWRWaWFSZXdhcmRzOgoJcHJvdG8gNSAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjU4CgkvLyB0aGlzLnZlcmlmeVBvb2xLZXlDYWxsZXIocG9vbEtleSkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CgljYWxsc3ViIHZlcmlmeVBvb2xLZXlDYWxsZXIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NjEKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCArPSBhbGdvVG9BZGQKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAxMCAvLyBoZWFkT2Zmc2V0CgkrCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NjIKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS50b3RhbEFsZ29TdGFrZWQgKz0gYWxnb1RvQWRkCglpbnQgMjUyCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMiAvLyBhbGdvVG9BZGQ6IHVpbnQ2NAoJKwoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjYzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUucmV3YXJkVG9rZW5IZWxkQmFjayArPSByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkCglpbnQgMjYwCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkOiB1aW50NjQKCSsKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY2NQoJLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgKz0gYWxnb1RvQWRkCglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglhcHBfZ2xvYmFsX2dldAoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CgkrCglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglzd2FwCglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY2OAoJLy8gdGhpcy5yZXZlcmlmeU5GRE93bmVyc2hpcChwb29sS2V5LmlkKQoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCgljYWxsc3ViIHJldmVyaWZ5TkZET3duZXJzaGlwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjcwCgkvLyB0aGlzLnJldGlPUF9lcG9jaFJld2FyZFVwZGF0ZS5sb2coewoJLy8gICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLAoJLy8gICAgICAgICAgICAgYWxnb0FkZGVkOiBhbGdvVG9BZGQsCgkvLyAgICAgICAgICAgICByZXdhcmRUb2tlbkhlbGRCYWNrOiByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkLAoJLy8gICAgICAgICAgICAgc2F0dXJhdGVkQnVyblRvRmVlU2luazogc2F0dXJhdGVkQnVyblRvRmVlU2luaywKCS8vICAgICAgICAgICAgIHZhbGlkYXRvckNvbW1pc3Npb246IHZhbGlkYXRvckNvbW1pc3Npb24sCgkvLyAgICAgICAgIH0pCglieXRlIDB4YjNlNDdjM2QgLy8gcmV0aU9QX2Vwb2NoUmV3YXJkVXBkYXRlKHVpbnQ2NCx1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTQgLy8gdmFsaWRhdG9yQ29tbWlzc2lvbjogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtNSAvLyBzYXR1cmF0ZWRCdXJuVG9GZWVTaW5rOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY29uY2F0Cglsb2cKCXJldHN1YgoKLy8gc3Rha2VSZW1vdmVkKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wpdm9pZAoqYWJpX3JvdXRlX3N0YWtlUmVtb3ZlZDoKCS8vIHN0YWtlclJlbW92ZWQ6IGJvb2wKCXR4bmEgQXBwbGljYXRpb25BcmdzIDUKCWR1cAoJbGVuCglpbnQgMQoJPT0KCgkvLyBhcmd1bWVudCAwIChzdGFrZXJSZW1vdmVkKSBmb3Igc3Rha2VSZW1vdmVkIG11c3QgYmUgYSBib29sCglhc3NlcnQKCWludCAwCglnZXRiaXQKCgkvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDQKCWJ0b2kKCgkvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDMKCWJ0b2kKCgkvLyBzdGFrZXI6IGFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMzIKCT09CgoJLy8gYXJndW1lbnQgMyAoc3Rha2VyKSBmb3Igc3Rha2VSZW1vdmVkIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBwb29sS2V5OiAodWludDY0LHVpbnQ2NCx1aW50NjQpCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDI0Cgk9PQoKCS8vIGFyZ3VtZW50IDQgKHBvb2xLZXkpIGZvciBzdGFrZVJlbW92ZWQgbXVzdCBiZSBhICh1aW50NjQsdWludDY0LHVpbnQ2NCkKCWFzc2VydAoKCS8vIGV4ZWN1dGUgc3Rha2VSZW1vdmVkKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wpdm9pZAoJY2FsbHN1YiBzdGFrZVJlbW92ZWQKCWludCAxCglyZXR1cm4KCi8vIHN0YWtlUmVtb3ZlZChwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5LCBzdGFrZXI6IEFkZHJlc3MsIGFtb3VudFJlbW92ZWQ6IHVpbnQ2NCwgcmV3YXJkUmVtb3ZlZDogdWludDY0LCBzdGFrZXJSZW1vdmVkOiBib29sZWFuKTogdm9pZAovLwovLyBzdGFrZVJlbW92ZWQgaXMgY2FsbGVkIGJ5IFN0YWtpbmcgcG9vbHMgdG8gaW5mb3JtIHRoZSB2YWxpZGF0b3IgKHVzKSB0aGF0IGEgcGFydGljdWxhciBhbW91bnQgb2YgdG90YWwgc3Rha2UgaGFzIGJlZW4gcmVtb3ZlZAovLyBmcm9tIHRoZSBzcGVjaWZpZWQgcG9vbC4gIFRoaXMgaXMgdXNlZCB0byB1cGRhdGUgdGhlIHN0YXRzIHdlIGhhdmUgaW4gb3VyIFBvb2xJbmZvIHN0b3JhZ2UuCi8vIElmIGFueSBhbW91bnQgb2YgcmV3YXJkUmVtb3ZlZCBpcyBzcGVjaWZpZWQsIHRoZW4gdGhhdCBhbW91bnQgb2YgcmV3YXJkIGlzIHNlbnQgdG8gdGhlIHVzZQovLyBUaGUgY2FsbGluZyBBcHAgaWQgaXMgdmFsaWRhdGVkIGFnYWluc3Qgb3VyIHBvb2wgbGlzdCBhcyB3ZWxsLgovLwovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgY2FsbGluZyB1cyBmcm9tIHdoaWNoIHN0YWtlIHdhcyByZW1vdmVkCi8vIEBwYXJhbSB7QWRkcmVzc30gc3Rha2VyCi8vIEBwYXJhbSB7dWludDY0fSBhbW91bnRSZW1vdmVkIC0gYWxnbyBhbW91bnQgcmVtb3ZlZAovLyBAcGFyYW0ge3VpbnQ2NH0gcmV3YXJkUmVtb3ZlZCAtIGlmIGFwcGxpY2FibGUsIGFtb3VudCBvZiB0b2tlbiByZXdhcmQgcmVtb3ZlZCAoYnkgcG9vbCAxIGNhbGxlcikgb3IgVE8gcmVtb3ZlIGFuZCBwYXkgb3V0ICh2aWEgcG9vbCAxIGZyb20gZGlmZmVyZW50IHBvb2wgY2FsbGVyKQovLyBAcGFyYW0ge2Jvb2xlYW59IHN0YWtlclJlbW92ZWQKc3Rha2VSZW1vdmVkOgoJcHJvdG8gNSAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMwoKCS8vICppZjE3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzAwCgkvLyBnbG9iYWxzLm9wY29kZUJ1ZGdldCA8IDMwMAoJZ2xvYmFsIE9wY29kZUJ1ZGdldAoJaW50IDMwMAoJPAoJYnogKmlmMTdfZW5kCgoJLy8gKmlmMTdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzAxCgkvLyBpbmNyZWFzZU9wY29kZUJ1ZGdldCgpCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJaW50IDAKCWl0eG5fZmllbGQgRmVlCglieXRlIGI2NCBDb0VCIC8vICNwcmFnbWEgdmVyc2lvbiAxMDsgaW50IDEKCWR1cAoJaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCWludCBEZWxldGVBcHBsaWNhdGlvbgoJaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KCWl0eG5fc3VibWl0CgoqaWYxN19lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MDMKCS8vIHRoaXMudmVyaWZ5UG9vbEtleUNhbGxlcihwb29sS2V5KQoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWNhbGxzdWIgdmVyaWZ5UG9vbEtleUNhbGxlcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcwNwoJLy8gYXNzZXJ0KGFtb3VudFJlbW92ZWQgPiAwIHx8IHJld2FyZFJlbW92ZWQgPiAwLCAnc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGFsZ28gb3IgcmV3YXJkIHdhcyByZW1vdmVkJykKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWludCAwCgk+CglkdXAKCWJueiAqc2tpcF9vcjIKCWZyYW1lX2RpZyAtNCAvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCWludCAwCgk+Cgl8fAoKKnNraXBfb3IyOgoJLy8gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGFsZ28gb3IgcmV3YXJkIHdhcyByZW1vdmVkCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MTAKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCAtPSBhbW91bnRSZW1vdmVkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxMQoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsQWxnb1N0YWtlZCAtPSBhbW91bnRSZW1vdmVkCglpbnQgMjUyCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxMgoJLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgLT0gYW1vdW50UmVtb3ZlZAoJYnl0ZSAweDczNzQ2MTZiNjU2NCAvLyAic3Rha2VkIgoJYXBwX2dsb2JhbF9nZXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCXN3YXAKCWFwcF9nbG9iYWxfcHV0CgoJLy8gKmlmMThfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MTQKCS8vIHJld2FyZFJlbW92ZWQgPiAwCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CglpbnQgMAoJPgoJYnogKmlmMThfZWxzZQoKCS8vICppZjE4X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxNQoJLy8gcmV3YXJkVG9rZW5JRCA9IHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5jb25maWcucmV3YXJkVG9rZW5JZAoJaW50IDE1MwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIHJld2FyZFRva2VuSUQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxNgoJLy8gYXNzZXJ0KHJld2FyZFRva2VuSUQgIT09IDAsICJyZXdhcmRSZW1vdmVkIGNhbid0IGJlIHNldCBpZiB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIHJld2FyZCB0b2tlbiEiKQoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JRDogdWludDY0CglpbnQgMAoJIT0KCgkvLyByZXdhcmRSZW1vdmVkIGNhbid0IGJlIHNldCBpZiB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIHJld2FyZCB0b2tlbiEKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxNwoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS5yZXdhcmRUb2tlbkhlbGRCYWNrID49IHJld2FyZFJlbW92ZWQsCgkvLyAgICAgICAgICAgICAgICAgJ3Jld2FyZCBiZWluZyByZW1vdmVkIG11c3QgYmUgY292ZXJlZCBieSBob2xkIGJhY2sgYW1vdW50JywKCS8vICAgICAgICAgICAgICkKCWludCAyNjAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtNCAvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCT49CgoJLy8gcmV3YXJkIGJlaW5nIHJlbW92ZWQgbXVzdCBiZSBjb3ZlcmVkIGJ5IGhvbGQgYmFjayBhbW91bnQKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyMwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnJld2FyZFRva2VuSGVsZEJhY2sgLT0gcmV3YXJkUmVtb3ZlZAoJaW50IDI2MAoJZHVwCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CgktCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyAqaWYxOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyOAoJLy8gcG9vbEtleS5wb29sSWQgIT09IDEKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCSE9CglieiAqaWYxOV9lbmQKCgkvLyAqaWYxOV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MjkKCS8vIHNlbmRNZXRob2RDYWxsPHR5cGVvZiBTdGFraW5nUG9vbC5wcm90b3R5cGUucGF5VG9rZW5SZXdhcmQ+KHsKCS8vICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRDogQXBwSUQuZnJvbVVpbnQ2NCh0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJnczogW3N0YWtlciwgcmV3YXJkVG9rZW5JRCwgcmV3YXJkUmVtb3ZlZF0sCgkvLyAgICAgICAgICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgltZXRob2QgInBheVRva2VuUmV3YXJkKGFkZHJlc3MsdWludDY0LHVpbnQ2NCl2b2lkIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MzAKCS8vIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQodGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzWzBdLnBvb2xBcHBJZCkKCWludCAyNjgKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczMQoJLy8gbWV0aG9kQXJnczogW3N0YWtlciwgcmV3YXJkVG9rZW5JRCwgcmV3YXJkUmVtb3ZlZF0KCWZyYW1lX2RpZyAtMiAvLyBzdGFrZXI6IEFkZHJlc3MKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklEOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCippZjE5X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczNAoJLy8gdGhpcy5yZXRpT1Bfc3Rha2VSZW1vdmVkLmxvZyh7CgkvLyAgICAgICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICAgICAgcG9vbE51bTogcG9vbEtleS5wb29sSWQgYXMgdWludDE2LAoJLy8gICAgICAgICAgICAgICAgIHBvb2xBcHBJZDogQXBwSUQuZnJvbVVpbnQ2NChwb29sS2V5LnBvb2xBcHBJZCksCgkvLyAgICAgICAgICAgICAgICAgc3Rha2VyOiBzdGFrZXIsCgkvLyAgICAgICAgICAgICAgICAgYW1vdW50VW5zdGFrZWQ6IGFtb3VudFJlbW92ZWQsCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5Bc3NldElkOiBBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JRCksCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5zUmVjZWl2ZWQ6IHJld2FyZFJlbW92ZWQsCgkvLyAgICAgICAgICAgICB9KQoJYnl0ZSAweDEyZjRiZDRiIC8vIHJldGlPUF9zdGFrZVJlbW92ZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTIgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC00IC8vIHJld2FyZFJlbW92ZWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklEOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWIgKmlmMThfZW5kCgoqaWYxOF9lbHNlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzQ0CgkvLyB0aGlzLnJldGlPUF9zdGFrZVJlbW92ZWQubG9nKHsKCS8vICAgICAgICAgICAgICAgICBpZDogcG9vbEtleS5pZCwKCS8vICAgICAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICAgICAgcG9vbEFwcElkOiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICBzdGFrZXI6IHN0YWtlciwKCS8vICAgICAgICAgICAgICAgICBhbW91bnRVbnN0YWtlZDogYW1vdW50UmVtb3ZlZCwKCS8vICAgICAgICAgICAgICAgICAvLyBubyB0b2tlbnMgcmV3YXJkZWQuLgoJLy8gICAgICAgICAgICAgICAgIHJld2FyZFRva2VuQXNzZXRJZDogQXNzZXRJRC56ZXJvSW5kZXgsCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5zUmVjZWl2ZWQ6IDAsCgkvLyAgICAgICAgICAgICB9KQoJYnl0ZSAweDEyZjRiZDRiIC8vIHJldGlPUF9zdGFrZVJlbW92ZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTIgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAKCWNvbmNhdAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCippZjE4X2VuZDoKCS8vICppZjIwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzU2CgkvLyBzdGFrZXJSZW1vdmVkCglmcmFtZV9kaWcgLTUgLy8gc3Rha2VyUmVtb3ZlZDogYm9vbGVhbgoJYnogKmlmMjBfZW5kCgoJLy8gKmlmMjBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzU4CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbcG9vbEtleS5wb29sSWQgLSAxXS50b3RhbFN0YWtlcnMgLT0gMQoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJaW50IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDEKCS0KCWl0b2IKCWV4dHJhY3QgNiAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NjAKCS8vIHJlbW92ZVJldCA9IHRoaXMucmVtb3ZlRnJvbVN0YWtlclBvb2xTZXQoc3Rha2VyLCA8VmFsaWRhdG9yUG9vbEtleT57CgkvLyAgICAgICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICAgICAgcG9vbElkOiBwb29sS2V5LnBvb2xJZCwKCS8vICAgICAgICAgICAgICAgICBwb29sQXBwSWQ6IHBvb2xLZXkucG9vbEFwcElkLAoJLy8gICAgICAgICAgICAgfSkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY2FsbHN1YiByZW1vdmVGcm9tU3Rha2VyUG9vbFNldAoJZnJhbWVfYnVyeSAxIC8vIHJlbW92ZVJldDogKGJvb2wsYm9vbCkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NjUKCS8vIHN0YWtlck91dE9mVGhpc1ZhbGlkYXRvciA9IHJlbW92ZVJldFswXQoJZnJhbWVfZGlnIDEgLy8gcmVtb3ZlUmV0OiAoYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWludCAwCglnZXRiaXQKCWZyYW1lX2J1cnkgMiAvLyBzdGFrZXJPdXRPZlRoaXNWYWxpZGF0b3I6IGJvb2wKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NjYKCS8vIHN0YWtlck91dE9mUHJvdG9jb2wgPSByZW1vdmVSZXRbMV0KCWZyYW1lX2RpZyAxIC8vIHJlbW92ZVJldDogKGJvb2wsYm9vbCkKCXN0b3JlIDI1NSAvLyBmdWxsIGFycmF5Cglsb2FkIDI1NSAvLyBmdWxsIGFycmF5CglpbnQgMQoJZ2V0Yml0CglmcmFtZV9idXJ5IDMgLy8gc3Rha2VyT3V0T2ZQcm90b2NvbDogYm9vbAoKCS8vICppZjIxX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzY4CgkvLyBzdGFrZXJPdXRPZlRoaXNWYWxpZGF0b3IKCWZyYW1lX2RpZyAyIC8vIHN0YWtlck91dE9mVGhpc1ZhbGlkYXRvcjogYm9vbAoJYnogKmlmMjFfZW5kCgoJLy8gKmlmMjFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzY5CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUudG90YWxTdGFrZXJzIC09IDEKCWludCAyNDQKCWR1cAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDEKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKKmlmMjFfZW5kOgoJLy8gKmlmMjJfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NzIKCS8vIHN0YWtlck91dE9mUHJvdG9jb2wKCWZyYW1lX2RpZyAzIC8vIHN0YWtlck91dE9mUHJvdG9jb2w6IGJvb2wKCWJ6ICppZjIyX2VuZAoKCS8vICppZjIyX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc3MwoJLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlIC09IDEKCWJ5dGUgMHg2ZTc1NmQ1Mzc0NjE2YjY1NzI3MyAvLyAibnVtU3Rha2VycyIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMQoJLQoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJc3dhcAoJYXBwX2dsb2JhbF9wdXQKCippZjIyX2VuZDoKCippZjIwX2VuZDoKCXJldHN1YgoKLy8gZmluZFBvb2xGb3JTdGFrZXIodWludDY0LGFkZHJlc3MsdWludDY0KSgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKKmFiaV9yb3V0ZV9maW5kUG9vbEZvclN0YWtlcjoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gYW1vdW50VG9TdGFrZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglidG9pCgoJLy8gc3Rha2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDEgKHN0YWtlcikgZm9yIGZpbmRQb29sRm9yU3Rha2VyIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBmaW5kUG9vbEZvclN0YWtlcih1aW50NjQsYWRkcmVzcyx1aW50NjQpKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJY2FsbHN1YiBmaW5kUG9vbEZvclN0YWtlcgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGZpbmRQb29sRm9yU3Rha2VyKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIHN0YWtlcjogQWRkcmVzcywgYW1vdW50VG9TdGFrZTogdWludDY0KTogW1ZhbGlkYXRvclBvb2xLZXksIGJvb2xlYW4sIGJvb2xlYW5dCi8vCi8vIEZpbmRzIHRoZSBwb29sIGZvciBhIHN0YWtlciBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgdmFsaWRhdG9yIGlkLCBzdGFrZXIgYWRkcmVzcywgYW5kIGFtb3VudCB0byBzdGFrZS4KLy8gRmlyc3QgY2hlY2tzIHRoZSBzdGFrZXJzICdhbHJlYWR5IHN0YWtlZCBsaXN0JyBmb3IgdGhlIHZhbGlkYXRvciBwcmVmZXJyaW5nIHRob3NlIChhZGRpbmcgaWYgcG9zc2libGUpIHRoZW4gYWRkcwovLyB0byBuZXcgcG9vbCBpZiBuZWNlc3NhcnkuCi8vCi8vIEBwYXJhbSB7VmFsaWRhdG9ySWRUeXBlfSB2YWxpZGF0b3JJZCAtIFRoZSBpZCBvZiB0aGUgdmFsaWRhdG9yLgovLyBAcGFyYW0ge0FkZHJlc3N9IHN0YWtlciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzdGFrZXIuCi8vIEBwYXJhbSB7dWludDY0fSBhbW91bnRUb1N0YWtlIC0gVGhlIGFtb3VudCB0byBzdGFrZS4KLy8gQHJldHVybnMge1ZhbGlkYXRvclBvb2xLZXksIGJvb2xlYW4sIGJvb2xlYW59IC0gVGhlIHBvb2wgZm9yIHRoZSBzdGFrZXIsIHRydWUvZmFsc2Ugb24gd2hldGhlciB0aGUgc3Rha2VyIGlzICduZXcnCi8vIHRvIHRoaXMgVkFMSURBVE9SLCBhbmQgdHJ1ZS9mYWxzZSBpZiBzdGFrZXIgaXMgbmV3IHRvIHRoZSBwcm90b2NvbC4KZmluZFBvb2xGb3JTdGFrZXI6Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA3CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Nzk0CgkvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yID0gdHJ1ZQoJaW50IDEKCWZyYW1lX2J1cnkgMCAvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yOiBib29sCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Nzk1CgkvLyBpc05ld1N0YWtlclRvUHJvdG9jb2wgPSB0cnVlCglpbnQgMQoJZnJhbWVfYnVyeSAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgwMwoJLy8gbWF4UGVyUG9vbCA9IHRoaXMuZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sCglmcmFtZV9idXJ5IDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoJLy8gKmlmMjNfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MDYKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLmV4aXN0cwoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfbGVuCglzd2FwCglwb3AKCWJ6ICppZjIzX2VuZAoKCS8vICppZjIzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgwNwoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgwOAoJLy8gYXNzZXJ0KHZhbGlkYXRvcklkICE9PSAwKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWludCAwCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODA5CgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IHBvb2xTZXQubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoKKmZvcl8zOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODA5CgkvLyBpIDwgcG9vbFNldC5sZW5ndGgKCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDYKCTwKCWJ6ICpmb3JfM19lbmQKCgkvLyAqaWYyNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxMAoJLy8gZ2xvYmFscy5vcGNvZGVCdWRnZXQgPCAzMDAKCWdsb2JhbCBPcGNvZGVCdWRnZXQKCWludCAzMDAKCTwKCWJ6ICppZjI0X2VuZAoKCS8vICppZjI0X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxMQoJLy8gaW5jcmVhc2VPcGNvZGVCdWRnZXQoKQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCWludCAwCglpdHhuX2ZpZWxkIEZlZQoJYnl0ZSBiNjQgQ29FQiAvLyAjcHJhZ21hIHZlcnNpb24gMTA7IGludCAxCglkdXAKCWl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCglpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCglpbnQgRGVsZXRlQXBwbGljYXRpb24KCWl0eG5fZmllbGQgT25Db21wbGV0aW9uCglpdHhuX3N1Ym1pdAoKKmlmMjRfZW5kOgoJLy8gKmlmMjVfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MTMKCS8vIHBvb2xTZXRbaV0uaWQgPT09IDAKCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgk9PQoJYnogKmlmMjVfZW5kCgoJLy8gKmlmMjVfY29uc2VxdWVudAoJYiAqZm9yXzNfY29udGludWUKCippZjI1X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxNgoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sID0gZmFsc2UKCWludCAwCglmcmFtZV9idXJ5IDEgLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sCgoJLy8gKmlmMjZfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MTcKCS8vIHBvb2xTZXRbaV0uaWQgPT09IHZhbGlkYXRvcklkCglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgMAoJKwoJaW50IDgKCWV4dHJhY3QzCglidG9pCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJPT0KCWJ6ICppZjI2X2VuZAoKCS8vICppZjI2X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxOQoJLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciA9IGZhbHNlCglpbnQgMAoJZnJhbWVfYnVyeSAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCgkvLyAqaWYyN19jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyMQoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1twb29sU2V0W2ldLnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCArCgkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50VG9TdGFrZSA8PQoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4UGVyUG9vbAoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgOCAvLyBoZWFkT2Zmc2V0CgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJKwoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8PQoJYnogKmlmMjdfZW5kCgoJLy8gKmlmMjdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODI1CgkvLyByZXR1cm4gW3Bvb2xTZXRbaV0sIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IsIGlzTmV3U3Rha2VyVG9Qcm90b2NvbF0KCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWJ5dGUgMHgwMAoJaW50IDAKCWZyYW1lX2RpZyAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCXNldGJpdAoJaW50IDEKCWZyYW1lX2RpZyAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoJc2V0Yml0Cgljb25jYXQKCWIgKmZpbmRQb29sRm9yU3Rha2VyKnJldHVybgoKKmlmMjdfZW5kOgoKKmlmMjZfZW5kOgoKKmZvcl8zX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODA5CgkvLyBpICs9IDEKCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgNCAvLyBpOiB1aW50NjQKCWIgKmZvcl8zCgoqZm9yXzNfZW5kOgoKKmlmMjNfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODMyCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBhbW91bnRUb1N0YWtlID49IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1pbkVudHJ5U3Rha2UsCgkvLyAgICAgICAgICAgICAnbXVzdCBzdGFrZSBhdCBsZWFzdCB0aGUgbWluaW11bSBmb3IgdGhpcyBwb29sJywKCS8vICAgICAgICAgKQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJaW50IDIwOQoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk+PQoKCS8vIG11c3Qgc3Rha2UgYXQgbGVhc3QgdGhlIG1pbmltdW0gZm9yIHRoaXMgcG9vbAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODM4CgkvLyBwb29scyA9IGNsb25lKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHMpCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWludCA0MzIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglmcmFtZV9idXJ5IDUgLy8gcG9vbHM6ICh1aW50NjQsdWludDE2LHVpbnQ2NClbMjRdCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODM5CgkvLyBjdXJOdW1Qb29scyA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUubnVtUG9vbHMgYXMgdWludDY0CglpbnQgMjQyCglpbnQgMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgNiAvLyBjdXJOdW1Qb29sczogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQwCgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IGN1ck51bVBvb2xzOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA3IC8vIGk6IHVpbnQ2NAoKKmZvcl80OgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQwCgkvLyBpIDwgY3VyTnVtUG9vbHMKCWZyYW1lX2RpZyA3IC8vIGk6IHVpbnQ2NAoJZnJhbWVfZGlnIDYgLy8gY3VyTnVtUG9vbHM6IHVpbnQ2NAoJPAoJYnogKmZvcl80X2VuZAoKCS8vICppZjI4X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQxCgkvLyBwb29sc1tpXS50b3RhbEFsZ29TdGFrZWQgKyBhbW91bnRUb1N0YWtlIDw9IG1heFBlclBvb2wKCWZyYW1lX2RpZyA1IC8vIHBvb2xzOiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJKwoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8PQoJYnogKmlmMjhfZW5kCgoJLy8gKmlmMjhfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQyCgkvLyByZXR1cm4gWwoJLy8gICAgICAgICAgICAgICAgICAgICB7IGlkOiB2YWxpZGF0b3JJZCwgcG9vbElkOiBpICsgMSwgcG9vbEFwcElkOiBwb29sc1tpXS5wb29sQXBwSWQgfSwKCS8vICAgICAgICAgICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciwKCS8vICAgICAgICAgICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1Byb3RvY29sLAoJLy8gICAgICAgICAgICAgICAgIF0KCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxCgkrCglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyA1IC8vIHBvb2xzOiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglieXRlIDB4MDAKCWludCAwCglmcmFtZV9kaWcgMCAvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yOiBib29sCglzZXRiaXQKCWludCAxCglmcmFtZV9kaWcgMSAvLyBpc05ld1N0YWtlclRvUHJvdG9jb2w6IGJvb2wKCXNldGJpdAoJY29uY2F0CgliICpmaW5kUG9vbEZvclN0YWtlcipyZXR1cm4KCippZjI4X2VuZDoKCipmb3JfNF9jb250aW51ZToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg0MAoJLy8gaSArPSAxCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDcgLy8gaTogdWludDY0CgliICpmb3JfNAoKKmZvcl80X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg1MAoJLy8gcmV0dXJuIFt7IGlkOiB2YWxpZGF0b3JJZCwgcG9vbElkOiAwLCBwb29sQXBwSWQ6IDAgfSwgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciwgaXNOZXdTdGFrZXJUb1Byb3RvY29sXQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCgljb25jYXQKCWJ5dGUgMHgwMAoJaW50IDAKCWZyYW1lX2RpZyAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCXNldGJpdAoJaW50IDEKCWZyYW1lX2RpZyAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoJc2V0Yml0Cgljb25jYXQKCipmaW5kUG9vbEZvclN0YWtlcipyZXR1cm46CgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCgkvLyBwb3AgYWxsIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHRoZSBzdGFjawoJcG9wbiA3CglyZXRzdWIKCi8vIG1vdmVQb29sVG9Ob2RlKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKKmFiaV9yb3V0ZV9tb3ZlUG9vbFRvTm9kZToKCS8vIG5vZGVOdW06IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwoJYnRvaQoKCS8vIHBvb2xBcHBJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglidG9pCgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgbW92ZVBvb2xUb05vZGUodWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZAoJY2FsbHN1YiBtb3ZlUG9vbFRvTm9kZQoJaW50IDEKCXJldHVybgoKLy8gbW92ZVBvb2xUb05vZGUodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcG9vbEFwcElkOiB1aW50NjQsIG5vZGVOdW06IHVpbnQ2NCk6IHZvaWQKLy8KLy8gRmluZCB0aGUgc3BlY2lmaWVkIHBvb2wgKGluIGFueSBub2RlIG51bWJlcikgYW5kIG1vdmUgaXQgdG8gdGhlIHNwZWNpZmllZCBub2RlLgovLyBUaGUgcG9vbCBhY2NvdW50IGlzIGZvcmNlZCBvZmZsaW5lIGlmIG1vdmVkIHNvIHByaW9yIG5vZGUgd2lsbCBzdGlsbCBydW4gZm9yIDMyMCByb3VuZHMgYnV0Ci8vIG5ldyBrZXkgZ29lcyBvbmxpbmUgb24gbmV3IG5vZGUgc29vbiBhZnRlciAoMzIwIHJvdW5kcyBhZnRlciBpdCBnb2VzIG9ubGluZSkKLy8gTm8tb3AgaWYgc3VjY2VzcywgYXNzZXJ0cyBpZiBub3QgZm91bmQgb3IgY2FuJ3QgbW92ZSAgKG5vIHNwYWNlIGluIHRhcmdldCkKLy8gWyBPTkxZIE9XTkVSIE9SIE1BTkFHRVIgQ0FOIENIQU5HRSBdCi8vCi8vIEBwYXJhbSB7VmFsaWRhdG9ySWRUeXBlfSB2YWxpZGF0b3JJZCAtIFRoZSBpZCBvZiB0aGUgdmFsaWRhdG9yLgovLyBAcGFyYW0ge3VpbnQ2NH0gcG9vbEFwcElkCi8vIEBwYXJhbSB7dWludDY0fSBub2RlTnVtCm1vdmVQb29sVG9Ob2RlOgoJcHJvdG8gMyAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg2NQoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lck9yTWFuYWdlcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyT3JNYW5hZ2VyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODY3CgkvLyBub2RlUG9vbEFzc2lnbm1lbnRzID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5ub2RlUG9vbEFzc2lnbm1lbnRzKQoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfYnVyeSAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NjgKCS8vIGFzc2VydChub2RlTnVtID49IDEgJiYgbm9kZU51bSA8PSBNQVhfTk9ERVMsICdub2RlIG51bWJlciBvdXQgb2YgYWxsb3dhYmxlIHJhbmdlJykKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCAxCgk+PQoJZHVwCglieiAqc2tpcF9hbmQyCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgOAoJPD0KCSYmCgoqc2tpcF9hbmQyOgoJLy8gbm9kZSBudW1iZXIgb3V0IG9mIGFsbG93YWJsZSByYW5nZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODcwCgkvLyBmb3IgKGxldCBzcmNOb2RlSWR4ID0gMDsgc3JjTm9kZUlkeCA8IE1BWF9OT0RFUzsgc3JjTm9kZUlkeCArPSAxKQoJaW50IDAKCWZyYW1lX2J1cnkgMSAvLyBzcmNOb2RlSWR4OiB1aW50NjQKCipmb3JfNToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3MAoJLy8gc3JjTm9kZUlkeCA8IE1BWF9OT0RFUwoJZnJhbWVfZGlnIDEgLy8gc3JjTm9kZUlkeDogdWludDY0CglpbnQgOAoJPAoJYnogKmZvcl81X2VuZAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3MQoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBNQVhfUE9PTFNfUEVSX05PREU7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzY6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzEKCS8vIGkgPCBNQVhfUE9PTFNfUEVSX05PREUKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDMKCTwKCWJ6ICpmb3JfNl9lbmQKCgkvLyAqaWYyOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3MgoJLy8gbm9kZVBvb2xBc3NpZ25tZW50cy5ub2Rlc1tzcmNOb2RlSWR4XS5wb29sQXBwSWRzW2ldID09PSBwb29sQXBwSWQKCWZyYW1lX2RpZyAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCWludCAwCglmcmFtZV9kaWcgMSAvLyBzcmNOb2RlSWR4OiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMAoJKwoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWZyYW1lX2RpZyAtMiAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJPT0KCWJ6ICppZjI5X2VuZAoKCS8vICppZjI5X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3MwoJLy8gYXNzZXJ0KG5vZGVOdW0gLSAxICE9PSBzcmNOb2RlSWR4LCAiY2FuJ3QgbW92ZSB0byBzYW1lIG5vZGUiKQoJZnJhbWVfZGlnIC0zIC8vIG5vZGVOdW06IHVpbnQ2NAoJaW50IDEKCS0KCWZyYW1lX2RpZyAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJIT0KCgkvLyBjYW4ndCBtb3ZlIHRvIHNhbWUgbm9kZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODc1CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLm5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbc3JjTm9kZUlkeF0ucG9vbEFwcElkc1tpXSA9IDAKCWludCA5MDAKCWZyYW1lX2RpZyAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3OAoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5nb09mZmxpbmU+KHsKCS8vICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgltZXRob2QgImdvT2ZmbGluZSgpdm9pZCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODc5CgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkKCWZyYW1lX2RpZyAtMiAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4MwoJLy8gdGhpcy5hZGRQb29sVG9Ob2RlKHZhbGlkYXRvcklkLCBwb29sQXBwSWQsIG5vZGVOdW0pCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gcG9vbEFwcElkOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGFkZFBvb2xUb05vZGUKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4ODQKCS8vIHJldHVybgoJcmV0c3ViCgoqaWYyOV9lbmQ6CgoqZm9yXzZfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzEKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzYKCipmb3JfNl9lbmQ6CgoqZm9yXzVfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzAKCS8vIHNyY05vZGVJZHggKz0gMQoJZnJhbWVfZGlnIDEgLy8gc3JjTm9kZUlkeDogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJYiAqZm9yXzUKCipmb3JfNV9lbmQ6CgkvLyBjb3VsZG4ndCBmaW5kIHBvb2wgYXBwIGlkIGluIG5vZGVzIHRvIG1vdmUKCWVycgoJcmV0c3ViCgovLyBlbXB0eVRva2VuUmV3YXJkcyh1aW50NjQsYWRkcmVzcyl1aW50NjQKKmFiaV9yb3V0ZV9lbXB0eVRva2VuUmV3YXJkczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gcmVjZWl2ZXI6IGFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMzIKCT09CgoJLy8gYXJndW1lbnQgMCAocmVjZWl2ZXIpIGZvciBlbXB0eVRva2VuUmV3YXJkcyBtdXN0IGJlIGEgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZW1wdHlUb2tlblJld2FyZHModWludDY0LGFkZHJlc3MpdWludDY0CgljYWxsc3ViIGVtcHR5VG9rZW5SZXdhcmRzCglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZW1wdHlUb2tlblJld2FyZHModmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcmVjZWl2ZXI6IEFkZHJlc3MpOiB1aW50NjQKLy8KLy8gU2VuZHMgdGhlIHJld2FyZCB0b2tlbnMgaGVsZCBpbiBwb29sIDEgdG8gc3BlY2lmaWVkIHJlY2VpdmVyLgovLyBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgdGhlIG93bmVyIHdoZW4gdGhleSB3YW50IHRvIGdldCByZXdhcmQgdG9rZW5zICdiYWNrJyB3aGljaCB0aGV5IHNlbnQgdG8KLy8gdGhlIGZpcnN0IHBvb2wgKGxpa2VseSBiZWNhdXNlIHZhbGlkYXRvciBpcyBzdW5zZXR0aW5nLiAgQW55IHRva2VucyBjdXJyZW50bHkgJ3Jlc2VydmVkJyBmb3Igc3Rha2VycyB0byBjbGFpbSB3aWxsCi8vIE5PVCBiZSBzZW50IGFzIHRoZXkgbXVzdCBiZSBoZWxkIGJhY2sgZm9yIHN0YWtlcnMgdG8gbGF0ZXIgY2xhaW0uCi8vIFsgT05MWSBPV05FUiBDQU4gQ0FMTF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7QWRkcmVzc30gcmVjZWl2ZXIgLSB0aGUgYWNjb3VudCB0byBzZW5kIHRoZSB0b2tlbnMgdG8gKG11c3QgYWxyZWFkeSBiZSBvcHRlZC1pbiB0byB0aGUgcmV3YXJkIHRva2VuKQovLyBAcmV0dXJucyB7dWludDY0fSB0aGUgYW1vdW50IG9mIHJld2FyZCB0b2tlbiBzZW50CmVtcHR5VG9rZW5SZXdhcmRzOgoJcHJvdG8gMiAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkwMwoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTA0CgkvLyByZXdhcmRUb2tlbklkID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcucmV3YXJkVG9rZW5JZAoJaW50IDE1MwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTA1CgkvLyByZXdhcmRUb2tlbkhlbGRCYWNrID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5yZXdhcmRUb2tlbkhlbGRCYWNrCglpbnQgMjYwCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMSAvLyByZXdhcmRUb2tlbkhlbGRCYWNrOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MDYKCS8vIGFzc2VydChyZXdhcmRUb2tlbklkICE9PSAwLCAidGhpcyB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIGEgcmV3YXJkIHRva2VuIGRlZmluZWQiKQoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0CglpbnQgMAoJIT0KCgkvLyB0aGlzIHZhbGlkYXRvciBkb2Vzbid0IGhhdmUgYSByZXdhcmQgdG9rZW4gZGVmaW5lZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTA3CgkvLyBwb29sT25lQXBwSWQgPSBBcHBJRC5mcm9tVWludDY0KHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkKQoJaW50IDI2OAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MDkKCS8vIHRva2VuUmV3YXJkQmFsID0KCS8vICAgICAgICAgICAgIHBvb2xPbmVBcHBJZC5hZGRyZXNzLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JZCkpIC0gcmV3YXJkVG9rZW5IZWxkQmFjawoJZnJhbWVfZGlnIDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCXBvcAoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0Cglhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKCXBvcAoJZnJhbWVfZGlnIDEgLy8gcmV3YXJkVG9rZW5IZWxkQmFjazogdWludDY0CgktCglmcmFtZV9idXJ5IDMgLy8gdG9rZW5SZXdhcmRCYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkxMwoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5wYXlUb2tlblJld2FyZD4oewoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25JRDogcG9vbE9uZUFwcElkLAoJLy8gICAgICAgICAgICAgbWV0aG9kQXJnczogW3JlY2VpdmVyLCByZXdhcmRUb2tlbklkLCB0b2tlblJld2FyZEJhbF0sCgkvLyAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJbWV0aG9kICJwYXlUb2tlblJld2FyZChhZGRyZXNzLHVpbnQ2NCx1aW50NjQpdm9pZCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTE0CgkvLyBhcHBsaWNhdGlvbklEOiBwb29sT25lQXBwSWQKCWZyYW1lX2RpZyAyIC8vIHBvb2xPbmVBcHBJZDogdWludDY0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MTUKCS8vIG1ldGhvZEFyZ3M6IFtyZWNlaXZlciwgcmV3YXJkVG9rZW5JZCwgdG9rZW5SZXdhcmRCYWxdCglmcmFtZV9kaWcgLTIgLy8gcmVjZWl2ZXI6IEFkZHJlc3MKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklkOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMyAvLyB0b2tlblJld2FyZEJhbDogdWludDY0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MTcKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHBvb2xPbmVBcHBJZC5hZGRyZXNzLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JZCkpID09PSByZXdhcmRUb2tlbkhlbGRCYWNrLAoJLy8gICAgICAgICAgICAgJ2JhbGFuY2Ugb2YgcmVtYWluaW5nIHJld2FyZCB0b2tlbnMgc2hvdWxkIG1hdGNoIHRoZSBoZWxkIGJhY2sgYW1vdW50JywKCS8vICAgICAgICAgKQoJZnJhbWVfZGlnIDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCXBvcAoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0Cglhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKCXBvcAoJZnJhbWVfZGlnIDEgLy8gcmV3YXJkVG9rZW5IZWxkQmFjazogdWludDY0Cgk9PQoKCS8vIGJhbGFuY2Ugb2YgcmVtYWluaW5nIHJld2FyZCB0b2tlbnMgc2hvdWxkIG1hdGNoIHRoZSBoZWxkIGJhY2sgYW1vdW50Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MjEKCS8vIHJldHVybiB0b2tlblJld2FyZEJhbAoJZnJhbWVfZGlnIDMgLy8gdG9rZW5SZXdhcmRCYWw6IHVpbnQ2NAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDMKCXJldHN1YgoKLy8gY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IHZvaWQKY2FsbGVyTXVzdEJlT3duZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDE0CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICB0aGlzLnR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLAoJLy8gICAgICAgICAgICAgJ2NhbiBvbmx5IGJlIGNhbGxlZCBieSB2YWxpZGF0b3Igb3duZXInLAoJLy8gICAgICAgICApCgl0eG4gU2VuZGVyCglpbnQgOAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJPT0KCgkvLyBjYW4gb25seSBiZSBjYWxsZWQgYnkgdmFsaWRhdG9yIG93bmVyCglhc3NlcnQKCXJldHN1YgoKLy8gY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXIodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IHZvaWQKY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDIxCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICB0aGlzLnR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyIHx8CgkvLyAgICAgICAgICAgICAgICAgdGhpcy50eG4uc2VuZGVyID09PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5tYW5hZ2VyLAoJLy8gICAgICAgICAgICAgJ2NhbiBvbmx5IGJlIGNhbGxlZCBieSBvd25lciBvciBtYW5hZ2VyIG9mIHZhbGlkYXRvcicsCgkvLyAgICAgICAgICkKCXR4biBTZW5kZXIKCWludCA4CglpbnQgMzIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0Cgk9PQoJZHVwCglibnogKnNraXBfb3IzCgl0eG4gU2VuZGVyCglpbnQgNDAKCWludCAzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCT09Cgl8fAoKKnNraXBfb3IzOgoJLy8gY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IG93bmVyIG9yIG1hbmFnZXIgb2YgdmFsaWRhdG9yCglhc3NlcnQKCXJldHN1YgoKLy8gdmVyaWZ5UG9vbEtleUNhbGxlcihwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5KTogdm9pZAovLwovLyB2ZXJpZnlQb29sS2V5Q2FsbGVyIHZlcmlmaWVzIHRoZSBwYXNzZWQgaW4ga2V5IChmcm9tIGEgc3Rha2luZyBwb29sIGNhbGxpbmcgdXMgdG8gdXBkYXRlIG1ldHJpY3MpIGlzIHZhbGlkCi8vIGFuZCBtYXRjaGVzIHRoZSBpbmZvcm1hdGlvbiB3ZSBoYXZlIGluIG91ciBzdGF0ZS4gICdGYWtlJyBwb29scyBjb3VsZCBjYWxsIHVzIHRvIHVwZGF0ZSBvdXIgZGF0YSwgYnV0IHRoZXkKLy8gY2FuJ3QgZmFrZSB0aGUgaWRzIGFuZCBtb3N0IGltcG9ydGFudGx5IGFwcGxpY2F0aW9uIGlkKCEpIG9mIHRoZSBjYWxsZXIgdGhhdCBoYXMgdG8gbWF0Y2guCnZlcmlmeVBvb2xLZXlDYWxsZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDM0CgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLmV4aXN0cywgInRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGlzbid0IHZhbGlkIikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cglib3hfbGVuCglzd2FwCglwb3AKCgkvLyB0aGUgc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBpc24ndCB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTAzNQoJLy8gYXNzZXJ0KHBvb2xLZXkucG9vbElkIDw9IE1BWF9QT09MUywgJ3Bvb2wgaWQgbm90IGluIHZhbGlkIHJhbmdlJykKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDI0Cgk8PQoKCS8vIHBvb2wgaWQgbm90IGluIHZhbGlkIHJhbmdlCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDM2CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBwb29sS2V5LnBvb2xJZCA+IDAgJiYgKHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNikgPD0gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLm51bVBvb2xzLAoJLy8gICAgICAgICAgICAgJ3Bvb2wgaWQgb3V0c2lkZSBvZiByYW5nZSBvZiBwb29scyBjcmVhdGVkIGZvciB0aGlzIHZhbGlkYXRvcicsCgkvLyAgICAgICAgICkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDAKCT4KCWR1cAoJYnogKnNraXBfYW5kMwoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMjQyCglpbnQgMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk8PQoJJiYKCipza2lwX2FuZDM6CgkvLyBwb29sIGlkIG91dHNpZGUgb2YgcmFuZ2Ugb2YgcG9vbHMgY3JlYXRlZCBmb3IgdGhpcyB2YWxpZGF0b3IKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNDIKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHBvb2xLZXkucG9vbEFwcElkID09PSB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbcG9vbEtleS5wb29sSWQgLSAxXS5wb29sQXBwSWQsCgkvLyAgICAgICAgICAgICAiVGhlIHBhc3NlZCBpbiBhcHAgaWQgZG9lc24ndCBtYXRjaCB0aGUgcGFzc2VkIGluIGlkcyIsCgkvLyAgICAgICAgICkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk9PQoKCS8vIFRoZSBwYXNzZWQgaW4gYXBwIGlkIGRvZXNuJ3QgbWF0Y2ggdGhlIHBhc3NlZCBpbiBpZHMKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNDcKCS8vIGFzc2VydCh0aGlzLnR4bi5zZW5kZXIgPT09IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLmFkZHJlc3MpCgl0eG4gU2VuZGVyCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAxNiA4CglidG9pCglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCT09Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDQ5CgkvLyBhc3NlcnQocG9vbEtleS5pZCA9PT0gKEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLmdsb2JhbFN0YXRlKCd2YWxpZGF0b3JJZCcpIGFzIHVpbnQ2NCkpCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWJ5dGUgMHg3NjYxNmM2OTY0NjE3NDZmNzI0OTY0IC8vICJ2YWxpZGF0b3JJZCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgndmFsaWRhdG9ySWQnKQoJYXNzZXJ0Cgk9PQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA1MAoJLy8gYXNzZXJ0KHBvb2xLZXkucG9vbElkID09PSAoQXBwSUQuZnJvbVVpbnQ2NChwb29sS2V5LnBvb2xBcHBJZCkuZ2xvYmFsU3RhdGUoJ3Bvb2xJZCcpIGFzIHVpbnQ2NCkpCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWJ5dGUgMHg3MDZmNmY2YzQ5NjQgLy8gInBvb2xJZCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgncG9vbElkJykKCWFzc2VydAoJPT0KCWFzc2VydAoJcmV0c3ViCgovLyByZXZlcmlmeU5GRE93bmVyc2hpcCh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogdm9pZAovLwovLyBUaGlzIG1ldGhvZCB2ZXJpZmllcyB0aGUgb3duZXJzaGlwIG9mIE5GRCAoTmFtZWQgRnVuY3Rpb24gRGF0YSkgYnkgYSB2YWxpZGF0b3IuCi8vIElmIHRoZSBvd25lcnNoaXAgaXMgbm8gbG9uZ2VyIHZhbGlkLCBpdCByZW1vdmVzIHRoZSBORkQgZnJvbSB0aGUgdmFsaWRhdG9yJ3MgY29uZmlndXJhdGlvbi4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3Igd2hvc2UgZGF0YSBzaG91bGQgYmUgcmUtZXZhbHVhdGVkLgpyZXZlcmlmeU5GRE93bmVyc2hpcDoKCXByb3RvIDEgMAoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDYwCgkvLyB2YWxpZGF0b3JDb25maWcgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZwoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJZnJhbWVfYnVyeSAwIC8vIHN0b3JhZ2Uga2V5Ly92YWxpZGF0b3JDb25maWcKCgkvLyAqaWYzMF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNjEKCS8vIHZhbGlkYXRvckNvbmZpZy5uZmRGb3JJbmZvICE9PSAwCglpbnQgNzIKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDAKCSE9CglieiAqaWYzMF9lbmQKCgkvLyAqaWYzMF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDY0CgkvLyBuZmRPd25lciA9IEFwcElELmZyb21VaW50NjQodmFsaWRhdG9yQ29uZmlnLm5mZEZvckluZm8pLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzCglpbnQgNzIKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQodmFsaWRhdG9yQ29uZmlnLm5mZEZvckluZm8pLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCgkvLyAqaWYzMV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNjYKCS8vIHZhbGlkYXRvckNvbmZpZy5vd25lciAhPT0gbmZkT3duZXIgJiYgdmFsaWRhdG9yQ29uZmlnLm1hbmFnZXIgIT09IG5mZE93bmVyCglpbnQgOAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfZGlnIDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCSE9CglkdXAKCWJ6ICpza2lwX2FuZDQKCWludCA0MAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfZGlnIDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCSE9CgkmJgoKKnNraXBfYW5kNDoKCWJ6ICppZjMxX2VuZAoKCS8vICppZjMxX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNjgKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm5mZEZvckluZm8gPSAwCglpbnQgNzIKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKKmlmMzFfZW5kOgoKKmlmMzBfZW5kOgoJcmV0c3ViCgovLyB2YWxpZGF0ZUNvbmZpZyhjb25maWc6IFZhbGlkYXRvckNvbmZpZyk6IHZvaWQKdmFsaWRhdGVDb25maWc6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDc1CgkvLyBhc3NlcnQoY29uZmlnLm93bmVyICE9PSBBZGRyZXNzLnplcm9BZGRyZXNzKQoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDggMzIKCWdsb2JhbCBaZXJvQWRkcmVzcwoJIT0KCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNzYKCS8vIGFzc2VydChjb25maWcubWFuYWdlciAhPT0gQWRkcmVzcy56ZXJvQWRkcmVzcykKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA0MCAzMgoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA3NwoJLy8gYXNzZXJ0KHRoaXMudHhuLnNlbmRlciA9PT0gY29uZmlnLm93bmVyLCAnc2VuZGVyIG11c3QgYmUgb3duZXIgdG8gYWRkIG5ldyB2YWxpZGF0b3InKQoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDggMzIKCT09CgoJLy8gc2VuZGVyIG11c3QgYmUgb3duZXIgdG8gYWRkIG5ldyB2YWxpZGF0b3IKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNzkKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIGNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPj0gR0FUSU5HX1RZUEVfTk9ORSAmJiBjb25maWcuZW50cnlHYXRpbmdUeXBlIDw9IEdBVElOR19UWVBFX0NPTlNUX01BWCwKCS8vICAgICAgICAgICAgICdnYXRpbmcgdHlwZSBub3QgdmFsaWQnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgODAgMQoJYnRvaQoJaW50IDAKCT49CglkdXAKCWJ6ICpza2lwX2FuZDUKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4MCAxCglidG9pCglpbnQgNAoJPD0KCSYmCgoqc2tpcF9hbmQ1OgoJLy8gZ2F0aW5nIHR5cGUgbm90IHZhbGlkCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDgzCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBjb25maWcuZXBvY2hSb3VuZExlbmd0aCA+PSBNSU5fRVBPQ0hfTEVOR1RIICYmIGNvbmZpZy5lcG9jaFJvdW5kTGVuZ3RoIDw9IE1BWF9FUE9DSF9MRU5HVEgsCgkvLyAgICAgICAgICAgICAnZXBvY2ggbGVuZ3RoIG5vdCBpbiBhbGxvd2FibGUgcmFuZ2UnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTY5IDQKCWJ0b2kKCWludCAxCgk+PQoJZHVwCglieiAqc2tpcF9hbmQ2CglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTY5IDQKCWJ0b2kKCWludCAxMDAwMDAwCgk8PQoJJiYKCipza2lwX2FuZDY6CgkvLyBlcG9jaCBsZW5ndGggbm90IGluIGFsbG93YWJsZSByYW5nZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA4NwoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgY29uZmlnLnBlcmNlbnRUb1ZhbGlkYXRvciA+PSBNSU5fUENUX1RPX1ZBTElEQVRPUiAmJiBjb25maWcucGVyY2VudFRvVmFsaWRhdG9yIDw9IE1BWF9QQ1RfVE9fVkFMSURBVE9SLAoJLy8gICAgICAgICAgICAgJ2NvbW1pc3Npb24gcGVyY2VudGFnZSBub3QgdmFsaWQnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTczIDQKCWJ0b2kKCWludCAwCgk+PQoJZHVwCglieiAqc2tpcF9hbmQ3CglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTczIDQKCWJ0b2kKCWludCAxMDAwMDAwCgk8PQoJJiYKCipza2lwX2FuZDc6CgkvLyBjb21taXNzaW9uIHBlcmNlbnRhZ2Ugbm90IHZhbGlkCglhc3NlcnQKCgkvLyAqaWYzMl9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwOTEKCS8vIGNvbmZpZy5wZXJjZW50VG9WYWxpZGF0b3IgIT09IDAKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAxNzMgNAoJYnRvaQoJaW50IDAKCSE9CglieiAqaWYzMl9lbmQKCgkvLyAqaWYzMl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDkyCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgY29uZmlnLnZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzICE9PSBBZGRyZXNzLnplcm9BZGRyZXNzLAoJLy8gICAgICAgICAgICAgICAgICd2YWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyBtdXN0IGJlIHNldCBpZiBwZXJjZW50IHRvIHZhbGlkYXRvciBpcyBub3QgMCcsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTc3IDMyCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CgoJLy8gdmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MgbXVzdCBiZSBzZXQgaWYgcGVyY2VudCB0byB2YWxpZGF0b3IgaXMgbm90IDAKCWFzc2VydAoKKmlmMzJfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA5NwoJLy8gYXNzZXJ0KGNvbmZpZy5taW5FbnRyeVN0YWtlID49IE1JTl9BTEdPX1NUQUtFX1BFUl9QT09MLCAnc3Rha2luZyBwb29sIG11c3QgaGF2ZSBtaW5pbXVtIGVudHJ5IG9mIDEgYWxnbycpCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMjA5IDgKCWJ0b2kKCWludCAxMDAwMDAwCgk+PQoKCS8vIHN0YWtpbmcgcG9vbCBtdXN0IGhhdmUgbWluaW11bSBlbnRyeSBvZiAxIGFsZ28KCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwOTkKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIGNvbmZpZy5wb29sc1Blck5vZGUgPiAwICYmIGNvbmZpZy5wb29sc1Blck5vZGUgPD0gTUFYX1BPT0xTX1BFUl9OT0RFLAoJLy8gICAgICAgICAgICAgJ251bWJlciBvZiBwb29scyBwZXIgbm9kZSBtdXN0IGJlIGJlIGJldHdlZW4gMSBhbmQgdGhlIG1heGltdW0gYWxsb3dlZCBudW1iZXInLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMjI1IDEKCWJ0b2kKCWludCAwCgk+CglkdXAKCWJ6ICpza2lwX2FuZDgKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAyMjUgMQoJYnRvaQoJaW50IDMKCTw9CgkmJgoKKnNraXBfYW5kODoKCS8vIG51bWJlciBvZiBwb29scyBwZXIgbm9kZSBtdXN0IGJlIGJlIGJldHdlZW4gMSBhbmQgdGhlIG1heGltdW0gYWxsb3dlZCBudW1iZXIKCWFzc2VydAoKCS8vICppZjMzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEwMwoJLy8gY29uZmlnLnN1bnNldHRpbmdPbiAhPT0gMAoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDIyNiA4CglidG9pCglpbnQgMAoJIT0KCWJ6ICppZjMzX2VuZAoKCS8vICppZjMzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMDQKCS8vIGFzc2VydChjb25maWcuc3Vuc2V0dGluZ09uID4gZ2xvYmFscy5sYXRlc3RUaW1lc3RhbXAsICdzdW5zZXR0aW5nT24gbXVzdCBiZSBsYXRlciB0aGFuIG5vdyBpZiBzZXQnKQoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDIyNiA4CglidG9pCglnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCgk+CgoJLy8gc3Vuc2V0dGluZ09uIG11c3QgYmUgbGF0ZXIgdGhhbiBub3cgaWYgc2V0Cglhc3NlcnQKCippZjMzX2VuZDoKCXJldHN1YgoKLy8gY2FsbFBvb2xBZGRTdGFrZShzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4sIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXksIG1ickFtdFBhaWQ6IHVpbnQ2NCwgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbGVhbiwgaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sZWFuKTogdm9pZAovLwovLyBBZGRzIGEgc3Rha2VycyBhbW91bnQgb2YgYWxnbyB0byBhIHZhbGlkYXRvciBwb29sLCB0cmFuc2ZlcnJpbmcgdGhlIGFsZ28gd2UgcmVjZWl2ZWQgZnJvbSB0aGVtIChhbHJlYWR5IHZlcmlmaWVkCi8vIGJ5IG91ciBjYWxsZXIpIHRvIHRoZSBzdGFraW5nIHBvb2wgYWNjb3VudCwgYW5kIHRoZW4gdGVsbGluZyBpdCBhYm91dCB0aGUgYW1vdW50IGJlaW5nIGFkZGVkIGZvciB0aGUgc3BlY2lmaWVkCi8vIHN0YWtlci4KLy8KLy8gQHBhcmFtIHtQYXlUeG59IHN0YWtlZEFtb3VudFBheW1lbnQgLSBwYXltZW50IGNvbWluZyBmcm9tIHN0YWtlciB0byBwbGFjZSBpbnRvIGEgcG9vbAovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBUaGUga2V5IG9mIHRoZSB2YWxpZGF0b3IgcG9vbC4KLy8gQHBhcmFtIHt1aW50NjR9IG1ickFtdFBhaWQgLSBBbW91bnQgdGhlIHVzZXIgaXMgbGVhdmluZyBiZWhpbmQgaW4gdGhlIHZhbGlkYXRvciB0byBwYXkgZm9yIHRoZWlyIHN0YWtlciBNQlIgY29zdAovLyBAcGFyYW0ge2Jvb2xlYW59IGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IgLSBpZiB0aGlzIGlzIGEgbmV3LCBmaXJzdC10aW1lIHN0YWtlciB0byB0aGUgdmFsaWRhdG9yCi8vIEBwYXJhbSB7Ym9vbGVhbn0gaXNOZXdTdGFrZXJUb1Byb3RvY29sIC0gaWYgdGhpcyBpcyBhIG5ldywgZmlyc3QtdGltZSBzdGFrZXIgdG8gdGhlIHByb3RvY29sCmNhbGxQb29sQWRkU3Rha2U6Cglwcm90byA1IDAKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiAyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEyNgoJLy8gcG9vbEFwcElkID0gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzW3Bvb2xLZXkucG9vbElkIC0gMV0ucG9vbEFwcElkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIHBvb2xBcHBJZDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEzMAoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5hZGRTdGFrZSwgdWludDY0Pih7CgkvLyAgICAgICAgICAgICBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCksCgkvLyAgICAgICAgICAgICBtZXRob2RBcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gPT09PT09PQoJLy8gICAgICAgICAgICAgICAgIC8vIFRISVMgSVMgQSBTRU5EIG9mIHRoZSBhbW91bnQgcmVjZWl2ZWQgcmlnaHQgYmFjayBvdXQgYW5kIGludG8gdGhlIHN0YWtpbmcgcG9vbCBjb250cmFjdCBhY2NvdW50LgoJLy8gICAgICAgICAgICAgICAgIHsgYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQsIHJlY2VpdmVyOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuYWRkcmVzcyB9LAoJLy8gICAgICAgICAgICAgICAgIC8vID09PT09PT0KCS8vICAgICAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LnNlbmRlciwKCS8vICAgICAgICAgICAgIF0sCgkvLyAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgcGF5CglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEzNQoJLy8gYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJZnJhbWVfZGlnIC0zIC8vIG1ickFtdFBhaWQ6IHVpbnQ2NAoJLQoJaXR4bl9maWVsZCBBbW91bnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTM1CgkvLyByZWNlaXZlcjogQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmFkZHJlc3MKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCWl0eG5fZmllbGQgUmVjZWl2ZXIKCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCWl0eG5fbmV4dAoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAiYWRkU3Rha2UocGF5LGFkZHJlc3MpdWludDY0IgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTMxCgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTMyCgkvLyBtZXRob2RBcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gPT09PT09PQoJLy8gICAgICAgICAgICAgICAgIC8vIFRISVMgSVMgQSBTRU5EIG9mIHRoZSBhbW91bnQgcmVjZWl2ZWQgcmlnaHQgYmFjayBvdXQgYW5kIGludG8gdGhlIHN0YWtpbmcgcG9vbCBjb250cmFjdCBhY2NvdW50LgoJLy8gICAgICAgICAgICAgICAgIHsgYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQsIHJlY2VpdmVyOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuYWRkcmVzcyB9LAoJLy8gICAgICAgICAgICAgICAgIC8vID09PT09PT0KCS8vICAgICAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LnNlbmRlciwKCS8vICAgICAgICAgICAgIF0KCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIFNlbmRlcgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCgkvLyBTdWJtaXQgaW5uZXIgdHJhbnNhY3Rpb24KCWl0eG5fc3VibWl0CglpdHhuIE51bUxvZ3MKCWludCAxCgktCglpdHhuYXMgTG9ncwoJZXh0cmFjdCA0IDAKCWJ0b2kKCgkvLyAqaWYzNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNDAKCS8vIGdsb2JhbHMub3Bjb2RlQnVkZ2V0IDwgNTAwCglnbG9iYWwgT3Bjb2RlQnVkZ2V0CglpbnQgNTAwCgk8CglieiAqaWYzNF9lbmQKCgkvLyAqaWYzNF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTQxCgkvLyBpbmNyZWFzZU9wY29kZUJ1ZGdldCgpCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJaW50IDAKCWl0eG5fZmllbGQgRmVlCglieXRlIGI2NCBDb0VCIC8vICNwcmFnbWEgdmVyc2lvbiAxMDsgaW50IDEKCWR1cAoJaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCWludCBEZWxldGVBcHBsaWNhdGlvbgoJaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KCWl0eG5fc3VibWl0CgoqaWYzNF9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTQ1CgkvLyBwb29sTnVtU3Rha2VycyA9IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgnbnVtU3Rha2VycycpIGFzIHVpbnQ2NAoJZnJhbWVfZGlnIDAgLy8gcG9vbEFwcElkOiB1aW50NjQKCWJ5dGUgMHg2ZTc1NmQ1Mzc0NjE2YjY1NzI3MyAvLyAibnVtU3Rha2VycyIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuZ2xvYmFsU3RhdGUoJ251bVN0YWtlcnMnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDEgLy8gcG9vbE51bVN0YWtlcnM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNDYKCS8vIHBvb2xBbGdvU3Rha2VkID0gQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmdsb2JhbFN0YXRlKCdzdGFrZWQnKSBhcyB1aW50NjQKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglhcHBfZ2xvYmFsX2dldF9leAoKCS8vIGdsb2JhbCBzdGF0ZSB2YWx1ZSBkb2VzIG5vdCBleGlzdDogQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmdsb2JhbFN0YXRlKCdzdGFrZWQnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDIgLy8gcG9vbEFsZ29TdGFrZWQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNDcKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsU3Rha2VycyA9IHBvb2xOdW1TdGFrZXJzIGFzIHVpbnQxNgoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJZnJhbWVfZGlnIDEgLy8gcG9vbE51bVN0YWtlcnM6IHVpbnQ2NAoJaXRvYgoJZXh0cmFjdCA2IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNDgKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCA9IHBvb2xBbGdvU3Rha2VkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJZnJhbWVfZGlnIDIgLy8gcG9vbEFsZ29TdGFrZWQ6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gKmlmMzVfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTUxCgkvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yCglmcmFtZV9kaWcgLTQgLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbGVhbgoJYnogKmlmMzVfZW5kCgoJLy8gKmlmMzVfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE1MgoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsU3Rha2VycyArPSAxCglpbnQgMjQ0CglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWludCAxCgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCippZjM1X2VuZDoKCS8vICppZjM2X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE1NAoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sCglmcmFtZV9kaWcgLTUgLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sZWFuCglieiAqaWYzNl9lbmQKCgkvLyAqaWYzNl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTU1CgkvLyB0aGlzLm51bVN0YWtlcnMudmFsdWUgKz0gMQoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJYXBwX2dsb2JhbF9nZXQKCWludCAxCgkrCglieXRlIDB4NmU3NTZkNTM3NDYxNmI2NTcyNzMgLy8gIm51bVN0YWtlcnMiCglzd2FwCglhcHBfZ2xvYmFsX3B1dAoKKmlmMzZfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE1NwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsQWxnb1N0YWtlZCArPSBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWludCAyNTIKCWR1cAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4bgoJZ3R4bnMgQW1vdW50CglmcmFtZV9kaWcgLTMgLy8gbWJyQW10UGFpZDogdWludDY0CgktCgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTU4CgkvLyB0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSArPSBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCWFwcF9nbG9iYWxfZ2V0CglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBBbW91bnQKCWZyYW1lX2RpZyAtMyAvLyBtYnJBbXRQYWlkOiB1aW50NjQKCS0KCSsKCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCXN3YXAKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIHVwZGF0ZVN0YWtlclBvb2xTZXQoc3Rha2VyOiBBZGRyZXNzLCBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5KTogdm9pZAp1cGRhdGVTdGFrZXJQb29sU2V0OgoJcHJvdG8gMiAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjIKCS8vIGFzc2VydCh0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS5leGlzdHMpCglieXRlIDB4NzM3MDczIC8vICJzcHMiCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE2NAoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDAgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjUKCS8vIGZpcnN0RW1wdHkgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjYKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoKKmZvcl83OgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE2NgoJLy8gaSA8IHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlLmxlbmd0aAoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl83X2VuZAoKCS8vICppZjM3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE2NwoJLy8gcG9vbFNldFtpXSA9PT0gcG9vbEtleQoJZnJhbWVfZGlnIDAgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDI0CglleHRyYWN0MwoJZnJhbWVfZGlnIC0yIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCT09CglieiAqaWYzN19lbmQKCgkvLyAqaWYzN19jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTY5CgkvLyByZXR1cm4KCXJldHN1YgoKKmlmMzdfZW5kOgoJLy8gKmlmMzhfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTcxCgkvLyBmaXJzdEVtcHR5ID09PSAwICYmIHBvb2xTZXRbaV0uaWQgPT09IDAKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDAKCT09CglkdXAKCWJ6ICpza2lwX2FuZDkKCWZyYW1lX2RpZyAwIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgk9PQoJJiYKCipza2lwX2FuZDk6CglieiAqaWYzOF9lbmQKCgkvLyAqaWYzOF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTcyCgkvLyBmaXJzdEVtcHR5ID0gaSArIDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMSAvLyBmaXJzdEVtcHR5OiB1aW50NjQKCippZjM4X2VuZDoKCipmb3JfN19jb250aW51ZToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjYKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzcKCipmb3JfN19lbmQ6CgkvLyAqaWYzOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNzUKCS8vIGZpcnN0RW1wdHkgPT09IDAKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDAKCT09CglieiAqaWYzOV9lbmQKCgkvLyAqaWYzOV9jb25zZXF1ZW50CgkvLyBObyBlbXB0eSBzbG90IGF2YWlsYWJsZSBpbiB0aGUgc3Rha2VyIHBvb2wgc2V0CgllcnIKCippZjM5X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNzgKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlW2ZpcnN0RW1wdHkgLSAxXSA9IHBvb2xLZXkKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDEKCS0KCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyByZW1vdmVGcm9tU3Rha2VyUG9vbFNldChzdGFrZXI6IEFkZHJlc3MsIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkpOiBbYm9vbGVhbiwgYm9vbGVhbl0KLy8KLy8gUmVtb3ZlcyBhIHBvb2wga2V5IGZyb20gdGhlIHN0YWtlcidzIGFjdGl2ZSBwb29sIHNldCAtIGZhaWxzIGlmIG5vdCBmb3VuZCAoISkKLy8KLy8gQHBhcmFtIHtBZGRyZXNzfSBzdGFrZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgc3Rha2VyLgovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBUaGUgcG9vbCBrZXkgdGhleSBzaG91bGQgYmUgc3RvcmVkIGluCi8vCi8vIEByZXR1cm4gW2Jvb2xlYW4sIGJvb2xlYW5dIFtpcyB0aGUgc3Rha2VyIGdvbmUgZnJvbSBBTEwgcG9vbHMgb2YgdGhlIGdpdmVuIFZBTElEQVRPUiwgYW5kIGlzIHN0YWtlciBnb25lIGZyb20gQUxMIHBvb2xzXQpyZW1vdmVGcm9tU3Rha2VyUG9vbFNldDoKCXByb3RvIDIgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTkxCgkvLyBpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAwIC8vIGluU2FtZVZhbGlkYXRvclBvb2xDb3VudDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5MgoJLy8gaW5BbnlQb29sQ291bnQgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAxIC8vIGluQW55UG9vbENvdW50OiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTkzCgkvLyBmb3VuZCA9IGZhbHNlCglpbnQgMAoJZnJhbWVfYnVyeSAyIC8vIGZvdW5kOiBib29sCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5NQoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExOTYKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoKKmZvcl84OgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5NgoJLy8gaSA8IHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlLmxlbmd0aAoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl84X2VuZAoKCS8vICppZjQwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5NwoJLy8gcG9vbFNldFtpXS5pZCA9PT0gMAoJZnJhbWVfZGlnIDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWY0MF9lbmQKCgkvLyAqaWY0MF9jb25zZXF1ZW50CgliICpmb3JfOF9jb250aW51ZQoKKmlmNDBfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwMAoJLy8gaW5BbnlQb29sQ291bnQgKz0gMQoJZnJhbWVfZGlnIDEgLy8gaW5BbnlQb29sQ291bnQ6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMSAvLyBpbkFueVBvb2xDb3VudDogdWludDY0CgoJLy8gKmlmNDFfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjAxCgkvLyBwb29sU2V0W2ldLmlkID09PSBwb29sS2V5LmlkCglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgMAoJKwoJaW50IDgKCWV4dHJhY3QzCglidG9pCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCT09CglieiAqaWY0MV9lbmQKCgkvLyAqaWY0MV9jb25zZXF1ZW50CgkvLyAqaWY0Ml9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDIKCS8vIHBvb2xTZXRbaV0gPT09IHBvb2xLZXkKCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5Cgk9PQoJYnogKmlmNDJfZWxzZQoKCS8vICppZjQyX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDMKCS8vIGZvdW5kID0gdHJ1ZQoJaW50IDEKCWZyYW1lX2J1cnkgMiAvLyBmb3VuZDogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDUKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlW2ldID0geyBpZDogMCwgcG9vbElkOiAwLCBwb29sQXBwSWQ6IDAgfQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJYiAqaWY0Ml9lbmQKCippZjQyX2Vsc2U6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjA3CgkvLyBpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgKz0gMQoJZnJhbWVfZGlnIDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCippZjQyX2VuZDoKCippZjQxX2VuZDoKCipmb3JfOF9jb250aW51ZToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExOTYKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzgKCipmb3JfOF9lbmQ6CgkvLyAqaWY0M19jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMTEKCS8vICFmb3VuZAoJZnJhbWVfZGlnIDIgLy8gZm91bmQ6IGJvb2wKCSEKCWJ6ICppZjQzX2VuZAoKCS8vICppZjQzX2NvbnNlcXVlbnQKCS8vIE5vIG1hdGNoaW5nIHNsb3QgZm91bmQgd2hlbiB0b2xkIHRvIHJlbW92ZSBhIHBvb2wgZnJvbSB0aGUgc3Rha2VycyBzZXQKCWVycgoKKmlmNDNfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIxNQoJLy8gcmV0dXJuIFtpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgPT09IDAsIGluQW55UG9vbENvdW50ID09PSAwXQoJYnl0ZSAweDAwCglpbnQgMAoJZnJhbWVfZGlnIDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCWludCAwCgk9PQoJc2V0Yml0CglpbnQgMQoJZnJhbWVfZGlnIDEgLy8gaW5BbnlQb29sQ291bnQ6IHVpbnQ2NAoJaW50IDAKCT09CglzZXRiaXQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCgkvLyBwb3AgYWxsIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHRoZSBzdGFjawoJcG9wbiA0CglyZXRzdWIKCi8vIGFkZFBvb2xUb05vZGUodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcG9vbEFwcElkOiB1aW50NjQsIG5vZGVOdW06IHVpbnQ2NCk6IHZvaWQKYWRkUG9vbFRvTm9kZToKCXByb3RvIDMgMAoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjE5CgkvLyBub2RlUG9vbEFzc2lnbm1lbnRzID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5ub2RlUG9vbEFzc2lnbm1lbnRzKQoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfYnVyeSAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjIwCgkvLyBtYXhQb29sc1Blck5vZGVGb3JUaGlzVmFsaWRhdG9yID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcucG9vbHNQZXJOb2RlIGFzIHVpbnQ2NAoJaW50IDIyNQoJaW50IDEKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDEgLy8gbWF4UG9vbHNQZXJOb2RlRm9yVGhpc1ZhbGlkYXRvcjogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIyMgoJLy8gYXNzZXJ0KG5vZGVOdW0gPj0gMSAmJiBub2RlTnVtIDw9IE1BWF9OT0RFUywgJ25vZGUgbnVtYmVyIG5vdCBpbiB2YWxpZCByYW5nZScpCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgMQoJPj0KCWR1cAoJYnogKnNraXBfYW5kMTAKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCA4Cgk8PQoJJiYKCipza2lwX2FuZDEwOgoJLy8gbm9kZSBudW1iZXIgbm90IGluIHZhbGlkIHJhbmdlCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI0CgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IG1heFBvb2xzUGVyTm9kZUZvclRoaXNWYWxpZGF0b3I7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzk6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI0CgkvLyBpIDwgbWF4UG9vbHNQZXJOb2RlRm9yVGhpc1ZhbGlkYXRvcgoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglmcmFtZV9kaWcgMSAvLyBtYXhQb29sc1Blck5vZGVGb3JUaGlzVmFsaWRhdG9yOiB1aW50NjQKCTwKCWJ6ICpmb3JfOV9lbmQKCgkvLyAqaWY0NF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMjUKCS8vIG5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbbm9kZU51bSAtIDFdLnBvb2xBcHBJZHNbaV0gPT09IDAKCWZyYW1lX2RpZyAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCWludCAwCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgMQoJLQoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWY0NF9lbmQKCgkvLyAqaWY0NF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI3CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLm5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbbm9kZU51bSAtIDFdLnBvb2xBcHBJZHNbaV0gPSBwb29sQXBwSWQKCWludCA5MDAKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCAxCgktCglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDAKCSsKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJZnJhbWVfZGlnIC0yIC8vIHBvb2xBcHBJZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMjgKCS8vIHJldHVybgoJcmV0c3ViCgoqaWY0NF9lbmQ6CgoqZm9yXzlfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI0CgkvLyBpICs9IDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCWIgKmZvcl85CgoqZm9yXzlfZW5kOgoJLy8gbm8gYXZhaWxhYmxlIHNwYWNlIGluIHNwZWNpZmllZCBub2RlIGZvciB0aGlzIHBvb2wKCWVycgoJcmV0c3ViCgovLyBkb2VzU3Rha2VyTWVldEdhdGluZyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQpOiB2b2lkCi8vCi8vIENoZWNrcyBpZiBhIHN0YWtlciBtZWV0cyB0aGUgZ2F0aW5nIHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgYnkgdGhlIHZhbGlkYXRvci4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWx1ZVRvVmVyaWZ5IC0gVGhlIHZhbHVlIHRvIHZlcmlmeSBhZ2FpbnN0IHRoZSBnYXRpbmcgcmVxdWlyZW1lbnRzLgovLyBAcmV0dXJucyB7dm9pZH0gb3IgYXNzZXJ0cyBpZiByZXF1aXJlbWVudHMgbm90IG1ldC4KZG9lc1N0YWtlck1lZXRHYXRpbmc6Cglwcm90byAyIDAKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA4CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI0MgoJLy8gdHlwZSA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLmVudHJ5R2F0aW5nVHlwZQoJaW50IDgwCglpbnQgMQoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMCAvLyB0eXBlOiB1aW50OAoKCS8vICppZjQ1X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI0MwoJLy8gdHlwZSA9PT0gR0FUSU5HX1RZUEVfTk9ORQoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAwCgk9PQoJYnogKmlmNDVfZW5kCgoJLy8gKmlmNDVfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI0NAoJLy8gcmV0dXJuCglyZXRzdWIKCippZjQ1X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNDYKCS8vIHN0YWtlciA9IHRoaXMudHhuLnNlbmRlcgoJdHhuIFNlbmRlcgoJZnJhbWVfYnVyeSAxIC8vIHN0YWtlcjogYWRkcmVzcwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNDcKCS8vIGNvbmZpZyA9IGNsb25lKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnKQoJaW50IDAKCWludCAyNDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglmcmFtZV9idXJ5IDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCgkvLyAqaWY0Nl9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTEKCS8vIHR5cGUgPT09IEdBVElOR19UWVBFX0FTU0VUU19DUkVBVEVEX0JZIHx8CgkvLyAgICAgICAgICAgICB0eXBlID09PSBHQVRJTkdfVFlQRV9BU1NFVF9JRCB8fAoJLy8gICAgICAgICAgICAgdHlwZSA9PT0gR0FUSU5HX1RZUEVfQ1JFQVRFRF9CWV9ORkRfQUREUkVTU0VTCglmcmFtZV9kaWcgMCAvLyB0eXBlOiB1aW50OAoJaW50IDEKCT09CglkdXAKCWJueiAqc2tpcF9vcjQKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMgoJPT0KCXx8Cgoqc2tpcF9vcjQ6CglkdXAKCWJueiAqc2tpcF9vcjUKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMwoJPT0KCXx8Cgoqc2tpcF9vcjU6CglieiAqaWY0Nl9lbmQKCgkvLyAqaWY0Nl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjU1CgkvLyBhc3NlcnQodmFsdWVUb1ZlcmlmeSAhPT0gMCkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWludCAwCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI1NgoJLy8gYmFsUmVxdWlyZWQgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5nYXRpbmdBc3NldE1pbkJhbGFuY2UKCWludCAxNDUKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAzIC8vIGJhbFJlcXVpcmVkOiB1aW50NjQKCgkvLyAqaWY0N19jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTcKCS8vIGJhbFJlcXVpcmVkID09PSAwCglmcmFtZV9kaWcgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0CglpbnQgMAoJPT0KCWJ6ICppZjQ3X2VuZAoKCS8vICppZjQ3X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTgKCS8vIGJhbFJlcXVpcmVkID0gMQoJaW50IDEKCWZyYW1lX2J1cnkgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0CgoqaWY0N19lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjYwCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgc3Rha2VyLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQodmFsdWVUb1ZlcmlmeSkpID49IGJhbFJlcXVpcmVkLAoJLy8gICAgICAgICAgICAgICAgICdtdXN0IGhhdmUgcmVxdWlyZWQgbWluaW11bSBiYWxhbmNlIG9mIHZhbGlkYXRvciBkZWZpbmVkIHRva2VuIHRvIGFkZCBzdGFrZScsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgMSAvLyBzdGFrZXI6IGFkZHJlc3MKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQoJcG9wCglmcmFtZV9kaWcgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0Cgk+PQoKCS8vIG11c3QgaGF2ZSByZXF1aXJlZCBtaW5pbXVtIGJhbGFuY2Ugb2YgdmFsaWRhdG9yIGRlZmluZWQgdG9rZW4gdG8gYWRkIHN0YWtlCglhc3NlcnQKCippZjQ2X2VuZDoKCS8vICppZjQ4X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI2NQoJLy8gdHlwZSA9PT0gR0FUSU5HX1RZUEVfQVNTRVRTX0NSRUFURURfQlkKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMQoJPT0KCWJ6ICppZjQ4X2VuZAoKCS8vICppZjQ4X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNjYKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICBBc3NldElELmZyb21VaW50NjQodmFsdWVUb1ZlcmlmeSkuY3JlYXRvciA9PT0gY29uZmlnLmVudHJ5R2F0aW5nQWRkcmVzcywKCS8vICAgICAgICAgICAgICAgICAnc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgY3JlYXRlZCBieSBjcmVhdG9yIHRoYXQgdGhlIHZhbGlkYXRvciBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UnLAoJLy8gICAgICAgICAgICAgKQoJZnJhbWVfZGlnIC0yIC8vIHZhbHVlVG9WZXJpZnk6IHVpbnQ2NAoJYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKCXBvcAoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgODEgMzIKCT09CgoJLy8gc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgY3JlYXRlZCBieSBjcmVhdG9yIHRoYXQgdGhlIHZhbGlkYXRvciBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UKCWFzc2VydAoKKmlmNDhfZW5kOgoJLy8gKmlmNDlfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjcxCgkvLyB0eXBlID09PSBHQVRJTkdfVFlQRV9BU1NFVF9JRAoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAyCgk9PQoJYnogKmlmNDlfZW5kCgoJLy8gKmlmNDlfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3MgoJLy8gZm91bmQgPSBmYWxzZQoJaW50IDAKCWZyYW1lX2J1cnkgNCAvLyBmb3VuZDogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNzMKCS8vIGNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0cwoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMTEzIDMyCglkdXAKCWZyYW1lX2J1cnkgNSAvLyBjb3B5IG9mIHRoZSBhcnJheSB3ZSBhcmUgaXRlcmF0aW5nIG92ZXIKCWV4dHJhY3QgMCA4CglidG9pCglmcmFtZV9idXJ5IDYgLy8gYXNzZXRJZDogdWludDY0CglpbnQgMAoJZnJhbWVfYnVyeSA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCgoqZm9yT2ZfMDoKCS8vICppZjUwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3NAoJLy8gdmFsdWVUb1ZlcmlmeSA9PT0gYXNzZXRJZAoJZnJhbWVfZGlnIC0yIC8vIHZhbHVlVG9WZXJpZnk6IHVpbnQ2NAoJZnJhbWVfZGlnIDYgLy8gYXNzZXRJZDogdWludDY0Cgk9PQoJYnogKmlmNTBfZW5kCgoJLy8gKmlmNTBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3NQoJLy8gZm91bmQgPSB0cnVlCglpbnQgMQoJZnJhbWVfYnVyeSA0IC8vIGZvdW5kOiBib29sCgliICpmb3JPZl8wX2VuZAoKKmlmNTBfZW5kOgoKKmZvck9mXzBfY29udGludWU6CgkvLyBpbmNyZW1lbnQgb2Zmc2V0IGFuZCBsb29wIGlmIG5vdCBvdXQgb2YgYm91bmRzCglmcmFtZV9kaWcgNyAvLyB0aGUgb2Zmc2V0IHdlIGFyZSBleHRyYWN0aW5nIHRoZSBuZXh0IGVsZW1lbnQgZnJvbQoJaW50IDgKCSsKCWR1cAoJaW50IDMyIC8vIG9mZnNldCBvZiBsYXN0IGVsZW1lbnQKCTwKCWJ6ICpmb3JPZl8wX2VuZAoJZnJhbWVfYnVyeSA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCglmcmFtZV9kaWcgNSAvLyBjb3B5IG9mIHRoZSBhcnJheSB3ZSBhcmUgaXRlcmF0aW5nIG92ZXIKCWZyYW1lX2RpZyA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCglpbnQgOAoJZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSA2IC8vIGFzc2V0SWQ6IHVpbnQ2NAoJYiAqZm9yT2ZfMAoKKmZvck9mXzBfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3OQoJLy8gYXNzZXJ0KGZvdW5kLCAnc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgaWRlbnRpY2FsIHRvIHRoZSBhc3NldCBpZCBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UnKQoJZnJhbWVfZGlnIDQgLy8gZm91bmQ6IGJvb2wKCgkvLyBzcGVjaWZpZWQgYXNzZXQgbXVzdCBiZSBpZGVudGljYWwgdG8gdGhlIGFzc2V0IGlkIGRlZmluZWQgYXMgYSByZXF1aXJlbWVudCB0byBzdGFrZQoJYXNzZXJ0CgoqaWY0OV9lbmQ6CgkvLyAqaWY1MV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyODEKCS8vIHR5cGUgPT09IEdBVElOR19UWVBFX0NSRUFURURfQllfTkZEX0FERFJFU1NFUwoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAzCgk9PQoJYnogKmlmNTFfZW5kCgoJLy8gKmlmNTFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI4NAoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIHRoaXMuaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0KGNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0c1swXSwgQXNzZXRJRC5mcm9tVWludDY0KHZhbHVlVG9WZXJpZnkpLmNyZWF0b3IpLAoJLy8gICAgICAgICAgICAgICAgICdzcGVjaWZpZWQgYXNzZXQgbXVzdCBiZSBjcmVhdGVkIGJ5IGNyZWF0b3IgdGhhdCBpcyBvbmUgb2YgdGhlIGxpbmtlZCBhZGRyZXNzZXMgaW4gYW4gbmZkJywKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCglwb3AKCWZyYW1lX2RpZyAyIC8vIGNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCglleHRyYWN0IDExMyA4CglidG9pCgljYWxsc3ViIGlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdAoKCS8vIHNwZWNpZmllZCBhc3NldCBtdXN0IGJlIGNyZWF0ZWQgYnkgY3JlYXRvciB0aGF0IGlzIG9uZSBvZiB0aGUgbGlua2VkIGFkZHJlc3NlcyBpbiBhbiBuZmQKCWFzc2VydAoKKmlmNTFfZW5kOgoJLy8gKmlmNTJfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjg5CgkvLyB0eXBlID09PSBHQVRJTkdfVFlQRV9TRUdNRU5UX09GX05GRAoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCA0Cgk9PQoJYnogKmlmNTJfZW5kCgoJLy8gKmlmNTJfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI5MQoJLy8gdXNlck9mZmVyZWRORkRBcHBJRCA9IHZhbHVlVG9WZXJpZnkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWZyYW1lX2J1cnkgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjkyCgkvLyBhc3NlcnQodGhpcy5pc05GREFwcElEVmFsaWQodXNlck9mZmVyZWRORkRBcHBJRCksICdwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZCcpCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWNhbGxzdWIgaXNORkRBcHBJRFZhbGlkCgoJLy8gcHJvdmlkZWQgTkZEIG11c3QgYmUgdmFsaWQKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyOTUKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICByYXdCeXRlcyhBcHBJRC5mcm9tVWludDY0KHVzZXJPZmZlcmVkTkZEQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzKSA9PT0KCS8vICAgICAgICAgICAgICAgICAgICAgcmF3Qnl0ZXMoc3Rha2VyKSB8fCB0aGlzLmlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdCh1c2VyT2ZmZXJlZE5GREFwcElELCBzdGFrZXIpLAoJLy8gICAgICAgICAgICAgICAgICJwcm92aWRlZCBuZmQgZm9yIGVudHJ5IGlzbid0IG93bmVkIG9yIGxpbmtlZCB0byB0aGUgc3Rha2VyIiwKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyA4IC8vIHVzZXJPZmZlcmVkTkZEQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQodXNlck9mZmVyZWRORkRBcHBJRCkuZ2xvYmFsU3RhdGUoJ2kub3duZXIuYScpCglhc3NlcnQKCWZyYW1lX2RpZyAxIC8vIHN0YWtlcjogYWRkcmVzcwoJPT0KCWR1cAoJYm56ICpza2lwX29yNgoJZnJhbWVfZGlnIDEgLy8gc3Rha2VyOiBhZGRyZXNzCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWNhbGxzdWIgaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0Cgl8fAoKKnNraXBfb3I2OgoJLy8gcHJvdmlkZWQgbmZkIGZvciBlbnRyeSBpc24ndCBvd25lZCBvciBsaW5rZWQgdG8gdGhlIHN0YWtlcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMwMgoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIGJ0b2koQXBwSUQuZnJvbVVpbnQ2NCh1c2VyT2ZmZXJlZE5GREFwcElEKS5nbG9iYWxTdGF0ZSgnaS5wYXJlbnRBcHBJRCcpIGFzIGJ5dGVzKSA9PT0KCS8vICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmVudHJ5R2F0aW5nQXNzZXRzWzBdLAoJLy8gICAgICAgICAgICAgICAgICdzcGVjaWZpZWQgbmZkIG11c3QgYmUgYSBzZWdtZW50IG9mIHRoZSBuZmQgdGhlIHZhbGlkYXRvciBzcGVjaWZpZWQgYXMgYSByZXF1aXJlbWVudCcsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWJ5dGUgMHg2OTJlNzA2MTcyNjU2ZTc0NDE3MDcwNDk0NCAvLyAiaS5wYXJlbnRBcHBJRCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHVzZXJPZmZlcmVkTkZEQXBwSUQpLmdsb2JhbFN0YXRlKCdpLnBhcmVudEFwcElEJykKCWFzc2VydAoJYnRvaQoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMTEzIDgKCWJ0b2kKCT09CgoJLy8gc3BlY2lmaWVkIG5mZCBtdXN0IGJlIGEgc2VnbWVudCBvZiB0aGUgbmZkIHRoZSB2YWxpZGF0b3Igc3BlY2lmaWVkIGFzIGEgcmVxdWlyZW1lbnQKCWFzc2VydAoKKmlmNTJfZW5kOgoJcmV0c3ViCgovLyBpc05GREFwcElEVmFsaWQobmZkQXBwSUQ6IHVpbnQ2NCk6IGJvb2xlYW4KLy8KLy8gQ2hlY2tzIGlmIHRoZSBnaXZlbiBORkQgQXBwIGlkIGlzIHZhbGlkLiAgVXNpbmcgb25seSB0aGUgQXBwIGlkIHRoZXJlJ3Mgbm8gdmFsaWRhdGlvbiBhZ2FpbnN0IHRoZSBuYW1lIChpZTogdGhhdCBuZmQgWCBpcyBuYW1lIFkpCi8vIFNvIGl0J3MgYXNzdW1lZCBmb3IgdGhlIGNhbGxlciwgdGhlIGFwcCBpZCBhbG9uZSBpcyBmaW5lLiAgVGhlIG5hbWUgaXMgZmV0Y2hlZCBmcm9tIHRoZSBzcGVjaWZpZWQgYXBwIGlkIGFuZCB0aGUgdHdvCi8vIHRvZ2V0aGVyIGFyZSB1c2VkIGZvciB2YWxpZGl0eSBjaGVjayBjYWxsIHRvIHRoZSBuZmQgcmVnaXN0cnkuCi8vCi8vIEBwYXJhbSB7dWludDY0fSBuZmRBcHBJRCAtIFRoZSBORkQgQXBwIGlkIHRvIHZlcmlmeS4KLy8KLy8gQHJldHVybnMge2Jvb2xlYW59IC0gUmV0dXJucyB0cnVlIGlmIHRoZSBORkQgQXBwIGlkIGlzIHZhbGlkLCBvdGhlcndpc2UgZmFsc2UuCmlzTkZEQXBwSURWYWxpZDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMyMQoJLy8gdXNlck9mZmVyZWRORkROYW1lID0gQXBwSUQuZnJvbVVpbnQ2NChuZmRBcHBJRCkuZ2xvYmFsU3RhdGUoJ2kubmFtZScpIGFzIHN0cmluZwoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWJ5dGUgMHg2OTJlNmU2MTZkNjUgLy8gImkubmFtZSIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KG5mZEFwcElEKS5nbG9iYWxTdGF0ZSgnaS5uYW1lJykKCWFzc2VydAoJZnJhbWVfYnVyeSAwIC8vIHVzZXJPZmZlcmVkTkZETmFtZTogc3RyaW5nCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMyMwoJLy8gcmV0dXJuIHNlbmRNZXRob2RDYWxsPFtzdHJpbmcsIHVpbnQ2NF0sIGJvb2xlYW4+KHsKCS8vICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQodGhpcy5uZmRSZWdpc3RyeUFwcElkKSwKCS8vICAgICAgICAgICAgIG5hbWU6ICdpc1ZhbGlkTmZkQXBwSWQnLAoJLy8gICAgICAgICAgICAgbWV0aG9kQXJnczogW3VzZXJPZmZlcmVkTkZETmFtZSwgbmZkQXBwSURdLAoJLy8gICAgICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAiaXNWYWxpZE5mZEFwcElkKHN0cmluZyx1aW50NjQpYm9vbCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMyNAoJLy8gYXBwbGljYXRpb25JRDogQXBwSUQuZnJvbVVpbnQ2NCh0aGlzLm5mZFJlZ2lzdHJ5QXBwSWQpCglsb2FkIDIwMCAvLyBUTVBMX25mZFJlZ2lzdHJ5QXBwSWQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMjYKCS8vIG1ldGhvZEFyZ3M6IFt1c2VyT2ZmZXJlZE5GRE5hbWUsIG5mZEFwcElEXQoJZnJhbWVfZGlnIDAgLy8gdXNlck9mZmVyZWRORkROYW1lOiBzdHJpbmcKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoJaXR4biBOdW1Mb2dzCglpbnQgMQoJLQoJaXR4bmFzIExvZ3MKCWV4dHJhY3QgNCAwCglpbnQgMAoJZ2V0Yml0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCglyZXRzdWIKCi8vIGlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdChuZmRBcHBJRDogdWludDY0LCBhZGRyVG9GaW5kOiBBZGRyZXNzKTogYm9vbGVhbgovLwovLyBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBhZGRyZXNzIGlzIHByZXNlbnQgaW4gYW4gTkZEcyBsaXN0IG9mIHZlcmlmaWVkIGFkZHJlc3Nlcy4KLy8gVGhlIE5GRCBpcyBhc3N1bWVkIHRvIGhhdmUgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcyBvZmZpY2lhbC4KLy8KLy8gQHBhcmFtIHt1aW50NjR9IG5mZEFwcElEIC0gVGhlIE5GRCBhcHBsaWNhdGlvbiBpZC4KLy8gQHBhcmFtIHtBZGRyZXNzfSBhZGRyVG9GaW5kIC0gVGhlIGFkZHJlc3MgdG8gZmluZCBpbiB0aGUgdi5jYUFsZ28uMC5hcyBwcm9wZXJ0eQovLyBAcmV0dXJuIHtib29sZWFufSAtIGB0cnVlYCBpZiB0aGUgYWRkcmVzcyBpcyBwcmVzZW50LCBgZmFsc2VgIG90aGVyd2lzZS4KaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0OgoJcHJvdG8gMiAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMzkKCS8vIHNlbmRBcHBDYWxsKHsKCS8vICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLAoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25BcmdzOiBbJ3JlYWRfcHJvcGVydHknLCAndi5jYUFsZ28uMC5hcyddLAoJLy8gICAgICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzQwCgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KG5mZEFwcElEKQoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDEKCS8vIGFwcGxpY2F0aW9uQXJnczogWydyZWFkX3Byb3BlcnR5JywgJ3YuY2FBbGdvLjAuYXMnXQoJYnl0ZSAweDcyNjU2MTY0NWY3MDcyNmY3MDY1NzI3NDc5IC8vICJyZWFkX3Byb3BlcnR5IgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWJ5dGUgMHg3NjJlNjM2MTQxNmM2NzZmMmUzMDJlNjE3MyAvLyAidi5jYUFsZ28uMC5hcyIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDMKCS8vIGNhQWxnb0RhdGEgPSB0aGlzLml0eG4ubGFzdExvZwoJaXR4biBMYXN0TG9nCglmcmFtZV9idXJ5IDAgLy8gY2FBbGdvRGF0YTogYnl0ZVtdCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM0NAoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBjYUFsZ29EYXRhLmxlbmd0aDsgaSArPSAzMikKCWludCAwCglmcmFtZV9idXJ5IDEgLy8gaTogdWludDY0CgoqZm9yXzEwOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM0NAoJLy8gaSA8IGNhQWxnb0RhdGEubGVuZ3RoCglmcmFtZV9kaWcgMSAvLyBpOiB1aW50NjQKCWZyYW1lX2RpZyAwIC8vIGNhQWxnb0RhdGE6IGJ5dGVbXQoJbGVuCgk8CglieiAqZm9yXzEwX2VuZAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDUKCS8vIGFkZHIgPSBleHRyYWN0MyhjYUFsZ29EYXRhLCBpLCAzMikKCWZyYW1lX2RpZyAwIC8vIGNhQWxnb0RhdGE6IGJ5dGVbXQoJZnJhbWVfZGlnIDEgLy8gaTogdWludDY0CglpbnQgMzIKCWV4dHJhY3QzCglmcmFtZV9idXJ5IDIgLy8gYWRkcjogYnl0ZVtdCgoJLy8gKmlmNTNfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzQ2CgkvLyBhZGRyICE9PSByYXdCeXRlcyhnbG9iYWxzLnplcm9BZGRyZXNzKSAmJiBhZGRyID09PSByYXdCeXRlcyhhZGRyVG9GaW5kKQoJZnJhbWVfZGlnIDIgLy8gYWRkcjogYnl0ZVtdCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CglkdXAKCWJ6ICpza2lwX2FuZDExCglmcmFtZV9kaWcgMiAvLyBhZGRyOiBieXRlW10KCWZyYW1lX2RpZyAtMiAvLyBhZGRyVG9GaW5kOiBBZGRyZXNzCgk9PQoJJiYKCipza2lwX2FuZDExOgoJYnogKmlmNTNfZW5kCgoJLy8gKmlmNTNfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM0NwoJLy8gcmV0dXJuIHRydWUKCWludCAxCgliICppc0FkZHJlc3NJbk5GRENBQWxnb0xpc3QqcmV0dXJuCgoqaWY1M19lbmQ6CgoqZm9yXzEwX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM0NAoJLy8gaSArPSAzMgoJZnJhbWVfZGlnIDEgLy8gaTogdWludDY0CglpbnQgMzIKCSsKCWZyYW1lX2J1cnkgMSAvLyBpOiB1aW50NjQKCWIgKmZvcl8xMAoKKmZvcl8xMF9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzUwCgkvLyByZXR1cm4gZmFsc2UKCWludCAwCgoqaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0KnJldHVybjoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDIKCXJldHN1YgoKLy8gYWxnb1NhdHVyYXRpb25MZXZlbCgpOiB1aW50NjQKLy8KLy8gUmV0dXJucyB0aGUgbWF4aW11bSBhbGxvd2VkIHN0YWtlIHBlciB2YWxpZGF0b3IgYmFzZWQgb24gYSBwZXJjZW50YWdlIG9mIGFsbCBjdXJyZW50IG9ubGluZSBzdGFrZSBiZWZvcmUKLy8gdGhlIHZhbGlkYXRvciBpcyBjb25zaWRlcmVkIHNhdHVyYXRlZCAtIHdoZXJlIHJld2FyZHMgYXJlIGRpbWluaXNoZWQuCi8vIE5PVEU6IHRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCB0d2ljZSAtIGhlcmUgYW5kIGluIHN0YWtpbmcgcG9vbCBjb250cmFjdC4gIEJvdGggbXVzdCBiZSBpZGVudGljYWwuCmFsZ29TYXR1cmF0aW9uTGV2ZWw6Cglwcm90byAwIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNTkKCS8vIG9ubGluZSA9IHRoaXMuZ2V0Q3VycmVudE9ubGluZVN0YWtlKCkKCWNhbGxzdWIgZ2V0Q3VycmVudE9ubGluZVN0YWtlCglmcmFtZV9idXJ5IDAgLy8gb25saW5lOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzYxCgkvLyByZXR1cm4gd2lkZVJhdGlvKFtvbmxpbmUsIE1BWF9WQUxJREFUT1JfU09GVF9QQ1RfT0ZfT05MSU5FXzFERUNJTUFMXSwgWzEwMDBdKQoJZnJhbWVfZGlnIDAgLy8gb25saW5lOiB1aW50NjQKCWludCAxMDAKCW11bHcKCWludCAwCglpbnQgMTAwMAoJZGl2bW9kdwoJcG9wCglwb3AKCXN3YXAKCSEKCgkvLyB3aWRlUmF0aW8gZmFpbGVkCglhc3NlcnQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gbWF4QWxsb3dlZFN0YWtlKCk6IHVpbnQ2NAovLwovLyBSZXR1cm5zIHRoZSBNQVhJTVVNIGFsbG93ZWQgc3Rha2UgcGVyIHZhbGlkYXRvciBiYXNlZCBvbiBhIHBlcmNlbnRhZ2Ugb2YgYWxsIGN1cnJlbnQgb25saW5lIHN0YWtlLgovLyBBZGRpbmcgc3Rha2UgaXMgY29tcGxldGVseSBibG9ja2VkIGF0IHRoaXMgYW1vdW50LgptYXhBbGxvd2VkU3Rha2U6Cglwcm90byAwIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNjkKCS8vIG9ubGluZSA9IHRoaXMuZ2V0Q3VycmVudE9ubGluZVN0YWtlKCkKCWNhbGxzdWIgZ2V0Q3VycmVudE9ubGluZVN0YWtlCglmcmFtZV9idXJ5IDAgLy8gb25saW5lOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzcxCgkvLyByZXR1cm4gd2lkZVJhdGlvKFtvbmxpbmUsIE1BWF9WQUxJREFUT1JfSEFSRF9QQ1RfT0ZfT05MSU5FXzFERUNJTUFMXSwgWzEwMDBdKQoJZnJhbWVfZGlnIDAgLy8gb25saW5lOiB1aW50NjQKCWludCAxNTAKCW11bHcKCWludCAwCglpbnQgMTAwMAoJZGl2bW9kdwoJcG9wCglwb3AKCXN3YXAKCSEKCgkvLyB3aWRlUmF0aW8gZmFpbGVkCglhc3NlcnQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gbWF4QWxnb0FsbG93ZWRQZXJQb29sKCk6IHVpbnQ2NAovLwovLyBSZXR1cm5zIHRoZSBNQVhJTVVNIGFsbG93ZWQgc3Rha2UgcGVyIHBvb2wgYW5kIHN0aWxsIHJlY2VpdmUgaW5jZW50aXZlcyAtIHdlJ2xsIHRyZWF0IHRoaXMgYXMgdGhlICdtYXggcGVyIHBvb2wnCm1heEFsZ29BbGxvd2VkUGVyUG9vbDoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNzgKCS8vIHJldHVybiBnbG9iYWxzLnBheW91dHNNYXhCYWxhbmNlCglnbG9iYWwgUGF5b3V0c01heEJhbGFuY2UKCXJldHN1YgoKLy8gZ2V0Q3VycmVudE9ubGluZVN0YWtlKCk6IHVpbnQ2NApnZXRDdXJyZW50T25saW5lU3Rha2U6Cglwcm90byAwIDEKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzgyCgkvLyByZXR1cm4gb25saW5lU3Rha2UoKQoJb25saW5lX3N0YWtlCglyZXRzdWIKCi8vIG1pbkJhbGFuY2VGb3JBY2NvdW50KGNvbnRyYWN0czogdWludDY0LCBleHRyYVBhZ2VzOiB1aW50NjQsIGFzc2V0czogdWludDY0LCBsb2NhbEludHM6IHVpbnQ2NCwgbG9jYWxCeXRlczogdWludDY0LCBnbG9iYWxJbnRzOiB1aW50NjQsIGdsb2JhbEJ5dGVzOiB1aW50NjQpOiB1aW50NjQKbWluQmFsYW5jZUZvckFjY291bnQ6Cglwcm90byA3IDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzOTQKCS8vIG1pbkJhbCA9IEFMR09SQU5EX0FDQ09VTlRfTUlOX0JBTEFOQ0UKCWludCAxMDAwMDAKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzOTUKCS8vIG1pbkJhbCArPSBjb250cmFjdHMgKiBBUFBMSUNBVElPTl9CQVNFX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyBjb250cmFjdHM6IHVpbnQ2NAoJaW50IDEwMDAwMAoJKgoJKwoJZnJhbWVfYnVyeSAwIC8vIG1pbkJhbDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM5NgoJLy8gbWluQmFsICs9IGV4dHJhUGFnZXMgKiBBUFBMSUNBVElPTl9CQVNFX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyBleHRyYVBhZ2VzOiB1aW50NjQKCWludCAxMDAwMDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzOTcKCS8vIG1pbkJhbCArPSBhc3NldHMgKiBBU1NFVF9IT0xESU5HX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMyAvLyBhc3NldHM6IHVpbnQ2NAoJaW50IDEwMDAwMAoJKgoJKwoJZnJhbWVfYnVyeSAwIC8vIG1pbkJhbDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM5OAoJLy8gbWluQmFsICs9IGxvY2FsSW50cyAqIFNTQ19WQUxVRV9VSU5UCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoJZnJhbWVfZGlnIC00IC8vIGxvY2FsSW50czogdWludDY0CglpbnQgMjg1MDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzOTkKCS8vIG1pbkJhbCArPSBnbG9iYWxJbnRzICogU1NDX1ZBTFVFX1VJTlQKCWZyYW1lX2RpZyAwIC8vIG1pbkJhbDogdWludDY0CglmcmFtZV9kaWcgLTYgLy8gZ2xvYmFsSW50czogdWludDY0CglpbnQgMjg1MDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDAKCS8vIG1pbkJhbCArPSBsb2NhbEJ5dGVzICogU1NDX1ZBTFVFX0JZVEVTCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoJZnJhbWVfZGlnIC01IC8vIGxvY2FsQnl0ZXM6IHVpbnQ2NAoJaW50IDUwMDAwCgkqCgkrCglmcmFtZV9idXJ5IDAgLy8gbWluQmFsOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDAxCgkvLyBtaW5CYWwgKz0gZ2xvYmFsQnl0ZXMgKiBTU0NfVkFMVUVfQllURVMKCWZyYW1lX2RpZyAwIC8vIG1pbkJhbDogdWludDY0CglmcmFtZV9kaWcgLTcgLy8gZ2xvYmFsQnl0ZXM6IHVpbnQ2NAoJaW50IDUwMDAwCgkqCgkrCglmcmFtZV9idXJ5IDAgLy8gbWluQmFsOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDAyCgkvLyByZXR1cm4gbWluQmFsCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoJcmV0c3ViCgovLyBjb3N0Rm9yQm94U3RvcmFnZSh0b3RhbE51bUJ5dGVzOiB1aW50NjQpOiB1aW50NjQKY29zdEZvckJveFN0b3JhZ2U6Cglwcm90byAxIDEKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDA5CgkvLyByZXR1cm4gU0NCT1hfUEVSQk9YICsgdG90YWxOdW1CeXRlcyAqIFNDQk9YX1BFUkJZVEUKCWludCAyNTAwCglmcmFtZV9kaWcgLTEgLy8gdG90YWxOdW1CeXRlczogdWludDY0CglpbnQgNDAwCgkqCgkrCglyZXRzdWIKCipjcmVhdGVfTm9PcDoKCW1ldGhvZCAiY3JlYXRlQXBwbGljYXRpb24oKXZvaWQiCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAwCgltYXRjaCAqYWJpX3JvdXRlX2NyZWF0ZUFwcGxpY2F0aW9uCgoJLy8gdGhpcyBjb250cmFjdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGdpdmVuIEFCSSBtZXRob2QgZm9yIGNyZWF0ZSBOb09wCgllcnIKCipjYWxsX05vT3A6CgltZXRob2QgImluaXRTdGFraW5nQ29udHJhY3QodWludDY0KXZvaWQiCgltZXRob2QgImxvYWRTdGFraW5nQ29udHJhY3REYXRhKHVpbnQ2NCxieXRlW10pdm9pZCIKCW1ldGhvZCAiZmluYWxpemVTdGFraW5nQ29udHJhY3QoKXZvaWQiCgltZXRob2QgImdhcygpdm9pZCIKCW1ldGhvZCAiZ2V0TWJyQW1vdW50cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCgltZXRob2QgImdldFByb3RvY29sQ29uc3RyYWludHMoKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiZ2V0TnVtVmFsaWRhdG9ycygpdWludDY0IgoJbWV0aG9kICJnZXRWYWxpZGF0b3JDb25maWcodWludDY0KSh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiZ2V0VmFsaWRhdG9yU3RhdGUodWludDY0KSh1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQpIgoJbWV0aG9kICJnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpIgoJbWV0aG9kICJnZXRQb29scyh1aW50NjQpKHVpbnQ2NCx1aW50MTYsdWludDY0KVtdIgoJbWV0aG9kICJnZXRQb29sQXBwSWQodWludDY0LHVpbnQ2NCl1aW50NjQiCgltZXRob2QgImdldFBvb2xJbmZvKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpKHVpbnQ2NCx1aW50MTYsdWludDY0KSIKCW1ldGhvZCAiZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHVpbnQ2NCl1aW50NjQiCgltZXRob2QgImRvZXNTdGFrZXJOZWVkVG9QYXlNQlIoYWRkcmVzcylib29sIgoJbWV0aG9kICJnZXRTdGFrZWRQb29sc0ZvckFjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCx1aW50NjQpW10iCgltZXRob2QgImdldFRva2VuUGF5b3V0UmF0aW8odWludDY0KSh1aW50NjRbMjRdLHVpbnQ2NCkiCgltZXRob2QgImdldE5vZGVQb29sQXNzaWdubWVudHModWludDY0KSgodWludDY0WzNdKVs4XSkiCgltZXRob2QgImdldE5GRFJlZ2lzdHJ5SUQoKXVpbnQ2NCIKCW1ldGhvZCAiYWRkVmFsaWRhdG9yKHBheSxzdHJpbmcsKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIKCW1ldGhvZCAiY2hhbmdlVmFsaWRhdG9yTWFuYWdlcih1aW50NjQsYWRkcmVzcyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQiCgltZXRob2QgImNoYW5nZVZhbGlkYXRvck5GRCh1aW50NjQsdWludDY0LHN0cmluZyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyh1aW50NjQsYWRkcmVzcyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JSZXdhcmRJbmZvKHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0KXZvaWQiCgltZXRob2QgImFkZFBvb2wocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAic2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KSIKCW1ldGhvZCAic3Rha2VVcGRhdGVkVmlhUmV3YXJkcygodWludDY0LHVpbnQ2NCx1aW50NjQpLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIgoJbWV0aG9kICJzdGFrZVJlbW92ZWQoKHVpbnQ2NCx1aW50NjQsdWludDY0KSxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCl2b2lkIgoJbWV0aG9kICJmaW5kUG9vbEZvclN0YWtlcih1aW50NjQsYWRkcmVzcyx1aW50NjQpKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKSIKCW1ldGhvZCAibW92ZVBvb2xUb05vZGUodWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIKCW1ldGhvZCAiZW1wdHlUb2tlblJld2FyZHModWludDY0LGFkZHJlc3MpdWludDY0IgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggKmFiaV9yb3V0ZV9pbml0U3Rha2luZ0NvbnRyYWN0ICphYmlfcm91dGVfbG9hZFN0YWtpbmdDb250cmFjdERhdGEgKmFiaV9yb3V0ZV9maW5hbGl6ZVN0YWtpbmdDb250cmFjdCAqYWJpX3JvdXRlX2dhcyAqYWJpX3JvdXRlX2dldE1ickFtb3VudHMgKmFiaV9yb3V0ZV9nZXRQcm90b2NvbENvbnN0cmFpbnRzICphYmlfcm91dGVfZ2V0TnVtVmFsaWRhdG9ycyAqYWJpX3JvdXRlX2dldFZhbGlkYXRvckNvbmZpZyAqYWJpX3JvdXRlX2dldFZhbGlkYXRvclN0YXRlICphYmlfcm91dGVfZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyICphYmlfcm91dGVfZ2V0UG9vbHMgKmFiaV9yb3V0ZV9nZXRQb29sQXBwSWQgKmFiaV9yb3V0ZV9nZXRQb29sSW5mbyAqYWJpX3JvdXRlX2dldEN1ck1heFN0YWtlUGVyUG9vbCAqYWJpX3JvdXRlX2RvZXNTdGFrZXJOZWVkVG9QYXlNQlIgKmFiaV9yb3V0ZV9nZXRTdGFrZWRQb29sc0ZvckFjY291bnQgKmFiaV9yb3V0ZV9nZXRUb2tlblBheW91dFJhdGlvICphYmlfcm91dGVfZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cyAqYWJpX3JvdXRlX2dldE5GRFJlZ2lzdHJ5SUQgKmFiaV9yb3V0ZV9hZGRWYWxpZGF0b3IgKmFiaV9yb3V0ZV9jaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyICphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyAqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvck5GRCAqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzICphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mbyAqYWJpX3JvdXRlX2FkZFBvb2wgKmFiaV9yb3V0ZV9hZGRTdGFrZSAqYWJpX3JvdXRlX3NldFRva2VuUGF5b3V0UmF0aW8gKmFiaV9yb3V0ZV9zdGFrZVVwZGF0ZWRWaWFSZXdhcmRzICphYmlfcm91dGVfc3Rha2VSZW1vdmVkICphYmlfcm91dGVfZmluZFBvb2xGb3JTdGFrZXIgKmFiaV9yb3V0ZV9tb3ZlUG9vbFRvTm9kZSAqYWJpX3JvdXRlX2VtcHR5VG9rZW5SZXdhcmRzCgoJLy8gdGhpcyBjb250cmFjdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGdpdmVuIEFCSSBtZXRob2QgZm9yIGNhbGwgTm9PcAoJZXJy", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCgovLyBUaGlzIFRFQUwgd2FzIGdlbmVyYXRlZCBieSBURUFMU2NyaXB0IHYwLjEwMy4wCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbGdvcmFuZGZvdW5kYXRpb24vVEVBTFNjcmlwdAoKLy8gVGhpcyBjb250cmFjdCBpcyBjb21wbGlhbnQgd2l0aCBhbmQvb3IgaW1wbGVtZW50cyB0aGUgZm9sbG93aW5nIEFSQ3M6IFsgQVJDNCBdCgovLyBUaGUgZm9sbG93aW5nIGxpbmVzIG9mIFRFQUwgYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0ZW1wbGF0ZSB2YXJpYWJsZXMgaW4gc2NyYXRjaCBzbG90cwpwdXNoYnl0ZXMgVE1QTF9uZmRSZWdpc3RyeUFwcElkCmJ0b2kKc3RvcmUgMjAwCgovLyBUaGUgZm9sbG93aW5nIHRlbiBsaW5lcyBvZiBURUFMIGhhbmRsZSBpbml0aWFsIHByb2dyYW0gZmxvdwovLyBUaGlzIHBhdHRlcm4gaXMgdXNlZCB0byBtYWtlIGl0IGVhc3kgZm9yIGFueW9uZSB0byBwYXJzZSB0aGUgc3RhcnQgb2YgdGhlIHByb2dyYW0gYW5kIGRldGVybWluZSBpZiBhIHNwZWNpZmljIGFjdGlvbiBpcyBhbGxvd2VkCi8vIEhlcmUsIGFjdGlvbiByZWZlcnMgdG8gdGhlIE9uQ29tcGxldGUgaW4gY29tYmluYXRpb24gd2l0aCB3aGV0aGVyIHRoZSBhcHAgaXMgYmVpbmcgY3JlYXRlZCBvciBjYWxsZWQKLy8gRXZlcnkgcG9zc2libGUgYWN0aW9uIGZvciB0aGlzIGNvbnRyYWN0IGlzIHJlcHJlc2VudGVkIGluIHRoZSBzd2l0Y2ggc3RhdGVtZW50Ci8vIElmIHRoZSBhY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIGluIHRoZSBjb250cmFjdCwgaXRzIHJlc3BlY3RpdmUgYnJhbmNoIHdpbGwgYmUgIipOT1RfSU1QTEVNRU5URUQiIHdoaWNoIGp1c3QgY29udGFpbnMgImVyciIKdHhuIEFwcGxpY2F0aW9uSUQKIQppbnQgNgoqCnR4biBPbkNvbXBsZXRpb24KKwpzd2l0Y2ggKmNhbGxfTm9PcCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKmNyZWF0ZV9Ob09wICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRAoKKk5PVF9JTVBMRU1FTlRFRDoKCS8vIFRoZSByZXF1ZXN0ZWQgYWN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIGNvbnRyYWN0LiBBcmUgeW91IHVzaW5nIHRoZSBjb3JyZWN0IE9uQ29tcGxldGU/IERpZCB5b3Ugc2V0IHlvdXIgYXBwIElEPwoJZXJyCgovLyBjcmVhdGVBcHBsaWNhdGlvbigpdm9pZAoqYWJpX3JvdXRlX2NyZWF0ZUFwcGxpY2F0aW9uOgoJLy8gZXhlY3V0ZSBjcmVhdGVBcHBsaWNhdGlvbigpdm9pZAoJY2FsbHN1YiBjcmVhdGVBcHBsaWNhdGlvbgoJaW50IDEKCXJldHVybgoKLy8gY3JlYXRlQXBwbGljYXRpb24oKTogdm9pZApjcmVhdGVBcHBsaWNhdGlvbjoKCXByb3RvIDAgMAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyCgkvLyB0aGlzLnN0YWtpbmdQb29sSW5pdGlhbGl6ZWQudmFsdWUgPSBmYWxzZQoJYnl0ZSAweDY5NmU2OTc0IC8vICJpbml0IgoJaW50IDAKCWJ5dGUgMHgwMAoJaW50IDAKCXVuY292ZXIgMgoJc2V0Yml0CglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgzCgkvLyB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgPSAwCglieXRlIDB4NmU3NTZkNTYgLy8gIm51bVYiCglpbnQgMAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NAoJLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlID0gMAoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJaW50IDAKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODUKCS8vIHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlID0gMAoJYnl0ZSAweDczNzQ2MTZiNjU2NCAvLyAic3Rha2VkIgoJaW50IDAKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIGluaXRTdGFraW5nQ29udHJhY3QodWludDY0KXZvaWQKKmFiaV9yb3V0ZV9pbml0U3Rha2luZ0NvbnRyYWN0OgoJLy8gYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBpbml0U3Rha2luZ0NvbnRyYWN0KHVpbnQ2NCl2b2lkCgljYWxsc3ViIGluaXRTdGFraW5nQ29udHJhY3QKCWludCAxCglyZXR1cm4KCi8vIGluaXRTdGFraW5nQ29udHJhY3QoYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0KTogdm9pZAppbml0U3Rha2luZ0NvbnRyYWN0OgoJcHJvdG8gMSAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTAKCS8vIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uY3JlYXRlKGFwcHJvdmFsUHJvZ3JhbVNpemUpCglieXRlIDB4NzA2ZjZmNmM1NDY1NmQ3MDZjNjE3NDY1NDE3MDcwNzI2Zjc2NjE2YzQyNzk3NDY1NzMgLy8gInBvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMiCglmcmFtZV9kaWcgLTEgLy8gYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0Cglib3hfY3JlYXRlCglwb3AKCXJldHN1YgoKLy8gbG9hZFN0YWtpbmdDb250cmFjdERhdGEodWludDY0LGJ5dGVbXSl2b2lkCiphYmlfcm91dGVfbG9hZFN0YWtpbmdDb250cmFjdERhdGE6CgkvLyBkYXRhOiBieXRlW10KCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWV4dHJhY3QgMiAwCgoJLy8gb2Zmc2V0OiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGxvYWRTdGFraW5nQ29udHJhY3REYXRhKHVpbnQ2NCxieXRlW10pdm9pZAoJY2FsbHN1YiBsb2FkU3Rha2luZ0NvbnRyYWN0RGF0YQoJaW50IDEKCXJldHVybgoKLy8gbG9hZFN0YWtpbmdDb250cmFjdERhdGEob2Zmc2V0OiB1aW50NjQsIGRhdGE6IGJ5dGVzKTogdm9pZApsb2FkU3Rha2luZ0NvbnRyYWN0RGF0YToKCXByb3RvIDIgMAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk0CgkvLyBhc3NlcnQoIXRoaXMuc3Rha2luZ1Bvb2xJbml0aWFsaXplZC52YWx1ZSkKCWJ5dGUgMHg2OTZlNjk3NCAvLyAiaW5pdCIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMAoJZ2V0Yml0CgkhCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5NQoJLy8gdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5yZXBsYWNlKG9mZnNldCwgZGF0YSkKCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWZyYW1lX2RpZyAtMSAvLyBvZmZzZXQ6IHVpbnQ2NAoJZnJhbWVfZGlnIC0yIC8vIGRhdGE6IGJ5dGVzCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdCgpdm9pZAoqYWJpX3JvdXRlX2ZpbmFsaXplU3Rha2luZ0NvbnRyYWN0OgoJLy8gZXhlY3V0ZSBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdCgpdm9pZAoJY2FsbHN1YiBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdAoJaW50IDEKCXJldHVybgoKLy8gZmluYWxpemVTdGFraW5nQ29udHJhY3QoKTogdm9pZApmaW5hbGl6ZVN0YWtpbmdDb250cmFjdDoKCXByb3RvIDAgMAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk5CgkvLyB0aGlzLnN0YWtpbmdQb29sSW5pdGlhbGl6ZWQudmFsdWUgPSB0cnVlCglieXRlIDB4Njk2ZTY5NzQgLy8gImluaXQiCglpbnQgMQoJYnl0ZSAweDAwCglpbnQgMAoJdW5jb3ZlciAyCglzZXRiaXQKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIGdhcygpdm9pZAoqYWJpX3JvdXRlX2dhczoKCS8vIGV4ZWN1dGUgZ2FzKCl2b2lkCgljYWxsc3ViIGdhcwoJaW50IDEKCXJldHVybgoKLy8gZ2FzKCk6IHZvaWQKLy8KLy8gZ2FzIGlzIGEgZHVtbXkgbm8tb3AgY2FsbCB0aGF0IGNhbiBiZSB1c2VkIHRvIHBvb2wtdXAgcmVzb3VyY2UgcmVmZXJlbmNlcyBhbmQgb3Bjb2RlIGNvc3QKZ2FzOgoJcHJvdG8gMCAwCglyZXRzdWIKCi8vIGdldE1ickFtb3VudHMoKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0TWJyQW1vdW50czoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXRNYnJBbW91bnRzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0TWJyQW1vdW50cygpOiBNYnJBbW91bnRzCi8vCi8vIFJldHVybnMgdGhlIE1CUiBhbW91bnRzIG5lZWRlZCBmb3IgdmFyaW91cyBhY3Rpb25zOgovLyBbCi8vIGFkZFZhbGlkYXRvck1icjogdWludDY0IC0gbWJyIG5lZWRlZCB0byBhZGQgYSBuZXcgdmFsaWRhdG9yIC0gcGFpZCB0byB2YWxpZGF0b3IgY29udHJhY3QKLy8gYWRkUG9vbE1icjogdWludDY0IC0gbWJyIG5lZWRlZCB0byBhZGQgYSBuZXcgcG9vbCAtIHBhaWQgdG8gdmFsaWRhdG9yCi8vIHBvb2xJbml0TWJyOiB1aW50NjQgLSBtYnIgbmVlZGVkIHRvIGluaXRTdG9yYWdlKCkgb2YgcG9vbCAtIHBhaWQgdG8gcG9vbCBpdHNlbGYKLy8gYWRkU3Rha2VyTWJyOiB1aW50NjQgLSBtYnIgc3Rha2VyIG5lZWRzIHRvIGFkZCB0byBmaXJzdCBzdGFraW5nIHBheW1lbnQgKHN0YXlzIHcvIHZhbGlkYXRvcikKLy8gXQpnZXRNYnJBbW91bnRzOgoJcHJvdG8gMCAxCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5CgkvLyByZXR1cm4gewoJLy8gICAgICAgICAgICAgYWRkVmFsaWRhdG9yTWJyOiB0aGlzLmNvc3RGb3JCb3hTdG9yYWdlKDEgLyogdiBwcmVmaXggKi8gKyBsZW48VmFsaWRhdG9ySWRUeXBlPigpICsgbGVuPFZhbGlkYXRvckluZm8+KCkpLAoJLy8gICAgICAgICAgICAgYWRkUG9vbE1icjogdGhpcy5taW5CYWxhbmNlRm9yQWNjb3VudCgKCS8vICAgICAgICAgICAgICAgICAxLAoJLy8gICAgICAgICAgICAgICAgIC8vIHdlIGNvdWxkIGNhbGN1bGF0ZSB0aGlzIGRpcmVjdGx5IGJ5IHJlZmVyZW5jaW5nIHRoZSBzaXplIG9mIHN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtIGJ1dCBpdCB3b3VsZAoJLy8gICAgICAgICAgICAgICAgIC8vIG1lYW4gb3VyIGNhbGxlcnMgd291bGQgaGF2ZSB0byByZWZlcmVuY2UgdGhlIGJveCBBTkQgYnV5IHVwIGkvbyAtIHNvIGp1c3QgZ28gbWF4IG9uIGV4dHJhIHBhZ2VzCgkvLyAgICAgICAgICAgICAgICAgMywKCS8vICAgICAgICAgICAgICAgICAwLAoJLy8gICAgICAgICAgICAgICAgIDAsCgkvLyAgICAgICAgICAgICAgICAgMCwKCS8vICAgICAgICAgICAgICAgICBTdGFraW5nUG9vbC5zY2hlbWEuZ2xvYmFsLm51bVVpbnQsCgkvLyAgICAgICAgICAgICAgICAgU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1CeXRlU2xpY2UsCgkvLyAgICAgICAgICAgICApLAoJLy8gICAgICAgICAgICAgcG9vbEluaXRNYnI6CgkvLyAgICAgICAgICAgICAgICAgQUxHT1JBTkRfQUNDT1VOVF9NSU5fQkFMQU5DRSArCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5jb3N0Rm9yQm94U3RvcmFnZSg3IC8qICdzdGFrZXJzJyBuYW1lICovICsgbGVuPFN0YWtlZEluZm8+KCkgKiBNQVhfU1RBS0VSU19QRVJfUE9PTCksCgkvLyAgICAgICAgICAgICBhZGRTdGFrZXJNYnI6CgkvLyAgICAgICAgICAgICAgICAgLy8gaG93IG11Y2ggdG8gY2hhcmdlIGZvciBmaXJzdCB0aW1lIGEgc3Rha2VyIGFkZHMgc3Rha2UgLSBzaW5jZSB3ZSBhZGQgYSB0cmFja2luZyBib3ggcGVyIHN0YWtlcgoJLy8gICAgICAgICAgICAgICAgIHRoaXMuY29zdEZvckJveFN0b3JhZ2UoCgkvLyAgICAgICAgICAgICAgICAgICAgIDMgLyogJ3NwcycgcHJlZml4ICovICsgbGVuPEFkZHJlc3M+KCkgKyBsZW48VmFsaWRhdG9yUG9vbEtleT4oKSAqIE1BWF9QT09MU19QRVJfU1RBS0VSLAoJLy8gICAgICAgICAgICAgICAgICksIC8vIHNpemUgb2Yga2V5ICsgYWxsIHZhbHVlcwoJLy8gICAgICAgICB9CglpbnQgMTEwMQoJY2FsbHN1YiBjb3N0Rm9yQm94U3RvcmFnZQoJaXRvYgoJaW50IDMKCWludCAxMQoJaW50IDAKCWR1cG4gMgoJaW50IDMKCWludCAxCgljYWxsc3ViIG1pbkJhbGFuY2VGb3JBY2NvdW50CglpdG9iCgljb25jYXQKCWludCAxMDAwMDAKCWludCAxMjgwNwoJY2FsbHN1YiBjb3N0Rm9yQm94U3RvcmFnZQoJKwoJaXRvYgoJY29uY2F0CglpbnQgMTc5CgljYWxsc3ViIGNvc3RGb3JCb3hTdG9yYWdlCglpdG9iCgljb25jYXQKCXJldHN1YgoKLy8gZ2V0UHJvdG9jb2xDb25zdHJhaW50cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0UHJvdG9jb2xDb25zdHJhaW50czoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXRQcm90b2NvbENvbnN0cmFpbnRzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWNhbGxzdWIgZ2V0UHJvdG9jb2xDb25zdHJhaW50cwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFByb3RvY29sQ29uc3RyYWludHMoKTogQ29uc3RyYWludHMKLy8KLy8gUmV0dXJucyB0aGUgcHJvdG9jb2wgY29uc3RyYWludHMgc28gdGhhdCBVSXMgY2FuIGxpbWl0IHdoYXQgdXNlcnMgc3BlY2lmeSBmb3IgdmFsaWRhdG9yIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KZ2V0UHJvdG9jb2xDb25zdHJhaW50czoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0NwoJLy8gcmV0dXJuIHsKCS8vICAgICAgICAgICAgIGVwb2NoUGF5b3V0Um91bmRzTWluOiBNSU5fRVBPQ0hfTEVOR1RILAoJLy8gICAgICAgICAgICAgZXBvY2hQYXlvdXRSb3VuZHNNYXg6IE1BWF9FUE9DSF9MRU5HVEgsCgkvLyAgICAgICAgICAgICBtaW5QY3RUb1ZhbGlkYXRvcldGb3VyRGVjaW1hbHM6IE1JTl9QQ1RfVE9fVkFMSURBVE9SLAoJLy8gICAgICAgICAgICAgbWF4UGN0VG9WYWxpZGF0b3JXRm91ckRlY2ltYWxzOiBNQVhfUENUX1RPX1ZBTElEQVRPUiwKCS8vICAgICAgICAgICAgIG1pbkVudHJ5U3Rha2U6IE1JTl9BTEdPX1NUQUtFX1BFUl9QT09MLAoJLy8gICAgICAgICAgICAgbWF4QWxnb1BlclBvb2w6IHRoaXMubWF4QWxnb0FsbG93ZWRQZXJQb29sKCksCgkvLyAgICAgICAgICAgICBtYXhBbGdvUGVyVmFsaWRhdG9yOiB0aGlzLm1heEFsbG93ZWRTdGFrZSgpLAoJLy8gICAgICAgICAgICAgYW10Q29uc2lkZXJlZFNhdHVyYXRlZDogdGhpcy5hbGdvU2F0dXJhdGlvbkxldmVsKCksCgkvLyAgICAgICAgICAgICBtYXhOb2RlczogTUFYX05PREVTLAoJLy8gICAgICAgICAgICAgbWF4UG9vbHNQZXJOb2RlOiBNQVhfUE9PTFNfUEVSX05PREUsCgkvLyAgICAgICAgICAgICBtYXhTdGFrZXJzUGVyUG9vbDogTUFYX1NUQUtFUlNfUEVSX1BPT0wsCgkvLyAgICAgICAgIH0KCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDBmNDI0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGY0MjQwMDAwMDAwMDAwMDBmNDI0MAoJY2FsbHN1YiBtYXhBbGdvQWxsb3dlZFBlclBvb2wKCWl0b2IKCWNvbmNhdAoJY2FsbHN1YiBtYXhBbGxvd2VkU3Rha2UKCWl0b2IKCWNvbmNhdAoJY2FsbHN1YiBhbGdvU2F0dXJhdGlvbkxldmVsCglpdG9iCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDA4Cgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAzCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMGM4Cgljb25jYXQKCXJldHN1YgoKLy8gZ2V0TnVtVmFsaWRhdG9ycygpdWludDY0CiphYmlfcm91dGVfZ2V0TnVtVmFsaWRhdG9yczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXROdW1WYWxpZGF0b3JzKCl1aW50NjQKCWNhbGxzdWIgZ2V0TnVtVmFsaWRhdG9ycwoJaXRvYgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldE51bVZhbGlkYXRvcnMoKTogdWludDY0Ci8vCi8vIFJldHVybnMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHZhbGlkYXRvcnMKZ2V0TnVtVmFsaWRhdG9yczoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE2NwoJLy8gcmV0dXJuIHRoaXMubnVtVmFsaWRhdG9ycy52YWx1ZQoJYnl0ZSAweDZlNzU2ZDU2IC8vICJudW1WIgoJYXBwX2dsb2JhbF9nZXQKCXJldHN1YgoKLy8gZ2V0VmFsaWRhdG9yQ29uZmlnKHVpbnQ2NCkodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKKmFiaV9yb3V0ZV9nZXRWYWxpZGF0b3JDb25maWc6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFZhbGlkYXRvckNvbmZpZyh1aW50NjQpKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCgljYWxsc3ViIGdldFZhbGlkYXRvckNvbmZpZwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvckNvbmZpZyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogVmFsaWRhdG9yQ29uZmlnCmdldFZhbGlkYXRvckNvbmZpZzoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE3MgoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnCglpbnQgMAoJaW50IDI0MgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCXJldHN1YgoKLy8gZ2V0VmFsaWRhdG9yU3RhdGUodWludDY0KSh1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0VmFsaWRhdG9yU3RhdGU6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFZhbGlkYXRvclN0YXRlKHVpbnQ2NCkodWludDE2LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBnZXRWYWxpZGF0b3JTdGF0ZQoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvclN0YXRlKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBWYWxpZGF0b3JDdXJTdGF0ZQpnZXRWYWxpZGF0b3JTdGF0ZToKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE3NwoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUKCWludCAyNDIgLy8gaGVhZE9mZnNldAoJaW50IDI2CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpCiphYmlfcm91dGVfZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpCgljYWxsc3ViIGdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcih2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogW0FkZHJlc3MsIEFkZHJlc3NdCmdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcjoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE4MgoJLy8gcmV0dXJuIFsKCS8vICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLAoJLy8gICAgICAgICAgICAgdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWFuYWdlciwKCS8vICAgICAgICAgXQoJaW50IDgKCWludCAzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWludCA0MAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJY29uY2F0CglyZXRzdWIKCi8vIGdldFBvb2xzKHVpbnQ2NCkodWludDY0LHVpbnQxNix1aW50NjQpW10KKmFiaV9yb3V0ZV9nZXRQb29sczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0UG9vbHModWludDY0KSh1aW50NjQsdWludDE2LHVpbnQ2NClbXQoJY2FsbHN1YiBnZXRQb29scwoJZHVwCglsZW4KCWludCAxOAoJLwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFBvb2xzKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBQb29sSW5mb1tdCi8vCi8vIFJldHVybiBsaXN0IG9mIGFsbCBwb29scyBmb3IgdGhpcyB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWxpZGF0b3JJZAovLyBAcmV0dXJuIHtQb29sSW5mb1tdfSAtIGFycmF5IG9mIHBvb2xzCi8vIE5vdCBjYWxsYWJsZSBmcm9tIG90aGVyIGNvbnRyYWN0cyBiZWNhdXNlID4xSyByZXR1cm4gYnV0IGNhbiBiZSBjYWxsZWQgdy8gc2ltdWxhdGUgd2hpY2ggYnVtcHMgbG9nIHJldHVybnMKZ2V0UG9vbHM6Cglwcm90byAxIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiAyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk2CgkvLyByZXREYXRhOiBQb29sSW5mb1tdID0gW10KCWJ5dGUgMHgKCWZyYW1lX2J1cnkgMCAvLyByZXREYXRhOiBQb29sSW5mb1tdCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk3CgkvLyBwb29sU2V0ID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29scykKCWludCAyNjggLy8gaGVhZE9mZnNldAoJaW50IDQzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWZyYW1lX2J1cnkgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE5OAoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBwb29sU2V0Lmxlbmd0aDsgaSArPSAxKQoJaW50IDAKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCipmb3JfMDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE5OAoJLy8gaSA8IHBvb2xTZXQubGVuZ3RoCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCAyNAoJPAoJYnogKmZvcl8wX2VuZAoKCS8vICppZjBfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxOTkKCS8vIHBvb2xTZXRbaV0ucG9vbEFwcElkID09PSAwCglmcmFtZV9kaWcgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWYwX2VuZAoKCS8vICppZjBfY29uc2VxdWVudAoJYiAqZm9yXzBfZW5kCgoqaWYwX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIwMwoJLy8gcmV0RGF0YS5wdXNoKHBvb2xTZXRbaV0pCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBQb29sSW5mb1tdCglmcmFtZV9kaWcgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDE4CglleHRyYWN0MwoJY29uY2F0CglmcmFtZV9idXJ5IDAgLy8gcmV0RGF0YTogUG9vbEluZm9bXQoKKmZvcl8wX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk4CgkvLyBpICs9IDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCWIgKmZvcl8wCgoqZm9yXzBfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjA1CgkvLyByZXR1cm4gcmV0RGF0YQoJZnJhbWVfZGlnIDAgLy8gcmV0RGF0YTogUG9vbEluZm9bXQoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDIKCXJldHN1YgoKLy8gZ2V0UG9vbEFwcElkKHVpbnQ2NCx1aW50NjQpdWludDY0CiphYmlfcm91dGVfZ2V0UG9vbEFwcElkOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBwb29sSWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJYnRvaQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFBvb2xBcHBJZCh1aW50NjQsdWludDY0KXVpbnQ2NAoJY2FsbHN1YiBnZXRQb29sQXBwSWQKCWl0b2IKCWNvbmNhdAoJbG9nCglpbnQgMQoJcmV0dXJuCgovLyBnZXRQb29sQXBwSWQodmFsaWRhdG9ySWQ6IHVpbnQ2NCwgcG9vbElkOiB1aW50NjQpOiB1aW50NjQKLy8KLy8gZ2V0UG9vbEFwcElkIGlzIHVzZWZ1bCBmb3IgY2FsbGVycyB0byBkZXRlcm1pbmUgYXBwIHRvIGNhbGwgZm9yIHJlbW92aW5nIHN0YWtlIGlmIHRoZXkgZG9uJ3QgaGF2ZSBzdGFraW5nIG9yCi8vIHdhbnQgdG8gZ2V0IHN0YWtlciBsaXN0IGZvciBhbiBhY2NvdW50LiAgVGhlIHN0YWtpbmcgcG9vbCBhbHNvIHVzZXMgaXQgdG8gZ2V0IHRoZSBhcHAgaWQgb2Ygc3Rha2luZyBwb29sIDEKLy8gKHdoaWNoIGNvbnRhaW5zIHJld2FyZCB0b2tlbnMgaWYgYmVpbmcgdXNlZCkgc28gdGhhdCB0aGUgYW1vdW50IGF2YWlsYWJsZSBjYW4gYmUgZGV0ZXJtaW5lZC4KZ2V0UG9vbEFwcElkOgoJcHJvdG8gMiAxCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjE1CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBwb29sSWQgIT09IDAgJiYgcG9vbElkIDw9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHMubGVuZ3RoLAoJLy8gICAgICAgICAgICAgJ3Bvb2wgaWQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIG51bWJlciBvZiBwb29scyBmb3IgdGhpcyB2YWxpZGF0b3InLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTIgLy8gcG9vbElkOiB1aW50NjQKCWludCAwCgkhPQoJZHVwCglieiAqc2tpcF9hbmQwCglmcmFtZV9kaWcgLTIgLy8gcG9vbElkOiB1aW50NjQKCWludCAyNAoJPD0KCSYmCgoqc2tpcF9hbmQwOgoJLy8gcG9vbCBpZCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgbnVtYmVyIG9mIHBvb2xzIGZvciB0aGlzIHZhbGlkYXRvcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjE5CgkvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1twb29sSWQgLSAxXS5wb29sQXBwSWQKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0yIC8vIHBvb2xJZDogdWludDY0CglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCXJldHN1YgoKLy8gZ2V0UG9vbEluZm8oKHVpbnQ2NCx1aW50NjQsdWludDY0KSkodWludDY0LHVpbnQxNix1aW50NjQpCiphYmlfcm91dGVfZ2V0UG9vbEluZm86CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHBvb2xLZXk6ICh1aW50NjQsdWludDY0LHVpbnQ2NCkKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWR1cAoJbGVuCglpbnQgMjQKCT09CgoJLy8gYXJndW1lbnQgMCAocG9vbEtleSkgZm9yIGdldFBvb2xJbmZvIG11c3QgYmUgYSAodWludDY0LHVpbnQ2NCx1aW50NjQpCglhc3NlcnQKCgkvLyBleGVjdXRlIGdldFBvb2xJbmZvKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpKHVpbnQ2NCx1aW50MTYsdWludDY0KQoJY2FsbHN1YiBnZXRQb29sSW5mbwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFBvb2xJbmZvKHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkpOiBQb29sSW5mbwpnZXRQb29sSW5mbzoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIyNAoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRDdXJNYXhTdGFrZVBlclBvb2wodWludDY0KXVpbnQ2NAoqYWJpX3JvdXRlX2dldEN1ck1heFN0YWtlUGVyUG9vbDoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHVpbnQ2NCl1aW50NjQKCWNhbGxzdWIgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sCglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiB1aW50NjQKLy8KLy8gQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIHN0YWtlIHBlciBwb29sIGZvciBhIGdpdmVuIHZhbGlkYXRvci4KLy8gTm9ybWFsbHkgdGhpcyB3b3VsZCBiZSBtYXhBbGdvUGVyUG9vbCwgYnV0IGl0IHNob3VsZCBhbHNvIG5ldmVyIGdvIGFib3ZlIE1heEFsbG93ZWRTdGFrZSAvIG51bVBvb2xzIHNvCi8vIGFzIHBvb2xzIGFyZSBhZGRlZCB0aGUgbWF4IGFsbG93ZWQgcGVyIHBvb2wgY2FuIHJlZHVjZS4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCmdldEN1ck1heFN0YWtlUGVyUG9vbDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzYKCS8vIG51bVBvb2xzID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyBhcyB1aW50NjQKCWludCAyNDIKCWludCAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIG51bVBvb2xzOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzcKCS8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzID0gdGhpcy5tYXhBbGxvd2VkU3Rha2UoKSAvIG51bVBvb2xzCgljYWxsc3ViIG1heEFsbG93ZWRTdGFrZQoJZnJhbWVfZGlnIDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoJLwoJZnJhbWVfYnVyeSAxIC8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzgKCS8vIG1heFBlclBvb2w6IHVpbnQ2NCA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1heEFsZ29QZXJQb29sCglpbnQgMjE3CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCgkvLyAqaWYxX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjM5CgkvLyBtYXhQZXJQb29sID09PSAwCglmcmFtZV9kaWcgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCWludCAwCgk9PQoJYnogKmlmMV9lbmQKCgkvLyAqaWYxX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI0MAoJLy8gbWF4UGVyUG9vbCA9IHRoaXMubWF4QWxnb0FsbG93ZWRQZXJQb29sKCkKCWNhbGxzdWIgbWF4QWxnb0FsbG93ZWRQZXJQb29sCglmcmFtZV9idXJ5IDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoqaWYxX2VuZDoKCS8vICppZjJfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNDIKCS8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzIDwgbWF4UGVyUG9vbAoJZnJhbWVfZGlnIDEgLy8gaGFyZE1heERpdmlkZWRCZXR3ZWVuUG9vbHM6IHVpbnQ2NAoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8CglieiAqaWYyX2VuZAoKCS8vICppZjJfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjQzCgkvLyBtYXhQZXJQb29sID0gaGFyZE1heERpdmlkZWRCZXR3ZWVuUG9vbHMKCWZyYW1lX2RpZyAxIC8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzOiB1aW50NjQKCWZyYW1lX2J1cnkgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCippZjJfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjQ1CgkvLyByZXR1cm4gbWF4UGVyUG9vbAoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCgoJLy8gcG9wIGFsbCBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUgc3RhY2sKCXBvcG4gMgoJcmV0c3ViCgovLyBkb2VzU3Rha2VyTmVlZFRvUGF5TUJSKGFkZHJlc3MpYm9vbAoqYWJpX3JvdXRlX2RvZXNTdGFrZXJOZWVkVG9QYXlNQlI6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHN0YWtlcjogYWRkcmVzcwoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZHVwCglsZW4KCWludCAzMgoJPT0KCgkvLyBhcmd1bWVudCAwIChzdGFrZXIpIGZvciBkb2VzU3Rha2VyTmVlZFRvUGF5TUJSIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBleGVjdXRlIGRvZXNTdGFrZXJOZWVkVG9QYXlNQlIoYWRkcmVzcylib29sCgljYWxsc3ViIGRvZXNTdGFrZXJOZWVkVG9QYXlNQlIKCWJ5dGUgMHgwMAoJaW50IDAKCXVuY292ZXIgMgoJc2V0Yml0Cgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZG9lc1N0YWtlck5lZWRUb1BheU1CUihzdGFrZXI6IEFkZHJlc3MpOiBib29sZWFuCi8vCi8vIEhlbHBlciBjYWxsZXJzIGNhbiBjYWxsIHcvIHNpbXVsYXRlIHRvIGRldGVybWluZSBpZiAnQWRkU3Rha2VyJyBNQlIgc2hvdWxkIGJlIGluY2x1ZGVkIHcvIHN0YWtpbmcgYW1vdW50Ci8vIEBwYXJhbSBzdGFrZXIKZG9lc1N0YWtlck5lZWRUb1BheU1CUjoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI1NAoJLy8gcmV0dXJuICF0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS5leGlzdHMKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZXI6IEFkZHJlc3MKCWNvbmNhdAoJYm94X2xlbgoJc3dhcAoJcG9wCgkhCglyZXRzdWIKCi8vIGdldFN0YWtlZFBvb2xzRm9yQWNjb3VudChhZGRyZXNzKSh1aW50NjQsdWludDY0LHVpbnQ2NClbXQoqYWJpX3JvdXRlX2dldFN0YWtlZFBvb2xzRm9yQWNjb3VudDoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gc3Rha2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKHN0YWtlcikgZm9yIGdldFN0YWtlZFBvb2xzRm9yQWNjb3VudCBtdXN0IGJlIGEgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBnZXRTdGFrZWRQb29sc0ZvckFjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCx1aW50NjQpW10KCWNhbGxzdWIgZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50CglkdXAKCWxlbgoJaW50IDI0CgkvCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0Cgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50KHN0YWtlcjogQWRkcmVzcyk6IFZhbGlkYXRvclBvb2xLZXlbXQovLwovLyBSZXRyaWV2ZXMgdGhlIHN0YWtlZCBwb29scyBmb3IgYW4gYWNjb3VudC4KLy8KLy8gQHBhcmFtIHtBZGRyZXNzfSBzdGFrZXIgLSBUaGUgYWNjb3VudCB0byByZXRyaWV2ZSBzdGFrZWQgcG9vbHMgZm9yLgovLyBAcmV0dXJuIHtWYWxpZGF0b3JQb29sS2V5W119IC0gVGhlIGFycmF5IG9mIHN0YWtlZCBwb29scyBmb3IgdGhlIGFjY291bnQuCmdldFN0YWtlZFBvb2xzRm9yQWNjb3VudDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyAqaWYzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjY1CgkvLyAhdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikuZXhpc3RzCglieXRlIDB4NzM3MDczIC8vICJzcHMiCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoJIQoJYnogKmlmM19lbmQKCgkvLyAqaWYzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2NgoJLy8gcmV0dXJuIFtdCglieXRlIDB4CgliICpnZXRTdGFrZWRQb29sc0ZvckFjY291bnQqcmV0dXJuCgoqaWYzX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2OAoJLy8gcmV0RGF0YTogVmFsaWRhdG9yUG9vbEtleVtdID0gW10KCWJ5dGUgMHgKCWZyYW1lX2J1cnkgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjkKCS8vIHBvb2xTZXQgPSBjbG9uZSh0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZSkKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZXI6IEFkZHJlc3MKCWNvbmNhdAoJYm94X2dldAoKCS8vIGJveCB2YWx1ZSBkb2VzIG5vdCBleGlzdDogdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUKCWFzc2VydAoJZnJhbWVfYnVyeSAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzAKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgcG9vbFNldC5sZW5ndGg7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzE6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzAKCS8vIGkgPCBwb29sU2V0Lmxlbmd0aAoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl8xX2VuZAoKCS8vICppZjRfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzEKCS8vIHBvb2xTZXRbaV0uaWQgIT09IDAKCWZyYW1lX2RpZyAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgkhPQoJYnogKmlmNF9lbmQKCgkvLyAqaWY0X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI3MgoJLy8gcmV0RGF0YS5wdXNoKHBvb2xTZXRbaV0pCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCWZyYW1lX2RpZyAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWNvbmNhdAoJZnJhbWVfYnVyeSAwIC8vIHJldERhdGE6IFZhbGlkYXRvclBvb2xLZXlbXQoKKmlmNF9lbmQ6CgoqZm9yXzFfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzAKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzEKCipmb3JfMV9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzUKCS8vIHJldHVybiByZXREYXRhCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCipnZXRTdGFrZWRQb29sc0ZvckFjY291bnQqcmV0dXJuOgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCgoJLy8gcG9wIGFsbCBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUgc3RhY2sKCXBvcG4gMgoJcmV0c3ViCgovLyBnZXRUb2tlblBheW91dFJhdGlvKHVpbnQ2NCkodWludDY0WzI0XSx1aW50NjQpCiphYmlfcm91dGVfZ2V0VG9rZW5QYXlvdXRSYXRpbzoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KQoJY2FsbHN1YiBnZXRUb2tlblBheW91dFJhdGlvCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0VG9rZW5QYXlvdXRSYXRpbyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogUG9vbFRva2VuUGF5b3V0UmF0aW8KLy8KLy8gUmV0cmlldmVzIHRoZSB0b2tlbiBwYXlvdXQgcmF0aW8gZm9yIGEgZ2l2ZW4gdmFsaWRhdG9yIC0gcmV0dXJuaW5nIHRoZSBwb29sIHJhdGlvcyBvZiB3aG9sZSBzbyB0aGF0IHRva2VuCi8vIHBheW91dHMgYWNyb3NzIHBvb2xzIGNhbiBiZSBiYXNlZCBvbiBhIHN0YWJsZSBzbmFwaG9zdCBvZiBzdGFrZS4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEByZXR1cm4ge1Bvb2xUb2tlblBheW91dFJhdGlvfSAtIFRoZSB0b2tlbiBwYXlvdXQgcmF0aW8gZm9yIHRoZSB2YWxpZGF0b3IuCmdldFRva2VuUGF5b3V0UmF0aW86Cglwcm90byAxIDEKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyODcKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCXJldHN1YgoKLy8gZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cyh1aW50NjQpKCh1aW50NjRbM10pWzhdKQoqYWJpX3JvdXRlX2dldE5vZGVQb29sQXNzaWdubWVudHM6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldE5vZGVQb29sQXNzaWdubWVudHModWludDY0KSgodWludDY0WzNdKVs4XSkKCWNhbGxzdWIgZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldE5vZGVQb29sQXNzaWdubWVudHModmFsaWRhdG9ySWQ6IHVpbnQ2NCk6IE5vZGVQb29sQXNzaWdubWVudENvbmZpZwpnZXROb2RlUG9vbEFzc2lnbm1lbnRzOgoJcHJvdG8gMSAxCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjkyCgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS5leGlzdHMsICJ0aGUgc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBkb2Vzbid0IGV4aXN0IikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoKCS8vIHRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGRvZXNuJ3QgZXhpc3QKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI5NAoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUubm9kZVBvb2xBc3NpZ25tZW50cwoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRORkRSZWdpc3RyeUlEKCl1aW50NjQKKmFiaV9yb3V0ZV9nZXRORkRSZWdpc3RyeUlEOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBleGVjdXRlIGdldE5GRFJlZ2lzdHJ5SUQoKXVpbnQ2NAoJY2FsbHN1YiBnZXRORkRSZWdpc3RyeUlECglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0TkZEUmVnaXN0cnlJRCgpOiB1aW50NjQKZ2V0TkZEUmVnaXN0cnlJRDoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI5OQoJLy8gcmV0dXJuIHRoaXMubmZkUmVnaXN0cnlBcHBJZAoJbG9hZCAyMDAgLy8gVE1QTF9uZmRSZWdpc3RyeUFwcElkCglyZXRzdWIKCi8vIGFkZFZhbGlkYXRvcihwYXksc3RyaW5nLCh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KSl1aW50NjQKKmFiaV9yb3V0ZV9hZGRWYWxpZGF0b3I6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIGNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDI0MgoJPT0KCgkvLyBhcmd1bWVudCAwIChjb25maWcpIGZvciBhZGRWYWxpZGF0b3IgbXVzdCBiZSBhICh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KQoJYXNzZXJ0CgoJLy8gbmZkTmFtZTogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglleHRyYWN0IDIgMAoKCS8vIG1iclBheW1lbnQ6IHBheQoJdHhuIEdyb3VwSW5kZXgKCWludCAxCgktCglkdXAKCWd0eG5zIFR5cGVFbnVtCglpbnQgcGF5Cgk9PQoKCS8vIGFyZ3VtZW50IDIgKG1iclBheW1lbnQpIGZvciBhZGRWYWxpZGF0b3IgbXVzdCBiZSBhIHBheSB0cmFuc2FjdGlvbgoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBhZGRWYWxpZGF0b3IocGF5LHN0cmluZywodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkpdWludDY0CgljYWxsc3ViIGFkZFZhbGlkYXRvcgoJaXRvYgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFZhbGlkYXRvcihtYnJQYXltZW50OiBQYXlUeG4sIG5mZE5hbWU6IHN0cmluZywgY29uZmlnOiBWYWxpZGF0b3JDb25maWcpOiB1aW50NjQKLy8KLy8gQWRkcyBhIG5ldyB2YWxpZGF0b3IKLy8gUmVxdWlyZXMgYXQgbGVhc3QgMTAgQUxHTyBhcyB0aGUgJ2ZlZScgZm9yIHRoZSB0cmFuc2FjdGlvbiB0byBoZWxwIGRpc3N1YWRlIHNwYW1tZWQgdmFsaWRhdG9yIGFkZHMuCi8vCi8vIEBwYXJhbSB7UGF5VHhufSBtYnJQYXltZW50IHBheW1lbnQgZnJvbSBjYWxsZXIgd2hpY2ggY292ZXJzIG1iciBpbmNyZWFzZSBvZiBuZXcgdmFsaWRhdG9yIHN0b3JhZ2UKLy8gQHBhcmFtIHtzdHJpbmd9IG5mZE5hbWUgKE9wdGlvbmFsKSBOYW1lIG9mIG5mZCAodXNlZCBhcyBkb3VibGUtY2hlY2sgYWdhaW5zdCBpZCBzcGVjaWZpZWQgaW4gY29uZmlnKQovLyBAcGFyYW0ge1ZhbGlkYXRvckNvbmZpZ30gY29uZmlnIFZhbGlkYXRvckNvbmZpZyBzdHJ1Y3QKLy8gQHJldHVybnMge3VpbnQ2NH0gdmFsaWRhdG9yIGlkCmFkZFZhbGlkYXRvcjoKCXByb3RvIDMgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzExCgkvLyB0aGlzLnZhbGlkYXRlQ29uZmlnKGNvbmZpZykKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJY2FsbHN1YiB2YWxpZGF0ZUNvbmZpZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxMwoJLy8gdmVyaWZ5UGF5VHhuKG1iclBheW1lbnQsIHsgcmVjZWl2ZXI6IHRoaXMuYXBwLmFkZHJlc3MsIGFtb3VudDogdGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkVmFsaWRhdG9yTWJyIH0pCgkvLyB2ZXJpZnkgcmVjZWl2ZXIKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIFJlY2VpdmVyCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6InJlY2VpdmVyIiwiZXhwZWN0ZWQiOiJ0aGlzLmFwcC5hZGRyZXNzIn0KCWFzc2VydAoKCS8vIHZlcmlmeSBhbW91bnQKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCglleHRyYWN0IDAgOAoJYnRvaQoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6ImFtb3VudCIsImV4cGVjdGVkIjoidGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkVmFsaWRhdG9yTWJyIn0KCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxNQoJLy8gYXNzZXJ0KG1iclBheW1lbnQuZmVlID4gMTAgKiAxMDAwMDAwLCAnZmVlIG11c3QgYmUgMTAgQUxHTyBvciBtb3JlIHRvIHByZXZlbnQgc3BhbW1pbmcgb2YgdmFsaWRhdG9ycycpCglmcmFtZV9kaWcgLTEgLy8gbWJyUGF5bWVudDogUGF5VHhuCglndHhucyBGZWUKCWludCAxMDAwMDAwMAoJPgoKCS8vIGZlZSBtdXN0IGJlIDEwIEFMR08gb3IgbW9yZSB0byBwcmV2ZW50IHNwYW1taW5nIG9mIHZhbGlkYXRvcnMKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxOAoJLy8gdmFsaWRhdG9ySWQgPSB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgKyAxCglieXRlIDB4NmU3NTZkNTYgLy8gIm51bVYiCglhcHBfZ2xvYmFsX2dldAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzE5CgkvLyB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgPSB2YWxpZGF0b3JJZAoJYnl0ZSAweDZlNzU2ZDU2IC8vICJudW1WIgoJZnJhbWVfZGlnIDAgLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMjEKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkuY3JlYXRlKCkKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJaW50IDEwOTIKCWJveF9jcmVhdGUKCXBvcAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMyMgoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcgPSBjb25maWcKCWludCAwCglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMjMKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLmlkID0gdmFsaWRhdG9ySWQKCWludCAwCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gKmlmNV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMyNgoJLy8gY29uZmlnLm5mZEZvckluZm8gIT09IDAKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA3MiA4CglidG9pCglpbnQgMAoJIT0KCWJ6ICppZjVfZW5kCgoJLy8gKmlmNV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMjgKCS8vIGFzc2VydCh0aGlzLmlzTkZEQXBwSURWYWxpZChjb25maWcubmZkRm9ySW5mbyksICdwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZCcpCglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgNzIgOAoJYnRvaQoJY2FsbHN1YiBpc05GREFwcElEVmFsaWQKCgkvLyBwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzMwCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgdGhpcy50eG4uc2VuZGVyID09PSAoQXBwSUQuZnJvbVVpbnQ2NChjb25maWcubmZkRm9ySW5mbykuZ2xvYmFsU3RhdGUoJ2kub3duZXIuYScpIGFzIEFkZHJlc3MpLAoJLy8gICAgICAgICAgICAgICAgICdJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXInLAoJLy8gICAgICAgICAgICAgKQoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIC0zIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDcyIDgKCWJ0b2kKCWJ5dGUgMHg2OTJlNmY3NzZlNjU3MjJlNjEgLy8gImkub3duZXIuYSIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KGNvbmZpZy5uZmRGb3JJbmZvKS5nbG9iYWxTdGF0ZSgnaS5vd25lci5hJykKCWFzc2VydAoJPT0KCgkvLyBJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXIKCWFzc2VydAoKKmlmNV9lbmQ6CgkvLyAqaWY2X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzM2CgkvLyBjb25maWcuZW50cnlHYXRpbmdUeXBlID09PSBHQVRJTkdfVFlQRV9DUkVBVEVEX0JZX05GRF9BRERSRVNTRVMgfHwKCS8vICAgICAgICAgICAgIGNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX1NFR01FTlRfT0ZfTkZECglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgODAgMQoJYnRvaQoJaW50IDMKCT09CglkdXAKCWJueiAqc2tpcF9vcjAKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4MCAxCglidG9pCglpbnQgNAoJPT0KCXx8Cgoqc2tpcF9vcjA6CglieiAqaWY2X2VuZAoKCS8vICppZjZfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzQwCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5pc05GREFwcElEVmFsaWQoY29uZmlnLmVudHJ5R2F0aW5nQXNzZXRzWzBdKSwKCS8vICAgICAgICAgICAgICAgICAncHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZEJywKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAxMTMgOAoJYnRvaQoJY2FsbHN1YiBpc05GREFwcElEVmFsaWQKCgkvLyBwcm92aWRlZCBORkQgQXBwIGlkIGZvciBnYXRpbmcgbXVzdCBiZSB2YWxpZCBORkQKCWFzc2VydAoKKmlmNl9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNDUKCS8vIHRoaXMucmV0aU9QX2FkZGVkVmFsaWRhdG9yLmxvZyh7IGlkOiB2YWxpZGF0b3JJZCwgb3duZXI6IGNvbmZpZy5vd25lciwgbWFuYWdlcjogY29uZmlnLm1hbmFnZXIgfSkKCWJ5dGUgMHhhOGRkMjFjYiAvLyByZXRpT1BfYWRkZWRWYWxpZGF0b3IodWludDY0LGFkZHJlc3MsYWRkcmVzcykKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4IDMyCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA0MCAzMgoJY29uY2F0Cgljb25jYXQKCWxvZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM0NgoJLy8gcmV0dXJuIHZhbGlkYXRvcklkCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvck1hbmFnZXIodWludDY0LGFkZHJlc3Mpdm9pZAoqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvck1hbmFnZXI6CgkvLyBtYW5hZ2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKG1hbmFnZXIpIGZvciBjaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyKHVpbnQ2NCxhZGRyZXNzKXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yTWFuYWdlcgoJaW50IDEKCXJldHVybgoKLy8gY2hhbmdlVmFsaWRhdG9yTWFuYWdlcih2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBtYW5hZ2VyOiBBZGRyZXNzKTogdm9pZAovLwovLyBDaGFuZ2VzIHRoZSBWYWxpZGF0b3IgbWFuYWdlciBmb3IgYSBzcGVjaWZpYyBWYWxpZGF0b3IgaWQuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gY2hhbmdlIHRoZSBtYW5hZ2VyIGZvci4KLy8gQHBhcmFtIHtBZGRyZXNzfSBtYW5hZ2VyIC0gVGhlIG5ldyBtYW5hZ2VyIGFkZHJlc3MuCmNoYW5nZVZhbGlkYXRvck1hbmFnZXI6Cglwcm90byAyIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNTcKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM1OAoJLy8gYXNzZXJ0KG1hbmFnZXIgIT09IGdsb2JhbHMuemVyb0FkZHJlc3MsICduZWVkcyB0byBhdCBsZWFzdCBiZSB2YWxpZCBhZGRyZXNzJykKCWZyYW1lX2RpZyAtMiAvLyBtYW5hZ2VyOiBBZGRyZXNzCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CgoJLy8gbmVlZHMgdG8gYXQgbGVhc3QgYmUgdmFsaWQgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzU5CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5tYW5hZ2VyID0gbWFuYWdlcgoJaW50IDQwCglmcmFtZV9kaWcgLTIgLy8gbWFuYWdlcjogQWRkcmVzcwoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCXJldHN1YgoKLy8gY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyh1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkCiphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbzoKCS8vIHN1bnNldHRpbmdUbzogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglidG9pCgoJLy8gc3Vuc2V0dGluZ09uOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbwoJaW50IDEKCXJldHVybgoKLy8gY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBzdW5zZXR0aW5nT246IHVpbnQ2NCwgc3Vuc2V0dGluZ1RvOiBWYWxpZGF0b3JJZFR5cGUpOiB2b2lkCi8vCi8vIFVwZGF0ZXMgdGhlIHN1bnNldCBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiB2YWxpZGF0b3IuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gdXBkYXRlLgovLyBAcGFyYW0ge3VpbnQ2NH0gc3Vuc2V0dGluZ09uIC0gVGhlIG5ldyBzdW5zZXQgdGltZXN0YW1wLgovLyBAcGFyYW0ge3VpbnQ2NH0gc3Vuc2V0dGluZ1RvIC0gVGhlIG5ldyBzdW5zZXQgdG8gdmFsaWRhdG9yIGlkLgpjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvOgoJcHJvdG8gMyAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzcxCgkvLyB0aGlzLmNhbGxlck11c3RCZU93bmVyKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgY2FsbGVyTXVzdEJlT3duZXIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNzIKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnN1bnNldHRpbmdPbiA9IHN1bnNldHRpbmdPbgoJaW50IDIyNgoJZnJhbWVfZGlnIC0yIC8vIHN1bnNldHRpbmdPbjogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM3MwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcuc3Vuc2V0dGluZ1RvID0gc3Vuc2V0dGluZ1RvCglpbnQgMjM0CglmcmFtZV9kaWcgLTMgLy8gc3Vuc2V0dGluZ1RvOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvck5GRCh1aW50NjQsdWludDY0LHN0cmluZyl2b2lkCiphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yTkZEOgoJLy8gbmZkTmFtZTogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglleHRyYWN0IDIgMAoKCS8vIG5mZEFwcElEOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JORkQodWludDY0LHVpbnQ2NCxzdHJpbmcpdm9pZAoJY2FsbHN1YiBjaGFuZ2VWYWxpZGF0b3JORkQKCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvck5GRCh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBuZmRBcHBJRDogdWludDY0LCBuZmROYW1lOiBzdHJpbmcpOiB2b2lkCi8vCi8vIENoYW5nZXMgdGhlIE5GRCBmb3IgYSB2YWxpZGF0b3IgaW4gdGhlIHZhbGlkYXRvckxpc3QgY29udHJhY3QuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gdXBkYXRlLgovLyBAcGFyYW0ge3VpbnQ2NH0gbmZkQXBwSUQgLSBUaGUgYXBwbGljYXRpb24gaWQgb2YgdGhlIE5GRCB0byBhc3NpZ24gdG8gdGhlIHZhbGlkYXRvci4KLy8gQHBhcmFtIHtzdHJpbmd9IG5mZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgTkZEICh3aGljaCBtdXN0IG1hdGNoKQpjaGFuZ2VWYWxpZGF0b3JORkQ6Cglwcm90byAzIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozODUKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM4NwoJLy8gYXNzZXJ0KHRoaXMuaXNORkRBcHBJRFZhbGlkKG5mZEFwcElEKSwgJ3Byb3ZpZGVkIE5GRCBtdXN0IGJlIHZhbGlkJykKCWZyYW1lX2RpZyAtMiAvLyBuZmRBcHBJRDogdWludDY0CgljYWxsc3ViIGlzTkZEQXBwSURWYWxpZAoKCS8vIHByb3ZpZGVkIE5GRCBtdXN0IGJlIHZhbGlkCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozODkKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHRoaXMudHhuLnNlbmRlciA9PT0gKEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzKSwKCS8vICAgICAgICAgICAgICdJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXInLAoJLy8gICAgICAgICApCgl0eG4gU2VuZGVyCglmcmFtZV9kaWcgLTIgLy8gbmZkQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKQoJYXNzZXJ0Cgk9PQoKCS8vIElmIHNwZWNpZnlpbmcgTkZELCBhY2NvdW50IGFkZGluZyB2YWxpZGF0b3IgbXVzdCBiZSBvd25lcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzkzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5uZmRGb3JJbmZvID0gbmZkQXBwSUQKCWludCA3MgoJZnJhbWVfZGlnIC0yIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHVpbnQ2NCxhZGRyZXNzKXZvaWQKKmFiaV9yb3V0ZV9jaGFuZ2VWYWxpZGF0b3JDb21taXNzaW9uQWRkcmVzczoKCS8vIGNvbW1pc3Npb25BZGRyZXNzOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKGNvbW1pc3Npb25BZGRyZXNzKSBmb3IgY2hhbmdlVmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MgbXVzdCBiZSBhIGFkZHJlc3MKCWFzc2VydAoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHVpbnQ2NCxhZGRyZXNzKXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MKCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIGNvbW1pc3Npb25BZGRyZXNzOiBBZGRyZXNzKTogdm9pZAovLwovLyBDaGFuZ2UgdGhlIGNvbW1pc3Npb24gYWRkcmVzcyB0aGF0IHZhbGlkYXRvciByZXdhcmRzIGFyZSBzZW50IHRvLgovLyBbIE9OTFkgT1dORVIgQ0FOIENIQU5HRSBdCmNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzOgoJcHJvdG8gMiAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDAxCgkvLyB0aGlzLmNhbGxlck11c3RCZU93bmVyKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgY2FsbGVyTXVzdEJlT3duZXIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MDIKCS8vIGFzc2VydChjb21taXNzaW9uQWRkcmVzcyAhPT0gQWRkcmVzcy56ZXJvQWRkcmVzcykKCWZyYW1lX2RpZyAtMiAvLyBjb21taXNzaW9uQWRkcmVzczogQWRkcmVzcwoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDAzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy52YWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyA9IGNvbW1pc3Npb25BZGRyZXNzCglpbnQgMTc3CglmcmFtZV9kaWcgLTIgLy8gY29tbWlzc2lvbkFkZHJlc3M6IEFkZHJlc3MKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8odWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQpdm9pZAoqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvclJld2FyZEluZm86CgkvLyBSZXdhcmRQZXJQYXlvdXQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgoJYnRvaQoKCS8vIEdhdGluZ0Fzc2V0TWluQmFsYW5jZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyA1CglidG9pCgoJLy8gRW50cnlHYXRpbmdBc3NldHM6IHVpbnQ2NFs0XQoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAoJZHVwCglsZW4KCWludCAzMgoJPT0KCgkvLyBhcmd1bWVudCAyIChFbnRyeUdhdGluZ0Fzc2V0cykgZm9yIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8gbXVzdCBiZSBhIHVpbnQ2NFs0XQoJYXNzZXJ0CgoJLy8gRW50cnlHYXRpbmdBZGRyZXNzOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDMgKEVudHJ5R2F0aW5nQWRkcmVzcykgZm9yIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8gbXVzdCBiZSBhIGFkZHJlc3MKCWFzc2VydAoKCS8vIEVudHJ5R2F0aW5nVHlwZTogdWludDgKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMQoJPT0KCgkvLyBhcmd1bWVudCA0IChFbnRyeUdhdGluZ1R5cGUpIGZvciBjaGFuZ2VWYWxpZGF0b3JSZXdhcmRJbmZvIG11c3QgYmUgYSB1aW50OAoJYXNzZXJ0CglidG9pCgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mbyh1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCl2b2lkCgljYWxsc3ViIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8KCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8odmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgRW50cnlHYXRpbmdUeXBlOiB1aW50OCwgRW50cnlHYXRpbmdBZGRyZXNzOiBBZGRyZXNzLCBFbnRyeUdhdGluZ0Fzc2V0czogU3RhdGljQXJyYXk8dWludDY0LCA0PiwgR2F0aW5nQXNzZXRNaW5CYWxhbmNlOiB1aW50NjQsIFJld2FyZFBlclBheW91dDogdWludDY0KTogdm9pZAovLwovLyBBbGxvdyB0aGUgYWRkaXRpb25hbCByZXdhcmRzIChnYXRpbmcgZW50cnksIGFkZGl0aW9uYWwgdG9rZW4gcmV3YXJkcykgaW5mb3JtYXRpb24gYmUgY2hhbmdlZCBhdCB3aWxsLgovLyBbIE9OTFkgT1dORVIgQ0FOIENIQU5HRSBdCmNoYW5nZVZhbGlkYXRvclJld2FyZEluZm86Cglwcm90byA2IDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MTgKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQyMAoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgRW50cnlHYXRpbmdUeXBlID49IEdBVElOR19UWVBFX05PTkUgJiYgRW50cnlHYXRpbmdUeXBlIDwgR0FUSU5HX1RZUEVfQ09OU1RfTUFYLAoJLy8gICAgICAgICAgICAgJ2ludmFsaWQgRW50cnkgZ2F0aW5nIHR5cGUnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDAKCT49CglkdXAKCWJ6ICpza2lwX2FuZDEKCWZyYW1lX2RpZyAtMiAvLyBFbnRyeUdhdGluZ1R5cGU6IHVpbnQ4CglpbnQgNAoJPAoJJiYKCipza2lwX2FuZDE6CgkvLyBpbnZhbGlkIEVudHJ5IGdhdGluZyB0eXBlCglhc3NlcnQKCgkvLyAqaWY3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDI0CgkvLyBFbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX0FTU0VUU19DUkVBVEVEX0JZCglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDEKCT09CglieiAqaWY3X2VuZAoKCS8vICppZjdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDI1CgkvLyBhc3NlcnQoRW50cnlHYXRpbmdBZGRyZXNzICE9PSBnbG9iYWxzLnplcm9BZGRyZXNzKQoJZnJhbWVfZGlnIC0zIC8vIEVudHJ5R2F0aW5nQWRkcmVzczogQWRkcmVzcwoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoqaWY3X2VuZDoKCS8vICppZjhfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MjgKCS8vIEVudHJ5R2F0aW5nVHlwZSA9PT0gR0FUSU5HX1RZUEVfQ1JFQVRFRF9CWV9ORkRfQUREUkVTU0VTIHx8CgkvLyAgICAgICAgICAgICBFbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX1NFR01FTlRfT0ZfTkZECglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDMKCT09CglkdXAKCWJueiAqc2tpcF9vcjEKCWZyYW1lX2RpZyAtMiAvLyBFbnRyeUdhdGluZ1R5cGU6IHVpbnQ4CglpbnQgNAoJPT0KCXx8Cgoqc2tpcF9vcjE6CglieiAqaWY4X2VuZAoKCS8vICppZjhfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDMxCgkvLyBhc3NlcnQodGhpcy5pc05GREFwcElEVmFsaWQoRW50cnlHYXRpbmdBc3NldHNbMF0pLCAncHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZEJykKCWZyYW1lX2RpZyAtNCAvLyBFbnRyeUdhdGluZ0Fzc2V0czogU3RhdGljQXJyYXk8dWludDY0LCA0PgoJZXh0cmFjdCAwIDgKCWJ0b2kKCWNhbGxzdWIgaXNORkRBcHBJRFZhbGlkCgoJLy8gcHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZECglhc3NlcnQKCippZjhfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDMzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPSBFbnRyeUdhdGluZ1R5cGUKCWludCA4MAoJZnJhbWVfZGlnIC0yIC8vIEVudHJ5R2F0aW5nVHlwZTogdWludDgKCWl0b2IKCWV4dHJhY3QgNyAxCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQzNAoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcuZW50cnlHYXRpbmdBZGRyZXNzID0gRW50cnlHYXRpbmdBZGRyZXNzCglpbnQgODEKCWZyYW1lX2RpZyAtMyAvLyBFbnRyeUdhdGluZ0FkZHJlc3M6IEFkZHJlc3MKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDM1CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0cyA9IEVudHJ5R2F0aW5nQXNzZXRzCglpbnQgMTEzCglmcmFtZV9kaWcgLTQgLy8gRW50cnlHYXRpbmdBc3NldHM6IFN0YXRpY0FycmF5PHVpbnQ2NCwgND4KCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDM2CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5nYXRpbmdBc3NldE1pbkJhbGFuY2UgPSBHYXRpbmdBc3NldE1pbkJhbGFuY2UKCWludCAxNDUKCWZyYW1lX2RpZyAtNSAvLyBHYXRpbmdBc3NldE1pbkJhbGFuY2U6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MzcKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnJld2FyZFBlclBheW91dCA9IFJld2FyZFBlclBheW91dAoJaW50IDE2MQoJZnJhbWVfZGlnIC02IC8vIFJld2FyZFBlclBheW91dDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyBhZGRQb29sKHBheSx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCkKKmFiaV9yb3V0ZV9hZGRQb29sOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBub2RlTnVtOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gbWJyUGF5bWVudDogcGF5Cgl0eG4gR3JvdXBJbmRleAoJaW50IDEKCS0KCWR1cAoJZ3R4bnMgVHlwZUVudW0KCWludCBwYXkKCT09CgoJLy8gYXJndW1lbnQgMiAobWJyUGF5bWVudCkgZm9yIGFkZFBvb2wgbXVzdCBiZSBhIHBheSB0cmFuc2FjdGlvbgoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBhZGRQb29sKHBheSx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCkKCWNhbGxzdWIgYWRkUG9vbAoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFBvb2wobWJyUGF5bWVudDogUGF5VHhuLCB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBub2RlTnVtOiB1aW50NjQpOiBWYWxpZGF0b3JQb29sS2V5Ci8vCi8vIEFkZHMgYSBuZXcgcG9vbCB0byBhIHZhbGlkYXRvcidzIHBvb2wgc2V0LCByZXR1cm5pbmcgdGhlICdrZXknIHRvIHJlZmVyZW5jZSB0aGUgcG9vbCBpbiB0aGUgZnV0dXJlIGZvciBzdGFraW5nLCBldGMuCi8vIFRoZSBjYWxsZXIgbXVzdCBwYXkgdGhlIGNvc3Qgb2YgdGhlIHZhbGlkYXRvcnMgTUJSIGluY3JlYXNlIGFzIHdlbGwgYXMgdGhlIE1CUiB0aGF0IHdpbGwgYmUgbmVlZGVkIGZvciB0aGUgcG9vbCBpdHNlbGYuCi8vCi8vIFsgT05MWSBPV05FUiBPUiBNQU5BR0VSIENBTiBjYWxsIF0KLy8gQHBhcmFtIHtQYXlUeG59IG1iclBheW1lbnQgcGF5bWVudCBmcm9tIGNhbGxlciB3aGljaCBjb3ZlcnMgbWJyIGluY3JlYXNlIG9mIGFkZGluZyBhIG5ldyBwb29sCi8vIEBwYXJhbSB7dWludDY0fSB2YWxpZGF0b3JJZCBpcyBpZCBvZiB2YWxpZGF0b3IgdG8gcG9vbCB0byAobXVzdCBiZSBvd25lciBvciBtYW5hZ2VyKQovLyBAcGFyYW0ge3VpbnQ2NH0gbm9kZU51bSBpcyBub2RlIG51bWJlciB0byBhZGQgdG8KLy8gQHJldHVybnMge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2wga2V5IHRvIGNyZWF0ZWQgcG9vbAphZGRQb29sOgoJcHJvdG8gMyAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ1MgoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lck9yTWFuYWdlcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyT3JNYW5hZ2VyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDU1CgkvLyB2ZXJpZnlQYXlUeG4obWJyUGF5bWVudCwgeyByZWNlaXZlcjogdGhpcy5hcHAuYWRkcmVzcywgYW1vdW50OiB0aGlzLmdldE1ickFtb3VudHMoKS5hZGRQb29sTWJyIH0pCgkvLyB2ZXJpZnkgcmVjZWl2ZXIKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIFJlY2VpdmVyCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6InJlY2VpdmVyIiwiZXhwZWN0ZWQiOiJ0aGlzLmFwcC5hZGRyZXNzIn0KCWFzc2VydAoKCS8vIHZlcmlmeSBhbW91bnQKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCglleHRyYWN0IDggOAoJYnRvaQoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6ImFtb3VudCIsImV4cGVjdGVkIjoidGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkUG9vbE1iciJ9Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NTcKCS8vIGFzc2VydCh0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLmV4aXN0cywgInNwZWNpZmllZCB2YWxpZGF0b3IgaWQgaXNuJ3QgdmFsaWQiKQoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJYm94X2xlbgoJc3dhcAoJcG9wCgoJLy8gc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBpc24ndCB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDU5CgkvLyBudW1Qb29sczogdWludDY0ID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyBhcyB1aW50NjQKCWludCAyNDIKCWludCAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIG51bVBvb2xzOiB1aW50NjQKCgkvLyAqaWY5X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDYwCgkvLyAobnVtUG9vbHMgYXMgdWludDY0KSA+PSBNQVhfUE9PTFMKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWludCAyNAoJPj0KCWJ6ICppZjlfZW5kCgoJLy8gKmlmOV9jb25zZXF1ZW50CgkvLyBhbHJlYWR5IGF0IG1heCBwb29sIHNpemUKCWVycgoKKmlmOV9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NjMKCS8vIG51bVBvb2xzICs9IDEKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ2NgoJLy8gc2VuZEFwcENhbGwoewoJLy8gICAgICAgICAgICAgb25Db21wbGV0aW9uOiBPbkNvbXBsZXRpb24uTm9PcCwKCS8vICAgICAgICAgICAgIGFwcHJvdmFsUHJvZ3JhbTogWwoJLy8gICAgICAgICAgICAgICAgIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uZXh0cmFjdCgwLCA0MDk2KSwKCS8vICAgICAgICAgICAgICAgICB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLmV4dHJhY3QoNDA5NiwgdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5zaXplIC0gNDA5NiksCgkvLyAgICAgICAgICAgICBdLAoJLy8gICAgICAgICAgICAgY2xlYXJTdGF0ZVByb2dyYW06IFN0YWtpbmdQb29sLmNsZWFyUHJvZ3JhbSgpLAoJLy8gICAgICAgICAgICAgZ2xvYmFsTnVtVWludDogU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1VaW50LAoJLy8gICAgICAgICAgICAgZ2xvYmFsTnVtQnl0ZVNsaWNlOiBTdGFraW5nUG9vbC5zY2hlbWEuZ2xvYmFsLm51bUJ5dGVTbGljZSwKCS8vICAgICAgICAgICAgIGV4dHJhUHJvZ3JhbVBhZ2VzOiAzLAoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25BcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gY3JlYXRpbmdDb250cmFjdElELCB2YWxpZGF0b3JJZCwgcG9vbElkLCBtaW5FbnRyeVN0YWtlCgkvLyAgICAgICAgICAgICAgICAgbWV0aG9kKCdjcmVhdGVBcHBsaWNhdGlvbih1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCcpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodGhpcy5hcHAuaWQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodmFsaWRhdG9ySWQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IobnVtUG9vbHMgYXMgdWludDY0KSwKCS8vICAgICAgICAgICAgICAgICBpdG9iKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1pbkVudHJ5U3Rha2UpLAoJLy8gICAgICAgICAgICAgXSwKCS8vICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDY3CgkvLyBvbkNvbXBsZXRpb246IE9uQ29tcGxldGlvbi5Ob09wCglpbnQgMCAvLyBOb09wCglpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ2OAoJLy8gYXBwcm92YWxQcm9ncmFtOiBbCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5leHRyYWN0KDAsIDQwOTYpLAoJLy8gICAgICAgICAgICAgICAgIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uZXh0cmFjdCg0MDk2LCB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLnNpemUgLSA0MDk2KSwKCS8vICAgICAgICAgICAgIF0KCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWludCAwCglpbnQgNDA5NgoJYm94X2V4dHJhY3QKCWl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWludCA0MDk2CglieXRlIDB4NzA2ZjZmNmM1NDY1NmQ3MDZjNjE3NDY1NDE3MDcwNzI2Zjc2NjE2YzQyNzk3NDY1NzMgLy8gInBvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMiCglib3hfbGVuCgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLnNpemUKCWFzc2VydAoJaW50IDQwOTYKCS0KCWJveF9leHRyYWN0CglpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDcyCgkvLyBjbGVhclN0YXRlUHJvZ3JhbTogU3Rha2luZ1Bvb2wuY2xlYXJQcm9ncmFtKCkKCWJ5dGUgYjY0IEN3PT0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NzMKCS8vIGdsb2JhbE51bVVpbnQ6IFN0YWtpbmdQb29sLnNjaGVtYS5nbG9iYWwubnVtVWludAoJaW50IDExCglpdHhuX2ZpZWxkIEdsb2JhbE51bVVpbnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NzQKCS8vIGdsb2JhbE51bUJ5dGVTbGljZTogU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1CeXRlU2xpY2UKCWludCAzCglpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ3NQoJLy8gZXh0cmFQcm9ncmFtUGFnZXM6IDMKCWludCAzCglpdHhuX2ZpZWxkIEV4dHJhUHJvZ3JhbVBhZ2VzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDc2CgkvLyBhcHBsaWNhdGlvbkFyZ3M6IFsKCS8vICAgICAgICAgICAgICAgICAvLyBjcmVhdGluZ0NvbnRyYWN0SUQsIHZhbGlkYXRvcklkLCBwb29sSWQsIG1pbkVudHJ5U3Rha2UKCS8vICAgICAgICAgICAgICAgICBtZXRob2QoJ2NyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkJyksCgkvLyAgICAgICAgICAgICAgICAgaXRvYih0aGlzLmFwcC5pZCksCgkvLyAgICAgICAgICAgICAgICAgaXRvYih2YWxpZGF0b3JJZCksCgkvLyAgICAgICAgICAgICAgICAgaXRvYihudW1Qb29scyBhcyB1aW50NjQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWluRW50cnlTdGFrZSksCgkvLyAgICAgICAgICAgICBdCgltZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCXR4bmEgQXBwbGljYXRpb25zIDAKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglpbnQgMjA5CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ4NgoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyA9IG51bVBvb2xzIGFzIHVpbnQxNgoJaW50IDI0MgoJZnJhbWVfZGlnIDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoJaXRvYgoJZXh0cmFjdCA2IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDg5CgkvLyBwb29sQXBwSWQgPSB0aGlzLml0eG4uY3JlYXRlZEFwcGxpY2F0aW9uSUQuaWQKCWl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKCWZyYW1lX2J1cnkgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ5MAoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1tudW1Qb29scyAtIDFdLnBvb2xBcHBJZCA9IHBvb2xBcHBJZAoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgMCAvLyBudW1Qb29sczogdWludDY0CglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0OTEKCS8vIHRoaXMuYWRkUG9vbFRvTm9kZSh2YWxpZGF0b3JJZCwgcG9vbEFwcElkLCBub2RlTnVtKQoJZnJhbWVfZGlnIC0zIC8vIG5vZGVOdW06IHVpbnQ2NAoJZnJhbWVfZGlnIDEgLy8gcG9vbEFwcElkOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGFkZFBvb2xUb05vZGUKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0OTMKCS8vIHRoaXMucmV0aU9QX3ZhbGlkYXRvckFkZGVkUG9vbC5sb2coewoJLy8gICAgICAgICAgICAgaWQ6IHZhbGlkYXRvcklkLAoJLy8gICAgICAgICAgICAgbnVtOiBudW1Qb29scyBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKSwKCS8vICAgICAgICAgfSkKCWJ5dGUgMHhmYmNjMGY2YiAvLyByZXRpT1BfdmFsaWRhdG9yQWRkZWRQb29sKHVpbnQ2NCx1aW50MTYsdWludDY0KQoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWl0b2IKCWR1cAoJYml0bGVuCglpbnQgMTYKCTw9CgoJLy8gbnVtUG9vbHMgYXMgdWludDE2IG92ZXJmbG93ZWQgMTYgYml0cwoJYXNzZXJ0CglleHRyYWN0IDYgMgoJY29uY2F0CglmcmFtZV9kaWcgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cgljb25jYXQKCWxvZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ5OQoJLy8gcmV0dXJuIHsgaWQ6IHZhbGlkYXRvcklkLCBwb29sSWQ6IG51bVBvb2xzIGFzIHVpbnQ2NCwgcG9vbEFwcElkOiB0aGlzLml0eG4hLmNyZWF0ZWRBcHBsaWNhdGlvbklELmlkIH0KCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCglmcmFtZV9kaWcgMCAvLyBudW1Qb29sczogdWludDY0CglpdG9iCgljb25jYXQKCWl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKCWl0b2IKCWNvbmNhdAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDEKCXJldHN1YgoKLy8gYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KQoqYWJpX3JvdXRlX2FkZFN0YWtlOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gc3Rha2VkQW1vdW50UGF5bWVudDogcGF5Cgl0eG4gR3JvdXBJbmRleAoJaW50IDEKCS0KCWR1cAoJZ3R4bnMgVHlwZUVudW0KCWludCBwYXkKCT09CgoJLy8gYXJndW1lbnQgMiAoc3Rha2VkQW1vdW50UGF5bWVudCkgZm9yIGFkZFN0YWtlIG11c3QgYmUgYSBwYXkgdHJhbnNhY3Rpb24KCWFzc2VydAoKCS8vIGV4ZWN1dGUgYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBhZGRTdGFrZQoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFN0YWtlKHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4biwgdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgdmFsdWVUb1ZlcmlmeTogdWludDY0KTogVmFsaWRhdG9yUG9vbEtleQovLwovLyBBZGRzIHN0YWtlIHRvIGEgdmFsaWRhdG9yIHBvb2wuCi8vCi8vIEBwYXJhbSB7UGF5VHhufSBzdGFrZWRBbW91bnRQYXltZW50IC0gcGF5bWVudCBjb21pbmcgZnJvbSBzdGFrZXIgdG8gcGxhY2UgaW50byBhIHBvb2wKLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWx1ZVRvVmVyaWZ5IC0gb25seSBpZiB2YWxpZGF0b3IgaGFzIGdhdGluZyB0byBlbnRlciAtIHRoaXMgaXMgYXNzZXQgaWQgb3IgbmZkIGlkIHRoYXQgY29ycmVzcG9uZHMgdG8gZ2F0aW5nLgovLyBUeG4gc2VuZGVyIGlzIGZhY3RvcmVkIGluIGFzIHdlbGwgaWYgdGhhdCBpcyBwYXJ0IG9mIGdhdGluZy4KLy8gKiBAcmV0dXJucyB7VmFsaWRhdG9yUG9vbEtleX0gLSBUaGUga2V5IG9mIHRoZSB2YWxpZGF0b3IgcG9vbC4KYWRkU3Rha2U6Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA1CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTEyCgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS5leGlzdHMsICJzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGlzbid0IHZhbGlkIikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoKCS8vIHNwZWNpZmllZCB2YWxpZGF0b3IgaWQgaXNuJ3QgdmFsaWQKCWFzc2VydAoKCS8vICppZjEwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTE1CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5zdW5zZXR0aW5nT24gPiAwCglpbnQgMjI2CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWludCAwCgk+CglieiAqaWYxMF9lbmQKCgkvLyAqaWYxMF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MTcKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5zdW5zZXR0aW5nT24gPiBnbG9iYWxzLmxhdGVzdFRpbWVzdGFtcCwKCS8vICAgICAgICAgICAgICAgICAiY2FuJ3Qgc3Rha2Ugd2l0aCBhIHZhbGlkYXRvciB0aGF0IGlzIHBhc3QgaXRzIHN1bnNldHRpbmcgdGltZSIsCgkvLyAgICAgICAgICAgICApCglpbnQgMjI2CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKCT4KCgkvLyBjYW4ndCBzdGFrZSB3aXRoIGEgdmFsaWRhdG9yIHRoYXQgaXMgcGFzdCBpdHMgc3Vuc2V0dGluZyB0aW1lCglhc3NlcnQKCippZjEwX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUyMwoJLy8gc3Rha2VyID0gdGhpcy50eG4uc2VuZGVyCgl0eG4gU2VuZGVyCglmcmFtZV9idXJ5IDAgLy8gc3Rha2VyOiBhZGRyZXNzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTI3CgkvLyB2ZXJpZnlQYXlUeG4oc3Rha2VkQW1vdW50UGF5bWVudCwgewoJLy8gICAgICAgICAgICAgc2VuZGVyOiBzdGFrZXIsCgkvLyAgICAgICAgICAgICByZWNlaXZlcjogdGhpcy5hcHAuYWRkcmVzcywKCS8vICAgICAgICAgfSkKCS8vIHZlcmlmeSBzZW5kZXIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIFNlbmRlcgoJZnJhbWVfZGlnIDAgLy8gc3Rha2VyOiBhZGRyZXNzCgk9PQoKCS8vIHRyYW5zYWN0aW9uIHZlcmlmaWNhdGlvbiBmYWlsZWQ6IHsidHhuIjoic3Rha2VkQW1vdW50UGF5bWVudCIsImZpZWxkIjoic2VuZGVyIiwiZXhwZWN0ZWQiOiJzdGFrZXIifQoJYXNzZXJ0CgoJLy8gdmVyaWZ5IHJlY2VpdmVyCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBSZWNlaXZlcgoJZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCT09CgoJLy8gdHJhbnNhY3Rpb24gdmVyaWZpY2F0aW9uIGZhaWxlZDogeyJ0eG4iOiJzdGFrZWRBbW91bnRQYXltZW50IiwiZmllbGQiOiJyZWNlaXZlciIsImV4cGVjdGVkIjoidGhpcy5hcHAuYWRkcmVzcyJ9Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzUKCS8vIHRoaXMuZG9lc1N0YWtlck1lZXRHYXRpbmcodmFsaWRhdG9ySWQsIHZhbHVlVG9WZXJpZnkpCglmcmFtZV9kaWcgLTMgLy8gdmFsdWVUb1ZlcmlmeTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBkb2VzU3Rha2VyTWVldEdhdGluZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUzNwoJLy8gcmVhbEFtb3VudCA9IHN0YWtlZEFtb3VudFBheW1lbnQuYW1vdW50CglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBBbW91bnQKCWZyYW1lX2J1cnkgMSAvLyByZWFsQW1vdW50OiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzgKCS8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NCA9IDAKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gbWJyQW10TGVmdEJlaGluZDogdWludDY0CgoJLy8gKmlmMTFfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NDAKCS8vIHRoaXMuZG9lc1N0YWtlck5lZWRUb1BheU1CUihzdGFrZXIpCglmcmFtZV9kaWcgMCAvLyBzdGFrZXI6IGFkZHJlc3MKCWNhbGxzdWIgZG9lc1N0YWtlck5lZWRUb1BheU1CUgoJYnogKmlmMTFfZW5kCgoJLy8gKmlmMTFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTQzCgkvLyBtYnJBbXRMZWZ0QmVoaW5kID0gdGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkU3Rha2VyTWJyCgljYWxsc3ViIGdldE1ickFtb3VudHMKCWV4dHJhY3QgMjQgOAoJYnRvaQoJZnJhbWVfYnVyeSAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU0NAoJLy8gcmVhbEFtb3VudCAtPSBtYnJBbXRMZWZ0QmVoaW5kCglmcmFtZV9kaWcgMSAvLyByZWFsQW1vdW50OiB1aW50NjQKCWZyYW1lX2RpZyAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoJLQoJZnJhbWVfYnVyeSAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU0NQoJLy8gdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikuY3JlYXRlKCkKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAwIC8vIHN0YWtlcjogYWRkcmVzcwoJY29uY2F0CglpbnQgMTQ0Cglib3hfY3JlYXRlCglwb3AKCippZjExX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU0OQoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS50b3RhbEFsZ29TdGFrZWQgKyByZWFsQW1vdW50IDwgdGhpcy5tYXhBbGxvd2VkU3Rha2UoKSwKCS8vICAgICAgICAgICAgICd0b3RhbCBzdGFrZWQgZm9yIGFsbCBvZiBhIHZhbGlkYXRvcnMgcG9vbHMgbWF5IG5vdCBleGNlZWQgaGFyZCBjYXAnLAoJLy8gICAgICAgICApCglpbnQgMjUyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoJKwoJY2FsbHN1YiBtYXhBbGxvd2VkU3Rha2UKCTwKCgkvLyB0b3RhbCBzdGFrZWQgZm9yIGFsbCBvZiBhIHZhbGlkYXRvcnMgcG9vbHMgbWF5IG5vdCBleGNlZWQgaGFyZCBjYXAKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU1NgoJLy8gZmluZFJldCA9IHRoaXMuZmluZFBvb2xGb3JTdGFrZXIodmFsaWRhdG9ySWQsIHN0YWtlciwgcmVhbEFtb3VudCkKCWZyYW1lX2RpZyAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoJZnJhbWVfZGlnIDAgLy8gc3Rha2VyOiBhZGRyZXNzCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBmaW5kUG9vbEZvclN0YWtlcgoJZnJhbWVfYnVyeSAzIC8vIGZpbmRSZXQ6ICgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NTcKCS8vIHBvb2xLZXkgPSBmaW5kUmV0WzBdCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NTgKCS8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IgPSBmaW5kUmV0WzFdCglmcmFtZV9kaWcgMyAvLyBmaW5kUmV0OiAoKHVpbnQ2NCx1aW50NjQsdWludDY0KSxib29sLGJvb2wpCglzdG9yZSAyNTUgLy8gZnVsbCBhcnJheQoJbG9hZCAyNTUgLy8gZnVsbCBhcnJheQoJaW50IDE5MgoJZ2V0Yml0CglmcmFtZV9idXJ5IDQgLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU1OQoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sID0gZmluZFJldFsyXQoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWludCAxOTMKCWdldGJpdAoJZnJhbWVfYnVyeSA1IC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoKCS8vICppZjEyX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTYwCgkvLyBwb29sS2V5LnBvb2xJZCA9PT0gMAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMAoJPT0KCWJ6ICppZjEyX2VuZAoKCS8vICppZjEyX2NvbnNlcXVlbnQKCS8vIE5vIHBvb2wgYXZhaWxhYmxlIHdpdGggZnJlZSBzdGFrZS4gIFZhbGlkYXRvciBuZWVkcyB0byBhZGQgYW5vdGhlciBwb29sCgllcnIKCippZjEyX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU2NQoJLy8gdGhpcy51cGRhdGVTdGFrZXJQb29sU2V0KHN0YWtlciwgcG9vbEtleSkKCWZyYW1lX2RpZyAzIC8vIGZpbmRSZXQ6ICgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKCXN0b3JlIDI1NSAvLyBmdWxsIGFycmF5Cglsb2FkIDI1NSAvLyBmdWxsIGFycmF5CglleHRyYWN0IDAgMjQKCWZyYW1lX2RpZyAwIC8vIHN0YWtlcjogYWRkcmVzcwoJY2FsbHN1YiB1cGRhdGVTdGFrZXJQb29sU2V0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTY4CgkvLyB0aGlzLmNhbGxQb29sQWRkU3Rha2UoCgkvLyAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LAoJLy8gICAgICAgICAgICAgcG9vbEtleSwKCS8vICAgICAgICAgICAgIG1ickFtdExlZnRCZWhpbmQsCgkvLyAgICAgICAgICAgICBpc05ld1N0YWtlclRvVmFsaWRhdG9yLAoJLy8gICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1Byb3RvY29sLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgNSAvLyBpc05ld1N0YWtlclRvUHJvdG9jb2w6IGJvb2wKCWZyYW1lX2RpZyA0IC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCWZyYW1lX2RpZyAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMCAyNAoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4bgoJY2FsbHN1YiBjYWxsUG9vbEFkZFN0YWtlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTc1CgkvLyB0aGlzLnJldGlPUF9zdGFrZUFkZGVkLmxvZyh7CgkvLyAgICAgICAgICAgICBpZDogdmFsaWRhdG9ySWQsCgkvLyAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLAoJLy8gICAgICAgICAgICAgYW1vdW50U3Rha2VkOiByZWFsQW1vdW50LAoJLy8gICAgICAgICAgICAgc3Rha2VyOiBzdGFrZXIsCgkvLyAgICAgICAgIH0pCglieXRlIDB4OTYyYjQxNDMgLy8gcmV0aU9QX3N0YWtlQWRkZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQpCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgMCAvLyBzdGFrZXI6IGFkZHJlc3MKCWNvbmNhdAoJZnJhbWVfZGlnIDEgLy8gcmVhbEFtb3VudDogdWludDY0CglpdG9iCgljb25jYXQKCWNvbmNhdAoJbG9nCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTgzCgkvLyByZXR1cm4gcG9vbEtleQoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMCAyNAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDUKCXJldHN1YgoKLy8gc2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KQoqYWJpX3JvdXRlX3NldFRva2VuUGF5b3V0UmF0aW86CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIHNldFRva2VuUGF5b3V0UmF0aW8odWludDY0KSh1aW50NjRbMjRdLHVpbnQ2NCkKCWNhbGxzdWIgc2V0VG9rZW5QYXlvdXRSYXRpbwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIHNldFRva2VuUGF5b3V0UmF0aW8odmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IFBvb2xUb2tlblBheW91dFJhdGlvCi8vCi8vIHNldFRva2VuUGF5b3V0UmF0aW8gaXMgY2FsbGVkIGJ5IFN0YWtpbmcgUG9vbCAjIDEgKE9OTFkpIHRvIGFzayB0aGUgdmFsaWRhdG9yICh1cykgdG8gY2FsY3VsYXRlIHRoZSByYXRpb3MKLy8gb2Ygc3Rha2UgaW4gdGhlIHBvb2xzIGZvciBzdWJzZXF1ZW50IHRva2VuIHBheW91dHMgKGllOiAyIHBvb2xzLCAnMTAwJyBhbGdvIHRvdGFsIHN0YWtlZCwgNjAgaW4gcG9vbCAxLCBhbmQgNDAKLy8gaW4gcG9vbCAyKSAgVGhpcyBpcyBkb25lIHNvIHdlIGhhdmUgYSBzdGFibGUgc25hcHNob3Qgb2Ygc3Rha2UgLSB0YWtlbiBvbmNlIHBlciBlcG9jaCAtIG9ubHkgdHJpZ2dlcmVkIGJ5Ci8vIHBvb2wgMSBkb2luZyBwYXlvdXQuICBwb29scyBvdGhlciB0aGFuIDEgZG9pbmcgcGF5b3V0IGNhbGwgcG9vbCAxIHRvIGFzayBpdCBkbyBpdCBmaXJzdC4KLy8gSXQgd291bGQgYmUgNjAvNDAlIGluIHRoZSBwb29sUGN0T2ZXaG9sZSB2YWx1ZXMuICBUaGUgdG9rZW4gcmV3YXJkIHBheW91dHMgdGhlbiB1c2UgdGhlc2UgdmFsdWVzIGluc3RlYWQgb2YKLy8gdGhlaXIgJ2N1cnJlbnQnIHN0YWtlIHdoaWNoIGNoYW5nZXMgYXMgcGFydCBvZiB0aGUgcGF5b3V0cyB0aGVtc2VsdmVzIChhbmQgcGVvcGxlIGNvdWxkIGJlIGNoYW5naW5nIHN0YWtlCi8vIGR1cmluZyB0aGUgZXBvY2ggdXBkYXRlcyBhY3Jvc3MgcG9vbHMpCi8vCi8vIE11bHRpcGxlIHBvb2xzIHdpbGwgY2FsbCB1cyB2aWEgcG9vbCAxIChwb29sMi0+cG9vbDEtPnZhbGlkYXRvciwgZXRjLikgc28gZG9uJ3QgYXNzZXJ0IG9uIHBvb2wxIGNhbGxpbmcgbXVsdGlwbGUKLy8gdGltZXMgaW4gc2FtZSBlcG9jaC4gIEp1c3QgcmV0dXJuLgovLwovLyBAcGFyYW0gdmFsaWRhdG9ySWQgLSB2YWxpZGF0b3IgaWQgKGFuZCB0aHVzIHBvb2wpIGNhbGxpbmcgdXMuICBWZXJpZmllZCBzbyB0aGF0IHNlbmRlciBNVVNUIGJlIHBvb2wgMSBvZiB0aGlzIHZhbGlkYXRvci4KLy8gQHJldHVybnMgUG9vbFRva2VuUGF5b3V0UmF0aW8gLSB0aGUgZmluaXNoZWQgcmF0aW8gZGF0YQpzZXRUb2tlblBheW91dFJhdGlvOgoJcHJvdG8gMSAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gOAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYwMwoJLy8gcG9vbDFBcHBJRCA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkCglpbnQgMjY4CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMCAvLyBwb29sMUFwcElEOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MDQKCS8vIGFzc2VydChwb29sMUFwcElEICE9PSAwKQoJZnJhbWVfZGlnIDAgLy8gcG9vbDFBcHBJRDogdWludDY0CglpbnQgMAoJIT0KCWFzc2VydAoKCS8vICppZjEzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjA2CgkvLyB0aGlzLnR4bi5zZW5kZXIgIT09IEFwcElELmZyb21VaW50NjQocG9vbDFBcHBJRCkuYWRkcmVzcwoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIDAgLy8gcG9vbDFBcHBJRDogdWludDY0CglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCSE9CglieiAqaWYxM19lbmQKCgkvLyAqaWYxM19jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MDcKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWIgKnNldFRva2VuUGF5b3V0UmF0aW8qcmV0dXJuCgoqaWYxM19lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MTMKCS8vIGN1clJvdW5kID0gZ2xvYmFscy5yb3VuZAoJZ2xvYmFsIFJvdW5kCglmcmFtZV9idXJ5IDEgLy8gY3VyUm91bmQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYxNAoJLy8gbGFzdFBheW91dFVwZGF0ZSA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUudG9rZW5QYXlvdXRSYXRpby51cGRhdGVkRm9yUGF5b3V0CglpbnQgODkyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCgkvLyAqaWYxNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYxNQoJLy8gbGFzdFBheW91dFVwZGF0ZSAhPT0gMAoJZnJhbWVfZGlnIDIgLy8gbGFzdFBheW91dFVwZGF0ZTogdWludDY0CglpbnQgMAoJIT0KCWJ6ICppZjE0X2VuZAoKCS8vICppZjE0X2NvbnNlcXVlbnQKCS8vICppZjE1X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjE3CgkvLyAoQXBwSUQuZnJvbVVpbnQ2NChwb29sMUFwcElEKS5nbG9iYWxTdGF0ZSgnbGFzdFBheW91dCcpIGFzIHVpbnQ2NCkgPT09IGxhc3RQYXlvdXRVcGRhdGUKCWZyYW1lX2RpZyAwIC8vIHBvb2wxQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDZjNjE3Mzc0NTA2MTc5NmY3NTc0IC8vICJsYXN0UGF5b3V0IgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQocG9vbDFBcHBJRCkuZ2xvYmFsU3RhdGUoJ2xhc3RQYXlvdXQnKQoJYXNzZXJ0CglmcmFtZV9kaWcgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCT09CglieiAqaWYxNV9lbmQKCgkvLyAqaWYxNV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MTgKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWIgKnNldFRva2VuUGF5b3V0UmF0aW8qcmV0dXJuCgoqaWYxNV9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MjAKCS8vIGVwb2NoUm91bmRMZW5ndGggPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lcG9jaFJvdW5kTGVuZ3RoIGFzIHVpbnQ2NAoJaW50IDE2OQoJaW50IDQKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDMgLy8gZXBvY2hSb3VuZExlbmd0aDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjIxCgkvLyB0aGlzRXBvY2hCZWdpbiA9IGN1clJvdW5kIC0gKGN1clJvdW5kICUgZXBvY2hSb3VuZExlbmd0aCkKCWZyYW1lX2RpZyAxIC8vIGN1clJvdW5kOiB1aW50NjQKCWZyYW1lX2RpZyAxIC8vIGN1clJvdW5kOiB1aW50NjQKCWZyYW1lX2RpZyAzIC8vIGVwb2NoUm91bmRMZW5ndGg6IHVpbnQ2NAoJJQoJLQoJZnJhbWVfYnVyeSA0IC8vIHRoaXNFcG9jaEJlZ2luOiB1aW50NjQKCgkvLyAqaWYxNl9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYyMwoJLy8gbGFzdFBheW91dFVwZGF0ZSAtIChsYXN0UGF5b3V0VXBkYXRlICUgZXBvY2hSb3VuZExlbmd0aCkgPT09IHRoaXNFcG9jaEJlZ2luCglmcmFtZV9kaWcgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCWZyYW1lX2RpZyAyIC8vIGxhc3RQYXlvdXRVcGRhdGU6IHVpbnQ2NAoJZnJhbWVfZGlnIDMgLy8gZXBvY2hSb3VuZExlbmd0aDogdWludDY0CgklCgktCglmcmFtZV9kaWcgNCAvLyB0aGlzRXBvY2hCZWdpbjogdWludDY0Cgk9PQoJYnogKmlmMTZfZW5kCgoJLy8gKmlmMTZfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjI0CgkvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS50b2tlblBheW91dFJhdGlvCglpbnQgNzAwIC8vIGhlYWRPZmZzZXQKCWludCAyMDAKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CgliICpzZXRUb2tlblBheW91dFJhdGlvKnJldHVybgoKKmlmMTZfZW5kOgoKKmlmMTRfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjI3CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8udXBkYXRlZEZvclBheW91dCA9IGN1clJvdW5kCglpbnQgODkyCglmcmFtZV9kaWcgMSAvLyBjdXJSb3VuZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYyOQoJLy8gY3VyTnVtUG9vbHMgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnN0YXRlLm51bVBvb2xzIGFzIHVpbnQ2NAoJaW50IDI0MgoJaW50IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDUgLy8gY3VyTnVtUG9vbHM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYzMAoJLy8gdG90YWxTdGFrZUZvclZhbGlkYXRvciA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUudG90YWxBbGdvU3Rha2VkCglpbnQgMjUyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgNiAvLyB0b3RhbFN0YWtlRm9yVmFsaWRhdG9yOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MzEKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgY3VyTnVtUG9vbHM7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDcgLy8gaTogdWludDY0CgoqZm9yXzI6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MzEKCS8vIGkgPCBjdXJOdW1Qb29scwoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglmcmFtZV9kaWcgNSAvLyBjdXJOdW1Qb29sczogdWludDY0Cgk8CglieiAqZm9yXzJfZW5kCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjM2CgkvLyBvdXJQb29sUGN0T2ZXaG9sZSA9IHdpZGVSYXRpbygKCS8vICAgICAgICAgICAgICAgICBbdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1tpXS50b3RhbEFsZ29TdGFrZWQsIDFfMDAwXzAwMF0sCgkvLyAgICAgICAgICAgICAgICAgW3RvdGFsU3Rha2VGb3JWYWxpZGF0b3JdLAoJLy8gICAgICAgICAgICAgKQoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglpbnQgMV8wMDBfMDAwCgltdWx3CglpbnQgMAoJZnJhbWVfZGlnIDYgLy8gdG90YWxTdGFrZUZvclZhbGlkYXRvcjogdWludDY0CglkaXZtb2R3Cglwb3AKCXBvcAoJc3dhcAoJIQoKCS8vIHdpZGVSYXRpbyBmYWlsZWQKCWFzc2VydAoJZnJhbWVfYnVyeSA4IC8vIG91clBvb2xQY3RPZldob2xlOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NDAKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUudG9rZW5QYXlvdXRSYXRpby5wb29sUGN0T2ZXaG9sZVtpXSA9IG91clBvb2xQY3RPZldob2xlCglpbnQgNzAwCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWZyYW1lX2RpZyA4IC8vIG91clBvb2xQY3RPZldob2xlOiB1aW50NjQKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoqZm9yXzJfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MzEKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSA3IC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzIKCipmb3JfMl9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NDIKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCipzZXRUb2tlblBheW91dFJhdGlvKnJldHVybjoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDgKCXJldHN1YgoKLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcygodWludDY0LHVpbnQ2NCx1aW50NjQpLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkCiphYmlfcm91dGVfc3Rha2VVcGRhdGVkVmlhUmV3YXJkczoKCS8vIHNhdHVyYXRlZEJ1cm5Ub0ZlZVNpbms6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQoJYnRvaQoKCS8vIHZhbGlkYXRvckNvbW1pc3Npb246IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAoJYnRvaQoKCS8vIHJld2FyZFRva2VuQW1vdW50UmVzZXJ2ZWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwoJYnRvaQoKCS8vIGFsZ29Ub0FkZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglidG9pCgoJLy8gcG9vbEtleTogKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZHVwCglsZW4KCWludCAyNAoJPT0KCgkvLyBhcmd1bWVudCA0IChwb29sS2V5KSBmb3Igc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyBtdXN0IGJlIGEgKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBzdGFrZVVwZGF0ZWRWaWFSZXdhcmRzKCh1aW50NjQsdWludDY0LHVpbnQ2NCksdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKCWNhbGxzdWIgc3Rha2VVcGRhdGVkVmlhUmV3YXJkcwoJaW50IDEKCXJldHVybgoKLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyhwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5LCBhbGdvVG9BZGQ6IHVpbnQ2NCwgcmV3YXJkVG9rZW5BbW91bnRSZXNlcnZlZDogdWludDY0LCB2YWxpZGF0b3JDb21taXNzaW9uOiB1aW50NjQsIHNhdHVyYXRlZEJ1cm5Ub0ZlZVNpbms6IHVpbnQ2NCk6IHZvaWQKLy8KLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyBpcyBjYWxsZWQgYnkgU3Rha2luZyBwb29scyB0byBpbmZvcm0gdGhlIHZhbGlkYXRvciAodXMpIHRoYXQgYSBwYXJ0aWN1bGFyIGFtb3VudCBvZiB0b3RhbAovLyBzdGFrZSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgc3BlY2lmaWVkIHBvb2wuICBUaGlzIGlzIHVzZWQgdG8gdXBkYXRlIHRoZSBzdGF0cyB3ZSBoYXZlIGluIG91ciBQb29sSW5mbyBzdG9yYWdlLgovLyBUaGUgY2FsbGluZyBBcHAgaWQgaXMgdmFsaWRhdGVkIGFnYWluc3Qgb3VyIHBvb2wgbGlzdCBhcyB3ZWxsLgovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBWYWxpZGF0b3JQb29sS2V5IHR5cGUKLy8gQHBhcmFtIHt1aW50NjR9IGFsZ29Ub0FkZCAtIGFtb3VudCB0aGlzIHZhbGlkYXRvcidzIHRvdGFsIHN0YWtlIGluY3JlYXNlZCB2aWEgcmV3YXJkcwovLyBAcGFyYW0ge3VpbnQ2NH0gcmV3YXJkVG9rZW5BbW91bnRSZXNlcnZlZCAtIGFtb3VudCB0aGlzIHZhbGlkYXRvcidzIHRvdGFsIHN0YWtlIGluY3JlYXNlZCB2aWEgcmV3YXJkcyAodGhhdCBzaG91bGQgYmUKLy8gQHBhcmFtIHt1aW50NjR9IHZhbGlkYXRvckNvbW1pc3Npb24gLSB0aGUgY29tbWlzc2lvbiBhbW91bnQgdGhlIHZhbGlkYXRvciB3YXMgcGFpZCwgaWYgYW55Ci8vIEBwYXJhbSB7dWludDY0fSBzYXR1cmF0ZWRCdXJuVG9GZWVTaW5rIC0gaWYgdGhlIHBvb2wgd2FzIGluIHNhdHVyYXRlZCBzdGF0ZSwgdGhlIGFtb3VudCBzZW50IGJhY2sgdG8gdGhlIGZlZSBzaW5rLgovLyBzZWVuIGFzICdhY2NvdW50ZWQgZm9yL3BlbmRpbmcgc3BlbnQnKQpzdGFrZVVwZGF0ZWRWaWFSZXdhcmRzOgoJcHJvdG8gNSAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjYzCgkvLyB0aGlzLnZlcmlmeVBvb2xLZXlDYWxsZXIocG9vbEtleSkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CgljYWxsc3ViIHZlcmlmeVBvb2xLZXlDYWxsZXIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NjYKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCArPSBhbGdvVG9BZGQKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAxMCAvLyBoZWFkT2Zmc2V0CgkrCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NjcKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS50b3RhbEFsZ29TdGFrZWQgKz0gYWxnb1RvQWRkCglpbnQgMjUyCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMiAvLyBhbGdvVG9BZGQ6IHVpbnQ2NAoJKwoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjY4CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUucmV3YXJkVG9rZW5IZWxkQmFjayArPSByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkCglpbnQgMjYwCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkOiB1aW50NjQKCSsKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY3MAoJLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgKz0gYWxnb1RvQWRkCglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglhcHBfZ2xvYmFsX2dldAoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CgkrCglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglzd2FwCglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY3MwoJLy8gdGhpcy5yZXZlcmlmeU5GRE93bmVyc2hpcChwb29sS2V5LmlkKQoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCgljYWxsc3ViIHJldmVyaWZ5TkZET3duZXJzaGlwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Njc1CgkvLyB0aGlzLnJldGlPUF9lcG9jaFJld2FyZFVwZGF0ZS5sb2coewoJLy8gICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLAoJLy8gICAgICAgICAgICAgYWxnb0FkZGVkOiBhbGdvVG9BZGQsCgkvLyAgICAgICAgICAgICByZXdhcmRUb2tlbkhlbGRCYWNrOiByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkLAoJLy8gICAgICAgICAgICAgc2F0dXJhdGVkQnVyblRvRmVlU2luazogc2F0dXJhdGVkQnVyblRvRmVlU2luaywKCS8vICAgICAgICAgICAgIHZhbGlkYXRvckNvbW1pc3Npb246IHZhbGlkYXRvckNvbW1pc3Npb24sCgkvLyAgICAgICAgIH0pCglieXRlIDB4YjNlNDdjM2QgLy8gcmV0aU9QX2Vwb2NoUmV3YXJkVXBkYXRlKHVpbnQ2NCx1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTQgLy8gdmFsaWRhdG9yQ29tbWlzc2lvbjogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtNSAvLyBzYXR1cmF0ZWRCdXJuVG9GZWVTaW5rOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY29uY2F0Cglsb2cKCXJldHN1YgoKLy8gc3Rha2VSZW1vdmVkKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wpdm9pZAoqYWJpX3JvdXRlX3N0YWtlUmVtb3ZlZDoKCS8vIHN0YWtlclJlbW92ZWQ6IGJvb2wKCXR4bmEgQXBwbGljYXRpb25BcmdzIDUKCWR1cAoJbGVuCglpbnQgMQoJPT0KCgkvLyBhcmd1bWVudCAwIChzdGFrZXJSZW1vdmVkKSBmb3Igc3Rha2VSZW1vdmVkIG11c3QgYmUgYSBib29sCglhc3NlcnQKCWludCAwCglnZXRiaXQKCgkvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDQKCWJ0b2kKCgkvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDMKCWJ0b2kKCgkvLyBzdGFrZXI6IGFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMzIKCT09CgoJLy8gYXJndW1lbnQgMyAoc3Rha2VyKSBmb3Igc3Rha2VSZW1vdmVkIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBwb29sS2V5OiAodWludDY0LHVpbnQ2NCx1aW50NjQpCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDI0Cgk9PQoKCS8vIGFyZ3VtZW50IDQgKHBvb2xLZXkpIGZvciBzdGFrZVJlbW92ZWQgbXVzdCBiZSBhICh1aW50NjQsdWludDY0LHVpbnQ2NCkKCWFzc2VydAoKCS8vIGV4ZWN1dGUgc3Rha2VSZW1vdmVkKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wpdm9pZAoJY2FsbHN1YiBzdGFrZVJlbW92ZWQKCWludCAxCglyZXR1cm4KCi8vIHN0YWtlUmVtb3ZlZChwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5LCBzdGFrZXI6IEFkZHJlc3MsIGFtb3VudFJlbW92ZWQ6IHVpbnQ2NCwgcmV3YXJkUmVtb3ZlZDogdWludDY0LCBzdGFrZXJSZW1vdmVkOiBib29sZWFuKTogdm9pZAovLwovLyBzdGFrZVJlbW92ZWQgaXMgY2FsbGVkIGJ5IFN0YWtpbmcgcG9vbHMgdG8gaW5mb3JtIHRoZSB2YWxpZGF0b3IgKHVzKSB0aGF0IGEgcGFydGljdWxhciBhbW91bnQgb2YgdG90YWwgc3Rha2UgaGFzIGJlZW4gcmVtb3ZlZAovLyBmcm9tIHRoZSBzcGVjaWZpZWQgcG9vbC4gIFRoaXMgaXMgdXNlZCB0byB1cGRhdGUgdGhlIHN0YXRzIHdlIGhhdmUgaW4gb3VyIFBvb2xJbmZvIHN0b3JhZ2UuCi8vIElmIGFueSBhbW91bnQgb2YgcmV3YXJkUmVtb3ZlZCBpcyBzcGVjaWZpZWQsIHRoZW4gdGhhdCBhbW91bnQgb2YgcmV3YXJkIGlzIHNlbnQgdG8gdGhlIHVzZQovLyBUaGUgY2FsbGluZyBBcHAgaWQgaXMgdmFsaWRhdGVkIGFnYWluc3Qgb3VyIHBvb2wgbGlzdCBhcyB3ZWxsLgovLwovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgY2FsbGluZyB1cyBmcm9tIHdoaWNoIHN0YWtlIHdhcyByZW1vdmVkCi8vIEBwYXJhbSB7QWRkcmVzc30gc3Rha2VyCi8vIEBwYXJhbSB7dWludDY0fSBhbW91bnRSZW1vdmVkIC0gYWxnbyBhbW91bnQgcmVtb3ZlZAovLyBAcGFyYW0ge3VpbnQ2NH0gcmV3YXJkUmVtb3ZlZCAtIGlmIGFwcGxpY2FibGUsIGFtb3VudCBvZiB0b2tlbiByZXdhcmQgcmVtb3ZlZCAoYnkgcG9vbCAxIGNhbGxlcikgb3IgVE8gcmVtb3ZlIGFuZCBwYXkgb3V0ICh2aWEgcG9vbCAxIGZyb20gZGlmZmVyZW50IHBvb2wgY2FsbGVyKQovLyBAcGFyYW0ge2Jvb2xlYW59IHN0YWtlclJlbW92ZWQKc3Rha2VSZW1vdmVkOgoJcHJvdG8gNSAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMwoKCS8vICppZjE3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzA1CgkvLyBnbG9iYWxzLm9wY29kZUJ1ZGdldCA8IDMwMAoJZ2xvYmFsIE9wY29kZUJ1ZGdldAoJaW50IDMwMAoJPAoJYnogKmlmMTdfZW5kCgoJLy8gKmlmMTdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzA2CgkvLyBpbmNyZWFzZU9wY29kZUJ1ZGdldCgpCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJaW50IDAKCWl0eG5fZmllbGQgRmVlCglieXRlIGI2NCBDb0VCIC8vICNwcmFnbWEgdmVyc2lvbiAxMDsgaW50IDEKCWR1cAoJaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCWludCBEZWxldGVBcHBsaWNhdGlvbgoJaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KCWl0eG5fc3VibWl0CgoqaWYxN19lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MDgKCS8vIHRoaXMudmVyaWZ5UG9vbEtleUNhbGxlcihwb29sS2V5KQoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWNhbGxzdWIgdmVyaWZ5UG9vbEtleUNhbGxlcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxMgoJLy8gYXNzZXJ0KGFtb3VudFJlbW92ZWQgPiAwIHx8IHJld2FyZFJlbW92ZWQgPiAwLCAnc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGFsZ28gb3IgcmV3YXJkIHdhcyByZW1vdmVkJykKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWludCAwCgk+CglkdXAKCWJueiAqc2tpcF9vcjIKCWZyYW1lX2RpZyAtNCAvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCWludCAwCgk+Cgl8fAoKKnNraXBfb3IyOgoJLy8gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGFsZ28gb3IgcmV3YXJkIHdhcyByZW1vdmVkCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MTUKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCAtPSBhbW91bnRSZW1vdmVkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxNgoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsQWxnb1N0YWtlZCAtPSBhbW91bnRSZW1vdmVkCglpbnQgMjUyCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxNwoJLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgLT0gYW1vdW50UmVtb3ZlZAoJYnl0ZSAweDczNzQ2MTZiNjU2NCAvLyAic3Rha2VkIgoJYXBwX2dsb2JhbF9nZXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCXN3YXAKCWFwcF9nbG9iYWxfcHV0CgoJLy8gKmlmMThfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MTkKCS8vIHJld2FyZFJlbW92ZWQgPiAwCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CglpbnQgMAoJPgoJYnogKmlmMThfZWxzZQoKCS8vICppZjE4X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyMAoJLy8gcmV3YXJkVG9rZW5JRCA9IHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5jb25maWcucmV3YXJkVG9rZW5JZAoJaW50IDE1MwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIHJld2FyZFRva2VuSUQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyMQoJLy8gYXNzZXJ0KHJld2FyZFRva2VuSUQgIT09IDAsICJyZXdhcmRSZW1vdmVkIGNhbid0IGJlIHNldCBpZiB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIHJld2FyZCB0b2tlbiEiKQoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JRDogdWludDY0CglpbnQgMAoJIT0KCgkvLyByZXdhcmRSZW1vdmVkIGNhbid0IGJlIHNldCBpZiB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIHJld2FyZCB0b2tlbiEKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyMgoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS5yZXdhcmRUb2tlbkhlbGRCYWNrID49IHJld2FyZFJlbW92ZWQsCgkvLyAgICAgICAgICAgICAgICAgJ3Jld2FyZCBiZWluZyByZW1vdmVkIG11c3QgYmUgY292ZXJlZCBieSBob2xkIGJhY2sgYW1vdW50JywKCS8vICAgICAgICAgICAgICkKCWludCAyNjAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtNCAvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCT49CgoJLy8gcmV3YXJkIGJlaW5nIHJlbW92ZWQgbXVzdCBiZSBjb3ZlcmVkIGJ5IGhvbGQgYmFjayBhbW91bnQKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyOAoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnJld2FyZFRva2VuSGVsZEJhY2sgLT0gcmV3YXJkUmVtb3ZlZAoJaW50IDI2MAoJZHVwCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CgktCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyAqaWYxOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczMwoJLy8gcG9vbEtleS5wb29sSWQgIT09IDEKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCSE9CglieiAqaWYxOV9lbmQKCgkvLyAqaWYxOV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MzQKCS8vIHNlbmRNZXRob2RDYWxsPHR5cGVvZiBTdGFraW5nUG9vbC5wcm90b3R5cGUucGF5VG9rZW5SZXdhcmQ+KHsKCS8vICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRDogQXBwSUQuZnJvbVVpbnQ2NCh0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJnczogW3N0YWtlciwgcmV3YXJkVG9rZW5JRCwgcmV3YXJkUmVtb3ZlZF0sCgkvLyAgICAgICAgICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgltZXRob2QgInBheVRva2VuUmV3YXJkKGFkZHJlc3MsdWludDY0LHVpbnQ2NCl2b2lkIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MzUKCS8vIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQodGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzWzBdLnBvb2xBcHBJZCkKCWludCAyNjgKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczNgoJLy8gbWV0aG9kQXJnczogW3N0YWtlciwgcmV3YXJkVG9rZW5JRCwgcmV3YXJkUmVtb3ZlZF0KCWZyYW1lX2RpZyAtMiAvLyBzdGFrZXI6IEFkZHJlc3MKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklEOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCippZjE5X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczOQoJLy8gdGhpcy5yZXRpT1Bfc3Rha2VSZW1vdmVkLmxvZyh7CgkvLyAgICAgICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICAgICAgcG9vbE51bTogcG9vbEtleS5wb29sSWQgYXMgdWludDE2LAoJLy8gICAgICAgICAgICAgICAgIHBvb2xBcHBJZDogQXBwSUQuZnJvbVVpbnQ2NChwb29sS2V5LnBvb2xBcHBJZCksCgkvLyAgICAgICAgICAgICAgICAgc3Rha2VyOiBzdGFrZXIsCgkvLyAgICAgICAgICAgICAgICAgYW1vdW50VW5zdGFrZWQ6IGFtb3VudFJlbW92ZWQsCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5Bc3NldElkOiBBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JRCksCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5zUmVjZWl2ZWQ6IHJld2FyZFJlbW92ZWQsCgkvLyAgICAgICAgICAgICB9KQoJYnl0ZSAweDEyZjRiZDRiIC8vIHJldGlPUF9zdGFrZVJlbW92ZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTIgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC00IC8vIHJld2FyZFJlbW92ZWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklEOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWIgKmlmMThfZW5kCgoqaWYxOF9lbHNlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzQ5CgkvLyB0aGlzLnJldGlPUF9zdGFrZVJlbW92ZWQubG9nKHsKCS8vICAgICAgICAgICAgICAgICBpZDogcG9vbEtleS5pZCwKCS8vICAgICAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICAgICAgcG9vbEFwcElkOiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICBzdGFrZXI6IHN0YWtlciwKCS8vICAgICAgICAgICAgICAgICBhbW91bnRVbnN0YWtlZDogYW1vdW50UmVtb3ZlZCwKCS8vICAgICAgICAgICAgICAgICAvLyBubyB0b2tlbnMgcmV3YXJkZWQuLgoJLy8gICAgICAgICAgICAgICAgIHJld2FyZFRva2VuQXNzZXRJZDogQXNzZXRJRC56ZXJvSW5kZXgsCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5zUmVjZWl2ZWQ6IDAsCgkvLyAgICAgICAgICAgICB9KQoJYnl0ZSAweDEyZjRiZDRiIC8vIHJldGlPUF9zdGFrZVJlbW92ZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTIgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAKCWNvbmNhdAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCippZjE4X2VuZDoKCS8vICppZjIwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzYxCgkvLyBzdGFrZXJSZW1vdmVkCglmcmFtZV9kaWcgLTUgLy8gc3Rha2VyUmVtb3ZlZDogYm9vbGVhbgoJYnogKmlmMjBfZW5kCgoJLy8gKmlmMjBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzYzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbcG9vbEtleS5wb29sSWQgLSAxXS50b3RhbFN0YWtlcnMgLT0gMQoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJaW50IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDEKCS0KCWl0b2IKCWV4dHJhY3QgNiAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NjUKCS8vIHJlbW92ZVJldCA9IHRoaXMucmVtb3ZlRnJvbVN0YWtlclBvb2xTZXQoc3Rha2VyLCA8VmFsaWRhdG9yUG9vbEtleT57CgkvLyAgICAgICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICAgICAgcG9vbElkOiBwb29sS2V5LnBvb2xJZCwKCS8vICAgICAgICAgICAgICAgICBwb29sQXBwSWQ6IHBvb2xLZXkucG9vbEFwcElkLAoJLy8gICAgICAgICAgICAgfSkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY2FsbHN1YiByZW1vdmVGcm9tU3Rha2VyUG9vbFNldAoJZnJhbWVfYnVyeSAxIC8vIHJlbW92ZVJldDogKGJvb2wsYm9vbCkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NzAKCS8vIHN0YWtlck91dE9mVGhpc1ZhbGlkYXRvciA9IHJlbW92ZVJldFswXQoJZnJhbWVfZGlnIDEgLy8gcmVtb3ZlUmV0OiAoYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWludCAwCglnZXRiaXQKCWZyYW1lX2J1cnkgMiAvLyBzdGFrZXJPdXRPZlRoaXNWYWxpZGF0b3I6IGJvb2wKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NzEKCS8vIHN0YWtlck91dE9mUHJvdG9jb2wgPSByZW1vdmVSZXRbMV0KCWZyYW1lX2RpZyAxIC8vIHJlbW92ZVJldDogKGJvb2wsYm9vbCkKCXN0b3JlIDI1NSAvLyBmdWxsIGFycmF5Cglsb2FkIDI1NSAvLyBmdWxsIGFycmF5CglpbnQgMQoJZ2V0Yml0CglmcmFtZV9idXJ5IDMgLy8gc3Rha2VyT3V0T2ZQcm90b2NvbDogYm9vbAoKCS8vICppZjIxX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzczCgkvLyBzdGFrZXJPdXRPZlRoaXNWYWxpZGF0b3IKCWZyYW1lX2RpZyAyIC8vIHN0YWtlck91dE9mVGhpc1ZhbGlkYXRvcjogYm9vbAoJYnogKmlmMjFfZW5kCgoJLy8gKmlmMjFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Nzc0CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUudG90YWxTdGFrZXJzIC09IDEKCWludCAyNDQKCWR1cAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDEKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKKmlmMjFfZW5kOgoJLy8gKmlmMjJfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NzcKCS8vIHN0YWtlck91dE9mUHJvdG9jb2wKCWZyYW1lX2RpZyAzIC8vIHN0YWtlck91dE9mUHJvdG9jb2w6IGJvb2wKCWJ6ICppZjIyX2VuZAoKCS8vICppZjIyX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc3OAoJLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlIC09IDEKCWJ5dGUgMHg2ZTc1NmQ1Mzc0NjE2YjY1NzI3MyAvLyAibnVtU3Rha2VycyIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMQoJLQoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJc3dhcAoJYXBwX2dsb2JhbF9wdXQKCippZjIyX2VuZDoKCippZjIwX2VuZDoKCXJldHN1YgoKLy8gZmluZFBvb2xGb3JTdGFrZXIodWludDY0LGFkZHJlc3MsdWludDY0KSgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKKmFiaV9yb3V0ZV9maW5kUG9vbEZvclN0YWtlcjoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gYW1vdW50VG9TdGFrZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglidG9pCgoJLy8gc3Rha2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDEgKHN0YWtlcikgZm9yIGZpbmRQb29sRm9yU3Rha2VyIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBmaW5kUG9vbEZvclN0YWtlcih1aW50NjQsYWRkcmVzcyx1aW50NjQpKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJY2FsbHN1YiBmaW5kUG9vbEZvclN0YWtlcgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGZpbmRQb29sRm9yU3Rha2VyKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIHN0YWtlcjogQWRkcmVzcywgYW1vdW50VG9TdGFrZTogdWludDY0KTogW1ZhbGlkYXRvclBvb2xLZXksIGJvb2xlYW4sIGJvb2xlYW5dCi8vCi8vIEZpbmRzIHRoZSBwb29sIGZvciBhIHN0YWtlciBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgdmFsaWRhdG9yIGlkLCBzdGFrZXIgYWRkcmVzcywgYW5kIGFtb3VudCB0byBzdGFrZS4KLy8gRmlyc3QgY2hlY2tzIHRoZSBzdGFrZXJzICdhbHJlYWR5IHN0YWtlZCBsaXN0JyBmb3IgdGhlIHZhbGlkYXRvciBwcmVmZXJyaW5nIHRob3NlIChhZGRpbmcgaWYgcG9zc2libGUpIHRoZW4gYWRkcwovLyB0byBuZXcgcG9vbCBpZiBuZWNlc3NhcnkuCi8vCi8vIEBwYXJhbSB7VmFsaWRhdG9ySWRUeXBlfSB2YWxpZGF0b3JJZCAtIFRoZSBpZCBvZiB0aGUgdmFsaWRhdG9yLgovLyBAcGFyYW0ge0FkZHJlc3N9IHN0YWtlciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzdGFrZXIuCi8vIEBwYXJhbSB7dWludDY0fSBhbW91bnRUb1N0YWtlIC0gVGhlIGFtb3VudCB0byBzdGFrZS4KLy8gQHJldHVybnMge1ZhbGlkYXRvclBvb2xLZXksIGJvb2xlYW4sIGJvb2xlYW59IC0gVGhlIHBvb2wgZm9yIHRoZSBzdGFrZXIsIHRydWUvZmFsc2Ugb24gd2hldGhlciB0aGUgc3Rha2VyIGlzICduZXcnCi8vIHRvIHRoaXMgVkFMSURBVE9SLCBhbmQgdHJ1ZS9mYWxzZSBpZiBzdGFrZXIgaXMgbmV3IHRvIHRoZSBwcm90b2NvbC4KZmluZFBvb2xGb3JTdGFrZXI6Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA3CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODAwCgkvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yID0gdHJ1ZQoJaW50IDEKCWZyYW1lX2J1cnkgMCAvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yOiBib29sCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODAxCgkvLyBpc05ld1N0YWtlclRvUHJvdG9jb2wgPSB0cnVlCglpbnQgMQoJZnJhbWVfYnVyeSAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgwOQoJLy8gbWF4UGVyUG9vbCA9IHRoaXMuZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sCglmcmFtZV9idXJ5IDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoJLy8gKmlmMjNfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MTIKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLmV4aXN0cwoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfbGVuCglzd2FwCglwb3AKCWJ6ICppZjIzX2VuZAoKCS8vICppZjIzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxMwoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxNAoJLy8gYXNzZXJ0KHZhbGlkYXRvcklkICE9PSAwKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWludCAwCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODE1CgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IHBvb2xTZXQubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoKKmZvcl8zOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODE1CgkvLyBpIDwgcG9vbFNldC5sZW5ndGgKCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDYKCTwKCWJ6ICpmb3JfM19lbmQKCgkvLyAqaWYyNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxNgoJLy8gZ2xvYmFscy5vcGNvZGVCdWRnZXQgPCAzMDAKCWdsb2JhbCBPcGNvZGVCdWRnZXQKCWludCAzMDAKCTwKCWJ6ICppZjI0X2VuZAoKCS8vICppZjI0X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxNwoJLy8gaW5jcmVhc2VPcGNvZGVCdWRnZXQoKQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCWludCAwCglpdHhuX2ZpZWxkIEZlZQoJYnl0ZSBiNjQgQ29FQiAvLyAjcHJhZ21hIHZlcnNpb24gMTA7IGludCAxCglkdXAKCWl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCglpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCglpbnQgRGVsZXRlQXBwbGljYXRpb24KCWl0eG5fZmllbGQgT25Db21wbGV0aW9uCglpdHhuX3N1Ym1pdAoKKmlmMjRfZW5kOgoJLy8gKmlmMjVfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MTkKCS8vIHBvb2xTZXRbaV0uaWQgPT09IDAKCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgk9PQoJYnogKmlmMjVfZW5kCgoJLy8gKmlmMjVfY29uc2VxdWVudAoJYiAqZm9yXzNfY29udGludWUKCippZjI1X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyMgoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sID0gZmFsc2UKCWludCAwCglmcmFtZV9idXJ5IDEgLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sCgoJLy8gKmlmMjZfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MjMKCS8vIHBvb2xTZXRbaV0uaWQgPT09IHZhbGlkYXRvcklkCglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgMAoJKwoJaW50IDgKCWV4dHJhY3QzCglidG9pCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJPT0KCWJ6ICppZjI2X2VuZAoKCS8vICppZjI2X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyNQoJLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciA9IGZhbHNlCglpbnQgMAoJZnJhbWVfYnVyeSAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCgkvLyAqaWYyN19jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyNwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1twb29sU2V0W2ldLnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCArCgkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50VG9TdGFrZSA8PQoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4UGVyUG9vbAoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgOCAvLyBoZWFkT2Zmc2V0CgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJKwoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8PQoJYnogKmlmMjdfZW5kCgoJLy8gKmlmMjdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODMxCgkvLyByZXR1cm4gW3Bvb2xTZXRbaV0sIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IsIGlzTmV3U3Rha2VyVG9Qcm90b2NvbF0KCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWJ5dGUgMHgwMAoJaW50IDAKCWZyYW1lX2RpZyAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCXNldGJpdAoJaW50IDEKCWZyYW1lX2RpZyAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoJc2V0Yml0Cgljb25jYXQKCWIgKmZpbmRQb29sRm9yU3Rha2VyKnJldHVybgoKKmlmMjdfZW5kOgoKKmlmMjZfZW5kOgoKKmZvcl8zX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODE1CgkvLyBpICs9IDEKCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgNCAvLyBpOiB1aW50NjQKCWIgKmZvcl8zCgoqZm9yXzNfZW5kOgoKKmlmMjNfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODM4CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBhbW91bnRUb1N0YWtlID49IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1pbkVudHJ5U3Rha2UsCgkvLyAgICAgICAgICAgICAnbXVzdCBzdGFrZSBhdCBsZWFzdCB0aGUgbWluaW11bSBmb3IgdGhpcyBwb29sJywKCS8vICAgICAgICAgKQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJaW50IDIwOQoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk+PQoKCS8vIG11c3Qgc3Rha2UgYXQgbGVhc3QgdGhlIG1pbmltdW0gZm9yIHRoaXMgcG9vbAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ0CgkvLyBwb29scyA9IGNsb25lKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHMpCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWludCA0MzIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglmcmFtZV9idXJ5IDUgLy8gcG9vbHM6ICh1aW50NjQsdWludDE2LHVpbnQ2NClbMjRdCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ1CgkvLyBjdXJOdW1Qb29scyA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUubnVtUG9vbHMgYXMgdWludDY0CglpbnQgMjQyCglpbnQgMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgNiAvLyBjdXJOdW1Qb29sczogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ2CgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IGN1ck51bVBvb2xzOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA3IC8vIGk6IHVpbnQ2NAoKKmZvcl80OgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ2CgkvLyBpIDwgY3VyTnVtUG9vbHMKCWZyYW1lX2RpZyA3IC8vIGk6IHVpbnQ2NAoJZnJhbWVfZGlnIDYgLy8gY3VyTnVtUG9vbHM6IHVpbnQ2NAoJPAoJYnogKmZvcl80X2VuZAoKCS8vICppZjI4X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ3CgkvLyBwb29sc1tpXS50b3RhbEFsZ29TdGFrZWQgKyBhbW91bnRUb1N0YWtlIDw9IG1heFBlclBvb2wKCWZyYW1lX2RpZyA1IC8vIHBvb2xzOiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJKwoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8PQoJYnogKmlmMjhfZW5kCgoJLy8gKmlmMjhfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ4CgkvLyByZXR1cm4gWwoJLy8gICAgICAgICAgICAgICAgICAgICB7IGlkOiB2YWxpZGF0b3JJZCwgcG9vbElkOiBpICsgMSwgcG9vbEFwcElkOiBwb29sc1tpXS5wb29sQXBwSWQgfSwKCS8vICAgICAgICAgICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciwKCS8vICAgICAgICAgICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1Byb3RvY29sLAoJLy8gICAgICAgICAgICAgICAgIF0KCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxCgkrCglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyA1IC8vIHBvb2xzOiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglieXRlIDB4MDAKCWludCAwCglmcmFtZV9kaWcgMCAvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yOiBib29sCglzZXRiaXQKCWludCAxCglmcmFtZV9kaWcgMSAvLyBpc05ld1N0YWtlclRvUHJvdG9jb2w6IGJvb2wKCXNldGJpdAoJY29uY2F0CgliICpmaW5kUG9vbEZvclN0YWtlcipyZXR1cm4KCippZjI4X2VuZDoKCipmb3JfNF9jb250aW51ZToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg0NgoJLy8gaSArPSAxCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDcgLy8gaTogdWludDY0CgliICpmb3JfNAoKKmZvcl80X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg1NgoJLy8gcmV0dXJuIFt7IGlkOiB2YWxpZGF0b3JJZCwgcG9vbElkOiAwLCBwb29sQXBwSWQ6IDAgfSwgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciwgaXNOZXdTdGFrZXJUb1Byb3RvY29sXQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCgljb25jYXQKCWJ5dGUgMHgwMAoJaW50IDAKCWZyYW1lX2RpZyAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCXNldGJpdAoJaW50IDEKCWZyYW1lX2RpZyAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoJc2V0Yml0Cgljb25jYXQKCipmaW5kUG9vbEZvclN0YWtlcipyZXR1cm46CgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCgkvLyBwb3AgYWxsIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHRoZSBzdGFjawoJcG9wbiA3CglyZXRzdWIKCi8vIG1vdmVQb29sVG9Ob2RlKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKKmFiaV9yb3V0ZV9tb3ZlUG9vbFRvTm9kZToKCS8vIG5vZGVOdW06IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwoJYnRvaQoKCS8vIHBvb2xBcHBJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglidG9pCgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgbW92ZVBvb2xUb05vZGUodWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZAoJY2FsbHN1YiBtb3ZlUG9vbFRvTm9kZQoJaW50IDEKCXJldHVybgoKLy8gbW92ZVBvb2xUb05vZGUodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcG9vbEFwcElkOiB1aW50NjQsIG5vZGVOdW06IHVpbnQ2NCk6IHZvaWQKLy8KLy8gRmluZCB0aGUgc3BlY2lmaWVkIHBvb2wgKGluIGFueSBub2RlIG51bWJlcikgYW5kIG1vdmUgaXQgdG8gdGhlIHNwZWNpZmllZCBub2RlLgovLyBUaGUgcG9vbCBhY2NvdW50IGlzIGZvcmNlZCBvZmZsaW5lIGlmIG1vdmVkIHNvIHByaW9yIG5vZGUgd2lsbCBzdGlsbCBydW4gZm9yIDMyMCByb3VuZHMgYnV0Ci8vIG5ldyBrZXkgZ29lcyBvbmxpbmUgb24gbmV3IG5vZGUgc29vbiBhZnRlciAoMzIwIHJvdW5kcyBhZnRlciBpdCBnb2VzIG9ubGluZSkKLy8gTm8tb3AgaWYgc3VjY2VzcywgYXNzZXJ0cyBpZiBub3QgZm91bmQgb3IgY2FuJ3QgbW92ZSAgKG5vIHNwYWNlIGluIHRhcmdldCkKLy8gWyBPTkxZIE9XTkVSIE9SIE1BTkFHRVIgQ0FOIENIQU5HRSBdCi8vCi8vIEBwYXJhbSB7VmFsaWRhdG9ySWRUeXBlfSB2YWxpZGF0b3JJZCAtIFRoZSBpZCBvZiB0aGUgdmFsaWRhdG9yLgovLyBAcGFyYW0ge3VpbnQ2NH0gcG9vbEFwcElkCi8vIEBwYXJhbSB7dWludDY0fSBub2RlTnVtCm1vdmVQb29sVG9Ob2RlOgoJcHJvdG8gMyAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3MQoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lck9yTWFuYWdlcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyT3JNYW5hZ2VyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODczCgkvLyBub2RlUG9vbEFzc2lnbm1lbnRzID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5ub2RlUG9vbEFzc2lnbm1lbnRzKQoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfYnVyeSAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzQKCS8vIGFzc2VydChub2RlTnVtID49IDEgJiYgbm9kZU51bSA8PSBNQVhfTk9ERVMsICdub2RlIG51bWJlciBvdXQgb2YgYWxsb3dhYmxlIHJhbmdlJykKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCAxCgk+PQoJZHVwCglieiAqc2tpcF9hbmQyCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgOAoJPD0KCSYmCgoqc2tpcF9hbmQyOgoJLy8gbm9kZSBudW1iZXIgb3V0IG9mIGFsbG93YWJsZSByYW5nZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODc2CgkvLyBmb3IgKGxldCBzcmNOb2RlSWR4ID0gMDsgc3JjTm9kZUlkeCA8IE1BWF9OT0RFUzsgc3JjTm9kZUlkeCArPSAxKQoJaW50IDAKCWZyYW1lX2J1cnkgMSAvLyBzcmNOb2RlSWR4OiB1aW50NjQKCipmb3JfNToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3NgoJLy8gc3JjTm9kZUlkeCA8IE1BWF9OT0RFUwoJZnJhbWVfZGlnIDEgLy8gc3JjTm9kZUlkeDogdWludDY0CglpbnQgOAoJPAoJYnogKmZvcl81X2VuZAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3NwoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBNQVhfUE9PTFNfUEVSX05PREU7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzY6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzcKCS8vIGkgPCBNQVhfUE9PTFNfUEVSX05PREUKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDMKCTwKCWJ6ICpmb3JfNl9lbmQKCgkvLyAqaWYyOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3OAoJLy8gbm9kZVBvb2xBc3NpZ25tZW50cy5ub2Rlc1tzcmNOb2RlSWR4XS5wb29sQXBwSWRzW2ldID09PSBwb29sQXBwSWQKCWZyYW1lX2RpZyAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCWludCAwCglmcmFtZV9kaWcgMSAvLyBzcmNOb2RlSWR4OiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMAoJKwoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWZyYW1lX2RpZyAtMiAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJPT0KCWJ6ICppZjI5X2VuZAoKCS8vICppZjI5X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3OQoJLy8gYXNzZXJ0KG5vZGVOdW0gLSAxICE9PSBzcmNOb2RlSWR4LCAiY2FuJ3QgbW92ZSB0byBzYW1lIG5vZGUiKQoJZnJhbWVfZGlnIC0zIC8vIG5vZGVOdW06IHVpbnQ2NAoJaW50IDEKCS0KCWZyYW1lX2RpZyAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJIT0KCgkvLyBjYW4ndCBtb3ZlIHRvIHNhbWUgbm9kZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODgxCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLm5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbc3JjTm9kZUlkeF0ucG9vbEFwcElkc1tpXSA9IDAKCWludCA5MDAKCWZyYW1lX2RpZyAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4NAoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5nb09mZmxpbmU+KHsKCS8vICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgltZXRob2QgImdvT2ZmbGluZSgpdm9pZCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODg1CgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkKCWZyYW1lX2RpZyAtMiAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4OQoJLy8gdGhpcy5hZGRQb29sVG9Ob2RlKHZhbGlkYXRvcklkLCBwb29sQXBwSWQsIG5vZGVOdW0pCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gcG9vbEFwcElkOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGFkZFBvb2xUb05vZGUKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4OTAKCS8vIHJldHVybgoJcmV0c3ViCgoqaWYyOV9lbmQ6CgoqZm9yXzZfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzcKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzYKCipmb3JfNl9lbmQ6CgoqZm9yXzVfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzYKCS8vIHNyY05vZGVJZHggKz0gMQoJZnJhbWVfZGlnIDEgLy8gc3JjTm9kZUlkeDogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJYiAqZm9yXzUKCipmb3JfNV9lbmQ6CgkvLyBjb3VsZG4ndCBmaW5kIHBvb2wgYXBwIGlkIGluIG5vZGVzIHRvIG1vdmUKCWVycgoJcmV0c3ViCgovLyBlbXB0eVRva2VuUmV3YXJkcyh1aW50NjQsYWRkcmVzcyl1aW50NjQKKmFiaV9yb3V0ZV9lbXB0eVRva2VuUmV3YXJkczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gcmVjZWl2ZXI6IGFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMzIKCT09CgoJLy8gYXJndW1lbnQgMCAocmVjZWl2ZXIpIGZvciBlbXB0eVRva2VuUmV3YXJkcyBtdXN0IGJlIGEgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZW1wdHlUb2tlblJld2FyZHModWludDY0LGFkZHJlc3MpdWludDY0CgljYWxsc3ViIGVtcHR5VG9rZW5SZXdhcmRzCglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZW1wdHlUb2tlblJld2FyZHModmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcmVjZWl2ZXI6IEFkZHJlc3MpOiB1aW50NjQKLy8KLy8gU2VuZHMgdGhlIHJld2FyZCB0b2tlbnMgaGVsZCBpbiBwb29sIDEgdG8gc3BlY2lmaWVkIHJlY2VpdmVyLgovLyBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgdGhlIG93bmVyIHdoZW4gdGhleSB3YW50IHRvIGdldCByZXdhcmQgdG9rZW5zICdiYWNrJyB3aGljaCB0aGV5IHNlbnQgdG8KLy8gdGhlIGZpcnN0IHBvb2wgKGxpa2VseSBiZWNhdXNlIHZhbGlkYXRvciBpcyBzdW5zZXR0aW5nLiAgQW55IHRva2VucyBjdXJyZW50bHkgJ3Jlc2VydmVkJyBmb3Igc3Rha2VycyB0byBjbGFpbSB3aWxsCi8vIE5PVCBiZSBzZW50IGFzIHRoZXkgbXVzdCBiZSBoZWxkIGJhY2sgZm9yIHN0YWtlcnMgdG8gbGF0ZXIgY2xhaW0uCi8vIFsgT05MWSBPV05FUiBDQU4gQ0FMTF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7QWRkcmVzc30gcmVjZWl2ZXIgLSB0aGUgYWNjb3VudCB0byBzZW5kIHRoZSB0b2tlbnMgdG8gKG11c3QgYWxyZWFkeSBiZSBvcHRlZC1pbiB0byB0aGUgcmV3YXJkIHRva2VuKQovLyBAcmV0dXJucyB7dWludDY0fSB0aGUgYW1vdW50IG9mIHJld2FyZCB0b2tlbiBzZW50CmVtcHR5VG9rZW5SZXdhcmRzOgoJcHJvdG8gMiAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkwOQoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTEwCgkvLyByZXdhcmRUb2tlbklkID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcucmV3YXJkVG9rZW5JZAoJaW50IDE1MwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTExCgkvLyByZXdhcmRUb2tlbkhlbGRCYWNrID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5yZXdhcmRUb2tlbkhlbGRCYWNrCglpbnQgMjYwCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMSAvLyByZXdhcmRUb2tlbkhlbGRCYWNrOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MTIKCS8vIGFzc2VydChyZXdhcmRUb2tlbklkICE9PSAwLCAidGhpcyB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIGEgcmV3YXJkIHRva2VuIGRlZmluZWQiKQoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0CglpbnQgMAoJIT0KCgkvLyB0aGlzIHZhbGlkYXRvciBkb2Vzbid0IGhhdmUgYSByZXdhcmQgdG9rZW4gZGVmaW5lZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTEzCgkvLyBwb29sT25lQXBwSWQgPSBBcHBJRC5mcm9tVWludDY0KHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkKQoJaW50IDI2OAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MTUKCS8vIHRva2VuUmV3YXJkQmFsID0KCS8vICAgICAgICAgICAgIHBvb2xPbmVBcHBJZC5hZGRyZXNzLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JZCkpIC0gcmV3YXJkVG9rZW5IZWxkQmFjawoJZnJhbWVfZGlnIDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCXBvcAoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0Cglhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKCXBvcAoJZnJhbWVfZGlnIDEgLy8gcmV3YXJkVG9rZW5IZWxkQmFjazogdWludDY0CgktCglmcmFtZV9idXJ5IDMgLy8gdG9rZW5SZXdhcmRCYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkxOQoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5wYXlUb2tlblJld2FyZD4oewoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25JRDogcG9vbE9uZUFwcElkLAoJLy8gICAgICAgICAgICAgbWV0aG9kQXJnczogW3JlY2VpdmVyLCByZXdhcmRUb2tlbklkLCB0b2tlblJld2FyZEJhbF0sCgkvLyAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJbWV0aG9kICJwYXlUb2tlblJld2FyZChhZGRyZXNzLHVpbnQ2NCx1aW50NjQpdm9pZCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTIwCgkvLyBhcHBsaWNhdGlvbklEOiBwb29sT25lQXBwSWQKCWZyYW1lX2RpZyAyIC8vIHBvb2xPbmVBcHBJZDogdWludDY0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MjEKCS8vIG1ldGhvZEFyZ3M6IFtyZWNlaXZlciwgcmV3YXJkVG9rZW5JZCwgdG9rZW5SZXdhcmRCYWxdCglmcmFtZV9kaWcgLTIgLy8gcmVjZWl2ZXI6IEFkZHJlc3MKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklkOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMyAvLyB0b2tlblJld2FyZEJhbDogdWludDY0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MjMKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHBvb2xPbmVBcHBJZC5hZGRyZXNzLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JZCkpID09PSByZXdhcmRUb2tlbkhlbGRCYWNrLAoJLy8gICAgICAgICAgICAgJ2JhbGFuY2Ugb2YgcmVtYWluaW5nIHJld2FyZCB0b2tlbnMgc2hvdWxkIG1hdGNoIHRoZSBoZWxkIGJhY2sgYW1vdW50JywKCS8vICAgICAgICAgKQoJZnJhbWVfZGlnIDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCXBvcAoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0Cglhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKCXBvcAoJZnJhbWVfZGlnIDEgLy8gcmV3YXJkVG9rZW5IZWxkQmFjazogdWludDY0Cgk9PQoKCS8vIGJhbGFuY2Ugb2YgcmVtYWluaW5nIHJld2FyZCB0b2tlbnMgc2hvdWxkIG1hdGNoIHRoZSBoZWxkIGJhY2sgYW1vdW50Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MjcKCS8vIHJldHVybiB0b2tlblJld2FyZEJhbAoJZnJhbWVfZGlnIDMgLy8gdG9rZW5SZXdhcmRCYWw6IHVpbnQ2NAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDMKCXJldHN1YgoKLy8gY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IHZvaWQKY2FsbGVyTXVzdEJlT3duZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDIwCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICB0aGlzLnR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLAoJLy8gICAgICAgICAgICAgJ2NhbiBvbmx5IGJlIGNhbGxlZCBieSB2YWxpZGF0b3Igb3duZXInLAoJLy8gICAgICAgICApCgl0eG4gU2VuZGVyCglpbnQgOAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJPT0KCgkvLyBjYW4gb25seSBiZSBjYWxsZWQgYnkgdmFsaWRhdG9yIG93bmVyCglhc3NlcnQKCXJldHN1YgoKLy8gY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXIodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IHZvaWQKY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDI3CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICB0aGlzLnR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyIHx8CgkvLyAgICAgICAgICAgICAgICAgdGhpcy50eG4uc2VuZGVyID09PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5tYW5hZ2VyLAoJLy8gICAgICAgICAgICAgJ2NhbiBvbmx5IGJlIGNhbGxlZCBieSBvd25lciBvciBtYW5hZ2VyIG9mIHZhbGlkYXRvcicsCgkvLyAgICAgICAgICkKCXR4biBTZW5kZXIKCWludCA4CglpbnQgMzIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0Cgk9PQoJZHVwCglibnogKnNraXBfb3IzCgl0eG4gU2VuZGVyCglpbnQgNDAKCWludCAzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCT09Cgl8fAoKKnNraXBfb3IzOgoJLy8gY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IG93bmVyIG9yIG1hbmFnZXIgb2YgdmFsaWRhdG9yCglhc3NlcnQKCXJldHN1YgoKLy8gdmVyaWZ5UG9vbEtleUNhbGxlcihwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5KTogdm9pZAovLwovLyB2ZXJpZnlQb29sS2V5Q2FsbGVyIHZlcmlmaWVzIHRoZSBwYXNzZWQgaW4ga2V5IChmcm9tIGEgc3Rha2luZyBwb29sIGNhbGxpbmcgdXMgdG8gdXBkYXRlIG1ldHJpY3MpIGlzIHZhbGlkCi8vIGFuZCBtYXRjaGVzIHRoZSBpbmZvcm1hdGlvbiB3ZSBoYXZlIGluIG91ciBzdGF0ZS4gICdGYWtlJyBwb29scyBjb3VsZCBjYWxsIHVzIHRvIHVwZGF0ZSBvdXIgZGF0YSwgYnV0IHRoZXkKLy8gY2FuJ3QgZmFrZSB0aGUgaWRzIGFuZCBtb3N0IGltcG9ydGFudGx5IGFwcGxpY2F0aW9uIGlkKCEpIG9mIHRoZSBjYWxsZXIgdGhhdCBoYXMgdG8gbWF0Y2guCnZlcmlmeVBvb2xLZXlDYWxsZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDQwCgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLmV4aXN0cywgInRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGlzbid0IHZhbGlkIikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cglib3hfbGVuCglzd2FwCglwb3AKCgkvLyB0aGUgc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBpc24ndCB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA0MQoJLy8gYXNzZXJ0KHBvb2xLZXkucG9vbElkIDw9IE1BWF9QT09MUywgJ3Bvb2wgaWQgbm90IGluIHZhbGlkIHJhbmdlJykKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDI0Cgk8PQoKCS8vIHBvb2wgaWQgbm90IGluIHZhbGlkIHJhbmdlCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDQyCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBwb29sS2V5LnBvb2xJZCA+IDAgJiYgKHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNikgPD0gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLm51bVBvb2xzLAoJLy8gICAgICAgICAgICAgJ3Bvb2wgaWQgb3V0c2lkZSBvZiByYW5nZSBvZiBwb29scyBjcmVhdGVkIGZvciB0aGlzIHZhbGlkYXRvcicsCgkvLyAgICAgICAgICkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDAKCT4KCWR1cAoJYnogKnNraXBfYW5kMwoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMjQyCglpbnQgMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk8PQoJJiYKCipza2lwX2FuZDM6CgkvLyBwb29sIGlkIG91dHNpZGUgb2YgcmFuZ2Ugb2YgcG9vbHMgY3JlYXRlZCBmb3IgdGhpcyB2YWxpZGF0b3IKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNDgKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHBvb2xLZXkucG9vbEFwcElkID09PSB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbcG9vbEtleS5wb29sSWQgLSAxXS5wb29sQXBwSWQsCgkvLyAgICAgICAgICAgICAiVGhlIHBhc3NlZCBpbiBhcHAgaWQgZG9lc24ndCBtYXRjaCB0aGUgcGFzc2VkIGluIGlkcyIsCgkvLyAgICAgICAgICkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk9PQoKCS8vIFRoZSBwYXNzZWQgaW4gYXBwIGlkIGRvZXNuJ3QgbWF0Y2ggdGhlIHBhc3NlZCBpbiBpZHMKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNTMKCS8vIGFzc2VydCh0aGlzLnR4bi5zZW5kZXIgPT09IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLmFkZHJlc3MpCgl0eG4gU2VuZGVyCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAxNiA4CglidG9pCglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCT09Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDU1CgkvLyBhc3NlcnQocG9vbEtleS5pZCA9PT0gKEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLmdsb2JhbFN0YXRlKCd2YWxpZGF0b3JJZCcpIGFzIHVpbnQ2NCkpCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWJ5dGUgMHg3NjYxNmM2OTY0NjE3NDZmNzI0OTY0IC8vICJ2YWxpZGF0b3JJZCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgndmFsaWRhdG9ySWQnKQoJYXNzZXJ0Cgk9PQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA1NgoJLy8gYXNzZXJ0KHBvb2xLZXkucG9vbElkID09PSAoQXBwSUQuZnJvbVVpbnQ2NChwb29sS2V5LnBvb2xBcHBJZCkuZ2xvYmFsU3RhdGUoJ3Bvb2xJZCcpIGFzIHVpbnQ2NCkpCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWJ5dGUgMHg3MDZmNmY2YzQ5NjQgLy8gInBvb2xJZCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgncG9vbElkJykKCWFzc2VydAoJPT0KCWFzc2VydAoJcmV0c3ViCgovLyByZXZlcmlmeU5GRE93bmVyc2hpcCh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogdm9pZAovLwovLyBUaGlzIG1ldGhvZCB2ZXJpZmllcyB0aGUgb3duZXJzaGlwIG9mIE5GRCAoTmFtZWQgRnVuY3Rpb24gRGF0YSkgYnkgYSB2YWxpZGF0b3IuCi8vIElmIHRoZSBvd25lcnNoaXAgaXMgbm8gbG9uZ2VyIHZhbGlkLCBpdCByZW1vdmVzIHRoZSBORkQgZnJvbSB0aGUgdmFsaWRhdG9yJ3MgY29uZmlndXJhdGlvbi4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3Igd2hvc2UgZGF0YSBzaG91bGQgYmUgcmUtZXZhbHVhdGVkLgpyZXZlcmlmeU5GRE93bmVyc2hpcDoKCXByb3RvIDEgMAoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDY2CgkvLyB2YWxpZGF0b3JDb25maWcgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZwoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJZnJhbWVfYnVyeSAwIC8vIHN0b3JhZ2Uga2V5Ly92YWxpZGF0b3JDb25maWcKCgkvLyAqaWYzMF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNjcKCS8vIHZhbGlkYXRvckNvbmZpZy5uZmRGb3JJbmZvICE9PSAwCglpbnQgNzIKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDAKCSE9CglieiAqaWYzMF9lbmQKCgkvLyAqaWYzMF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDcwCgkvLyBuZmRPd25lciA9IEFwcElELmZyb21VaW50NjQodmFsaWRhdG9yQ29uZmlnLm5mZEZvckluZm8pLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzCglpbnQgNzIKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQodmFsaWRhdG9yQ29uZmlnLm5mZEZvckluZm8pLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCgkvLyAqaWYzMV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNzIKCS8vIHZhbGlkYXRvckNvbmZpZy5vd25lciAhPT0gbmZkT3duZXIgJiYgdmFsaWRhdG9yQ29uZmlnLm1hbmFnZXIgIT09IG5mZE93bmVyCglpbnQgOAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfZGlnIDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCSE9CglkdXAKCWJ6ICpza2lwX2FuZDQKCWludCA0MAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfZGlnIDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCSE9CgkmJgoKKnNraXBfYW5kNDoKCWJ6ICppZjMxX2VuZAoKCS8vICppZjMxX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNzQKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm5mZEZvckluZm8gPSAwCglpbnQgNzIKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKKmlmMzFfZW5kOgoKKmlmMzBfZW5kOgoJcmV0c3ViCgovLyB2YWxpZGF0ZUNvbmZpZyhjb25maWc6IFZhbGlkYXRvckNvbmZpZyk6IHZvaWQKdmFsaWRhdGVDb25maWc6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDgxCgkvLyBhc3NlcnQoY29uZmlnLm93bmVyICE9PSBBZGRyZXNzLnplcm9BZGRyZXNzKQoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDggMzIKCWdsb2JhbCBaZXJvQWRkcmVzcwoJIT0KCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwODIKCS8vIGFzc2VydChjb25maWcubWFuYWdlciAhPT0gQWRkcmVzcy56ZXJvQWRkcmVzcykKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA0MCAzMgoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA4MwoJLy8gYXNzZXJ0KHRoaXMudHhuLnNlbmRlciA9PT0gY29uZmlnLm93bmVyLCAnc2VuZGVyIG11c3QgYmUgb3duZXIgdG8gYWRkIG5ldyB2YWxpZGF0b3InKQoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDggMzIKCT09CgoJLy8gc2VuZGVyIG11c3QgYmUgb3duZXIgdG8gYWRkIG5ldyB2YWxpZGF0b3IKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwODUKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIGNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPj0gR0FUSU5HX1RZUEVfTk9ORSAmJiBjb25maWcuZW50cnlHYXRpbmdUeXBlIDw9IEdBVElOR19UWVBFX0NPTlNUX01BWCwKCS8vICAgICAgICAgICAgICdnYXRpbmcgdHlwZSBub3QgdmFsaWQnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgODAgMQoJYnRvaQoJaW50IDAKCT49CglkdXAKCWJ6ICpza2lwX2FuZDUKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4MCAxCglidG9pCglpbnQgNAoJPD0KCSYmCgoqc2tpcF9hbmQ1OgoJLy8gZ2F0aW5nIHR5cGUgbm90IHZhbGlkCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDg5CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBjb25maWcuZXBvY2hSb3VuZExlbmd0aCA+PSBNSU5fRVBPQ0hfTEVOR1RIICYmIGNvbmZpZy5lcG9jaFJvdW5kTGVuZ3RoIDw9IE1BWF9FUE9DSF9MRU5HVEgsCgkvLyAgICAgICAgICAgICAnZXBvY2ggbGVuZ3RoIG5vdCBpbiBhbGxvd2FibGUgcmFuZ2UnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTY5IDQKCWJ0b2kKCWludCAxCgk+PQoJZHVwCglieiAqc2tpcF9hbmQ2CglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTY5IDQKCWJ0b2kKCWludCAxMDAwMDAwCgk8PQoJJiYKCipza2lwX2FuZDY6CgkvLyBlcG9jaCBsZW5ndGggbm90IGluIGFsbG93YWJsZSByYW5nZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA5MwoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgY29uZmlnLnBlcmNlbnRUb1ZhbGlkYXRvciA+PSBNSU5fUENUX1RPX1ZBTElEQVRPUiAmJiBjb25maWcucGVyY2VudFRvVmFsaWRhdG9yIDw9IE1BWF9QQ1RfVE9fVkFMSURBVE9SLAoJLy8gICAgICAgICAgICAgJ2NvbW1pc3Npb24gcGVyY2VudGFnZSBub3QgdmFsaWQnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTczIDQKCWJ0b2kKCWludCAwCgk+PQoJZHVwCglieiAqc2tpcF9hbmQ3CglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTczIDQKCWJ0b2kKCWludCAxMDAwMDAwCgk8PQoJJiYKCipza2lwX2FuZDc6CgkvLyBjb21taXNzaW9uIHBlcmNlbnRhZ2Ugbm90IHZhbGlkCglhc3NlcnQKCgkvLyAqaWYzMl9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwOTcKCS8vIGNvbmZpZy5wZXJjZW50VG9WYWxpZGF0b3IgIT09IDAKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAxNzMgNAoJYnRvaQoJaW50IDAKCSE9CglieiAqaWYzMl9lbmQKCgkvLyAqaWYzMl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDk4CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgY29uZmlnLnZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzICE9PSBBZGRyZXNzLnplcm9BZGRyZXNzLAoJLy8gICAgICAgICAgICAgICAgICd2YWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyBtdXN0IGJlIHNldCBpZiBwZXJjZW50IHRvIHZhbGlkYXRvciBpcyBub3QgMCcsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTc3IDMyCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CgoJLy8gdmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MgbXVzdCBiZSBzZXQgaWYgcGVyY2VudCB0byB2YWxpZGF0b3IgaXMgbm90IDAKCWFzc2VydAoKKmlmMzJfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEwMwoJLy8gYXNzZXJ0KGNvbmZpZy5taW5FbnRyeVN0YWtlID49IE1JTl9BTEdPX1NUQUtFX1BFUl9QT09MLCAnc3Rha2luZyBwb29sIG11c3QgaGF2ZSBtaW5pbXVtIGVudHJ5IG9mIDEgYWxnbycpCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMjA5IDgKCWJ0b2kKCWludCAxMDAwMDAwCgk+PQoKCS8vIHN0YWtpbmcgcG9vbCBtdXN0IGhhdmUgbWluaW11bSBlbnRyeSBvZiAxIGFsZ28KCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMDUKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIGNvbmZpZy5wb29sc1Blck5vZGUgPiAwICYmIGNvbmZpZy5wb29sc1Blck5vZGUgPD0gTUFYX1BPT0xTX1BFUl9OT0RFLAoJLy8gICAgICAgICAgICAgJ251bWJlciBvZiBwb29scyBwZXIgbm9kZSBtdXN0IGJlIGJlIGJldHdlZW4gMSBhbmQgdGhlIG1heGltdW0gYWxsb3dlZCBudW1iZXInLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMjI1IDEKCWJ0b2kKCWludCAwCgk+CglkdXAKCWJ6ICpza2lwX2FuZDgKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAyMjUgMQoJYnRvaQoJaW50IDMKCTw9CgkmJgoKKnNraXBfYW5kODoKCS8vIG51bWJlciBvZiBwb29scyBwZXIgbm9kZSBtdXN0IGJlIGJlIGJldHdlZW4gMSBhbmQgdGhlIG1heGltdW0gYWxsb3dlZCBudW1iZXIKCWFzc2VydAoKCS8vICppZjMzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEwOQoJLy8gY29uZmlnLnN1bnNldHRpbmdPbiAhPT0gMAoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDIyNiA4CglidG9pCglpbnQgMAoJIT0KCWJ6ICppZjMzX2VuZAoKCS8vICppZjMzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMTAKCS8vIGFzc2VydChjb25maWcuc3Vuc2V0dGluZ09uID4gZ2xvYmFscy5sYXRlc3RUaW1lc3RhbXAsICdzdW5zZXR0aW5nT24gbXVzdCBiZSBsYXRlciB0aGFuIG5vdyBpZiBzZXQnKQoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDIyNiA4CglidG9pCglnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCgk+CgoJLy8gc3Vuc2V0dGluZ09uIG11c3QgYmUgbGF0ZXIgdGhhbiBub3cgaWYgc2V0Cglhc3NlcnQKCippZjMzX2VuZDoKCXJldHN1YgoKLy8gY2FsbFBvb2xBZGRTdGFrZShzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4sIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXksIG1ickFtdFBhaWQ6IHVpbnQ2NCwgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbGVhbiwgaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sZWFuKTogdm9pZAovLwovLyBBZGRzIGEgc3Rha2VycyBhbW91bnQgb2YgYWxnbyB0byBhIHZhbGlkYXRvciBwb29sLCB0cmFuc2ZlcnJpbmcgdGhlIGFsZ28gd2UgcmVjZWl2ZWQgZnJvbSB0aGVtIChhbHJlYWR5IHZlcmlmaWVkCi8vIGJ5IG91ciBjYWxsZXIpIHRvIHRoZSBzdGFraW5nIHBvb2wgYWNjb3VudCwgYW5kIHRoZW4gdGVsbGluZyBpdCBhYm91dCB0aGUgYW1vdW50IGJlaW5nIGFkZGVkIGZvciB0aGUgc3BlY2lmaWVkCi8vIHN0YWtlci4KLy8KLy8gQHBhcmFtIHtQYXlUeG59IHN0YWtlZEFtb3VudFBheW1lbnQgLSBwYXltZW50IGNvbWluZyBmcm9tIHN0YWtlciB0byBwbGFjZSBpbnRvIGEgcG9vbAovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBUaGUga2V5IG9mIHRoZSB2YWxpZGF0b3IgcG9vbC4KLy8gQHBhcmFtIHt1aW50NjR9IG1ickFtdFBhaWQgLSBBbW91bnQgdGhlIHVzZXIgaXMgbGVhdmluZyBiZWhpbmQgaW4gdGhlIHZhbGlkYXRvciB0byBwYXkgZm9yIHRoZWlyIHN0YWtlciBNQlIgY29zdAovLyBAcGFyYW0ge2Jvb2xlYW59IGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IgLSBpZiB0aGlzIGlzIGEgbmV3LCBmaXJzdC10aW1lIHN0YWtlciB0byB0aGUgdmFsaWRhdG9yCi8vIEBwYXJhbSB7Ym9vbGVhbn0gaXNOZXdTdGFrZXJUb1Byb3RvY29sIC0gaWYgdGhpcyBpcyBhIG5ldywgZmlyc3QtdGltZSBzdGFrZXIgdG8gdGhlIHByb3RvY29sCmNhbGxQb29sQWRkU3Rha2U6Cglwcm90byA1IDAKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiAyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEzMgoJLy8gcG9vbEFwcElkID0gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzW3Bvb2xLZXkucG9vbElkIC0gMV0ucG9vbEFwcElkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIHBvb2xBcHBJZDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEzNgoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5hZGRTdGFrZSwgdWludDY0Pih7CgkvLyAgICAgICAgICAgICBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCksCgkvLyAgICAgICAgICAgICBtZXRob2RBcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gPT09PT09PQoJLy8gICAgICAgICAgICAgICAgIC8vIFRISVMgSVMgQSBTRU5EIG9mIHRoZSBhbW91bnQgcmVjZWl2ZWQgcmlnaHQgYmFjayBvdXQgYW5kIGludG8gdGhlIHN0YWtpbmcgcG9vbCBjb250cmFjdCBhY2NvdW50LgoJLy8gICAgICAgICAgICAgICAgIHsgYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQsIHJlY2VpdmVyOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuYWRkcmVzcyB9LAoJLy8gICAgICAgICAgICAgICAgIC8vID09PT09PT0KCS8vICAgICAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LnNlbmRlciwKCS8vICAgICAgICAgICAgIF0sCgkvLyAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgcGF5CglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE0MQoJLy8gYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJZnJhbWVfZGlnIC0zIC8vIG1ickFtdFBhaWQ6IHVpbnQ2NAoJLQoJaXR4bl9maWVsZCBBbW91bnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTQxCgkvLyByZWNlaXZlcjogQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmFkZHJlc3MKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCWl0eG5fZmllbGQgUmVjZWl2ZXIKCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCWl0eG5fbmV4dAoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAiYWRkU3Rha2UocGF5LGFkZHJlc3MpdWludDY0IgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTM3CgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTM4CgkvLyBtZXRob2RBcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gPT09PT09PQoJLy8gICAgICAgICAgICAgICAgIC8vIFRISVMgSVMgQSBTRU5EIG9mIHRoZSBhbW91bnQgcmVjZWl2ZWQgcmlnaHQgYmFjayBvdXQgYW5kIGludG8gdGhlIHN0YWtpbmcgcG9vbCBjb250cmFjdCBhY2NvdW50LgoJLy8gICAgICAgICAgICAgICAgIHsgYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQsIHJlY2VpdmVyOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuYWRkcmVzcyB9LAoJLy8gICAgICAgICAgICAgICAgIC8vID09PT09PT0KCS8vICAgICAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LnNlbmRlciwKCS8vICAgICAgICAgICAgIF0KCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIFNlbmRlcgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCgkvLyBTdWJtaXQgaW5uZXIgdHJhbnNhY3Rpb24KCWl0eG5fc3VibWl0CglpdHhuIE51bUxvZ3MKCWludCAxCgktCglpdHhuYXMgTG9ncwoJZXh0cmFjdCA0IDAKCWJ0b2kKCgkvLyAqaWYzNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNDYKCS8vIGdsb2JhbHMub3Bjb2RlQnVkZ2V0IDwgNTAwCglnbG9iYWwgT3Bjb2RlQnVkZ2V0CglpbnQgNTAwCgk8CglieiAqaWYzNF9lbmQKCgkvLyAqaWYzNF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTQ3CgkvLyBpbmNyZWFzZU9wY29kZUJ1ZGdldCgpCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJaW50IDAKCWl0eG5fZmllbGQgRmVlCglieXRlIGI2NCBDb0VCIC8vICNwcmFnbWEgdmVyc2lvbiAxMDsgaW50IDEKCWR1cAoJaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCWludCBEZWxldGVBcHBsaWNhdGlvbgoJaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KCWl0eG5fc3VibWl0CgoqaWYzNF9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTUxCgkvLyBwb29sTnVtU3Rha2VycyA9IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgnbnVtU3Rha2VycycpIGFzIHVpbnQ2NAoJZnJhbWVfZGlnIDAgLy8gcG9vbEFwcElkOiB1aW50NjQKCWJ5dGUgMHg2ZTc1NmQ1Mzc0NjE2YjY1NzI3MyAvLyAibnVtU3Rha2VycyIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuZ2xvYmFsU3RhdGUoJ251bVN0YWtlcnMnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDEgLy8gcG9vbE51bVN0YWtlcnM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNTIKCS8vIHBvb2xBbGdvU3Rha2VkID0gQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmdsb2JhbFN0YXRlKCdzdGFrZWQnKSBhcyB1aW50NjQKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglhcHBfZ2xvYmFsX2dldF9leAoKCS8vIGdsb2JhbCBzdGF0ZSB2YWx1ZSBkb2VzIG5vdCBleGlzdDogQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmdsb2JhbFN0YXRlKCdzdGFrZWQnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDIgLy8gcG9vbEFsZ29TdGFrZWQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNTMKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsU3Rha2VycyA9IHBvb2xOdW1TdGFrZXJzIGFzIHVpbnQxNgoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJZnJhbWVfZGlnIDEgLy8gcG9vbE51bVN0YWtlcnM6IHVpbnQ2NAoJaXRvYgoJZXh0cmFjdCA2IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNTQKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCA9IHBvb2xBbGdvU3Rha2VkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJZnJhbWVfZGlnIDIgLy8gcG9vbEFsZ29TdGFrZWQ6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gKmlmMzVfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTU3CgkvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yCglmcmFtZV9kaWcgLTQgLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbGVhbgoJYnogKmlmMzVfZW5kCgoJLy8gKmlmMzVfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE1OAoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsU3Rha2VycyArPSAxCglpbnQgMjQ0CglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWludCAxCgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCippZjM1X2VuZDoKCS8vICppZjM2X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE2MAoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sCglmcmFtZV9kaWcgLTUgLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sZWFuCglieiAqaWYzNl9lbmQKCgkvLyAqaWYzNl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTYxCgkvLyB0aGlzLm51bVN0YWtlcnMudmFsdWUgKz0gMQoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJYXBwX2dsb2JhbF9nZXQKCWludCAxCgkrCglieXRlIDB4NmU3NTZkNTM3NDYxNmI2NTcyNzMgLy8gIm51bVN0YWtlcnMiCglzd2FwCglhcHBfZ2xvYmFsX3B1dAoKKmlmMzZfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE2MwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsQWxnb1N0YWtlZCArPSBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWludCAyNTIKCWR1cAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4bgoJZ3R4bnMgQW1vdW50CglmcmFtZV9kaWcgLTMgLy8gbWJyQW10UGFpZDogdWludDY0CgktCgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTY0CgkvLyB0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSArPSBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCWFwcF9nbG9iYWxfZ2V0CglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBBbW91bnQKCWZyYW1lX2RpZyAtMyAvLyBtYnJBbXRQYWlkOiB1aW50NjQKCS0KCSsKCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCXN3YXAKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIHVwZGF0ZVN0YWtlclBvb2xTZXQoc3Rha2VyOiBBZGRyZXNzLCBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5KTogdm9pZAp1cGRhdGVTdGFrZXJQb29sU2V0OgoJcHJvdG8gMiAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjgKCS8vIGFzc2VydCh0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS5leGlzdHMpCglieXRlIDB4NzM3MDczIC8vICJzcHMiCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE3MAoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDAgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNzEKCS8vIGZpcnN0RW1wdHkgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNzIKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoKKmZvcl83OgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE3MgoJLy8gaSA8IHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlLmxlbmd0aAoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl83X2VuZAoKCS8vICppZjM3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE3MwoJLy8gcG9vbFNldFtpXSA9PT0gcG9vbEtleQoJZnJhbWVfZGlnIDAgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDI0CglleHRyYWN0MwoJZnJhbWVfZGlnIC0yIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCT09CglieiAqaWYzN19lbmQKCgkvLyAqaWYzN19jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTc1CgkvLyByZXR1cm4KCXJldHN1YgoKKmlmMzdfZW5kOgoJLy8gKmlmMzhfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTc3CgkvLyBmaXJzdEVtcHR5ID09PSAwICYmIHBvb2xTZXRbaV0uaWQgPT09IDAKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDAKCT09CglkdXAKCWJ6ICpza2lwX2FuZDkKCWZyYW1lX2RpZyAwIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgk9PQoJJiYKCipza2lwX2FuZDk6CglieiAqaWYzOF9lbmQKCgkvLyAqaWYzOF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTc4CgkvLyBmaXJzdEVtcHR5ID0gaSArIDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMSAvLyBmaXJzdEVtcHR5OiB1aW50NjQKCippZjM4X2VuZDoKCipmb3JfN19jb250aW51ZToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNzIKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzcKCipmb3JfN19lbmQ6CgkvLyAqaWYzOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExODEKCS8vIGZpcnN0RW1wdHkgPT09IDAKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDAKCT09CglieiAqaWYzOV9lbmQKCgkvLyAqaWYzOV9jb25zZXF1ZW50CgkvLyBObyBlbXB0eSBzbG90IGF2YWlsYWJsZSBpbiB0aGUgc3Rha2VyIHBvb2wgc2V0CgllcnIKCippZjM5X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExODQKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlW2ZpcnN0RW1wdHkgLSAxXSA9IHBvb2xLZXkKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDEKCS0KCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyByZW1vdmVGcm9tU3Rha2VyUG9vbFNldChzdGFrZXI6IEFkZHJlc3MsIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkpOiBbYm9vbGVhbiwgYm9vbGVhbl0KLy8KLy8gUmVtb3ZlcyBhIHBvb2wga2V5IGZyb20gdGhlIHN0YWtlcidzIGFjdGl2ZSBwb29sIHNldCAtIGZhaWxzIGlmIG5vdCBmb3VuZCAoISkKLy8KLy8gQHBhcmFtIHtBZGRyZXNzfSBzdGFrZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgc3Rha2VyLgovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBUaGUgcG9vbCBrZXkgdGhleSBzaG91bGQgYmUgc3RvcmVkIGluCi8vCi8vIEByZXR1cm4gW2Jvb2xlYW4sIGJvb2xlYW5dIFtpcyB0aGUgc3Rha2VyIGdvbmUgZnJvbSBBTEwgcG9vbHMgb2YgdGhlIGdpdmVuIFZBTElEQVRPUiwgYW5kIGlzIHN0YWtlciBnb25lIGZyb20gQUxMIHBvb2xzXQpyZW1vdmVGcm9tU3Rha2VyUG9vbFNldDoKCXByb3RvIDIgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTk3CgkvLyBpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAwIC8vIGluU2FtZVZhbGlkYXRvclBvb2xDb3VudDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5OAoJLy8gaW5BbnlQb29sQ291bnQgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAxIC8vIGluQW55UG9vbENvdW50OiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTk5CgkvLyBmb3VuZCA9IGZhbHNlCglpbnQgMAoJZnJhbWVfYnVyeSAyIC8vIGZvdW5kOiBib29sCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwMQoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDIKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoKKmZvcl84OgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwMgoJLy8gaSA8IHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlLmxlbmd0aAoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl84X2VuZAoKCS8vICppZjQwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwMwoJLy8gcG9vbFNldFtpXS5pZCA9PT0gMAoJZnJhbWVfZGlnIDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWY0MF9lbmQKCgkvLyAqaWY0MF9jb25zZXF1ZW50CgliICpmb3JfOF9jb250aW51ZQoKKmlmNDBfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwNgoJLy8gaW5BbnlQb29sQ291bnQgKz0gMQoJZnJhbWVfZGlnIDEgLy8gaW5BbnlQb29sQ291bnQ6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMSAvLyBpbkFueVBvb2xDb3VudDogdWludDY0CgoJLy8gKmlmNDFfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjA3CgkvLyBwb29sU2V0W2ldLmlkID09PSBwb29sS2V5LmlkCglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgMAoJKwoJaW50IDgKCWV4dHJhY3QzCglidG9pCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCT09CglieiAqaWY0MV9lbmQKCgkvLyAqaWY0MV9jb25zZXF1ZW50CgkvLyAqaWY0Ml9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDgKCS8vIHBvb2xTZXRbaV0gPT09IHBvb2xLZXkKCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5Cgk9PQoJYnogKmlmNDJfZWxzZQoKCS8vICppZjQyX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDkKCS8vIGZvdW5kID0gdHJ1ZQoJaW50IDEKCWZyYW1lX2J1cnkgMiAvLyBmb3VuZDogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMTEKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlW2ldID0geyBpZDogMCwgcG9vbElkOiAwLCBwb29sQXBwSWQ6IDAgfQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJYiAqaWY0Ml9lbmQKCippZjQyX2Vsc2U6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjEzCgkvLyBpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgKz0gMQoJZnJhbWVfZGlnIDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCippZjQyX2VuZDoKCippZjQxX2VuZDoKCipmb3JfOF9jb250aW51ZToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDIKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzgKCipmb3JfOF9lbmQ6CgkvLyAqaWY0M19jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMTcKCS8vICFmb3VuZAoJZnJhbWVfZGlnIDIgLy8gZm91bmQ6IGJvb2wKCSEKCWJ6ICppZjQzX2VuZAoKCS8vICppZjQzX2NvbnNlcXVlbnQKCS8vIE5vIG1hdGNoaW5nIHNsb3QgZm91bmQgd2hlbiB0b2xkIHRvIHJlbW92ZSBhIHBvb2wgZnJvbSB0aGUgc3Rha2VycyBzZXQKCWVycgoKKmlmNDNfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIyMQoJLy8gcmV0dXJuIFtpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgPT09IDAsIGluQW55UG9vbENvdW50ID09PSAwXQoJYnl0ZSAweDAwCglpbnQgMAoJZnJhbWVfZGlnIDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCWludCAwCgk9PQoJc2V0Yml0CglpbnQgMQoJZnJhbWVfZGlnIDEgLy8gaW5BbnlQb29sQ291bnQ6IHVpbnQ2NAoJaW50IDAKCT09CglzZXRiaXQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCgkvLyBwb3AgYWxsIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHRoZSBzdGFjawoJcG9wbiA0CglyZXRzdWIKCi8vIGFkZFBvb2xUb05vZGUodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcG9vbEFwcElkOiB1aW50NjQsIG5vZGVOdW06IHVpbnQ2NCk6IHZvaWQKYWRkUG9vbFRvTm9kZToKCXByb3RvIDMgMAoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI1CgkvLyBub2RlUG9vbEFzc2lnbm1lbnRzID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5ub2RlUG9vbEFzc2lnbm1lbnRzKQoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfYnVyeSAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI2CgkvLyBtYXhQb29sc1Blck5vZGVGb3JUaGlzVmFsaWRhdG9yID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcucG9vbHNQZXJOb2RlIGFzIHVpbnQ2NAoJaW50IDIyNQoJaW50IDEKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDEgLy8gbWF4UG9vbHNQZXJOb2RlRm9yVGhpc1ZhbGlkYXRvcjogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIyOAoJLy8gYXNzZXJ0KG5vZGVOdW0gPj0gMSAmJiBub2RlTnVtIDw9IE1BWF9OT0RFUywgJ25vZGUgbnVtYmVyIG5vdCBpbiB2YWxpZCByYW5nZScpCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgMQoJPj0KCWR1cAoJYnogKnNraXBfYW5kMTAKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCA4Cgk8PQoJJiYKCipza2lwX2FuZDEwOgoJLy8gbm9kZSBudW1iZXIgbm90IGluIHZhbGlkIHJhbmdlCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjMwCgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IG1heFBvb2xzUGVyTm9kZUZvclRoaXNWYWxpZGF0b3I7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzk6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjMwCgkvLyBpIDwgbWF4UG9vbHNQZXJOb2RlRm9yVGhpc1ZhbGlkYXRvcgoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglmcmFtZV9kaWcgMSAvLyBtYXhQb29sc1Blck5vZGVGb3JUaGlzVmFsaWRhdG9yOiB1aW50NjQKCTwKCWJ6ICpmb3JfOV9lbmQKCgkvLyAqaWY0NF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMzEKCS8vIG5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbbm9kZU51bSAtIDFdLnBvb2xBcHBJZHNbaV0gPT09IDAKCWZyYW1lX2RpZyAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCWludCAwCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgMQoJLQoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWY0NF9lbmQKCgkvLyAqaWY0NF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjMzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLm5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbbm9kZU51bSAtIDFdLnBvb2xBcHBJZHNbaV0gPSBwb29sQXBwSWQKCWludCA5MDAKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCAxCgktCglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDAKCSsKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJZnJhbWVfZGlnIC0yIC8vIHBvb2xBcHBJZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMzQKCS8vIHJldHVybgoJcmV0c3ViCgoqaWY0NF9lbmQ6CgoqZm9yXzlfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjMwCgkvLyBpICs9IDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCWIgKmZvcl85CgoqZm9yXzlfZW5kOgoJLy8gbm8gYXZhaWxhYmxlIHNwYWNlIGluIHNwZWNpZmllZCBub2RlIGZvciB0aGlzIHBvb2wKCWVycgoJcmV0c3ViCgovLyBkb2VzU3Rha2VyTWVldEdhdGluZyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQpOiB2b2lkCi8vCi8vIENoZWNrcyBpZiBhIHN0YWtlciBtZWV0cyB0aGUgZ2F0aW5nIHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgYnkgdGhlIHZhbGlkYXRvci4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWx1ZVRvVmVyaWZ5IC0gVGhlIHZhbHVlIHRvIHZlcmlmeSBhZ2FpbnN0IHRoZSBnYXRpbmcgcmVxdWlyZW1lbnRzLgovLyBAcmV0dXJucyB7dm9pZH0gb3IgYXNzZXJ0cyBpZiByZXF1aXJlbWVudHMgbm90IG1ldC4KZG9lc1N0YWtlck1lZXRHYXRpbmc6Cglwcm90byAyIDAKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA4CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI0OAoJLy8gdHlwZSA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLmVudHJ5R2F0aW5nVHlwZQoJaW50IDgwCglpbnQgMQoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMCAvLyB0eXBlOiB1aW50OAoKCS8vICppZjQ1X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI0OQoJLy8gdHlwZSA9PT0gR0FUSU5HX1RZUEVfTk9ORQoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAwCgk9PQoJYnogKmlmNDVfZW5kCgoJLy8gKmlmNDVfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI1MAoJLy8gcmV0dXJuCglyZXRzdWIKCippZjQ1X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTIKCS8vIHN0YWtlciA9IHRoaXMudHhuLnNlbmRlcgoJdHhuIFNlbmRlcgoJZnJhbWVfYnVyeSAxIC8vIHN0YWtlcjogYWRkcmVzcwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTMKCS8vIGNvbmZpZyA9IGNsb25lKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnKQoJaW50IDAKCWludCAyNDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglmcmFtZV9idXJ5IDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCgkvLyAqaWY0Nl9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTcKCS8vIHR5cGUgPT09IEdBVElOR19UWVBFX0FTU0VUU19DUkVBVEVEX0JZIHx8CgkvLyAgICAgICAgICAgICB0eXBlID09PSBHQVRJTkdfVFlQRV9BU1NFVF9JRCB8fAoJLy8gICAgICAgICAgICAgdHlwZSA9PT0gR0FUSU5HX1RZUEVfQ1JFQVRFRF9CWV9ORkRfQUREUkVTU0VTCglmcmFtZV9kaWcgMCAvLyB0eXBlOiB1aW50OAoJaW50IDEKCT09CglkdXAKCWJueiAqc2tpcF9vcjQKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMgoJPT0KCXx8Cgoqc2tpcF9vcjQ6CglkdXAKCWJueiAqc2tpcF9vcjUKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMwoJPT0KCXx8Cgoqc2tpcF9vcjU6CglieiAqaWY0Nl9lbmQKCgkvLyAqaWY0Nl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjYxCgkvLyBhc3NlcnQodmFsdWVUb1ZlcmlmeSAhPT0gMCkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWludCAwCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI2MgoJLy8gYmFsUmVxdWlyZWQgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5nYXRpbmdBc3NldE1pbkJhbGFuY2UKCWludCAxNDUKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAzIC8vIGJhbFJlcXVpcmVkOiB1aW50NjQKCgkvLyAqaWY0N19jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNjMKCS8vIGJhbFJlcXVpcmVkID09PSAwCglmcmFtZV9kaWcgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0CglpbnQgMAoJPT0KCWJ6ICppZjQ3X2VuZAoKCS8vICppZjQ3X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNjQKCS8vIGJhbFJlcXVpcmVkID0gMQoJaW50IDEKCWZyYW1lX2J1cnkgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0CgoqaWY0N19lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjY2CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgc3Rha2VyLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQodmFsdWVUb1ZlcmlmeSkpID49IGJhbFJlcXVpcmVkLAoJLy8gICAgICAgICAgICAgICAgICdtdXN0IGhhdmUgcmVxdWlyZWQgbWluaW11bSBiYWxhbmNlIG9mIHZhbGlkYXRvciBkZWZpbmVkIHRva2VuIHRvIGFkZCBzdGFrZScsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgMSAvLyBzdGFrZXI6IGFkZHJlc3MKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQoJcG9wCglmcmFtZV9kaWcgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0Cgk+PQoKCS8vIG11c3QgaGF2ZSByZXF1aXJlZCBtaW5pbXVtIGJhbGFuY2Ugb2YgdmFsaWRhdG9yIGRlZmluZWQgdG9rZW4gdG8gYWRkIHN0YWtlCglhc3NlcnQKCippZjQ2X2VuZDoKCS8vICppZjQ4X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3MQoJLy8gdHlwZSA9PT0gR0FUSU5HX1RZUEVfQVNTRVRTX0NSRUFURURfQlkKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMQoJPT0KCWJ6ICppZjQ4X2VuZAoKCS8vICppZjQ4X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNzIKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICBBc3NldElELmZyb21VaW50NjQodmFsdWVUb1ZlcmlmeSkuY3JlYXRvciA9PT0gY29uZmlnLmVudHJ5R2F0aW5nQWRkcmVzcywKCS8vICAgICAgICAgICAgICAgICAnc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgY3JlYXRlZCBieSBjcmVhdG9yIHRoYXQgdGhlIHZhbGlkYXRvciBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UnLAoJLy8gICAgICAgICAgICAgKQoJZnJhbWVfZGlnIC0yIC8vIHZhbHVlVG9WZXJpZnk6IHVpbnQ2NAoJYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKCXBvcAoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgODEgMzIKCT09CgoJLy8gc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgY3JlYXRlZCBieSBjcmVhdG9yIHRoYXQgdGhlIHZhbGlkYXRvciBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UKCWFzc2VydAoKKmlmNDhfZW5kOgoJLy8gKmlmNDlfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjc3CgkvLyB0eXBlID09PSBHQVRJTkdfVFlQRV9BU1NFVF9JRAoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAyCgk9PQoJYnogKmlmNDlfZW5kCgoJLy8gKmlmNDlfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3OAoJLy8gZm91bmQgPSBmYWxzZQoJaW50IDAKCWZyYW1lX2J1cnkgNCAvLyBmb3VuZDogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNzkKCS8vIGNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0cwoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMTEzIDMyCglkdXAKCWZyYW1lX2J1cnkgNSAvLyBjb3B5IG9mIHRoZSBhcnJheSB3ZSBhcmUgaXRlcmF0aW5nIG92ZXIKCWV4dHJhY3QgMCA4CglidG9pCglmcmFtZV9idXJ5IDYgLy8gYXNzZXRJZDogdWludDY0CglpbnQgMAoJZnJhbWVfYnVyeSA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCgoqZm9yT2ZfMDoKCS8vICppZjUwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI4MAoJLy8gdmFsdWVUb1ZlcmlmeSA9PT0gYXNzZXRJZAoJZnJhbWVfZGlnIC0yIC8vIHZhbHVlVG9WZXJpZnk6IHVpbnQ2NAoJZnJhbWVfZGlnIDYgLy8gYXNzZXRJZDogdWludDY0Cgk9PQoJYnogKmlmNTBfZW5kCgoJLy8gKmlmNTBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI4MQoJLy8gZm91bmQgPSB0cnVlCglpbnQgMQoJZnJhbWVfYnVyeSA0IC8vIGZvdW5kOiBib29sCgliICpmb3JPZl8wX2VuZAoKKmlmNTBfZW5kOgoKKmZvck9mXzBfY29udGludWU6CgkvLyBpbmNyZW1lbnQgb2Zmc2V0IGFuZCBsb29wIGlmIG5vdCBvdXQgb2YgYm91bmRzCglmcmFtZV9kaWcgNyAvLyB0aGUgb2Zmc2V0IHdlIGFyZSBleHRyYWN0aW5nIHRoZSBuZXh0IGVsZW1lbnQgZnJvbQoJaW50IDgKCSsKCWR1cAoJaW50IDMyIC8vIG9mZnNldCBvZiBsYXN0IGVsZW1lbnQKCTwKCWJ6ICpmb3JPZl8wX2VuZAoJZnJhbWVfYnVyeSA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCglmcmFtZV9kaWcgNSAvLyBjb3B5IG9mIHRoZSBhcnJheSB3ZSBhcmUgaXRlcmF0aW5nIG92ZXIKCWZyYW1lX2RpZyA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCglpbnQgOAoJZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSA2IC8vIGFzc2V0SWQ6IHVpbnQ2NAoJYiAqZm9yT2ZfMAoKKmZvck9mXzBfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI4NQoJLy8gYXNzZXJ0KGZvdW5kLCAnc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgaWRlbnRpY2FsIHRvIHRoZSBhc3NldCBpZCBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UnKQoJZnJhbWVfZGlnIDQgLy8gZm91bmQ6IGJvb2wKCgkvLyBzcGVjaWZpZWQgYXNzZXQgbXVzdCBiZSBpZGVudGljYWwgdG8gdGhlIGFzc2V0IGlkIGRlZmluZWQgYXMgYSByZXF1aXJlbWVudCB0byBzdGFrZQoJYXNzZXJ0CgoqaWY0OV9lbmQ6CgkvLyAqaWY1MV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyODcKCS8vIHR5cGUgPT09IEdBVElOR19UWVBFX0NSRUFURURfQllfTkZEX0FERFJFU1NFUwoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAzCgk9PQoJYnogKmlmNTFfZW5kCgoJLy8gKmlmNTFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI5MAoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIHRoaXMuaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0KGNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0c1swXSwgQXNzZXRJRC5mcm9tVWludDY0KHZhbHVlVG9WZXJpZnkpLmNyZWF0b3IpLAoJLy8gICAgICAgICAgICAgICAgICdzcGVjaWZpZWQgYXNzZXQgbXVzdCBiZSBjcmVhdGVkIGJ5IGNyZWF0b3IgdGhhdCBpcyBvbmUgb2YgdGhlIGxpbmtlZCBhZGRyZXNzZXMgaW4gYW4gbmZkJywKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCglwb3AKCWZyYW1lX2RpZyAyIC8vIGNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCglleHRyYWN0IDExMyA4CglidG9pCgljYWxsc3ViIGlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdAoKCS8vIHNwZWNpZmllZCBhc3NldCBtdXN0IGJlIGNyZWF0ZWQgYnkgY3JlYXRvciB0aGF0IGlzIG9uZSBvZiB0aGUgbGlua2VkIGFkZHJlc3NlcyBpbiBhbiBuZmQKCWFzc2VydAoKKmlmNTFfZW5kOgoJLy8gKmlmNTJfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjk1CgkvLyB0eXBlID09PSBHQVRJTkdfVFlQRV9TRUdNRU5UX09GX05GRAoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCA0Cgk9PQoJYnogKmlmNTJfZW5kCgoJLy8gKmlmNTJfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI5NwoJLy8gdXNlck9mZmVyZWRORkRBcHBJRCA9IHZhbHVlVG9WZXJpZnkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWZyYW1lX2J1cnkgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjk4CgkvLyBhc3NlcnQodGhpcy5pc05GREFwcElEVmFsaWQodXNlck9mZmVyZWRORkRBcHBJRCksICdwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZCcpCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWNhbGxzdWIgaXNORkRBcHBJRFZhbGlkCgoJLy8gcHJvdmlkZWQgTkZEIG11c3QgYmUgdmFsaWQKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMDEKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICByYXdCeXRlcyhBcHBJRC5mcm9tVWludDY0KHVzZXJPZmZlcmVkTkZEQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzKSA9PT0KCS8vICAgICAgICAgICAgICAgICAgICAgcmF3Qnl0ZXMoc3Rha2VyKSB8fCB0aGlzLmlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdCh1c2VyT2ZmZXJlZE5GREFwcElELCBzdGFrZXIpLAoJLy8gICAgICAgICAgICAgICAgICJwcm92aWRlZCBuZmQgZm9yIGVudHJ5IGlzbid0IG93bmVkIG9yIGxpbmtlZCB0byB0aGUgc3Rha2VyIiwKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyA4IC8vIHVzZXJPZmZlcmVkTkZEQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQodXNlck9mZmVyZWRORkRBcHBJRCkuZ2xvYmFsU3RhdGUoJ2kub3duZXIuYScpCglhc3NlcnQKCWZyYW1lX2RpZyAxIC8vIHN0YWtlcjogYWRkcmVzcwoJPT0KCWR1cAoJYm56ICpza2lwX29yNgoJZnJhbWVfZGlnIDEgLy8gc3Rha2VyOiBhZGRyZXNzCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWNhbGxzdWIgaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0Cgl8fAoKKnNraXBfb3I2OgoJLy8gcHJvdmlkZWQgbmZkIGZvciBlbnRyeSBpc24ndCBvd25lZCBvciBsaW5rZWQgdG8gdGhlIHN0YWtlcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMwOAoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIGJ0b2koQXBwSUQuZnJvbVVpbnQ2NCh1c2VyT2ZmZXJlZE5GREFwcElEKS5nbG9iYWxTdGF0ZSgnaS5wYXJlbnRBcHBJRCcpIGFzIGJ5dGVzKSA9PT0KCS8vICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmVudHJ5R2F0aW5nQXNzZXRzWzBdLAoJLy8gICAgICAgICAgICAgICAgICdzcGVjaWZpZWQgbmZkIG11c3QgYmUgYSBzZWdtZW50IG9mIHRoZSBuZmQgdGhlIHZhbGlkYXRvciBzcGVjaWZpZWQgYXMgYSByZXF1aXJlbWVudCcsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWJ5dGUgMHg2OTJlNzA2MTcyNjU2ZTc0NDE3MDcwNDk0NCAvLyAiaS5wYXJlbnRBcHBJRCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHVzZXJPZmZlcmVkTkZEQXBwSUQpLmdsb2JhbFN0YXRlKCdpLnBhcmVudEFwcElEJykKCWFzc2VydAoJYnRvaQoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMTEzIDgKCWJ0b2kKCT09CgoJLy8gc3BlY2lmaWVkIG5mZCBtdXN0IGJlIGEgc2VnbWVudCBvZiB0aGUgbmZkIHRoZSB2YWxpZGF0b3Igc3BlY2lmaWVkIGFzIGEgcmVxdWlyZW1lbnQKCWFzc2VydAoKKmlmNTJfZW5kOgoJcmV0c3ViCgovLyBpc05GREFwcElEVmFsaWQobmZkQXBwSUQ6IHVpbnQ2NCk6IGJvb2xlYW4KLy8KLy8gQ2hlY2tzIGlmIHRoZSBnaXZlbiBORkQgQXBwIGlkIGlzIHZhbGlkLiAgVXNpbmcgb25seSB0aGUgQXBwIGlkIHRoZXJlJ3Mgbm8gdmFsaWRhdGlvbiBhZ2FpbnN0IHRoZSBuYW1lIChpZTogdGhhdCBuZmQgWCBpcyBuYW1lIFkpCi8vIFNvIGl0J3MgYXNzdW1lZCBmb3IgdGhlIGNhbGxlciwgdGhlIGFwcCBpZCBhbG9uZSBpcyBmaW5lLiAgVGhlIG5hbWUgaXMgZmV0Y2hlZCBmcm9tIHRoZSBzcGVjaWZpZWQgYXBwIGlkIGFuZCB0aGUgdHdvCi8vIHRvZ2V0aGVyIGFyZSB1c2VkIGZvciB2YWxpZGl0eSBjaGVjayBjYWxsIHRvIHRoZSBuZmQgcmVnaXN0cnkuCi8vCi8vIEBwYXJhbSB7dWludDY0fSBuZmRBcHBJRCAtIFRoZSBORkQgQXBwIGlkIHRvIHZlcmlmeS4KLy8KLy8gQHJldHVybnMge2Jvb2xlYW59IC0gUmV0dXJucyB0cnVlIGlmIHRoZSBORkQgQXBwIGlkIGlzIHZhbGlkLCBvdGhlcndpc2UgZmFsc2UuCmlzTkZEQXBwSURWYWxpZDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMyNwoJLy8gdXNlck9mZmVyZWRORkROYW1lID0gQXBwSUQuZnJvbVVpbnQ2NChuZmRBcHBJRCkuZ2xvYmFsU3RhdGUoJ2kubmFtZScpIGFzIHN0cmluZwoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWJ5dGUgMHg2OTJlNmU2MTZkNjUgLy8gImkubmFtZSIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KG5mZEFwcElEKS5nbG9iYWxTdGF0ZSgnaS5uYW1lJykKCWFzc2VydAoJZnJhbWVfYnVyeSAwIC8vIHVzZXJPZmZlcmVkTkZETmFtZTogc3RyaW5nCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMyOQoJLy8gcmV0dXJuIHNlbmRNZXRob2RDYWxsPFtzdHJpbmcsIHVpbnQ2NF0sIGJvb2xlYW4+KHsKCS8vICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQodGhpcy5uZmRSZWdpc3RyeUFwcElkKSwKCS8vICAgICAgICAgICAgIG5hbWU6ICdpc1ZhbGlkTmZkQXBwSWQnLAoJLy8gICAgICAgICAgICAgbWV0aG9kQXJnczogW3VzZXJPZmZlcmVkTkZETmFtZSwgbmZkQXBwSURdLAoJLy8gICAgICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAiaXNWYWxpZE5mZEFwcElkKHN0cmluZyx1aW50NjQpYm9vbCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMzMAoJLy8gYXBwbGljYXRpb25JRDogQXBwSUQuZnJvbVVpbnQ2NCh0aGlzLm5mZFJlZ2lzdHJ5QXBwSWQpCglsb2FkIDIwMCAvLyBUTVBMX25mZFJlZ2lzdHJ5QXBwSWQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMzIKCS8vIG1ldGhvZEFyZ3M6IFt1c2VyT2ZmZXJlZE5GRE5hbWUsIG5mZEFwcElEXQoJZnJhbWVfZGlnIDAgLy8gdXNlck9mZmVyZWRORkROYW1lOiBzdHJpbmcKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoJaXR4biBOdW1Mb2dzCglpbnQgMQoJLQoJaXR4bmFzIExvZ3MKCWV4dHJhY3QgNCAwCglpbnQgMAoJZ2V0Yml0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCglyZXRzdWIKCi8vIGlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdChuZmRBcHBJRDogdWludDY0LCBhZGRyVG9GaW5kOiBBZGRyZXNzKTogYm9vbGVhbgovLwovLyBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBhZGRyZXNzIGlzIHByZXNlbnQgaW4gYW4gTkZEcyBsaXN0IG9mIHZlcmlmaWVkIGFkZHJlc3Nlcy4KLy8gVGhlIE5GRCBpcyBhc3N1bWVkIHRvIGhhdmUgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcyBvZmZpY2lhbC4KLy8KLy8gQHBhcmFtIHt1aW50NjR9IG5mZEFwcElEIC0gVGhlIE5GRCBhcHBsaWNhdGlvbiBpZC4KLy8gQHBhcmFtIHtBZGRyZXNzfSBhZGRyVG9GaW5kIC0gVGhlIGFkZHJlc3MgdG8gZmluZCBpbiB0aGUgdi5jYUFsZ28uMC5hcyBwcm9wZXJ0eQovLyBAcmV0dXJuIHtib29sZWFufSAtIGB0cnVlYCBpZiB0aGUgYWRkcmVzcyBpcyBwcmVzZW50LCBgZmFsc2VgIG90aGVyd2lzZS4KaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0OgoJcHJvdG8gMiAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDUKCS8vIHNlbmRBcHBDYWxsKHsKCS8vICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLAoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25BcmdzOiBbJ3JlYWRfcHJvcGVydHknLCAndi5jYUFsZ28uMC5hcyddLAoJLy8gICAgICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzQ2CgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KG5mZEFwcElEKQoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDcKCS8vIGFwcGxpY2F0aW9uQXJnczogWydyZWFkX3Byb3BlcnR5JywgJ3YuY2FBbGdvLjAuYXMnXQoJYnl0ZSAweDcyNjU2MTY0NWY3MDcyNmY3MDY1NzI3NDc5IC8vICJyZWFkX3Byb3BlcnR5IgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWJ5dGUgMHg3NjJlNjM2MTQxNmM2NzZmMmUzMDJlNjE3MyAvLyAidi5jYUFsZ28uMC5hcyIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDkKCS8vIGNhQWxnb0RhdGEgPSB0aGlzLml0eG4ubGFzdExvZwoJaXR4biBMYXN0TG9nCglmcmFtZV9idXJ5IDAgLy8gY2FBbGdvRGF0YTogYnl0ZVtdCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM1MAoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBjYUFsZ29EYXRhLmxlbmd0aDsgaSArPSAzMikKCWludCAwCglmcmFtZV9idXJ5IDEgLy8gaTogdWludDY0CgoqZm9yXzEwOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM1MAoJLy8gaSA8IGNhQWxnb0RhdGEubGVuZ3RoCglmcmFtZV9kaWcgMSAvLyBpOiB1aW50NjQKCWZyYW1lX2RpZyAwIC8vIGNhQWxnb0RhdGE6IGJ5dGVbXQoJbGVuCgk8CglieiAqZm9yXzEwX2VuZAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNTEKCS8vIGFkZHIgPSBleHRyYWN0MyhjYUFsZ29EYXRhLCBpLCAzMikKCWZyYW1lX2RpZyAwIC8vIGNhQWxnb0RhdGE6IGJ5dGVbXQoJZnJhbWVfZGlnIDEgLy8gaTogdWludDY0CglpbnQgMzIKCWV4dHJhY3QzCglmcmFtZV9idXJ5IDIgLy8gYWRkcjogYnl0ZVtdCgoJLy8gKmlmNTNfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzUyCgkvLyBhZGRyICE9PSByYXdCeXRlcyhnbG9iYWxzLnplcm9BZGRyZXNzKSAmJiBhZGRyID09PSByYXdCeXRlcyhhZGRyVG9GaW5kKQoJZnJhbWVfZGlnIDIgLy8gYWRkcjogYnl0ZVtdCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CglkdXAKCWJ6ICpza2lwX2FuZDExCglmcmFtZV9kaWcgMiAvLyBhZGRyOiBieXRlW10KCWZyYW1lX2RpZyAtMiAvLyBhZGRyVG9GaW5kOiBBZGRyZXNzCgk9PQoJJiYKCipza2lwX2FuZDExOgoJYnogKmlmNTNfZW5kCgoJLy8gKmlmNTNfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM1MwoJLy8gcmV0dXJuIHRydWUKCWludCAxCgliICppc0FkZHJlc3NJbk5GRENBQWxnb0xpc3QqcmV0dXJuCgoqaWY1M19lbmQ6CgoqZm9yXzEwX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM1MAoJLy8gaSArPSAzMgoJZnJhbWVfZGlnIDEgLy8gaTogdWludDY0CglpbnQgMzIKCSsKCWZyYW1lX2J1cnkgMSAvLyBpOiB1aW50NjQKCWIgKmZvcl8xMAoKKmZvcl8xMF9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzU2CgkvLyByZXR1cm4gZmFsc2UKCWludCAwCgoqaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0KnJldHVybjoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDIKCXJldHN1YgoKLy8gYWxnb1NhdHVyYXRpb25MZXZlbCgpOiB1aW50NjQKLy8KLy8gUmV0dXJucyB0aGUgbWF4aW11bSBhbGxvd2VkIHN0YWtlIHBlciB2YWxpZGF0b3IgYmFzZWQgb24gYSBwZXJjZW50YWdlIG9mIGFsbCBjdXJyZW50IG9ubGluZSBzdGFrZSBiZWZvcmUKLy8gdGhlIHZhbGlkYXRvciBpcyBjb25zaWRlcmVkIHNhdHVyYXRlZCAtIHdoZXJlIHJld2FyZHMgYXJlIGRpbWluaXNoZWQuCi8vIE5PVEU6IHRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCB0d2ljZSAtIGhlcmUgYW5kIGluIHN0YWtpbmcgcG9vbCBjb250cmFjdC4gIEJvdGggbXVzdCBiZSBpZGVudGljYWwuCmFsZ29TYXR1cmF0aW9uTGV2ZWw6Cglwcm90byAwIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNjUKCS8vIG9ubGluZSA9IHRoaXMuZ2V0Q3VycmVudE9ubGluZVN0YWtlKCkKCWNhbGxzdWIgZ2V0Q3VycmVudE9ubGluZVN0YWtlCglmcmFtZV9idXJ5IDAgLy8gb25saW5lOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzY3CgkvLyByZXR1cm4gd2lkZVJhdGlvKFtvbmxpbmUsIE1BWF9WQUxJREFUT1JfU09GVF9QQ1RfT0ZfT05MSU5FXzFERUNJTUFMXSwgWzEwMDBdKQoJZnJhbWVfZGlnIDAgLy8gb25saW5lOiB1aW50NjQKCWludCAxMDAKCW11bHcKCWludCAwCglpbnQgMTAwMAoJZGl2bW9kdwoJcG9wCglwb3AKCXN3YXAKCSEKCgkvLyB3aWRlUmF0aW8gZmFpbGVkCglhc3NlcnQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gbWF4QWxsb3dlZFN0YWtlKCk6IHVpbnQ2NAovLwovLyBSZXR1cm5zIHRoZSBNQVhJTVVNIGFsbG93ZWQgc3Rha2UgcGVyIHZhbGlkYXRvciBiYXNlZCBvbiBhIHBlcmNlbnRhZ2Ugb2YgYWxsIGN1cnJlbnQgb25saW5lIHN0YWtlLgovLyBBZGRpbmcgc3Rha2UgaXMgY29tcGxldGVseSBibG9ja2VkIGF0IHRoaXMgYW1vdW50LgptYXhBbGxvd2VkU3Rha2U6Cglwcm90byAwIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNzUKCS8vIG9ubGluZSA9IHRoaXMuZ2V0Q3VycmVudE9ubGluZVN0YWtlKCkKCWNhbGxzdWIgZ2V0Q3VycmVudE9ubGluZVN0YWtlCglmcmFtZV9idXJ5IDAgLy8gb25saW5lOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzc3CgkvLyByZXR1cm4gd2lkZVJhdGlvKFtvbmxpbmUsIE1BWF9WQUxJREFUT1JfSEFSRF9QQ1RfT0ZfT05MSU5FXzFERUNJTUFMXSwgWzEwMDBdKQoJZnJhbWVfZGlnIDAgLy8gb25saW5lOiB1aW50NjQKCWludCAxNTAKCW11bHcKCWludCAwCglpbnQgMTAwMAoJZGl2bW9kdwoJcG9wCglwb3AKCXN3YXAKCSEKCgkvLyB3aWRlUmF0aW8gZmFpbGVkCglhc3NlcnQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gbWF4QWxnb0FsbG93ZWRQZXJQb29sKCk6IHVpbnQ2NAovLwovLyBSZXR1cm5zIHRoZSBNQVhJTVVNIGFsbG93ZWQgc3Rha2UgcGVyIHBvb2wgYW5kIHN0aWxsIHJlY2VpdmUgaW5jZW50aXZlcyAtIHdlJ2xsIHRyZWF0IHRoaXMgYXMgdGhlICdtYXggcGVyIHBvb2wnCm1heEFsZ29BbGxvd2VkUGVyUG9vbDoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzODQKCS8vIHJldHVybiBnbG9iYWxzLnBheW91dHNNYXhCYWxhbmNlCglnbG9iYWwgUGF5b3V0c01heEJhbGFuY2UKCXJldHN1YgoKLy8gZ2V0Q3VycmVudE9ubGluZVN0YWtlKCk6IHVpbnQ2NApnZXRDdXJyZW50T25saW5lU3Rha2U6Cglwcm90byAwIDEKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzg4CgkvLyByZXR1cm4gb25saW5lU3Rha2UoKQoJb25saW5lX3N0YWtlCglyZXRzdWIKCi8vIG1pbkJhbGFuY2VGb3JBY2NvdW50KGNvbnRyYWN0czogdWludDY0LCBleHRyYVBhZ2VzOiB1aW50NjQsIGFzc2V0czogdWludDY0LCBsb2NhbEludHM6IHVpbnQ2NCwgbG9jYWxCeXRlczogdWludDY0LCBnbG9iYWxJbnRzOiB1aW50NjQsIGdsb2JhbEJ5dGVzOiB1aW50NjQpOiB1aW50NjQKbWluQmFsYW5jZUZvckFjY291bnQ6Cglwcm90byA3IDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDAKCS8vIG1pbkJhbCA9IEFMR09SQU5EX0FDQ09VTlRfTUlOX0JBTEFOQ0UKCWludCAxMDAwMDAKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDEKCS8vIG1pbkJhbCArPSBjb250cmFjdHMgKiBBUFBMSUNBVElPTl9CQVNFX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyBjb250cmFjdHM6IHVpbnQ2NAoJaW50IDEwMDAwMAoJKgoJKwoJZnJhbWVfYnVyeSAwIC8vIG1pbkJhbDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTQwMgoJLy8gbWluQmFsICs9IGV4dHJhUGFnZXMgKiBBUFBMSUNBVElPTl9CQVNFX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyBleHRyYVBhZ2VzOiB1aW50NjQKCWludCAxMDAwMDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDMKCS8vIG1pbkJhbCArPSBhc3NldHMgKiBBU1NFVF9IT0xESU5HX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMyAvLyBhc3NldHM6IHVpbnQ2NAoJaW50IDEwMDAwMAoJKgoJKwoJZnJhbWVfYnVyeSAwIC8vIG1pbkJhbDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTQwNAoJLy8gbWluQmFsICs9IGxvY2FsSW50cyAqIFNTQ19WQUxVRV9VSU5UCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoJZnJhbWVfZGlnIC00IC8vIGxvY2FsSW50czogdWludDY0CglpbnQgMjg1MDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDUKCS8vIG1pbkJhbCArPSBnbG9iYWxJbnRzICogU1NDX1ZBTFVFX1VJTlQKCWZyYW1lX2RpZyAwIC8vIG1pbkJhbDogdWludDY0CglmcmFtZV9kaWcgLTYgLy8gZ2xvYmFsSW50czogdWludDY0CglpbnQgMjg1MDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDYKCS8vIG1pbkJhbCArPSBsb2NhbEJ5dGVzICogU1NDX1ZBTFVFX0JZVEVTCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoJZnJhbWVfZGlnIC01IC8vIGxvY2FsQnl0ZXM6IHVpbnQ2NAoJaW50IDUwMDAwCgkqCgkrCglmcmFtZV9idXJ5IDAgLy8gbWluQmFsOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDA3CgkvLyBtaW5CYWwgKz0gZ2xvYmFsQnl0ZXMgKiBTU0NfVkFMVUVfQllURVMKCWZyYW1lX2RpZyAwIC8vIG1pbkJhbDogdWludDY0CglmcmFtZV9kaWcgLTcgLy8gZ2xvYmFsQnl0ZXM6IHVpbnQ2NAoJaW50IDUwMDAwCgkqCgkrCglmcmFtZV9idXJ5IDAgLy8gbWluQmFsOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDA4CgkvLyByZXR1cm4gbWluQmFsCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoJcmV0c3ViCgovLyBjb3N0Rm9yQm94U3RvcmFnZSh0b3RhbE51bUJ5dGVzOiB1aW50NjQpOiB1aW50NjQKY29zdEZvckJveFN0b3JhZ2U6Cglwcm90byAxIDEKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDE1CgkvLyByZXR1cm4gU0NCT1hfUEVSQk9YICsgdG90YWxOdW1CeXRlcyAqIFNDQk9YX1BFUkJZVEUKCWludCAyNTAwCglmcmFtZV9kaWcgLTEgLy8gdG90YWxOdW1CeXRlczogdWludDY0CglpbnQgNDAwCgkqCgkrCglyZXRzdWIKCipjcmVhdGVfTm9PcDoKCW1ldGhvZCAiY3JlYXRlQXBwbGljYXRpb24oKXZvaWQiCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAwCgltYXRjaCAqYWJpX3JvdXRlX2NyZWF0ZUFwcGxpY2F0aW9uCgoJLy8gdGhpcyBjb250cmFjdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGdpdmVuIEFCSSBtZXRob2QgZm9yIGNyZWF0ZSBOb09wCgllcnIKCipjYWxsX05vT3A6CgltZXRob2QgImluaXRTdGFraW5nQ29udHJhY3QodWludDY0KXZvaWQiCgltZXRob2QgImxvYWRTdGFraW5nQ29udHJhY3REYXRhKHVpbnQ2NCxieXRlW10pdm9pZCIKCW1ldGhvZCAiZmluYWxpemVTdGFraW5nQ29udHJhY3QoKXZvaWQiCgltZXRob2QgImdhcygpdm9pZCIKCW1ldGhvZCAiZ2V0TWJyQW1vdW50cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCgltZXRob2QgImdldFByb3RvY29sQ29uc3RyYWludHMoKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiZ2V0TnVtVmFsaWRhdG9ycygpdWludDY0IgoJbWV0aG9kICJnZXRWYWxpZGF0b3JDb25maWcodWludDY0KSh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiZ2V0VmFsaWRhdG9yU3RhdGUodWludDY0KSh1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQpIgoJbWV0aG9kICJnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpIgoJbWV0aG9kICJnZXRQb29scyh1aW50NjQpKHVpbnQ2NCx1aW50MTYsdWludDY0KVtdIgoJbWV0aG9kICJnZXRQb29sQXBwSWQodWludDY0LHVpbnQ2NCl1aW50NjQiCgltZXRob2QgImdldFBvb2xJbmZvKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpKHVpbnQ2NCx1aW50MTYsdWludDY0KSIKCW1ldGhvZCAiZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHVpbnQ2NCl1aW50NjQiCgltZXRob2QgImRvZXNTdGFrZXJOZWVkVG9QYXlNQlIoYWRkcmVzcylib29sIgoJbWV0aG9kICJnZXRTdGFrZWRQb29sc0ZvckFjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCx1aW50NjQpW10iCgltZXRob2QgImdldFRva2VuUGF5b3V0UmF0aW8odWludDY0KSh1aW50NjRbMjRdLHVpbnQ2NCkiCgltZXRob2QgImdldE5vZGVQb29sQXNzaWdubWVudHModWludDY0KSgodWludDY0WzNdKVs4XSkiCgltZXRob2QgImdldE5GRFJlZ2lzdHJ5SUQoKXVpbnQ2NCIKCW1ldGhvZCAiYWRkVmFsaWRhdG9yKHBheSxzdHJpbmcsKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIKCW1ldGhvZCAiY2hhbmdlVmFsaWRhdG9yTWFuYWdlcih1aW50NjQsYWRkcmVzcyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQiCgltZXRob2QgImNoYW5nZVZhbGlkYXRvck5GRCh1aW50NjQsdWludDY0LHN0cmluZyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyh1aW50NjQsYWRkcmVzcyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JSZXdhcmRJbmZvKHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0KXZvaWQiCgltZXRob2QgImFkZFBvb2wocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAic2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KSIKCW1ldGhvZCAic3Rha2VVcGRhdGVkVmlhUmV3YXJkcygodWludDY0LHVpbnQ2NCx1aW50NjQpLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIgoJbWV0aG9kICJzdGFrZVJlbW92ZWQoKHVpbnQ2NCx1aW50NjQsdWludDY0KSxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCl2b2lkIgoJbWV0aG9kICJmaW5kUG9vbEZvclN0YWtlcih1aW50NjQsYWRkcmVzcyx1aW50NjQpKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKSIKCW1ldGhvZCAibW92ZVBvb2xUb05vZGUodWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIKCW1ldGhvZCAiZW1wdHlUb2tlblJld2FyZHModWludDY0LGFkZHJlc3MpdWludDY0IgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggKmFiaV9yb3V0ZV9pbml0U3Rha2luZ0NvbnRyYWN0ICphYmlfcm91dGVfbG9hZFN0YWtpbmdDb250cmFjdERhdGEgKmFiaV9yb3V0ZV9maW5hbGl6ZVN0YWtpbmdDb250cmFjdCAqYWJpX3JvdXRlX2dhcyAqYWJpX3JvdXRlX2dldE1ickFtb3VudHMgKmFiaV9yb3V0ZV9nZXRQcm90b2NvbENvbnN0cmFpbnRzICphYmlfcm91dGVfZ2V0TnVtVmFsaWRhdG9ycyAqYWJpX3JvdXRlX2dldFZhbGlkYXRvckNvbmZpZyAqYWJpX3JvdXRlX2dldFZhbGlkYXRvclN0YXRlICphYmlfcm91dGVfZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyICphYmlfcm91dGVfZ2V0UG9vbHMgKmFiaV9yb3V0ZV9nZXRQb29sQXBwSWQgKmFiaV9yb3V0ZV9nZXRQb29sSW5mbyAqYWJpX3JvdXRlX2dldEN1ck1heFN0YWtlUGVyUG9vbCAqYWJpX3JvdXRlX2RvZXNTdGFrZXJOZWVkVG9QYXlNQlIgKmFiaV9yb3V0ZV9nZXRTdGFrZWRQb29sc0ZvckFjY291bnQgKmFiaV9yb3V0ZV9nZXRUb2tlblBheW91dFJhdGlvICphYmlfcm91dGVfZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cyAqYWJpX3JvdXRlX2dldE5GRFJlZ2lzdHJ5SUQgKmFiaV9yb3V0ZV9hZGRWYWxpZGF0b3IgKmFiaV9yb3V0ZV9jaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyICphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyAqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvck5GRCAqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzICphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mbyAqYWJpX3JvdXRlX2FkZFBvb2wgKmFiaV9yb3V0ZV9hZGRTdGFrZSAqYWJpX3JvdXRlX3NldFRva2VuUGF5b3V0UmF0aW8gKmFiaV9yb3V0ZV9zdGFrZVVwZGF0ZWRWaWFSZXdhcmRzICphYmlfcm91dGVfc3Rha2VSZW1vdmVkICphYmlfcm91dGVfZmluZFBvb2xGb3JTdGFrZXIgKmFiaV9yb3V0ZV9tb3ZlUG9vbFRvTm9kZSAqYWJpX3JvdXRlX2VtcHR5VG9rZW5SZXdhcmRzCgoJLy8gdGhpcyBjb250cmFjdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGdpdmVuIEFCSSBtZXRob2QgZm9yIGNhbGwgTm9PcAoJZXJy", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEx" }, "contract": { @@ -292,6 +292,7 @@ { "name": "getNumValidators", "desc": "Returns the current number of validators", + "readonly": true, "args": [], "returns": { "type": "uint64" @@ -299,6 +300,7 @@ }, { "name": "getValidatorConfig", + "readonly": true, "args": [ { "name": "validatorId", @@ -311,6 +313,7 @@ }, { "name": "getValidatorState", + "readonly": true, "args": [ { "name": "validatorId", @@ -323,6 +326,7 @@ }, { "name": "getValidatorOwnerAndManager", + "readonly": true, "args": [ { "name": "validatorId", @@ -336,6 +340,7 @@ { "name": "getPools", "desc": "Return list of all pools for this validator.", + "readonly": true, "args": [ { "name": "validatorId", @@ -349,6 +354,8 @@ }, { "name": "getPoolAppId", + "desc": "getPoolAppId is useful for callers to determine app to call for removing stake if they don't have staking or\nwant to get staker list for an account. The staking pool also uses it to get the app id of staking pool 1\n(which contains reward tokens if being used) so that the amount available can be determined.", + "readonly": true, "args": [ { "name": "validatorId", @@ -365,6 +372,7 @@ }, { "name": "getPoolInfo", + "readonly": true, "args": [ { "name": "poolKey", @@ -378,6 +386,7 @@ { "name": "getCurMaxStakePerPool", "desc": "Calculate the maximum stake per pool for a given validator.\nNormally this would be maxAlgoPerPool, but it should also never go above MaxAllowedStake / numPools so\nas pools are added the max allowed per pool can reduce.", + "readonly": true, "args": [ { "name": "validatorId", @@ -392,6 +401,7 @@ { "name": "doesStakerNeedToPayMBR", "desc": "Helper callers can call w/ simulate to determine if 'AddStaker' MBR should be included w/ staking amount", + "readonly": true, "args": [ { "name": "staker", @@ -405,6 +415,7 @@ { "name": "getStakedPoolsForAccount", "desc": "Retrieves the staked pools for an account.", + "readonly": true, "args": [ { "name": "staker", @@ -419,6 +430,7 @@ { "name": "getTokenPayoutRatio", "desc": "Retrieves the token payout ratio for a given validator - returning the pool ratios of whole so that token\npayouts across pools can be based on a stable snaphost of stake.", + "readonly": true, "args": [ { "name": "validatorId", @@ -432,6 +444,7 @@ }, { "name": "getNodePoolAssignments", + "readonly": true, "args": [ { "name": "validatorId", @@ -444,6 +457,7 @@ }, { "name": "getNFDRegistryID", + "readonly": true, "args": [], "returns": { "type": "uint64" @@ -865,6 +879,7 @@ { "name": "findPoolForStaker", "desc": "Finds the pool for a staker based on the provided validator id, staker address, and amount to stake.\nFirst checks the stakers 'already staked list' for the validator preferring those (adding if possible) then adds\nto new pool if necessary.", + "readonly": true, "args": [ { "name": "validatorId", diff --git a/ui/src/contracts/StakingPoolClient.ts b/ui/src/contracts/StakingPoolClient.ts index 20e64e4a..c96f051e 100644 --- a/ui/src/contracts/StakingPoolClient.ts +++ b/ui/src/contracts/StakingPoolClient.ts @@ -295,6 +295,7 @@ export const APP_SPEC: AppSpec = { { "name": "getStakerInfo", "desc": "Retrieves the staked information for a given staker.", + "readonly": true, "args": [ { "name": "staker", diff --git a/ui/src/contracts/ValidatorRegistryClient.ts b/ui/src/contracts/ValidatorRegistryClient.ts index f93de7ea..9f4c7d9c 100644 --- a/ui/src/contracts/ValidatorRegistryClient.ts +++ b/ui/src/contracts/ValidatorRegistryClient.ts @@ -247,7 +247,7 @@ export const APP_SPEC: AppSpec = { } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCgovLyBUaGlzIFRFQUwgd2FzIGdlbmVyYXRlZCBieSBURUFMU2NyaXB0IHYwLjEwMy4wCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbGdvcmFuZGZvdW5kYXRpb24vVEVBTFNjcmlwdAoKLy8gVGhpcyBjb250cmFjdCBpcyBjb21wbGlhbnQgd2l0aCBhbmQvb3IgaW1wbGVtZW50cyB0aGUgZm9sbG93aW5nIEFSQ3M6IFsgQVJDNCBdCgovLyBUaGUgZm9sbG93aW5nIGxpbmVzIG9mIFRFQUwgYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0ZW1wbGF0ZSB2YXJpYWJsZXMgaW4gc2NyYXRjaCBzbG90cwpwdXNoYnl0ZXMgVE1QTF9uZmRSZWdpc3RyeUFwcElkCmJ0b2kKc3RvcmUgMjAwCgovLyBUaGUgZm9sbG93aW5nIHRlbiBsaW5lcyBvZiBURUFMIGhhbmRsZSBpbml0aWFsIHByb2dyYW0gZmxvdwovLyBUaGlzIHBhdHRlcm4gaXMgdXNlZCB0byBtYWtlIGl0IGVhc3kgZm9yIGFueW9uZSB0byBwYXJzZSB0aGUgc3RhcnQgb2YgdGhlIHByb2dyYW0gYW5kIGRldGVybWluZSBpZiBhIHNwZWNpZmljIGFjdGlvbiBpcyBhbGxvd2VkCi8vIEhlcmUsIGFjdGlvbiByZWZlcnMgdG8gdGhlIE9uQ29tcGxldGUgaW4gY29tYmluYXRpb24gd2l0aCB3aGV0aGVyIHRoZSBhcHAgaXMgYmVpbmcgY3JlYXRlZCBvciBjYWxsZWQKLy8gRXZlcnkgcG9zc2libGUgYWN0aW9uIGZvciB0aGlzIGNvbnRyYWN0IGlzIHJlcHJlc2VudGVkIGluIHRoZSBzd2l0Y2ggc3RhdGVtZW50Ci8vIElmIHRoZSBhY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIGluIHRoZSBjb250cmFjdCwgaXRzIHJlc3BlY3RpdmUgYnJhbmNoIHdpbGwgYmUgIipOT1RfSU1QTEVNRU5URUQiIHdoaWNoIGp1c3QgY29udGFpbnMgImVyciIKdHhuIEFwcGxpY2F0aW9uSUQKIQppbnQgNgoqCnR4biBPbkNvbXBsZXRpb24KKwpzd2l0Y2ggKmNhbGxfTm9PcCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKmNyZWF0ZV9Ob09wICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRAoKKk5PVF9JTVBMRU1FTlRFRDoKCS8vIFRoZSByZXF1ZXN0ZWQgYWN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIGNvbnRyYWN0LiBBcmUgeW91IHVzaW5nIHRoZSBjb3JyZWN0IE9uQ29tcGxldGU/IERpZCB5b3Ugc2V0IHlvdXIgYXBwIElEPwoJZXJyCgovLyBjcmVhdGVBcHBsaWNhdGlvbigpdm9pZAoqYWJpX3JvdXRlX2NyZWF0ZUFwcGxpY2F0aW9uOgoJLy8gZXhlY3V0ZSBjcmVhdGVBcHBsaWNhdGlvbigpdm9pZAoJY2FsbHN1YiBjcmVhdGVBcHBsaWNhdGlvbgoJaW50IDEKCXJldHVybgoKLy8gY3JlYXRlQXBwbGljYXRpb24oKTogdm9pZApjcmVhdGVBcHBsaWNhdGlvbjoKCXByb3RvIDAgMAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyCgkvLyB0aGlzLnN0YWtpbmdQb29sSW5pdGlhbGl6ZWQudmFsdWUgPSBmYWxzZQoJYnl0ZSAweDY5NmU2OTc0IC8vICJpbml0IgoJaW50IDAKCWJ5dGUgMHgwMAoJaW50IDAKCXVuY292ZXIgMgoJc2V0Yml0CglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgzCgkvLyB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgPSAwCglieXRlIDB4NmU3NTZkNTYgLy8gIm51bVYiCglpbnQgMAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NAoJLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlID0gMAoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJaW50IDAKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODUKCS8vIHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlID0gMAoJYnl0ZSAweDczNzQ2MTZiNjU2NCAvLyAic3Rha2VkIgoJaW50IDAKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIGluaXRTdGFraW5nQ29udHJhY3QodWludDY0KXZvaWQKKmFiaV9yb3V0ZV9pbml0U3Rha2luZ0NvbnRyYWN0OgoJLy8gYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBpbml0U3Rha2luZ0NvbnRyYWN0KHVpbnQ2NCl2b2lkCgljYWxsc3ViIGluaXRTdGFraW5nQ29udHJhY3QKCWludCAxCglyZXR1cm4KCi8vIGluaXRTdGFraW5nQ29udHJhY3QoYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0KTogdm9pZAppbml0U3Rha2luZ0NvbnRyYWN0OgoJcHJvdG8gMSAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTAKCS8vIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uY3JlYXRlKGFwcHJvdmFsUHJvZ3JhbVNpemUpCglieXRlIDB4NzA2ZjZmNmM1NDY1NmQ3MDZjNjE3NDY1NDE3MDcwNzI2Zjc2NjE2YzQyNzk3NDY1NzMgLy8gInBvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMiCglmcmFtZV9kaWcgLTEgLy8gYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0Cglib3hfY3JlYXRlCglwb3AKCXJldHN1YgoKLy8gbG9hZFN0YWtpbmdDb250cmFjdERhdGEodWludDY0LGJ5dGVbXSl2b2lkCiphYmlfcm91dGVfbG9hZFN0YWtpbmdDb250cmFjdERhdGE6CgkvLyBkYXRhOiBieXRlW10KCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWV4dHJhY3QgMiAwCgoJLy8gb2Zmc2V0OiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGxvYWRTdGFraW5nQ29udHJhY3REYXRhKHVpbnQ2NCxieXRlW10pdm9pZAoJY2FsbHN1YiBsb2FkU3Rha2luZ0NvbnRyYWN0RGF0YQoJaW50IDEKCXJldHVybgoKLy8gbG9hZFN0YWtpbmdDb250cmFjdERhdGEob2Zmc2V0OiB1aW50NjQsIGRhdGE6IGJ5dGVzKTogdm9pZApsb2FkU3Rha2luZ0NvbnRyYWN0RGF0YToKCXByb3RvIDIgMAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk0CgkvLyBhc3NlcnQoIXRoaXMuc3Rha2luZ1Bvb2xJbml0aWFsaXplZC52YWx1ZSkKCWJ5dGUgMHg2OTZlNjk3NCAvLyAiaW5pdCIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMAoJZ2V0Yml0CgkhCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5NQoJLy8gdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5yZXBsYWNlKG9mZnNldCwgZGF0YSkKCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWZyYW1lX2RpZyAtMSAvLyBvZmZzZXQ6IHVpbnQ2NAoJZnJhbWVfZGlnIC0yIC8vIGRhdGE6IGJ5dGVzCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdCgpdm9pZAoqYWJpX3JvdXRlX2ZpbmFsaXplU3Rha2luZ0NvbnRyYWN0OgoJLy8gZXhlY3V0ZSBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdCgpdm9pZAoJY2FsbHN1YiBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdAoJaW50IDEKCXJldHVybgoKLy8gZmluYWxpemVTdGFraW5nQ29udHJhY3QoKTogdm9pZApmaW5hbGl6ZVN0YWtpbmdDb250cmFjdDoKCXByb3RvIDAgMAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk5CgkvLyB0aGlzLnN0YWtpbmdQb29sSW5pdGlhbGl6ZWQudmFsdWUgPSB0cnVlCglieXRlIDB4Njk2ZTY5NzQgLy8gImluaXQiCglpbnQgMQoJYnl0ZSAweDAwCglpbnQgMAoJdW5jb3ZlciAyCglzZXRiaXQKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIGdhcygpdm9pZAoqYWJpX3JvdXRlX2dhczoKCS8vIGV4ZWN1dGUgZ2FzKCl2b2lkCgljYWxsc3ViIGdhcwoJaW50IDEKCXJldHVybgoKLy8gZ2FzKCk6IHZvaWQKLy8KLy8gZ2FzIGlzIGEgZHVtbXkgbm8tb3AgY2FsbCB0aGF0IGNhbiBiZSB1c2VkIHRvIHBvb2wtdXAgcmVzb3VyY2UgcmVmZXJlbmNlcyBhbmQgb3Bjb2RlIGNvc3QKZ2FzOgoJcHJvdG8gMCAwCglyZXRzdWIKCi8vIGdldE1ickFtb3VudHMoKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0TWJyQW1vdW50czoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXRNYnJBbW91bnRzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0TWJyQW1vdW50cygpOiBNYnJBbW91bnRzCi8vCi8vIFJldHVybnMgdGhlIE1CUiBhbW91bnRzIG5lZWRlZCBmb3IgdmFyaW91cyBhY3Rpb25zOgovLyBbCi8vIGFkZFZhbGlkYXRvck1icjogdWludDY0IC0gbWJyIG5lZWRlZCB0byBhZGQgYSBuZXcgdmFsaWRhdG9yIC0gcGFpZCB0byB2YWxpZGF0b3IgY29udHJhY3QKLy8gYWRkUG9vbE1icjogdWludDY0IC0gbWJyIG5lZWRlZCB0byBhZGQgYSBuZXcgcG9vbCAtIHBhaWQgdG8gdmFsaWRhdG9yCi8vIHBvb2xJbml0TWJyOiB1aW50NjQgLSBtYnIgbmVlZGVkIHRvIGluaXRTdG9yYWdlKCkgb2YgcG9vbCAtIHBhaWQgdG8gcG9vbCBpdHNlbGYKLy8gYWRkU3Rha2VyTWJyOiB1aW50NjQgLSBtYnIgc3Rha2VyIG5lZWRzIHRvIGFkZCB0byBmaXJzdCBzdGFraW5nIHBheW1lbnQgKHN0YXlzIHcvIHZhbGlkYXRvcikKLy8gXQpnZXRNYnJBbW91bnRzOgoJcHJvdG8gMCAxCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5CgkvLyByZXR1cm4gewoJLy8gICAgICAgICAgICAgYWRkVmFsaWRhdG9yTWJyOiB0aGlzLmNvc3RGb3JCb3hTdG9yYWdlKDEgLyogdiBwcmVmaXggKi8gKyBsZW48VmFsaWRhdG9ySWRUeXBlPigpICsgbGVuPFZhbGlkYXRvckluZm8+KCkpLAoJLy8gICAgICAgICAgICAgYWRkUG9vbE1icjogdGhpcy5taW5CYWxhbmNlRm9yQWNjb3VudCgKCS8vICAgICAgICAgICAgICAgICAxLAoJLy8gICAgICAgICAgICAgICAgIC8vIHdlIGNvdWxkIGNhbGN1bGF0ZSB0aGlzIGRpcmVjdGx5IGJ5IHJlZmVyZW5jaW5nIHRoZSBzaXplIG9mIHN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtIGJ1dCBpdCB3b3VsZAoJLy8gICAgICAgICAgICAgICAgIC8vIG1lYW4gb3VyIGNhbGxlcnMgd291bGQgaGF2ZSB0byByZWZlcmVuY2UgdGhlIGJveCBBTkQgYnV5IHVwIGkvbyAtIHNvIGp1c3QgZ28gbWF4IG9uIGV4dHJhIHBhZ2VzCgkvLyAgICAgICAgICAgICAgICAgMywKCS8vICAgICAgICAgICAgICAgICAwLAoJLy8gICAgICAgICAgICAgICAgIDAsCgkvLyAgICAgICAgICAgICAgICAgMCwKCS8vICAgICAgICAgICAgICAgICBTdGFraW5nUG9vbC5zY2hlbWEuZ2xvYmFsLm51bVVpbnQsCgkvLyAgICAgICAgICAgICAgICAgU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1CeXRlU2xpY2UsCgkvLyAgICAgICAgICAgICApLAoJLy8gICAgICAgICAgICAgcG9vbEluaXRNYnI6CgkvLyAgICAgICAgICAgICAgICAgQUxHT1JBTkRfQUNDT1VOVF9NSU5fQkFMQU5DRSArCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5jb3N0Rm9yQm94U3RvcmFnZSg3IC8qICdzdGFrZXJzJyBuYW1lICovICsgbGVuPFN0YWtlZEluZm8+KCkgKiBNQVhfU1RBS0VSU19QRVJfUE9PTCksCgkvLyAgICAgICAgICAgICBhZGRTdGFrZXJNYnI6CgkvLyAgICAgICAgICAgICAgICAgLy8gaG93IG11Y2ggdG8gY2hhcmdlIGZvciBmaXJzdCB0aW1lIGEgc3Rha2VyIGFkZHMgc3Rha2UgLSBzaW5jZSB3ZSBhZGQgYSB0cmFja2luZyBib3ggcGVyIHN0YWtlcgoJLy8gICAgICAgICAgICAgICAgIHRoaXMuY29zdEZvckJveFN0b3JhZ2UoCgkvLyAgICAgICAgICAgICAgICAgICAgIDMgLyogJ3NwcycgcHJlZml4ICovICsgbGVuPEFkZHJlc3M+KCkgKyBsZW48VmFsaWRhdG9yUG9vbEtleT4oKSAqIE1BWF9QT09MU19QRVJfU1RBS0VSLAoJLy8gICAgICAgICAgICAgICAgICksIC8vIHNpemUgb2Yga2V5ICsgYWxsIHZhbHVlcwoJLy8gICAgICAgICB9CglpbnQgMTEwMQoJY2FsbHN1YiBjb3N0Rm9yQm94U3RvcmFnZQoJaXRvYgoJaW50IDMKCWludCAxMQoJaW50IDAKCWR1cG4gMgoJaW50IDMKCWludCAxCgljYWxsc3ViIG1pbkJhbGFuY2VGb3JBY2NvdW50CglpdG9iCgljb25jYXQKCWludCAxMDAwMDAKCWludCAxMjgwNwoJY2FsbHN1YiBjb3N0Rm9yQm94U3RvcmFnZQoJKwoJaXRvYgoJY29uY2F0CglpbnQgMTc5CgljYWxsc3ViIGNvc3RGb3JCb3hTdG9yYWdlCglpdG9iCgljb25jYXQKCXJldHN1YgoKLy8gZ2V0UHJvdG9jb2xDb25zdHJhaW50cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0UHJvdG9jb2xDb25zdHJhaW50czoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXRQcm90b2NvbENvbnN0cmFpbnRzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWNhbGxzdWIgZ2V0UHJvdG9jb2xDb25zdHJhaW50cwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFByb3RvY29sQ29uc3RyYWludHMoKTogQ29uc3RyYWludHMKLy8KLy8gUmV0dXJucyB0aGUgcHJvdG9jb2wgY29uc3RyYWludHMgc28gdGhhdCBVSXMgY2FuIGxpbWl0IHdoYXQgdXNlcnMgc3BlY2lmeSBmb3IgdmFsaWRhdG9yIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KZ2V0UHJvdG9jb2xDb25zdHJhaW50czoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0NwoJLy8gcmV0dXJuIHsKCS8vICAgICAgICAgICAgIGVwb2NoUGF5b3V0Um91bmRzTWluOiBNSU5fRVBPQ0hfTEVOR1RILAoJLy8gICAgICAgICAgICAgZXBvY2hQYXlvdXRSb3VuZHNNYXg6IE1BWF9FUE9DSF9MRU5HVEgsCgkvLyAgICAgICAgICAgICBtaW5QY3RUb1ZhbGlkYXRvcldGb3VyRGVjaW1hbHM6IE1JTl9QQ1RfVE9fVkFMSURBVE9SLAoJLy8gICAgICAgICAgICAgbWF4UGN0VG9WYWxpZGF0b3JXRm91ckRlY2ltYWxzOiBNQVhfUENUX1RPX1ZBTElEQVRPUiwKCS8vICAgICAgICAgICAgIG1pbkVudHJ5U3Rha2U6IE1JTl9BTEdPX1NUQUtFX1BFUl9QT09MLAoJLy8gICAgICAgICAgICAgbWF4QWxnb1BlclBvb2w6IHRoaXMubWF4QWxnb0FsbG93ZWRQZXJQb29sKCksCgkvLyAgICAgICAgICAgICBtYXhBbGdvUGVyVmFsaWRhdG9yOiB0aGlzLm1heEFsbG93ZWRTdGFrZSgpLAoJLy8gICAgICAgICAgICAgYW10Q29uc2lkZXJlZFNhdHVyYXRlZDogdGhpcy5hbGdvU2F0dXJhdGlvbkxldmVsKCksCgkvLyAgICAgICAgICAgICBtYXhOb2RlczogTUFYX05PREVTLAoJLy8gICAgICAgICAgICAgbWF4UG9vbHNQZXJOb2RlOiBNQVhfUE9PTFNfUEVSX05PREUsCgkvLyAgICAgICAgICAgICBtYXhTdGFrZXJzUGVyUG9vbDogTUFYX1NUQUtFUlNfUEVSX1BPT0wsCgkvLyAgICAgICAgIH0KCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDBmNDI0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGY0MjQwMDAwMDAwMDAwMDBmNDI0MAoJY2FsbHN1YiBtYXhBbGdvQWxsb3dlZFBlclBvb2wKCWl0b2IKCWNvbmNhdAoJY2FsbHN1YiBtYXhBbGxvd2VkU3Rha2UKCWl0b2IKCWNvbmNhdAoJY2FsbHN1YiBhbGdvU2F0dXJhdGlvbkxldmVsCglpdG9iCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDA4Cgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAzCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMGM4Cgljb25jYXQKCXJldHN1YgoKLy8gZ2V0TnVtVmFsaWRhdG9ycygpdWludDY0CiphYmlfcm91dGVfZ2V0TnVtVmFsaWRhdG9yczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXROdW1WYWxpZGF0b3JzKCl1aW50NjQKCWNhbGxzdWIgZ2V0TnVtVmFsaWRhdG9ycwoJaXRvYgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldE51bVZhbGlkYXRvcnMoKTogdWludDY0Ci8vCi8vIFJldHVybnMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHZhbGlkYXRvcnMKZ2V0TnVtVmFsaWRhdG9yczoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE2NwoJLy8gcmV0dXJuIHRoaXMubnVtVmFsaWRhdG9ycy52YWx1ZQoJYnl0ZSAweDZlNzU2ZDU2IC8vICJudW1WIgoJYXBwX2dsb2JhbF9nZXQKCXJldHN1YgoKLy8gZ2V0VmFsaWRhdG9yQ29uZmlnKHVpbnQ2NCkodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKKmFiaV9yb3V0ZV9nZXRWYWxpZGF0b3JDb25maWc6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFZhbGlkYXRvckNvbmZpZyh1aW50NjQpKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCgljYWxsc3ViIGdldFZhbGlkYXRvckNvbmZpZwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvckNvbmZpZyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogVmFsaWRhdG9yQ29uZmlnCmdldFZhbGlkYXRvckNvbmZpZzoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE3MgoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnCglpbnQgMAoJaW50IDI0MgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCXJldHN1YgoKLy8gZ2V0VmFsaWRhdG9yU3RhdGUodWludDY0KSh1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0VmFsaWRhdG9yU3RhdGU6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFZhbGlkYXRvclN0YXRlKHVpbnQ2NCkodWludDE2LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBnZXRWYWxpZGF0b3JTdGF0ZQoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvclN0YXRlKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBWYWxpZGF0b3JDdXJTdGF0ZQpnZXRWYWxpZGF0b3JTdGF0ZToKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE3NwoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUKCWludCAyNDIgLy8gaGVhZE9mZnNldAoJaW50IDI2CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpCiphYmlfcm91dGVfZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpCgljYWxsc3ViIGdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcih2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogW0FkZHJlc3MsIEFkZHJlc3NdCmdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcjoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE4MgoJLy8gcmV0dXJuIFsKCS8vICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLAoJLy8gICAgICAgICAgICAgdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWFuYWdlciwKCS8vICAgICAgICAgXQoJaW50IDgKCWludCAzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWludCA0MAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJY29uY2F0CglyZXRzdWIKCi8vIGdldFBvb2xzKHVpbnQ2NCkodWludDY0LHVpbnQxNix1aW50NjQpW10KKmFiaV9yb3V0ZV9nZXRQb29sczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0UG9vbHModWludDY0KSh1aW50NjQsdWludDE2LHVpbnQ2NClbXQoJY2FsbHN1YiBnZXRQb29scwoJZHVwCglsZW4KCWludCAxOAoJLwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFBvb2xzKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBQb29sSW5mb1tdCi8vCi8vIFJldHVybiBsaXN0IG9mIGFsbCBwb29scyBmb3IgdGhpcyB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWxpZGF0b3JJZAovLyBAcmV0dXJuIHtQb29sSW5mb1tdfSAtIGFycmF5IG9mIHBvb2xzCi8vIE5vdCBjYWxsYWJsZSBmcm9tIG90aGVyIGNvbnRyYWN0cyBiZWNhdXNlID4xSyByZXR1cm4gYnV0IGNhbiBiZSBjYWxsZWQgdy8gc2ltdWxhdGUgd2hpY2ggYnVtcHMgbG9nIHJldHVybnMKZ2V0UG9vbHM6Cglwcm90byAxIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiAyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk2CgkvLyByZXREYXRhOiBQb29sSW5mb1tdID0gW10KCWJ5dGUgMHgKCWZyYW1lX2J1cnkgMCAvLyByZXREYXRhOiBQb29sSW5mb1tdCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk3CgkvLyBwb29sU2V0ID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29scykKCWludCAyNjggLy8gaGVhZE9mZnNldAoJaW50IDQzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWZyYW1lX2J1cnkgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE5OAoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBwb29sU2V0Lmxlbmd0aDsgaSArPSAxKQoJaW50IDAKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCipmb3JfMDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE5OAoJLy8gaSA8IHBvb2xTZXQubGVuZ3RoCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCAyNAoJPAoJYnogKmZvcl8wX2VuZAoKCS8vICppZjBfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxOTkKCS8vIHBvb2xTZXRbaV0ucG9vbEFwcElkID09PSAwCglmcmFtZV9kaWcgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWYwX2VuZAoKCS8vICppZjBfY29uc2VxdWVudAoJYiAqZm9yXzBfZW5kCgoqaWYwX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIwMwoJLy8gcmV0RGF0YS5wdXNoKHBvb2xTZXRbaV0pCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBQb29sSW5mb1tdCglmcmFtZV9kaWcgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDE4CglleHRyYWN0MwoJY29uY2F0CglmcmFtZV9idXJ5IDAgLy8gcmV0RGF0YTogUG9vbEluZm9bXQoKKmZvcl8wX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk4CgkvLyBpICs9IDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCWIgKmZvcl8wCgoqZm9yXzBfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjA1CgkvLyByZXR1cm4gcmV0RGF0YQoJZnJhbWVfZGlnIDAgLy8gcmV0RGF0YTogUG9vbEluZm9bXQoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDIKCXJldHN1YgoKLy8gZ2V0UG9vbEFwcElkKHVpbnQ2NCx1aW50NjQpdWludDY0CiphYmlfcm91dGVfZ2V0UG9vbEFwcElkOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBwb29sSWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJYnRvaQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFBvb2xBcHBJZCh1aW50NjQsdWludDY0KXVpbnQ2NAoJY2FsbHN1YiBnZXRQb29sQXBwSWQKCWl0b2IKCWNvbmNhdAoJbG9nCglpbnQgMQoJcmV0dXJuCgovLyBnZXRQb29sQXBwSWQodmFsaWRhdG9ySWQ6IHVpbnQ2NCwgcG9vbElkOiB1aW50NjQpOiB1aW50NjQKZ2V0UG9vbEFwcElkOgoJcHJvdG8gMiAxCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjEzCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBwb29sSWQgIT09IDAgJiYgcG9vbElkIDw9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHMubGVuZ3RoLAoJLy8gICAgICAgICAgICAgJ3Bvb2wgaWQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIG51bWJlciBvZiBwb29scyBmb3IgdGhpcyB2YWxpZGF0b3InLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTIgLy8gcG9vbElkOiB1aW50NjQKCWludCAwCgkhPQoJZHVwCglieiAqc2tpcF9hbmQwCglmcmFtZV9kaWcgLTIgLy8gcG9vbElkOiB1aW50NjQKCWludCAyNAoJPD0KCSYmCgoqc2tpcF9hbmQwOgoJLy8gcG9vbCBpZCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgbnVtYmVyIG9mIHBvb2xzIGZvciB0aGlzIHZhbGlkYXRvcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjE3CgkvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1twb29sSWQgLSAxXS5wb29sQXBwSWQKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0yIC8vIHBvb2xJZDogdWludDY0CglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCXJldHN1YgoKLy8gZ2V0UG9vbEluZm8oKHVpbnQ2NCx1aW50NjQsdWludDY0KSkodWludDY0LHVpbnQxNix1aW50NjQpCiphYmlfcm91dGVfZ2V0UG9vbEluZm86CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHBvb2xLZXk6ICh1aW50NjQsdWludDY0LHVpbnQ2NCkKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWR1cAoJbGVuCglpbnQgMjQKCT09CgoJLy8gYXJndW1lbnQgMCAocG9vbEtleSkgZm9yIGdldFBvb2xJbmZvIG11c3QgYmUgYSAodWludDY0LHVpbnQ2NCx1aW50NjQpCglhc3NlcnQKCgkvLyBleGVjdXRlIGdldFBvb2xJbmZvKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpKHVpbnQ2NCx1aW50MTYsdWludDY0KQoJY2FsbHN1YiBnZXRQb29sSW5mbwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFBvb2xJbmZvKHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkpOiBQb29sSW5mbwpnZXRQb29sSW5mbzoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIyMgoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRDdXJNYXhTdGFrZVBlclBvb2wodWludDY0KXVpbnQ2NAoqYWJpX3JvdXRlX2dldEN1ck1heFN0YWtlUGVyUG9vbDoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHVpbnQ2NCl1aW50NjQKCWNhbGxzdWIgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sCglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiB1aW50NjQKLy8KLy8gQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIHN0YWtlIHBlciBwb29sIGZvciBhIGdpdmVuIHZhbGlkYXRvci4KLy8gTm9ybWFsbHkgdGhpcyB3b3VsZCBiZSBtYXhBbGdvUGVyUG9vbCwgYnV0IGl0IHNob3VsZCBhbHNvIG5ldmVyIGdvIGFib3ZlIE1heEFsbG93ZWRTdGFrZSAvIG51bVBvb2xzIHNvCi8vIGFzIHBvb2xzIGFyZSBhZGRlZCB0aGUgbWF4IGFsbG93ZWQgcGVyIHBvb2wgY2FuIHJlZHVjZS4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCmdldEN1ck1heFN0YWtlUGVyUG9vbDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzMKCS8vIG51bVBvb2xzID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyBhcyB1aW50NjQKCWludCAyNDIKCWludCAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIG51bVBvb2xzOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzQKCS8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzID0gdGhpcy5tYXhBbGxvd2VkU3Rha2UoKSAvIG51bVBvb2xzCgljYWxsc3ViIG1heEFsbG93ZWRTdGFrZQoJZnJhbWVfZGlnIDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoJLwoJZnJhbWVfYnVyeSAxIC8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzUKCS8vIG1heFBlclBvb2w6IHVpbnQ2NCA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1heEFsZ29QZXJQb29sCglpbnQgMjE3CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCgkvLyAqaWYxX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjM2CgkvLyBtYXhQZXJQb29sID09PSAwCglmcmFtZV9kaWcgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCWludCAwCgk9PQoJYnogKmlmMV9lbmQKCgkvLyAqaWYxX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIzNwoJLy8gbWF4UGVyUG9vbCA9IHRoaXMubWF4QWxnb0FsbG93ZWRQZXJQb29sKCkKCWNhbGxzdWIgbWF4QWxnb0FsbG93ZWRQZXJQb29sCglmcmFtZV9idXJ5IDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoqaWYxX2VuZDoKCS8vICppZjJfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzkKCS8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzIDwgbWF4UGVyUG9vbAoJZnJhbWVfZGlnIDEgLy8gaGFyZE1heERpdmlkZWRCZXR3ZWVuUG9vbHM6IHVpbnQ2NAoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8CglieiAqaWYyX2VuZAoKCS8vICppZjJfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjQwCgkvLyBtYXhQZXJQb29sID0gaGFyZE1heERpdmlkZWRCZXR3ZWVuUG9vbHMKCWZyYW1lX2RpZyAxIC8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzOiB1aW50NjQKCWZyYW1lX2J1cnkgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCippZjJfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjQyCgkvLyByZXR1cm4gbWF4UGVyUG9vbAoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCgoJLy8gcG9wIGFsbCBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUgc3RhY2sKCXBvcG4gMgoJcmV0c3ViCgovLyBkb2VzU3Rha2VyTmVlZFRvUGF5TUJSKGFkZHJlc3MpYm9vbAoqYWJpX3JvdXRlX2RvZXNTdGFrZXJOZWVkVG9QYXlNQlI6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHN0YWtlcjogYWRkcmVzcwoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZHVwCglsZW4KCWludCAzMgoJPT0KCgkvLyBhcmd1bWVudCAwIChzdGFrZXIpIGZvciBkb2VzU3Rha2VyTmVlZFRvUGF5TUJSIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBleGVjdXRlIGRvZXNTdGFrZXJOZWVkVG9QYXlNQlIoYWRkcmVzcylib29sCgljYWxsc3ViIGRvZXNTdGFrZXJOZWVkVG9QYXlNQlIKCWJ5dGUgMHgwMAoJaW50IDAKCXVuY292ZXIgMgoJc2V0Yml0Cgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZG9lc1N0YWtlck5lZWRUb1BheU1CUihzdGFrZXI6IEFkZHJlc3MpOiBib29sZWFuCi8vCi8vIEhlbHBlciBjYWxsZXJzIGNhbiBjYWxsIHcvIHNpbXVsYXRlIHRvIGRldGVybWluZSBpZiAnQWRkU3Rha2VyJyBNQlIgc2hvdWxkIGJlIGluY2x1ZGVkIHcvIHN0YWtpbmcgYW1vdW50Ci8vIEBwYXJhbSBzdGFrZXIKZG9lc1N0YWtlck5lZWRUb1BheU1CUjoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI1MQoJLy8gcmV0dXJuICF0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS5leGlzdHMKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZXI6IEFkZHJlc3MKCWNvbmNhdAoJYm94X2xlbgoJc3dhcAoJcG9wCgkhCglyZXRzdWIKCi8vIGdldFN0YWtlZFBvb2xzRm9yQWNjb3VudChhZGRyZXNzKSh1aW50NjQsdWludDY0LHVpbnQ2NClbXQoqYWJpX3JvdXRlX2dldFN0YWtlZFBvb2xzRm9yQWNjb3VudDoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gc3Rha2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKHN0YWtlcikgZm9yIGdldFN0YWtlZFBvb2xzRm9yQWNjb3VudCBtdXN0IGJlIGEgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBnZXRTdGFrZWRQb29sc0ZvckFjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCx1aW50NjQpW10KCWNhbGxzdWIgZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50CglkdXAKCWxlbgoJaW50IDI0CgkvCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0Cgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50KHN0YWtlcjogQWRkcmVzcyk6IFZhbGlkYXRvclBvb2xLZXlbXQovLwovLyBSZXRyaWV2ZXMgdGhlIHN0YWtlZCBwb29scyBmb3IgYW4gYWNjb3VudC4KLy8KLy8gQHBhcmFtIHtBZGRyZXNzfSBzdGFrZXIgLSBUaGUgYWNjb3VudCB0byByZXRyaWV2ZSBzdGFrZWQgcG9vbHMgZm9yLgovLyBAcmV0dXJuIHtWYWxpZGF0b3JQb29sS2V5W119IC0gVGhlIGFycmF5IG9mIHN0YWtlZCBwb29scyBmb3IgdGhlIGFjY291bnQuCmdldFN0YWtlZFBvb2xzRm9yQWNjb3VudDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyAqaWYzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjYxCgkvLyAhdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikuZXhpc3RzCglieXRlIDB4NzM3MDczIC8vICJzcHMiCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoJIQoJYnogKmlmM19lbmQKCgkvLyAqaWYzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2MgoJLy8gcmV0dXJuIFtdCglieXRlIDB4CgliICpnZXRTdGFrZWRQb29sc0ZvckFjY291bnQqcmV0dXJuCgoqaWYzX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2NAoJLy8gcmV0RGF0YTogVmFsaWRhdG9yUG9vbEtleVtdID0gW10KCWJ5dGUgMHgKCWZyYW1lX2J1cnkgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjUKCS8vIHBvb2xTZXQgPSBjbG9uZSh0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZSkKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZXI6IEFkZHJlc3MKCWNvbmNhdAoJYm94X2dldAoKCS8vIGJveCB2YWx1ZSBkb2VzIG5vdCBleGlzdDogdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUKCWFzc2VydAoJZnJhbWVfYnVyeSAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjYKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgcG9vbFNldC5sZW5ndGg7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzE6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjYKCS8vIGkgPCBwb29sU2V0Lmxlbmd0aAoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl8xX2VuZAoKCS8vICppZjRfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjcKCS8vIHBvb2xTZXRbaV0uaWQgIT09IDAKCWZyYW1lX2RpZyAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgkhPQoJYnogKmlmNF9lbmQKCgkvLyAqaWY0X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2OAoJLy8gcmV0RGF0YS5wdXNoKHBvb2xTZXRbaV0pCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCWZyYW1lX2RpZyAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWNvbmNhdAoJZnJhbWVfYnVyeSAwIC8vIHJldERhdGE6IFZhbGlkYXRvclBvb2xLZXlbXQoKKmlmNF9lbmQ6CgoqZm9yXzFfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjYKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzEKCipmb3JfMV9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzEKCS8vIHJldHVybiByZXREYXRhCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCipnZXRTdGFrZWRQb29sc0ZvckFjY291bnQqcmV0dXJuOgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCgoJLy8gcG9wIGFsbCBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUgc3RhY2sKCXBvcG4gMgoJcmV0c3ViCgovLyBnZXRUb2tlblBheW91dFJhdGlvKHVpbnQ2NCkodWludDY0WzI0XSx1aW50NjQpCiphYmlfcm91dGVfZ2V0VG9rZW5QYXlvdXRSYXRpbzoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KQoJY2FsbHN1YiBnZXRUb2tlblBheW91dFJhdGlvCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0VG9rZW5QYXlvdXRSYXRpbyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogUG9vbFRva2VuUGF5b3V0UmF0aW8KLy8KLy8gUmV0cmlldmVzIHRoZSB0b2tlbiBwYXlvdXQgcmF0aW8gZm9yIGEgZ2l2ZW4gdmFsaWRhdG9yIC0gcmV0dXJuaW5nIHRoZSBwb29sIHJhdGlvcyBvZiB3aG9sZSBzbyB0aGF0IHRva2VuCi8vIHBheW91dHMgYWNyb3NzIHBvb2xzIGNhbiBiZSBiYXNlZCBvbiBhIHN0YWJsZSBzbmFwaG9zdCBvZiBzdGFrZS4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEByZXR1cm4ge1Bvb2xUb2tlblBheW91dFJhdGlvfSAtIFRoZSB0b2tlbiBwYXlvdXQgcmF0aW8gZm9yIHRoZSB2YWxpZGF0b3IuCmdldFRva2VuUGF5b3V0UmF0aW86Cglwcm90byAxIDEKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyODMKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCXJldHN1YgoKLy8gZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cyh1aW50NjQpKCh1aW50NjRbM10pWzhdKQoqYWJpX3JvdXRlX2dldE5vZGVQb29sQXNzaWdubWVudHM6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldE5vZGVQb29sQXNzaWdubWVudHModWludDY0KSgodWludDY0WzNdKVs4XSkKCWNhbGxzdWIgZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldE5vZGVQb29sQXNzaWdubWVudHModmFsaWRhdG9ySWQ6IHVpbnQ2NCk6IE5vZGVQb29sQXNzaWdubWVudENvbmZpZwpnZXROb2RlUG9vbEFzc2lnbm1lbnRzOgoJcHJvdG8gMSAxCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mjg4CgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS5leGlzdHMsICJ0aGUgc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBkb2Vzbid0IGV4aXN0IikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoKCS8vIHRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGRvZXNuJ3QgZXhpc3QKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI5MAoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUubm9kZVBvb2xBc3NpZ25tZW50cwoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRORkRSZWdpc3RyeUlEKCl1aW50NjQKKmFiaV9yb3V0ZV9nZXRORkRSZWdpc3RyeUlEOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBleGVjdXRlIGdldE5GRFJlZ2lzdHJ5SUQoKXVpbnQ2NAoJY2FsbHN1YiBnZXRORkRSZWdpc3RyeUlECglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0TkZEUmVnaXN0cnlJRCgpOiB1aW50NjQKZ2V0TkZEUmVnaXN0cnlJRDoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI5NAoJLy8gcmV0dXJuIHRoaXMubmZkUmVnaXN0cnlBcHBJZAoJbG9hZCAyMDAgLy8gVE1QTF9uZmRSZWdpc3RyeUFwcElkCglyZXRzdWIKCi8vIGFkZFZhbGlkYXRvcihwYXksc3RyaW5nLCh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KSl1aW50NjQKKmFiaV9yb3V0ZV9hZGRWYWxpZGF0b3I6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIGNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDI0MgoJPT0KCgkvLyBhcmd1bWVudCAwIChjb25maWcpIGZvciBhZGRWYWxpZGF0b3IgbXVzdCBiZSBhICh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KQoJYXNzZXJ0CgoJLy8gbmZkTmFtZTogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglleHRyYWN0IDIgMAoKCS8vIG1iclBheW1lbnQ6IHBheQoJdHhuIEdyb3VwSW5kZXgKCWludCAxCgktCglkdXAKCWd0eG5zIFR5cGVFbnVtCglpbnQgcGF5Cgk9PQoKCS8vIGFyZ3VtZW50IDIgKG1iclBheW1lbnQpIGZvciBhZGRWYWxpZGF0b3IgbXVzdCBiZSBhIHBheSB0cmFuc2FjdGlvbgoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBhZGRWYWxpZGF0b3IocGF5LHN0cmluZywodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkpdWludDY0CgljYWxsc3ViIGFkZFZhbGlkYXRvcgoJaXRvYgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFZhbGlkYXRvcihtYnJQYXltZW50OiBQYXlUeG4sIG5mZE5hbWU6IHN0cmluZywgY29uZmlnOiBWYWxpZGF0b3JDb25maWcpOiB1aW50NjQKLy8KLy8gQWRkcyBhIG5ldyB2YWxpZGF0b3IKLy8gUmVxdWlyZXMgYXQgbGVhc3QgMTAgQUxHTyBhcyB0aGUgJ2ZlZScgZm9yIHRoZSB0cmFuc2FjdGlvbiB0byBoZWxwIGRpc3N1YWRlIHNwYW1tZWQgdmFsaWRhdG9yIGFkZHMuCi8vCi8vIEBwYXJhbSB7UGF5VHhufSBtYnJQYXltZW50IHBheW1lbnQgZnJvbSBjYWxsZXIgd2hpY2ggY292ZXJzIG1iciBpbmNyZWFzZSBvZiBuZXcgdmFsaWRhdG9yIHN0b3JhZ2UKLy8gQHBhcmFtIHtzdHJpbmd9IG5mZE5hbWUgKE9wdGlvbmFsKSBOYW1lIG9mIG5mZCAodXNlZCBhcyBkb3VibGUtY2hlY2sgYWdhaW5zdCBpZCBzcGVjaWZpZWQgaW4gY29uZmlnKQovLyBAcGFyYW0ge1ZhbGlkYXRvckNvbmZpZ30gY29uZmlnIFZhbGlkYXRvckNvbmZpZyBzdHJ1Y3QKLy8gQHJldHVybnMge3VpbnQ2NH0gdmFsaWRhdG9yIGlkCmFkZFZhbGlkYXRvcjoKCXByb3RvIDMgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzA2CgkvLyB0aGlzLnZhbGlkYXRlQ29uZmlnKGNvbmZpZykKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJY2FsbHN1YiB2YWxpZGF0ZUNvbmZpZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMwOAoJLy8gdmVyaWZ5UGF5VHhuKG1iclBheW1lbnQsIHsgcmVjZWl2ZXI6IHRoaXMuYXBwLmFkZHJlc3MsIGFtb3VudDogdGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkVmFsaWRhdG9yTWJyIH0pCgkvLyB2ZXJpZnkgcmVjZWl2ZXIKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIFJlY2VpdmVyCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6InJlY2VpdmVyIiwiZXhwZWN0ZWQiOiJ0aGlzLmFwcC5hZGRyZXNzIn0KCWFzc2VydAoKCS8vIHZlcmlmeSBhbW91bnQKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCglleHRyYWN0IDAgOAoJYnRvaQoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6ImFtb3VudCIsImV4cGVjdGVkIjoidGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkVmFsaWRhdG9yTWJyIn0KCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxMAoJLy8gYXNzZXJ0KG1iclBheW1lbnQuZmVlID4gMTAgKiAxMDAwMDAwLCAnZmVlIG11c3QgYmUgMTAgQUxHTyBvciBtb3JlIHRvIHByZXZlbnQgc3BhbW1pbmcgb2YgdmFsaWRhdG9ycycpCglmcmFtZV9kaWcgLTEgLy8gbWJyUGF5bWVudDogUGF5VHhuCglndHhucyBGZWUKCWludCAxMDAwMDAwMAoJPgoKCS8vIGZlZSBtdXN0IGJlIDEwIEFMR08gb3IgbW9yZSB0byBwcmV2ZW50IHNwYW1taW5nIG9mIHZhbGlkYXRvcnMKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxMwoJLy8gdmFsaWRhdG9ySWQgPSB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgKyAxCglieXRlIDB4NmU3NTZkNTYgLy8gIm51bVYiCglhcHBfZ2xvYmFsX2dldAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzE0CgkvLyB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgPSB2YWxpZGF0b3JJZAoJYnl0ZSAweDZlNzU2ZDU2IC8vICJudW1WIgoJZnJhbWVfZGlnIDAgLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMTYKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkuY3JlYXRlKCkKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJaW50IDEwOTIKCWJveF9jcmVhdGUKCXBvcAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxNwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcgPSBjb25maWcKCWludCAwCglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMTgKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLmlkID0gdmFsaWRhdG9ySWQKCWludCAwCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gKmlmNV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMyMQoJLy8gY29uZmlnLm5mZEZvckluZm8gIT09IDAKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA3MiA4CglidG9pCglpbnQgMAoJIT0KCWJ6ICppZjVfZW5kCgoJLy8gKmlmNV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMjMKCS8vIGFzc2VydCh0aGlzLmlzTkZEQXBwSURWYWxpZChjb25maWcubmZkRm9ySW5mbyksICdwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZCcpCglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgNzIgOAoJYnRvaQoJY2FsbHN1YiBpc05GREFwcElEVmFsaWQKCgkvLyBwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzI1CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgdGhpcy50eG4uc2VuZGVyID09PSAoQXBwSUQuZnJvbVVpbnQ2NChjb25maWcubmZkRm9ySW5mbykuZ2xvYmFsU3RhdGUoJ2kub3duZXIuYScpIGFzIEFkZHJlc3MpLAoJLy8gICAgICAgICAgICAgICAgICdJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXInLAoJLy8gICAgICAgICAgICAgKQoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIC0zIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDcyIDgKCWJ0b2kKCWJ5dGUgMHg2OTJlNmY3NzZlNjU3MjJlNjEgLy8gImkub3duZXIuYSIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KGNvbmZpZy5uZmRGb3JJbmZvKS5nbG9iYWxTdGF0ZSgnaS5vd25lci5hJykKCWFzc2VydAoJPT0KCgkvLyBJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXIKCWFzc2VydAoKKmlmNV9lbmQ6CgkvLyAqaWY2X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzMxCgkvLyBjb25maWcuZW50cnlHYXRpbmdUeXBlID09PSBHQVRJTkdfVFlQRV9DUkVBVEVEX0JZX05GRF9BRERSRVNTRVMgfHwKCS8vICAgICAgICAgICAgIGNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX1NFR01FTlRfT0ZfTkZECglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgODAgMQoJYnRvaQoJaW50IDMKCT09CglkdXAKCWJueiAqc2tpcF9vcjAKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4MCAxCglidG9pCglpbnQgNAoJPT0KCXx8Cgoqc2tpcF9vcjA6CglieiAqaWY2X2VuZAoKCS8vICppZjZfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzM1CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5pc05GREFwcElEVmFsaWQoY29uZmlnLmVudHJ5R2F0aW5nQXNzZXRzWzBdKSwKCS8vICAgICAgICAgICAgICAgICAncHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZEJywKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAxMTMgOAoJYnRvaQoJY2FsbHN1YiBpc05GREFwcElEVmFsaWQKCgkvLyBwcm92aWRlZCBORkQgQXBwIGlkIGZvciBnYXRpbmcgbXVzdCBiZSB2YWxpZCBORkQKCWFzc2VydAoKKmlmNl9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNDAKCS8vIHRoaXMucmV0aU9QX2FkZGVkVmFsaWRhdG9yLmxvZyh7IGlkOiB2YWxpZGF0b3JJZCwgb3duZXI6IGNvbmZpZy5vd25lciwgbWFuYWdlcjogY29uZmlnLm1hbmFnZXIgfSkKCWJ5dGUgMHhhOGRkMjFjYiAvLyByZXRpT1BfYWRkZWRWYWxpZGF0b3IodWludDY0LGFkZHJlc3MsYWRkcmVzcykKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4IDMyCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA0MCAzMgoJY29uY2F0Cgljb25jYXQKCWxvZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM0MQoJLy8gcmV0dXJuIHZhbGlkYXRvcklkCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvck1hbmFnZXIodWludDY0LGFkZHJlc3Mpdm9pZAoqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvck1hbmFnZXI6CgkvLyBtYW5hZ2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKG1hbmFnZXIpIGZvciBjaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyKHVpbnQ2NCxhZGRyZXNzKXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yTWFuYWdlcgoJaW50IDEKCXJldHVybgoKLy8gY2hhbmdlVmFsaWRhdG9yTWFuYWdlcih2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBtYW5hZ2VyOiBBZGRyZXNzKTogdm9pZAovLwovLyBDaGFuZ2VzIHRoZSBWYWxpZGF0b3IgbWFuYWdlciBmb3IgYSBzcGVjaWZpYyBWYWxpZGF0b3IgaWQuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gY2hhbmdlIHRoZSBtYW5hZ2VyIGZvci4KLy8gQHBhcmFtIHtBZGRyZXNzfSBtYW5hZ2VyIC0gVGhlIG5ldyBtYW5hZ2VyIGFkZHJlc3MuCmNoYW5nZVZhbGlkYXRvck1hbmFnZXI6Cglwcm90byAyIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNTIKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM1MwoJLy8gYXNzZXJ0KG1hbmFnZXIgIT09IGdsb2JhbHMuemVyb0FkZHJlc3MsICduZWVkcyB0byBhdCBsZWFzdCBiZSB2YWxpZCBhZGRyZXNzJykKCWZyYW1lX2RpZyAtMiAvLyBtYW5hZ2VyOiBBZGRyZXNzCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CgoJLy8gbmVlZHMgdG8gYXQgbGVhc3QgYmUgdmFsaWQgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzU0CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5tYW5hZ2VyID0gbWFuYWdlcgoJaW50IDQwCglmcmFtZV9kaWcgLTIgLy8gbWFuYWdlcjogQWRkcmVzcwoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCXJldHN1YgoKLy8gY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyh1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkCiphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbzoKCS8vIHN1bnNldHRpbmdUbzogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglidG9pCgoJLy8gc3Vuc2V0dGluZ09uOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbwoJaW50IDEKCXJldHVybgoKLy8gY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBzdW5zZXR0aW5nT246IHVpbnQ2NCwgc3Vuc2V0dGluZ1RvOiBWYWxpZGF0b3JJZFR5cGUpOiB2b2lkCi8vCi8vIFVwZGF0ZXMgdGhlIHN1bnNldCBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiB2YWxpZGF0b3IuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gdXBkYXRlLgovLyBAcGFyYW0ge3VpbnQ2NH0gc3Vuc2V0dGluZ09uIC0gVGhlIG5ldyBzdW5zZXQgdGltZXN0YW1wLgovLyBAcGFyYW0ge3VpbnQ2NH0gc3Vuc2V0dGluZ1RvIC0gVGhlIG5ldyBzdW5zZXQgdG8gdmFsaWRhdG9yIGlkLgpjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvOgoJcHJvdG8gMyAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzY2CgkvLyB0aGlzLmNhbGxlck11c3RCZU93bmVyKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgY2FsbGVyTXVzdEJlT3duZXIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNjcKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnN1bnNldHRpbmdPbiA9IHN1bnNldHRpbmdPbgoJaW50IDIyNgoJZnJhbWVfZGlnIC0yIC8vIHN1bnNldHRpbmdPbjogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM2OAoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcuc3Vuc2V0dGluZ1RvID0gc3Vuc2V0dGluZ1RvCglpbnQgMjM0CglmcmFtZV9kaWcgLTMgLy8gc3Vuc2V0dGluZ1RvOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvck5GRCh1aW50NjQsdWludDY0LHN0cmluZyl2b2lkCiphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yTkZEOgoJLy8gbmZkTmFtZTogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglleHRyYWN0IDIgMAoKCS8vIG5mZEFwcElEOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JORkQodWludDY0LHVpbnQ2NCxzdHJpbmcpdm9pZAoJY2FsbHN1YiBjaGFuZ2VWYWxpZGF0b3JORkQKCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvck5GRCh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBuZmRBcHBJRDogdWludDY0LCBuZmROYW1lOiBzdHJpbmcpOiB2b2lkCi8vCi8vIENoYW5nZXMgdGhlIE5GRCBmb3IgYSB2YWxpZGF0b3IgaW4gdGhlIHZhbGlkYXRvckxpc3QgY29udHJhY3QuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gdXBkYXRlLgovLyBAcGFyYW0ge3VpbnQ2NH0gbmZkQXBwSUQgLSBUaGUgYXBwbGljYXRpb24gaWQgb2YgdGhlIE5GRCB0byBhc3NpZ24gdG8gdGhlIHZhbGlkYXRvci4KLy8gQHBhcmFtIHtzdHJpbmd9IG5mZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgTkZEICh3aGljaCBtdXN0IG1hdGNoKQpjaGFuZ2VWYWxpZGF0b3JORkQ6Cglwcm90byAzIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozODAKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM4MgoJLy8gYXNzZXJ0KHRoaXMuaXNORkRBcHBJRFZhbGlkKG5mZEFwcElEKSwgJ3Byb3ZpZGVkIE5GRCBtdXN0IGJlIHZhbGlkJykKCWZyYW1lX2RpZyAtMiAvLyBuZmRBcHBJRDogdWludDY0CgljYWxsc3ViIGlzTkZEQXBwSURWYWxpZAoKCS8vIHByb3ZpZGVkIE5GRCBtdXN0IGJlIHZhbGlkCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozODQKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHRoaXMudHhuLnNlbmRlciA9PT0gKEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzKSwKCS8vICAgICAgICAgICAgICdJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXInLAoJLy8gICAgICAgICApCgl0eG4gU2VuZGVyCglmcmFtZV9kaWcgLTIgLy8gbmZkQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKQoJYXNzZXJ0Cgk9PQoKCS8vIElmIHNwZWNpZnlpbmcgTkZELCBhY2NvdW50IGFkZGluZyB2YWxpZGF0b3IgbXVzdCBiZSBvd25lcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mzg4CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5uZmRGb3JJbmZvID0gbmZkQXBwSUQKCWludCA3MgoJZnJhbWVfZGlnIC0yIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHVpbnQ2NCxhZGRyZXNzKXZvaWQKKmFiaV9yb3V0ZV9jaGFuZ2VWYWxpZGF0b3JDb21taXNzaW9uQWRkcmVzczoKCS8vIGNvbW1pc3Npb25BZGRyZXNzOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKGNvbW1pc3Npb25BZGRyZXNzKSBmb3IgY2hhbmdlVmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MgbXVzdCBiZSBhIGFkZHJlc3MKCWFzc2VydAoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHVpbnQ2NCxhZGRyZXNzKXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MKCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIGNvbW1pc3Npb25BZGRyZXNzOiBBZGRyZXNzKTogdm9pZAovLwovLyBDaGFuZ2UgdGhlIGNvbW1pc3Npb24gYWRkcmVzcyB0aGF0IHZhbGlkYXRvciByZXdhcmRzIGFyZSBzZW50IHRvLgovLyBbIE9OTFkgT1dORVIgQ0FOIENIQU5HRSBdCmNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzOgoJcHJvdG8gMiAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mzk2CgkvLyB0aGlzLmNhbGxlck11c3RCZU93bmVyKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgY2FsbGVyTXVzdEJlT3duZXIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozOTcKCS8vIGFzc2VydChjb21taXNzaW9uQWRkcmVzcyAhPT0gQWRkcmVzcy56ZXJvQWRkcmVzcykKCWZyYW1lX2RpZyAtMiAvLyBjb21taXNzaW9uQWRkcmVzczogQWRkcmVzcwoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mzk4CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy52YWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyA9IGNvbW1pc3Npb25BZGRyZXNzCglpbnQgMTc3CglmcmFtZV9kaWcgLTIgLy8gY29tbWlzc2lvbkFkZHJlc3M6IEFkZHJlc3MKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8odWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQpdm9pZAoqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvclJld2FyZEluZm86CgkvLyBSZXdhcmRQZXJQYXlvdXQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgoJYnRvaQoKCS8vIEdhdGluZ0Fzc2V0TWluQmFsYW5jZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyA1CglidG9pCgoJLy8gRW50cnlHYXRpbmdBc3NldHM6IHVpbnQ2NFs0XQoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAoJZHVwCglsZW4KCWludCAzMgoJPT0KCgkvLyBhcmd1bWVudCAyIChFbnRyeUdhdGluZ0Fzc2V0cykgZm9yIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8gbXVzdCBiZSBhIHVpbnQ2NFs0XQoJYXNzZXJ0CgoJLy8gRW50cnlHYXRpbmdBZGRyZXNzOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDMgKEVudHJ5R2F0aW5nQWRkcmVzcykgZm9yIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8gbXVzdCBiZSBhIGFkZHJlc3MKCWFzc2VydAoKCS8vIEVudHJ5R2F0aW5nVHlwZTogdWludDgKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMQoJPT0KCgkvLyBhcmd1bWVudCA0IChFbnRyeUdhdGluZ1R5cGUpIGZvciBjaGFuZ2VWYWxpZGF0b3JSZXdhcmRJbmZvIG11c3QgYmUgYSB1aW50OAoJYXNzZXJ0CglidG9pCgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mbyh1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCl2b2lkCgljYWxsc3ViIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8KCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8odmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgRW50cnlHYXRpbmdUeXBlOiB1aW50OCwgRW50cnlHYXRpbmdBZGRyZXNzOiBBZGRyZXNzLCBFbnRyeUdhdGluZ0Fzc2V0czogU3RhdGljQXJyYXk8dWludDY0LCA0PiwgR2F0aW5nQXNzZXRNaW5CYWxhbmNlOiB1aW50NjQsIFJld2FyZFBlclBheW91dDogdWludDY0KTogdm9pZAovLwovLyBBbGxvdyB0aGUgYWRkaXRpb25hbCByZXdhcmRzIChnYXRpbmcgZW50cnksIGFkZGl0aW9uYWwgdG9rZW4gcmV3YXJkcykgaW5mb3JtYXRpb24gYmUgY2hhbmdlZCBhdCB3aWxsLgovLyBbIE9OTFkgT1dORVIgQ0FOIENIQU5HRSBdCmNoYW5nZVZhbGlkYXRvclJld2FyZEluZm86Cglwcm90byA2IDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MTMKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQxNQoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgRW50cnlHYXRpbmdUeXBlID49IEdBVElOR19UWVBFX05PTkUgJiYgRW50cnlHYXRpbmdUeXBlIDwgR0FUSU5HX1RZUEVfQ09OU1RfTUFYLAoJLy8gICAgICAgICAgICAgJ2ludmFsaWQgRW50cnkgZ2F0aW5nIHR5cGUnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDAKCT49CglkdXAKCWJ6ICpza2lwX2FuZDEKCWZyYW1lX2RpZyAtMiAvLyBFbnRyeUdhdGluZ1R5cGU6IHVpbnQ4CglpbnQgNAoJPAoJJiYKCipza2lwX2FuZDE6CgkvLyBpbnZhbGlkIEVudHJ5IGdhdGluZyB0eXBlCglhc3NlcnQKCgkvLyAqaWY3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDE5CgkvLyBFbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX0FTU0VUU19DUkVBVEVEX0JZCglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDEKCT09CglieiAqaWY3X2VuZAoKCS8vICppZjdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDIwCgkvLyBhc3NlcnQoRW50cnlHYXRpbmdBZGRyZXNzICE9PSBnbG9iYWxzLnplcm9BZGRyZXNzKQoJZnJhbWVfZGlnIC0zIC8vIEVudHJ5R2F0aW5nQWRkcmVzczogQWRkcmVzcwoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoqaWY3X2VuZDoKCS8vICppZjhfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MjMKCS8vIEVudHJ5R2F0aW5nVHlwZSA9PT0gR0FUSU5HX1RZUEVfQ1JFQVRFRF9CWV9ORkRfQUREUkVTU0VTIHx8CgkvLyAgICAgICAgICAgICBFbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX1NFR01FTlRfT0ZfTkZECglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDMKCT09CglkdXAKCWJueiAqc2tpcF9vcjEKCWZyYW1lX2RpZyAtMiAvLyBFbnRyeUdhdGluZ1R5cGU6IHVpbnQ4CglpbnQgNAoJPT0KCXx8Cgoqc2tpcF9vcjE6CglieiAqaWY4X2VuZAoKCS8vICppZjhfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDI2CgkvLyBhc3NlcnQodGhpcy5pc05GREFwcElEVmFsaWQoRW50cnlHYXRpbmdBc3NldHNbMF0pLCAncHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZEJykKCWZyYW1lX2RpZyAtNCAvLyBFbnRyeUdhdGluZ0Fzc2V0czogU3RhdGljQXJyYXk8dWludDY0LCA0PgoJZXh0cmFjdCAwIDgKCWJ0b2kKCWNhbGxzdWIgaXNORkRBcHBJRFZhbGlkCgoJLy8gcHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZECglhc3NlcnQKCippZjhfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDI4CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPSBFbnRyeUdhdGluZ1R5cGUKCWludCA4MAoJZnJhbWVfZGlnIC0yIC8vIEVudHJ5R2F0aW5nVHlwZTogdWludDgKCWl0b2IKCWV4dHJhY3QgNyAxCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQyOQoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcuZW50cnlHYXRpbmdBZGRyZXNzID0gRW50cnlHYXRpbmdBZGRyZXNzCglpbnQgODEKCWZyYW1lX2RpZyAtMyAvLyBFbnRyeUdhdGluZ0FkZHJlc3M6IEFkZHJlc3MKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDMwCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0cyA9IEVudHJ5R2F0aW5nQXNzZXRzCglpbnQgMTEzCglmcmFtZV9kaWcgLTQgLy8gRW50cnlHYXRpbmdBc3NldHM6IFN0YXRpY0FycmF5PHVpbnQ2NCwgND4KCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDMxCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5nYXRpbmdBc3NldE1pbkJhbGFuY2UgPSBHYXRpbmdBc3NldE1pbkJhbGFuY2UKCWludCAxNDUKCWZyYW1lX2RpZyAtNSAvLyBHYXRpbmdBc3NldE1pbkJhbGFuY2U6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MzIKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnJld2FyZFBlclBheW91dCA9IFJld2FyZFBlclBheW91dAoJaW50IDE2MQoJZnJhbWVfZGlnIC02IC8vIFJld2FyZFBlclBheW91dDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyBhZGRQb29sKHBheSx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCkKKmFiaV9yb3V0ZV9hZGRQb29sOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBub2RlTnVtOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gbWJyUGF5bWVudDogcGF5Cgl0eG4gR3JvdXBJbmRleAoJaW50IDEKCS0KCWR1cAoJZ3R4bnMgVHlwZUVudW0KCWludCBwYXkKCT09CgoJLy8gYXJndW1lbnQgMiAobWJyUGF5bWVudCkgZm9yIGFkZFBvb2wgbXVzdCBiZSBhIHBheSB0cmFuc2FjdGlvbgoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBhZGRQb29sKHBheSx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCkKCWNhbGxzdWIgYWRkUG9vbAoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFBvb2wobWJyUGF5bWVudDogUGF5VHhuLCB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBub2RlTnVtOiB1aW50NjQpOiBWYWxpZGF0b3JQb29sS2V5Ci8vCi8vIEFkZHMgYSBuZXcgcG9vbCB0byBhIHZhbGlkYXRvcidzIHBvb2wgc2V0LCByZXR1cm5pbmcgdGhlICdrZXknIHRvIHJlZmVyZW5jZSB0aGUgcG9vbCBpbiB0aGUgZnV0dXJlIGZvciBzdGFraW5nLCBldGMuCi8vIFRoZSBjYWxsZXIgbXVzdCBwYXkgdGhlIGNvc3Qgb2YgdGhlIHZhbGlkYXRvcnMgTUJSIGluY3JlYXNlIGFzIHdlbGwgYXMgdGhlIE1CUiB0aGF0IHdpbGwgYmUgbmVlZGVkIGZvciB0aGUgcG9vbCBpdHNlbGYuCi8vCi8vIFsgT05MWSBPV05FUiBPUiBNQU5BR0VSIENBTiBjYWxsIF0KLy8gQHBhcmFtIHtQYXlUeG59IG1iclBheW1lbnQgcGF5bWVudCBmcm9tIGNhbGxlciB3aGljaCBjb3ZlcnMgbWJyIGluY3JlYXNlIG9mIGFkZGluZyBhIG5ldyBwb29sCi8vIEBwYXJhbSB7dWludDY0fSB2YWxpZGF0b3JJZCBpcyBpZCBvZiB2YWxpZGF0b3IgdG8gcG9vbCB0byAobXVzdCBiZSBvd25lciBvciBtYW5hZ2VyKQovLyBAcGFyYW0ge3VpbnQ2NH0gbm9kZU51bSBpcyBub2RlIG51bWJlciB0byBhZGQgdG8KLy8gQHJldHVybnMge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2wga2V5IHRvIGNyZWF0ZWQgcG9vbAphZGRQb29sOgoJcHJvdG8gMyAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ0NwoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lck9yTWFuYWdlcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyT3JNYW5hZ2VyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDUwCgkvLyB2ZXJpZnlQYXlUeG4obWJyUGF5bWVudCwgeyByZWNlaXZlcjogdGhpcy5hcHAuYWRkcmVzcywgYW1vdW50OiB0aGlzLmdldE1ickFtb3VudHMoKS5hZGRQb29sTWJyIH0pCgkvLyB2ZXJpZnkgcmVjZWl2ZXIKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIFJlY2VpdmVyCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6InJlY2VpdmVyIiwiZXhwZWN0ZWQiOiJ0aGlzLmFwcC5hZGRyZXNzIn0KCWFzc2VydAoKCS8vIHZlcmlmeSBhbW91bnQKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCglleHRyYWN0IDggOAoJYnRvaQoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6ImFtb3VudCIsImV4cGVjdGVkIjoidGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkUG9vbE1iciJ9Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NTIKCS8vIGFzc2VydCh0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLmV4aXN0cywgInNwZWNpZmllZCB2YWxpZGF0b3IgaWQgaXNuJ3QgdmFsaWQiKQoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJYm94X2xlbgoJc3dhcAoJcG9wCgoJLy8gc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBpc24ndCB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDU0CgkvLyBudW1Qb29sczogdWludDY0ID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyBhcyB1aW50NjQKCWludCAyNDIKCWludCAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIG51bVBvb2xzOiB1aW50NjQKCgkvLyAqaWY5X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDU1CgkvLyAobnVtUG9vbHMgYXMgdWludDY0KSA+PSBNQVhfUE9PTFMKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWludCAyNAoJPj0KCWJ6ICppZjlfZW5kCgoJLy8gKmlmOV9jb25zZXF1ZW50CgkvLyBhbHJlYWR5IGF0IG1heCBwb29sIHNpemUKCWVycgoKKmlmOV9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NTgKCS8vIG51bVBvb2xzICs9IDEKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ2MQoJLy8gc2VuZEFwcENhbGwoewoJLy8gICAgICAgICAgICAgb25Db21wbGV0aW9uOiBPbkNvbXBsZXRpb24uTm9PcCwKCS8vICAgICAgICAgICAgIGFwcHJvdmFsUHJvZ3JhbTogWwoJLy8gICAgICAgICAgICAgICAgIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uZXh0cmFjdCgwLCA0MDk2KSwKCS8vICAgICAgICAgICAgICAgICB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLmV4dHJhY3QoNDA5NiwgdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5zaXplIC0gNDA5NiksCgkvLyAgICAgICAgICAgICBdLAoJLy8gICAgICAgICAgICAgY2xlYXJTdGF0ZVByb2dyYW06IFN0YWtpbmdQb29sLmNsZWFyUHJvZ3JhbSgpLAoJLy8gICAgICAgICAgICAgZ2xvYmFsTnVtVWludDogU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1VaW50LAoJLy8gICAgICAgICAgICAgZ2xvYmFsTnVtQnl0ZVNsaWNlOiBTdGFraW5nUG9vbC5zY2hlbWEuZ2xvYmFsLm51bUJ5dGVTbGljZSwKCS8vICAgICAgICAgICAgIGV4dHJhUHJvZ3JhbVBhZ2VzOiAzLAoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25BcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gY3JlYXRpbmdDb250cmFjdElELCB2YWxpZGF0b3JJZCwgcG9vbElkLCBtaW5FbnRyeVN0YWtlCgkvLyAgICAgICAgICAgICAgICAgbWV0aG9kKCdjcmVhdGVBcHBsaWNhdGlvbih1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCcpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodGhpcy5hcHAuaWQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodmFsaWRhdG9ySWQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IobnVtUG9vbHMgYXMgdWludDY0KSwKCS8vICAgICAgICAgICAgICAgICBpdG9iKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1pbkVudHJ5U3Rha2UpLAoJLy8gICAgICAgICAgICAgXSwKCS8vICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDYyCgkvLyBvbkNvbXBsZXRpb246IE9uQ29tcGxldGlvbi5Ob09wCglpbnQgMCAvLyBOb09wCglpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ2MwoJLy8gYXBwcm92YWxQcm9ncmFtOiBbCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5leHRyYWN0KDAsIDQwOTYpLAoJLy8gICAgICAgICAgICAgICAgIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uZXh0cmFjdCg0MDk2LCB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLnNpemUgLSA0MDk2KSwKCS8vICAgICAgICAgICAgIF0KCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWludCAwCglpbnQgNDA5NgoJYm94X2V4dHJhY3QKCWl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWludCA0MDk2CglieXRlIDB4NzA2ZjZmNmM1NDY1NmQ3MDZjNjE3NDY1NDE3MDcwNzI2Zjc2NjE2YzQyNzk3NDY1NzMgLy8gInBvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMiCglib3hfbGVuCgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLnNpemUKCWFzc2VydAoJaW50IDQwOTYKCS0KCWJveF9leHRyYWN0CglpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDY3CgkvLyBjbGVhclN0YXRlUHJvZ3JhbTogU3Rha2luZ1Bvb2wuY2xlYXJQcm9ncmFtKCkKCWJ5dGUgYjY0IEN3PT0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NjgKCS8vIGdsb2JhbE51bVVpbnQ6IFN0YWtpbmdQb29sLnNjaGVtYS5nbG9iYWwubnVtVWludAoJaW50IDExCglpdHhuX2ZpZWxkIEdsb2JhbE51bVVpbnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NjkKCS8vIGdsb2JhbE51bUJ5dGVTbGljZTogU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1CeXRlU2xpY2UKCWludCAzCglpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ3MAoJLy8gZXh0cmFQcm9ncmFtUGFnZXM6IDMKCWludCAzCglpdHhuX2ZpZWxkIEV4dHJhUHJvZ3JhbVBhZ2VzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDcxCgkvLyBhcHBsaWNhdGlvbkFyZ3M6IFsKCS8vICAgICAgICAgICAgICAgICAvLyBjcmVhdGluZ0NvbnRyYWN0SUQsIHZhbGlkYXRvcklkLCBwb29sSWQsIG1pbkVudHJ5U3Rha2UKCS8vICAgICAgICAgICAgICAgICBtZXRob2QoJ2NyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkJyksCgkvLyAgICAgICAgICAgICAgICAgaXRvYih0aGlzLmFwcC5pZCksCgkvLyAgICAgICAgICAgICAgICAgaXRvYih2YWxpZGF0b3JJZCksCgkvLyAgICAgICAgICAgICAgICAgaXRvYihudW1Qb29scyBhcyB1aW50NjQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWluRW50cnlTdGFrZSksCgkvLyAgICAgICAgICAgICBdCgltZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCXR4bmEgQXBwbGljYXRpb25zIDAKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglpbnQgMjA5CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ4MQoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyA9IG51bVBvb2xzIGFzIHVpbnQxNgoJaW50IDI0MgoJZnJhbWVfZGlnIDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoJaXRvYgoJZXh0cmFjdCA2IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDg0CgkvLyBwb29sQXBwSWQgPSB0aGlzLml0eG4uY3JlYXRlZEFwcGxpY2F0aW9uSUQuaWQKCWl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKCWZyYW1lX2J1cnkgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ4NQoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1tudW1Qb29scyAtIDFdLnBvb2xBcHBJZCA9IHBvb2xBcHBJZAoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgMCAvLyBudW1Qb29sczogdWludDY0CglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0ODYKCS8vIHRoaXMuYWRkUG9vbFRvTm9kZSh2YWxpZGF0b3JJZCwgcG9vbEFwcElkLCBub2RlTnVtKQoJZnJhbWVfZGlnIC0zIC8vIG5vZGVOdW06IHVpbnQ2NAoJZnJhbWVfZGlnIDEgLy8gcG9vbEFwcElkOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGFkZFBvb2xUb05vZGUKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0ODgKCS8vIHRoaXMucmV0aU9QX3ZhbGlkYXRvckFkZGVkUG9vbC5sb2coewoJLy8gICAgICAgICAgICAgaWQ6IHZhbGlkYXRvcklkLAoJLy8gICAgICAgICAgICAgbnVtOiBudW1Qb29scyBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKSwKCS8vICAgICAgICAgfSkKCWJ5dGUgMHhmYmNjMGY2YiAvLyByZXRpT1BfdmFsaWRhdG9yQWRkZWRQb29sKHVpbnQ2NCx1aW50MTYsdWludDY0KQoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWl0b2IKCWR1cAoJYml0bGVuCglpbnQgMTYKCTw9CgoJLy8gbnVtUG9vbHMgYXMgdWludDE2IG92ZXJmbG93ZWQgMTYgYml0cwoJYXNzZXJ0CglleHRyYWN0IDYgMgoJY29uY2F0CglmcmFtZV9kaWcgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cgljb25jYXQKCWxvZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ5NAoJLy8gcmV0dXJuIHsgaWQ6IHZhbGlkYXRvcklkLCBwb29sSWQ6IG51bVBvb2xzIGFzIHVpbnQ2NCwgcG9vbEFwcElkOiB0aGlzLml0eG4hLmNyZWF0ZWRBcHBsaWNhdGlvbklELmlkIH0KCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCglmcmFtZV9kaWcgMCAvLyBudW1Qb29sczogdWludDY0CglpdG9iCgljb25jYXQKCWl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKCWl0b2IKCWNvbmNhdAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDEKCXJldHN1YgoKLy8gYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KQoqYWJpX3JvdXRlX2FkZFN0YWtlOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gc3Rha2VkQW1vdW50UGF5bWVudDogcGF5Cgl0eG4gR3JvdXBJbmRleAoJaW50IDEKCS0KCWR1cAoJZ3R4bnMgVHlwZUVudW0KCWludCBwYXkKCT09CgoJLy8gYXJndW1lbnQgMiAoc3Rha2VkQW1vdW50UGF5bWVudCkgZm9yIGFkZFN0YWtlIG11c3QgYmUgYSBwYXkgdHJhbnNhY3Rpb24KCWFzc2VydAoKCS8vIGV4ZWN1dGUgYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBhZGRTdGFrZQoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFN0YWtlKHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4biwgdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgdmFsdWVUb1ZlcmlmeTogdWludDY0KTogVmFsaWRhdG9yUG9vbEtleQovLwovLyBBZGRzIHN0YWtlIHRvIGEgdmFsaWRhdG9yIHBvb2wuCi8vCi8vIEBwYXJhbSB7UGF5VHhufSBzdGFrZWRBbW91bnRQYXltZW50IC0gcGF5bWVudCBjb21pbmcgZnJvbSBzdGFrZXIgdG8gcGxhY2UgaW50byBhIHBvb2wKLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWx1ZVRvVmVyaWZ5IC0gb25seSBpZiB2YWxpZGF0b3IgaGFzIGdhdGluZyB0byBlbnRlciAtIHRoaXMgaXMgYXNzZXQgaWQgb3IgbmZkIGlkIHRoYXQgY29ycmVzcG9uZHMgdG8gZ2F0aW5nLgovLyBUeG4gc2VuZGVyIGlzIGZhY3RvcmVkIGluIGFzIHdlbGwgaWYgdGhhdCBpcyBwYXJ0IG9mIGdhdGluZy4KLy8gKiBAcmV0dXJucyB7VmFsaWRhdG9yUG9vbEtleX0gLSBUaGUga2V5IG9mIHRoZSB2YWxpZGF0b3IgcG9vbC4KYWRkU3Rha2U6Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA1CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTA3CgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS5leGlzdHMsICJzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGlzbid0IHZhbGlkIikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoKCS8vIHNwZWNpZmllZCB2YWxpZGF0b3IgaWQgaXNuJ3QgdmFsaWQKCWFzc2VydAoKCS8vICppZjEwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTEwCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5zdW5zZXR0aW5nT24gPiAwCglpbnQgMjI2CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWludCAwCgk+CglieiAqaWYxMF9lbmQKCgkvLyAqaWYxMF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MTIKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5zdW5zZXR0aW5nT24gPiBnbG9iYWxzLmxhdGVzdFRpbWVzdGFtcCwKCS8vICAgICAgICAgICAgICAgICAiY2FuJ3Qgc3Rha2Ugd2l0aCBhIHZhbGlkYXRvciB0aGF0IGlzIHBhc3QgaXRzIHN1bnNldHRpbmcgdGltZSIsCgkvLyAgICAgICAgICAgICApCglpbnQgMjI2CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKCT4KCgkvLyBjYW4ndCBzdGFrZSB3aXRoIGEgdmFsaWRhdG9yIHRoYXQgaXMgcGFzdCBpdHMgc3Vuc2V0dGluZyB0aW1lCglhc3NlcnQKCippZjEwX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUxOAoJLy8gc3Rha2VyID0gdGhpcy50eG4uc2VuZGVyCgl0eG4gU2VuZGVyCglmcmFtZV9idXJ5IDAgLy8gc3Rha2VyOiBhZGRyZXNzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTIyCgkvLyB2ZXJpZnlQYXlUeG4oc3Rha2VkQW1vdW50UGF5bWVudCwgewoJLy8gICAgICAgICAgICAgc2VuZGVyOiBzdGFrZXIsCgkvLyAgICAgICAgICAgICByZWNlaXZlcjogdGhpcy5hcHAuYWRkcmVzcywKCS8vICAgICAgICAgfSkKCS8vIHZlcmlmeSBzZW5kZXIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIFNlbmRlcgoJZnJhbWVfZGlnIDAgLy8gc3Rha2VyOiBhZGRyZXNzCgk9PQoKCS8vIHRyYW5zYWN0aW9uIHZlcmlmaWNhdGlvbiBmYWlsZWQ6IHsidHhuIjoic3Rha2VkQW1vdW50UGF5bWVudCIsImZpZWxkIjoic2VuZGVyIiwiZXhwZWN0ZWQiOiJzdGFrZXIifQoJYXNzZXJ0CgoJLy8gdmVyaWZ5IHJlY2VpdmVyCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBSZWNlaXZlcgoJZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCT09CgoJLy8gdHJhbnNhY3Rpb24gdmVyaWZpY2F0aW9uIGZhaWxlZDogeyJ0eG4iOiJzdGFrZWRBbW91bnRQYXltZW50IiwiZmllbGQiOiJyZWNlaXZlciIsImV4cGVjdGVkIjoidGhpcy5hcHAuYWRkcmVzcyJ9Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzAKCS8vIHRoaXMuZG9lc1N0YWtlck1lZXRHYXRpbmcodmFsaWRhdG9ySWQsIHZhbHVlVG9WZXJpZnkpCglmcmFtZV9kaWcgLTMgLy8gdmFsdWVUb1ZlcmlmeTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBkb2VzU3Rha2VyTWVldEdhdGluZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUzMgoJLy8gcmVhbEFtb3VudCA9IHN0YWtlZEFtb3VudFBheW1lbnQuYW1vdW50CglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBBbW91bnQKCWZyYW1lX2J1cnkgMSAvLyByZWFsQW1vdW50OiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzMKCS8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NCA9IDAKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gbWJyQW10TGVmdEJlaGluZDogdWludDY0CgoJLy8gKmlmMTFfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzUKCS8vIHRoaXMuZG9lc1N0YWtlck5lZWRUb1BheU1CUihzdGFrZXIpCglmcmFtZV9kaWcgMCAvLyBzdGFrZXI6IGFkZHJlc3MKCWNhbGxzdWIgZG9lc1N0YWtlck5lZWRUb1BheU1CUgoJYnogKmlmMTFfZW5kCgoJLy8gKmlmMTFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTM4CgkvLyBtYnJBbXRMZWZ0QmVoaW5kID0gdGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkU3Rha2VyTWJyCgljYWxsc3ViIGdldE1ickFtb3VudHMKCWV4dHJhY3QgMjQgOAoJYnRvaQoJZnJhbWVfYnVyeSAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUzOQoJLy8gcmVhbEFtb3VudCAtPSBtYnJBbXRMZWZ0QmVoaW5kCglmcmFtZV9kaWcgMSAvLyByZWFsQW1vdW50OiB1aW50NjQKCWZyYW1lX2RpZyAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoJLQoJZnJhbWVfYnVyeSAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU0MAoJLy8gdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikuY3JlYXRlKCkKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAwIC8vIHN0YWtlcjogYWRkcmVzcwoJY29uY2F0CglpbnQgMTQ0Cglib3hfY3JlYXRlCglwb3AKCippZjExX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU0NAoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS50b3RhbEFsZ29TdGFrZWQgKyByZWFsQW1vdW50IDwgdGhpcy5tYXhBbGxvd2VkU3Rha2UoKSwKCS8vICAgICAgICAgICAgICd0b3RhbCBzdGFrZWQgZm9yIGFsbCBvZiBhIHZhbGlkYXRvcnMgcG9vbHMgbWF5IG5vdCBleGNlZWQgaGFyZCBjYXAnLAoJLy8gICAgICAgICApCglpbnQgMjUyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoJKwoJY2FsbHN1YiBtYXhBbGxvd2VkU3Rha2UKCTwKCgkvLyB0b3RhbCBzdGFrZWQgZm9yIGFsbCBvZiBhIHZhbGlkYXRvcnMgcG9vbHMgbWF5IG5vdCBleGNlZWQgaGFyZCBjYXAKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU1MQoJLy8gZmluZFJldCA9IHRoaXMuZmluZFBvb2xGb3JTdGFrZXIodmFsaWRhdG9ySWQsIHN0YWtlciwgcmVhbEFtb3VudCkKCWZyYW1lX2RpZyAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoJZnJhbWVfZGlnIDAgLy8gc3Rha2VyOiBhZGRyZXNzCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBmaW5kUG9vbEZvclN0YWtlcgoJZnJhbWVfYnVyeSAzIC8vIGZpbmRSZXQ6ICgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NTIKCS8vIHBvb2xLZXkgPSBmaW5kUmV0WzBdCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NTMKCS8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IgPSBmaW5kUmV0WzFdCglmcmFtZV9kaWcgMyAvLyBmaW5kUmV0OiAoKHVpbnQ2NCx1aW50NjQsdWludDY0KSxib29sLGJvb2wpCglzdG9yZSAyNTUgLy8gZnVsbCBhcnJheQoJbG9hZCAyNTUgLy8gZnVsbCBhcnJheQoJaW50IDE5MgoJZ2V0Yml0CglmcmFtZV9idXJ5IDQgLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU1NAoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sID0gZmluZFJldFsyXQoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWludCAxOTMKCWdldGJpdAoJZnJhbWVfYnVyeSA1IC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoKCS8vICppZjEyX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTU1CgkvLyBwb29sS2V5LnBvb2xJZCA9PT0gMAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMAoJPT0KCWJ6ICppZjEyX2VuZAoKCS8vICppZjEyX2NvbnNlcXVlbnQKCS8vIE5vIHBvb2wgYXZhaWxhYmxlIHdpdGggZnJlZSBzdGFrZS4gIFZhbGlkYXRvciBuZWVkcyB0byBhZGQgYW5vdGhlciBwb29sCgllcnIKCippZjEyX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU2MAoJLy8gdGhpcy51cGRhdGVTdGFrZXJQb29sU2V0KHN0YWtlciwgcG9vbEtleSkKCWZyYW1lX2RpZyAzIC8vIGZpbmRSZXQ6ICgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKCXN0b3JlIDI1NSAvLyBmdWxsIGFycmF5Cglsb2FkIDI1NSAvLyBmdWxsIGFycmF5CglleHRyYWN0IDAgMjQKCWZyYW1lX2RpZyAwIC8vIHN0YWtlcjogYWRkcmVzcwoJY2FsbHN1YiB1cGRhdGVTdGFrZXJQb29sU2V0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTYzCgkvLyB0aGlzLmNhbGxQb29sQWRkU3Rha2UoCgkvLyAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LAoJLy8gICAgICAgICAgICAgcG9vbEtleSwKCS8vICAgICAgICAgICAgIG1ickFtdExlZnRCZWhpbmQsCgkvLyAgICAgICAgICAgICBpc05ld1N0YWtlclRvVmFsaWRhdG9yLAoJLy8gICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1Byb3RvY29sLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgNSAvLyBpc05ld1N0YWtlclRvUHJvdG9jb2w6IGJvb2wKCWZyYW1lX2RpZyA0IC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCWZyYW1lX2RpZyAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMCAyNAoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4bgoJY2FsbHN1YiBjYWxsUG9vbEFkZFN0YWtlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTcwCgkvLyB0aGlzLnJldGlPUF9zdGFrZUFkZGVkLmxvZyh7CgkvLyAgICAgICAgICAgICBpZDogdmFsaWRhdG9ySWQsCgkvLyAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLAoJLy8gICAgICAgICAgICAgYW1vdW50U3Rha2VkOiByZWFsQW1vdW50LAoJLy8gICAgICAgICAgICAgc3Rha2VyOiBzdGFrZXIsCgkvLyAgICAgICAgIH0pCglieXRlIDB4OTYyYjQxNDMgLy8gcmV0aU9QX3N0YWtlQWRkZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQpCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgMCAvLyBzdGFrZXI6IGFkZHJlc3MKCWNvbmNhdAoJZnJhbWVfZGlnIDEgLy8gcmVhbEFtb3VudDogdWludDY0CglpdG9iCgljb25jYXQKCWNvbmNhdAoJbG9nCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTc4CgkvLyByZXR1cm4gcG9vbEtleQoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMCAyNAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDUKCXJldHN1YgoKLy8gc2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KQoqYWJpX3JvdXRlX3NldFRva2VuUGF5b3V0UmF0aW86CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIHNldFRva2VuUGF5b3V0UmF0aW8odWludDY0KSh1aW50NjRbMjRdLHVpbnQ2NCkKCWNhbGxzdWIgc2V0VG9rZW5QYXlvdXRSYXRpbwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIHNldFRva2VuUGF5b3V0UmF0aW8odmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IFBvb2xUb2tlblBheW91dFJhdGlvCi8vCi8vIHNldFRva2VuUGF5b3V0UmF0aW8gaXMgY2FsbGVkIGJ5IFN0YWtpbmcgUG9vbCAjIDEgKE9OTFkpIHRvIGFzayB0aGUgdmFsaWRhdG9yICh1cykgdG8gY2FsY3VsYXRlIHRoZSByYXRpb3MKLy8gb2Ygc3Rha2UgaW4gdGhlIHBvb2xzIGZvciBzdWJzZXF1ZW50IHRva2VuIHBheW91dHMgKGllOiAyIHBvb2xzLCAnMTAwJyBhbGdvIHRvdGFsIHN0YWtlZCwgNjAgaW4gcG9vbCAxLCBhbmQgNDAKLy8gaW4gcG9vbCAyKSAgVGhpcyBpcyBkb25lIHNvIHdlIGhhdmUgYSBzdGFibGUgc25hcHNob3Qgb2Ygc3Rha2UgLSB0YWtlbiBvbmNlIHBlciBlcG9jaCAtIG9ubHkgdHJpZ2dlcmVkIGJ5Ci8vIHBvb2wgMSBkb2luZyBwYXlvdXQuICBwb29scyBvdGhlciB0aGFuIDEgZG9pbmcgcGF5b3V0IGNhbGwgcG9vbCAxIHRvIGFzayBpdCBkbyBpdCBmaXJzdC4KLy8gSXQgd291bGQgYmUgNjAvNDAlIGluIHRoZSBwb29sUGN0T2ZXaG9sZSB2YWx1ZXMuICBUaGUgdG9rZW4gcmV3YXJkIHBheW91dHMgdGhlbiB1c2UgdGhlc2UgdmFsdWVzIGluc3RlYWQgb2YKLy8gdGhlaXIgJ2N1cnJlbnQnIHN0YWtlIHdoaWNoIGNoYW5nZXMgYXMgcGFydCBvZiB0aGUgcGF5b3V0cyB0aGVtc2VsdmVzIChhbmQgcGVvcGxlIGNvdWxkIGJlIGNoYW5naW5nIHN0YWtlCi8vIGR1cmluZyB0aGUgZXBvY2ggdXBkYXRlcyBhY3Jvc3MgcG9vbHMpCi8vCi8vIE11bHRpcGxlIHBvb2xzIHdpbGwgY2FsbCB1cyB2aWEgcG9vbCAxIChwb29sMi0+cG9vbDEtPnZhbGlkYXRvciwgZXRjLikgc28gZG9uJ3QgYXNzZXJ0IG9uIHBvb2wxIGNhbGxpbmcgbXVsdGlwbGUKLy8gdGltZXMgaW4gc2FtZSBlcG9jaC4gIEp1c3QgcmV0dXJuLgovLwovLyBAcGFyYW0gdmFsaWRhdG9ySWQgLSB2YWxpZGF0b3IgaWQgKGFuZCB0aHVzIHBvb2wpIGNhbGxpbmcgdXMuICBWZXJpZmllZCBzbyB0aGF0IHNlbmRlciBNVVNUIGJlIHBvb2wgMSBvZiB0aGlzIHZhbGlkYXRvci4KLy8gQHJldHVybnMgUG9vbFRva2VuUGF5b3V0UmF0aW8gLSB0aGUgZmluaXNoZWQgcmF0aW8gZGF0YQpzZXRUb2tlblBheW91dFJhdGlvOgoJcHJvdG8gMSAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gOAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU5OAoJLy8gcG9vbDFBcHBJRCA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkCglpbnQgMjY4CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMCAvLyBwb29sMUFwcElEOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1OTkKCS8vIGFzc2VydChwb29sMUFwcElEICE9PSAwKQoJZnJhbWVfZGlnIDAgLy8gcG9vbDFBcHBJRDogdWludDY0CglpbnQgMAoJIT0KCWFzc2VydAoKCS8vICppZjEzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjAxCgkvLyB0aGlzLnR4bi5zZW5kZXIgIT09IEFwcElELmZyb21VaW50NjQocG9vbDFBcHBJRCkuYWRkcmVzcwoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIDAgLy8gcG9vbDFBcHBJRDogdWludDY0CglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCSE9CglieiAqaWYxM19lbmQKCgkvLyAqaWYxM19jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MDIKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWIgKnNldFRva2VuUGF5b3V0UmF0aW8qcmV0dXJuCgoqaWYxM19lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MDgKCS8vIGN1clJvdW5kID0gZ2xvYmFscy5yb3VuZAoJZ2xvYmFsIFJvdW5kCglmcmFtZV9idXJ5IDEgLy8gY3VyUm91bmQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYwOQoJLy8gbGFzdFBheW91dFVwZGF0ZSA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUudG9rZW5QYXlvdXRSYXRpby51cGRhdGVkRm9yUGF5b3V0CglpbnQgODkyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCgkvLyAqaWYxNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYxMAoJLy8gbGFzdFBheW91dFVwZGF0ZSAhPT0gMAoJZnJhbWVfZGlnIDIgLy8gbGFzdFBheW91dFVwZGF0ZTogdWludDY0CglpbnQgMAoJIT0KCWJ6ICppZjE0X2VuZAoKCS8vICppZjE0X2NvbnNlcXVlbnQKCS8vICppZjE1X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjEyCgkvLyAoQXBwSUQuZnJvbVVpbnQ2NChwb29sMUFwcElEKS5nbG9iYWxTdGF0ZSgnbGFzdFBheW91dCcpIGFzIHVpbnQ2NCkgPT09IGxhc3RQYXlvdXRVcGRhdGUKCWZyYW1lX2RpZyAwIC8vIHBvb2wxQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDZjNjE3Mzc0NTA2MTc5NmY3NTc0IC8vICJsYXN0UGF5b3V0IgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQocG9vbDFBcHBJRCkuZ2xvYmFsU3RhdGUoJ2xhc3RQYXlvdXQnKQoJYXNzZXJ0CglmcmFtZV9kaWcgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCT09CglieiAqaWYxNV9lbmQKCgkvLyAqaWYxNV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MTMKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWIgKnNldFRva2VuUGF5b3V0UmF0aW8qcmV0dXJuCgoqaWYxNV9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MTUKCS8vIGVwb2NoUm91bmRMZW5ndGggPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lcG9jaFJvdW5kTGVuZ3RoIGFzIHVpbnQ2NAoJaW50IDE2OQoJaW50IDQKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDMgLy8gZXBvY2hSb3VuZExlbmd0aDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjE2CgkvLyB0aGlzRXBvY2hCZWdpbiA9IGN1clJvdW5kIC0gKGN1clJvdW5kICUgZXBvY2hSb3VuZExlbmd0aCkKCWZyYW1lX2RpZyAxIC8vIGN1clJvdW5kOiB1aW50NjQKCWZyYW1lX2RpZyAxIC8vIGN1clJvdW5kOiB1aW50NjQKCWZyYW1lX2RpZyAzIC8vIGVwb2NoUm91bmRMZW5ndGg6IHVpbnQ2NAoJJQoJLQoJZnJhbWVfYnVyeSA0IC8vIHRoaXNFcG9jaEJlZ2luOiB1aW50NjQKCgkvLyAqaWYxNl9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYxOAoJLy8gbGFzdFBheW91dFVwZGF0ZSAtIChsYXN0UGF5b3V0VXBkYXRlICUgZXBvY2hSb3VuZExlbmd0aCkgPT09IHRoaXNFcG9jaEJlZ2luCglmcmFtZV9kaWcgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCWZyYW1lX2RpZyAyIC8vIGxhc3RQYXlvdXRVcGRhdGU6IHVpbnQ2NAoJZnJhbWVfZGlnIDMgLy8gZXBvY2hSb3VuZExlbmd0aDogdWludDY0CgklCgktCglmcmFtZV9kaWcgNCAvLyB0aGlzRXBvY2hCZWdpbjogdWludDY0Cgk9PQoJYnogKmlmMTZfZW5kCgoJLy8gKmlmMTZfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjE5CgkvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS50b2tlblBheW91dFJhdGlvCglpbnQgNzAwIC8vIGhlYWRPZmZzZXQKCWludCAyMDAKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CgliICpzZXRUb2tlblBheW91dFJhdGlvKnJldHVybgoKKmlmMTZfZW5kOgoKKmlmMTRfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjIyCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8udXBkYXRlZEZvclBheW91dCA9IGN1clJvdW5kCglpbnQgODkyCglmcmFtZV9kaWcgMSAvLyBjdXJSb3VuZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYyNAoJLy8gY3VyTnVtUG9vbHMgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnN0YXRlLm51bVBvb2xzIGFzIHVpbnQ2NAoJaW50IDI0MgoJaW50IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDUgLy8gY3VyTnVtUG9vbHM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYyNQoJLy8gdG90YWxTdGFrZUZvclZhbGlkYXRvciA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUudG90YWxBbGdvU3Rha2VkCglpbnQgMjUyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgNiAvLyB0b3RhbFN0YWtlRm9yVmFsaWRhdG9yOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MjYKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgY3VyTnVtUG9vbHM7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDcgLy8gaTogdWludDY0CgoqZm9yXzI6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MjYKCS8vIGkgPCBjdXJOdW1Qb29scwoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglmcmFtZV9kaWcgNSAvLyBjdXJOdW1Qb29sczogdWludDY0Cgk8CglieiAqZm9yXzJfZW5kCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjMxCgkvLyBvdXJQb29sUGN0T2ZXaG9sZSA9IHdpZGVSYXRpbygKCS8vICAgICAgICAgICAgICAgICBbdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1tpXS50b3RhbEFsZ29TdGFrZWQsIDFfMDAwXzAwMF0sCgkvLyAgICAgICAgICAgICAgICAgW3RvdGFsU3Rha2VGb3JWYWxpZGF0b3JdLAoJLy8gICAgICAgICAgICAgKQoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglpbnQgMV8wMDBfMDAwCgltdWx3CglpbnQgMAoJZnJhbWVfZGlnIDYgLy8gdG90YWxTdGFrZUZvclZhbGlkYXRvcjogdWludDY0CglkaXZtb2R3Cglwb3AKCXBvcAoJc3dhcAoJIQoKCS8vIHdpZGVSYXRpbyBmYWlsZWQKCWFzc2VydAoJZnJhbWVfYnVyeSA4IC8vIG91clBvb2xQY3RPZldob2xlOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MzUKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUudG9rZW5QYXlvdXRSYXRpby5wb29sUGN0T2ZXaG9sZVtpXSA9IG91clBvb2xQY3RPZldob2xlCglpbnQgNzAwCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWZyYW1lX2RpZyA4IC8vIG91clBvb2xQY3RPZldob2xlOiB1aW50NjQKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoqZm9yXzJfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MjYKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSA3IC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzIKCipmb3JfMl9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MzcKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCipzZXRUb2tlblBheW91dFJhdGlvKnJldHVybjoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDgKCXJldHN1YgoKLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcygodWludDY0LHVpbnQ2NCx1aW50NjQpLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkCiphYmlfcm91dGVfc3Rha2VVcGRhdGVkVmlhUmV3YXJkczoKCS8vIHNhdHVyYXRlZEJ1cm5Ub0ZlZVNpbms6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQoJYnRvaQoKCS8vIHZhbGlkYXRvckNvbW1pc3Npb246IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAoJYnRvaQoKCS8vIHJld2FyZFRva2VuQW1vdW50UmVzZXJ2ZWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwoJYnRvaQoKCS8vIGFsZ29Ub0FkZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglidG9pCgoJLy8gcG9vbEtleTogKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZHVwCglsZW4KCWludCAyNAoJPT0KCgkvLyBhcmd1bWVudCA0IChwb29sS2V5KSBmb3Igc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyBtdXN0IGJlIGEgKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBzdGFrZVVwZGF0ZWRWaWFSZXdhcmRzKCh1aW50NjQsdWludDY0LHVpbnQ2NCksdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKCWNhbGxzdWIgc3Rha2VVcGRhdGVkVmlhUmV3YXJkcwoJaW50IDEKCXJldHVybgoKLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyhwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5LCBhbGdvVG9BZGQ6IHVpbnQ2NCwgcmV3YXJkVG9rZW5BbW91bnRSZXNlcnZlZDogdWludDY0LCB2YWxpZGF0b3JDb21taXNzaW9uOiB1aW50NjQsIHNhdHVyYXRlZEJ1cm5Ub0ZlZVNpbms6IHVpbnQ2NCk6IHZvaWQKLy8KLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyBpcyBjYWxsZWQgYnkgU3Rha2luZyBwb29scyB0byBpbmZvcm0gdGhlIHZhbGlkYXRvciAodXMpIHRoYXQgYSBwYXJ0aWN1bGFyIGFtb3VudCBvZiB0b3RhbAovLyBzdGFrZSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgc3BlY2lmaWVkIHBvb2wuICBUaGlzIGlzIHVzZWQgdG8gdXBkYXRlIHRoZSBzdGF0cyB3ZSBoYXZlIGluIG91ciBQb29sSW5mbyBzdG9yYWdlLgovLyBUaGUgY2FsbGluZyBBcHAgaWQgaXMgdmFsaWRhdGVkIGFnYWluc3Qgb3VyIHBvb2wgbGlzdCBhcyB3ZWxsLgovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBWYWxpZGF0b3JQb29sS2V5IHR5cGUKLy8gQHBhcmFtIHt1aW50NjR9IGFsZ29Ub0FkZCAtIGFtb3VudCB0aGlzIHZhbGlkYXRvcidzIHRvdGFsIHN0YWtlIGluY3JlYXNlZCB2aWEgcmV3YXJkcwovLyBAcGFyYW0ge3VpbnQ2NH0gcmV3YXJkVG9rZW5BbW91bnRSZXNlcnZlZCAtIGFtb3VudCB0aGlzIHZhbGlkYXRvcidzIHRvdGFsIHN0YWtlIGluY3JlYXNlZCB2aWEgcmV3YXJkcyAodGhhdCBzaG91bGQgYmUKLy8gQHBhcmFtIHt1aW50NjR9IHZhbGlkYXRvckNvbW1pc3Npb24gLSB0aGUgY29tbWlzc2lvbiBhbW91bnQgdGhlIHZhbGlkYXRvciB3YXMgcGFpZCwgaWYgYW55Ci8vIEBwYXJhbSB7dWludDY0fSBzYXR1cmF0ZWRCdXJuVG9GZWVTaW5rIC0gaWYgdGhlIHBvb2wgd2FzIGluIHNhdHVyYXRlZCBzdGF0ZSwgdGhlIGFtb3VudCBzZW50IGJhY2sgdG8gdGhlIGZlZSBzaW5rLgovLyBzZWVuIGFzICdhY2NvdW50ZWQgZm9yL3BlbmRpbmcgc3BlbnQnKQpzdGFrZVVwZGF0ZWRWaWFSZXdhcmRzOgoJcHJvdG8gNSAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjU4CgkvLyB0aGlzLnZlcmlmeVBvb2xLZXlDYWxsZXIocG9vbEtleSkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CgljYWxsc3ViIHZlcmlmeVBvb2xLZXlDYWxsZXIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NjEKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCArPSBhbGdvVG9BZGQKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAxMCAvLyBoZWFkT2Zmc2V0CgkrCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NjIKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS50b3RhbEFsZ29TdGFrZWQgKz0gYWxnb1RvQWRkCglpbnQgMjUyCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMiAvLyBhbGdvVG9BZGQ6IHVpbnQ2NAoJKwoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjYzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUucmV3YXJkVG9rZW5IZWxkQmFjayArPSByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkCglpbnQgMjYwCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkOiB1aW50NjQKCSsKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY2NQoJLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgKz0gYWxnb1RvQWRkCglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglhcHBfZ2xvYmFsX2dldAoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CgkrCglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglzd2FwCglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY2OAoJLy8gdGhpcy5yZXZlcmlmeU5GRE93bmVyc2hpcChwb29sS2V5LmlkKQoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCgljYWxsc3ViIHJldmVyaWZ5TkZET3duZXJzaGlwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjcwCgkvLyB0aGlzLnJldGlPUF9lcG9jaFJld2FyZFVwZGF0ZS5sb2coewoJLy8gICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLAoJLy8gICAgICAgICAgICAgYWxnb0FkZGVkOiBhbGdvVG9BZGQsCgkvLyAgICAgICAgICAgICByZXdhcmRUb2tlbkhlbGRCYWNrOiByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkLAoJLy8gICAgICAgICAgICAgc2F0dXJhdGVkQnVyblRvRmVlU2luazogc2F0dXJhdGVkQnVyblRvRmVlU2luaywKCS8vICAgICAgICAgICAgIHZhbGlkYXRvckNvbW1pc3Npb246IHZhbGlkYXRvckNvbW1pc3Npb24sCgkvLyAgICAgICAgIH0pCglieXRlIDB4YjNlNDdjM2QgLy8gcmV0aU9QX2Vwb2NoUmV3YXJkVXBkYXRlKHVpbnQ2NCx1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTQgLy8gdmFsaWRhdG9yQ29tbWlzc2lvbjogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtNSAvLyBzYXR1cmF0ZWRCdXJuVG9GZWVTaW5rOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY29uY2F0Cglsb2cKCXJldHN1YgoKLy8gc3Rha2VSZW1vdmVkKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wpdm9pZAoqYWJpX3JvdXRlX3N0YWtlUmVtb3ZlZDoKCS8vIHN0YWtlclJlbW92ZWQ6IGJvb2wKCXR4bmEgQXBwbGljYXRpb25BcmdzIDUKCWR1cAoJbGVuCglpbnQgMQoJPT0KCgkvLyBhcmd1bWVudCAwIChzdGFrZXJSZW1vdmVkKSBmb3Igc3Rha2VSZW1vdmVkIG11c3QgYmUgYSBib29sCglhc3NlcnQKCWludCAwCglnZXRiaXQKCgkvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDQKCWJ0b2kKCgkvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDMKCWJ0b2kKCgkvLyBzdGFrZXI6IGFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMzIKCT09CgoJLy8gYXJndW1lbnQgMyAoc3Rha2VyKSBmb3Igc3Rha2VSZW1vdmVkIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBwb29sS2V5OiAodWludDY0LHVpbnQ2NCx1aW50NjQpCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDI0Cgk9PQoKCS8vIGFyZ3VtZW50IDQgKHBvb2xLZXkpIGZvciBzdGFrZVJlbW92ZWQgbXVzdCBiZSBhICh1aW50NjQsdWludDY0LHVpbnQ2NCkKCWFzc2VydAoKCS8vIGV4ZWN1dGUgc3Rha2VSZW1vdmVkKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wpdm9pZAoJY2FsbHN1YiBzdGFrZVJlbW92ZWQKCWludCAxCglyZXR1cm4KCi8vIHN0YWtlUmVtb3ZlZChwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5LCBzdGFrZXI6IEFkZHJlc3MsIGFtb3VudFJlbW92ZWQ6IHVpbnQ2NCwgcmV3YXJkUmVtb3ZlZDogdWludDY0LCBzdGFrZXJSZW1vdmVkOiBib29sZWFuKTogdm9pZAovLwovLyBzdGFrZVJlbW92ZWQgaXMgY2FsbGVkIGJ5IFN0YWtpbmcgcG9vbHMgdG8gaW5mb3JtIHRoZSB2YWxpZGF0b3IgKHVzKSB0aGF0IGEgcGFydGljdWxhciBhbW91bnQgb2YgdG90YWwgc3Rha2UgaGFzIGJlZW4gcmVtb3ZlZAovLyBmcm9tIHRoZSBzcGVjaWZpZWQgcG9vbC4gIFRoaXMgaXMgdXNlZCB0byB1cGRhdGUgdGhlIHN0YXRzIHdlIGhhdmUgaW4gb3VyIFBvb2xJbmZvIHN0b3JhZ2UuCi8vIElmIGFueSBhbW91bnQgb2YgcmV3YXJkUmVtb3ZlZCBpcyBzcGVjaWZpZWQsIHRoZW4gdGhhdCBhbW91bnQgb2YgcmV3YXJkIGlzIHNlbnQgdG8gdGhlIHVzZQovLyBUaGUgY2FsbGluZyBBcHAgaWQgaXMgdmFsaWRhdGVkIGFnYWluc3Qgb3VyIHBvb2wgbGlzdCBhcyB3ZWxsLgovLwovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgY2FsbGluZyB1cyBmcm9tIHdoaWNoIHN0YWtlIHdhcyByZW1vdmVkCi8vIEBwYXJhbSB7QWRkcmVzc30gc3Rha2VyCi8vIEBwYXJhbSB7dWludDY0fSBhbW91bnRSZW1vdmVkIC0gYWxnbyBhbW91bnQgcmVtb3ZlZAovLyBAcGFyYW0ge3VpbnQ2NH0gcmV3YXJkUmVtb3ZlZCAtIGlmIGFwcGxpY2FibGUsIGFtb3VudCBvZiB0b2tlbiByZXdhcmQgcmVtb3ZlZCAoYnkgcG9vbCAxIGNhbGxlcikgb3IgVE8gcmVtb3ZlIGFuZCBwYXkgb3V0ICh2aWEgcG9vbCAxIGZyb20gZGlmZmVyZW50IHBvb2wgY2FsbGVyKQovLyBAcGFyYW0ge2Jvb2xlYW59IHN0YWtlclJlbW92ZWQKc3Rha2VSZW1vdmVkOgoJcHJvdG8gNSAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMwoKCS8vICppZjE3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzAwCgkvLyBnbG9iYWxzLm9wY29kZUJ1ZGdldCA8IDMwMAoJZ2xvYmFsIE9wY29kZUJ1ZGdldAoJaW50IDMwMAoJPAoJYnogKmlmMTdfZW5kCgoJLy8gKmlmMTdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzAxCgkvLyBpbmNyZWFzZU9wY29kZUJ1ZGdldCgpCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJaW50IDAKCWl0eG5fZmllbGQgRmVlCglieXRlIGI2NCBDb0VCIC8vICNwcmFnbWEgdmVyc2lvbiAxMDsgaW50IDEKCWR1cAoJaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCWludCBEZWxldGVBcHBsaWNhdGlvbgoJaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KCWl0eG5fc3VibWl0CgoqaWYxN19lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MDMKCS8vIHRoaXMudmVyaWZ5UG9vbEtleUNhbGxlcihwb29sS2V5KQoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWNhbGxzdWIgdmVyaWZ5UG9vbEtleUNhbGxlcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcwNwoJLy8gYXNzZXJ0KGFtb3VudFJlbW92ZWQgPiAwIHx8IHJld2FyZFJlbW92ZWQgPiAwLCAnc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGFsZ28gb3IgcmV3YXJkIHdhcyByZW1vdmVkJykKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWludCAwCgk+CglkdXAKCWJueiAqc2tpcF9vcjIKCWZyYW1lX2RpZyAtNCAvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCWludCAwCgk+Cgl8fAoKKnNraXBfb3IyOgoJLy8gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGFsZ28gb3IgcmV3YXJkIHdhcyByZW1vdmVkCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MTAKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCAtPSBhbW91bnRSZW1vdmVkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxMQoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsQWxnb1N0YWtlZCAtPSBhbW91bnRSZW1vdmVkCglpbnQgMjUyCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxMgoJLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgLT0gYW1vdW50UmVtb3ZlZAoJYnl0ZSAweDczNzQ2MTZiNjU2NCAvLyAic3Rha2VkIgoJYXBwX2dsb2JhbF9nZXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCXN3YXAKCWFwcF9nbG9iYWxfcHV0CgoJLy8gKmlmMThfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MTQKCS8vIHJld2FyZFJlbW92ZWQgPiAwCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CglpbnQgMAoJPgoJYnogKmlmMThfZWxzZQoKCS8vICppZjE4X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxNQoJLy8gcmV3YXJkVG9rZW5JRCA9IHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5jb25maWcucmV3YXJkVG9rZW5JZAoJaW50IDE1MwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIHJld2FyZFRva2VuSUQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxNgoJLy8gYXNzZXJ0KHJld2FyZFRva2VuSUQgIT09IDAsICJyZXdhcmRSZW1vdmVkIGNhbid0IGJlIHNldCBpZiB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIHJld2FyZCB0b2tlbiEiKQoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JRDogdWludDY0CglpbnQgMAoJIT0KCgkvLyByZXdhcmRSZW1vdmVkIGNhbid0IGJlIHNldCBpZiB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIHJld2FyZCB0b2tlbiEKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxNwoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS5yZXdhcmRUb2tlbkhlbGRCYWNrID49IHJld2FyZFJlbW92ZWQsCgkvLyAgICAgICAgICAgICAgICAgJ3Jld2FyZCBiZWluZyByZW1vdmVkIG11c3QgYmUgY292ZXJlZCBieSBob2xkIGJhY2sgYW1vdW50JywKCS8vICAgICAgICAgICAgICkKCWludCAyNjAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtNCAvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCT49CgoJLy8gcmV3YXJkIGJlaW5nIHJlbW92ZWQgbXVzdCBiZSBjb3ZlcmVkIGJ5IGhvbGQgYmFjayBhbW91bnQKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyMwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnJld2FyZFRva2VuSGVsZEJhY2sgLT0gcmV3YXJkUmVtb3ZlZAoJaW50IDI2MAoJZHVwCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CgktCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyAqaWYxOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyOAoJLy8gcG9vbEtleS5wb29sSWQgIT09IDEKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCSE9CglieiAqaWYxOV9lbmQKCgkvLyAqaWYxOV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MjkKCS8vIHNlbmRNZXRob2RDYWxsPHR5cGVvZiBTdGFraW5nUG9vbC5wcm90b3R5cGUucGF5VG9rZW5SZXdhcmQ+KHsKCS8vICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRDogQXBwSUQuZnJvbVVpbnQ2NCh0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJnczogW3N0YWtlciwgcmV3YXJkVG9rZW5JRCwgcmV3YXJkUmVtb3ZlZF0sCgkvLyAgICAgICAgICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgltZXRob2QgInBheVRva2VuUmV3YXJkKGFkZHJlc3MsdWludDY0LHVpbnQ2NCl2b2lkIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MzAKCS8vIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQodGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzWzBdLnBvb2xBcHBJZCkKCWludCAyNjgKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczMQoJLy8gbWV0aG9kQXJnczogW3N0YWtlciwgcmV3YXJkVG9rZW5JRCwgcmV3YXJkUmVtb3ZlZF0KCWZyYW1lX2RpZyAtMiAvLyBzdGFrZXI6IEFkZHJlc3MKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklEOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCippZjE5X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczNAoJLy8gdGhpcy5yZXRpT1Bfc3Rha2VSZW1vdmVkLmxvZyh7CgkvLyAgICAgICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICAgICAgcG9vbE51bTogcG9vbEtleS5wb29sSWQgYXMgdWludDE2LAoJLy8gICAgICAgICAgICAgICAgIHBvb2xBcHBJZDogQXBwSUQuZnJvbVVpbnQ2NChwb29sS2V5LnBvb2xBcHBJZCksCgkvLyAgICAgICAgICAgICAgICAgc3Rha2VyOiBzdGFrZXIsCgkvLyAgICAgICAgICAgICAgICAgYW1vdW50VW5zdGFrZWQ6IGFtb3VudFJlbW92ZWQsCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5Bc3NldElkOiBBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JRCksCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5zUmVjZWl2ZWQ6IHJld2FyZFJlbW92ZWQsCgkvLyAgICAgICAgICAgICB9KQoJYnl0ZSAweDEyZjRiZDRiIC8vIHJldGlPUF9zdGFrZVJlbW92ZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTIgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC00IC8vIHJld2FyZFJlbW92ZWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklEOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWIgKmlmMThfZW5kCgoqaWYxOF9lbHNlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzQ0CgkvLyB0aGlzLnJldGlPUF9zdGFrZVJlbW92ZWQubG9nKHsKCS8vICAgICAgICAgICAgICAgICBpZDogcG9vbEtleS5pZCwKCS8vICAgICAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICAgICAgcG9vbEFwcElkOiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICBzdGFrZXI6IHN0YWtlciwKCS8vICAgICAgICAgICAgICAgICBhbW91bnRVbnN0YWtlZDogYW1vdW50UmVtb3ZlZCwKCS8vICAgICAgICAgICAgICAgICAvLyBubyB0b2tlbnMgcmV3YXJkZWQuLgoJLy8gICAgICAgICAgICAgICAgIHJld2FyZFRva2VuQXNzZXRJZDogQXNzZXRJRC56ZXJvSW5kZXgsCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5zUmVjZWl2ZWQ6IDAsCgkvLyAgICAgICAgICAgICB9KQoJYnl0ZSAweDEyZjRiZDRiIC8vIHJldGlPUF9zdGFrZVJlbW92ZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTIgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAKCWNvbmNhdAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCippZjE4X2VuZDoKCS8vICppZjIwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzU2CgkvLyBzdGFrZXJSZW1vdmVkCglmcmFtZV9kaWcgLTUgLy8gc3Rha2VyUmVtb3ZlZDogYm9vbGVhbgoJYnogKmlmMjBfZW5kCgoJLy8gKmlmMjBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzU4CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbcG9vbEtleS5wb29sSWQgLSAxXS50b3RhbFN0YWtlcnMgLT0gMQoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJaW50IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDEKCS0KCWl0b2IKCWV4dHJhY3QgNiAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NjAKCS8vIHJlbW92ZVJldCA9IHRoaXMucmVtb3ZlRnJvbVN0YWtlclBvb2xTZXQoc3Rha2VyLCA8VmFsaWRhdG9yUG9vbEtleT57CgkvLyAgICAgICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICAgICAgcG9vbElkOiBwb29sS2V5LnBvb2xJZCwKCS8vICAgICAgICAgICAgICAgICBwb29sQXBwSWQ6IHBvb2xLZXkucG9vbEFwcElkLAoJLy8gICAgICAgICAgICAgfSkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY2FsbHN1YiByZW1vdmVGcm9tU3Rha2VyUG9vbFNldAoJZnJhbWVfYnVyeSAxIC8vIHJlbW92ZVJldDogKGJvb2wsYm9vbCkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NjUKCS8vIHN0YWtlck91dE9mVGhpc1ZhbGlkYXRvciA9IHJlbW92ZVJldFswXQoJZnJhbWVfZGlnIDEgLy8gcmVtb3ZlUmV0OiAoYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWludCAwCglnZXRiaXQKCWZyYW1lX2J1cnkgMiAvLyBzdGFrZXJPdXRPZlRoaXNWYWxpZGF0b3I6IGJvb2wKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NjYKCS8vIHN0YWtlck91dE9mUHJvdG9jb2wgPSByZW1vdmVSZXRbMV0KCWZyYW1lX2RpZyAxIC8vIHJlbW92ZVJldDogKGJvb2wsYm9vbCkKCXN0b3JlIDI1NSAvLyBmdWxsIGFycmF5Cglsb2FkIDI1NSAvLyBmdWxsIGFycmF5CglpbnQgMQoJZ2V0Yml0CglmcmFtZV9idXJ5IDMgLy8gc3Rha2VyT3V0T2ZQcm90b2NvbDogYm9vbAoKCS8vICppZjIxX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzY4CgkvLyBzdGFrZXJPdXRPZlRoaXNWYWxpZGF0b3IKCWZyYW1lX2RpZyAyIC8vIHN0YWtlck91dE9mVGhpc1ZhbGlkYXRvcjogYm9vbAoJYnogKmlmMjFfZW5kCgoJLy8gKmlmMjFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzY5CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUudG90YWxTdGFrZXJzIC09IDEKCWludCAyNDQKCWR1cAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDEKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKKmlmMjFfZW5kOgoJLy8gKmlmMjJfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NzIKCS8vIHN0YWtlck91dE9mUHJvdG9jb2wKCWZyYW1lX2RpZyAzIC8vIHN0YWtlck91dE9mUHJvdG9jb2w6IGJvb2wKCWJ6ICppZjIyX2VuZAoKCS8vICppZjIyX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc3MwoJLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlIC09IDEKCWJ5dGUgMHg2ZTc1NmQ1Mzc0NjE2YjY1NzI3MyAvLyAibnVtU3Rha2VycyIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMQoJLQoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJc3dhcAoJYXBwX2dsb2JhbF9wdXQKCippZjIyX2VuZDoKCippZjIwX2VuZDoKCXJldHN1YgoKLy8gZmluZFBvb2xGb3JTdGFrZXIodWludDY0LGFkZHJlc3MsdWludDY0KSgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKKmFiaV9yb3V0ZV9maW5kUG9vbEZvclN0YWtlcjoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gYW1vdW50VG9TdGFrZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglidG9pCgoJLy8gc3Rha2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDEgKHN0YWtlcikgZm9yIGZpbmRQb29sRm9yU3Rha2VyIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBmaW5kUG9vbEZvclN0YWtlcih1aW50NjQsYWRkcmVzcyx1aW50NjQpKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJY2FsbHN1YiBmaW5kUG9vbEZvclN0YWtlcgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGZpbmRQb29sRm9yU3Rha2VyKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIHN0YWtlcjogQWRkcmVzcywgYW1vdW50VG9TdGFrZTogdWludDY0KTogW1ZhbGlkYXRvclBvb2xLZXksIGJvb2xlYW4sIGJvb2xlYW5dCi8vCi8vIEZpbmRzIHRoZSBwb29sIGZvciBhIHN0YWtlciBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgdmFsaWRhdG9yIGlkLCBzdGFrZXIgYWRkcmVzcywgYW5kIGFtb3VudCB0byBzdGFrZS4KLy8gRmlyc3QgY2hlY2tzIHRoZSBzdGFrZXJzICdhbHJlYWR5IHN0YWtlZCBsaXN0JyBmb3IgdGhlIHZhbGlkYXRvciBwcmVmZXJyaW5nIHRob3NlIChhZGRpbmcgaWYgcG9zc2libGUpIHRoZW4gYWRkcwovLyB0byBuZXcgcG9vbCBpZiBuZWNlc3NhcnkuCi8vCi8vIEBwYXJhbSB7VmFsaWRhdG9ySWRUeXBlfSB2YWxpZGF0b3JJZCAtIFRoZSBpZCBvZiB0aGUgdmFsaWRhdG9yLgovLyBAcGFyYW0ge0FkZHJlc3N9IHN0YWtlciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzdGFrZXIuCi8vIEBwYXJhbSB7dWludDY0fSBhbW91bnRUb1N0YWtlIC0gVGhlIGFtb3VudCB0byBzdGFrZS4KLy8gQHJldHVybnMge1ZhbGlkYXRvclBvb2xLZXksIGJvb2xlYW4sIGJvb2xlYW59IC0gVGhlIHBvb2wgZm9yIHRoZSBzdGFrZXIsIHRydWUvZmFsc2Ugb24gd2hldGhlciB0aGUgc3Rha2VyIGlzICduZXcnCi8vIHRvIHRoaXMgVkFMSURBVE9SLCBhbmQgdHJ1ZS9mYWxzZSBpZiBzdGFrZXIgaXMgbmV3IHRvIHRoZSBwcm90b2NvbC4KZmluZFBvb2xGb3JTdGFrZXI6Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA3CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Nzk0CgkvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yID0gdHJ1ZQoJaW50IDEKCWZyYW1lX2J1cnkgMCAvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yOiBib29sCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Nzk1CgkvLyBpc05ld1N0YWtlclRvUHJvdG9jb2wgPSB0cnVlCglpbnQgMQoJZnJhbWVfYnVyeSAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgwMwoJLy8gbWF4UGVyUG9vbCA9IHRoaXMuZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sCglmcmFtZV9idXJ5IDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoJLy8gKmlmMjNfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MDYKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLmV4aXN0cwoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfbGVuCglzd2FwCglwb3AKCWJ6ICppZjIzX2VuZAoKCS8vICppZjIzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgwNwoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgwOAoJLy8gYXNzZXJ0KHZhbGlkYXRvcklkICE9PSAwKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWludCAwCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODA5CgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IHBvb2xTZXQubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoKKmZvcl8zOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODA5CgkvLyBpIDwgcG9vbFNldC5sZW5ndGgKCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDYKCTwKCWJ6ICpmb3JfM19lbmQKCgkvLyAqaWYyNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxMAoJLy8gZ2xvYmFscy5vcGNvZGVCdWRnZXQgPCAzMDAKCWdsb2JhbCBPcGNvZGVCdWRnZXQKCWludCAzMDAKCTwKCWJ6ICppZjI0X2VuZAoKCS8vICppZjI0X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxMQoJLy8gaW5jcmVhc2VPcGNvZGVCdWRnZXQoKQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCWludCAwCglpdHhuX2ZpZWxkIEZlZQoJYnl0ZSBiNjQgQ29FQiAvLyAjcHJhZ21hIHZlcnNpb24gMTA7IGludCAxCglkdXAKCWl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCglpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCglpbnQgRGVsZXRlQXBwbGljYXRpb24KCWl0eG5fZmllbGQgT25Db21wbGV0aW9uCglpdHhuX3N1Ym1pdAoKKmlmMjRfZW5kOgoJLy8gKmlmMjVfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MTMKCS8vIHBvb2xTZXRbaV0uaWQgPT09IDAKCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgk9PQoJYnogKmlmMjVfZW5kCgoJLy8gKmlmMjVfY29uc2VxdWVudAoJYiAqZm9yXzNfY29udGludWUKCippZjI1X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxNgoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sID0gZmFsc2UKCWludCAwCglmcmFtZV9idXJ5IDEgLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sCgoJLy8gKmlmMjZfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MTcKCS8vIHBvb2xTZXRbaV0uaWQgPT09IHZhbGlkYXRvcklkCglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgMAoJKwoJaW50IDgKCWV4dHJhY3QzCglidG9pCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJPT0KCWJ6ICppZjI2X2VuZAoKCS8vICppZjI2X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxOQoJLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciA9IGZhbHNlCglpbnQgMAoJZnJhbWVfYnVyeSAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCgkvLyAqaWYyN19jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyMQoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1twb29sU2V0W2ldLnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCArCgkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50VG9TdGFrZSA8PQoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4UGVyUG9vbAoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgOCAvLyBoZWFkT2Zmc2V0CgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJKwoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8PQoJYnogKmlmMjdfZW5kCgoJLy8gKmlmMjdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODI1CgkvLyByZXR1cm4gW3Bvb2xTZXRbaV0sIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IsIGlzTmV3U3Rha2VyVG9Qcm90b2NvbF0KCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWJ5dGUgMHgwMAoJaW50IDAKCWZyYW1lX2RpZyAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCXNldGJpdAoJaW50IDEKCWZyYW1lX2RpZyAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoJc2V0Yml0Cgljb25jYXQKCWIgKmZpbmRQb29sRm9yU3Rha2VyKnJldHVybgoKKmlmMjdfZW5kOgoKKmlmMjZfZW5kOgoKKmZvcl8zX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODA5CgkvLyBpICs9IDEKCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgNCAvLyBpOiB1aW50NjQKCWIgKmZvcl8zCgoqZm9yXzNfZW5kOgoKKmlmMjNfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODMyCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBhbW91bnRUb1N0YWtlID49IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1pbkVudHJ5U3Rha2UsCgkvLyAgICAgICAgICAgICAnbXVzdCBzdGFrZSBhdCBsZWFzdCB0aGUgbWluaW11bSBmb3IgdGhpcyBwb29sJywKCS8vICAgICAgICAgKQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJaW50IDIwOQoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk+PQoKCS8vIG11c3Qgc3Rha2UgYXQgbGVhc3QgdGhlIG1pbmltdW0gZm9yIHRoaXMgcG9vbAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODM4CgkvLyBwb29scyA9IGNsb25lKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHMpCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWludCA0MzIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglmcmFtZV9idXJ5IDUgLy8gcG9vbHM6ICh1aW50NjQsdWludDE2LHVpbnQ2NClbMjRdCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODM5CgkvLyBjdXJOdW1Qb29scyA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUubnVtUG9vbHMgYXMgdWludDY0CglpbnQgMjQyCglpbnQgMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgNiAvLyBjdXJOdW1Qb29sczogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQwCgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IGN1ck51bVBvb2xzOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA3IC8vIGk6IHVpbnQ2NAoKKmZvcl80OgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQwCgkvLyBpIDwgY3VyTnVtUG9vbHMKCWZyYW1lX2RpZyA3IC8vIGk6IHVpbnQ2NAoJZnJhbWVfZGlnIDYgLy8gY3VyTnVtUG9vbHM6IHVpbnQ2NAoJPAoJYnogKmZvcl80X2VuZAoKCS8vICppZjI4X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQxCgkvLyBwb29sc1tpXS50b3RhbEFsZ29TdGFrZWQgKyBhbW91bnRUb1N0YWtlIDw9IG1heFBlclBvb2wKCWZyYW1lX2RpZyA1IC8vIHBvb2xzOiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJKwoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8PQoJYnogKmlmMjhfZW5kCgoJLy8gKmlmMjhfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQyCgkvLyByZXR1cm4gWwoJLy8gICAgICAgICAgICAgICAgICAgICB7IGlkOiB2YWxpZGF0b3JJZCwgcG9vbElkOiBpICsgMSwgcG9vbEFwcElkOiBwb29sc1tpXS5wb29sQXBwSWQgfSwKCS8vICAgICAgICAgICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciwKCS8vICAgICAgICAgICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1Byb3RvY29sLAoJLy8gICAgICAgICAgICAgICAgIF0KCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxCgkrCglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyA1IC8vIHBvb2xzOiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglieXRlIDB4MDAKCWludCAwCglmcmFtZV9kaWcgMCAvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yOiBib29sCglzZXRiaXQKCWludCAxCglmcmFtZV9kaWcgMSAvLyBpc05ld1N0YWtlclRvUHJvdG9jb2w6IGJvb2wKCXNldGJpdAoJY29uY2F0CgliICpmaW5kUG9vbEZvclN0YWtlcipyZXR1cm4KCippZjI4X2VuZDoKCipmb3JfNF9jb250aW51ZToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg0MAoJLy8gaSArPSAxCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDcgLy8gaTogdWludDY0CgliICpmb3JfNAoKKmZvcl80X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg1MAoJLy8gcmV0dXJuIFt7IGlkOiB2YWxpZGF0b3JJZCwgcG9vbElkOiAwLCBwb29sQXBwSWQ6IDAgfSwgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciwgaXNOZXdTdGFrZXJUb1Byb3RvY29sXQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCgljb25jYXQKCWJ5dGUgMHgwMAoJaW50IDAKCWZyYW1lX2RpZyAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCXNldGJpdAoJaW50IDEKCWZyYW1lX2RpZyAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoJc2V0Yml0Cgljb25jYXQKCipmaW5kUG9vbEZvclN0YWtlcipyZXR1cm46CgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCgkvLyBwb3AgYWxsIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHRoZSBzdGFjawoJcG9wbiA3CglyZXRzdWIKCi8vIG1vdmVQb29sVG9Ob2RlKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKKmFiaV9yb3V0ZV9tb3ZlUG9vbFRvTm9kZToKCS8vIG5vZGVOdW06IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwoJYnRvaQoKCS8vIHBvb2xBcHBJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglidG9pCgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgbW92ZVBvb2xUb05vZGUodWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZAoJY2FsbHN1YiBtb3ZlUG9vbFRvTm9kZQoJaW50IDEKCXJldHVybgoKLy8gbW92ZVBvb2xUb05vZGUodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcG9vbEFwcElkOiB1aW50NjQsIG5vZGVOdW06IHVpbnQ2NCk6IHZvaWQKLy8KLy8gRmluZCB0aGUgc3BlY2lmaWVkIHBvb2wgKGluIGFueSBub2RlIG51bWJlcikgYW5kIG1vdmUgaXQgdG8gdGhlIHNwZWNpZmllZCBub2RlLgovLyBUaGUgcG9vbCBhY2NvdW50IGlzIGZvcmNlZCBvZmZsaW5lIGlmIG1vdmVkIHNvIHByaW9yIG5vZGUgd2lsbCBzdGlsbCBydW4gZm9yIDMyMCByb3VuZHMgYnV0Ci8vIG5ldyBrZXkgZ29lcyBvbmxpbmUgb24gbmV3IG5vZGUgc29vbiBhZnRlciAoMzIwIHJvdW5kcyBhZnRlciBpdCBnb2VzIG9ubGluZSkKLy8gTm8tb3AgaWYgc3VjY2VzcywgYXNzZXJ0cyBpZiBub3QgZm91bmQgb3IgY2FuJ3QgbW92ZSAgKG5vIHNwYWNlIGluIHRhcmdldCkKLy8gWyBPTkxZIE9XTkVSIE9SIE1BTkFHRVIgQ0FOIENIQU5HRSBdCi8vCi8vIEBwYXJhbSB7VmFsaWRhdG9ySWRUeXBlfSB2YWxpZGF0b3JJZCAtIFRoZSBpZCBvZiB0aGUgdmFsaWRhdG9yLgovLyBAcGFyYW0ge3VpbnQ2NH0gcG9vbEFwcElkCi8vIEBwYXJhbSB7dWludDY0fSBub2RlTnVtCm1vdmVQb29sVG9Ob2RlOgoJcHJvdG8gMyAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg2NQoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lck9yTWFuYWdlcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyT3JNYW5hZ2VyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODY3CgkvLyBub2RlUG9vbEFzc2lnbm1lbnRzID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5ub2RlUG9vbEFzc2lnbm1lbnRzKQoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfYnVyeSAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NjgKCS8vIGFzc2VydChub2RlTnVtID49IDEgJiYgbm9kZU51bSA8PSBNQVhfTk9ERVMsICdub2RlIG51bWJlciBvdXQgb2YgYWxsb3dhYmxlIHJhbmdlJykKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCAxCgk+PQoJZHVwCglieiAqc2tpcF9hbmQyCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgOAoJPD0KCSYmCgoqc2tpcF9hbmQyOgoJLy8gbm9kZSBudW1iZXIgb3V0IG9mIGFsbG93YWJsZSByYW5nZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODcwCgkvLyBmb3IgKGxldCBzcmNOb2RlSWR4ID0gMDsgc3JjTm9kZUlkeCA8IE1BWF9OT0RFUzsgc3JjTm9kZUlkeCArPSAxKQoJaW50IDAKCWZyYW1lX2J1cnkgMSAvLyBzcmNOb2RlSWR4OiB1aW50NjQKCipmb3JfNToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3MAoJLy8gc3JjTm9kZUlkeCA8IE1BWF9OT0RFUwoJZnJhbWVfZGlnIDEgLy8gc3JjTm9kZUlkeDogdWludDY0CglpbnQgOAoJPAoJYnogKmZvcl81X2VuZAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3MQoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBNQVhfUE9PTFNfUEVSX05PREU7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzY6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzEKCS8vIGkgPCBNQVhfUE9PTFNfUEVSX05PREUKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDMKCTwKCWJ6ICpmb3JfNl9lbmQKCgkvLyAqaWYyOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3MgoJLy8gbm9kZVBvb2xBc3NpZ25tZW50cy5ub2Rlc1tzcmNOb2RlSWR4XS5wb29sQXBwSWRzW2ldID09PSBwb29sQXBwSWQKCWZyYW1lX2RpZyAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCWludCAwCglmcmFtZV9kaWcgMSAvLyBzcmNOb2RlSWR4OiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMAoJKwoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWZyYW1lX2RpZyAtMiAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJPT0KCWJ6ICppZjI5X2VuZAoKCS8vICppZjI5X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3MwoJLy8gYXNzZXJ0KG5vZGVOdW0gLSAxICE9PSBzcmNOb2RlSWR4LCAiY2FuJ3QgbW92ZSB0byBzYW1lIG5vZGUiKQoJZnJhbWVfZGlnIC0zIC8vIG5vZGVOdW06IHVpbnQ2NAoJaW50IDEKCS0KCWZyYW1lX2RpZyAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJIT0KCgkvLyBjYW4ndCBtb3ZlIHRvIHNhbWUgbm9kZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODc1CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLm5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbc3JjTm9kZUlkeF0ucG9vbEFwcElkc1tpXSA9IDAKCWludCA5MDAKCWZyYW1lX2RpZyAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3OAoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5nb09mZmxpbmU+KHsKCS8vICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgltZXRob2QgImdvT2ZmbGluZSgpdm9pZCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODc5CgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkKCWZyYW1lX2RpZyAtMiAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4MwoJLy8gdGhpcy5hZGRQb29sVG9Ob2RlKHZhbGlkYXRvcklkLCBwb29sQXBwSWQsIG5vZGVOdW0pCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gcG9vbEFwcElkOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGFkZFBvb2xUb05vZGUKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4ODQKCS8vIHJldHVybgoJcmV0c3ViCgoqaWYyOV9lbmQ6CgoqZm9yXzZfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzEKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzYKCipmb3JfNl9lbmQ6CgoqZm9yXzVfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzAKCS8vIHNyY05vZGVJZHggKz0gMQoJZnJhbWVfZGlnIDEgLy8gc3JjTm9kZUlkeDogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJYiAqZm9yXzUKCipmb3JfNV9lbmQ6CgkvLyBjb3VsZG4ndCBmaW5kIHBvb2wgYXBwIGlkIGluIG5vZGVzIHRvIG1vdmUKCWVycgoJcmV0c3ViCgovLyBlbXB0eVRva2VuUmV3YXJkcyh1aW50NjQsYWRkcmVzcyl1aW50NjQKKmFiaV9yb3V0ZV9lbXB0eVRva2VuUmV3YXJkczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gcmVjZWl2ZXI6IGFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMzIKCT09CgoJLy8gYXJndW1lbnQgMCAocmVjZWl2ZXIpIGZvciBlbXB0eVRva2VuUmV3YXJkcyBtdXN0IGJlIGEgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZW1wdHlUb2tlblJld2FyZHModWludDY0LGFkZHJlc3MpdWludDY0CgljYWxsc3ViIGVtcHR5VG9rZW5SZXdhcmRzCglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZW1wdHlUb2tlblJld2FyZHModmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcmVjZWl2ZXI6IEFkZHJlc3MpOiB1aW50NjQKLy8KLy8gU2VuZHMgdGhlIHJld2FyZCB0b2tlbnMgaGVsZCBpbiBwb29sIDEgdG8gc3BlY2lmaWVkIHJlY2VpdmVyLgovLyBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgdGhlIG93bmVyIHdoZW4gdGhleSB3YW50IHRvIGdldCByZXdhcmQgdG9rZW5zICdiYWNrJyB3aGljaCB0aGV5IHNlbnQgdG8KLy8gdGhlIGZpcnN0IHBvb2wgKGxpa2VseSBiZWNhdXNlIHZhbGlkYXRvciBpcyBzdW5zZXR0aW5nLiAgQW55IHRva2VucyBjdXJyZW50bHkgJ3Jlc2VydmVkJyBmb3Igc3Rha2VycyB0byBjbGFpbSB3aWxsCi8vIE5PVCBiZSBzZW50IGFzIHRoZXkgbXVzdCBiZSBoZWxkIGJhY2sgZm9yIHN0YWtlcnMgdG8gbGF0ZXIgY2xhaW0uCi8vIFsgT05MWSBPV05FUiBDQU4gQ0FMTF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7QWRkcmVzc30gcmVjZWl2ZXIgLSB0aGUgYWNjb3VudCB0byBzZW5kIHRoZSB0b2tlbnMgdG8gKG11c3QgYWxyZWFkeSBiZSBvcHRlZC1pbiB0byB0aGUgcmV3YXJkIHRva2VuKQovLyBAcmV0dXJucyB7dWludDY0fSB0aGUgYW1vdW50IG9mIHJld2FyZCB0b2tlbiBzZW50CmVtcHR5VG9rZW5SZXdhcmRzOgoJcHJvdG8gMiAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkwMwoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTA0CgkvLyByZXdhcmRUb2tlbklkID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcucmV3YXJkVG9rZW5JZAoJaW50IDE1MwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTA1CgkvLyByZXdhcmRUb2tlbkhlbGRCYWNrID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5yZXdhcmRUb2tlbkhlbGRCYWNrCglpbnQgMjYwCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMSAvLyByZXdhcmRUb2tlbkhlbGRCYWNrOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MDYKCS8vIGFzc2VydChyZXdhcmRUb2tlbklkICE9PSAwLCAidGhpcyB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIGEgcmV3YXJkIHRva2VuIGRlZmluZWQiKQoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0CglpbnQgMAoJIT0KCgkvLyB0aGlzIHZhbGlkYXRvciBkb2Vzbid0IGhhdmUgYSByZXdhcmQgdG9rZW4gZGVmaW5lZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTA3CgkvLyBwb29sT25lQXBwSWQgPSBBcHBJRC5mcm9tVWludDY0KHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkKQoJaW50IDI2OAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MDkKCS8vIHRva2VuUmV3YXJkQmFsID0KCS8vICAgICAgICAgICAgIHBvb2xPbmVBcHBJZC5hZGRyZXNzLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JZCkpIC0gcmV3YXJkVG9rZW5IZWxkQmFjawoJZnJhbWVfZGlnIDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCXBvcAoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0Cglhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKCXBvcAoJZnJhbWVfZGlnIDEgLy8gcmV3YXJkVG9rZW5IZWxkQmFjazogdWludDY0CgktCglmcmFtZV9idXJ5IDMgLy8gdG9rZW5SZXdhcmRCYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkxMwoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5wYXlUb2tlblJld2FyZD4oewoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25JRDogcG9vbE9uZUFwcElkLAoJLy8gICAgICAgICAgICAgbWV0aG9kQXJnczogW3JlY2VpdmVyLCByZXdhcmRUb2tlbklkLCB0b2tlblJld2FyZEJhbF0sCgkvLyAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJbWV0aG9kICJwYXlUb2tlblJld2FyZChhZGRyZXNzLHVpbnQ2NCx1aW50NjQpdm9pZCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTE0CgkvLyBhcHBsaWNhdGlvbklEOiBwb29sT25lQXBwSWQKCWZyYW1lX2RpZyAyIC8vIHBvb2xPbmVBcHBJZDogdWludDY0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MTUKCS8vIG1ldGhvZEFyZ3M6IFtyZWNlaXZlciwgcmV3YXJkVG9rZW5JZCwgdG9rZW5SZXdhcmRCYWxdCglmcmFtZV9kaWcgLTIgLy8gcmVjZWl2ZXI6IEFkZHJlc3MKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklkOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMyAvLyB0b2tlblJld2FyZEJhbDogdWludDY0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MTcKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHBvb2xPbmVBcHBJZC5hZGRyZXNzLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JZCkpID09PSByZXdhcmRUb2tlbkhlbGRCYWNrLAoJLy8gICAgICAgICAgICAgJ2JhbGFuY2Ugb2YgcmVtYWluaW5nIHJld2FyZCB0b2tlbnMgc2hvdWxkIG1hdGNoIHRoZSBoZWxkIGJhY2sgYW1vdW50JywKCS8vICAgICAgICAgKQoJZnJhbWVfZGlnIDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCXBvcAoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0Cglhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKCXBvcAoJZnJhbWVfZGlnIDEgLy8gcmV3YXJkVG9rZW5IZWxkQmFjazogdWludDY0Cgk9PQoKCS8vIGJhbGFuY2Ugb2YgcmVtYWluaW5nIHJld2FyZCB0b2tlbnMgc2hvdWxkIG1hdGNoIHRoZSBoZWxkIGJhY2sgYW1vdW50Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MjEKCS8vIHJldHVybiB0b2tlblJld2FyZEJhbAoJZnJhbWVfZGlnIDMgLy8gdG9rZW5SZXdhcmRCYWw6IHVpbnQ2NAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDMKCXJldHN1YgoKLy8gY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IHZvaWQKY2FsbGVyTXVzdEJlT3duZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDE0CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICB0aGlzLnR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLAoJLy8gICAgICAgICAgICAgJ2NhbiBvbmx5IGJlIGNhbGxlZCBieSB2YWxpZGF0b3Igb3duZXInLAoJLy8gICAgICAgICApCgl0eG4gU2VuZGVyCglpbnQgOAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJPT0KCgkvLyBjYW4gb25seSBiZSBjYWxsZWQgYnkgdmFsaWRhdG9yIG93bmVyCglhc3NlcnQKCXJldHN1YgoKLy8gY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXIodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IHZvaWQKY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDIxCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICB0aGlzLnR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyIHx8CgkvLyAgICAgICAgICAgICAgICAgdGhpcy50eG4uc2VuZGVyID09PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5tYW5hZ2VyLAoJLy8gICAgICAgICAgICAgJ2NhbiBvbmx5IGJlIGNhbGxlZCBieSBvd25lciBvciBtYW5hZ2VyIG9mIHZhbGlkYXRvcicsCgkvLyAgICAgICAgICkKCXR4biBTZW5kZXIKCWludCA4CglpbnQgMzIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0Cgk9PQoJZHVwCglibnogKnNraXBfb3IzCgl0eG4gU2VuZGVyCglpbnQgNDAKCWludCAzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCT09Cgl8fAoKKnNraXBfb3IzOgoJLy8gY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IG93bmVyIG9yIG1hbmFnZXIgb2YgdmFsaWRhdG9yCglhc3NlcnQKCXJldHN1YgoKLy8gdmVyaWZ5UG9vbEtleUNhbGxlcihwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5KTogdm9pZAovLwovLyB2ZXJpZnlQb29sS2V5Q2FsbGVyIHZlcmlmaWVzIHRoZSBwYXNzZWQgaW4ga2V5IChmcm9tIGEgc3Rha2luZyBwb29sIGNhbGxpbmcgdXMgdG8gdXBkYXRlIG1ldHJpY3MpIGlzIHZhbGlkCi8vIGFuZCBtYXRjaGVzIHRoZSBpbmZvcm1hdGlvbiB3ZSBoYXZlIGluIG91ciBzdGF0ZS4gICdGYWtlJyBwb29scyBjb3VsZCBjYWxsIHVzIHRvIHVwZGF0ZSBvdXIgZGF0YSwgYnV0IHRoZXkKLy8gY2FuJ3QgZmFrZSB0aGUgaWRzIGFuZCBtb3N0IGltcG9ydGFudGx5IGFwcGxpY2F0aW9uIGlkKCEpIG9mIHRoZSBjYWxsZXIgdGhhdCBoYXMgdG8gbWF0Y2guCnZlcmlmeVBvb2xLZXlDYWxsZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDM0CgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLmV4aXN0cywgInRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGlzbid0IHZhbGlkIikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cglib3hfbGVuCglzd2FwCglwb3AKCgkvLyB0aGUgc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBpc24ndCB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTAzNQoJLy8gYXNzZXJ0KHBvb2xLZXkucG9vbElkIDw9IE1BWF9QT09MUywgJ3Bvb2wgaWQgbm90IGluIHZhbGlkIHJhbmdlJykKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDI0Cgk8PQoKCS8vIHBvb2wgaWQgbm90IGluIHZhbGlkIHJhbmdlCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDM2CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBwb29sS2V5LnBvb2xJZCA+IDAgJiYgKHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNikgPD0gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLm51bVBvb2xzLAoJLy8gICAgICAgICAgICAgJ3Bvb2wgaWQgb3V0c2lkZSBvZiByYW5nZSBvZiBwb29scyBjcmVhdGVkIGZvciB0aGlzIHZhbGlkYXRvcicsCgkvLyAgICAgICAgICkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDAKCT4KCWR1cAoJYnogKnNraXBfYW5kMwoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMjQyCglpbnQgMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk8PQoJJiYKCipza2lwX2FuZDM6CgkvLyBwb29sIGlkIG91dHNpZGUgb2YgcmFuZ2Ugb2YgcG9vbHMgY3JlYXRlZCBmb3IgdGhpcyB2YWxpZGF0b3IKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNDIKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHBvb2xLZXkucG9vbEFwcElkID09PSB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbcG9vbEtleS5wb29sSWQgLSAxXS5wb29sQXBwSWQsCgkvLyAgICAgICAgICAgICAiVGhlIHBhc3NlZCBpbiBhcHAgaWQgZG9lc24ndCBtYXRjaCB0aGUgcGFzc2VkIGluIGlkcyIsCgkvLyAgICAgICAgICkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk9PQoKCS8vIFRoZSBwYXNzZWQgaW4gYXBwIGlkIGRvZXNuJ3QgbWF0Y2ggdGhlIHBhc3NlZCBpbiBpZHMKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNDcKCS8vIGFzc2VydCh0aGlzLnR4bi5zZW5kZXIgPT09IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLmFkZHJlc3MpCgl0eG4gU2VuZGVyCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAxNiA4CglidG9pCglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCT09Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDQ5CgkvLyBhc3NlcnQocG9vbEtleS5pZCA9PT0gKEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLmdsb2JhbFN0YXRlKCd2YWxpZGF0b3JJZCcpIGFzIHVpbnQ2NCkpCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWJ5dGUgMHg3NjYxNmM2OTY0NjE3NDZmNzI0OTY0IC8vICJ2YWxpZGF0b3JJZCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgndmFsaWRhdG9ySWQnKQoJYXNzZXJ0Cgk9PQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA1MAoJLy8gYXNzZXJ0KHBvb2xLZXkucG9vbElkID09PSAoQXBwSUQuZnJvbVVpbnQ2NChwb29sS2V5LnBvb2xBcHBJZCkuZ2xvYmFsU3RhdGUoJ3Bvb2xJZCcpIGFzIHVpbnQ2NCkpCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWJ5dGUgMHg3MDZmNmY2YzQ5NjQgLy8gInBvb2xJZCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgncG9vbElkJykKCWFzc2VydAoJPT0KCWFzc2VydAoJcmV0c3ViCgovLyByZXZlcmlmeU5GRE93bmVyc2hpcCh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogdm9pZAovLwovLyBUaGlzIG1ldGhvZCB2ZXJpZmllcyB0aGUgb3duZXJzaGlwIG9mIE5GRCAoTmFtZWQgRnVuY3Rpb24gRGF0YSkgYnkgYSB2YWxpZGF0b3IuCi8vIElmIHRoZSBvd25lcnNoaXAgaXMgbm8gbG9uZ2VyIHZhbGlkLCBpdCByZW1vdmVzIHRoZSBORkQgZnJvbSB0aGUgdmFsaWRhdG9yJ3MgY29uZmlndXJhdGlvbi4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3Igd2hvc2UgZGF0YSBzaG91bGQgYmUgcmUtZXZhbHVhdGVkLgpyZXZlcmlmeU5GRE93bmVyc2hpcDoKCXByb3RvIDEgMAoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDYwCgkvLyB2YWxpZGF0b3JDb25maWcgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZwoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJZnJhbWVfYnVyeSAwIC8vIHN0b3JhZ2Uga2V5Ly92YWxpZGF0b3JDb25maWcKCgkvLyAqaWYzMF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNjEKCS8vIHZhbGlkYXRvckNvbmZpZy5uZmRGb3JJbmZvICE9PSAwCglpbnQgNzIKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDAKCSE9CglieiAqaWYzMF9lbmQKCgkvLyAqaWYzMF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDY0CgkvLyBuZmRPd25lciA9IEFwcElELmZyb21VaW50NjQodmFsaWRhdG9yQ29uZmlnLm5mZEZvckluZm8pLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzCglpbnQgNzIKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQodmFsaWRhdG9yQ29uZmlnLm5mZEZvckluZm8pLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCgkvLyAqaWYzMV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNjYKCS8vIHZhbGlkYXRvckNvbmZpZy5vd25lciAhPT0gbmZkT3duZXIgJiYgdmFsaWRhdG9yQ29uZmlnLm1hbmFnZXIgIT09IG5mZE93bmVyCglpbnQgOAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfZGlnIDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCSE9CglkdXAKCWJ6ICpza2lwX2FuZDQKCWludCA0MAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfZGlnIDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCSE9CgkmJgoKKnNraXBfYW5kNDoKCWJ6ICppZjMxX2VuZAoKCS8vICppZjMxX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNjgKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm5mZEZvckluZm8gPSAwCglpbnQgNzIKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKKmlmMzFfZW5kOgoKKmlmMzBfZW5kOgoJcmV0c3ViCgovLyB2YWxpZGF0ZUNvbmZpZyhjb25maWc6IFZhbGlkYXRvckNvbmZpZyk6IHZvaWQKdmFsaWRhdGVDb25maWc6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDc1CgkvLyBhc3NlcnQoY29uZmlnLm93bmVyICE9PSBBZGRyZXNzLnplcm9BZGRyZXNzKQoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDggMzIKCWdsb2JhbCBaZXJvQWRkcmVzcwoJIT0KCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNzYKCS8vIGFzc2VydChjb25maWcubWFuYWdlciAhPT0gQWRkcmVzcy56ZXJvQWRkcmVzcykKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA0MCAzMgoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA3NwoJLy8gYXNzZXJ0KHRoaXMudHhuLnNlbmRlciA9PT0gY29uZmlnLm93bmVyLCAnc2VuZGVyIG11c3QgYmUgb3duZXIgdG8gYWRkIG5ldyB2YWxpZGF0b3InKQoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDggMzIKCT09CgoJLy8gc2VuZGVyIG11c3QgYmUgb3duZXIgdG8gYWRkIG5ldyB2YWxpZGF0b3IKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNzkKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIGNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPj0gR0FUSU5HX1RZUEVfTk9ORSAmJiBjb25maWcuZW50cnlHYXRpbmdUeXBlIDw9IEdBVElOR19UWVBFX0NPTlNUX01BWCwKCS8vICAgICAgICAgICAgICdnYXRpbmcgdHlwZSBub3QgdmFsaWQnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgODAgMQoJYnRvaQoJaW50IDAKCT49CglkdXAKCWJ6ICpza2lwX2FuZDUKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4MCAxCglidG9pCglpbnQgNAoJPD0KCSYmCgoqc2tpcF9hbmQ1OgoJLy8gZ2F0aW5nIHR5cGUgbm90IHZhbGlkCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDgzCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBjb25maWcuZXBvY2hSb3VuZExlbmd0aCA+PSBNSU5fRVBPQ0hfTEVOR1RIICYmIGNvbmZpZy5lcG9jaFJvdW5kTGVuZ3RoIDw9IE1BWF9FUE9DSF9MRU5HVEgsCgkvLyAgICAgICAgICAgICAnZXBvY2ggbGVuZ3RoIG5vdCBpbiBhbGxvd2FibGUgcmFuZ2UnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTY5IDQKCWJ0b2kKCWludCAxCgk+PQoJZHVwCglieiAqc2tpcF9hbmQ2CglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTY5IDQKCWJ0b2kKCWludCAxMDAwMDAwCgk8PQoJJiYKCipza2lwX2FuZDY6CgkvLyBlcG9jaCBsZW5ndGggbm90IGluIGFsbG93YWJsZSByYW5nZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA4NwoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgY29uZmlnLnBlcmNlbnRUb1ZhbGlkYXRvciA+PSBNSU5fUENUX1RPX1ZBTElEQVRPUiAmJiBjb25maWcucGVyY2VudFRvVmFsaWRhdG9yIDw9IE1BWF9QQ1RfVE9fVkFMSURBVE9SLAoJLy8gICAgICAgICAgICAgJ2NvbW1pc3Npb24gcGVyY2VudGFnZSBub3QgdmFsaWQnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTczIDQKCWJ0b2kKCWludCAwCgk+PQoJZHVwCglieiAqc2tpcF9hbmQ3CglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTczIDQKCWJ0b2kKCWludCAxMDAwMDAwCgk8PQoJJiYKCipza2lwX2FuZDc6CgkvLyBjb21taXNzaW9uIHBlcmNlbnRhZ2Ugbm90IHZhbGlkCglhc3NlcnQKCgkvLyAqaWYzMl9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwOTEKCS8vIGNvbmZpZy5wZXJjZW50VG9WYWxpZGF0b3IgIT09IDAKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAxNzMgNAoJYnRvaQoJaW50IDAKCSE9CglieiAqaWYzMl9lbmQKCgkvLyAqaWYzMl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDkyCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgY29uZmlnLnZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzICE9PSBBZGRyZXNzLnplcm9BZGRyZXNzLAoJLy8gICAgICAgICAgICAgICAgICd2YWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyBtdXN0IGJlIHNldCBpZiBwZXJjZW50IHRvIHZhbGlkYXRvciBpcyBub3QgMCcsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTc3IDMyCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CgoJLy8gdmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MgbXVzdCBiZSBzZXQgaWYgcGVyY2VudCB0byB2YWxpZGF0b3IgaXMgbm90IDAKCWFzc2VydAoKKmlmMzJfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA5NwoJLy8gYXNzZXJ0KGNvbmZpZy5taW5FbnRyeVN0YWtlID49IE1JTl9BTEdPX1NUQUtFX1BFUl9QT09MLCAnc3Rha2luZyBwb29sIG11c3QgaGF2ZSBtaW5pbXVtIGVudHJ5IG9mIDEgYWxnbycpCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMjA5IDgKCWJ0b2kKCWludCAxMDAwMDAwCgk+PQoKCS8vIHN0YWtpbmcgcG9vbCBtdXN0IGhhdmUgbWluaW11bSBlbnRyeSBvZiAxIGFsZ28KCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwOTkKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIGNvbmZpZy5wb29sc1Blck5vZGUgPiAwICYmIGNvbmZpZy5wb29sc1Blck5vZGUgPD0gTUFYX1BPT0xTX1BFUl9OT0RFLAoJLy8gICAgICAgICAgICAgJ251bWJlciBvZiBwb29scyBwZXIgbm9kZSBtdXN0IGJlIGJlIGJldHdlZW4gMSBhbmQgdGhlIG1heGltdW0gYWxsb3dlZCBudW1iZXInLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMjI1IDEKCWJ0b2kKCWludCAwCgk+CglkdXAKCWJ6ICpza2lwX2FuZDgKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAyMjUgMQoJYnRvaQoJaW50IDMKCTw9CgkmJgoKKnNraXBfYW5kODoKCS8vIG51bWJlciBvZiBwb29scyBwZXIgbm9kZSBtdXN0IGJlIGJlIGJldHdlZW4gMSBhbmQgdGhlIG1heGltdW0gYWxsb3dlZCBudW1iZXIKCWFzc2VydAoKCS8vICppZjMzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEwMwoJLy8gY29uZmlnLnN1bnNldHRpbmdPbiAhPT0gMAoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDIyNiA4CglidG9pCglpbnQgMAoJIT0KCWJ6ICppZjMzX2VuZAoKCS8vICppZjMzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMDQKCS8vIGFzc2VydChjb25maWcuc3Vuc2V0dGluZ09uID4gZ2xvYmFscy5sYXRlc3RUaW1lc3RhbXAsICdzdW5zZXR0aW5nT24gbXVzdCBiZSBsYXRlciB0aGFuIG5vdyBpZiBzZXQnKQoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDIyNiA4CglidG9pCglnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCgk+CgoJLy8gc3Vuc2V0dGluZ09uIG11c3QgYmUgbGF0ZXIgdGhhbiBub3cgaWYgc2V0Cglhc3NlcnQKCippZjMzX2VuZDoKCXJldHN1YgoKLy8gY2FsbFBvb2xBZGRTdGFrZShzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4sIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXksIG1ickFtdFBhaWQ6IHVpbnQ2NCwgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbGVhbiwgaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sZWFuKTogdm9pZAovLwovLyBBZGRzIGEgc3Rha2VycyBhbW91bnQgb2YgYWxnbyB0byBhIHZhbGlkYXRvciBwb29sLCB0cmFuc2ZlcnJpbmcgdGhlIGFsZ28gd2UgcmVjZWl2ZWQgZnJvbSB0aGVtIChhbHJlYWR5IHZlcmlmaWVkCi8vIGJ5IG91ciBjYWxsZXIpIHRvIHRoZSBzdGFraW5nIHBvb2wgYWNjb3VudCwgYW5kIHRoZW4gdGVsbGluZyBpdCBhYm91dCB0aGUgYW1vdW50IGJlaW5nIGFkZGVkIGZvciB0aGUgc3BlY2lmaWVkCi8vIHN0YWtlci4KLy8KLy8gQHBhcmFtIHtQYXlUeG59IHN0YWtlZEFtb3VudFBheW1lbnQgLSBwYXltZW50IGNvbWluZyBmcm9tIHN0YWtlciB0byBwbGFjZSBpbnRvIGEgcG9vbAovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBUaGUga2V5IG9mIHRoZSB2YWxpZGF0b3IgcG9vbC4KLy8gQHBhcmFtIHt1aW50NjR9IG1ickFtdFBhaWQgLSBBbW91bnQgdGhlIHVzZXIgaXMgbGVhdmluZyBiZWhpbmQgaW4gdGhlIHZhbGlkYXRvciB0byBwYXkgZm9yIHRoZWlyIHN0YWtlciBNQlIgY29zdAovLyBAcGFyYW0ge2Jvb2xlYW59IGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IgLSBpZiB0aGlzIGlzIGEgbmV3LCBmaXJzdC10aW1lIHN0YWtlciB0byB0aGUgdmFsaWRhdG9yCi8vIEBwYXJhbSB7Ym9vbGVhbn0gaXNOZXdTdGFrZXJUb1Byb3RvY29sIC0gaWYgdGhpcyBpcyBhIG5ldywgZmlyc3QtdGltZSBzdGFrZXIgdG8gdGhlIHByb3RvY29sCmNhbGxQb29sQWRkU3Rha2U6Cglwcm90byA1IDAKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiAyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEyNgoJLy8gcG9vbEFwcElkID0gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzW3Bvb2xLZXkucG9vbElkIC0gMV0ucG9vbEFwcElkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIHBvb2xBcHBJZDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEzMAoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5hZGRTdGFrZSwgdWludDY0Pih7CgkvLyAgICAgICAgICAgICBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCksCgkvLyAgICAgICAgICAgICBtZXRob2RBcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gPT09PT09PQoJLy8gICAgICAgICAgICAgICAgIC8vIFRISVMgSVMgQSBTRU5EIG9mIHRoZSBhbW91bnQgcmVjZWl2ZWQgcmlnaHQgYmFjayBvdXQgYW5kIGludG8gdGhlIHN0YWtpbmcgcG9vbCBjb250cmFjdCBhY2NvdW50LgoJLy8gICAgICAgICAgICAgICAgIHsgYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQsIHJlY2VpdmVyOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuYWRkcmVzcyB9LAoJLy8gICAgICAgICAgICAgICAgIC8vID09PT09PT0KCS8vICAgICAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LnNlbmRlciwKCS8vICAgICAgICAgICAgIF0sCgkvLyAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgcGF5CglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEzNQoJLy8gYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJZnJhbWVfZGlnIC0zIC8vIG1ickFtdFBhaWQ6IHVpbnQ2NAoJLQoJaXR4bl9maWVsZCBBbW91bnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTM1CgkvLyByZWNlaXZlcjogQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmFkZHJlc3MKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCWl0eG5fZmllbGQgUmVjZWl2ZXIKCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCWl0eG5fbmV4dAoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAiYWRkU3Rha2UocGF5LGFkZHJlc3MpdWludDY0IgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTMxCgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTMyCgkvLyBtZXRob2RBcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gPT09PT09PQoJLy8gICAgICAgICAgICAgICAgIC8vIFRISVMgSVMgQSBTRU5EIG9mIHRoZSBhbW91bnQgcmVjZWl2ZWQgcmlnaHQgYmFjayBvdXQgYW5kIGludG8gdGhlIHN0YWtpbmcgcG9vbCBjb250cmFjdCBhY2NvdW50LgoJLy8gICAgICAgICAgICAgICAgIHsgYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQsIHJlY2VpdmVyOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuYWRkcmVzcyB9LAoJLy8gICAgICAgICAgICAgICAgIC8vID09PT09PT0KCS8vICAgICAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LnNlbmRlciwKCS8vICAgICAgICAgICAgIF0KCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIFNlbmRlcgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCgkvLyBTdWJtaXQgaW5uZXIgdHJhbnNhY3Rpb24KCWl0eG5fc3VibWl0CglpdHhuIE51bUxvZ3MKCWludCAxCgktCglpdHhuYXMgTG9ncwoJZXh0cmFjdCA0IDAKCWJ0b2kKCgkvLyAqaWYzNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNDAKCS8vIGdsb2JhbHMub3Bjb2RlQnVkZ2V0IDwgNTAwCglnbG9iYWwgT3Bjb2RlQnVkZ2V0CglpbnQgNTAwCgk8CglieiAqaWYzNF9lbmQKCgkvLyAqaWYzNF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTQxCgkvLyBpbmNyZWFzZU9wY29kZUJ1ZGdldCgpCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJaW50IDAKCWl0eG5fZmllbGQgRmVlCglieXRlIGI2NCBDb0VCIC8vICNwcmFnbWEgdmVyc2lvbiAxMDsgaW50IDEKCWR1cAoJaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCWludCBEZWxldGVBcHBsaWNhdGlvbgoJaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KCWl0eG5fc3VibWl0CgoqaWYzNF9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTQ1CgkvLyBwb29sTnVtU3Rha2VycyA9IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgnbnVtU3Rha2VycycpIGFzIHVpbnQ2NAoJZnJhbWVfZGlnIDAgLy8gcG9vbEFwcElkOiB1aW50NjQKCWJ5dGUgMHg2ZTc1NmQ1Mzc0NjE2YjY1NzI3MyAvLyAibnVtU3Rha2VycyIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuZ2xvYmFsU3RhdGUoJ251bVN0YWtlcnMnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDEgLy8gcG9vbE51bVN0YWtlcnM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNDYKCS8vIHBvb2xBbGdvU3Rha2VkID0gQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmdsb2JhbFN0YXRlKCdzdGFrZWQnKSBhcyB1aW50NjQKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglhcHBfZ2xvYmFsX2dldF9leAoKCS8vIGdsb2JhbCBzdGF0ZSB2YWx1ZSBkb2VzIG5vdCBleGlzdDogQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmdsb2JhbFN0YXRlKCdzdGFrZWQnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDIgLy8gcG9vbEFsZ29TdGFrZWQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNDcKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsU3Rha2VycyA9IHBvb2xOdW1TdGFrZXJzIGFzIHVpbnQxNgoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJZnJhbWVfZGlnIDEgLy8gcG9vbE51bVN0YWtlcnM6IHVpbnQ2NAoJaXRvYgoJZXh0cmFjdCA2IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNDgKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCA9IHBvb2xBbGdvU3Rha2VkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJZnJhbWVfZGlnIDIgLy8gcG9vbEFsZ29TdGFrZWQ6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gKmlmMzVfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTUxCgkvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yCglmcmFtZV9kaWcgLTQgLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbGVhbgoJYnogKmlmMzVfZW5kCgoJLy8gKmlmMzVfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE1MgoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsU3Rha2VycyArPSAxCglpbnQgMjQ0CglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWludCAxCgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCippZjM1X2VuZDoKCS8vICppZjM2X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE1NAoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sCglmcmFtZV9kaWcgLTUgLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sZWFuCglieiAqaWYzNl9lbmQKCgkvLyAqaWYzNl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTU1CgkvLyB0aGlzLm51bVN0YWtlcnMudmFsdWUgKz0gMQoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJYXBwX2dsb2JhbF9nZXQKCWludCAxCgkrCglieXRlIDB4NmU3NTZkNTM3NDYxNmI2NTcyNzMgLy8gIm51bVN0YWtlcnMiCglzd2FwCglhcHBfZ2xvYmFsX3B1dAoKKmlmMzZfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE1NwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsQWxnb1N0YWtlZCArPSBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWludCAyNTIKCWR1cAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4bgoJZ3R4bnMgQW1vdW50CglmcmFtZV9kaWcgLTMgLy8gbWJyQW10UGFpZDogdWludDY0CgktCgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTU4CgkvLyB0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSArPSBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCWFwcF9nbG9iYWxfZ2V0CglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBBbW91bnQKCWZyYW1lX2RpZyAtMyAvLyBtYnJBbXRQYWlkOiB1aW50NjQKCS0KCSsKCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCXN3YXAKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIHVwZGF0ZVN0YWtlclBvb2xTZXQoc3Rha2VyOiBBZGRyZXNzLCBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5KTogdm9pZAp1cGRhdGVTdGFrZXJQb29sU2V0OgoJcHJvdG8gMiAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjIKCS8vIGFzc2VydCh0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS5leGlzdHMpCglieXRlIDB4NzM3MDczIC8vICJzcHMiCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE2NAoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDAgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjUKCS8vIGZpcnN0RW1wdHkgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjYKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoKKmZvcl83OgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE2NgoJLy8gaSA8IHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlLmxlbmd0aAoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl83X2VuZAoKCS8vICppZjM3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE2NwoJLy8gcG9vbFNldFtpXSA9PT0gcG9vbEtleQoJZnJhbWVfZGlnIDAgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDI0CglleHRyYWN0MwoJZnJhbWVfZGlnIC0yIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCT09CglieiAqaWYzN19lbmQKCgkvLyAqaWYzN19jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTY5CgkvLyByZXR1cm4KCXJldHN1YgoKKmlmMzdfZW5kOgoJLy8gKmlmMzhfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTcxCgkvLyBmaXJzdEVtcHR5ID09PSAwICYmIHBvb2xTZXRbaV0uaWQgPT09IDAKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDAKCT09CglkdXAKCWJ6ICpza2lwX2FuZDkKCWZyYW1lX2RpZyAwIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgk9PQoJJiYKCipza2lwX2FuZDk6CglieiAqaWYzOF9lbmQKCgkvLyAqaWYzOF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTcyCgkvLyBmaXJzdEVtcHR5ID0gaSArIDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMSAvLyBmaXJzdEVtcHR5OiB1aW50NjQKCippZjM4X2VuZDoKCipmb3JfN19jb250aW51ZToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjYKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzcKCipmb3JfN19lbmQ6CgkvLyAqaWYzOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNzUKCS8vIGZpcnN0RW1wdHkgPT09IDAKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDAKCT09CglieiAqaWYzOV9lbmQKCgkvLyAqaWYzOV9jb25zZXF1ZW50CgkvLyBObyBlbXB0eSBzbG90IGF2YWlsYWJsZSBpbiB0aGUgc3Rha2VyIHBvb2wgc2V0CgllcnIKCippZjM5X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNzgKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlW2ZpcnN0RW1wdHkgLSAxXSA9IHBvb2xLZXkKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDEKCS0KCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyByZW1vdmVGcm9tU3Rha2VyUG9vbFNldChzdGFrZXI6IEFkZHJlc3MsIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkpOiBbYm9vbGVhbiwgYm9vbGVhbl0KLy8KLy8gUmVtb3ZlcyBhIHBvb2wga2V5IGZyb20gdGhlIHN0YWtlcidzIGFjdGl2ZSBwb29sIHNldCAtIGZhaWxzIGlmIG5vdCBmb3VuZCAoISkKLy8KLy8gQHBhcmFtIHtBZGRyZXNzfSBzdGFrZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgc3Rha2VyLgovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBUaGUgcG9vbCBrZXkgdGhleSBzaG91bGQgYmUgc3RvcmVkIGluCi8vCi8vIEByZXR1cm4gW2Jvb2xlYW4sIGJvb2xlYW5dIFtpcyB0aGUgc3Rha2VyIGdvbmUgZnJvbSBBTEwgcG9vbHMgb2YgdGhlIGdpdmVuIFZBTElEQVRPUiwgYW5kIGlzIHN0YWtlciBnb25lIGZyb20gQUxMIHBvb2xzXQpyZW1vdmVGcm9tU3Rha2VyUG9vbFNldDoKCXByb3RvIDIgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTkxCgkvLyBpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAwIC8vIGluU2FtZVZhbGlkYXRvclBvb2xDb3VudDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5MgoJLy8gaW5BbnlQb29sQ291bnQgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAxIC8vIGluQW55UG9vbENvdW50OiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTkzCgkvLyBmb3VuZCA9IGZhbHNlCglpbnQgMAoJZnJhbWVfYnVyeSAyIC8vIGZvdW5kOiBib29sCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5NQoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExOTYKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoKKmZvcl84OgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5NgoJLy8gaSA8IHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlLmxlbmd0aAoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl84X2VuZAoKCS8vICppZjQwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5NwoJLy8gcG9vbFNldFtpXS5pZCA9PT0gMAoJZnJhbWVfZGlnIDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWY0MF9lbmQKCgkvLyAqaWY0MF9jb25zZXF1ZW50CgliICpmb3JfOF9jb250aW51ZQoKKmlmNDBfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwMAoJLy8gaW5BbnlQb29sQ291bnQgKz0gMQoJZnJhbWVfZGlnIDEgLy8gaW5BbnlQb29sQ291bnQ6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMSAvLyBpbkFueVBvb2xDb3VudDogdWludDY0CgoJLy8gKmlmNDFfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjAxCgkvLyBwb29sU2V0W2ldLmlkID09PSBwb29sS2V5LmlkCglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgMAoJKwoJaW50IDgKCWV4dHJhY3QzCglidG9pCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCT09CglieiAqaWY0MV9lbmQKCgkvLyAqaWY0MV9jb25zZXF1ZW50CgkvLyAqaWY0Ml9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDIKCS8vIHBvb2xTZXRbaV0gPT09IHBvb2xLZXkKCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5Cgk9PQoJYnogKmlmNDJfZWxzZQoKCS8vICppZjQyX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDMKCS8vIGZvdW5kID0gdHJ1ZQoJaW50IDEKCWZyYW1lX2J1cnkgMiAvLyBmb3VuZDogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDUKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlW2ldID0geyBpZDogMCwgcG9vbElkOiAwLCBwb29sQXBwSWQ6IDAgfQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJYiAqaWY0Ml9lbmQKCippZjQyX2Vsc2U6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjA3CgkvLyBpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgKz0gMQoJZnJhbWVfZGlnIDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCippZjQyX2VuZDoKCippZjQxX2VuZDoKCipmb3JfOF9jb250aW51ZToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExOTYKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzgKCipmb3JfOF9lbmQ6CgkvLyAqaWY0M19jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMTEKCS8vICFmb3VuZAoJZnJhbWVfZGlnIDIgLy8gZm91bmQ6IGJvb2wKCSEKCWJ6ICppZjQzX2VuZAoKCS8vICppZjQzX2NvbnNlcXVlbnQKCS8vIE5vIG1hdGNoaW5nIHNsb3QgZm91bmQgd2hlbiB0b2xkIHRvIHJlbW92ZSBhIHBvb2wgZnJvbSB0aGUgc3Rha2VycyBzZXQKCWVycgoKKmlmNDNfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIxNQoJLy8gcmV0dXJuIFtpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgPT09IDAsIGluQW55UG9vbENvdW50ID09PSAwXQoJYnl0ZSAweDAwCglpbnQgMAoJZnJhbWVfZGlnIDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCWludCAwCgk9PQoJc2V0Yml0CglpbnQgMQoJZnJhbWVfZGlnIDEgLy8gaW5BbnlQb29sQ291bnQ6IHVpbnQ2NAoJaW50IDAKCT09CglzZXRiaXQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCgkvLyBwb3AgYWxsIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHRoZSBzdGFjawoJcG9wbiA0CglyZXRzdWIKCi8vIGFkZFBvb2xUb05vZGUodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcG9vbEFwcElkOiB1aW50NjQsIG5vZGVOdW06IHVpbnQ2NCk6IHZvaWQKYWRkUG9vbFRvTm9kZToKCXByb3RvIDMgMAoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjE5CgkvLyBub2RlUG9vbEFzc2lnbm1lbnRzID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5ub2RlUG9vbEFzc2lnbm1lbnRzKQoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfYnVyeSAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjIwCgkvLyBtYXhQb29sc1Blck5vZGVGb3JUaGlzVmFsaWRhdG9yID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcucG9vbHNQZXJOb2RlIGFzIHVpbnQ2NAoJaW50IDIyNQoJaW50IDEKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDEgLy8gbWF4UG9vbHNQZXJOb2RlRm9yVGhpc1ZhbGlkYXRvcjogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIyMgoJLy8gYXNzZXJ0KG5vZGVOdW0gPj0gMSAmJiBub2RlTnVtIDw9IE1BWF9OT0RFUywgJ25vZGUgbnVtYmVyIG5vdCBpbiB2YWxpZCByYW5nZScpCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgMQoJPj0KCWR1cAoJYnogKnNraXBfYW5kMTAKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCA4Cgk8PQoJJiYKCipza2lwX2FuZDEwOgoJLy8gbm9kZSBudW1iZXIgbm90IGluIHZhbGlkIHJhbmdlCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI0CgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IG1heFBvb2xzUGVyTm9kZUZvclRoaXNWYWxpZGF0b3I7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzk6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI0CgkvLyBpIDwgbWF4UG9vbHNQZXJOb2RlRm9yVGhpc1ZhbGlkYXRvcgoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglmcmFtZV9kaWcgMSAvLyBtYXhQb29sc1Blck5vZGVGb3JUaGlzVmFsaWRhdG9yOiB1aW50NjQKCTwKCWJ6ICpmb3JfOV9lbmQKCgkvLyAqaWY0NF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMjUKCS8vIG5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbbm9kZU51bSAtIDFdLnBvb2xBcHBJZHNbaV0gPT09IDAKCWZyYW1lX2RpZyAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCWludCAwCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgMQoJLQoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWY0NF9lbmQKCgkvLyAqaWY0NF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI3CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLm5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbbm9kZU51bSAtIDFdLnBvb2xBcHBJZHNbaV0gPSBwb29sQXBwSWQKCWludCA5MDAKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCAxCgktCglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDAKCSsKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJZnJhbWVfZGlnIC0yIC8vIHBvb2xBcHBJZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMjgKCS8vIHJldHVybgoJcmV0c3ViCgoqaWY0NF9lbmQ6CgoqZm9yXzlfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI0CgkvLyBpICs9IDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCWIgKmZvcl85CgoqZm9yXzlfZW5kOgoJLy8gbm8gYXZhaWxhYmxlIHNwYWNlIGluIHNwZWNpZmllZCBub2RlIGZvciB0aGlzIHBvb2wKCWVycgoJcmV0c3ViCgovLyBkb2VzU3Rha2VyTWVldEdhdGluZyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQpOiB2b2lkCi8vCi8vIENoZWNrcyBpZiBhIHN0YWtlciBtZWV0cyB0aGUgZ2F0aW5nIHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgYnkgdGhlIHZhbGlkYXRvci4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWx1ZVRvVmVyaWZ5IC0gVGhlIHZhbHVlIHRvIHZlcmlmeSBhZ2FpbnN0IHRoZSBnYXRpbmcgcmVxdWlyZW1lbnRzLgovLyBAcmV0dXJucyB7dm9pZH0gb3IgYXNzZXJ0cyBpZiByZXF1aXJlbWVudHMgbm90IG1ldC4KZG9lc1N0YWtlck1lZXRHYXRpbmc6Cglwcm90byAyIDAKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA4CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI0MgoJLy8gdHlwZSA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLmVudHJ5R2F0aW5nVHlwZQoJaW50IDgwCglpbnQgMQoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMCAvLyB0eXBlOiB1aW50OAoKCS8vICppZjQ1X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI0MwoJLy8gdHlwZSA9PT0gR0FUSU5HX1RZUEVfTk9ORQoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAwCgk9PQoJYnogKmlmNDVfZW5kCgoJLy8gKmlmNDVfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI0NAoJLy8gcmV0dXJuCglyZXRzdWIKCippZjQ1X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNDYKCS8vIHN0YWtlciA9IHRoaXMudHhuLnNlbmRlcgoJdHhuIFNlbmRlcgoJZnJhbWVfYnVyeSAxIC8vIHN0YWtlcjogYWRkcmVzcwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNDcKCS8vIGNvbmZpZyA9IGNsb25lKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnKQoJaW50IDAKCWludCAyNDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglmcmFtZV9idXJ5IDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCgkvLyAqaWY0Nl9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTEKCS8vIHR5cGUgPT09IEdBVElOR19UWVBFX0FTU0VUU19DUkVBVEVEX0JZIHx8CgkvLyAgICAgICAgICAgICB0eXBlID09PSBHQVRJTkdfVFlQRV9BU1NFVF9JRCB8fAoJLy8gICAgICAgICAgICAgdHlwZSA9PT0gR0FUSU5HX1RZUEVfQ1JFQVRFRF9CWV9ORkRfQUREUkVTU0VTCglmcmFtZV9kaWcgMCAvLyB0eXBlOiB1aW50OAoJaW50IDEKCT09CglkdXAKCWJueiAqc2tpcF9vcjQKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMgoJPT0KCXx8Cgoqc2tpcF9vcjQ6CglkdXAKCWJueiAqc2tpcF9vcjUKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMwoJPT0KCXx8Cgoqc2tpcF9vcjU6CglieiAqaWY0Nl9lbmQKCgkvLyAqaWY0Nl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjU1CgkvLyBhc3NlcnQodmFsdWVUb1ZlcmlmeSAhPT0gMCkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWludCAwCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI1NgoJLy8gYmFsUmVxdWlyZWQgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5nYXRpbmdBc3NldE1pbkJhbGFuY2UKCWludCAxNDUKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAzIC8vIGJhbFJlcXVpcmVkOiB1aW50NjQKCgkvLyAqaWY0N19jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTcKCS8vIGJhbFJlcXVpcmVkID09PSAwCglmcmFtZV9kaWcgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0CglpbnQgMAoJPT0KCWJ6ICppZjQ3X2VuZAoKCS8vICppZjQ3X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTgKCS8vIGJhbFJlcXVpcmVkID0gMQoJaW50IDEKCWZyYW1lX2J1cnkgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0CgoqaWY0N19lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjYwCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgc3Rha2VyLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQodmFsdWVUb1ZlcmlmeSkpID49IGJhbFJlcXVpcmVkLAoJLy8gICAgICAgICAgICAgICAgICdtdXN0IGhhdmUgcmVxdWlyZWQgbWluaW11bSBiYWxhbmNlIG9mIHZhbGlkYXRvciBkZWZpbmVkIHRva2VuIHRvIGFkZCBzdGFrZScsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgMSAvLyBzdGFrZXI6IGFkZHJlc3MKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQoJcG9wCglmcmFtZV9kaWcgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0Cgk+PQoKCS8vIG11c3QgaGF2ZSByZXF1aXJlZCBtaW5pbXVtIGJhbGFuY2Ugb2YgdmFsaWRhdG9yIGRlZmluZWQgdG9rZW4gdG8gYWRkIHN0YWtlCglhc3NlcnQKCippZjQ2X2VuZDoKCS8vICppZjQ4X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI2NQoJLy8gdHlwZSA9PT0gR0FUSU5HX1RZUEVfQVNTRVRTX0NSRUFURURfQlkKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMQoJPT0KCWJ6ICppZjQ4X2VuZAoKCS8vICppZjQ4X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNjYKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICBBc3NldElELmZyb21VaW50NjQodmFsdWVUb1ZlcmlmeSkuY3JlYXRvciA9PT0gY29uZmlnLmVudHJ5R2F0aW5nQWRkcmVzcywKCS8vICAgICAgICAgICAgICAgICAnc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgY3JlYXRlZCBieSBjcmVhdG9yIHRoYXQgdGhlIHZhbGlkYXRvciBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UnLAoJLy8gICAgICAgICAgICAgKQoJZnJhbWVfZGlnIC0yIC8vIHZhbHVlVG9WZXJpZnk6IHVpbnQ2NAoJYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKCXBvcAoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgODEgMzIKCT09CgoJLy8gc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgY3JlYXRlZCBieSBjcmVhdG9yIHRoYXQgdGhlIHZhbGlkYXRvciBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UKCWFzc2VydAoKKmlmNDhfZW5kOgoJLy8gKmlmNDlfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjcxCgkvLyB0eXBlID09PSBHQVRJTkdfVFlQRV9BU1NFVF9JRAoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAyCgk9PQoJYnogKmlmNDlfZW5kCgoJLy8gKmlmNDlfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3MgoJLy8gZm91bmQgPSBmYWxzZQoJaW50IDAKCWZyYW1lX2J1cnkgNCAvLyBmb3VuZDogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNzMKCS8vIGNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0cwoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMTEzIDMyCglkdXAKCWZyYW1lX2J1cnkgNSAvLyBjb3B5IG9mIHRoZSBhcnJheSB3ZSBhcmUgaXRlcmF0aW5nIG92ZXIKCWV4dHJhY3QgMCA4CglidG9pCglmcmFtZV9idXJ5IDYgLy8gYXNzZXRJZDogdWludDY0CglpbnQgMAoJZnJhbWVfYnVyeSA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCgoqZm9yT2ZfMDoKCS8vICppZjUwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3NAoJLy8gdmFsdWVUb1ZlcmlmeSA9PT0gYXNzZXRJZAoJZnJhbWVfZGlnIC0yIC8vIHZhbHVlVG9WZXJpZnk6IHVpbnQ2NAoJZnJhbWVfZGlnIDYgLy8gYXNzZXRJZDogdWludDY0Cgk9PQoJYnogKmlmNTBfZW5kCgoJLy8gKmlmNTBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3NQoJLy8gZm91bmQgPSB0cnVlCglpbnQgMQoJZnJhbWVfYnVyeSA0IC8vIGZvdW5kOiBib29sCgliICpmb3JPZl8wX2VuZAoKKmlmNTBfZW5kOgoKKmZvck9mXzBfY29udGludWU6CgkvLyBpbmNyZW1lbnQgb2Zmc2V0IGFuZCBsb29wIGlmIG5vdCBvdXQgb2YgYm91bmRzCglmcmFtZV9kaWcgNyAvLyB0aGUgb2Zmc2V0IHdlIGFyZSBleHRyYWN0aW5nIHRoZSBuZXh0IGVsZW1lbnQgZnJvbQoJaW50IDgKCSsKCWR1cAoJaW50IDMyIC8vIG9mZnNldCBvZiBsYXN0IGVsZW1lbnQKCTwKCWJ6ICpmb3JPZl8wX2VuZAoJZnJhbWVfYnVyeSA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCglmcmFtZV9kaWcgNSAvLyBjb3B5IG9mIHRoZSBhcnJheSB3ZSBhcmUgaXRlcmF0aW5nIG92ZXIKCWZyYW1lX2RpZyA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCglpbnQgOAoJZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSA2IC8vIGFzc2V0SWQ6IHVpbnQ2NAoJYiAqZm9yT2ZfMAoKKmZvck9mXzBfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3OQoJLy8gYXNzZXJ0KGZvdW5kLCAnc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgaWRlbnRpY2FsIHRvIHRoZSBhc3NldCBpZCBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UnKQoJZnJhbWVfZGlnIDQgLy8gZm91bmQ6IGJvb2wKCgkvLyBzcGVjaWZpZWQgYXNzZXQgbXVzdCBiZSBpZGVudGljYWwgdG8gdGhlIGFzc2V0IGlkIGRlZmluZWQgYXMgYSByZXF1aXJlbWVudCB0byBzdGFrZQoJYXNzZXJ0CgoqaWY0OV9lbmQ6CgkvLyAqaWY1MV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyODEKCS8vIHR5cGUgPT09IEdBVElOR19UWVBFX0NSRUFURURfQllfTkZEX0FERFJFU1NFUwoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAzCgk9PQoJYnogKmlmNTFfZW5kCgoJLy8gKmlmNTFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI4NAoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIHRoaXMuaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0KGNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0c1swXSwgQXNzZXRJRC5mcm9tVWludDY0KHZhbHVlVG9WZXJpZnkpLmNyZWF0b3IpLAoJLy8gICAgICAgICAgICAgICAgICdzcGVjaWZpZWQgYXNzZXQgbXVzdCBiZSBjcmVhdGVkIGJ5IGNyZWF0b3IgdGhhdCBpcyBvbmUgb2YgdGhlIGxpbmtlZCBhZGRyZXNzZXMgaW4gYW4gbmZkJywKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCglwb3AKCWZyYW1lX2RpZyAyIC8vIGNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCglleHRyYWN0IDExMyA4CglidG9pCgljYWxsc3ViIGlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdAoKCS8vIHNwZWNpZmllZCBhc3NldCBtdXN0IGJlIGNyZWF0ZWQgYnkgY3JlYXRvciB0aGF0IGlzIG9uZSBvZiB0aGUgbGlua2VkIGFkZHJlc3NlcyBpbiBhbiBuZmQKCWFzc2VydAoKKmlmNTFfZW5kOgoJLy8gKmlmNTJfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjg5CgkvLyB0eXBlID09PSBHQVRJTkdfVFlQRV9TRUdNRU5UX09GX05GRAoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCA0Cgk9PQoJYnogKmlmNTJfZW5kCgoJLy8gKmlmNTJfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI5MQoJLy8gdXNlck9mZmVyZWRORkRBcHBJRCA9IHZhbHVlVG9WZXJpZnkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWZyYW1lX2J1cnkgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjkyCgkvLyBhc3NlcnQodGhpcy5pc05GREFwcElEVmFsaWQodXNlck9mZmVyZWRORkRBcHBJRCksICdwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZCcpCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWNhbGxzdWIgaXNORkRBcHBJRFZhbGlkCgoJLy8gcHJvdmlkZWQgTkZEIG11c3QgYmUgdmFsaWQKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyOTUKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICByYXdCeXRlcyhBcHBJRC5mcm9tVWludDY0KHVzZXJPZmZlcmVkTkZEQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzKSA9PT0KCS8vICAgICAgICAgICAgICAgICAgICAgcmF3Qnl0ZXMoc3Rha2VyKSB8fCB0aGlzLmlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdCh1c2VyT2ZmZXJlZE5GREFwcElELCBzdGFrZXIpLAoJLy8gICAgICAgICAgICAgICAgICJwcm92aWRlZCBuZmQgZm9yIGVudHJ5IGlzbid0IG93bmVkIG9yIGxpbmtlZCB0byB0aGUgc3Rha2VyIiwKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyA4IC8vIHVzZXJPZmZlcmVkTkZEQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQodXNlck9mZmVyZWRORkRBcHBJRCkuZ2xvYmFsU3RhdGUoJ2kub3duZXIuYScpCglhc3NlcnQKCWZyYW1lX2RpZyAxIC8vIHN0YWtlcjogYWRkcmVzcwoJPT0KCWR1cAoJYm56ICpza2lwX29yNgoJZnJhbWVfZGlnIDEgLy8gc3Rha2VyOiBhZGRyZXNzCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWNhbGxzdWIgaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0Cgl8fAoKKnNraXBfb3I2OgoJLy8gcHJvdmlkZWQgbmZkIGZvciBlbnRyeSBpc24ndCBvd25lZCBvciBsaW5rZWQgdG8gdGhlIHN0YWtlcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMwMgoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIGJ0b2koQXBwSUQuZnJvbVVpbnQ2NCh1c2VyT2ZmZXJlZE5GREFwcElEKS5nbG9iYWxTdGF0ZSgnaS5wYXJlbnRBcHBJRCcpIGFzIGJ5dGVzKSA9PT0KCS8vICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmVudHJ5R2F0aW5nQXNzZXRzWzBdLAoJLy8gICAgICAgICAgICAgICAgICdzcGVjaWZpZWQgbmZkIG11c3QgYmUgYSBzZWdtZW50IG9mIHRoZSBuZmQgdGhlIHZhbGlkYXRvciBzcGVjaWZpZWQgYXMgYSByZXF1aXJlbWVudCcsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWJ5dGUgMHg2OTJlNzA2MTcyNjU2ZTc0NDE3MDcwNDk0NCAvLyAiaS5wYXJlbnRBcHBJRCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHVzZXJPZmZlcmVkTkZEQXBwSUQpLmdsb2JhbFN0YXRlKCdpLnBhcmVudEFwcElEJykKCWFzc2VydAoJYnRvaQoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMTEzIDgKCWJ0b2kKCT09CgoJLy8gc3BlY2lmaWVkIG5mZCBtdXN0IGJlIGEgc2VnbWVudCBvZiB0aGUgbmZkIHRoZSB2YWxpZGF0b3Igc3BlY2lmaWVkIGFzIGEgcmVxdWlyZW1lbnQKCWFzc2VydAoKKmlmNTJfZW5kOgoJcmV0c3ViCgovLyBpc05GREFwcElEVmFsaWQobmZkQXBwSUQ6IHVpbnQ2NCk6IGJvb2xlYW4KLy8KLy8gQ2hlY2tzIGlmIHRoZSBnaXZlbiBORkQgQXBwIGlkIGlzIHZhbGlkLiAgVXNpbmcgb25seSB0aGUgQXBwIGlkIHRoZXJlJ3Mgbm8gdmFsaWRhdGlvbiBhZ2FpbnN0IHRoZSBuYW1lIChpZTogdGhhdCBuZmQgWCBpcyBuYW1lIFkpCi8vIFNvIGl0J3MgYXNzdW1lZCBmb3IgdGhlIGNhbGxlciwgdGhlIGFwcCBpZCBhbG9uZSBpcyBmaW5lLiAgVGhlIG5hbWUgaXMgZmV0Y2hlZCBmcm9tIHRoZSBzcGVjaWZpZWQgYXBwIGlkIGFuZCB0aGUgdHdvCi8vIHRvZ2V0aGVyIGFyZSB1c2VkIGZvciB2YWxpZGl0eSBjaGVjayBjYWxsIHRvIHRoZSBuZmQgcmVnaXN0cnkuCi8vCi8vIEBwYXJhbSB7dWludDY0fSBuZmRBcHBJRCAtIFRoZSBORkQgQXBwIGlkIHRvIHZlcmlmeS4KLy8KLy8gQHJldHVybnMge2Jvb2xlYW59IC0gUmV0dXJucyB0cnVlIGlmIHRoZSBORkQgQXBwIGlkIGlzIHZhbGlkLCBvdGhlcndpc2UgZmFsc2UuCmlzTkZEQXBwSURWYWxpZDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMyMQoJLy8gdXNlck9mZmVyZWRORkROYW1lID0gQXBwSUQuZnJvbVVpbnQ2NChuZmRBcHBJRCkuZ2xvYmFsU3RhdGUoJ2kubmFtZScpIGFzIHN0cmluZwoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWJ5dGUgMHg2OTJlNmU2MTZkNjUgLy8gImkubmFtZSIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KG5mZEFwcElEKS5nbG9iYWxTdGF0ZSgnaS5uYW1lJykKCWFzc2VydAoJZnJhbWVfYnVyeSAwIC8vIHVzZXJPZmZlcmVkTkZETmFtZTogc3RyaW5nCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMyMwoJLy8gcmV0dXJuIHNlbmRNZXRob2RDYWxsPFtzdHJpbmcsIHVpbnQ2NF0sIGJvb2xlYW4+KHsKCS8vICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQodGhpcy5uZmRSZWdpc3RyeUFwcElkKSwKCS8vICAgICAgICAgICAgIG5hbWU6ICdpc1ZhbGlkTmZkQXBwSWQnLAoJLy8gICAgICAgICAgICAgbWV0aG9kQXJnczogW3VzZXJPZmZlcmVkTkZETmFtZSwgbmZkQXBwSURdLAoJLy8gICAgICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAiaXNWYWxpZE5mZEFwcElkKHN0cmluZyx1aW50NjQpYm9vbCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMyNAoJLy8gYXBwbGljYXRpb25JRDogQXBwSUQuZnJvbVVpbnQ2NCh0aGlzLm5mZFJlZ2lzdHJ5QXBwSWQpCglsb2FkIDIwMCAvLyBUTVBMX25mZFJlZ2lzdHJ5QXBwSWQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMjYKCS8vIG1ldGhvZEFyZ3M6IFt1c2VyT2ZmZXJlZE5GRE5hbWUsIG5mZEFwcElEXQoJZnJhbWVfZGlnIDAgLy8gdXNlck9mZmVyZWRORkROYW1lOiBzdHJpbmcKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoJaXR4biBOdW1Mb2dzCglpbnQgMQoJLQoJaXR4bmFzIExvZ3MKCWV4dHJhY3QgNCAwCglpbnQgMAoJZ2V0Yml0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCglyZXRzdWIKCi8vIGlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdChuZmRBcHBJRDogdWludDY0LCBhZGRyVG9GaW5kOiBBZGRyZXNzKTogYm9vbGVhbgovLwovLyBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBhZGRyZXNzIGlzIHByZXNlbnQgaW4gYW4gTkZEcyBsaXN0IG9mIHZlcmlmaWVkIGFkZHJlc3Nlcy4KLy8gVGhlIE5GRCBpcyBhc3N1bWVkIHRvIGhhdmUgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcyBvZmZpY2lhbC4KLy8KLy8gQHBhcmFtIHt1aW50NjR9IG5mZEFwcElEIC0gVGhlIE5GRCBhcHBsaWNhdGlvbiBpZC4KLy8gQHBhcmFtIHtBZGRyZXNzfSBhZGRyVG9GaW5kIC0gVGhlIGFkZHJlc3MgdG8gZmluZCBpbiB0aGUgdi5jYUFsZ28uMC5hcyBwcm9wZXJ0eQovLyBAcmV0dXJuIHtib29sZWFufSAtIGB0cnVlYCBpZiB0aGUgYWRkcmVzcyBpcyBwcmVzZW50LCBgZmFsc2VgIG90aGVyd2lzZS4KaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0OgoJcHJvdG8gMiAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMzkKCS8vIHNlbmRBcHBDYWxsKHsKCS8vICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLAoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25BcmdzOiBbJ3JlYWRfcHJvcGVydHknLCAndi5jYUFsZ28uMC5hcyddLAoJLy8gICAgICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzQwCgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KG5mZEFwcElEKQoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDEKCS8vIGFwcGxpY2F0aW9uQXJnczogWydyZWFkX3Byb3BlcnR5JywgJ3YuY2FBbGdvLjAuYXMnXQoJYnl0ZSAweDcyNjU2MTY0NWY3MDcyNmY3MDY1NzI3NDc5IC8vICJyZWFkX3Byb3BlcnR5IgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWJ5dGUgMHg3NjJlNjM2MTQxNmM2NzZmMmUzMDJlNjE3MyAvLyAidi5jYUFsZ28uMC5hcyIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDMKCS8vIGNhQWxnb0RhdGEgPSB0aGlzLml0eG4ubGFzdExvZwoJaXR4biBMYXN0TG9nCglmcmFtZV9idXJ5IDAgLy8gY2FBbGdvRGF0YTogYnl0ZVtdCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM0NAoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBjYUFsZ29EYXRhLmxlbmd0aDsgaSArPSAzMikKCWludCAwCglmcmFtZV9idXJ5IDEgLy8gaTogdWludDY0CgoqZm9yXzEwOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM0NAoJLy8gaSA8IGNhQWxnb0RhdGEubGVuZ3RoCglmcmFtZV9kaWcgMSAvLyBpOiB1aW50NjQKCWZyYW1lX2RpZyAwIC8vIGNhQWxnb0RhdGE6IGJ5dGVbXQoJbGVuCgk8CglieiAqZm9yXzEwX2VuZAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDUKCS8vIGFkZHIgPSBleHRyYWN0MyhjYUFsZ29EYXRhLCBpLCAzMikKCWZyYW1lX2RpZyAwIC8vIGNhQWxnb0RhdGE6IGJ5dGVbXQoJZnJhbWVfZGlnIDEgLy8gaTogdWludDY0CglpbnQgMzIKCWV4dHJhY3QzCglmcmFtZV9idXJ5IDIgLy8gYWRkcjogYnl0ZVtdCgoJLy8gKmlmNTNfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzQ2CgkvLyBhZGRyICE9PSByYXdCeXRlcyhnbG9iYWxzLnplcm9BZGRyZXNzKSAmJiBhZGRyID09PSByYXdCeXRlcyhhZGRyVG9GaW5kKQoJZnJhbWVfZGlnIDIgLy8gYWRkcjogYnl0ZVtdCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CglkdXAKCWJ6ICpza2lwX2FuZDExCglmcmFtZV9kaWcgMiAvLyBhZGRyOiBieXRlW10KCWZyYW1lX2RpZyAtMiAvLyBhZGRyVG9GaW5kOiBBZGRyZXNzCgk9PQoJJiYKCipza2lwX2FuZDExOgoJYnogKmlmNTNfZW5kCgoJLy8gKmlmNTNfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM0NwoJLy8gcmV0dXJuIHRydWUKCWludCAxCgliICppc0FkZHJlc3NJbk5GRENBQWxnb0xpc3QqcmV0dXJuCgoqaWY1M19lbmQ6CgoqZm9yXzEwX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM0NAoJLy8gaSArPSAzMgoJZnJhbWVfZGlnIDEgLy8gaTogdWludDY0CglpbnQgMzIKCSsKCWZyYW1lX2J1cnkgMSAvLyBpOiB1aW50NjQKCWIgKmZvcl8xMAoKKmZvcl8xMF9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzUwCgkvLyByZXR1cm4gZmFsc2UKCWludCAwCgoqaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0KnJldHVybjoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDIKCXJldHN1YgoKLy8gYWxnb1NhdHVyYXRpb25MZXZlbCgpOiB1aW50NjQKLy8KLy8gUmV0dXJucyB0aGUgbWF4aW11bSBhbGxvd2VkIHN0YWtlIHBlciB2YWxpZGF0b3IgYmFzZWQgb24gYSBwZXJjZW50YWdlIG9mIGFsbCBjdXJyZW50IG9ubGluZSBzdGFrZSBiZWZvcmUKLy8gdGhlIHZhbGlkYXRvciBpcyBjb25zaWRlcmVkIHNhdHVyYXRlZCAtIHdoZXJlIHJld2FyZHMgYXJlIGRpbWluaXNoZWQuCi8vIE5PVEU6IHRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCB0d2ljZSAtIGhlcmUgYW5kIGluIHN0YWtpbmcgcG9vbCBjb250cmFjdC4gIEJvdGggbXVzdCBiZSBpZGVudGljYWwuCmFsZ29TYXR1cmF0aW9uTGV2ZWw6Cglwcm90byAwIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNTkKCS8vIG9ubGluZSA9IHRoaXMuZ2V0Q3VycmVudE9ubGluZVN0YWtlKCkKCWNhbGxzdWIgZ2V0Q3VycmVudE9ubGluZVN0YWtlCglmcmFtZV9idXJ5IDAgLy8gb25saW5lOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzYxCgkvLyByZXR1cm4gd2lkZVJhdGlvKFtvbmxpbmUsIE1BWF9WQUxJREFUT1JfU09GVF9QQ1RfT0ZfT05MSU5FXzFERUNJTUFMXSwgWzEwMDBdKQoJZnJhbWVfZGlnIDAgLy8gb25saW5lOiB1aW50NjQKCWludCAxMDAKCW11bHcKCWludCAwCglpbnQgMTAwMAoJZGl2bW9kdwoJcG9wCglwb3AKCXN3YXAKCSEKCgkvLyB3aWRlUmF0aW8gZmFpbGVkCglhc3NlcnQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gbWF4QWxsb3dlZFN0YWtlKCk6IHVpbnQ2NAovLwovLyBSZXR1cm5zIHRoZSBNQVhJTVVNIGFsbG93ZWQgc3Rha2UgcGVyIHZhbGlkYXRvciBiYXNlZCBvbiBhIHBlcmNlbnRhZ2Ugb2YgYWxsIGN1cnJlbnQgb25saW5lIHN0YWtlLgovLyBBZGRpbmcgc3Rha2UgaXMgY29tcGxldGVseSBibG9ja2VkIGF0IHRoaXMgYW1vdW50LgptYXhBbGxvd2VkU3Rha2U6Cglwcm90byAwIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNjkKCS8vIG9ubGluZSA9IHRoaXMuZ2V0Q3VycmVudE9ubGluZVN0YWtlKCkKCWNhbGxzdWIgZ2V0Q3VycmVudE9ubGluZVN0YWtlCglmcmFtZV9idXJ5IDAgLy8gb25saW5lOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzcxCgkvLyByZXR1cm4gd2lkZVJhdGlvKFtvbmxpbmUsIE1BWF9WQUxJREFUT1JfSEFSRF9QQ1RfT0ZfT05MSU5FXzFERUNJTUFMXSwgWzEwMDBdKQoJZnJhbWVfZGlnIDAgLy8gb25saW5lOiB1aW50NjQKCWludCAxNTAKCW11bHcKCWludCAwCglpbnQgMTAwMAoJZGl2bW9kdwoJcG9wCglwb3AKCXN3YXAKCSEKCgkvLyB3aWRlUmF0aW8gZmFpbGVkCglhc3NlcnQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gbWF4QWxnb0FsbG93ZWRQZXJQb29sKCk6IHVpbnQ2NAovLwovLyBSZXR1cm5zIHRoZSBNQVhJTVVNIGFsbG93ZWQgc3Rha2UgcGVyIHBvb2wgYW5kIHN0aWxsIHJlY2VpdmUgaW5jZW50aXZlcyAtIHdlJ2xsIHRyZWF0IHRoaXMgYXMgdGhlICdtYXggcGVyIHBvb2wnCm1heEFsZ29BbGxvd2VkUGVyUG9vbDoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNzgKCS8vIHJldHVybiBnbG9iYWxzLnBheW91dHNNYXhCYWxhbmNlCglnbG9iYWwgUGF5b3V0c01heEJhbGFuY2UKCXJldHN1YgoKLy8gZ2V0Q3VycmVudE9ubGluZVN0YWtlKCk6IHVpbnQ2NApnZXRDdXJyZW50T25saW5lU3Rha2U6Cglwcm90byAwIDEKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzgyCgkvLyByZXR1cm4gb25saW5lU3Rha2UoKQoJb25saW5lX3N0YWtlCglyZXRzdWIKCi8vIG1pbkJhbGFuY2VGb3JBY2NvdW50KGNvbnRyYWN0czogdWludDY0LCBleHRyYVBhZ2VzOiB1aW50NjQsIGFzc2V0czogdWludDY0LCBsb2NhbEludHM6IHVpbnQ2NCwgbG9jYWxCeXRlczogdWludDY0LCBnbG9iYWxJbnRzOiB1aW50NjQsIGdsb2JhbEJ5dGVzOiB1aW50NjQpOiB1aW50NjQKbWluQmFsYW5jZUZvckFjY291bnQ6Cglwcm90byA3IDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzOTQKCS8vIG1pbkJhbCA9IEFMR09SQU5EX0FDQ09VTlRfTUlOX0JBTEFOQ0UKCWludCAxMDAwMDAKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzOTUKCS8vIG1pbkJhbCArPSBjb250cmFjdHMgKiBBUFBMSUNBVElPTl9CQVNFX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyBjb250cmFjdHM6IHVpbnQ2NAoJaW50IDEwMDAwMAoJKgoJKwoJZnJhbWVfYnVyeSAwIC8vIG1pbkJhbDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM5NgoJLy8gbWluQmFsICs9IGV4dHJhUGFnZXMgKiBBUFBMSUNBVElPTl9CQVNFX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyBleHRyYVBhZ2VzOiB1aW50NjQKCWludCAxMDAwMDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzOTcKCS8vIG1pbkJhbCArPSBhc3NldHMgKiBBU1NFVF9IT0xESU5HX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMyAvLyBhc3NldHM6IHVpbnQ2NAoJaW50IDEwMDAwMAoJKgoJKwoJZnJhbWVfYnVyeSAwIC8vIG1pbkJhbDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM5OAoJLy8gbWluQmFsICs9IGxvY2FsSW50cyAqIFNTQ19WQUxVRV9VSU5UCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoJZnJhbWVfZGlnIC00IC8vIGxvY2FsSW50czogdWludDY0CglpbnQgMjg1MDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzOTkKCS8vIG1pbkJhbCArPSBnbG9iYWxJbnRzICogU1NDX1ZBTFVFX1VJTlQKCWZyYW1lX2RpZyAwIC8vIG1pbkJhbDogdWludDY0CglmcmFtZV9kaWcgLTYgLy8gZ2xvYmFsSW50czogdWludDY0CglpbnQgMjg1MDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDAKCS8vIG1pbkJhbCArPSBsb2NhbEJ5dGVzICogU1NDX1ZBTFVFX0JZVEVTCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoJZnJhbWVfZGlnIC01IC8vIGxvY2FsQnl0ZXM6IHVpbnQ2NAoJaW50IDUwMDAwCgkqCgkrCglmcmFtZV9idXJ5IDAgLy8gbWluQmFsOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDAxCgkvLyBtaW5CYWwgKz0gZ2xvYmFsQnl0ZXMgKiBTU0NfVkFMVUVfQllURVMKCWZyYW1lX2RpZyAwIC8vIG1pbkJhbDogdWludDY0CglmcmFtZV9kaWcgLTcgLy8gZ2xvYmFsQnl0ZXM6IHVpbnQ2NAoJaW50IDUwMDAwCgkqCgkrCglmcmFtZV9idXJ5IDAgLy8gbWluQmFsOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDAyCgkvLyByZXR1cm4gbWluQmFsCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoJcmV0c3ViCgovLyBjb3N0Rm9yQm94U3RvcmFnZSh0b3RhbE51bUJ5dGVzOiB1aW50NjQpOiB1aW50NjQKY29zdEZvckJveFN0b3JhZ2U6Cglwcm90byAxIDEKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDA5CgkvLyByZXR1cm4gU0NCT1hfUEVSQk9YICsgdG90YWxOdW1CeXRlcyAqIFNDQk9YX1BFUkJZVEUKCWludCAyNTAwCglmcmFtZV9kaWcgLTEgLy8gdG90YWxOdW1CeXRlczogdWludDY0CglpbnQgNDAwCgkqCgkrCglyZXRzdWIKCipjcmVhdGVfTm9PcDoKCW1ldGhvZCAiY3JlYXRlQXBwbGljYXRpb24oKXZvaWQiCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAwCgltYXRjaCAqYWJpX3JvdXRlX2NyZWF0ZUFwcGxpY2F0aW9uCgoJLy8gdGhpcyBjb250cmFjdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGdpdmVuIEFCSSBtZXRob2QgZm9yIGNyZWF0ZSBOb09wCgllcnIKCipjYWxsX05vT3A6CgltZXRob2QgImluaXRTdGFraW5nQ29udHJhY3QodWludDY0KXZvaWQiCgltZXRob2QgImxvYWRTdGFraW5nQ29udHJhY3REYXRhKHVpbnQ2NCxieXRlW10pdm9pZCIKCW1ldGhvZCAiZmluYWxpemVTdGFraW5nQ29udHJhY3QoKXZvaWQiCgltZXRob2QgImdhcygpdm9pZCIKCW1ldGhvZCAiZ2V0TWJyQW1vdW50cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCgltZXRob2QgImdldFByb3RvY29sQ29uc3RyYWludHMoKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiZ2V0TnVtVmFsaWRhdG9ycygpdWludDY0IgoJbWV0aG9kICJnZXRWYWxpZGF0b3JDb25maWcodWludDY0KSh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiZ2V0VmFsaWRhdG9yU3RhdGUodWludDY0KSh1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQpIgoJbWV0aG9kICJnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpIgoJbWV0aG9kICJnZXRQb29scyh1aW50NjQpKHVpbnQ2NCx1aW50MTYsdWludDY0KVtdIgoJbWV0aG9kICJnZXRQb29sQXBwSWQodWludDY0LHVpbnQ2NCl1aW50NjQiCgltZXRob2QgImdldFBvb2xJbmZvKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpKHVpbnQ2NCx1aW50MTYsdWludDY0KSIKCW1ldGhvZCAiZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHVpbnQ2NCl1aW50NjQiCgltZXRob2QgImRvZXNTdGFrZXJOZWVkVG9QYXlNQlIoYWRkcmVzcylib29sIgoJbWV0aG9kICJnZXRTdGFrZWRQb29sc0ZvckFjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCx1aW50NjQpW10iCgltZXRob2QgImdldFRva2VuUGF5b3V0UmF0aW8odWludDY0KSh1aW50NjRbMjRdLHVpbnQ2NCkiCgltZXRob2QgImdldE5vZGVQb29sQXNzaWdubWVudHModWludDY0KSgodWludDY0WzNdKVs4XSkiCgltZXRob2QgImdldE5GRFJlZ2lzdHJ5SUQoKXVpbnQ2NCIKCW1ldGhvZCAiYWRkVmFsaWRhdG9yKHBheSxzdHJpbmcsKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIKCW1ldGhvZCAiY2hhbmdlVmFsaWRhdG9yTWFuYWdlcih1aW50NjQsYWRkcmVzcyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQiCgltZXRob2QgImNoYW5nZVZhbGlkYXRvck5GRCh1aW50NjQsdWludDY0LHN0cmluZyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyh1aW50NjQsYWRkcmVzcyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JSZXdhcmRJbmZvKHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0KXZvaWQiCgltZXRob2QgImFkZFBvb2wocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAic2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KSIKCW1ldGhvZCAic3Rha2VVcGRhdGVkVmlhUmV3YXJkcygodWludDY0LHVpbnQ2NCx1aW50NjQpLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIgoJbWV0aG9kICJzdGFrZVJlbW92ZWQoKHVpbnQ2NCx1aW50NjQsdWludDY0KSxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCl2b2lkIgoJbWV0aG9kICJmaW5kUG9vbEZvclN0YWtlcih1aW50NjQsYWRkcmVzcyx1aW50NjQpKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKSIKCW1ldGhvZCAibW92ZVBvb2xUb05vZGUodWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIKCW1ldGhvZCAiZW1wdHlUb2tlblJld2FyZHModWludDY0LGFkZHJlc3MpdWludDY0IgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggKmFiaV9yb3V0ZV9pbml0U3Rha2luZ0NvbnRyYWN0ICphYmlfcm91dGVfbG9hZFN0YWtpbmdDb250cmFjdERhdGEgKmFiaV9yb3V0ZV9maW5hbGl6ZVN0YWtpbmdDb250cmFjdCAqYWJpX3JvdXRlX2dhcyAqYWJpX3JvdXRlX2dldE1ickFtb3VudHMgKmFiaV9yb3V0ZV9nZXRQcm90b2NvbENvbnN0cmFpbnRzICphYmlfcm91dGVfZ2V0TnVtVmFsaWRhdG9ycyAqYWJpX3JvdXRlX2dldFZhbGlkYXRvckNvbmZpZyAqYWJpX3JvdXRlX2dldFZhbGlkYXRvclN0YXRlICphYmlfcm91dGVfZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyICphYmlfcm91dGVfZ2V0UG9vbHMgKmFiaV9yb3V0ZV9nZXRQb29sQXBwSWQgKmFiaV9yb3V0ZV9nZXRQb29sSW5mbyAqYWJpX3JvdXRlX2dldEN1ck1heFN0YWtlUGVyUG9vbCAqYWJpX3JvdXRlX2RvZXNTdGFrZXJOZWVkVG9QYXlNQlIgKmFiaV9yb3V0ZV9nZXRTdGFrZWRQb29sc0ZvckFjY291bnQgKmFiaV9yb3V0ZV9nZXRUb2tlblBheW91dFJhdGlvICphYmlfcm91dGVfZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cyAqYWJpX3JvdXRlX2dldE5GRFJlZ2lzdHJ5SUQgKmFiaV9yb3V0ZV9hZGRWYWxpZGF0b3IgKmFiaV9yb3V0ZV9jaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyICphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyAqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvck5GRCAqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzICphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mbyAqYWJpX3JvdXRlX2FkZFBvb2wgKmFiaV9yb3V0ZV9hZGRTdGFrZSAqYWJpX3JvdXRlX3NldFRva2VuUGF5b3V0UmF0aW8gKmFiaV9yb3V0ZV9zdGFrZVVwZGF0ZWRWaWFSZXdhcmRzICphYmlfcm91dGVfc3Rha2VSZW1vdmVkICphYmlfcm91dGVfZmluZFBvb2xGb3JTdGFrZXIgKmFiaV9yb3V0ZV9tb3ZlUG9vbFRvTm9kZSAqYWJpX3JvdXRlX2VtcHR5VG9rZW5SZXdhcmRzCgoJLy8gdGhpcyBjb250cmFjdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGdpdmVuIEFCSSBtZXRob2QgZm9yIGNhbGwgTm9PcAoJZXJy", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCgovLyBUaGlzIFRFQUwgd2FzIGdlbmVyYXRlZCBieSBURUFMU2NyaXB0IHYwLjEwMy4wCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbGdvcmFuZGZvdW5kYXRpb24vVEVBTFNjcmlwdAoKLy8gVGhpcyBjb250cmFjdCBpcyBjb21wbGlhbnQgd2l0aCBhbmQvb3IgaW1wbGVtZW50cyB0aGUgZm9sbG93aW5nIEFSQ3M6IFsgQVJDNCBdCgovLyBUaGUgZm9sbG93aW5nIGxpbmVzIG9mIFRFQUwgYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0ZW1wbGF0ZSB2YXJpYWJsZXMgaW4gc2NyYXRjaCBzbG90cwpwdXNoYnl0ZXMgVE1QTF9uZmRSZWdpc3RyeUFwcElkCmJ0b2kKc3RvcmUgMjAwCgovLyBUaGUgZm9sbG93aW5nIHRlbiBsaW5lcyBvZiBURUFMIGhhbmRsZSBpbml0aWFsIHByb2dyYW0gZmxvdwovLyBUaGlzIHBhdHRlcm4gaXMgdXNlZCB0byBtYWtlIGl0IGVhc3kgZm9yIGFueW9uZSB0byBwYXJzZSB0aGUgc3RhcnQgb2YgdGhlIHByb2dyYW0gYW5kIGRldGVybWluZSBpZiBhIHNwZWNpZmljIGFjdGlvbiBpcyBhbGxvd2VkCi8vIEhlcmUsIGFjdGlvbiByZWZlcnMgdG8gdGhlIE9uQ29tcGxldGUgaW4gY29tYmluYXRpb24gd2l0aCB3aGV0aGVyIHRoZSBhcHAgaXMgYmVpbmcgY3JlYXRlZCBvciBjYWxsZWQKLy8gRXZlcnkgcG9zc2libGUgYWN0aW9uIGZvciB0aGlzIGNvbnRyYWN0IGlzIHJlcHJlc2VudGVkIGluIHRoZSBzd2l0Y2ggc3RhdGVtZW50Ci8vIElmIHRoZSBhY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIGluIHRoZSBjb250cmFjdCwgaXRzIHJlc3BlY3RpdmUgYnJhbmNoIHdpbGwgYmUgIipOT1RfSU1QTEVNRU5URUQiIHdoaWNoIGp1c3QgY29udGFpbnMgImVyciIKdHhuIEFwcGxpY2F0aW9uSUQKIQppbnQgNgoqCnR4biBPbkNvbXBsZXRpb24KKwpzd2l0Y2ggKmNhbGxfTm9PcCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKmNyZWF0ZV9Ob09wICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRAoKKk5PVF9JTVBMRU1FTlRFRDoKCS8vIFRoZSByZXF1ZXN0ZWQgYWN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIGNvbnRyYWN0LiBBcmUgeW91IHVzaW5nIHRoZSBjb3JyZWN0IE9uQ29tcGxldGU/IERpZCB5b3Ugc2V0IHlvdXIgYXBwIElEPwoJZXJyCgovLyBjcmVhdGVBcHBsaWNhdGlvbigpdm9pZAoqYWJpX3JvdXRlX2NyZWF0ZUFwcGxpY2F0aW9uOgoJLy8gZXhlY3V0ZSBjcmVhdGVBcHBsaWNhdGlvbigpdm9pZAoJY2FsbHN1YiBjcmVhdGVBcHBsaWNhdGlvbgoJaW50IDEKCXJldHVybgoKLy8gY3JlYXRlQXBwbGljYXRpb24oKTogdm9pZApjcmVhdGVBcHBsaWNhdGlvbjoKCXByb3RvIDAgMAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyCgkvLyB0aGlzLnN0YWtpbmdQb29sSW5pdGlhbGl6ZWQudmFsdWUgPSBmYWxzZQoJYnl0ZSAweDY5NmU2OTc0IC8vICJpbml0IgoJaW50IDAKCWJ5dGUgMHgwMAoJaW50IDAKCXVuY292ZXIgMgoJc2V0Yml0CglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgzCgkvLyB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgPSAwCglieXRlIDB4NmU3NTZkNTYgLy8gIm51bVYiCglpbnQgMAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NAoJLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlID0gMAoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJaW50IDAKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODUKCS8vIHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlID0gMAoJYnl0ZSAweDczNzQ2MTZiNjU2NCAvLyAic3Rha2VkIgoJaW50IDAKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIGluaXRTdGFraW5nQ29udHJhY3QodWludDY0KXZvaWQKKmFiaV9yb3V0ZV9pbml0U3Rha2luZ0NvbnRyYWN0OgoJLy8gYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBpbml0U3Rha2luZ0NvbnRyYWN0KHVpbnQ2NCl2b2lkCgljYWxsc3ViIGluaXRTdGFraW5nQ29udHJhY3QKCWludCAxCglyZXR1cm4KCi8vIGluaXRTdGFraW5nQ29udHJhY3QoYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0KTogdm9pZAppbml0U3Rha2luZ0NvbnRyYWN0OgoJcHJvdG8gMSAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTAKCS8vIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uY3JlYXRlKGFwcHJvdmFsUHJvZ3JhbVNpemUpCglieXRlIDB4NzA2ZjZmNmM1NDY1NmQ3MDZjNjE3NDY1NDE3MDcwNzI2Zjc2NjE2YzQyNzk3NDY1NzMgLy8gInBvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMiCglmcmFtZV9kaWcgLTEgLy8gYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0Cglib3hfY3JlYXRlCglwb3AKCXJldHN1YgoKLy8gbG9hZFN0YWtpbmdDb250cmFjdERhdGEodWludDY0LGJ5dGVbXSl2b2lkCiphYmlfcm91dGVfbG9hZFN0YWtpbmdDb250cmFjdERhdGE6CgkvLyBkYXRhOiBieXRlW10KCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWV4dHJhY3QgMiAwCgoJLy8gb2Zmc2V0OiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGxvYWRTdGFraW5nQ29udHJhY3REYXRhKHVpbnQ2NCxieXRlW10pdm9pZAoJY2FsbHN1YiBsb2FkU3Rha2luZ0NvbnRyYWN0RGF0YQoJaW50IDEKCXJldHVybgoKLy8gbG9hZFN0YWtpbmdDb250cmFjdERhdGEob2Zmc2V0OiB1aW50NjQsIGRhdGE6IGJ5dGVzKTogdm9pZApsb2FkU3Rha2luZ0NvbnRyYWN0RGF0YToKCXByb3RvIDIgMAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk0CgkvLyBhc3NlcnQoIXRoaXMuc3Rha2luZ1Bvb2xJbml0aWFsaXplZC52YWx1ZSkKCWJ5dGUgMHg2OTZlNjk3NCAvLyAiaW5pdCIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMAoJZ2V0Yml0CgkhCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5NQoJLy8gdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5yZXBsYWNlKG9mZnNldCwgZGF0YSkKCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWZyYW1lX2RpZyAtMSAvLyBvZmZzZXQ6IHVpbnQ2NAoJZnJhbWVfZGlnIC0yIC8vIGRhdGE6IGJ5dGVzCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdCgpdm9pZAoqYWJpX3JvdXRlX2ZpbmFsaXplU3Rha2luZ0NvbnRyYWN0OgoJLy8gZXhlY3V0ZSBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdCgpdm9pZAoJY2FsbHN1YiBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdAoJaW50IDEKCXJldHVybgoKLy8gZmluYWxpemVTdGFraW5nQ29udHJhY3QoKTogdm9pZApmaW5hbGl6ZVN0YWtpbmdDb250cmFjdDoKCXByb3RvIDAgMAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk5CgkvLyB0aGlzLnN0YWtpbmdQb29sSW5pdGlhbGl6ZWQudmFsdWUgPSB0cnVlCglieXRlIDB4Njk2ZTY5NzQgLy8gImluaXQiCglpbnQgMQoJYnl0ZSAweDAwCglpbnQgMAoJdW5jb3ZlciAyCglzZXRiaXQKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIGdhcygpdm9pZAoqYWJpX3JvdXRlX2dhczoKCS8vIGV4ZWN1dGUgZ2FzKCl2b2lkCgljYWxsc3ViIGdhcwoJaW50IDEKCXJldHVybgoKLy8gZ2FzKCk6IHZvaWQKLy8KLy8gZ2FzIGlzIGEgZHVtbXkgbm8tb3AgY2FsbCB0aGF0IGNhbiBiZSB1c2VkIHRvIHBvb2wtdXAgcmVzb3VyY2UgcmVmZXJlbmNlcyBhbmQgb3Bjb2RlIGNvc3QKZ2FzOgoJcHJvdG8gMCAwCglyZXRzdWIKCi8vIGdldE1ickFtb3VudHMoKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0TWJyQW1vdW50czoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXRNYnJBbW91bnRzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0TWJyQW1vdW50cygpOiBNYnJBbW91bnRzCi8vCi8vIFJldHVybnMgdGhlIE1CUiBhbW91bnRzIG5lZWRlZCBmb3IgdmFyaW91cyBhY3Rpb25zOgovLyBbCi8vIGFkZFZhbGlkYXRvck1icjogdWludDY0IC0gbWJyIG5lZWRlZCB0byBhZGQgYSBuZXcgdmFsaWRhdG9yIC0gcGFpZCB0byB2YWxpZGF0b3IgY29udHJhY3QKLy8gYWRkUG9vbE1icjogdWludDY0IC0gbWJyIG5lZWRlZCB0byBhZGQgYSBuZXcgcG9vbCAtIHBhaWQgdG8gdmFsaWRhdG9yCi8vIHBvb2xJbml0TWJyOiB1aW50NjQgLSBtYnIgbmVlZGVkIHRvIGluaXRTdG9yYWdlKCkgb2YgcG9vbCAtIHBhaWQgdG8gcG9vbCBpdHNlbGYKLy8gYWRkU3Rha2VyTWJyOiB1aW50NjQgLSBtYnIgc3Rha2VyIG5lZWRzIHRvIGFkZCB0byBmaXJzdCBzdGFraW5nIHBheW1lbnQgKHN0YXlzIHcvIHZhbGlkYXRvcikKLy8gXQpnZXRNYnJBbW91bnRzOgoJcHJvdG8gMCAxCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5CgkvLyByZXR1cm4gewoJLy8gICAgICAgICAgICAgYWRkVmFsaWRhdG9yTWJyOiB0aGlzLmNvc3RGb3JCb3hTdG9yYWdlKDEgLyogdiBwcmVmaXggKi8gKyBsZW48VmFsaWRhdG9ySWRUeXBlPigpICsgbGVuPFZhbGlkYXRvckluZm8+KCkpLAoJLy8gICAgICAgICAgICAgYWRkUG9vbE1icjogdGhpcy5taW5CYWxhbmNlRm9yQWNjb3VudCgKCS8vICAgICAgICAgICAgICAgICAxLAoJLy8gICAgICAgICAgICAgICAgIC8vIHdlIGNvdWxkIGNhbGN1bGF0ZSB0aGlzIGRpcmVjdGx5IGJ5IHJlZmVyZW5jaW5nIHRoZSBzaXplIG9mIHN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtIGJ1dCBpdCB3b3VsZAoJLy8gICAgICAgICAgICAgICAgIC8vIG1lYW4gb3VyIGNhbGxlcnMgd291bGQgaGF2ZSB0byByZWZlcmVuY2UgdGhlIGJveCBBTkQgYnV5IHVwIGkvbyAtIHNvIGp1c3QgZ28gbWF4IG9uIGV4dHJhIHBhZ2VzCgkvLyAgICAgICAgICAgICAgICAgMywKCS8vICAgICAgICAgICAgICAgICAwLAoJLy8gICAgICAgICAgICAgICAgIDAsCgkvLyAgICAgICAgICAgICAgICAgMCwKCS8vICAgICAgICAgICAgICAgICBTdGFraW5nUG9vbC5zY2hlbWEuZ2xvYmFsLm51bVVpbnQsCgkvLyAgICAgICAgICAgICAgICAgU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1CeXRlU2xpY2UsCgkvLyAgICAgICAgICAgICApLAoJLy8gICAgICAgICAgICAgcG9vbEluaXRNYnI6CgkvLyAgICAgICAgICAgICAgICAgQUxHT1JBTkRfQUNDT1VOVF9NSU5fQkFMQU5DRSArCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5jb3N0Rm9yQm94U3RvcmFnZSg3IC8qICdzdGFrZXJzJyBuYW1lICovICsgbGVuPFN0YWtlZEluZm8+KCkgKiBNQVhfU1RBS0VSU19QRVJfUE9PTCksCgkvLyAgICAgICAgICAgICBhZGRTdGFrZXJNYnI6CgkvLyAgICAgICAgICAgICAgICAgLy8gaG93IG11Y2ggdG8gY2hhcmdlIGZvciBmaXJzdCB0aW1lIGEgc3Rha2VyIGFkZHMgc3Rha2UgLSBzaW5jZSB3ZSBhZGQgYSB0cmFja2luZyBib3ggcGVyIHN0YWtlcgoJLy8gICAgICAgICAgICAgICAgIHRoaXMuY29zdEZvckJveFN0b3JhZ2UoCgkvLyAgICAgICAgICAgICAgICAgICAgIDMgLyogJ3NwcycgcHJlZml4ICovICsgbGVuPEFkZHJlc3M+KCkgKyBsZW48VmFsaWRhdG9yUG9vbEtleT4oKSAqIE1BWF9QT09MU19QRVJfU1RBS0VSLAoJLy8gICAgICAgICAgICAgICAgICksIC8vIHNpemUgb2Yga2V5ICsgYWxsIHZhbHVlcwoJLy8gICAgICAgICB9CglpbnQgMTEwMQoJY2FsbHN1YiBjb3N0Rm9yQm94U3RvcmFnZQoJaXRvYgoJaW50IDMKCWludCAxMQoJaW50IDAKCWR1cG4gMgoJaW50IDMKCWludCAxCgljYWxsc3ViIG1pbkJhbGFuY2VGb3JBY2NvdW50CglpdG9iCgljb25jYXQKCWludCAxMDAwMDAKCWludCAxMjgwNwoJY2FsbHN1YiBjb3N0Rm9yQm94U3RvcmFnZQoJKwoJaXRvYgoJY29uY2F0CglpbnQgMTc5CgljYWxsc3ViIGNvc3RGb3JCb3hTdG9yYWdlCglpdG9iCgljb25jYXQKCXJldHN1YgoKLy8gZ2V0UHJvdG9jb2xDb25zdHJhaW50cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0UHJvdG9jb2xDb25zdHJhaW50czoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXRQcm90b2NvbENvbnN0cmFpbnRzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWNhbGxzdWIgZ2V0UHJvdG9jb2xDb25zdHJhaW50cwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFByb3RvY29sQ29uc3RyYWludHMoKTogQ29uc3RyYWludHMKLy8KLy8gUmV0dXJucyB0aGUgcHJvdG9jb2wgY29uc3RyYWludHMgc28gdGhhdCBVSXMgY2FuIGxpbWl0IHdoYXQgdXNlcnMgc3BlY2lmeSBmb3IgdmFsaWRhdG9yIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KZ2V0UHJvdG9jb2xDb25zdHJhaW50czoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0NwoJLy8gcmV0dXJuIHsKCS8vICAgICAgICAgICAgIGVwb2NoUGF5b3V0Um91bmRzTWluOiBNSU5fRVBPQ0hfTEVOR1RILAoJLy8gICAgICAgICAgICAgZXBvY2hQYXlvdXRSb3VuZHNNYXg6IE1BWF9FUE9DSF9MRU5HVEgsCgkvLyAgICAgICAgICAgICBtaW5QY3RUb1ZhbGlkYXRvcldGb3VyRGVjaW1hbHM6IE1JTl9QQ1RfVE9fVkFMSURBVE9SLAoJLy8gICAgICAgICAgICAgbWF4UGN0VG9WYWxpZGF0b3JXRm91ckRlY2ltYWxzOiBNQVhfUENUX1RPX1ZBTElEQVRPUiwKCS8vICAgICAgICAgICAgIG1pbkVudHJ5U3Rha2U6IE1JTl9BTEdPX1NUQUtFX1BFUl9QT09MLAoJLy8gICAgICAgICAgICAgbWF4QWxnb1BlclBvb2w6IHRoaXMubWF4QWxnb0FsbG93ZWRQZXJQb29sKCksCgkvLyAgICAgICAgICAgICBtYXhBbGdvUGVyVmFsaWRhdG9yOiB0aGlzLm1heEFsbG93ZWRTdGFrZSgpLAoJLy8gICAgICAgICAgICAgYW10Q29uc2lkZXJlZFNhdHVyYXRlZDogdGhpcy5hbGdvU2F0dXJhdGlvbkxldmVsKCksCgkvLyAgICAgICAgICAgICBtYXhOb2RlczogTUFYX05PREVTLAoJLy8gICAgICAgICAgICAgbWF4UG9vbHNQZXJOb2RlOiBNQVhfUE9PTFNfUEVSX05PREUsCgkvLyAgICAgICAgICAgICBtYXhTdGFrZXJzUGVyUG9vbDogTUFYX1NUQUtFUlNfUEVSX1BPT0wsCgkvLyAgICAgICAgIH0KCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDBmNDI0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGY0MjQwMDAwMDAwMDAwMDBmNDI0MAoJY2FsbHN1YiBtYXhBbGdvQWxsb3dlZFBlclBvb2wKCWl0b2IKCWNvbmNhdAoJY2FsbHN1YiBtYXhBbGxvd2VkU3Rha2UKCWl0b2IKCWNvbmNhdAoJY2FsbHN1YiBhbGdvU2F0dXJhdGlvbkxldmVsCglpdG9iCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDA4Cgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAzCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMGM4Cgljb25jYXQKCXJldHN1YgoKLy8gZ2V0TnVtVmFsaWRhdG9ycygpdWludDY0CiphYmlfcm91dGVfZ2V0TnVtVmFsaWRhdG9yczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXROdW1WYWxpZGF0b3JzKCl1aW50NjQKCWNhbGxzdWIgZ2V0TnVtVmFsaWRhdG9ycwoJaXRvYgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldE51bVZhbGlkYXRvcnMoKTogdWludDY0Ci8vCi8vIFJldHVybnMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHZhbGlkYXRvcnMKZ2V0TnVtVmFsaWRhdG9yczoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE2NwoJLy8gcmV0dXJuIHRoaXMubnVtVmFsaWRhdG9ycy52YWx1ZQoJYnl0ZSAweDZlNzU2ZDU2IC8vICJudW1WIgoJYXBwX2dsb2JhbF9nZXQKCXJldHN1YgoKLy8gZ2V0VmFsaWRhdG9yQ29uZmlnKHVpbnQ2NCkodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKKmFiaV9yb3V0ZV9nZXRWYWxpZGF0b3JDb25maWc6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFZhbGlkYXRvckNvbmZpZyh1aW50NjQpKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCgljYWxsc3ViIGdldFZhbGlkYXRvckNvbmZpZwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvckNvbmZpZyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogVmFsaWRhdG9yQ29uZmlnCmdldFZhbGlkYXRvckNvbmZpZzoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE3MgoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnCglpbnQgMAoJaW50IDI0MgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCXJldHN1YgoKLy8gZ2V0VmFsaWRhdG9yU3RhdGUodWludDY0KSh1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0VmFsaWRhdG9yU3RhdGU6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFZhbGlkYXRvclN0YXRlKHVpbnQ2NCkodWludDE2LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBnZXRWYWxpZGF0b3JTdGF0ZQoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvclN0YXRlKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBWYWxpZGF0b3JDdXJTdGF0ZQpnZXRWYWxpZGF0b3JTdGF0ZToKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE3NwoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUKCWludCAyNDIgLy8gaGVhZE9mZnNldAoJaW50IDI2CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpCiphYmlfcm91dGVfZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpCgljYWxsc3ViIGdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcih2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogW0FkZHJlc3MsIEFkZHJlc3NdCmdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcjoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE4MgoJLy8gcmV0dXJuIFsKCS8vICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLAoJLy8gICAgICAgICAgICAgdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWFuYWdlciwKCS8vICAgICAgICAgXQoJaW50IDgKCWludCAzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWludCA0MAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJY29uY2F0CglyZXRzdWIKCi8vIGdldFBvb2xzKHVpbnQ2NCkodWludDY0LHVpbnQxNix1aW50NjQpW10KKmFiaV9yb3V0ZV9nZXRQb29sczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0UG9vbHModWludDY0KSh1aW50NjQsdWludDE2LHVpbnQ2NClbXQoJY2FsbHN1YiBnZXRQb29scwoJZHVwCglsZW4KCWludCAxOAoJLwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFBvb2xzKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBQb29sSW5mb1tdCi8vCi8vIFJldHVybiBsaXN0IG9mIGFsbCBwb29scyBmb3IgdGhpcyB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWxpZGF0b3JJZAovLyBAcmV0dXJuIHtQb29sSW5mb1tdfSAtIGFycmF5IG9mIHBvb2xzCi8vIE5vdCBjYWxsYWJsZSBmcm9tIG90aGVyIGNvbnRyYWN0cyBiZWNhdXNlID4xSyByZXR1cm4gYnV0IGNhbiBiZSBjYWxsZWQgdy8gc2ltdWxhdGUgd2hpY2ggYnVtcHMgbG9nIHJldHVybnMKZ2V0UG9vbHM6Cglwcm90byAxIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiAyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk2CgkvLyByZXREYXRhOiBQb29sSW5mb1tdID0gW10KCWJ5dGUgMHgKCWZyYW1lX2J1cnkgMCAvLyByZXREYXRhOiBQb29sSW5mb1tdCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk3CgkvLyBwb29sU2V0ID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29scykKCWludCAyNjggLy8gaGVhZE9mZnNldAoJaW50IDQzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWZyYW1lX2J1cnkgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE5OAoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBwb29sU2V0Lmxlbmd0aDsgaSArPSAxKQoJaW50IDAKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCipmb3JfMDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE5OAoJLy8gaSA8IHBvb2xTZXQubGVuZ3RoCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCAyNAoJPAoJYnogKmZvcl8wX2VuZAoKCS8vICppZjBfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxOTkKCS8vIHBvb2xTZXRbaV0ucG9vbEFwcElkID09PSAwCglmcmFtZV9kaWcgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWYwX2VuZAoKCS8vICppZjBfY29uc2VxdWVudAoJYiAqZm9yXzBfZW5kCgoqaWYwX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIwMwoJLy8gcmV0RGF0YS5wdXNoKHBvb2xTZXRbaV0pCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBQb29sSW5mb1tdCglmcmFtZV9kaWcgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDE4CglleHRyYWN0MwoJY29uY2F0CglmcmFtZV9idXJ5IDAgLy8gcmV0RGF0YTogUG9vbEluZm9bXQoKKmZvcl8wX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk4CgkvLyBpICs9IDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCWIgKmZvcl8wCgoqZm9yXzBfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjA1CgkvLyByZXR1cm4gcmV0RGF0YQoJZnJhbWVfZGlnIDAgLy8gcmV0RGF0YTogUG9vbEluZm9bXQoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDIKCXJldHN1YgoKLy8gZ2V0UG9vbEFwcElkKHVpbnQ2NCx1aW50NjQpdWludDY0CiphYmlfcm91dGVfZ2V0UG9vbEFwcElkOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBwb29sSWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJYnRvaQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFBvb2xBcHBJZCh1aW50NjQsdWludDY0KXVpbnQ2NAoJY2FsbHN1YiBnZXRQb29sQXBwSWQKCWl0b2IKCWNvbmNhdAoJbG9nCglpbnQgMQoJcmV0dXJuCgovLyBnZXRQb29sQXBwSWQodmFsaWRhdG9ySWQ6IHVpbnQ2NCwgcG9vbElkOiB1aW50NjQpOiB1aW50NjQKLy8KLy8gZ2V0UG9vbEFwcElkIGlzIHVzZWZ1bCBmb3IgY2FsbGVycyB0byBkZXRlcm1pbmUgYXBwIHRvIGNhbGwgZm9yIHJlbW92aW5nIHN0YWtlIGlmIHRoZXkgZG9uJ3QgaGF2ZSBzdGFraW5nIG9yCi8vIHdhbnQgdG8gZ2V0IHN0YWtlciBsaXN0IGZvciBhbiBhY2NvdW50LiAgVGhlIHN0YWtpbmcgcG9vbCBhbHNvIHVzZXMgaXQgdG8gZ2V0IHRoZSBhcHAgaWQgb2Ygc3Rha2luZyBwb29sIDEKLy8gKHdoaWNoIGNvbnRhaW5zIHJld2FyZCB0b2tlbnMgaWYgYmVpbmcgdXNlZCkgc28gdGhhdCB0aGUgYW1vdW50IGF2YWlsYWJsZSBjYW4gYmUgZGV0ZXJtaW5lZC4KZ2V0UG9vbEFwcElkOgoJcHJvdG8gMiAxCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjE1CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBwb29sSWQgIT09IDAgJiYgcG9vbElkIDw9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHMubGVuZ3RoLAoJLy8gICAgICAgICAgICAgJ3Bvb2wgaWQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIG51bWJlciBvZiBwb29scyBmb3IgdGhpcyB2YWxpZGF0b3InLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTIgLy8gcG9vbElkOiB1aW50NjQKCWludCAwCgkhPQoJZHVwCglieiAqc2tpcF9hbmQwCglmcmFtZV9kaWcgLTIgLy8gcG9vbElkOiB1aW50NjQKCWludCAyNAoJPD0KCSYmCgoqc2tpcF9hbmQwOgoJLy8gcG9vbCBpZCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgbnVtYmVyIG9mIHBvb2xzIGZvciB0aGlzIHZhbGlkYXRvcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjE5CgkvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1twb29sSWQgLSAxXS5wb29sQXBwSWQKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0yIC8vIHBvb2xJZDogdWludDY0CglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCXJldHN1YgoKLy8gZ2V0UG9vbEluZm8oKHVpbnQ2NCx1aW50NjQsdWludDY0KSkodWludDY0LHVpbnQxNix1aW50NjQpCiphYmlfcm91dGVfZ2V0UG9vbEluZm86CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHBvb2xLZXk6ICh1aW50NjQsdWludDY0LHVpbnQ2NCkKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWR1cAoJbGVuCglpbnQgMjQKCT09CgoJLy8gYXJndW1lbnQgMCAocG9vbEtleSkgZm9yIGdldFBvb2xJbmZvIG11c3QgYmUgYSAodWludDY0LHVpbnQ2NCx1aW50NjQpCglhc3NlcnQKCgkvLyBleGVjdXRlIGdldFBvb2xJbmZvKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpKHVpbnQ2NCx1aW50MTYsdWludDY0KQoJY2FsbHN1YiBnZXRQb29sSW5mbwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFBvb2xJbmZvKHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkpOiBQb29sSW5mbwpnZXRQb29sSW5mbzoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIyNAoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRDdXJNYXhTdGFrZVBlclBvb2wodWludDY0KXVpbnQ2NAoqYWJpX3JvdXRlX2dldEN1ck1heFN0YWtlUGVyUG9vbDoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHVpbnQ2NCl1aW50NjQKCWNhbGxzdWIgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sCglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiB1aW50NjQKLy8KLy8gQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIHN0YWtlIHBlciBwb29sIGZvciBhIGdpdmVuIHZhbGlkYXRvci4KLy8gTm9ybWFsbHkgdGhpcyB3b3VsZCBiZSBtYXhBbGdvUGVyUG9vbCwgYnV0IGl0IHNob3VsZCBhbHNvIG5ldmVyIGdvIGFib3ZlIE1heEFsbG93ZWRTdGFrZSAvIG51bVBvb2xzIHNvCi8vIGFzIHBvb2xzIGFyZSBhZGRlZCB0aGUgbWF4IGFsbG93ZWQgcGVyIHBvb2wgY2FuIHJlZHVjZS4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCmdldEN1ck1heFN0YWtlUGVyUG9vbDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzYKCS8vIG51bVBvb2xzID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyBhcyB1aW50NjQKCWludCAyNDIKCWludCAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIG51bVBvb2xzOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzcKCS8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzID0gdGhpcy5tYXhBbGxvd2VkU3Rha2UoKSAvIG51bVBvb2xzCgljYWxsc3ViIG1heEFsbG93ZWRTdGFrZQoJZnJhbWVfZGlnIDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoJLwoJZnJhbWVfYnVyeSAxIC8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzgKCS8vIG1heFBlclBvb2w6IHVpbnQ2NCA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1heEFsZ29QZXJQb29sCglpbnQgMjE3CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCgkvLyAqaWYxX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjM5CgkvLyBtYXhQZXJQb29sID09PSAwCglmcmFtZV9kaWcgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCWludCAwCgk9PQoJYnogKmlmMV9lbmQKCgkvLyAqaWYxX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI0MAoJLy8gbWF4UGVyUG9vbCA9IHRoaXMubWF4QWxnb0FsbG93ZWRQZXJQb29sKCkKCWNhbGxzdWIgbWF4QWxnb0FsbG93ZWRQZXJQb29sCglmcmFtZV9idXJ5IDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoqaWYxX2VuZDoKCS8vICppZjJfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNDIKCS8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzIDwgbWF4UGVyUG9vbAoJZnJhbWVfZGlnIDEgLy8gaGFyZE1heERpdmlkZWRCZXR3ZWVuUG9vbHM6IHVpbnQ2NAoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8CglieiAqaWYyX2VuZAoKCS8vICppZjJfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjQzCgkvLyBtYXhQZXJQb29sID0gaGFyZE1heERpdmlkZWRCZXR3ZWVuUG9vbHMKCWZyYW1lX2RpZyAxIC8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzOiB1aW50NjQKCWZyYW1lX2J1cnkgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCippZjJfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjQ1CgkvLyByZXR1cm4gbWF4UGVyUG9vbAoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCgoJLy8gcG9wIGFsbCBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUgc3RhY2sKCXBvcG4gMgoJcmV0c3ViCgovLyBkb2VzU3Rha2VyTmVlZFRvUGF5TUJSKGFkZHJlc3MpYm9vbAoqYWJpX3JvdXRlX2RvZXNTdGFrZXJOZWVkVG9QYXlNQlI6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHN0YWtlcjogYWRkcmVzcwoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZHVwCglsZW4KCWludCAzMgoJPT0KCgkvLyBhcmd1bWVudCAwIChzdGFrZXIpIGZvciBkb2VzU3Rha2VyTmVlZFRvUGF5TUJSIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBleGVjdXRlIGRvZXNTdGFrZXJOZWVkVG9QYXlNQlIoYWRkcmVzcylib29sCgljYWxsc3ViIGRvZXNTdGFrZXJOZWVkVG9QYXlNQlIKCWJ5dGUgMHgwMAoJaW50IDAKCXVuY292ZXIgMgoJc2V0Yml0Cgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZG9lc1N0YWtlck5lZWRUb1BheU1CUihzdGFrZXI6IEFkZHJlc3MpOiBib29sZWFuCi8vCi8vIEhlbHBlciBjYWxsZXJzIGNhbiBjYWxsIHcvIHNpbXVsYXRlIHRvIGRldGVybWluZSBpZiAnQWRkU3Rha2VyJyBNQlIgc2hvdWxkIGJlIGluY2x1ZGVkIHcvIHN0YWtpbmcgYW1vdW50Ci8vIEBwYXJhbSBzdGFrZXIKZG9lc1N0YWtlck5lZWRUb1BheU1CUjoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI1NAoJLy8gcmV0dXJuICF0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS5leGlzdHMKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZXI6IEFkZHJlc3MKCWNvbmNhdAoJYm94X2xlbgoJc3dhcAoJcG9wCgkhCglyZXRzdWIKCi8vIGdldFN0YWtlZFBvb2xzRm9yQWNjb3VudChhZGRyZXNzKSh1aW50NjQsdWludDY0LHVpbnQ2NClbXQoqYWJpX3JvdXRlX2dldFN0YWtlZFBvb2xzRm9yQWNjb3VudDoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gc3Rha2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKHN0YWtlcikgZm9yIGdldFN0YWtlZFBvb2xzRm9yQWNjb3VudCBtdXN0IGJlIGEgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBnZXRTdGFrZWRQb29sc0ZvckFjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCx1aW50NjQpW10KCWNhbGxzdWIgZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50CglkdXAKCWxlbgoJaW50IDI0CgkvCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0Cgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50KHN0YWtlcjogQWRkcmVzcyk6IFZhbGlkYXRvclBvb2xLZXlbXQovLwovLyBSZXRyaWV2ZXMgdGhlIHN0YWtlZCBwb29scyBmb3IgYW4gYWNjb3VudC4KLy8KLy8gQHBhcmFtIHtBZGRyZXNzfSBzdGFrZXIgLSBUaGUgYWNjb3VudCB0byByZXRyaWV2ZSBzdGFrZWQgcG9vbHMgZm9yLgovLyBAcmV0dXJuIHtWYWxpZGF0b3JQb29sS2V5W119IC0gVGhlIGFycmF5IG9mIHN0YWtlZCBwb29scyBmb3IgdGhlIGFjY291bnQuCmdldFN0YWtlZFBvb2xzRm9yQWNjb3VudDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyAqaWYzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjY1CgkvLyAhdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikuZXhpc3RzCglieXRlIDB4NzM3MDczIC8vICJzcHMiCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoJIQoJYnogKmlmM19lbmQKCgkvLyAqaWYzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2NgoJLy8gcmV0dXJuIFtdCglieXRlIDB4CgliICpnZXRTdGFrZWRQb29sc0ZvckFjY291bnQqcmV0dXJuCgoqaWYzX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2OAoJLy8gcmV0RGF0YTogVmFsaWRhdG9yUG9vbEtleVtdID0gW10KCWJ5dGUgMHgKCWZyYW1lX2J1cnkgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjkKCS8vIHBvb2xTZXQgPSBjbG9uZSh0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZSkKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZXI6IEFkZHJlc3MKCWNvbmNhdAoJYm94X2dldAoKCS8vIGJveCB2YWx1ZSBkb2VzIG5vdCBleGlzdDogdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUKCWFzc2VydAoJZnJhbWVfYnVyeSAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzAKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgcG9vbFNldC5sZW5ndGg7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzE6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzAKCS8vIGkgPCBwb29sU2V0Lmxlbmd0aAoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl8xX2VuZAoKCS8vICppZjRfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzEKCS8vIHBvb2xTZXRbaV0uaWQgIT09IDAKCWZyYW1lX2RpZyAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgkhPQoJYnogKmlmNF9lbmQKCgkvLyAqaWY0X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI3MgoJLy8gcmV0RGF0YS5wdXNoKHBvb2xTZXRbaV0pCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCWZyYW1lX2RpZyAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWNvbmNhdAoJZnJhbWVfYnVyeSAwIC8vIHJldERhdGE6IFZhbGlkYXRvclBvb2xLZXlbXQoKKmlmNF9lbmQ6CgoqZm9yXzFfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzAKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzEKCipmb3JfMV9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzUKCS8vIHJldHVybiByZXREYXRhCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCipnZXRTdGFrZWRQb29sc0ZvckFjY291bnQqcmV0dXJuOgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCgoJLy8gcG9wIGFsbCBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUgc3RhY2sKCXBvcG4gMgoJcmV0c3ViCgovLyBnZXRUb2tlblBheW91dFJhdGlvKHVpbnQ2NCkodWludDY0WzI0XSx1aW50NjQpCiphYmlfcm91dGVfZ2V0VG9rZW5QYXlvdXRSYXRpbzoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KQoJY2FsbHN1YiBnZXRUb2tlblBheW91dFJhdGlvCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0VG9rZW5QYXlvdXRSYXRpbyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogUG9vbFRva2VuUGF5b3V0UmF0aW8KLy8KLy8gUmV0cmlldmVzIHRoZSB0b2tlbiBwYXlvdXQgcmF0aW8gZm9yIGEgZ2l2ZW4gdmFsaWRhdG9yIC0gcmV0dXJuaW5nIHRoZSBwb29sIHJhdGlvcyBvZiB3aG9sZSBzbyB0aGF0IHRva2VuCi8vIHBheW91dHMgYWNyb3NzIHBvb2xzIGNhbiBiZSBiYXNlZCBvbiBhIHN0YWJsZSBzbmFwaG9zdCBvZiBzdGFrZS4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEByZXR1cm4ge1Bvb2xUb2tlblBheW91dFJhdGlvfSAtIFRoZSB0b2tlbiBwYXlvdXQgcmF0aW8gZm9yIHRoZSB2YWxpZGF0b3IuCmdldFRva2VuUGF5b3V0UmF0aW86Cglwcm90byAxIDEKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyODcKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCXJldHN1YgoKLy8gZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cyh1aW50NjQpKCh1aW50NjRbM10pWzhdKQoqYWJpX3JvdXRlX2dldE5vZGVQb29sQXNzaWdubWVudHM6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldE5vZGVQb29sQXNzaWdubWVudHModWludDY0KSgodWludDY0WzNdKVs4XSkKCWNhbGxzdWIgZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldE5vZGVQb29sQXNzaWdubWVudHModmFsaWRhdG9ySWQ6IHVpbnQ2NCk6IE5vZGVQb29sQXNzaWdubWVudENvbmZpZwpnZXROb2RlUG9vbEFzc2lnbm1lbnRzOgoJcHJvdG8gMSAxCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjkyCgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS5leGlzdHMsICJ0aGUgc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBkb2Vzbid0IGV4aXN0IikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoKCS8vIHRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGRvZXNuJ3QgZXhpc3QKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI5NAoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUubm9kZVBvb2xBc3NpZ25tZW50cwoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRORkRSZWdpc3RyeUlEKCl1aW50NjQKKmFiaV9yb3V0ZV9nZXRORkRSZWdpc3RyeUlEOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBleGVjdXRlIGdldE5GRFJlZ2lzdHJ5SUQoKXVpbnQ2NAoJY2FsbHN1YiBnZXRORkRSZWdpc3RyeUlECglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0TkZEUmVnaXN0cnlJRCgpOiB1aW50NjQKZ2V0TkZEUmVnaXN0cnlJRDoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI5OQoJLy8gcmV0dXJuIHRoaXMubmZkUmVnaXN0cnlBcHBJZAoJbG9hZCAyMDAgLy8gVE1QTF9uZmRSZWdpc3RyeUFwcElkCglyZXRzdWIKCi8vIGFkZFZhbGlkYXRvcihwYXksc3RyaW5nLCh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KSl1aW50NjQKKmFiaV9yb3V0ZV9hZGRWYWxpZGF0b3I6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIGNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDI0MgoJPT0KCgkvLyBhcmd1bWVudCAwIChjb25maWcpIGZvciBhZGRWYWxpZGF0b3IgbXVzdCBiZSBhICh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KQoJYXNzZXJ0CgoJLy8gbmZkTmFtZTogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglleHRyYWN0IDIgMAoKCS8vIG1iclBheW1lbnQ6IHBheQoJdHhuIEdyb3VwSW5kZXgKCWludCAxCgktCglkdXAKCWd0eG5zIFR5cGVFbnVtCglpbnQgcGF5Cgk9PQoKCS8vIGFyZ3VtZW50IDIgKG1iclBheW1lbnQpIGZvciBhZGRWYWxpZGF0b3IgbXVzdCBiZSBhIHBheSB0cmFuc2FjdGlvbgoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBhZGRWYWxpZGF0b3IocGF5LHN0cmluZywodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkpdWludDY0CgljYWxsc3ViIGFkZFZhbGlkYXRvcgoJaXRvYgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFZhbGlkYXRvcihtYnJQYXltZW50OiBQYXlUeG4sIG5mZE5hbWU6IHN0cmluZywgY29uZmlnOiBWYWxpZGF0b3JDb25maWcpOiB1aW50NjQKLy8KLy8gQWRkcyBhIG5ldyB2YWxpZGF0b3IKLy8gUmVxdWlyZXMgYXQgbGVhc3QgMTAgQUxHTyBhcyB0aGUgJ2ZlZScgZm9yIHRoZSB0cmFuc2FjdGlvbiB0byBoZWxwIGRpc3N1YWRlIHNwYW1tZWQgdmFsaWRhdG9yIGFkZHMuCi8vCi8vIEBwYXJhbSB7UGF5VHhufSBtYnJQYXltZW50IHBheW1lbnQgZnJvbSBjYWxsZXIgd2hpY2ggY292ZXJzIG1iciBpbmNyZWFzZSBvZiBuZXcgdmFsaWRhdG9yIHN0b3JhZ2UKLy8gQHBhcmFtIHtzdHJpbmd9IG5mZE5hbWUgKE9wdGlvbmFsKSBOYW1lIG9mIG5mZCAodXNlZCBhcyBkb3VibGUtY2hlY2sgYWdhaW5zdCBpZCBzcGVjaWZpZWQgaW4gY29uZmlnKQovLyBAcGFyYW0ge1ZhbGlkYXRvckNvbmZpZ30gY29uZmlnIFZhbGlkYXRvckNvbmZpZyBzdHJ1Y3QKLy8gQHJldHVybnMge3VpbnQ2NH0gdmFsaWRhdG9yIGlkCmFkZFZhbGlkYXRvcjoKCXByb3RvIDMgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzExCgkvLyB0aGlzLnZhbGlkYXRlQ29uZmlnKGNvbmZpZykKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJY2FsbHN1YiB2YWxpZGF0ZUNvbmZpZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxMwoJLy8gdmVyaWZ5UGF5VHhuKG1iclBheW1lbnQsIHsgcmVjZWl2ZXI6IHRoaXMuYXBwLmFkZHJlc3MsIGFtb3VudDogdGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkVmFsaWRhdG9yTWJyIH0pCgkvLyB2ZXJpZnkgcmVjZWl2ZXIKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIFJlY2VpdmVyCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6InJlY2VpdmVyIiwiZXhwZWN0ZWQiOiJ0aGlzLmFwcC5hZGRyZXNzIn0KCWFzc2VydAoKCS8vIHZlcmlmeSBhbW91bnQKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCglleHRyYWN0IDAgOAoJYnRvaQoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6ImFtb3VudCIsImV4cGVjdGVkIjoidGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkVmFsaWRhdG9yTWJyIn0KCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxNQoJLy8gYXNzZXJ0KG1iclBheW1lbnQuZmVlID4gMTAgKiAxMDAwMDAwLCAnZmVlIG11c3QgYmUgMTAgQUxHTyBvciBtb3JlIHRvIHByZXZlbnQgc3BhbW1pbmcgb2YgdmFsaWRhdG9ycycpCglmcmFtZV9kaWcgLTEgLy8gbWJyUGF5bWVudDogUGF5VHhuCglndHhucyBGZWUKCWludCAxMDAwMDAwMAoJPgoKCS8vIGZlZSBtdXN0IGJlIDEwIEFMR08gb3IgbW9yZSB0byBwcmV2ZW50IHNwYW1taW5nIG9mIHZhbGlkYXRvcnMKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxOAoJLy8gdmFsaWRhdG9ySWQgPSB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgKyAxCglieXRlIDB4NmU3NTZkNTYgLy8gIm51bVYiCglhcHBfZ2xvYmFsX2dldAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzE5CgkvLyB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgPSB2YWxpZGF0b3JJZAoJYnl0ZSAweDZlNzU2ZDU2IC8vICJudW1WIgoJZnJhbWVfZGlnIDAgLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMjEKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkuY3JlYXRlKCkKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJaW50IDEwOTIKCWJveF9jcmVhdGUKCXBvcAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMyMgoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcgPSBjb25maWcKCWludCAwCglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMjMKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLmlkID0gdmFsaWRhdG9ySWQKCWludCAwCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gKmlmNV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMyNgoJLy8gY29uZmlnLm5mZEZvckluZm8gIT09IDAKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA3MiA4CglidG9pCglpbnQgMAoJIT0KCWJ6ICppZjVfZW5kCgoJLy8gKmlmNV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMjgKCS8vIGFzc2VydCh0aGlzLmlzTkZEQXBwSURWYWxpZChjb25maWcubmZkRm9ySW5mbyksICdwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZCcpCglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgNzIgOAoJYnRvaQoJY2FsbHN1YiBpc05GREFwcElEVmFsaWQKCgkvLyBwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzMwCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgdGhpcy50eG4uc2VuZGVyID09PSAoQXBwSUQuZnJvbVVpbnQ2NChjb25maWcubmZkRm9ySW5mbykuZ2xvYmFsU3RhdGUoJ2kub3duZXIuYScpIGFzIEFkZHJlc3MpLAoJLy8gICAgICAgICAgICAgICAgICdJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXInLAoJLy8gICAgICAgICAgICAgKQoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIC0zIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDcyIDgKCWJ0b2kKCWJ5dGUgMHg2OTJlNmY3NzZlNjU3MjJlNjEgLy8gImkub3duZXIuYSIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KGNvbmZpZy5uZmRGb3JJbmZvKS5nbG9iYWxTdGF0ZSgnaS5vd25lci5hJykKCWFzc2VydAoJPT0KCgkvLyBJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXIKCWFzc2VydAoKKmlmNV9lbmQ6CgkvLyAqaWY2X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzM2CgkvLyBjb25maWcuZW50cnlHYXRpbmdUeXBlID09PSBHQVRJTkdfVFlQRV9DUkVBVEVEX0JZX05GRF9BRERSRVNTRVMgfHwKCS8vICAgICAgICAgICAgIGNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX1NFR01FTlRfT0ZfTkZECglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgODAgMQoJYnRvaQoJaW50IDMKCT09CglkdXAKCWJueiAqc2tpcF9vcjAKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4MCAxCglidG9pCglpbnQgNAoJPT0KCXx8Cgoqc2tpcF9vcjA6CglieiAqaWY2X2VuZAoKCS8vICppZjZfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzQwCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5pc05GREFwcElEVmFsaWQoY29uZmlnLmVudHJ5R2F0aW5nQXNzZXRzWzBdKSwKCS8vICAgICAgICAgICAgICAgICAncHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZEJywKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAxMTMgOAoJYnRvaQoJY2FsbHN1YiBpc05GREFwcElEVmFsaWQKCgkvLyBwcm92aWRlZCBORkQgQXBwIGlkIGZvciBnYXRpbmcgbXVzdCBiZSB2YWxpZCBORkQKCWFzc2VydAoKKmlmNl9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNDUKCS8vIHRoaXMucmV0aU9QX2FkZGVkVmFsaWRhdG9yLmxvZyh7IGlkOiB2YWxpZGF0b3JJZCwgb3duZXI6IGNvbmZpZy5vd25lciwgbWFuYWdlcjogY29uZmlnLm1hbmFnZXIgfSkKCWJ5dGUgMHhhOGRkMjFjYiAvLyByZXRpT1BfYWRkZWRWYWxpZGF0b3IodWludDY0LGFkZHJlc3MsYWRkcmVzcykKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4IDMyCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA0MCAzMgoJY29uY2F0Cgljb25jYXQKCWxvZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM0NgoJLy8gcmV0dXJuIHZhbGlkYXRvcklkCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvck1hbmFnZXIodWludDY0LGFkZHJlc3Mpdm9pZAoqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvck1hbmFnZXI6CgkvLyBtYW5hZ2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKG1hbmFnZXIpIGZvciBjaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyKHVpbnQ2NCxhZGRyZXNzKXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yTWFuYWdlcgoJaW50IDEKCXJldHVybgoKLy8gY2hhbmdlVmFsaWRhdG9yTWFuYWdlcih2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBtYW5hZ2VyOiBBZGRyZXNzKTogdm9pZAovLwovLyBDaGFuZ2VzIHRoZSBWYWxpZGF0b3IgbWFuYWdlciBmb3IgYSBzcGVjaWZpYyBWYWxpZGF0b3IgaWQuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gY2hhbmdlIHRoZSBtYW5hZ2VyIGZvci4KLy8gQHBhcmFtIHtBZGRyZXNzfSBtYW5hZ2VyIC0gVGhlIG5ldyBtYW5hZ2VyIGFkZHJlc3MuCmNoYW5nZVZhbGlkYXRvck1hbmFnZXI6Cglwcm90byAyIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNTcKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM1OAoJLy8gYXNzZXJ0KG1hbmFnZXIgIT09IGdsb2JhbHMuemVyb0FkZHJlc3MsICduZWVkcyB0byBhdCBsZWFzdCBiZSB2YWxpZCBhZGRyZXNzJykKCWZyYW1lX2RpZyAtMiAvLyBtYW5hZ2VyOiBBZGRyZXNzCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CgoJLy8gbmVlZHMgdG8gYXQgbGVhc3QgYmUgdmFsaWQgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzU5CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5tYW5hZ2VyID0gbWFuYWdlcgoJaW50IDQwCglmcmFtZV9kaWcgLTIgLy8gbWFuYWdlcjogQWRkcmVzcwoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCXJldHN1YgoKLy8gY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyh1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkCiphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbzoKCS8vIHN1bnNldHRpbmdUbzogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglidG9pCgoJLy8gc3Vuc2V0dGluZ09uOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbwoJaW50IDEKCXJldHVybgoKLy8gY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBzdW5zZXR0aW5nT246IHVpbnQ2NCwgc3Vuc2V0dGluZ1RvOiBWYWxpZGF0b3JJZFR5cGUpOiB2b2lkCi8vCi8vIFVwZGF0ZXMgdGhlIHN1bnNldCBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiB2YWxpZGF0b3IuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gdXBkYXRlLgovLyBAcGFyYW0ge3VpbnQ2NH0gc3Vuc2V0dGluZ09uIC0gVGhlIG5ldyBzdW5zZXQgdGltZXN0YW1wLgovLyBAcGFyYW0ge3VpbnQ2NH0gc3Vuc2V0dGluZ1RvIC0gVGhlIG5ldyBzdW5zZXQgdG8gdmFsaWRhdG9yIGlkLgpjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvOgoJcHJvdG8gMyAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzcxCgkvLyB0aGlzLmNhbGxlck11c3RCZU93bmVyKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgY2FsbGVyTXVzdEJlT3duZXIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNzIKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnN1bnNldHRpbmdPbiA9IHN1bnNldHRpbmdPbgoJaW50IDIyNgoJZnJhbWVfZGlnIC0yIC8vIHN1bnNldHRpbmdPbjogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM3MwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcuc3Vuc2V0dGluZ1RvID0gc3Vuc2V0dGluZ1RvCglpbnQgMjM0CglmcmFtZV9kaWcgLTMgLy8gc3Vuc2V0dGluZ1RvOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvck5GRCh1aW50NjQsdWludDY0LHN0cmluZyl2b2lkCiphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yTkZEOgoJLy8gbmZkTmFtZTogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglleHRyYWN0IDIgMAoKCS8vIG5mZEFwcElEOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JORkQodWludDY0LHVpbnQ2NCxzdHJpbmcpdm9pZAoJY2FsbHN1YiBjaGFuZ2VWYWxpZGF0b3JORkQKCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvck5GRCh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBuZmRBcHBJRDogdWludDY0LCBuZmROYW1lOiBzdHJpbmcpOiB2b2lkCi8vCi8vIENoYW5nZXMgdGhlIE5GRCBmb3IgYSB2YWxpZGF0b3IgaW4gdGhlIHZhbGlkYXRvckxpc3QgY29udHJhY3QuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gdXBkYXRlLgovLyBAcGFyYW0ge3VpbnQ2NH0gbmZkQXBwSUQgLSBUaGUgYXBwbGljYXRpb24gaWQgb2YgdGhlIE5GRCB0byBhc3NpZ24gdG8gdGhlIHZhbGlkYXRvci4KLy8gQHBhcmFtIHtzdHJpbmd9IG5mZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgTkZEICh3aGljaCBtdXN0IG1hdGNoKQpjaGFuZ2VWYWxpZGF0b3JORkQ6Cglwcm90byAzIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozODUKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM4NwoJLy8gYXNzZXJ0KHRoaXMuaXNORkRBcHBJRFZhbGlkKG5mZEFwcElEKSwgJ3Byb3ZpZGVkIE5GRCBtdXN0IGJlIHZhbGlkJykKCWZyYW1lX2RpZyAtMiAvLyBuZmRBcHBJRDogdWludDY0CgljYWxsc3ViIGlzTkZEQXBwSURWYWxpZAoKCS8vIHByb3ZpZGVkIE5GRCBtdXN0IGJlIHZhbGlkCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozODkKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHRoaXMudHhuLnNlbmRlciA9PT0gKEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzKSwKCS8vICAgICAgICAgICAgICdJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXInLAoJLy8gICAgICAgICApCgl0eG4gU2VuZGVyCglmcmFtZV9kaWcgLTIgLy8gbmZkQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKQoJYXNzZXJ0Cgk9PQoKCS8vIElmIHNwZWNpZnlpbmcgTkZELCBhY2NvdW50IGFkZGluZyB2YWxpZGF0b3IgbXVzdCBiZSBvd25lcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzkzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5uZmRGb3JJbmZvID0gbmZkQXBwSUQKCWludCA3MgoJZnJhbWVfZGlnIC0yIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHVpbnQ2NCxhZGRyZXNzKXZvaWQKKmFiaV9yb3V0ZV9jaGFuZ2VWYWxpZGF0b3JDb21taXNzaW9uQWRkcmVzczoKCS8vIGNvbW1pc3Npb25BZGRyZXNzOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKGNvbW1pc3Npb25BZGRyZXNzKSBmb3IgY2hhbmdlVmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MgbXVzdCBiZSBhIGFkZHJlc3MKCWFzc2VydAoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHVpbnQ2NCxhZGRyZXNzKXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MKCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIGNvbW1pc3Npb25BZGRyZXNzOiBBZGRyZXNzKTogdm9pZAovLwovLyBDaGFuZ2UgdGhlIGNvbW1pc3Npb24gYWRkcmVzcyB0aGF0IHZhbGlkYXRvciByZXdhcmRzIGFyZSBzZW50IHRvLgovLyBbIE9OTFkgT1dORVIgQ0FOIENIQU5HRSBdCmNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzOgoJcHJvdG8gMiAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDAxCgkvLyB0aGlzLmNhbGxlck11c3RCZU93bmVyKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgY2FsbGVyTXVzdEJlT3duZXIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MDIKCS8vIGFzc2VydChjb21taXNzaW9uQWRkcmVzcyAhPT0gQWRkcmVzcy56ZXJvQWRkcmVzcykKCWZyYW1lX2RpZyAtMiAvLyBjb21taXNzaW9uQWRkcmVzczogQWRkcmVzcwoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDAzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy52YWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyA9IGNvbW1pc3Npb25BZGRyZXNzCglpbnQgMTc3CglmcmFtZV9kaWcgLTIgLy8gY29tbWlzc2lvbkFkZHJlc3M6IEFkZHJlc3MKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8odWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQpdm9pZAoqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvclJld2FyZEluZm86CgkvLyBSZXdhcmRQZXJQYXlvdXQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgoJYnRvaQoKCS8vIEdhdGluZ0Fzc2V0TWluQmFsYW5jZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyA1CglidG9pCgoJLy8gRW50cnlHYXRpbmdBc3NldHM6IHVpbnQ2NFs0XQoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAoJZHVwCglsZW4KCWludCAzMgoJPT0KCgkvLyBhcmd1bWVudCAyIChFbnRyeUdhdGluZ0Fzc2V0cykgZm9yIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8gbXVzdCBiZSBhIHVpbnQ2NFs0XQoJYXNzZXJ0CgoJLy8gRW50cnlHYXRpbmdBZGRyZXNzOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDMgKEVudHJ5R2F0aW5nQWRkcmVzcykgZm9yIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8gbXVzdCBiZSBhIGFkZHJlc3MKCWFzc2VydAoKCS8vIEVudHJ5R2F0aW5nVHlwZTogdWludDgKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMQoJPT0KCgkvLyBhcmd1bWVudCA0IChFbnRyeUdhdGluZ1R5cGUpIGZvciBjaGFuZ2VWYWxpZGF0b3JSZXdhcmRJbmZvIG11c3QgYmUgYSB1aW50OAoJYXNzZXJ0CglidG9pCgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mbyh1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCl2b2lkCgljYWxsc3ViIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8KCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8odmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgRW50cnlHYXRpbmdUeXBlOiB1aW50OCwgRW50cnlHYXRpbmdBZGRyZXNzOiBBZGRyZXNzLCBFbnRyeUdhdGluZ0Fzc2V0czogU3RhdGljQXJyYXk8dWludDY0LCA0PiwgR2F0aW5nQXNzZXRNaW5CYWxhbmNlOiB1aW50NjQsIFJld2FyZFBlclBheW91dDogdWludDY0KTogdm9pZAovLwovLyBBbGxvdyB0aGUgYWRkaXRpb25hbCByZXdhcmRzIChnYXRpbmcgZW50cnksIGFkZGl0aW9uYWwgdG9rZW4gcmV3YXJkcykgaW5mb3JtYXRpb24gYmUgY2hhbmdlZCBhdCB3aWxsLgovLyBbIE9OTFkgT1dORVIgQ0FOIENIQU5HRSBdCmNoYW5nZVZhbGlkYXRvclJld2FyZEluZm86Cglwcm90byA2IDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MTgKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQyMAoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgRW50cnlHYXRpbmdUeXBlID49IEdBVElOR19UWVBFX05PTkUgJiYgRW50cnlHYXRpbmdUeXBlIDwgR0FUSU5HX1RZUEVfQ09OU1RfTUFYLAoJLy8gICAgICAgICAgICAgJ2ludmFsaWQgRW50cnkgZ2F0aW5nIHR5cGUnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDAKCT49CglkdXAKCWJ6ICpza2lwX2FuZDEKCWZyYW1lX2RpZyAtMiAvLyBFbnRyeUdhdGluZ1R5cGU6IHVpbnQ4CglpbnQgNAoJPAoJJiYKCipza2lwX2FuZDE6CgkvLyBpbnZhbGlkIEVudHJ5IGdhdGluZyB0eXBlCglhc3NlcnQKCgkvLyAqaWY3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDI0CgkvLyBFbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX0FTU0VUU19DUkVBVEVEX0JZCglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDEKCT09CglieiAqaWY3X2VuZAoKCS8vICppZjdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDI1CgkvLyBhc3NlcnQoRW50cnlHYXRpbmdBZGRyZXNzICE9PSBnbG9iYWxzLnplcm9BZGRyZXNzKQoJZnJhbWVfZGlnIC0zIC8vIEVudHJ5R2F0aW5nQWRkcmVzczogQWRkcmVzcwoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoqaWY3X2VuZDoKCS8vICppZjhfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MjgKCS8vIEVudHJ5R2F0aW5nVHlwZSA9PT0gR0FUSU5HX1RZUEVfQ1JFQVRFRF9CWV9ORkRfQUREUkVTU0VTIHx8CgkvLyAgICAgICAgICAgICBFbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX1NFR01FTlRfT0ZfTkZECglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDMKCT09CglkdXAKCWJueiAqc2tpcF9vcjEKCWZyYW1lX2RpZyAtMiAvLyBFbnRyeUdhdGluZ1R5cGU6IHVpbnQ4CglpbnQgNAoJPT0KCXx8Cgoqc2tpcF9vcjE6CglieiAqaWY4X2VuZAoKCS8vICppZjhfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDMxCgkvLyBhc3NlcnQodGhpcy5pc05GREFwcElEVmFsaWQoRW50cnlHYXRpbmdBc3NldHNbMF0pLCAncHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZEJykKCWZyYW1lX2RpZyAtNCAvLyBFbnRyeUdhdGluZ0Fzc2V0czogU3RhdGljQXJyYXk8dWludDY0LCA0PgoJZXh0cmFjdCAwIDgKCWJ0b2kKCWNhbGxzdWIgaXNORkRBcHBJRFZhbGlkCgoJLy8gcHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZECglhc3NlcnQKCippZjhfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDMzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPSBFbnRyeUdhdGluZ1R5cGUKCWludCA4MAoJZnJhbWVfZGlnIC0yIC8vIEVudHJ5R2F0aW5nVHlwZTogdWludDgKCWl0b2IKCWV4dHJhY3QgNyAxCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQzNAoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcuZW50cnlHYXRpbmdBZGRyZXNzID0gRW50cnlHYXRpbmdBZGRyZXNzCglpbnQgODEKCWZyYW1lX2RpZyAtMyAvLyBFbnRyeUdhdGluZ0FkZHJlc3M6IEFkZHJlc3MKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDM1CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0cyA9IEVudHJ5R2F0aW5nQXNzZXRzCglpbnQgMTEzCglmcmFtZV9kaWcgLTQgLy8gRW50cnlHYXRpbmdBc3NldHM6IFN0YXRpY0FycmF5PHVpbnQ2NCwgND4KCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDM2CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5nYXRpbmdBc3NldE1pbkJhbGFuY2UgPSBHYXRpbmdBc3NldE1pbkJhbGFuY2UKCWludCAxNDUKCWZyYW1lX2RpZyAtNSAvLyBHYXRpbmdBc3NldE1pbkJhbGFuY2U6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MzcKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnJld2FyZFBlclBheW91dCA9IFJld2FyZFBlclBheW91dAoJaW50IDE2MQoJZnJhbWVfZGlnIC02IC8vIFJld2FyZFBlclBheW91dDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyBhZGRQb29sKHBheSx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCkKKmFiaV9yb3V0ZV9hZGRQb29sOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBub2RlTnVtOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gbWJyUGF5bWVudDogcGF5Cgl0eG4gR3JvdXBJbmRleAoJaW50IDEKCS0KCWR1cAoJZ3R4bnMgVHlwZUVudW0KCWludCBwYXkKCT09CgoJLy8gYXJndW1lbnQgMiAobWJyUGF5bWVudCkgZm9yIGFkZFBvb2wgbXVzdCBiZSBhIHBheSB0cmFuc2FjdGlvbgoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBhZGRQb29sKHBheSx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCkKCWNhbGxzdWIgYWRkUG9vbAoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFBvb2wobWJyUGF5bWVudDogUGF5VHhuLCB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBub2RlTnVtOiB1aW50NjQpOiBWYWxpZGF0b3JQb29sS2V5Ci8vCi8vIEFkZHMgYSBuZXcgcG9vbCB0byBhIHZhbGlkYXRvcidzIHBvb2wgc2V0LCByZXR1cm5pbmcgdGhlICdrZXknIHRvIHJlZmVyZW5jZSB0aGUgcG9vbCBpbiB0aGUgZnV0dXJlIGZvciBzdGFraW5nLCBldGMuCi8vIFRoZSBjYWxsZXIgbXVzdCBwYXkgdGhlIGNvc3Qgb2YgdGhlIHZhbGlkYXRvcnMgTUJSIGluY3JlYXNlIGFzIHdlbGwgYXMgdGhlIE1CUiB0aGF0IHdpbGwgYmUgbmVlZGVkIGZvciB0aGUgcG9vbCBpdHNlbGYuCi8vCi8vIFsgT05MWSBPV05FUiBPUiBNQU5BR0VSIENBTiBjYWxsIF0KLy8gQHBhcmFtIHtQYXlUeG59IG1iclBheW1lbnQgcGF5bWVudCBmcm9tIGNhbGxlciB3aGljaCBjb3ZlcnMgbWJyIGluY3JlYXNlIG9mIGFkZGluZyBhIG5ldyBwb29sCi8vIEBwYXJhbSB7dWludDY0fSB2YWxpZGF0b3JJZCBpcyBpZCBvZiB2YWxpZGF0b3IgdG8gcG9vbCB0byAobXVzdCBiZSBvd25lciBvciBtYW5hZ2VyKQovLyBAcGFyYW0ge3VpbnQ2NH0gbm9kZU51bSBpcyBub2RlIG51bWJlciB0byBhZGQgdG8KLy8gQHJldHVybnMge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2wga2V5IHRvIGNyZWF0ZWQgcG9vbAphZGRQb29sOgoJcHJvdG8gMyAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ1MgoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lck9yTWFuYWdlcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyT3JNYW5hZ2VyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDU1CgkvLyB2ZXJpZnlQYXlUeG4obWJyUGF5bWVudCwgeyByZWNlaXZlcjogdGhpcy5hcHAuYWRkcmVzcywgYW1vdW50OiB0aGlzLmdldE1ickFtb3VudHMoKS5hZGRQb29sTWJyIH0pCgkvLyB2ZXJpZnkgcmVjZWl2ZXIKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIFJlY2VpdmVyCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6InJlY2VpdmVyIiwiZXhwZWN0ZWQiOiJ0aGlzLmFwcC5hZGRyZXNzIn0KCWFzc2VydAoKCS8vIHZlcmlmeSBhbW91bnQKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCglleHRyYWN0IDggOAoJYnRvaQoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6ImFtb3VudCIsImV4cGVjdGVkIjoidGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkUG9vbE1iciJ9Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NTcKCS8vIGFzc2VydCh0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLmV4aXN0cywgInNwZWNpZmllZCB2YWxpZGF0b3IgaWQgaXNuJ3QgdmFsaWQiKQoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJYm94X2xlbgoJc3dhcAoJcG9wCgoJLy8gc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBpc24ndCB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDU5CgkvLyBudW1Qb29sczogdWludDY0ID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyBhcyB1aW50NjQKCWludCAyNDIKCWludCAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIG51bVBvb2xzOiB1aW50NjQKCgkvLyAqaWY5X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDYwCgkvLyAobnVtUG9vbHMgYXMgdWludDY0KSA+PSBNQVhfUE9PTFMKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWludCAyNAoJPj0KCWJ6ICppZjlfZW5kCgoJLy8gKmlmOV9jb25zZXF1ZW50CgkvLyBhbHJlYWR5IGF0IG1heCBwb29sIHNpemUKCWVycgoKKmlmOV9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NjMKCS8vIG51bVBvb2xzICs9IDEKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ2NgoJLy8gc2VuZEFwcENhbGwoewoJLy8gICAgICAgICAgICAgb25Db21wbGV0aW9uOiBPbkNvbXBsZXRpb24uTm9PcCwKCS8vICAgICAgICAgICAgIGFwcHJvdmFsUHJvZ3JhbTogWwoJLy8gICAgICAgICAgICAgICAgIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uZXh0cmFjdCgwLCA0MDk2KSwKCS8vICAgICAgICAgICAgICAgICB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLmV4dHJhY3QoNDA5NiwgdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5zaXplIC0gNDA5NiksCgkvLyAgICAgICAgICAgICBdLAoJLy8gICAgICAgICAgICAgY2xlYXJTdGF0ZVByb2dyYW06IFN0YWtpbmdQb29sLmNsZWFyUHJvZ3JhbSgpLAoJLy8gICAgICAgICAgICAgZ2xvYmFsTnVtVWludDogU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1VaW50LAoJLy8gICAgICAgICAgICAgZ2xvYmFsTnVtQnl0ZVNsaWNlOiBTdGFraW5nUG9vbC5zY2hlbWEuZ2xvYmFsLm51bUJ5dGVTbGljZSwKCS8vICAgICAgICAgICAgIGV4dHJhUHJvZ3JhbVBhZ2VzOiAzLAoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25BcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gY3JlYXRpbmdDb250cmFjdElELCB2YWxpZGF0b3JJZCwgcG9vbElkLCBtaW5FbnRyeVN0YWtlCgkvLyAgICAgICAgICAgICAgICAgbWV0aG9kKCdjcmVhdGVBcHBsaWNhdGlvbih1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCcpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodGhpcy5hcHAuaWQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodmFsaWRhdG9ySWQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IobnVtUG9vbHMgYXMgdWludDY0KSwKCS8vICAgICAgICAgICAgICAgICBpdG9iKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1pbkVudHJ5U3Rha2UpLAoJLy8gICAgICAgICAgICAgXSwKCS8vICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDY3CgkvLyBvbkNvbXBsZXRpb246IE9uQ29tcGxldGlvbi5Ob09wCglpbnQgMCAvLyBOb09wCglpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ2OAoJLy8gYXBwcm92YWxQcm9ncmFtOiBbCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5leHRyYWN0KDAsIDQwOTYpLAoJLy8gICAgICAgICAgICAgICAgIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uZXh0cmFjdCg0MDk2LCB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLnNpemUgLSA0MDk2KSwKCS8vICAgICAgICAgICAgIF0KCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWludCAwCglpbnQgNDA5NgoJYm94X2V4dHJhY3QKCWl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWludCA0MDk2CglieXRlIDB4NzA2ZjZmNmM1NDY1NmQ3MDZjNjE3NDY1NDE3MDcwNzI2Zjc2NjE2YzQyNzk3NDY1NzMgLy8gInBvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMiCglib3hfbGVuCgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLnNpemUKCWFzc2VydAoJaW50IDQwOTYKCS0KCWJveF9leHRyYWN0CglpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDcyCgkvLyBjbGVhclN0YXRlUHJvZ3JhbTogU3Rha2luZ1Bvb2wuY2xlYXJQcm9ncmFtKCkKCWJ5dGUgYjY0IEN3PT0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NzMKCS8vIGdsb2JhbE51bVVpbnQ6IFN0YWtpbmdQb29sLnNjaGVtYS5nbG9iYWwubnVtVWludAoJaW50IDExCglpdHhuX2ZpZWxkIEdsb2JhbE51bVVpbnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NzQKCS8vIGdsb2JhbE51bUJ5dGVTbGljZTogU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1CeXRlU2xpY2UKCWludCAzCglpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ3NQoJLy8gZXh0cmFQcm9ncmFtUGFnZXM6IDMKCWludCAzCglpdHhuX2ZpZWxkIEV4dHJhUHJvZ3JhbVBhZ2VzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDc2CgkvLyBhcHBsaWNhdGlvbkFyZ3M6IFsKCS8vICAgICAgICAgICAgICAgICAvLyBjcmVhdGluZ0NvbnRyYWN0SUQsIHZhbGlkYXRvcklkLCBwb29sSWQsIG1pbkVudHJ5U3Rha2UKCS8vICAgICAgICAgICAgICAgICBtZXRob2QoJ2NyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkJyksCgkvLyAgICAgICAgICAgICAgICAgaXRvYih0aGlzLmFwcC5pZCksCgkvLyAgICAgICAgICAgICAgICAgaXRvYih2YWxpZGF0b3JJZCksCgkvLyAgICAgICAgICAgICAgICAgaXRvYihudW1Qb29scyBhcyB1aW50NjQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWluRW50cnlTdGFrZSksCgkvLyAgICAgICAgICAgICBdCgltZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCXR4bmEgQXBwbGljYXRpb25zIDAKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglpbnQgMjA5CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ4NgoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyA9IG51bVBvb2xzIGFzIHVpbnQxNgoJaW50IDI0MgoJZnJhbWVfZGlnIDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoJaXRvYgoJZXh0cmFjdCA2IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDg5CgkvLyBwb29sQXBwSWQgPSB0aGlzLml0eG4uY3JlYXRlZEFwcGxpY2F0aW9uSUQuaWQKCWl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKCWZyYW1lX2J1cnkgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ5MAoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1tudW1Qb29scyAtIDFdLnBvb2xBcHBJZCA9IHBvb2xBcHBJZAoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgMCAvLyBudW1Qb29sczogdWludDY0CglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0OTEKCS8vIHRoaXMuYWRkUG9vbFRvTm9kZSh2YWxpZGF0b3JJZCwgcG9vbEFwcElkLCBub2RlTnVtKQoJZnJhbWVfZGlnIC0zIC8vIG5vZGVOdW06IHVpbnQ2NAoJZnJhbWVfZGlnIDEgLy8gcG9vbEFwcElkOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGFkZFBvb2xUb05vZGUKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0OTMKCS8vIHRoaXMucmV0aU9QX3ZhbGlkYXRvckFkZGVkUG9vbC5sb2coewoJLy8gICAgICAgICAgICAgaWQ6IHZhbGlkYXRvcklkLAoJLy8gICAgICAgICAgICAgbnVtOiBudW1Qb29scyBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKSwKCS8vICAgICAgICAgfSkKCWJ5dGUgMHhmYmNjMGY2YiAvLyByZXRpT1BfdmFsaWRhdG9yQWRkZWRQb29sKHVpbnQ2NCx1aW50MTYsdWludDY0KQoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWl0b2IKCWR1cAoJYml0bGVuCglpbnQgMTYKCTw9CgoJLy8gbnVtUG9vbHMgYXMgdWludDE2IG92ZXJmbG93ZWQgMTYgYml0cwoJYXNzZXJ0CglleHRyYWN0IDYgMgoJY29uY2F0CglmcmFtZV9kaWcgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cgljb25jYXQKCWxvZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ5OQoJLy8gcmV0dXJuIHsgaWQ6IHZhbGlkYXRvcklkLCBwb29sSWQ6IG51bVBvb2xzIGFzIHVpbnQ2NCwgcG9vbEFwcElkOiB0aGlzLml0eG4hLmNyZWF0ZWRBcHBsaWNhdGlvbklELmlkIH0KCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCglmcmFtZV9kaWcgMCAvLyBudW1Qb29sczogdWludDY0CglpdG9iCgljb25jYXQKCWl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKCWl0b2IKCWNvbmNhdAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDEKCXJldHN1YgoKLy8gYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KQoqYWJpX3JvdXRlX2FkZFN0YWtlOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gc3Rha2VkQW1vdW50UGF5bWVudDogcGF5Cgl0eG4gR3JvdXBJbmRleAoJaW50IDEKCS0KCWR1cAoJZ3R4bnMgVHlwZUVudW0KCWludCBwYXkKCT09CgoJLy8gYXJndW1lbnQgMiAoc3Rha2VkQW1vdW50UGF5bWVudCkgZm9yIGFkZFN0YWtlIG11c3QgYmUgYSBwYXkgdHJhbnNhY3Rpb24KCWFzc2VydAoKCS8vIGV4ZWN1dGUgYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBhZGRTdGFrZQoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFN0YWtlKHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4biwgdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgdmFsdWVUb1ZlcmlmeTogdWludDY0KTogVmFsaWRhdG9yUG9vbEtleQovLwovLyBBZGRzIHN0YWtlIHRvIGEgdmFsaWRhdG9yIHBvb2wuCi8vCi8vIEBwYXJhbSB7UGF5VHhufSBzdGFrZWRBbW91bnRQYXltZW50IC0gcGF5bWVudCBjb21pbmcgZnJvbSBzdGFrZXIgdG8gcGxhY2UgaW50byBhIHBvb2wKLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWx1ZVRvVmVyaWZ5IC0gb25seSBpZiB2YWxpZGF0b3IgaGFzIGdhdGluZyB0byBlbnRlciAtIHRoaXMgaXMgYXNzZXQgaWQgb3IgbmZkIGlkIHRoYXQgY29ycmVzcG9uZHMgdG8gZ2F0aW5nLgovLyBUeG4gc2VuZGVyIGlzIGZhY3RvcmVkIGluIGFzIHdlbGwgaWYgdGhhdCBpcyBwYXJ0IG9mIGdhdGluZy4KLy8gKiBAcmV0dXJucyB7VmFsaWRhdG9yUG9vbEtleX0gLSBUaGUga2V5IG9mIHRoZSB2YWxpZGF0b3IgcG9vbC4KYWRkU3Rha2U6Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA1CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTEyCgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS5leGlzdHMsICJzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGlzbid0IHZhbGlkIikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoKCS8vIHNwZWNpZmllZCB2YWxpZGF0b3IgaWQgaXNuJ3QgdmFsaWQKCWFzc2VydAoKCS8vICppZjEwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTE1CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5zdW5zZXR0aW5nT24gPiAwCglpbnQgMjI2CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWludCAwCgk+CglieiAqaWYxMF9lbmQKCgkvLyAqaWYxMF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MTcKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5zdW5zZXR0aW5nT24gPiBnbG9iYWxzLmxhdGVzdFRpbWVzdGFtcCwKCS8vICAgICAgICAgICAgICAgICAiY2FuJ3Qgc3Rha2Ugd2l0aCBhIHZhbGlkYXRvciB0aGF0IGlzIHBhc3QgaXRzIHN1bnNldHRpbmcgdGltZSIsCgkvLyAgICAgICAgICAgICApCglpbnQgMjI2CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKCT4KCgkvLyBjYW4ndCBzdGFrZSB3aXRoIGEgdmFsaWRhdG9yIHRoYXQgaXMgcGFzdCBpdHMgc3Vuc2V0dGluZyB0aW1lCglhc3NlcnQKCippZjEwX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUyMwoJLy8gc3Rha2VyID0gdGhpcy50eG4uc2VuZGVyCgl0eG4gU2VuZGVyCglmcmFtZV9idXJ5IDAgLy8gc3Rha2VyOiBhZGRyZXNzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTI3CgkvLyB2ZXJpZnlQYXlUeG4oc3Rha2VkQW1vdW50UGF5bWVudCwgewoJLy8gICAgICAgICAgICAgc2VuZGVyOiBzdGFrZXIsCgkvLyAgICAgICAgICAgICByZWNlaXZlcjogdGhpcy5hcHAuYWRkcmVzcywKCS8vICAgICAgICAgfSkKCS8vIHZlcmlmeSBzZW5kZXIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIFNlbmRlcgoJZnJhbWVfZGlnIDAgLy8gc3Rha2VyOiBhZGRyZXNzCgk9PQoKCS8vIHRyYW5zYWN0aW9uIHZlcmlmaWNhdGlvbiBmYWlsZWQ6IHsidHhuIjoic3Rha2VkQW1vdW50UGF5bWVudCIsImZpZWxkIjoic2VuZGVyIiwiZXhwZWN0ZWQiOiJzdGFrZXIifQoJYXNzZXJ0CgoJLy8gdmVyaWZ5IHJlY2VpdmVyCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBSZWNlaXZlcgoJZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCT09CgoJLy8gdHJhbnNhY3Rpb24gdmVyaWZpY2F0aW9uIGZhaWxlZDogeyJ0eG4iOiJzdGFrZWRBbW91bnRQYXltZW50IiwiZmllbGQiOiJyZWNlaXZlciIsImV4cGVjdGVkIjoidGhpcy5hcHAuYWRkcmVzcyJ9Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzUKCS8vIHRoaXMuZG9lc1N0YWtlck1lZXRHYXRpbmcodmFsaWRhdG9ySWQsIHZhbHVlVG9WZXJpZnkpCglmcmFtZV9kaWcgLTMgLy8gdmFsdWVUb1ZlcmlmeTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBkb2VzU3Rha2VyTWVldEdhdGluZwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUzNwoJLy8gcmVhbEFtb3VudCA9IHN0YWtlZEFtb3VudFBheW1lbnQuYW1vdW50CglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBBbW91bnQKCWZyYW1lX2J1cnkgMSAvLyByZWFsQW1vdW50OiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzgKCS8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NCA9IDAKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gbWJyQW10TGVmdEJlaGluZDogdWludDY0CgoJLy8gKmlmMTFfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NDAKCS8vIHRoaXMuZG9lc1N0YWtlck5lZWRUb1BheU1CUihzdGFrZXIpCglmcmFtZV9kaWcgMCAvLyBzdGFrZXI6IGFkZHJlc3MKCWNhbGxzdWIgZG9lc1N0YWtlck5lZWRUb1BheU1CUgoJYnogKmlmMTFfZW5kCgoJLy8gKmlmMTFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTQzCgkvLyBtYnJBbXRMZWZ0QmVoaW5kID0gdGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkU3Rha2VyTWJyCgljYWxsc3ViIGdldE1ickFtb3VudHMKCWV4dHJhY3QgMjQgOAoJYnRvaQoJZnJhbWVfYnVyeSAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU0NAoJLy8gcmVhbEFtb3VudCAtPSBtYnJBbXRMZWZ0QmVoaW5kCglmcmFtZV9kaWcgMSAvLyByZWFsQW1vdW50OiB1aW50NjQKCWZyYW1lX2RpZyAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoJLQoJZnJhbWVfYnVyeSAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU0NQoJLy8gdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikuY3JlYXRlKCkKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAwIC8vIHN0YWtlcjogYWRkcmVzcwoJY29uY2F0CglpbnQgMTQ0Cglib3hfY3JlYXRlCglwb3AKCippZjExX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU0OQoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS50b3RhbEFsZ29TdGFrZWQgKyByZWFsQW1vdW50IDwgdGhpcy5tYXhBbGxvd2VkU3Rha2UoKSwKCS8vICAgICAgICAgICAgICd0b3RhbCBzdGFrZWQgZm9yIGFsbCBvZiBhIHZhbGlkYXRvcnMgcG9vbHMgbWF5IG5vdCBleGNlZWQgaGFyZCBjYXAnLAoJLy8gICAgICAgICApCglpbnQgMjUyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoJKwoJY2FsbHN1YiBtYXhBbGxvd2VkU3Rha2UKCTwKCgkvLyB0b3RhbCBzdGFrZWQgZm9yIGFsbCBvZiBhIHZhbGlkYXRvcnMgcG9vbHMgbWF5IG5vdCBleGNlZWQgaGFyZCBjYXAKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU1NgoJLy8gZmluZFJldCA9IHRoaXMuZmluZFBvb2xGb3JTdGFrZXIodmFsaWRhdG9ySWQsIHN0YWtlciwgcmVhbEFtb3VudCkKCWZyYW1lX2RpZyAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoJZnJhbWVfZGlnIDAgLy8gc3Rha2VyOiBhZGRyZXNzCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBmaW5kUG9vbEZvclN0YWtlcgoJZnJhbWVfYnVyeSAzIC8vIGZpbmRSZXQ6ICgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NTcKCS8vIHBvb2xLZXkgPSBmaW5kUmV0WzBdCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NTgKCS8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IgPSBmaW5kUmV0WzFdCglmcmFtZV9kaWcgMyAvLyBmaW5kUmV0OiAoKHVpbnQ2NCx1aW50NjQsdWludDY0KSxib29sLGJvb2wpCglzdG9yZSAyNTUgLy8gZnVsbCBhcnJheQoJbG9hZCAyNTUgLy8gZnVsbCBhcnJheQoJaW50IDE5MgoJZ2V0Yml0CglmcmFtZV9idXJ5IDQgLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU1OQoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sID0gZmluZFJldFsyXQoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWludCAxOTMKCWdldGJpdAoJZnJhbWVfYnVyeSA1IC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoKCS8vICppZjEyX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTYwCgkvLyBwb29sS2V5LnBvb2xJZCA9PT0gMAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMAoJPT0KCWJ6ICppZjEyX2VuZAoKCS8vICppZjEyX2NvbnNlcXVlbnQKCS8vIE5vIHBvb2wgYXZhaWxhYmxlIHdpdGggZnJlZSBzdGFrZS4gIFZhbGlkYXRvciBuZWVkcyB0byBhZGQgYW5vdGhlciBwb29sCgllcnIKCippZjEyX2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU2NQoJLy8gdGhpcy51cGRhdGVTdGFrZXJQb29sU2V0KHN0YWtlciwgcG9vbEtleSkKCWZyYW1lX2RpZyAzIC8vIGZpbmRSZXQ6ICgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKCXN0b3JlIDI1NSAvLyBmdWxsIGFycmF5Cglsb2FkIDI1NSAvLyBmdWxsIGFycmF5CglleHRyYWN0IDAgMjQKCWZyYW1lX2RpZyAwIC8vIHN0YWtlcjogYWRkcmVzcwoJY2FsbHN1YiB1cGRhdGVTdGFrZXJQb29sU2V0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTY4CgkvLyB0aGlzLmNhbGxQb29sQWRkU3Rha2UoCgkvLyAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LAoJLy8gICAgICAgICAgICAgcG9vbEtleSwKCS8vICAgICAgICAgICAgIG1ickFtdExlZnRCZWhpbmQsCgkvLyAgICAgICAgICAgICBpc05ld1N0YWtlclRvVmFsaWRhdG9yLAoJLy8gICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1Byb3RvY29sLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgNSAvLyBpc05ld1N0YWtlclRvUHJvdG9jb2w6IGJvb2wKCWZyYW1lX2RpZyA0IC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCWZyYW1lX2RpZyAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMCAyNAoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4bgoJY2FsbHN1YiBjYWxsUG9vbEFkZFN0YWtlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTc1CgkvLyB0aGlzLnJldGlPUF9zdGFrZUFkZGVkLmxvZyh7CgkvLyAgICAgICAgICAgICBpZDogdmFsaWRhdG9ySWQsCgkvLyAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLAoJLy8gICAgICAgICAgICAgYW1vdW50U3Rha2VkOiByZWFsQW1vdW50LAoJLy8gICAgICAgICAgICAgc3Rha2VyOiBzdGFrZXIsCgkvLyAgICAgICAgIH0pCglieXRlIDB4OTYyYjQxNDMgLy8gcmV0aU9QX3N0YWtlQWRkZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQpCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgMCAvLyBzdGFrZXI6IGFkZHJlc3MKCWNvbmNhdAoJZnJhbWVfZGlnIDEgLy8gcmVhbEFtb3VudDogdWludDY0CglpdG9iCgljb25jYXQKCWNvbmNhdAoJbG9nCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTgzCgkvLyByZXR1cm4gcG9vbEtleQoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMCAyNAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDUKCXJldHN1YgoKLy8gc2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KQoqYWJpX3JvdXRlX3NldFRva2VuUGF5b3V0UmF0aW86CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIHNldFRva2VuUGF5b3V0UmF0aW8odWludDY0KSh1aW50NjRbMjRdLHVpbnQ2NCkKCWNhbGxzdWIgc2V0VG9rZW5QYXlvdXRSYXRpbwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIHNldFRva2VuUGF5b3V0UmF0aW8odmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IFBvb2xUb2tlblBheW91dFJhdGlvCi8vCi8vIHNldFRva2VuUGF5b3V0UmF0aW8gaXMgY2FsbGVkIGJ5IFN0YWtpbmcgUG9vbCAjIDEgKE9OTFkpIHRvIGFzayB0aGUgdmFsaWRhdG9yICh1cykgdG8gY2FsY3VsYXRlIHRoZSByYXRpb3MKLy8gb2Ygc3Rha2UgaW4gdGhlIHBvb2xzIGZvciBzdWJzZXF1ZW50IHRva2VuIHBheW91dHMgKGllOiAyIHBvb2xzLCAnMTAwJyBhbGdvIHRvdGFsIHN0YWtlZCwgNjAgaW4gcG9vbCAxLCBhbmQgNDAKLy8gaW4gcG9vbCAyKSAgVGhpcyBpcyBkb25lIHNvIHdlIGhhdmUgYSBzdGFibGUgc25hcHNob3Qgb2Ygc3Rha2UgLSB0YWtlbiBvbmNlIHBlciBlcG9jaCAtIG9ubHkgdHJpZ2dlcmVkIGJ5Ci8vIHBvb2wgMSBkb2luZyBwYXlvdXQuICBwb29scyBvdGhlciB0aGFuIDEgZG9pbmcgcGF5b3V0IGNhbGwgcG9vbCAxIHRvIGFzayBpdCBkbyBpdCBmaXJzdC4KLy8gSXQgd291bGQgYmUgNjAvNDAlIGluIHRoZSBwb29sUGN0T2ZXaG9sZSB2YWx1ZXMuICBUaGUgdG9rZW4gcmV3YXJkIHBheW91dHMgdGhlbiB1c2UgdGhlc2UgdmFsdWVzIGluc3RlYWQgb2YKLy8gdGhlaXIgJ2N1cnJlbnQnIHN0YWtlIHdoaWNoIGNoYW5nZXMgYXMgcGFydCBvZiB0aGUgcGF5b3V0cyB0aGVtc2VsdmVzIChhbmQgcGVvcGxlIGNvdWxkIGJlIGNoYW5naW5nIHN0YWtlCi8vIGR1cmluZyB0aGUgZXBvY2ggdXBkYXRlcyBhY3Jvc3MgcG9vbHMpCi8vCi8vIE11bHRpcGxlIHBvb2xzIHdpbGwgY2FsbCB1cyB2aWEgcG9vbCAxIChwb29sMi0+cG9vbDEtPnZhbGlkYXRvciwgZXRjLikgc28gZG9uJ3QgYXNzZXJ0IG9uIHBvb2wxIGNhbGxpbmcgbXVsdGlwbGUKLy8gdGltZXMgaW4gc2FtZSBlcG9jaC4gIEp1c3QgcmV0dXJuLgovLwovLyBAcGFyYW0gdmFsaWRhdG9ySWQgLSB2YWxpZGF0b3IgaWQgKGFuZCB0aHVzIHBvb2wpIGNhbGxpbmcgdXMuICBWZXJpZmllZCBzbyB0aGF0IHNlbmRlciBNVVNUIGJlIHBvb2wgMSBvZiB0aGlzIHZhbGlkYXRvci4KLy8gQHJldHVybnMgUG9vbFRva2VuUGF5b3V0UmF0aW8gLSB0aGUgZmluaXNoZWQgcmF0aW8gZGF0YQpzZXRUb2tlblBheW91dFJhdGlvOgoJcHJvdG8gMSAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gOAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYwMwoJLy8gcG9vbDFBcHBJRCA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkCglpbnQgMjY4CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMCAvLyBwb29sMUFwcElEOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MDQKCS8vIGFzc2VydChwb29sMUFwcElEICE9PSAwKQoJZnJhbWVfZGlnIDAgLy8gcG9vbDFBcHBJRDogdWludDY0CglpbnQgMAoJIT0KCWFzc2VydAoKCS8vICppZjEzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjA2CgkvLyB0aGlzLnR4bi5zZW5kZXIgIT09IEFwcElELmZyb21VaW50NjQocG9vbDFBcHBJRCkuYWRkcmVzcwoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIDAgLy8gcG9vbDFBcHBJRDogdWludDY0CglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCSE9CglieiAqaWYxM19lbmQKCgkvLyAqaWYxM19jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MDcKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWIgKnNldFRva2VuUGF5b3V0UmF0aW8qcmV0dXJuCgoqaWYxM19lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MTMKCS8vIGN1clJvdW5kID0gZ2xvYmFscy5yb3VuZAoJZ2xvYmFsIFJvdW5kCglmcmFtZV9idXJ5IDEgLy8gY3VyUm91bmQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYxNAoJLy8gbGFzdFBheW91dFVwZGF0ZSA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUudG9rZW5QYXlvdXRSYXRpby51cGRhdGVkRm9yUGF5b3V0CglpbnQgODkyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCgkvLyAqaWYxNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYxNQoJLy8gbGFzdFBheW91dFVwZGF0ZSAhPT0gMAoJZnJhbWVfZGlnIDIgLy8gbGFzdFBheW91dFVwZGF0ZTogdWludDY0CglpbnQgMAoJIT0KCWJ6ICppZjE0X2VuZAoKCS8vICppZjE0X2NvbnNlcXVlbnQKCS8vICppZjE1X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjE3CgkvLyAoQXBwSUQuZnJvbVVpbnQ2NChwb29sMUFwcElEKS5nbG9iYWxTdGF0ZSgnbGFzdFBheW91dCcpIGFzIHVpbnQ2NCkgPT09IGxhc3RQYXlvdXRVcGRhdGUKCWZyYW1lX2RpZyAwIC8vIHBvb2wxQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDZjNjE3Mzc0NTA2MTc5NmY3NTc0IC8vICJsYXN0UGF5b3V0IgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQocG9vbDFBcHBJRCkuZ2xvYmFsU3RhdGUoJ2xhc3RQYXlvdXQnKQoJYXNzZXJ0CglmcmFtZV9kaWcgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCT09CglieiAqaWYxNV9lbmQKCgkvLyAqaWYxNV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MTgKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWIgKnNldFRva2VuUGF5b3V0UmF0aW8qcmV0dXJuCgoqaWYxNV9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MjAKCS8vIGVwb2NoUm91bmRMZW5ndGggPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lcG9jaFJvdW5kTGVuZ3RoIGFzIHVpbnQ2NAoJaW50IDE2OQoJaW50IDQKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDMgLy8gZXBvY2hSb3VuZExlbmd0aDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjIxCgkvLyB0aGlzRXBvY2hCZWdpbiA9IGN1clJvdW5kIC0gKGN1clJvdW5kICUgZXBvY2hSb3VuZExlbmd0aCkKCWZyYW1lX2RpZyAxIC8vIGN1clJvdW5kOiB1aW50NjQKCWZyYW1lX2RpZyAxIC8vIGN1clJvdW5kOiB1aW50NjQKCWZyYW1lX2RpZyAzIC8vIGVwb2NoUm91bmRMZW5ndGg6IHVpbnQ2NAoJJQoJLQoJZnJhbWVfYnVyeSA0IC8vIHRoaXNFcG9jaEJlZ2luOiB1aW50NjQKCgkvLyAqaWYxNl9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYyMwoJLy8gbGFzdFBheW91dFVwZGF0ZSAtIChsYXN0UGF5b3V0VXBkYXRlICUgZXBvY2hSb3VuZExlbmd0aCkgPT09IHRoaXNFcG9jaEJlZ2luCglmcmFtZV9kaWcgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCWZyYW1lX2RpZyAyIC8vIGxhc3RQYXlvdXRVcGRhdGU6IHVpbnQ2NAoJZnJhbWVfZGlnIDMgLy8gZXBvY2hSb3VuZExlbmd0aDogdWludDY0CgklCgktCglmcmFtZV9kaWcgNCAvLyB0aGlzRXBvY2hCZWdpbjogdWludDY0Cgk9PQoJYnogKmlmMTZfZW5kCgoJLy8gKmlmMTZfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjI0CgkvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS50b2tlblBheW91dFJhdGlvCglpbnQgNzAwIC8vIGhlYWRPZmZzZXQKCWludCAyMDAKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CgliICpzZXRUb2tlblBheW91dFJhdGlvKnJldHVybgoKKmlmMTZfZW5kOgoKKmlmMTRfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjI3CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8udXBkYXRlZEZvclBheW91dCA9IGN1clJvdW5kCglpbnQgODkyCglmcmFtZV9kaWcgMSAvLyBjdXJSb3VuZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYyOQoJLy8gY3VyTnVtUG9vbHMgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnN0YXRlLm51bVBvb2xzIGFzIHVpbnQ2NAoJaW50IDI0MgoJaW50IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDUgLy8gY3VyTnVtUG9vbHM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYzMAoJLy8gdG90YWxTdGFrZUZvclZhbGlkYXRvciA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUudG90YWxBbGdvU3Rha2VkCglpbnQgMjUyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgNiAvLyB0b3RhbFN0YWtlRm9yVmFsaWRhdG9yOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MzEKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgY3VyTnVtUG9vbHM7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDcgLy8gaTogdWludDY0CgoqZm9yXzI6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MzEKCS8vIGkgPCBjdXJOdW1Qb29scwoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglmcmFtZV9kaWcgNSAvLyBjdXJOdW1Qb29sczogdWludDY0Cgk8CglieiAqZm9yXzJfZW5kCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjM2CgkvLyBvdXJQb29sUGN0T2ZXaG9sZSA9IHdpZGVSYXRpbygKCS8vICAgICAgICAgICAgICAgICBbdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1tpXS50b3RhbEFsZ29TdGFrZWQsIDFfMDAwXzAwMF0sCgkvLyAgICAgICAgICAgICAgICAgW3RvdGFsU3Rha2VGb3JWYWxpZGF0b3JdLAoJLy8gICAgICAgICAgICAgKQoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglpbnQgMV8wMDBfMDAwCgltdWx3CglpbnQgMAoJZnJhbWVfZGlnIDYgLy8gdG90YWxTdGFrZUZvclZhbGlkYXRvcjogdWludDY0CglkaXZtb2R3Cglwb3AKCXBvcAoJc3dhcAoJIQoKCS8vIHdpZGVSYXRpbyBmYWlsZWQKCWFzc2VydAoJZnJhbWVfYnVyeSA4IC8vIG91clBvb2xQY3RPZldob2xlOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NDAKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUudG9rZW5QYXlvdXRSYXRpby5wb29sUGN0T2ZXaG9sZVtpXSA9IG91clBvb2xQY3RPZldob2xlCglpbnQgNzAwCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWZyYW1lX2RpZyA4IC8vIG91clBvb2xQY3RPZldob2xlOiB1aW50NjQKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoqZm9yXzJfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MzEKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSA3IC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzIKCipmb3JfMl9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NDIKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCipzZXRUb2tlblBheW91dFJhdGlvKnJldHVybjoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDgKCXJldHN1YgoKLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcygodWludDY0LHVpbnQ2NCx1aW50NjQpLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkCiphYmlfcm91dGVfc3Rha2VVcGRhdGVkVmlhUmV3YXJkczoKCS8vIHNhdHVyYXRlZEJ1cm5Ub0ZlZVNpbms6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQoJYnRvaQoKCS8vIHZhbGlkYXRvckNvbW1pc3Npb246IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAoJYnRvaQoKCS8vIHJld2FyZFRva2VuQW1vdW50UmVzZXJ2ZWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwoJYnRvaQoKCS8vIGFsZ29Ub0FkZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglidG9pCgoJLy8gcG9vbEtleTogKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZHVwCglsZW4KCWludCAyNAoJPT0KCgkvLyBhcmd1bWVudCA0IChwb29sS2V5KSBmb3Igc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyBtdXN0IGJlIGEgKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBzdGFrZVVwZGF0ZWRWaWFSZXdhcmRzKCh1aW50NjQsdWludDY0LHVpbnQ2NCksdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKCWNhbGxzdWIgc3Rha2VVcGRhdGVkVmlhUmV3YXJkcwoJaW50IDEKCXJldHVybgoKLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyhwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5LCBhbGdvVG9BZGQ6IHVpbnQ2NCwgcmV3YXJkVG9rZW5BbW91bnRSZXNlcnZlZDogdWludDY0LCB2YWxpZGF0b3JDb21taXNzaW9uOiB1aW50NjQsIHNhdHVyYXRlZEJ1cm5Ub0ZlZVNpbms6IHVpbnQ2NCk6IHZvaWQKLy8KLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyBpcyBjYWxsZWQgYnkgU3Rha2luZyBwb29scyB0byBpbmZvcm0gdGhlIHZhbGlkYXRvciAodXMpIHRoYXQgYSBwYXJ0aWN1bGFyIGFtb3VudCBvZiB0b3RhbAovLyBzdGFrZSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgc3BlY2lmaWVkIHBvb2wuICBUaGlzIGlzIHVzZWQgdG8gdXBkYXRlIHRoZSBzdGF0cyB3ZSBoYXZlIGluIG91ciBQb29sSW5mbyBzdG9yYWdlLgovLyBUaGUgY2FsbGluZyBBcHAgaWQgaXMgdmFsaWRhdGVkIGFnYWluc3Qgb3VyIHBvb2wgbGlzdCBhcyB3ZWxsLgovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBWYWxpZGF0b3JQb29sS2V5IHR5cGUKLy8gQHBhcmFtIHt1aW50NjR9IGFsZ29Ub0FkZCAtIGFtb3VudCB0aGlzIHZhbGlkYXRvcidzIHRvdGFsIHN0YWtlIGluY3JlYXNlZCB2aWEgcmV3YXJkcwovLyBAcGFyYW0ge3VpbnQ2NH0gcmV3YXJkVG9rZW5BbW91bnRSZXNlcnZlZCAtIGFtb3VudCB0aGlzIHZhbGlkYXRvcidzIHRvdGFsIHN0YWtlIGluY3JlYXNlZCB2aWEgcmV3YXJkcyAodGhhdCBzaG91bGQgYmUKLy8gQHBhcmFtIHt1aW50NjR9IHZhbGlkYXRvckNvbW1pc3Npb24gLSB0aGUgY29tbWlzc2lvbiBhbW91bnQgdGhlIHZhbGlkYXRvciB3YXMgcGFpZCwgaWYgYW55Ci8vIEBwYXJhbSB7dWludDY0fSBzYXR1cmF0ZWRCdXJuVG9GZWVTaW5rIC0gaWYgdGhlIHBvb2wgd2FzIGluIHNhdHVyYXRlZCBzdGF0ZSwgdGhlIGFtb3VudCBzZW50IGJhY2sgdG8gdGhlIGZlZSBzaW5rLgovLyBzZWVuIGFzICdhY2NvdW50ZWQgZm9yL3BlbmRpbmcgc3BlbnQnKQpzdGFrZVVwZGF0ZWRWaWFSZXdhcmRzOgoJcHJvdG8gNSAwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjYzCgkvLyB0aGlzLnZlcmlmeVBvb2xLZXlDYWxsZXIocG9vbEtleSkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CgljYWxsc3ViIHZlcmlmeVBvb2xLZXlDYWxsZXIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NjYKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCArPSBhbGdvVG9BZGQKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAxMCAvLyBoZWFkT2Zmc2V0CgkrCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NjcKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS50b3RhbEFsZ29TdGFrZWQgKz0gYWxnb1RvQWRkCglpbnQgMjUyCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMiAvLyBhbGdvVG9BZGQ6IHVpbnQ2NAoJKwoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjY4CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUucmV3YXJkVG9rZW5IZWxkQmFjayArPSByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkCglpbnQgMjYwCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkOiB1aW50NjQKCSsKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY3MAoJLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgKz0gYWxnb1RvQWRkCglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglhcHBfZ2xvYmFsX2dldAoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CgkrCglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglzd2FwCglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY3MwoJLy8gdGhpcy5yZXZlcmlmeU5GRE93bmVyc2hpcChwb29sS2V5LmlkKQoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCgljYWxsc3ViIHJldmVyaWZ5TkZET3duZXJzaGlwCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Njc1CgkvLyB0aGlzLnJldGlPUF9lcG9jaFJld2FyZFVwZGF0ZS5sb2coewoJLy8gICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLAoJLy8gICAgICAgICAgICAgYWxnb0FkZGVkOiBhbGdvVG9BZGQsCgkvLyAgICAgICAgICAgICByZXdhcmRUb2tlbkhlbGRCYWNrOiByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkLAoJLy8gICAgICAgICAgICAgc2F0dXJhdGVkQnVyblRvRmVlU2luazogc2F0dXJhdGVkQnVyblRvRmVlU2luaywKCS8vICAgICAgICAgICAgIHZhbGlkYXRvckNvbW1pc3Npb246IHZhbGlkYXRvckNvbW1pc3Npb24sCgkvLyAgICAgICAgIH0pCglieXRlIDB4YjNlNDdjM2QgLy8gcmV0aU9QX2Vwb2NoUmV3YXJkVXBkYXRlKHVpbnQ2NCx1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTQgLy8gdmFsaWRhdG9yQ29tbWlzc2lvbjogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtNSAvLyBzYXR1cmF0ZWRCdXJuVG9GZWVTaW5rOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY29uY2F0Cglsb2cKCXJldHN1YgoKLy8gc3Rha2VSZW1vdmVkKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wpdm9pZAoqYWJpX3JvdXRlX3N0YWtlUmVtb3ZlZDoKCS8vIHN0YWtlclJlbW92ZWQ6IGJvb2wKCXR4bmEgQXBwbGljYXRpb25BcmdzIDUKCWR1cAoJbGVuCglpbnQgMQoJPT0KCgkvLyBhcmd1bWVudCAwIChzdGFrZXJSZW1vdmVkKSBmb3Igc3Rha2VSZW1vdmVkIG11c3QgYmUgYSBib29sCglhc3NlcnQKCWludCAwCglnZXRiaXQKCgkvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDQKCWJ0b2kKCgkvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDMKCWJ0b2kKCgkvLyBzdGFrZXI6IGFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMzIKCT09CgoJLy8gYXJndW1lbnQgMyAoc3Rha2VyKSBmb3Igc3Rha2VSZW1vdmVkIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBwb29sS2V5OiAodWludDY0LHVpbnQ2NCx1aW50NjQpCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDI0Cgk9PQoKCS8vIGFyZ3VtZW50IDQgKHBvb2xLZXkpIGZvciBzdGFrZVJlbW92ZWQgbXVzdCBiZSBhICh1aW50NjQsdWludDY0LHVpbnQ2NCkKCWFzc2VydAoKCS8vIGV4ZWN1dGUgc3Rha2VSZW1vdmVkKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wpdm9pZAoJY2FsbHN1YiBzdGFrZVJlbW92ZWQKCWludCAxCglyZXR1cm4KCi8vIHN0YWtlUmVtb3ZlZChwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5LCBzdGFrZXI6IEFkZHJlc3MsIGFtb3VudFJlbW92ZWQ6IHVpbnQ2NCwgcmV3YXJkUmVtb3ZlZDogdWludDY0LCBzdGFrZXJSZW1vdmVkOiBib29sZWFuKTogdm9pZAovLwovLyBzdGFrZVJlbW92ZWQgaXMgY2FsbGVkIGJ5IFN0YWtpbmcgcG9vbHMgdG8gaW5mb3JtIHRoZSB2YWxpZGF0b3IgKHVzKSB0aGF0IGEgcGFydGljdWxhciBhbW91bnQgb2YgdG90YWwgc3Rha2UgaGFzIGJlZW4gcmVtb3ZlZAovLyBmcm9tIHRoZSBzcGVjaWZpZWQgcG9vbC4gIFRoaXMgaXMgdXNlZCB0byB1cGRhdGUgdGhlIHN0YXRzIHdlIGhhdmUgaW4gb3VyIFBvb2xJbmZvIHN0b3JhZ2UuCi8vIElmIGFueSBhbW91bnQgb2YgcmV3YXJkUmVtb3ZlZCBpcyBzcGVjaWZpZWQsIHRoZW4gdGhhdCBhbW91bnQgb2YgcmV3YXJkIGlzIHNlbnQgdG8gdGhlIHVzZQovLyBUaGUgY2FsbGluZyBBcHAgaWQgaXMgdmFsaWRhdGVkIGFnYWluc3Qgb3VyIHBvb2wgbGlzdCBhcyB3ZWxsLgovLwovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgY2FsbGluZyB1cyBmcm9tIHdoaWNoIHN0YWtlIHdhcyByZW1vdmVkCi8vIEBwYXJhbSB7QWRkcmVzc30gc3Rha2VyCi8vIEBwYXJhbSB7dWludDY0fSBhbW91bnRSZW1vdmVkIC0gYWxnbyBhbW91bnQgcmVtb3ZlZAovLyBAcGFyYW0ge3VpbnQ2NH0gcmV3YXJkUmVtb3ZlZCAtIGlmIGFwcGxpY2FibGUsIGFtb3VudCBvZiB0b2tlbiByZXdhcmQgcmVtb3ZlZCAoYnkgcG9vbCAxIGNhbGxlcikgb3IgVE8gcmVtb3ZlIGFuZCBwYXkgb3V0ICh2aWEgcG9vbCAxIGZyb20gZGlmZmVyZW50IHBvb2wgY2FsbGVyKQovLyBAcGFyYW0ge2Jvb2xlYW59IHN0YWtlclJlbW92ZWQKc3Rha2VSZW1vdmVkOgoJcHJvdG8gNSAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMwoKCS8vICppZjE3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzA1CgkvLyBnbG9iYWxzLm9wY29kZUJ1ZGdldCA8IDMwMAoJZ2xvYmFsIE9wY29kZUJ1ZGdldAoJaW50IDMwMAoJPAoJYnogKmlmMTdfZW5kCgoJLy8gKmlmMTdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzA2CgkvLyBpbmNyZWFzZU9wY29kZUJ1ZGdldCgpCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJaW50IDAKCWl0eG5fZmllbGQgRmVlCglieXRlIGI2NCBDb0VCIC8vICNwcmFnbWEgdmVyc2lvbiAxMDsgaW50IDEKCWR1cAoJaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCWludCBEZWxldGVBcHBsaWNhdGlvbgoJaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KCWl0eG5fc3VibWl0CgoqaWYxN19lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MDgKCS8vIHRoaXMudmVyaWZ5UG9vbEtleUNhbGxlcihwb29sS2V5KQoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWNhbGxzdWIgdmVyaWZ5UG9vbEtleUNhbGxlcgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxMgoJLy8gYXNzZXJ0KGFtb3VudFJlbW92ZWQgPiAwIHx8IHJld2FyZFJlbW92ZWQgPiAwLCAnc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGFsZ28gb3IgcmV3YXJkIHdhcyByZW1vdmVkJykKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWludCAwCgk+CglkdXAKCWJueiAqc2tpcF9vcjIKCWZyYW1lX2RpZyAtNCAvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCWludCAwCgk+Cgl8fAoKKnNraXBfb3IyOgoJLy8gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGFsZ28gb3IgcmV3YXJkIHdhcyByZW1vdmVkCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MTUKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCAtPSBhbW91bnRSZW1vdmVkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxNgoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsQWxnb1N0YWtlZCAtPSBhbW91bnRSZW1vdmVkCglpbnQgMjUyCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxNwoJLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgLT0gYW1vdW50UmVtb3ZlZAoJYnl0ZSAweDczNzQ2MTZiNjU2NCAvLyAic3Rha2VkIgoJYXBwX2dsb2JhbF9nZXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCXN3YXAKCWFwcF9nbG9iYWxfcHV0CgoJLy8gKmlmMThfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MTkKCS8vIHJld2FyZFJlbW92ZWQgPiAwCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CglpbnQgMAoJPgoJYnogKmlmMThfZWxzZQoKCS8vICppZjE4X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyMAoJLy8gcmV3YXJkVG9rZW5JRCA9IHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5jb25maWcucmV3YXJkVG9rZW5JZAoJaW50IDE1MwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIHJld2FyZFRva2VuSUQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyMQoJLy8gYXNzZXJ0KHJld2FyZFRva2VuSUQgIT09IDAsICJyZXdhcmRSZW1vdmVkIGNhbid0IGJlIHNldCBpZiB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIHJld2FyZCB0b2tlbiEiKQoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JRDogdWludDY0CglpbnQgMAoJIT0KCgkvLyByZXdhcmRSZW1vdmVkIGNhbid0IGJlIHNldCBpZiB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIHJld2FyZCB0b2tlbiEKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyMgoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS5yZXdhcmRUb2tlbkhlbGRCYWNrID49IHJld2FyZFJlbW92ZWQsCgkvLyAgICAgICAgICAgICAgICAgJ3Jld2FyZCBiZWluZyByZW1vdmVkIG11c3QgYmUgY292ZXJlZCBieSBob2xkIGJhY2sgYW1vdW50JywKCS8vICAgICAgICAgICAgICkKCWludCAyNjAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtNCAvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCT49CgoJLy8gcmV3YXJkIGJlaW5nIHJlbW92ZWQgbXVzdCBiZSBjb3ZlcmVkIGJ5IGhvbGQgYmFjayBhbW91bnQKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyOAoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnJld2FyZFRva2VuSGVsZEJhY2sgLT0gcmV3YXJkUmVtb3ZlZAoJaW50IDI2MAoJZHVwCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CgktCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyAqaWYxOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczMwoJLy8gcG9vbEtleS5wb29sSWQgIT09IDEKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCSE9CglieiAqaWYxOV9lbmQKCgkvLyAqaWYxOV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MzQKCS8vIHNlbmRNZXRob2RDYWxsPHR5cGVvZiBTdGFraW5nUG9vbC5wcm90b3R5cGUucGF5VG9rZW5SZXdhcmQ+KHsKCS8vICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRDogQXBwSUQuZnJvbVVpbnQ2NCh0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJnczogW3N0YWtlciwgcmV3YXJkVG9rZW5JRCwgcmV3YXJkUmVtb3ZlZF0sCgkvLyAgICAgICAgICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgltZXRob2QgInBheVRva2VuUmV3YXJkKGFkZHJlc3MsdWludDY0LHVpbnQ2NCl2b2lkIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MzUKCS8vIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQodGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzWzBdLnBvb2xBcHBJZCkKCWludCAyNjgKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczNgoJLy8gbWV0aG9kQXJnczogW3N0YWtlciwgcmV3YXJkVG9rZW5JRCwgcmV3YXJkUmVtb3ZlZF0KCWZyYW1lX2RpZyAtMiAvLyBzdGFrZXI6IEFkZHJlc3MKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklEOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCippZjE5X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczOQoJLy8gdGhpcy5yZXRpT1Bfc3Rha2VSZW1vdmVkLmxvZyh7CgkvLyAgICAgICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICAgICAgcG9vbE51bTogcG9vbEtleS5wb29sSWQgYXMgdWludDE2LAoJLy8gICAgICAgICAgICAgICAgIHBvb2xBcHBJZDogQXBwSUQuZnJvbVVpbnQ2NChwb29sS2V5LnBvb2xBcHBJZCksCgkvLyAgICAgICAgICAgICAgICAgc3Rha2VyOiBzdGFrZXIsCgkvLyAgICAgICAgICAgICAgICAgYW1vdW50VW5zdGFrZWQ6IGFtb3VudFJlbW92ZWQsCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5Bc3NldElkOiBBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JRCksCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5zUmVjZWl2ZWQ6IHJld2FyZFJlbW92ZWQsCgkvLyAgICAgICAgICAgICB9KQoJYnl0ZSAweDEyZjRiZDRiIC8vIHJldGlPUF9zdGFrZVJlbW92ZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTIgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC00IC8vIHJld2FyZFJlbW92ZWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklEOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWIgKmlmMThfZW5kCgoqaWYxOF9lbHNlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzQ5CgkvLyB0aGlzLnJldGlPUF9zdGFrZVJlbW92ZWQubG9nKHsKCS8vICAgICAgICAgICAgICAgICBpZDogcG9vbEtleS5pZCwKCS8vICAgICAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICAgICAgcG9vbEFwcElkOiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICBzdGFrZXI6IHN0YWtlciwKCS8vICAgICAgICAgICAgICAgICBhbW91bnRVbnN0YWtlZDogYW1vdW50UmVtb3ZlZCwKCS8vICAgICAgICAgICAgICAgICAvLyBubyB0b2tlbnMgcmV3YXJkZWQuLgoJLy8gICAgICAgICAgICAgICAgIHJld2FyZFRva2VuQXNzZXRJZDogQXNzZXRJRC56ZXJvSW5kZXgsCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5zUmVjZWl2ZWQ6IDAsCgkvLyAgICAgICAgICAgICB9KQoJYnl0ZSAweDEyZjRiZDRiIC8vIHJldGlPUF9zdGFrZVJlbW92ZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTIgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAKCWNvbmNhdAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCippZjE4X2VuZDoKCS8vICppZjIwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzYxCgkvLyBzdGFrZXJSZW1vdmVkCglmcmFtZV9kaWcgLTUgLy8gc3Rha2VyUmVtb3ZlZDogYm9vbGVhbgoJYnogKmlmMjBfZW5kCgoJLy8gKmlmMjBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzYzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbcG9vbEtleS5wb29sSWQgLSAxXS50b3RhbFN0YWtlcnMgLT0gMQoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJaW50IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDEKCS0KCWl0b2IKCWV4dHJhY3QgNiAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NjUKCS8vIHJlbW92ZVJldCA9IHRoaXMucmVtb3ZlRnJvbVN0YWtlclBvb2xTZXQoc3Rha2VyLCA8VmFsaWRhdG9yUG9vbEtleT57CgkvLyAgICAgICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICAgICAgcG9vbElkOiBwb29sS2V5LnBvb2xJZCwKCS8vICAgICAgICAgICAgICAgICBwb29sQXBwSWQ6IHBvb2xLZXkucG9vbEFwcElkLAoJLy8gICAgICAgICAgICAgfSkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY2FsbHN1YiByZW1vdmVGcm9tU3Rha2VyUG9vbFNldAoJZnJhbWVfYnVyeSAxIC8vIHJlbW92ZVJldDogKGJvb2wsYm9vbCkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NzAKCS8vIHN0YWtlck91dE9mVGhpc1ZhbGlkYXRvciA9IHJlbW92ZVJldFswXQoJZnJhbWVfZGlnIDEgLy8gcmVtb3ZlUmV0OiAoYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWludCAwCglnZXRiaXQKCWZyYW1lX2J1cnkgMiAvLyBzdGFrZXJPdXRPZlRoaXNWYWxpZGF0b3I6IGJvb2wKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NzEKCS8vIHN0YWtlck91dE9mUHJvdG9jb2wgPSByZW1vdmVSZXRbMV0KCWZyYW1lX2RpZyAxIC8vIHJlbW92ZVJldDogKGJvb2wsYm9vbCkKCXN0b3JlIDI1NSAvLyBmdWxsIGFycmF5Cglsb2FkIDI1NSAvLyBmdWxsIGFycmF5CglpbnQgMQoJZ2V0Yml0CglmcmFtZV9idXJ5IDMgLy8gc3Rha2VyT3V0T2ZQcm90b2NvbDogYm9vbAoKCS8vICppZjIxX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzczCgkvLyBzdGFrZXJPdXRPZlRoaXNWYWxpZGF0b3IKCWZyYW1lX2RpZyAyIC8vIHN0YWtlck91dE9mVGhpc1ZhbGlkYXRvcjogYm9vbAoJYnogKmlmMjFfZW5kCgoJLy8gKmlmMjFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Nzc0CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUudG90YWxTdGFrZXJzIC09IDEKCWludCAyNDQKCWR1cAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDEKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKKmlmMjFfZW5kOgoJLy8gKmlmMjJfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NzcKCS8vIHN0YWtlck91dE9mUHJvdG9jb2wKCWZyYW1lX2RpZyAzIC8vIHN0YWtlck91dE9mUHJvdG9jb2w6IGJvb2wKCWJ6ICppZjIyX2VuZAoKCS8vICppZjIyX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc3OAoJLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlIC09IDEKCWJ5dGUgMHg2ZTc1NmQ1Mzc0NjE2YjY1NzI3MyAvLyAibnVtU3Rha2VycyIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMQoJLQoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJc3dhcAoJYXBwX2dsb2JhbF9wdXQKCippZjIyX2VuZDoKCippZjIwX2VuZDoKCXJldHN1YgoKLy8gZmluZFBvb2xGb3JTdGFrZXIodWludDY0LGFkZHJlc3MsdWludDY0KSgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKKmFiaV9yb3V0ZV9maW5kUG9vbEZvclN0YWtlcjoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gYW1vdW50VG9TdGFrZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglidG9pCgoJLy8gc3Rha2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDEgKHN0YWtlcikgZm9yIGZpbmRQb29sRm9yU3Rha2VyIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBmaW5kUG9vbEZvclN0YWtlcih1aW50NjQsYWRkcmVzcyx1aW50NjQpKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJY2FsbHN1YiBmaW5kUG9vbEZvclN0YWtlcgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGZpbmRQb29sRm9yU3Rha2VyKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIHN0YWtlcjogQWRkcmVzcywgYW1vdW50VG9TdGFrZTogdWludDY0KTogW1ZhbGlkYXRvclBvb2xLZXksIGJvb2xlYW4sIGJvb2xlYW5dCi8vCi8vIEZpbmRzIHRoZSBwb29sIGZvciBhIHN0YWtlciBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgdmFsaWRhdG9yIGlkLCBzdGFrZXIgYWRkcmVzcywgYW5kIGFtb3VudCB0byBzdGFrZS4KLy8gRmlyc3QgY2hlY2tzIHRoZSBzdGFrZXJzICdhbHJlYWR5IHN0YWtlZCBsaXN0JyBmb3IgdGhlIHZhbGlkYXRvciBwcmVmZXJyaW5nIHRob3NlIChhZGRpbmcgaWYgcG9zc2libGUpIHRoZW4gYWRkcwovLyB0byBuZXcgcG9vbCBpZiBuZWNlc3NhcnkuCi8vCi8vIEBwYXJhbSB7VmFsaWRhdG9ySWRUeXBlfSB2YWxpZGF0b3JJZCAtIFRoZSBpZCBvZiB0aGUgdmFsaWRhdG9yLgovLyBAcGFyYW0ge0FkZHJlc3N9IHN0YWtlciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzdGFrZXIuCi8vIEBwYXJhbSB7dWludDY0fSBhbW91bnRUb1N0YWtlIC0gVGhlIGFtb3VudCB0byBzdGFrZS4KLy8gQHJldHVybnMge1ZhbGlkYXRvclBvb2xLZXksIGJvb2xlYW4sIGJvb2xlYW59IC0gVGhlIHBvb2wgZm9yIHRoZSBzdGFrZXIsIHRydWUvZmFsc2Ugb24gd2hldGhlciB0aGUgc3Rha2VyIGlzICduZXcnCi8vIHRvIHRoaXMgVkFMSURBVE9SLCBhbmQgdHJ1ZS9mYWxzZSBpZiBzdGFrZXIgaXMgbmV3IHRvIHRoZSBwcm90b2NvbC4KZmluZFBvb2xGb3JTdGFrZXI6Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA3CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODAwCgkvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yID0gdHJ1ZQoJaW50IDEKCWZyYW1lX2J1cnkgMCAvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yOiBib29sCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODAxCgkvLyBpc05ld1N0YWtlclRvUHJvdG9jb2wgPSB0cnVlCglpbnQgMQoJZnJhbWVfYnVyeSAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgwOQoJLy8gbWF4UGVyUG9vbCA9IHRoaXMuZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sCglmcmFtZV9idXJ5IDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoJLy8gKmlmMjNfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MTIKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLmV4aXN0cwoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfbGVuCglzd2FwCglwb3AKCWJ6ICppZjIzX2VuZAoKCS8vICppZjIzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxMwoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxNAoJLy8gYXNzZXJ0KHZhbGlkYXRvcklkICE9PSAwKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWludCAwCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODE1CgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IHBvb2xTZXQubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoKKmZvcl8zOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODE1CgkvLyBpIDwgcG9vbFNldC5sZW5ndGgKCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDYKCTwKCWJ6ICpmb3JfM19lbmQKCgkvLyAqaWYyNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxNgoJLy8gZ2xvYmFscy5vcGNvZGVCdWRnZXQgPCAzMDAKCWdsb2JhbCBPcGNvZGVCdWRnZXQKCWludCAzMDAKCTwKCWJ6ICppZjI0X2VuZAoKCS8vICppZjI0X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxNwoJLy8gaW5jcmVhc2VPcGNvZGVCdWRnZXQoKQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCWludCAwCglpdHhuX2ZpZWxkIEZlZQoJYnl0ZSBiNjQgQ29FQiAvLyAjcHJhZ21hIHZlcnNpb24gMTA7IGludCAxCglkdXAKCWl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCglpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCglpbnQgRGVsZXRlQXBwbGljYXRpb24KCWl0eG5fZmllbGQgT25Db21wbGV0aW9uCglpdHhuX3N1Ym1pdAoKKmlmMjRfZW5kOgoJLy8gKmlmMjVfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MTkKCS8vIHBvb2xTZXRbaV0uaWQgPT09IDAKCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgk9PQoJYnogKmlmMjVfZW5kCgoJLy8gKmlmMjVfY29uc2VxdWVudAoJYiAqZm9yXzNfY29udGludWUKCippZjI1X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyMgoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sID0gZmFsc2UKCWludCAwCglmcmFtZV9idXJ5IDEgLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sCgoJLy8gKmlmMjZfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MjMKCS8vIHBvb2xTZXRbaV0uaWQgPT09IHZhbGlkYXRvcklkCglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgMAoJKwoJaW50IDgKCWV4dHJhY3QzCglidG9pCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJPT0KCWJ6ICppZjI2X2VuZAoKCS8vICppZjI2X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyNQoJLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciA9IGZhbHNlCglpbnQgMAoJZnJhbWVfYnVyeSAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCgkvLyAqaWYyN19jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyNwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1twb29sU2V0W2ldLnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCArCgkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50VG9TdGFrZSA8PQoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4UGVyUG9vbAoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgOCAvLyBoZWFkT2Zmc2V0CgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJKwoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8PQoJYnogKmlmMjdfZW5kCgoJLy8gKmlmMjdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODMxCgkvLyByZXR1cm4gW3Bvb2xTZXRbaV0sIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IsIGlzTmV3U3Rha2VyVG9Qcm90b2NvbF0KCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWJ5dGUgMHgwMAoJaW50IDAKCWZyYW1lX2RpZyAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCXNldGJpdAoJaW50IDEKCWZyYW1lX2RpZyAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoJc2V0Yml0Cgljb25jYXQKCWIgKmZpbmRQb29sRm9yU3Rha2VyKnJldHVybgoKKmlmMjdfZW5kOgoKKmlmMjZfZW5kOgoKKmZvcl8zX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODE1CgkvLyBpICs9IDEKCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgNCAvLyBpOiB1aW50NjQKCWIgKmZvcl8zCgoqZm9yXzNfZW5kOgoKKmlmMjNfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODM4CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBhbW91bnRUb1N0YWtlID49IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1pbkVudHJ5U3Rha2UsCgkvLyAgICAgICAgICAgICAnbXVzdCBzdGFrZSBhdCBsZWFzdCB0aGUgbWluaW11bSBmb3IgdGhpcyBwb29sJywKCS8vICAgICAgICAgKQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJaW50IDIwOQoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk+PQoKCS8vIG11c3Qgc3Rha2UgYXQgbGVhc3QgdGhlIG1pbmltdW0gZm9yIHRoaXMgcG9vbAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ0CgkvLyBwb29scyA9IGNsb25lKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHMpCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWludCA0MzIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglmcmFtZV9idXJ5IDUgLy8gcG9vbHM6ICh1aW50NjQsdWludDE2LHVpbnQ2NClbMjRdCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ1CgkvLyBjdXJOdW1Qb29scyA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUubnVtUG9vbHMgYXMgdWludDY0CglpbnQgMjQyCglpbnQgMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgNiAvLyBjdXJOdW1Qb29sczogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ2CgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IGN1ck51bVBvb2xzOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA3IC8vIGk6IHVpbnQ2NAoKKmZvcl80OgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ2CgkvLyBpIDwgY3VyTnVtUG9vbHMKCWZyYW1lX2RpZyA3IC8vIGk6IHVpbnQ2NAoJZnJhbWVfZGlnIDYgLy8gY3VyTnVtUG9vbHM6IHVpbnQ2NAoJPAoJYnogKmZvcl80X2VuZAoKCS8vICppZjI4X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ3CgkvLyBwb29sc1tpXS50b3RhbEFsZ29TdGFrZWQgKyBhbW91bnRUb1N0YWtlIDw9IG1heFBlclBvb2wKCWZyYW1lX2RpZyA1IC8vIHBvb2xzOiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJKwoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8PQoJYnogKmlmMjhfZW5kCgoJLy8gKmlmMjhfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ4CgkvLyByZXR1cm4gWwoJLy8gICAgICAgICAgICAgICAgICAgICB7IGlkOiB2YWxpZGF0b3JJZCwgcG9vbElkOiBpICsgMSwgcG9vbEFwcElkOiBwb29sc1tpXS5wb29sQXBwSWQgfSwKCS8vICAgICAgICAgICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciwKCS8vICAgICAgICAgICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1Byb3RvY29sLAoJLy8gICAgICAgICAgICAgICAgIF0KCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxCgkrCglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyA1IC8vIHBvb2xzOiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglieXRlIDB4MDAKCWludCAwCglmcmFtZV9kaWcgMCAvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yOiBib29sCglzZXRiaXQKCWludCAxCglmcmFtZV9kaWcgMSAvLyBpc05ld1N0YWtlclRvUHJvdG9jb2w6IGJvb2wKCXNldGJpdAoJY29uY2F0CgliICpmaW5kUG9vbEZvclN0YWtlcipyZXR1cm4KCippZjI4X2VuZDoKCipmb3JfNF9jb250aW51ZToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg0NgoJLy8gaSArPSAxCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDcgLy8gaTogdWludDY0CgliICpmb3JfNAoKKmZvcl80X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg1NgoJLy8gcmV0dXJuIFt7IGlkOiB2YWxpZGF0b3JJZCwgcG9vbElkOiAwLCBwb29sQXBwSWQ6IDAgfSwgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciwgaXNOZXdTdGFrZXJUb1Byb3RvY29sXQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCgljb25jYXQKCWJ5dGUgMHgwMAoJaW50IDAKCWZyYW1lX2RpZyAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCXNldGJpdAoJaW50IDEKCWZyYW1lX2RpZyAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoJc2V0Yml0Cgljb25jYXQKCipmaW5kUG9vbEZvclN0YWtlcipyZXR1cm46CgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCgkvLyBwb3AgYWxsIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHRoZSBzdGFjawoJcG9wbiA3CglyZXRzdWIKCi8vIG1vdmVQb29sVG9Ob2RlKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKKmFiaV9yb3V0ZV9tb3ZlUG9vbFRvTm9kZToKCS8vIG5vZGVOdW06IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwoJYnRvaQoKCS8vIHBvb2xBcHBJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglidG9pCgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgbW92ZVBvb2xUb05vZGUodWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZAoJY2FsbHN1YiBtb3ZlUG9vbFRvTm9kZQoJaW50IDEKCXJldHVybgoKLy8gbW92ZVBvb2xUb05vZGUodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcG9vbEFwcElkOiB1aW50NjQsIG5vZGVOdW06IHVpbnQ2NCk6IHZvaWQKLy8KLy8gRmluZCB0aGUgc3BlY2lmaWVkIHBvb2wgKGluIGFueSBub2RlIG51bWJlcikgYW5kIG1vdmUgaXQgdG8gdGhlIHNwZWNpZmllZCBub2RlLgovLyBUaGUgcG9vbCBhY2NvdW50IGlzIGZvcmNlZCBvZmZsaW5lIGlmIG1vdmVkIHNvIHByaW9yIG5vZGUgd2lsbCBzdGlsbCBydW4gZm9yIDMyMCByb3VuZHMgYnV0Ci8vIG5ldyBrZXkgZ29lcyBvbmxpbmUgb24gbmV3IG5vZGUgc29vbiBhZnRlciAoMzIwIHJvdW5kcyBhZnRlciBpdCBnb2VzIG9ubGluZSkKLy8gTm8tb3AgaWYgc3VjY2VzcywgYXNzZXJ0cyBpZiBub3QgZm91bmQgb3IgY2FuJ3QgbW92ZSAgKG5vIHNwYWNlIGluIHRhcmdldCkKLy8gWyBPTkxZIE9XTkVSIE9SIE1BTkFHRVIgQ0FOIENIQU5HRSBdCi8vCi8vIEBwYXJhbSB7VmFsaWRhdG9ySWRUeXBlfSB2YWxpZGF0b3JJZCAtIFRoZSBpZCBvZiB0aGUgdmFsaWRhdG9yLgovLyBAcGFyYW0ge3VpbnQ2NH0gcG9vbEFwcElkCi8vIEBwYXJhbSB7dWludDY0fSBub2RlTnVtCm1vdmVQb29sVG9Ob2RlOgoJcHJvdG8gMyAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3MQoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lck9yTWFuYWdlcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyT3JNYW5hZ2VyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODczCgkvLyBub2RlUG9vbEFzc2lnbm1lbnRzID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5ub2RlUG9vbEFzc2lnbm1lbnRzKQoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfYnVyeSAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzQKCS8vIGFzc2VydChub2RlTnVtID49IDEgJiYgbm9kZU51bSA8PSBNQVhfTk9ERVMsICdub2RlIG51bWJlciBvdXQgb2YgYWxsb3dhYmxlIHJhbmdlJykKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCAxCgk+PQoJZHVwCglieiAqc2tpcF9hbmQyCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgOAoJPD0KCSYmCgoqc2tpcF9hbmQyOgoJLy8gbm9kZSBudW1iZXIgb3V0IG9mIGFsbG93YWJsZSByYW5nZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODc2CgkvLyBmb3IgKGxldCBzcmNOb2RlSWR4ID0gMDsgc3JjTm9kZUlkeCA8IE1BWF9OT0RFUzsgc3JjTm9kZUlkeCArPSAxKQoJaW50IDAKCWZyYW1lX2J1cnkgMSAvLyBzcmNOb2RlSWR4OiB1aW50NjQKCipmb3JfNToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3NgoJLy8gc3JjTm9kZUlkeCA8IE1BWF9OT0RFUwoJZnJhbWVfZGlnIDEgLy8gc3JjTm9kZUlkeDogdWludDY0CglpbnQgOAoJPAoJYnogKmZvcl81X2VuZAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3NwoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBNQVhfUE9PTFNfUEVSX05PREU7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzY6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzcKCS8vIGkgPCBNQVhfUE9PTFNfUEVSX05PREUKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDMKCTwKCWJ6ICpmb3JfNl9lbmQKCgkvLyAqaWYyOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3OAoJLy8gbm9kZVBvb2xBc3NpZ25tZW50cy5ub2Rlc1tzcmNOb2RlSWR4XS5wb29sQXBwSWRzW2ldID09PSBwb29sQXBwSWQKCWZyYW1lX2RpZyAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCWludCAwCglmcmFtZV9kaWcgMSAvLyBzcmNOb2RlSWR4OiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMAoJKwoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWZyYW1lX2RpZyAtMiAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJPT0KCWJ6ICppZjI5X2VuZAoKCS8vICppZjI5X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3OQoJLy8gYXNzZXJ0KG5vZGVOdW0gLSAxICE9PSBzcmNOb2RlSWR4LCAiY2FuJ3QgbW92ZSB0byBzYW1lIG5vZGUiKQoJZnJhbWVfZGlnIC0zIC8vIG5vZGVOdW06IHVpbnQ2NAoJaW50IDEKCS0KCWZyYW1lX2RpZyAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJIT0KCgkvLyBjYW4ndCBtb3ZlIHRvIHNhbWUgbm9kZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODgxCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLm5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbc3JjTm9kZUlkeF0ucG9vbEFwcElkc1tpXSA9IDAKCWludCA5MDAKCWZyYW1lX2RpZyAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4NAoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5nb09mZmxpbmU+KHsKCS8vICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgltZXRob2QgImdvT2ZmbGluZSgpdm9pZCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODg1CgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkKCWZyYW1lX2RpZyAtMiAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4OQoJLy8gdGhpcy5hZGRQb29sVG9Ob2RlKHZhbGlkYXRvcklkLCBwb29sQXBwSWQsIG5vZGVOdW0pCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gcG9vbEFwcElkOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGFkZFBvb2xUb05vZGUKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4OTAKCS8vIHJldHVybgoJcmV0c3ViCgoqaWYyOV9lbmQ6CgoqZm9yXzZfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzcKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzYKCipmb3JfNl9lbmQ6CgoqZm9yXzVfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzYKCS8vIHNyY05vZGVJZHggKz0gMQoJZnJhbWVfZGlnIDEgLy8gc3JjTm9kZUlkeDogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJYiAqZm9yXzUKCipmb3JfNV9lbmQ6CgkvLyBjb3VsZG4ndCBmaW5kIHBvb2wgYXBwIGlkIGluIG5vZGVzIHRvIG1vdmUKCWVycgoJcmV0c3ViCgovLyBlbXB0eVRva2VuUmV3YXJkcyh1aW50NjQsYWRkcmVzcyl1aW50NjQKKmFiaV9yb3V0ZV9lbXB0eVRva2VuUmV3YXJkczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gcmVjZWl2ZXI6IGFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMzIKCT09CgoJLy8gYXJndW1lbnQgMCAocmVjZWl2ZXIpIGZvciBlbXB0eVRva2VuUmV3YXJkcyBtdXN0IGJlIGEgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZW1wdHlUb2tlblJld2FyZHModWludDY0LGFkZHJlc3MpdWludDY0CgljYWxsc3ViIGVtcHR5VG9rZW5SZXdhcmRzCglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZW1wdHlUb2tlblJld2FyZHModmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcmVjZWl2ZXI6IEFkZHJlc3MpOiB1aW50NjQKLy8KLy8gU2VuZHMgdGhlIHJld2FyZCB0b2tlbnMgaGVsZCBpbiBwb29sIDEgdG8gc3BlY2lmaWVkIHJlY2VpdmVyLgovLyBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgdGhlIG93bmVyIHdoZW4gdGhleSB3YW50IHRvIGdldCByZXdhcmQgdG9rZW5zICdiYWNrJyB3aGljaCB0aGV5IHNlbnQgdG8KLy8gdGhlIGZpcnN0IHBvb2wgKGxpa2VseSBiZWNhdXNlIHZhbGlkYXRvciBpcyBzdW5zZXR0aW5nLiAgQW55IHRva2VucyBjdXJyZW50bHkgJ3Jlc2VydmVkJyBmb3Igc3Rha2VycyB0byBjbGFpbSB3aWxsCi8vIE5PVCBiZSBzZW50IGFzIHRoZXkgbXVzdCBiZSBoZWxkIGJhY2sgZm9yIHN0YWtlcnMgdG8gbGF0ZXIgY2xhaW0uCi8vIFsgT05MWSBPV05FUiBDQU4gQ0FMTF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7QWRkcmVzc30gcmVjZWl2ZXIgLSB0aGUgYWNjb3VudCB0byBzZW5kIHRoZSB0b2tlbnMgdG8gKG11c3QgYWxyZWFkeSBiZSBvcHRlZC1pbiB0byB0aGUgcmV3YXJkIHRva2VuKQovLyBAcmV0dXJucyB7dWludDY0fSB0aGUgYW1vdW50IG9mIHJld2FyZCB0b2tlbiBzZW50CmVtcHR5VG9rZW5SZXdhcmRzOgoJcHJvdG8gMiAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkwOQoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTEwCgkvLyByZXdhcmRUb2tlbklkID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcucmV3YXJkVG9rZW5JZAoJaW50IDE1MwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTExCgkvLyByZXdhcmRUb2tlbkhlbGRCYWNrID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5yZXdhcmRUb2tlbkhlbGRCYWNrCglpbnQgMjYwCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMSAvLyByZXdhcmRUb2tlbkhlbGRCYWNrOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MTIKCS8vIGFzc2VydChyZXdhcmRUb2tlbklkICE9PSAwLCAidGhpcyB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIGEgcmV3YXJkIHRva2VuIGRlZmluZWQiKQoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0CglpbnQgMAoJIT0KCgkvLyB0aGlzIHZhbGlkYXRvciBkb2Vzbid0IGhhdmUgYSByZXdhcmQgdG9rZW4gZGVmaW5lZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTEzCgkvLyBwb29sT25lQXBwSWQgPSBBcHBJRC5mcm9tVWludDY0KHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkKQoJaW50IDI2OAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MTUKCS8vIHRva2VuUmV3YXJkQmFsID0KCS8vICAgICAgICAgICAgIHBvb2xPbmVBcHBJZC5hZGRyZXNzLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JZCkpIC0gcmV3YXJkVG9rZW5IZWxkQmFjawoJZnJhbWVfZGlnIDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCXBvcAoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0Cglhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKCXBvcAoJZnJhbWVfZGlnIDEgLy8gcmV3YXJkVG9rZW5IZWxkQmFjazogdWludDY0CgktCglmcmFtZV9idXJ5IDMgLy8gdG9rZW5SZXdhcmRCYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkxOQoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5wYXlUb2tlblJld2FyZD4oewoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25JRDogcG9vbE9uZUFwcElkLAoJLy8gICAgICAgICAgICAgbWV0aG9kQXJnczogW3JlY2VpdmVyLCByZXdhcmRUb2tlbklkLCB0b2tlblJld2FyZEJhbF0sCgkvLyAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJbWV0aG9kICJwYXlUb2tlblJld2FyZChhZGRyZXNzLHVpbnQ2NCx1aW50NjQpdm9pZCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTIwCgkvLyBhcHBsaWNhdGlvbklEOiBwb29sT25lQXBwSWQKCWZyYW1lX2RpZyAyIC8vIHBvb2xPbmVBcHBJZDogdWludDY0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MjEKCS8vIG1ldGhvZEFyZ3M6IFtyZWNlaXZlciwgcmV3YXJkVG9rZW5JZCwgdG9rZW5SZXdhcmRCYWxdCglmcmFtZV9kaWcgLTIgLy8gcmVjZWl2ZXI6IEFkZHJlc3MKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklkOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMyAvLyB0b2tlblJld2FyZEJhbDogdWludDY0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MjMKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHBvb2xPbmVBcHBJZC5hZGRyZXNzLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JZCkpID09PSByZXdhcmRUb2tlbkhlbGRCYWNrLAoJLy8gICAgICAgICAgICAgJ2JhbGFuY2Ugb2YgcmVtYWluaW5nIHJld2FyZCB0b2tlbnMgc2hvdWxkIG1hdGNoIHRoZSBoZWxkIGJhY2sgYW1vdW50JywKCS8vICAgICAgICAgKQoJZnJhbWVfZGlnIDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCXBvcAoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0Cglhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKCXBvcAoJZnJhbWVfZGlnIDEgLy8gcmV3YXJkVG9rZW5IZWxkQmFjazogdWludDY0Cgk9PQoKCS8vIGJhbGFuY2Ugb2YgcmVtYWluaW5nIHJld2FyZCB0b2tlbnMgc2hvdWxkIG1hdGNoIHRoZSBoZWxkIGJhY2sgYW1vdW50Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MjcKCS8vIHJldHVybiB0b2tlblJld2FyZEJhbAoJZnJhbWVfZGlnIDMgLy8gdG9rZW5SZXdhcmRCYWw6IHVpbnQ2NAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDMKCXJldHN1YgoKLy8gY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IHZvaWQKY2FsbGVyTXVzdEJlT3duZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDIwCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICB0aGlzLnR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLAoJLy8gICAgICAgICAgICAgJ2NhbiBvbmx5IGJlIGNhbGxlZCBieSB2YWxpZGF0b3Igb3duZXInLAoJLy8gICAgICAgICApCgl0eG4gU2VuZGVyCglpbnQgOAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJPT0KCgkvLyBjYW4gb25seSBiZSBjYWxsZWQgYnkgdmFsaWRhdG9yIG93bmVyCglhc3NlcnQKCXJldHN1YgoKLy8gY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXIodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IHZvaWQKY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDI3CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICB0aGlzLnR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyIHx8CgkvLyAgICAgICAgICAgICAgICAgdGhpcy50eG4uc2VuZGVyID09PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5tYW5hZ2VyLAoJLy8gICAgICAgICAgICAgJ2NhbiBvbmx5IGJlIGNhbGxlZCBieSBvd25lciBvciBtYW5hZ2VyIG9mIHZhbGlkYXRvcicsCgkvLyAgICAgICAgICkKCXR4biBTZW5kZXIKCWludCA4CglpbnQgMzIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0Cgk9PQoJZHVwCglibnogKnNraXBfb3IzCgl0eG4gU2VuZGVyCglpbnQgNDAKCWludCAzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCT09Cgl8fAoKKnNraXBfb3IzOgoJLy8gY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IG93bmVyIG9yIG1hbmFnZXIgb2YgdmFsaWRhdG9yCglhc3NlcnQKCXJldHN1YgoKLy8gdmVyaWZ5UG9vbEtleUNhbGxlcihwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5KTogdm9pZAovLwovLyB2ZXJpZnlQb29sS2V5Q2FsbGVyIHZlcmlmaWVzIHRoZSBwYXNzZWQgaW4ga2V5IChmcm9tIGEgc3Rha2luZyBwb29sIGNhbGxpbmcgdXMgdG8gdXBkYXRlIG1ldHJpY3MpIGlzIHZhbGlkCi8vIGFuZCBtYXRjaGVzIHRoZSBpbmZvcm1hdGlvbiB3ZSBoYXZlIGluIG91ciBzdGF0ZS4gICdGYWtlJyBwb29scyBjb3VsZCBjYWxsIHVzIHRvIHVwZGF0ZSBvdXIgZGF0YSwgYnV0IHRoZXkKLy8gY2FuJ3QgZmFrZSB0aGUgaWRzIGFuZCBtb3N0IGltcG9ydGFudGx5IGFwcGxpY2F0aW9uIGlkKCEpIG9mIHRoZSBjYWxsZXIgdGhhdCBoYXMgdG8gbWF0Y2guCnZlcmlmeVBvb2xLZXlDYWxsZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDQwCgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLmV4aXN0cywgInRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGlzbid0IHZhbGlkIikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cglib3hfbGVuCglzd2FwCglwb3AKCgkvLyB0aGUgc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBpc24ndCB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA0MQoJLy8gYXNzZXJ0KHBvb2xLZXkucG9vbElkIDw9IE1BWF9QT09MUywgJ3Bvb2wgaWQgbm90IGluIHZhbGlkIHJhbmdlJykKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDI0Cgk8PQoKCS8vIHBvb2wgaWQgbm90IGluIHZhbGlkIHJhbmdlCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDQyCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBwb29sS2V5LnBvb2xJZCA+IDAgJiYgKHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNikgPD0gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLm51bVBvb2xzLAoJLy8gICAgICAgICAgICAgJ3Bvb2wgaWQgb3V0c2lkZSBvZiByYW5nZSBvZiBwb29scyBjcmVhdGVkIGZvciB0aGlzIHZhbGlkYXRvcicsCgkvLyAgICAgICAgICkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDAKCT4KCWR1cAoJYnogKnNraXBfYW5kMwoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMjQyCglpbnQgMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk8PQoJJiYKCipza2lwX2FuZDM6CgkvLyBwb29sIGlkIG91dHNpZGUgb2YgcmFuZ2Ugb2YgcG9vbHMgY3JlYXRlZCBmb3IgdGhpcyB2YWxpZGF0b3IKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNDgKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHBvb2xLZXkucG9vbEFwcElkID09PSB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbcG9vbEtleS5wb29sSWQgLSAxXS5wb29sQXBwSWQsCgkvLyAgICAgICAgICAgICAiVGhlIHBhc3NlZCBpbiBhcHAgaWQgZG9lc24ndCBtYXRjaCB0aGUgcGFzc2VkIGluIGlkcyIsCgkvLyAgICAgICAgICkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk9PQoKCS8vIFRoZSBwYXNzZWQgaW4gYXBwIGlkIGRvZXNuJ3QgbWF0Y2ggdGhlIHBhc3NlZCBpbiBpZHMKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNTMKCS8vIGFzc2VydCh0aGlzLnR4bi5zZW5kZXIgPT09IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLmFkZHJlc3MpCgl0eG4gU2VuZGVyCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAxNiA4CglidG9pCglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCT09Cglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDU1CgkvLyBhc3NlcnQocG9vbEtleS5pZCA9PT0gKEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLmdsb2JhbFN0YXRlKCd2YWxpZGF0b3JJZCcpIGFzIHVpbnQ2NCkpCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWJ5dGUgMHg3NjYxNmM2OTY0NjE3NDZmNzI0OTY0IC8vICJ2YWxpZGF0b3JJZCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgndmFsaWRhdG9ySWQnKQoJYXNzZXJ0Cgk9PQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA1NgoJLy8gYXNzZXJ0KHBvb2xLZXkucG9vbElkID09PSAoQXBwSUQuZnJvbVVpbnQ2NChwb29sS2V5LnBvb2xBcHBJZCkuZ2xvYmFsU3RhdGUoJ3Bvb2xJZCcpIGFzIHVpbnQ2NCkpCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWJ5dGUgMHg3MDZmNmY2YzQ5NjQgLy8gInBvb2xJZCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgncG9vbElkJykKCWFzc2VydAoJPT0KCWFzc2VydAoJcmV0c3ViCgovLyByZXZlcmlmeU5GRE93bmVyc2hpcCh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogdm9pZAovLwovLyBUaGlzIG1ldGhvZCB2ZXJpZmllcyB0aGUgb3duZXJzaGlwIG9mIE5GRCAoTmFtZWQgRnVuY3Rpb24gRGF0YSkgYnkgYSB2YWxpZGF0b3IuCi8vIElmIHRoZSBvd25lcnNoaXAgaXMgbm8gbG9uZ2VyIHZhbGlkLCBpdCByZW1vdmVzIHRoZSBORkQgZnJvbSB0aGUgdmFsaWRhdG9yJ3MgY29uZmlndXJhdGlvbi4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3Igd2hvc2UgZGF0YSBzaG91bGQgYmUgcmUtZXZhbHVhdGVkLgpyZXZlcmlmeU5GRE93bmVyc2hpcDoKCXByb3RvIDEgMAoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDY2CgkvLyB2YWxpZGF0b3JDb25maWcgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZwoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJZnJhbWVfYnVyeSAwIC8vIHN0b3JhZ2Uga2V5Ly92YWxpZGF0b3JDb25maWcKCgkvLyAqaWYzMF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNjcKCS8vIHZhbGlkYXRvckNvbmZpZy5uZmRGb3JJbmZvICE9PSAwCglpbnQgNzIKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDAKCSE9CglieiAqaWYzMF9lbmQKCgkvLyAqaWYzMF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDcwCgkvLyBuZmRPd25lciA9IEFwcElELmZyb21VaW50NjQodmFsaWRhdG9yQ29uZmlnLm5mZEZvckluZm8pLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzCglpbnQgNzIKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQodmFsaWRhdG9yQ29uZmlnLm5mZEZvckluZm8pLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCgkvLyAqaWYzMV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNzIKCS8vIHZhbGlkYXRvckNvbmZpZy5vd25lciAhPT0gbmZkT3duZXIgJiYgdmFsaWRhdG9yQ29uZmlnLm1hbmFnZXIgIT09IG5mZE93bmVyCglpbnQgOAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfZGlnIDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCSE9CglkdXAKCWJ6ICpza2lwX2FuZDQKCWludCA0MAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfZGlnIDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCSE9CgkmJgoKKnNraXBfYW5kNDoKCWJ6ICppZjMxX2VuZAoKCS8vICppZjMxX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNzQKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm5mZEZvckluZm8gPSAwCglpbnQgNzIKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKKmlmMzFfZW5kOgoKKmlmMzBfZW5kOgoJcmV0c3ViCgovLyB2YWxpZGF0ZUNvbmZpZyhjb25maWc6IFZhbGlkYXRvckNvbmZpZyk6IHZvaWQKdmFsaWRhdGVDb25maWc6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDgxCgkvLyBhc3NlcnQoY29uZmlnLm93bmVyICE9PSBBZGRyZXNzLnplcm9BZGRyZXNzKQoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDggMzIKCWdsb2JhbCBaZXJvQWRkcmVzcwoJIT0KCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwODIKCS8vIGFzc2VydChjb25maWcubWFuYWdlciAhPT0gQWRkcmVzcy56ZXJvQWRkcmVzcykKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA0MCAzMgoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA4MwoJLy8gYXNzZXJ0KHRoaXMudHhuLnNlbmRlciA9PT0gY29uZmlnLm93bmVyLCAnc2VuZGVyIG11c3QgYmUgb3duZXIgdG8gYWRkIG5ldyB2YWxpZGF0b3InKQoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDggMzIKCT09CgoJLy8gc2VuZGVyIG11c3QgYmUgb3duZXIgdG8gYWRkIG5ldyB2YWxpZGF0b3IKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwODUKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIGNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPj0gR0FUSU5HX1RZUEVfTk9ORSAmJiBjb25maWcuZW50cnlHYXRpbmdUeXBlIDw9IEdBVElOR19UWVBFX0NPTlNUX01BWCwKCS8vICAgICAgICAgICAgICdnYXRpbmcgdHlwZSBub3QgdmFsaWQnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgODAgMQoJYnRvaQoJaW50IDAKCT49CglkdXAKCWJ6ICpza2lwX2FuZDUKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4MCAxCglidG9pCglpbnQgNAoJPD0KCSYmCgoqc2tpcF9hbmQ1OgoJLy8gZ2F0aW5nIHR5cGUgbm90IHZhbGlkCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDg5CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBjb25maWcuZXBvY2hSb3VuZExlbmd0aCA+PSBNSU5fRVBPQ0hfTEVOR1RIICYmIGNvbmZpZy5lcG9jaFJvdW5kTGVuZ3RoIDw9IE1BWF9FUE9DSF9MRU5HVEgsCgkvLyAgICAgICAgICAgICAnZXBvY2ggbGVuZ3RoIG5vdCBpbiBhbGxvd2FibGUgcmFuZ2UnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTY5IDQKCWJ0b2kKCWludCAxCgk+PQoJZHVwCglieiAqc2tpcF9hbmQ2CglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTY5IDQKCWJ0b2kKCWludCAxMDAwMDAwCgk8PQoJJiYKCipza2lwX2FuZDY6CgkvLyBlcG9jaCBsZW5ndGggbm90IGluIGFsbG93YWJsZSByYW5nZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA5MwoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgY29uZmlnLnBlcmNlbnRUb1ZhbGlkYXRvciA+PSBNSU5fUENUX1RPX1ZBTElEQVRPUiAmJiBjb25maWcucGVyY2VudFRvVmFsaWRhdG9yIDw9IE1BWF9QQ1RfVE9fVkFMSURBVE9SLAoJLy8gICAgICAgICAgICAgJ2NvbW1pc3Npb24gcGVyY2VudGFnZSBub3QgdmFsaWQnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTczIDQKCWJ0b2kKCWludCAwCgk+PQoJZHVwCglieiAqc2tpcF9hbmQ3CglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTczIDQKCWJ0b2kKCWludCAxMDAwMDAwCgk8PQoJJiYKCipza2lwX2FuZDc6CgkvLyBjb21taXNzaW9uIHBlcmNlbnRhZ2Ugbm90IHZhbGlkCglhc3NlcnQKCgkvLyAqaWYzMl9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwOTcKCS8vIGNvbmZpZy5wZXJjZW50VG9WYWxpZGF0b3IgIT09IDAKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAxNzMgNAoJYnRvaQoJaW50IDAKCSE9CglieiAqaWYzMl9lbmQKCgkvLyAqaWYzMl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDk4CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgY29uZmlnLnZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzICE9PSBBZGRyZXNzLnplcm9BZGRyZXNzLAoJLy8gICAgICAgICAgICAgICAgICd2YWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyBtdXN0IGJlIHNldCBpZiBwZXJjZW50IHRvIHZhbGlkYXRvciBpcyBub3QgMCcsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTc3IDMyCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CgoJLy8gdmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MgbXVzdCBiZSBzZXQgaWYgcGVyY2VudCB0byB2YWxpZGF0b3IgaXMgbm90IDAKCWFzc2VydAoKKmlmMzJfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEwMwoJLy8gYXNzZXJ0KGNvbmZpZy5taW5FbnRyeVN0YWtlID49IE1JTl9BTEdPX1NUQUtFX1BFUl9QT09MLCAnc3Rha2luZyBwb29sIG11c3QgaGF2ZSBtaW5pbXVtIGVudHJ5IG9mIDEgYWxnbycpCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMjA5IDgKCWJ0b2kKCWludCAxMDAwMDAwCgk+PQoKCS8vIHN0YWtpbmcgcG9vbCBtdXN0IGhhdmUgbWluaW11bSBlbnRyeSBvZiAxIGFsZ28KCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMDUKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIGNvbmZpZy5wb29sc1Blck5vZGUgPiAwICYmIGNvbmZpZy5wb29sc1Blck5vZGUgPD0gTUFYX1BPT0xTX1BFUl9OT0RFLAoJLy8gICAgICAgICAgICAgJ251bWJlciBvZiBwb29scyBwZXIgbm9kZSBtdXN0IGJlIGJlIGJldHdlZW4gMSBhbmQgdGhlIG1heGltdW0gYWxsb3dlZCBudW1iZXInLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMjI1IDEKCWJ0b2kKCWludCAwCgk+CglkdXAKCWJ6ICpza2lwX2FuZDgKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAyMjUgMQoJYnRvaQoJaW50IDMKCTw9CgkmJgoKKnNraXBfYW5kODoKCS8vIG51bWJlciBvZiBwb29scyBwZXIgbm9kZSBtdXN0IGJlIGJlIGJldHdlZW4gMSBhbmQgdGhlIG1heGltdW0gYWxsb3dlZCBudW1iZXIKCWFzc2VydAoKCS8vICppZjMzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEwOQoJLy8gY29uZmlnLnN1bnNldHRpbmdPbiAhPT0gMAoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDIyNiA4CglidG9pCglpbnQgMAoJIT0KCWJ6ICppZjMzX2VuZAoKCS8vICppZjMzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMTAKCS8vIGFzc2VydChjb25maWcuc3Vuc2V0dGluZ09uID4gZ2xvYmFscy5sYXRlc3RUaW1lc3RhbXAsICdzdW5zZXR0aW5nT24gbXVzdCBiZSBsYXRlciB0aGFuIG5vdyBpZiBzZXQnKQoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDIyNiA4CglidG9pCglnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCgk+CgoJLy8gc3Vuc2V0dGluZ09uIG11c3QgYmUgbGF0ZXIgdGhhbiBub3cgaWYgc2V0Cglhc3NlcnQKCippZjMzX2VuZDoKCXJldHN1YgoKLy8gY2FsbFBvb2xBZGRTdGFrZShzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4sIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXksIG1ickFtdFBhaWQ6IHVpbnQ2NCwgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbGVhbiwgaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sZWFuKTogdm9pZAovLwovLyBBZGRzIGEgc3Rha2VycyBhbW91bnQgb2YgYWxnbyB0byBhIHZhbGlkYXRvciBwb29sLCB0cmFuc2ZlcnJpbmcgdGhlIGFsZ28gd2UgcmVjZWl2ZWQgZnJvbSB0aGVtIChhbHJlYWR5IHZlcmlmaWVkCi8vIGJ5IG91ciBjYWxsZXIpIHRvIHRoZSBzdGFraW5nIHBvb2wgYWNjb3VudCwgYW5kIHRoZW4gdGVsbGluZyBpdCBhYm91dCB0aGUgYW1vdW50IGJlaW5nIGFkZGVkIGZvciB0aGUgc3BlY2lmaWVkCi8vIHN0YWtlci4KLy8KLy8gQHBhcmFtIHtQYXlUeG59IHN0YWtlZEFtb3VudFBheW1lbnQgLSBwYXltZW50IGNvbWluZyBmcm9tIHN0YWtlciB0byBwbGFjZSBpbnRvIGEgcG9vbAovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBUaGUga2V5IG9mIHRoZSB2YWxpZGF0b3IgcG9vbC4KLy8gQHBhcmFtIHt1aW50NjR9IG1ickFtdFBhaWQgLSBBbW91bnQgdGhlIHVzZXIgaXMgbGVhdmluZyBiZWhpbmQgaW4gdGhlIHZhbGlkYXRvciB0byBwYXkgZm9yIHRoZWlyIHN0YWtlciBNQlIgY29zdAovLyBAcGFyYW0ge2Jvb2xlYW59IGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IgLSBpZiB0aGlzIGlzIGEgbmV3LCBmaXJzdC10aW1lIHN0YWtlciB0byB0aGUgdmFsaWRhdG9yCi8vIEBwYXJhbSB7Ym9vbGVhbn0gaXNOZXdTdGFrZXJUb1Byb3RvY29sIC0gaWYgdGhpcyBpcyBhIG5ldywgZmlyc3QtdGltZSBzdGFrZXIgdG8gdGhlIHByb3RvY29sCmNhbGxQb29sQWRkU3Rha2U6Cglwcm90byA1IDAKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiAyCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEzMgoJLy8gcG9vbEFwcElkID0gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzW3Bvb2xLZXkucG9vbElkIC0gMV0ucG9vbEFwcElkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIHBvb2xBcHBJZDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEzNgoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5hZGRTdGFrZSwgdWludDY0Pih7CgkvLyAgICAgICAgICAgICBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCksCgkvLyAgICAgICAgICAgICBtZXRob2RBcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gPT09PT09PQoJLy8gICAgICAgICAgICAgICAgIC8vIFRISVMgSVMgQSBTRU5EIG9mIHRoZSBhbW91bnQgcmVjZWl2ZWQgcmlnaHQgYmFjayBvdXQgYW5kIGludG8gdGhlIHN0YWtpbmcgcG9vbCBjb250cmFjdCBhY2NvdW50LgoJLy8gICAgICAgICAgICAgICAgIHsgYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQsIHJlY2VpdmVyOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuYWRkcmVzcyB9LAoJLy8gICAgICAgICAgICAgICAgIC8vID09PT09PT0KCS8vICAgICAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LnNlbmRlciwKCS8vICAgICAgICAgICAgIF0sCgkvLyAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgcGF5CglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE0MQoJLy8gYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJZnJhbWVfZGlnIC0zIC8vIG1ickFtdFBhaWQ6IHVpbnQ2NAoJLQoJaXR4bl9maWVsZCBBbW91bnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTQxCgkvLyByZWNlaXZlcjogQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmFkZHJlc3MKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCWl0eG5fZmllbGQgUmVjZWl2ZXIKCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCWl0eG5fbmV4dAoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAiYWRkU3Rha2UocGF5LGFkZHJlc3MpdWludDY0IgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTM3CgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTM4CgkvLyBtZXRob2RBcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gPT09PT09PQoJLy8gICAgICAgICAgICAgICAgIC8vIFRISVMgSVMgQSBTRU5EIG9mIHRoZSBhbW91bnQgcmVjZWl2ZWQgcmlnaHQgYmFjayBvdXQgYW5kIGludG8gdGhlIHN0YWtpbmcgcG9vbCBjb250cmFjdCBhY2NvdW50LgoJLy8gICAgICAgICAgICAgICAgIHsgYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQsIHJlY2VpdmVyOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuYWRkcmVzcyB9LAoJLy8gICAgICAgICAgICAgICAgIC8vID09PT09PT0KCS8vICAgICAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LnNlbmRlciwKCS8vICAgICAgICAgICAgIF0KCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIFNlbmRlcgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCgkvLyBTdWJtaXQgaW5uZXIgdHJhbnNhY3Rpb24KCWl0eG5fc3VibWl0CglpdHhuIE51bUxvZ3MKCWludCAxCgktCglpdHhuYXMgTG9ncwoJZXh0cmFjdCA0IDAKCWJ0b2kKCgkvLyAqaWYzNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNDYKCS8vIGdsb2JhbHMub3Bjb2RlQnVkZ2V0IDwgNTAwCglnbG9iYWwgT3Bjb2RlQnVkZ2V0CglpbnQgNTAwCgk8CglieiAqaWYzNF9lbmQKCgkvLyAqaWYzNF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTQ3CgkvLyBpbmNyZWFzZU9wY29kZUJ1ZGdldCgpCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJaW50IDAKCWl0eG5fZmllbGQgRmVlCglieXRlIGI2NCBDb0VCIC8vICNwcmFnbWEgdmVyc2lvbiAxMDsgaW50IDEKCWR1cAoJaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCWludCBEZWxldGVBcHBsaWNhdGlvbgoJaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KCWl0eG5fc3VibWl0CgoqaWYzNF9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTUxCgkvLyBwb29sTnVtU3Rha2VycyA9IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgnbnVtU3Rha2VycycpIGFzIHVpbnQ2NAoJZnJhbWVfZGlnIDAgLy8gcG9vbEFwcElkOiB1aW50NjQKCWJ5dGUgMHg2ZTc1NmQ1Mzc0NjE2YjY1NzI3MyAvLyAibnVtU3Rha2VycyIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuZ2xvYmFsU3RhdGUoJ251bVN0YWtlcnMnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDEgLy8gcG9vbE51bVN0YWtlcnM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNTIKCS8vIHBvb2xBbGdvU3Rha2VkID0gQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmdsb2JhbFN0YXRlKCdzdGFrZWQnKSBhcyB1aW50NjQKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglhcHBfZ2xvYmFsX2dldF9leAoKCS8vIGdsb2JhbCBzdGF0ZSB2YWx1ZSBkb2VzIG5vdCBleGlzdDogQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmdsb2JhbFN0YXRlKCdzdGFrZWQnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDIgLy8gcG9vbEFsZ29TdGFrZWQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNTMKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsU3Rha2VycyA9IHBvb2xOdW1TdGFrZXJzIGFzIHVpbnQxNgoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJZnJhbWVfZGlnIDEgLy8gcG9vbE51bVN0YWtlcnM6IHVpbnQ2NAoJaXRvYgoJZXh0cmFjdCA2IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNTQKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCA9IHBvb2xBbGdvU3Rha2VkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJZnJhbWVfZGlnIDIgLy8gcG9vbEFsZ29TdGFrZWQ6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gKmlmMzVfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTU3CgkvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yCglmcmFtZV9kaWcgLTQgLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbGVhbgoJYnogKmlmMzVfZW5kCgoJLy8gKmlmMzVfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE1OAoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsU3Rha2VycyArPSAxCglpbnQgMjQ0CglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWludCAxCgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCippZjM1X2VuZDoKCS8vICppZjM2X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE2MAoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sCglmcmFtZV9kaWcgLTUgLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sZWFuCglieiAqaWYzNl9lbmQKCgkvLyAqaWYzNl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTYxCgkvLyB0aGlzLm51bVN0YWtlcnMudmFsdWUgKz0gMQoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJYXBwX2dsb2JhbF9nZXQKCWludCAxCgkrCglieXRlIDB4NmU3NTZkNTM3NDYxNmI2NTcyNzMgLy8gIm51bVN0YWtlcnMiCglzd2FwCglhcHBfZ2xvYmFsX3B1dAoKKmlmMzZfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE2MwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsQWxnb1N0YWtlZCArPSBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWludCAyNTIKCWR1cAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4bgoJZ3R4bnMgQW1vdW50CglmcmFtZV9kaWcgLTMgLy8gbWJyQW10UGFpZDogdWludDY0CgktCgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTY0CgkvLyB0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSArPSBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCWFwcF9nbG9iYWxfZ2V0CglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBBbW91bnQKCWZyYW1lX2RpZyAtMyAvLyBtYnJBbXRQYWlkOiB1aW50NjQKCS0KCSsKCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCXN3YXAKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIHVwZGF0ZVN0YWtlclBvb2xTZXQoc3Rha2VyOiBBZGRyZXNzLCBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5KTogdm9pZAp1cGRhdGVTdGFrZXJQb29sU2V0OgoJcHJvdG8gMiAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjgKCS8vIGFzc2VydCh0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS5leGlzdHMpCglieXRlIDB4NzM3MDczIC8vICJzcHMiCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE3MAoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDAgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNzEKCS8vIGZpcnN0RW1wdHkgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNzIKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoKKmZvcl83OgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE3MgoJLy8gaSA8IHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlLmxlbmd0aAoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl83X2VuZAoKCS8vICppZjM3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE3MwoJLy8gcG9vbFNldFtpXSA9PT0gcG9vbEtleQoJZnJhbWVfZGlnIDAgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDI0CglleHRyYWN0MwoJZnJhbWVfZGlnIC0yIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCT09CglieiAqaWYzN19lbmQKCgkvLyAqaWYzN19jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTc1CgkvLyByZXR1cm4KCXJldHN1YgoKKmlmMzdfZW5kOgoJLy8gKmlmMzhfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTc3CgkvLyBmaXJzdEVtcHR5ID09PSAwICYmIHBvb2xTZXRbaV0uaWQgPT09IDAKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDAKCT09CglkdXAKCWJ6ICpza2lwX2FuZDkKCWZyYW1lX2RpZyAwIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgk9PQoJJiYKCipza2lwX2FuZDk6CglieiAqaWYzOF9lbmQKCgkvLyAqaWYzOF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTc4CgkvLyBmaXJzdEVtcHR5ID0gaSArIDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMSAvLyBmaXJzdEVtcHR5OiB1aW50NjQKCippZjM4X2VuZDoKCipmb3JfN19jb250aW51ZToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNzIKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzcKCipmb3JfN19lbmQ6CgkvLyAqaWYzOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExODEKCS8vIGZpcnN0RW1wdHkgPT09IDAKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDAKCT09CglieiAqaWYzOV9lbmQKCgkvLyAqaWYzOV9jb25zZXF1ZW50CgkvLyBObyBlbXB0eSBzbG90IGF2YWlsYWJsZSBpbiB0aGUgc3Rha2VyIHBvb2wgc2V0CgllcnIKCippZjM5X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExODQKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlW2ZpcnN0RW1wdHkgLSAxXSA9IHBvb2xLZXkKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDEKCS0KCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyByZW1vdmVGcm9tU3Rha2VyUG9vbFNldChzdGFrZXI6IEFkZHJlc3MsIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkpOiBbYm9vbGVhbiwgYm9vbGVhbl0KLy8KLy8gUmVtb3ZlcyBhIHBvb2wga2V5IGZyb20gdGhlIHN0YWtlcidzIGFjdGl2ZSBwb29sIHNldCAtIGZhaWxzIGlmIG5vdCBmb3VuZCAoISkKLy8KLy8gQHBhcmFtIHtBZGRyZXNzfSBzdGFrZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgc3Rha2VyLgovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBUaGUgcG9vbCBrZXkgdGhleSBzaG91bGQgYmUgc3RvcmVkIGluCi8vCi8vIEByZXR1cm4gW2Jvb2xlYW4sIGJvb2xlYW5dIFtpcyB0aGUgc3Rha2VyIGdvbmUgZnJvbSBBTEwgcG9vbHMgb2YgdGhlIGdpdmVuIFZBTElEQVRPUiwgYW5kIGlzIHN0YWtlciBnb25lIGZyb20gQUxMIHBvb2xzXQpyZW1vdmVGcm9tU3Rha2VyUG9vbFNldDoKCXByb3RvIDIgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTk3CgkvLyBpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAwIC8vIGluU2FtZVZhbGlkYXRvclBvb2xDb3VudDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5OAoJLy8gaW5BbnlQb29sQ291bnQgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAxIC8vIGluQW55UG9vbENvdW50OiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTk5CgkvLyBmb3VuZCA9IGZhbHNlCglpbnQgMAoJZnJhbWVfYnVyeSAyIC8vIGZvdW5kOiBib29sCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwMQoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDIKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoKKmZvcl84OgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwMgoJLy8gaSA8IHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlLmxlbmd0aAoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl84X2VuZAoKCS8vICppZjQwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwMwoJLy8gcG9vbFNldFtpXS5pZCA9PT0gMAoJZnJhbWVfZGlnIDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWY0MF9lbmQKCgkvLyAqaWY0MF9jb25zZXF1ZW50CgliICpmb3JfOF9jb250aW51ZQoKKmlmNDBfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwNgoJLy8gaW5BbnlQb29sQ291bnQgKz0gMQoJZnJhbWVfZGlnIDEgLy8gaW5BbnlQb29sQ291bnQ6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMSAvLyBpbkFueVBvb2xDb3VudDogdWludDY0CgoJLy8gKmlmNDFfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjA3CgkvLyBwb29sU2V0W2ldLmlkID09PSBwb29sS2V5LmlkCglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgMAoJKwoJaW50IDgKCWV4dHJhY3QzCglidG9pCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCT09CglieiAqaWY0MV9lbmQKCgkvLyAqaWY0MV9jb25zZXF1ZW50CgkvLyAqaWY0Ml9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDgKCS8vIHBvb2xTZXRbaV0gPT09IHBvb2xLZXkKCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5Cgk9PQoJYnogKmlmNDJfZWxzZQoKCS8vICppZjQyX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDkKCS8vIGZvdW5kID0gdHJ1ZQoJaW50IDEKCWZyYW1lX2J1cnkgMiAvLyBmb3VuZDogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMTEKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlW2ldID0geyBpZDogMCwgcG9vbElkOiAwLCBwb29sQXBwSWQ6IDAgfQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJYiAqaWY0Ml9lbmQKCippZjQyX2Vsc2U6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjEzCgkvLyBpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgKz0gMQoJZnJhbWVfZGlnIDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCippZjQyX2VuZDoKCippZjQxX2VuZDoKCipmb3JfOF9jb250aW51ZToKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDIKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzgKCipmb3JfOF9lbmQ6CgkvLyAqaWY0M19jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMTcKCS8vICFmb3VuZAoJZnJhbWVfZGlnIDIgLy8gZm91bmQ6IGJvb2wKCSEKCWJ6ICppZjQzX2VuZAoKCS8vICppZjQzX2NvbnNlcXVlbnQKCS8vIE5vIG1hdGNoaW5nIHNsb3QgZm91bmQgd2hlbiB0b2xkIHRvIHJlbW92ZSBhIHBvb2wgZnJvbSB0aGUgc3Rha2VycyBzZXQKCWVycgoKKmlmNDNfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIyMQoJLy8gcmV0dXJuIFtpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgPT09IDAsIGluQW55UG9vbENvdW50ID09PSAwXQoJYnl0ZSAweDAwCglpbnQgMAoJZnJhbWVfZGlnIDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCWludCAwCgk9PQoJc2V0Yml0CglpbnQgMQoJZnJhbWVfZGlnIDEgLy8gaW5BbnlQb29sQ291bnQ6IHVpbnQ2NAoJaW50IDAKCT09CglzZXRiaXQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCgkvLyBwb3AgYWxsIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHRoZSBzdGFjawoJcG9wbiA0CglyZXRzdWIKCi8vIGFkZFBvb2xUb05vZGUodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcG9vbEFwcElkOiB1aW50NjQsIG5vZGVOdW06IHVpbnQ2NCk6IHZvaWQKYWRkUG9vbFRvTm9kZToKCXByb3RvIDMgMAoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI1CgkvLyBub2RlUG9vbEFzc2lnbm1lbnRzID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5ub2RlUG9vbEFzc2lnbm1lbnRzKQoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfYnVyeSAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI2CgkvLyBtYXhQb29sc1Blck5vZGVGb3JUaGlzVmFsaWRhdG9yID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcucG9vbHNQZXJOb2RlIGFzIHVpbnQ2NAoJaW50IDIyNQoJaW50IDEKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDEgLy8gbWF4UG9vbHNQZXJOb2RlRm9yVGhpc1ZhbGlkYXRvcjogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIyOAoJLy8gYXNzZXJ0KG5vZGVOdW0gPj0gMSAmJiBub2RlTnVtIDw9IE1BWF9OT0RFUywgJ25vZGUgbnVtYmVyIG5vdCBpbiB2YWxpZCByYW5nZScpCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgMQoJPj0KCWR1cAoJYnogKnNraXBfYW5kMTAKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCA4Cgk8PQoJJiYKCipza2lwX2FuZDEwOgoJLy8gbm9kZSBudW1iZXIgbm90IGluIHZhbGlkIHJhbmdlCglhc3NlcnQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjMwCgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IG1heFBvb2xzUGVyTm9kZUZvclRoaXNWYWxpZGF0b3I7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzk6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjMwCgkvLyBpIDwgbWF4UG9vbHNQZXJOb2RlRm9yVGhpc1ZhbGlkYXRvcgoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglmcmFtZV9kaWcgMSAvLyBtYXhQb29sc1Blck5vZGVGb3JUaGlzVmFsaWRhdG9yOiB1aW50NjQKCTwKCWJ6ICpmb3JfOV9lbmQKCgkvLyAqaWY0NF9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMzEKCS8vIG5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbbm9kZU51bSAtIDFdLnBvb2xBcHBJZHNbaV0gPT09IDAKCWZyYW1lX2RpZyAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCWludCAwCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgMQoJLQoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWY0NF9lbmQKCgkvLyAqaWY0NF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjMzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLm5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbbm9kZU51bSAtIDFdLnBvb2xBcHBJZHNbaV0gPSBwb29sQXBwSWQKCWludCA5MDAKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCAxCgktCglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDAKCSsKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJZnJhbWVfZGlnIC0yIC8vIHBvb2xBcHBJZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMzQKCS8vIHJldHVybgoJcmV0c3ViCgoqaWY0NF9lbmQ6CgoqZm9yXzlfY29udGludWU6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjMwCgkvLyBpICs9IDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCWIgKmZvcl85CgoqZm9yXzlfZW5kOgoJLy8gbm8gYXZhaWxhYmxlIHNwYWNlIGluIHNwZWNpZmllZCBub2RlIGZvciB0aGlzIHBvb2wKCWVycgoJcmV0c3ViCgovLyBkb2VzU3Rha2VyTWVldEdhdGluZyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQpOiB2b2lkCi8vCi8vIENoZWNrcyBpZiBhIHN0YWtlciBtZWV0cyB0aGUgZ2F0aW5nIHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgYnkgdGhlIHZhbGlkYXRvci4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWx1ZVRvVmVyaWZ5IC0gVGhlIHZhbHVlIHRvIHZlcmlmeSBhZ2FpbnN0IHRoZSBnYXRpbmcgcmVxdWlyZW1lbnRzLgovLyBAcmV0dXJucyB7dm9pZH0gb3IgYXNzZXJ0cyBpZiByZXF1aXJlbWVudHMgbm90IG1ldC4KZG9lc1N0YWtlck1lZXRHYXRpbmc6Cglwcm90byAyIDAKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA4CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI0OAoJLy8gdHlwZSA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLmVudHJ5R2F0aW5nVHlwZQoJaW50IDgwCglpbnQgMQoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMCAvLyB0eXBlOiB1aW50OAoKCS8vICppZjQ1X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI0OQoJLy8gdHlwZSA9PT0gR0FUSU5HX1RZUEVfTk9ORQoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAwCgk9PQoJYnogKmlmNDVfZW5kCgoJLy8gKmlmNDVfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI1MAoJLy8gcmV0dXJuCglyZXRzdWIKCippZjQ1X2VuZDoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTIKCS8vIHN0YWtlciA9IHRoaXMudHhuLnNlbmRlcgoJdHhuIFNlbmRlcgoJZnJhbWVfYnVyeSAxIC8vIHN0YWtlcjogYWRkcmVzcwoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTMKCS8vIGNvbmZpZyA9IGNsb25lKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnKQoJaW50IDAKCWludCAyNDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglmcmFtZV9idXJ5IDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCgkvLyAqaWY0Nl9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTcKCS8vIHR5cGUgPT09IEdBVElOR19UWVBFX0FTU0VUU19DUkVBVEVEX0JZIHx8CgkvLyAgICAgICAgICAgICB0eXBlID09PSBHQVRJTkdfVFlQRV9BU1NFVF9JRCB8fAoJLy8gICAgICAgICAgICAgdHlwZSA9PT0gR0FUSU5HX1RZUEVfQ1JFQVRFRF9CWV9ORkRfQUREUkVTU0VTCglmcmFtZV9kaWcgMCAvLyB0eXBlOiB1aW50OAoJaW50IDEKCT09CglkdXAKCWJueiAqc2tpcF9vcjQKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMgoJPT0KCXx8Cgoqc2tpcF9vcjQ6CglkdXAKCWJueiAqc2tpcF9vcjUKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMwoJPT0KCXx8Cgoqc2tpcF9vcjU6CglieiAqaWY0Nl9lbmQKCgkvLyAqaWY0Nl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjYxCgkvLyBhc3NlcnQodmFsdWVUb1ZlcmlmeSAhPT0gMCkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWludCAwCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI2MgoJLy8gYmFsUmVxdWlyZWQgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5nYXRpbmdBc3NldE1pbkJhbGFuY2UKCWludCAxNDUKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAzIC8vIGJhbFJlcXVpcmVkOiB1aW50NjQKCgkvLyAqaWY0N19jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNjMKCS8vIGJhbFJlcXVpcmVkID09PSAwCglmcmFtZV9kaWcgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0CglpbnQgMAoJPT0KCWJ6ICppZjQ3X2VuZAoKCS8vICppZjQ3X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNjQKCS8vIGJhbFJlcXVpcmVkID0gMQoJaW50IDEKCWZyYW1lX2J1cnkgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0CgoqaWY0N19lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjY2CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgc3Rha2VyLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQodmFsdWVUb1ZlcmlmeSkpID49IGJhbFJlcXVpcmVkLAoJLy8gICAgICAgICAgICAgICAgICdtdXN0IGhhdmUgcmVxdWlyZWQgbWluaW11bSBiYWxhbmNlIG9mIHZhbGlkYXRvciBkZWZpbmVkIHRva2VuIHRvIGFkZCBzdGFrZScsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgMSAvLyBzdGFrZXI6IGFkZHJlc3MKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQoJcG9wCglmcmFtZV9kaWcgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0Cgk+PQoKCS8vIG11c3QgaGF2ZSByZXF1aXJlZCBtaW5pbXVtIGJhbGFuY2Ugb2YgdmFsaWRhdG9yIGRlZmluZWQgdG9rZW4gdG8gYWRkIHN0YWtlCglhc3NlcnQKCippZjQ2X2VuZDoKCS8vICppZjQ4X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3MQoJLy8gdHlwZSA9PT0gR0FUSU5HX1RZUEVfQVNTRVRTX0NSRUFURURfQlkKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMQoJPT0KCWJ6ICppZjQ4X2VuZAoKCS8vICppZjQ4X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNzIKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICBBc3NldElELmZyb21VaW50NjQodmFsdWVUb1ZlcmlmeSkuY3JlYXRvciA9PT0gY29uZmlnLmVudHJ5R2F0aW5nQWRkcmVzcywKCS8vICAgICAgICAgICAgICAgICAnc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgY3JlYXRlZCBieSBjcmVhdG9yIHRoYXQgdGhlIHZhbGlkYXRvciBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UnLAoJLy8gICAgICAgICAgICAgKQoJZnJhbWVfZGlnIC0yIC8vIHZhbHVlVG9WZXJpZnk6IHVpbnQ2NAoJYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKCXBvcAoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgODEgMzIKCT09CgoJLy8gc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgY3JlYXRlZCBieSBjcmVhdG9yIHRoYXQgdGhlIHZhbGlkYXRvciBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UKCWFzc2VydAoKKmlmNDhfZW5kOgoJLy8gKmlmNDlfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjc3CgkvLyB0eXBlID09PSBHQVRJTkdfVFlQRV9BU1NFVF9JRAoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAyCgk9PQoJYnogKmlmNDlfZW5kCgoJLy8gKmlmNDlfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3OAoJLy8gZm91bmQgPSBmYWxzZQoJaW50IDAKCWZyYW1lX2J1cnkgNCAvLyBmb3VuZDogYm9vbAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNzkKCS8vIGNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0cwoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMTEzIDMyCglkdXAKCWZyYW1lX2J1cnkgNSAvLyBjb3B5IG9mIHRoZSBhcnJheSB3ZSBhcmUgaXRlcmF0aW5nIG92ZXIKCWV4dHJhY3QgMCA4CglidG9pCglmcmFtZV9idXJ5IDYgLy8gYXNzZXRJZDogdWludDY0CglpbnQgMAoJZnJhbWVfYnVyeSA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCgoqZm9yT2ZfMDoKCS8vICppZjUwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI4MAoJLy8gdmFsdWVUb1ZlcmlmeSA9PT0gYXNzZXRJZAoJZnJhbWVfZGlnIC0yIC8vIHZhbHVlVG9WZXJpZnk6IHVpbnQ2NAoJZnJhbWVfZGlnIDYgLy8gYXNzZXRJZDogdWludDY0Cgk9PQoJYnogKmlmNTBfZW5kCgoJLy8gKmlmNTBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI4MQoJLy8gZm91bmQgPSB0cnVlCglpbnQgMQoJZnJhbWVfYnVyeSA0IC8vIGZvdW5kOiBib29sCgliICpmb3JPZl8wX2VuZAoKKmlmNTBfZW5kOgoKKmZvck9mXzBfY29udGludWU6CgkvLyBpbmNyZW1lbnQgb2Zmc2V0IGFuZCBsb29wIGlmIG5vdCBvdXQgb2YgYm91bmRzCglmcmFtZV9kaWcgNyAvLyB0aGUgb2Zmc2V0IHdlIGFyZSBleHRyYWN0aW5nIHRoZSBuZXh0IGVsZW1lbnQgZnJvbQoJaW50IDgKCSsKCWR1cAoJaW50IDMyIC8vIG9mZnNldCBvZiBsYXN0IGVsZW1lbnQKCTwKCWJ6ICpmb3JPZl8wX2VuZAoJZnJhbWVfYnVyeSA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCglmcmFtZV9kaWcgNSAvLyBjb3B5IG9mIHRoZSBhcnJheSB3ZSBhcmUgaXRlcmF0aW5nIG92ZXIKCWZyYW1lX2RpZyA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCglpbnQgOAoJZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSA2IC8vIGFzc2V0SWQ6IHVpbnQ2NAoJYiAqZm9yT2ZfMAoKKmZvck9mXzBfZW5kOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI4NQoJLy8gYXNzZXJ0KGZvdW5kLCAnc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgaWRlbnRpY2FsIHRvIHRoZSBhc3NldCBpZCBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UnKQoJZnJhbWVfZGlnIDQgLy8gZm91bmQ6IGJvb2wKCgkvLyBzcGVjaWZpZWQgYXNzZXQgbXVzdCBiZSBpZGVudGljYWwgdG8gdGhlIGFzc2V0IGlkIGRlZmluZWQgYXMgYSByZXF1aXJlbWVudCB0byBzdGFrZQoJYXNzZXJ0CgoqaWY0OV9lbmQ6CgkvLyAqaWY1MV9jb25kaXRpb24KCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyODcKCS8vIHR5cGUgPT09IEdBVElOR19UWVBFX0NSRUFURURfQllfTkZEX0FERFJFU1NFUwoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAzCgk9PQoJYnogKmlmNTFfZW5kCgoJLy8gKmlmNTFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI5MAoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIHRoaXMuaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0KGNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0c1swXSwgQXNzZXRJRC5mcm9tVWludDY0KHZhbHVlVG9WZXJpZnkpLmNyZWF0b3IpLAoJLy8gICAgICAgICAgICAgICAgICdzcGVjaWZpZWQgYXNzZXQgbXVzdCBiZSBjcmVhdGVkIGJ5IGNyZWF0b3IgdGhhdCBpcyBvbmUgb2YgdGhlIGxpbmtlZCBhZGRyZXNzZXMgaW4gYW4gbmZkJywKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCglwb3AKCWZyYW1lX2RpZyAyIC8vIGNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCglleHRyYWN0IDExMyA4CglidG9pCgljYWxsc3ViIGlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdAoKCS8vIHNwZWNpZmllZCBhc3NldCBtdXN0IGJlIGNyZWF0ZWQgYnkgY3JlYXRvciB0aGF0IGlzIG9uZSBvZiB0aGUgbGlua2VkIGFkZHJlc3NlcyBpbiBhbiBuZmQKCWFzc2VydAoKKmlmNTFfZW5kOgoJLy8gKmlmNTJfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjk1CgkvLyB0eXBlID09PSBHQVRJTkdfVFlQRV9TRUdNRU5UX09GX05GRAoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCA0Cgk9PQoJYnogKmlmNTJfZW5kCgoJLy8gKmlmNTJfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI5NwoJLy8gdXNlck9mZmVyZWRORkRBcHBJRCA9IHZhbHVlVG9WZXJpZnkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWZyYW1lX2J1cnkgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjk4CgkvLyBhc3NlcnQodGhpcy5pc05GREFwcElEVmFsaWQodXNlck9mZmVyZWRORkRBcHBJRCksICdwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZCcpCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWNhbGxzdWIgaXNORkRBcHBJRFZhbGlkCgoJLy8gcHJvdmlkZWQgTkZEIG11c3QgYmUgdmFsaWQKCWFzc2VydAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMDEKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICByYXdCeXRlcyhBcHBJRC5mcm9tVWludDY0KHVzZXJPZmZlcmVkTkZEQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzKSA9PT0KCS8vICAgICAgICAgICAgICAgICAgICAgcmF3Qnl0ZXMoc3Rha2VyKSB8fCB0aGlzLmlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdCh1c2VyT2ZmZXJlZE5GREFwcElELCBzdGFrZXIpLAoJLy8gICAgICAgICAgICAgICAgICJwcm92aWRlZCBuZmQgZm9yIGVudHJ5IGlzbid0IG93bmVkIG9yIGxpbmtlZCB0byB0aGUgc3Rha2VyIiwKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyA4IC8vIHVzZXJPZmZlcmVkTkZEQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQodXNlck9mZmVyZWRORkRBcHBJRCkuZ2xvYmFsU3RhdGUoJ2kub3duZXIuYScpCglhc3NlcnQKCWZyYW1lX2RpZyAxIC8vIHN0YWtlcjogYWRkcmVzcwoJPT0KCWR1cAoJYm56ICpza2lwX29yNgoJZnJhbWVfZGlnIDEgLy8gc3Rha2VyOiBhZGRyZXNzCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWNhbGxzdWIgaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0Cgl8fAoKKnNraXBfb3I2OgoJLy8gcHJvdmlkZWQgbmZkIGZvciBlbnRyeSBpc24ndCBvd25lZCBvciBsaW5rZWQgdG8gdGhlIHN0YWtlcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMwOAoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIGJ0b2koQXBwSUQuZnJvbVVpbnQ2NCh1c2VyT2ZmZXJlZE5GREFwcElEKS5nbG9iYWxTdGF0ZSgnaS5wYXJlbnRBcHBJRCcpIGFzIGJ5dGVzKSA9PT0KCS8vICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmVudHJ5R2F0aW5nQXNzZXRzWzBdLAoJLy8gICAgICAgICAgICAgICAgICdzcGVjaWZpZWQgbmZkIG11c3QgYmUgYSBzZWdtZW50IG9mIHRoZSBuZmQgdGhlIHZhbGlkYXRvciBzcGVjaWZpZWQgYXMgYSByZXF1aXJlbWVudCcsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWJ5dGUgMHg2OTJlNzA2MTcyNjU2ZTc0NDE3MDcwNDk0NCAvLyAiaS5wYXJlbnRBcHBJRCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHVzZXJPZmZlcmVkTkZEQXBwSUQpLmdsb2JhbFN0YXRlKCdpLnBhcmVudEFwcElEJykKCWFzc2VydAoJYnRvaQoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMTEzIDgKCWJ0b2kKCT09CgoJLy8gc3BlY2lmaWVkIG5mZCBtdXN0IGJlIGEgc2VnbWVudCBvZiB0aGUgbmZkIHRoZSB2YWxpZGF0b3Igc3BlY2lmaWVkIGFzIGEgcmVxdWlyZW1lbnQKCWFzc2VydAoKKmlmNTJfZW5kOgoJcmV0c3ViCgovLyBpc05GREFwcElEVmFsaWQobmZkQXBwSUQ6IHVpbnQ2NCk6IGJvb2xlYW4KLy8KLy8gQ2hlY2tzIGlmIHRoZSBnaXZlbiBORkQgQXBwIGlkIGlzIHZhbGlkLiAgVXNpbmcgb25seSB0aGUgQXBwIGlkIHRoZXJlJ3Mgbm8gdmFsaWRhdGlvbiBhZ2FpbnN0IHRoZSBuYW1lIChpZTogdGhhdCBuZmQgWCBpcyBuYW1lIFkpCi8vIFNvIGl0J3MgYXNzdW1lZCBmb3IgdGhlIGNhbGxlciwgdGhlIGFwcCBpZCBhbG9uZSBpcyBmaW5lLiAgVGhlIG5hbWUgaXMgZmV0Y2hlZCBmcm9tIHRoZSBzcGVjaWZpZWQgYXBwIGlkIGFuZCB0aGUgdHdvCi8vIHRvZ2V0aGVyIGFyZSB1c2VkIGZvciB2YWxpZGl0eSBjaGVjayBjYWxsIHRvIHRoZSBuZmQgcmVnaXN0cnkuCi8vCi8vIEBwYXJhbSB7dWludDY0fSBuZmRBcHBJRCAtIFRoZSBORkQgQXBwIGlkIHRvIHZlcmlmeS4KLy8KLy8gQHJldHVybnMge2Jvb2xlYW59IC0gUmV0dXJucyB0cnVlIGlmIHRoZSBORkQgQXBwIGlkIGlzIHZhbGlkLCBvdGhlcndpc2UgZmFsc2UuCmlzTkZEQXBwSURWYWxpZDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMyNwoJLy8gdXNlck9mZmVyZWRORkROYW1lID0gQXBwSUQuZnJvbVVpbnQ2NChuZmRBcHBJRCkuZ2xvYmFsU3RhdGUoJ2kubmFtZScpIGFzIHN0cmluZwoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWJ5dGUgMHg2OTJlNmU2MTZkNjUgLy8gImkubmFtZSIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KG5mZEFwcElEKS5nbG9iYWxTdGF0ZSgnaS5uYW1lJykKCWFzc2VydAoJZnJhbWVfYnVyeSAwIC8vIHVzZXJPZmZlcmVkTkZETmFtZTogc3RyaW5nCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMyOQoJLy8gcmV0dXJuIHNlbmRNZXRob2RDYWxsPFtzdHJpbmcsIHVpbnQ2NF0sIGJvb2xlYW4+KHsKCS8vICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQodGhpcy5uZmRSZWdpc3RyeUFwcElkKSwKCS8vICAgICAgICAgICAgIG5hbWU6ICdpc1ZhbGlkTmZkQXBwSWQnLAoJLy8gICAgICAgICAgICAgbWV0aG9kQXJnczogW3VzZXJPZmZlcmVkTkZETmFtZSwgbmZkQXBwSURdLAoJLy8gICAgICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAiaXNWYWxpZE5mZEFwcElkKHN0cmluZyx1aW50NjQpYm9vbCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMzMAoJLy8gYXBwbGljYXRpb25JRDogQXBwSUQuZnJvbVVpbnQ2NCh0aGlzLm5mZFJlZ2lzdHJ5QXBwSWQpCglsb2FkIDIwMCAvLyBUTVBMX25mZFJlZ2lzdHJ5QXBwSWQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMzIKCS8vIG1ldGhvZEFyZ3M6IFt1c2VyT2ZmZXJlZE5GRE5hbWUsIG5mZEFwcElEXQoJZnJhbWVfZGlnIDAgLy8gdXNlck9mZmVyZWRORkROYW1lOiBzdHJpbmcKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoJaXR4biBOdW1Mb2dzCglpbnQgMQoJLQoJaXR4bmFzIExvZ3MKCWV4dHJhY3QgNCAwCglpbnQgMAoJZ2V0Yml0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCglyZXRzdWIKCi8vIGlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdChuZmRBcHBJRDogdWludDY0LCBhZGRyVG9GaW5kOiBBZGRyZXNzKTogYm9vbGVhbgovLwovLyBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBhZGRyZXNzIGlzIHByZXNlbnQgaW4gYW4gTkZEcyBsaXN0IG9mIHZlcmlmaWVkIGFkZHJlc3Nlcy4KLy8gVGhlIE5GRCBpcyBhc3N1bWVkIHRvIGhhdmUgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcyBvZmZpY2lhbC4KLy8KLy8gQHBhcmFtIHt1aW50NjR9IG5mZEFwcElEIC0gVGhlIE5GRCBhcHBsaWNhdGlvbiBpZC4KLy8gQHBhcmFtIHtBZGRyZXNzfSBhZGRyVG9GaW5kIC0gVGhlIGFkZHJlc3MgdG8gZmluZCBpbiB0aGUgdi5jYUFsZ28uMC5hcyBwcm9wZXJ0eQovLyBAcmV0dXJuIHtib29sZWFufSAtIGB0cnVlYCBpZiB0aGUgYWRkcmVzcyBpcyBwcmVzZW50LCBgZmFsc2VgIG90aGVyd2lzZS4KaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0OgoJcHJvdG8gMiAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDUKCS8vIHNlbmRBcHBDYWxsKHsKCS8vICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLAoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25BcmdzOiBbJ3JlYWRfcHJvcGVydHknLCAndi5jYUFsZ28uMC5hcyddLAoJLy8gICAgICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzQ2CgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KG5mZEFwcElEKQoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDcKCS8vIGFwcGxpY2F0aW9uQXJnczogWydyZWFkX3Byb3BlcnR5JywgJ3YuY2FBbGdvLjAuYXMnXQoJYnl0ZSAweDcyNjU2MTY0NWY3MDcyNmY3MDY1NzI3NDc5IC8vICJyZWFkX3Byb3BlcnR5IgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWJ5dGUgMHg3NjJlNjM2MTQxNmM2NzZmMmUzMDJlNjE3MyAvLyAidi5jYUFsZ28uMC5hcyIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDkKCS8vIGNhQWxnb0RhdGEgPSB0aGlzLml0eG4ubGFzdExvZwoJaXR4biBMYXN0TG9nCglmcmFtZV9idXJ5IDAgLy8gY2FBbGdvRGF0YTogYnl0ZVtdCgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM1MAoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBjYUFsZ29EYXRhLmxlbmd0aDsgaSArPSAzMikKCWludCAwCglmcmFtZV9idXJ5IDEgLy8gaTogdWludDY0CgoqZm9yXzEwOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM1MAoJLy8gaSA8IGNhQWxnb0RhdGEubGVuZ3RoCglmcmFtZV9kaWcgMSAvLyBpOiB1aW50NjQKCWZyYW1lX2RpZyAwIC8vIGNhQWxnb0RhdGE6IGJ5dGVbXQoJbGVuCgk8CglieiAqZm9yXzEwX2VuZAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNTEKCS8vIGFkZHIgPSBleHRyYWN0MyhjYUFsZ29EYXRhLCBpLCAzMikKCWZyYW1lX2RpZyAwIC8vIGNhQWxnb0RhdGE6IGJ5dGVbXQoJZnJhbWVfZGlnIDEgLy8gaTogdWludDY0CglpbnQgMzIKCWV4dHJhY3QzCglmcmFtZV9idXJ5IDIgLy8gYWRkcjogYnl0ZVtdCgoJLy8gKmlmNTNfY29uZGl0aW9uCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzUyCgkvLyBhZGRyICE9PSByYXdCeXRlcyhnbG9iYWxzLnplcm9BZGRyZXNzKSAmJiBhZGRyID09PSByYXdCeXRlcyhhZGRyVG9GaW5kKQoJZnJhbWVfZGlnIDIgLy8gYWRkcjogYnl0ZVtdCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CglkdXAKCWJ6ICpza2lwX2FuZDExCglmcmFtZV9kaWcgMiAvLyBhZGRyOiBieXRlW10KCWZyYW1lX2RpZyAtMiAvLyBhZGRyVG9GaW5kOiBBZGRyZXNzCgk9PQoJJiYKCipza2lwX2FuZDExOgoJYnogKmlmNTNfZW5kCgoJLy8gKmlmNTNfY29uc2VxdWVudAoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM1MwoJLy8gcmV0dXJuIHRydWUKCWludCAxCgliICppc0FkZHJlc3NJbk5GRENBQWxnb0xpc3QqcmV0dXJuCgoqaWY1M19lbmQ6CgoqZm9yXzEwX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM1MAoJLy8gaSArPSAzMgoJZnJhbWVfZGlnIDEgLy8gaTogdWludDY0CglpbnQgMzIKCSsKCWZyYW1lX2J1cnkgMSAvLyBpOiB1aW50NjQKCWIgKmZvcl8xMAoKKmZvcl8xMF9lbmQ6CgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzU2CgkvLyByZXR1cm4gZmFsc2UKCWludCAwCgoqaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0KnJldHVybjoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDIKCXJldHN1YgoKLy8gYWxnb1NhdHVyYXRpb25MZXZlbCgpOiB1aW50NjQKLy8KLy8gUmV0dXJucyB0aGUgbWF4aW11bSBhbGxvd2VkIHN0YWtlIHBlciB2YWxpZGF0b3IgYmFzZWQgb24gYSBwZXJjZW50YWdlIG9mIGFsbCBjdXJyZW50IG9ubGluZSBzdGFrZSBiZWZvcmUKLy8gdGhlIHZhbGlkYXRvciBpcyBjb25zaWRlcmVkIHNhdHVyYXRlZCAtIHdoZXJlIHJld2FyZHMgYXJlIGRpbWluaXNoZWQuCi8vIE5PVEU6IHRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCB0d2ljZSAtIGhlcmUgYW5kIGluIHN0YWtpbmcgcG9vbCBjb250cmFjdC4gIEJvdGggbXVzdCBiZSBpZGVudGljYWwuCmFsZ29TYXR1cmF0aW9uTGV2ZWw6Cglwcm90byAwIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNjUKCS8vIG9ubGluZSA9IHRoaXMuZ2V0Q3VycmVudE9ubGluZVN0YWtlKCkKCWNhbGxzdWIgZ2V0Q3VycmVudE9ubGluZVN0YWtlCglmcmFtZV9idXJ5IDAgLy8gb25saW5lOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzY3CgkvLyByZXR1cm4gd2lkZVJhdGlvKFtvbmxpbmUsIE1BWF9WQUxJREFUT1JfU09GVF9QQ1RfT0ZfT05MSU5FXzFERUNJTUFMXSwgWzEwMDBdKQoJZnJhbWVfZGlnIDAgLy8gb25saW5lOiB1aW50NjQKCWludCAxMDAKCW11bHcKCWludCAwCglpbnQgMTAwMAoJZGl2bW9kdwoJcG9wCglwb3AKCXN3YXAKCSEKCgkvLyB3aWRlUmF0aW8gZmFpbGVkCglhc3NlcnQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gbWF4QWxsb3dlZFN0YWtlKCk6IHVpbnQ2NAovLwovLyBSZXR1cm5zIHRoZSBNQVhJTVVNIGFsbG93ZWQgc3Rha2UgcGVyIHZhbGlkYXRvciBiYXNlZCBvbiBhIHBlcmNlbnRhZ2Ugb2YgYWxsIGN1cnJlbnQgb25saW5lIHN0YWtlLgovLyBBZGRpbmcgc3Rha2UgaXMgY29tcGxldGVseSBibG9ja2VkIGF0IHRoaXMgYW1vdW50LgptYXhBbGxvd2VkU3Rha2U6Cglwcm90byAwIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNzUKCS8vIG9ubGluZSA9IHRoaXMuZ2V0Q3VycmVudE9ubGluZVN0YWtlKCkKCWNhbGxzdWIgZ2V0Q3VycmVudE9ubGluZVN0YWtlCglmcmFtZV9idXJ5IDAgLy8gb25saW5lOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzc3CgkvLyByZXR1cm4gd2lkZVJhdGlvKFtvbmxpbmUsIE1BWF9WQUxJREFUT1JfSEFSRF9QQ1RfT0ZfT05MSU5FXzFERUNJTUFMXSwgWzEwMDBdKQoJZnJhbWVfZGlnIDAgLy8gb25saW5lOiB1aW50NjQKCWludCAxNTAKCW11bHcKCWludCAwCglpbnQgMTAwMAoJZGl2bW9kdwoJcG9wCglwb3AKCXN3YXAKCSEKCgkvLyB3aWRlUmF0aW8gZmFpbGVkCglhc3NlcnQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gbWF4QWxnb0FsbG93ZWRQZXJQb29sKCk6IHVpbnQ2NAovLwovLyBSZXR1cm5zIHRoZSBNQVhJTVVNIGFsbG93ZWQgc3Rha2UgcGVyIHBvb2wgYW5kIHN0aWxsIHJlY2VpdmUgaW5jZW50aXZlcyAtIHdlJ2xsIHRyZWF0IHRoaXMgYXMgdGhlICdtYXggcGVyIHBvb2wnCm1heEFsZ29BbGxvd2VkUGVyUG9vbDoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzODQKCS8vIHJldHVybiBnbG9iYWxzLnBheW91dHNNYXhCYWxhbmNlCglnbG9iYWwgUGF5b3V0c01heEJhbGFuY2UKCXJldHN1YgoKLy8gZ2V0Q3VycmVudE9ubGluZVN0YWtlKCk6IHVpbnQ2NApnZXRDdXJyZW50T25saW5lU3Rha2U6Cglwcm90byAwIDEKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzg4CgkvLyByZXR1cm4gb25saW5lU3Rha2UoKQoJb25saW5lX3N0YWtlCglyZXRzdWIKCi8vIG1pbkJhbGFuY2VGb3JBY2NvdW50KGNvbnRyYWN0czogdWludDY0LCBleHRyYVBhZ2VzOiB1aW50NjQsIGFzc2V0czogdWludDY0LCBsb2NhbEludHM6IHVpbnQ2NCwgbG9jYWxCeXRlczogdWludDY0LCBnbG9iYWxJbnRzOiB1aW50NjQsIGdsb2JhbEJ5dGVzOiB1aW50NjQpOiB1aW50NjQKbWluQmFsYW5jZUZvckFjY291bnQ6Cglwcm90byA3IDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDAKCS8vIG1pbkJhbCA9IEFMR09SQU5EX0FDQ09VTlRfTUlOX0JBTEFOQ0UKCWludCAxMDAwMDAKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDEKCS8vIG1pbkJhbCArPSBjb250cmFjdHMgKiBBUFBMSUNBVElPTl9CQVNFX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyBjb250cmFjdHM6IHVpbnQ2NAoJaW50IDEwMDAwMAoJKgoJKwoJZnJhbWVfYnVyeSAwIC8vIG1pbkJhbDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTQwMgoJLy8gbWluQmFsICs9IGV4dHJhUGFnZXMgKiBBUFBMSUNBVElPTl9CQVNFX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyBleHRyYVBhZ2VzOiB1aW50NjQKCWludCAxMDAwMDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDMKCS8vIG1pbkJhbCArPSBhc3NldHMgKiBBU1NFVF9IT0xESU5HX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMyAvLyBhc3NldHM6IHVpbnQ2NAoJaW50IDEwMDAwMAoJKgoJKwoJZnJhbWVfYnVyeSAwIC8vIG1pbkJhbDogdWludDY0CgoJLy8gY29udHJhY3RzL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTQwNAoJLy8gbWluQmFsICs9IGxvY2FsSW50cyAqIFNTQ19WQUxVRV9VSU5UCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoJZnJhbWVfZGlnIC00IC8vIGxvY2FsSW50czogdWludDY0CglpbnQgMjg1MDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDUKCS8vIG1pbkJhbCArPSBnbG9iYWxJbnRzICogU1NDX1ZBTFVFX1VJTlQKCWZyYW1lX2RpZyAwIC8vIG1pbkJhbDogdWludDY0CglmcmFtZV9kaWcgLTYgLy8gZ2xvYmFsSW50czogdWludDY0CglpbnQgMjg1MDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0cy92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDYKCS8vIG1pbkJhbCArPSBsb2NhbEJ5dGVzICogU1NDX1ZBTFVFX0JZVEVTCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoJZnJhbWVfZGlnIC01IC8vIGxvY2FsQnl0ZXM6IHVpbnQ2NAoJaW50IDUwMDAwCgkqCgkrCglmcmFtZV9idXJ5IDAgLy8gbWluQmFsOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDA3CgkvLyBtaW5CYWwgKz0gZ2xvYmFsQnl0ZXMgKiBTU0NfVkFMVUVfQllURVMKCWZyYW1lX2RpZyAwIC8vIG1pbkJhbDogdWludDY0CglmcmFtZV9kaWcgLTcgLy8gZ2xvYmFsQnl0ZXM6IHVpbnQ2NAoJaW50IDUwMDAwCgkqCgkrCglmcmFtZV9idXJ5IDAgLy8gbWluQmFsOiB1aW50NjQKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDA4CgkvLyByZXR1cm4gbWluQmFsCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoJcmV0c3ViCgovLyBjb3N0Rm9yQm94U3RvcmFnZSh0b3RhbE51bUJ5dGVzOiB1aW50NjQpOiB1aW50NjQKY29zdEZvckJveFN0b3JhZ2U6Cglwcm90byAxIDEKCgkvLyBjb250cmFjdHMvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDE1CgkvLyByZXR1cm4gU0NCT1hfUEVSQk9YICsgdG90YWxOdW1CeXRlcyAqIFNDQk9YX1BFUkJZVEUKCWludCAyNTAwCglmcmFtZV9kaWcgLTEgLy8gdG90YWxOdW1CeXRlczogdWludDY0CglpbnQgNDAwCgkqCgkrCglyZXRzdWIKCipjcmVhdGVfTm9PcDoKCW1ldGhvZCAiY3JlYXRlQXBwbGljYXRpb24oKXZvaWQiCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAwCgltYXRjaCAqYWJpX3JvdXRlX2NyZWF0ZUFwcGxpY2F0aW9uCgoJLy8gdGhpcyBjb250cmFjdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGdpdmVuIEFCSSBtZXRob2QgZm9yIGNyZWF0ZSBOb09wCgllcnIKCipjYWxsX05vT3A6CgltZXRob2QgImluaXRTdGFraW5nQ29udHJhY3QodWludDY0KXZvaWQiCgltZXRob2QgImxvYWRTdGFraW5nQ29udHJhY3REYXRhKHVpbnQ2NCxieXRlW10pdm9pZCIKCW1ldGhvZCAiZmluYWxpemVTdGFraW5nQ29udHJhY3QoKXZvaWQiCgltZXRob2QgImdhcygpdm9pZCIKCW1ldGhvZCAiZ2V0TWJyQW1vdW50cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCgltZXRob2QgImdldFByb3RvY29sQ29uc3RyYWludHMoKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiZ2V0TnVtVmFsaWRhdG9ycygpdWludDY0IgoJbWV0aG9kICJnZXRWYWxpZGF0b3JDb25maWcodWludDY0KSh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiZ2V0VmFsaWRhdG9yU3RhdGUodWludDY0KSh1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQpIgoJbWV0aG9kICJnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpIgoJbWV0aG9kICJnZXRQb29scyh1aW50NjQpKHVpbnQ2NCx1aW50MTYsdWludDY0KVtdIgoJbWV0aG9kICJnZXRQb29sQXBwSWQodWludDY0LHVpbnQ2NCl1aW50NjQiCgltZXRob2QgImdldFBvb2xJbmZvKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpKHVpbnQ2NCx1aW50MTYsdWludDY0KSIKCW1ldGhvZCAiZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHVpbnQ2NCl1aW50NjQiCgltZXRob2QgImRvZXNTdGFrZXJOZWVkVG9QYXlNQlIoYWRkcmVzcylib29sIgoJbWV0aG9kICJnZXRTdGFrZWRQb29sc0ZvckFjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCx1aW50NjQpW10iCgltZXRob2QgImdldFRva2VuUGF5b3V0UmF0aW8odWludDY0KSh1aW50NjRbMjRdLHVpbnQ2NCkiCgltZXRob2QgImdldE5vZGVQb29sQXNzaWdubWVudHModWludDY0KSgodWludDY0WzNdKVs4XSkiCgltZXRob2QgImdldE5GRFJlZ2lzdHJ5SUQoKXVpbnQ2NCIKCW1ldGhvZCAiYWRkVmFsaWRhdG9yKHBheSxzdHJpbmcsKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIKCW1ldGhvZCAiY2hhbmdlVmFsaWRhdG9yTWFuYWdlcih1aW50NjQsYWRkcmVzcyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQiCgltZXRob2QgImNoYW5nZVZhbGlkYXRvck5GRCh1aW50NjQsdWludDY0LHN0cmluZyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyh1aW50NjQsYWRkcmVzcyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JSZXdhcmRJbmZvKHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0KXZvaWQiCgltZXRob2QgImFkZFBvb2wocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAic2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KSIKCW1ldGhvZCAic3Rha2VVcGRhdGVkVmlhUmV3YXJkcygodWludDY0LHVpbnQ2NCx1aW50NjQpLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIgoJbWV0aG9kICJzdGFrZVJlbW92ZWQoKHVpbnQ2NCx1aW50NjQsdWludDY0KSxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCl2b2lkIgoJbWV0aG9kICJmaW5kUG9vbEZvclN0YWtlcih1aW50NjQsYWRkcmVzcyx1aW50NjQpKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKSIKCW1ldGhvZCAibW92ZVBvb2xUb05vZGUodWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIKCW1ldGhvZCAiZW1wdHlUb2tlblJld2FyZHModWludDY0LGFkZHJlc3MpdWludDY0IgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggKmFiaV9yb3V0ZV9pbml0U3Rha2luZ0NvbnRyYWN0ICphYmlfcm91dGVfbG9hZFN0YWtpbmdDb250cmFjdERhdGEgKmFiaV9yb3V0ZV9maW5hbGl6ZVN0YWtpbmdDb250cmFjdCAqYWJpX3JvdXRlX2dhcyAqYWJpX3JvdXRlX2dldE1ickFtb3VudHMgKmFiaV9yb3V0ZV9nZXRQcm90b2NvbENvbnN0cmFpbnRzICphYmlfcm91dGVfZ2V0TnVtVmFsaWRhdG9ycyAqYWJpX3JvdXRlX2dldFZhbGlkYXRvckNvbmZpZyAqYWJpX3JvdXRlX2dldFZhbGlkYXRvclN0YXRlICphYmlfcm91dGVfZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyICphYmlfcm91dGVfZ2V0UG9vbHMgKmFiaV9yb3V0ZV9nZXRQb29sQXBwSWQgKmFiaV9yb3V0ZV9nZXRQb29sSW5mbyAqYWJpX3JvdXRlX2dldEN1ck1heFN0YWtlUGVyUG9vbCAqYWJpX3JvdXRlX2RvZXNTdGFrZXJOZWVkVG9QYXlNQlIgKmFiaV9yb3V0ZV9nZXRTdGFrZWRQb29sc0ZvckFjY291bnQgKmFiaV9yb3V0ZV9nZXRUb2tlblBheW91dFJhdGlvICphYmlfcm91dGVfZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cyAqYWJpX3JvdXRlX2dldE5GRFJlZ2lzdHJ5SUQgKmFiaV9yb3V0ZV9hZGRWYWxpZGF0b3IgKmFiaV9yb3V0ZV9jaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyICphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyAqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvck5GRCAqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzICphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mbyAqYWJpX3JvdXRlX2FkZFBvb2wgKmFiaV9yb3V0ZV9hZGRTdGFrZSAqYWJpX3JvdXRlX3NldFRva2VuUGF5b3V0UmF0aW8gKmFiaV9yb3V0ZV9zdGFrZVVwZGF0ZWRWaWFSZXdhcmRzICphYmlfcm91dGVfc3Rha2VSZW1vdmVkICphYmlfcm91dGVfZmluZFBvb2xGb3JTdGFrZXIgKmFiaV9yb3V0ZV9tb3ZlUG9vbFRvTm9kZSAqYWJpX3JvdXRlX2VtcHR5VG9rZW5SZXdhcmRzCgoJLy8gdGhpcyBjb250cmFjdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGdpdmVuIEFCSSBtZXRob2QgZm9yIGNhbGwgTm9PcAoJZXJy", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEx" }, "contract": { @@ -323,6 +323,7 @@ export const APP_SPEC: AppSpec = { { "name": "getNumValidators", "desc": "Returns the current number of validators", + "readonly": true, "args": [], "returns": { "type": "uint64" @@ -330,6 +331,7 @@ export const APP_SPEC: AppSpec = { }, { "name": "getValidatorConfig", + "readonly": true, "args": [ { "name": "validatorId", @@ -342,6 +344,7 @@ export const APP_SPEC: AppSpec = { }, { "name": "getValidatorState", + "readonly": true, "args": [ { "name": "validatorId", @@ -354,6 +357,7 @@ export const APP_SPEC: AppSpec = { }, { "name": "getValidatorOwnerAndManager", + "readonly": true, "args": [ { "name": "validatorId", @@ -367,6 +371,7 @@ export const APP_SPEC: AppSpec = { { "name": "getPools", "desc": "Return list of all pools for this validator.", + "readonly": true, "args": [ { "name": "validatorId", @@ -380,6 +385,8 @@ export const APP_SPEC: AppSpec = { }, { "name": "getPoolAppId", + "desc": "getPoolAppId is useful for callers to determine app to call for removing stake if they don't have staking or\nwant to get staker list for an account. The staking pool also uses it to get the app id of staking pool 1\n(which contains reward tokens if being used) so that the amount available can be determined.", + "readonly": true, "args": [ { "name": "validatorId", @@ -396,6 +403,7 @@ export const APP_SPEC: AppSpec = { }, { "name": "getPoolInfo", + "readonly": true, "args": [ { "name": "poolKey", @@ -409,6 +417,7 @@ export const APP_SPEC: AppSpec = { { "name": "getCurMaxStakePerPool", "desc": "Calculate the maximum stake per pool for a given validator.\nNormally this would be maxAlgoPerPool, but it should also never go above MaxAllowedStake / numPools so\nas pools are added the max allowed per pool can reduce.", + "readonly": true, "args": [ { "name": "validatorId", @@ -423,6 +432,7 @@ export const APP_SPEC: AppSpec = { { "name": "doesStakerNeedToPayMBR", "desc": "Helper callers can call w/ simulate to determine if 'AddStaker' MBR should be included w/ staking amount", + "readonly": true, "args": [ { "name": "staker", @@ -436,6 +446,7 @@ export const APP_SPEC: AppSpec = { { "name": "getStakedPoolsForAccount", "desc": "Retrieves the staked pools for an account.", + "readonly": true, "args": [ { "name": "staker", @@ -450,6 +461,7 @@ export const APP_SPEC: AppSpec = { { "name": "getTokenPayoutRatio", "desc": "Retrieves the token payout ratio for a given validator - returning the pool ratios of whole so that token\npayouts across pools can be based on a stable snaphost of stake.", + "readonly": true, "args": [ { "name": "validatorId", @@ -463,6 +475,7 @@ export const APP_SPEC: AppSpec = { }, { "name": "getNodePoolAssignments", + "readonly": true, "args": [ { "name": "validatorId", @@ -475,6 +488,7 @@ export const APP_SPEC: AppSpec = { }, { "name": "getNFDRegistryID", + "readonly": true, "args": [], "returns": { "type": "uint64" @@ -896,6 +910,7 @@ export const APP_SPEC: AppSpec = { { "name": "findPoolForStaker", "desc": "Finds the pool for a staker based on the provided validator id, staker address, and amount to stake.\nFirst checks the stakers 'already staked list' for the validator preferring those (adding if possible) then adds\nto new pool if necessary.", + "readonly": true, "args": [ { "name": "validatorId", @@ -1817,6 +1832,10 @@ export abstract class ValidatorRegistryCallFactory { } /** * Constructs a no op call for the getPoolAppId(uint64,uint64)uint64 ABI method + * + * getPoolAppId is useful for callers to determine app to call for removing stake if they don't have staking or +want to get staker list for an account. The staking pool also uses it to get the app id of staking pool 1 +(which contains reward tokens if being used) so that the amount available can be determined. * * @param args Any args for the contract call * @param params Any additional parameters for the call @@ -2435,6 +2454,10 @@ export class ValidatorRegistryClient { /** * Calls the getPoolAppId(uint64,uint64)uint64 ABI method. + * + * getPoolAppId is useful for callers to determine app to call for removing stake if they don't have staking or +want to get staker list for an account. The staking pool also uses it to get the app id of staking pool 1 +(which contains reward tokens if being used) so that the amount available can be determined. * * @param args The arguments for the contract call * @param params Any additional parameters for the call @@ -3136,6 +3159,10 @@ export type ValidatorRegistryComposer = { /** * Calls the getPoolAppId(uint64,uint64)uint64 ABI method. + * + * getPoolAppId is useful for callers to determine app to call for removing stake if they don't have staking or +want to get staker list for an account. The staking pool also uses it to get the app id of staking pool 1 +(which contains reward tokens if being used) so that the amount available can be determined. * * @param args The arguments for the contract call * @param params Any additional parameters for the call From cca256a0856f48a02da0cc20c8af1fe76bcfc1dd Mon Sep 17 00:00:00 2001 From: "Rob Moore (MakerX)" Date: Mon, 30 Sep 2024 01:21:08 +0800 Subject: [PATCH 02/24] refactor: Upgrading contract tests to latest algokit utils (v7) and typed client generator (v4) WIP: A few tests are failing --- .gitattributes | 2 + contracts/__test__/contracts.test.ts | 7129 ++++++++--------- .../clients_new/StakingPoolClient.ts | 1925 +++++ .../clients_new/ValidatorRegistryClient.ts | 3614 +++++++++ contracts/helpers/helpers.ts | 1291 +-- contracts/package.json | 4 +- pnpm-lock.yaml | 112 +- 7 files changed, 9175 insertions(+), 4902 deletions(-) create mode 100644 .gitattributes create mode 100644 contracts/contracts/clients_new/StakingPoolClient.ts create mode 100644 contracts/contracts/clients_new/ValidatorRegistryClient.ts diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..6164ec30 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +* text=auto +* eol=lf diff --git a/contracts/__test__/contracts.test.ts b/contracts/__test__/contracts.test.ts index 6fb5ab2e..3417441d 100644 --- a/contracts/__test__/contracts.test.ts +++ b/contracts/__test__/contracts.test.ts @@ -2,182 +2,157 @@ import { afterEach, beforeAll, beforeEach, describe, expect, test } from 'vitest import { algoKitLogCaptureFixture, algorandFixture } from '@algorandfoundation/algokit-utils/testing' import { consoleLogger } from '@algorandfoundation/algokit-utils/types/logging' import { AlgoAmount } from '@algorandfoundation/algokit-utils/types/amount' -import { Account, encodeAddress, getApplicationAddress } from 'algosdk' -import { assetOptIn, transferAlgos, transferAsset } from '@algorandfoundation/algokit-utils' +import { ABIType, Account, getApplicationAddress } from 'algosdk' import { AlgorandTestAutomationContext } from '@algorandfoundation/algokit-utils/types/testing' -import { StakingPoolClient } from '../contracts/clients/StakingPoolClient' -import { ValidatorRegistryClient } from '../contracts/clients/ValidatorRegistryClient' +import { StakedInfo, StakingPoolClient, StakingPoolFactory, ValidatorPoolKey } from '../contracts/clients_new/StakingPoolClient' +import { MbrAmounts, ValidatorConfig, ValidatorRegistryClient, ValidatorRegistryFactory } from '../contracts/clients_new/ValidatorRegistryClient' import { - addStake, - addStakingPool, - addValidator, - ALGORAND_ZERO_ADDRESS_STRING, - bigIntFromBytes, - claimTokens, - createAsset, - createValidatorConfig, - epochBalanceUpdate, - GATING_TYPE_ASSET_ID, - GATING_TYPE_ASSETS_CREATED_BY, - getCurMaxStakePerPool, - getMbrAmountsFromValidatorClient, - getPoolAvailBalance, - getPoolInfo, - getProtocolConstraints, - getStakedPoolsForAccount, - getStakeInfoFromBoxValue, - getStakerInfo, - getTokenPayoutRatio, - getValidatorState, - incrementRoundNumberBy, - logStakingPoolInfo, - removeStake, - StakedInfo, - ValidatorConfig, - ValidatorPoolKey, + addStake, + addStakingPool, + addValidator, + ALGORAND_ZERO_ADDRESS_STRING, + claimTokens, + createAsset, + createValidatorConfig, + epochBalanceUpdate, + GATING_TYPE_ASSET_ID, + GATING_TYPE_ASSETS_CREATED_BY, + getCurMaxStakePerPool, + getPoolAvailBalance, + getPoolInfo, + getProtocolConstraints, + getStakedPoolsForAccount, + getStakeInfoFromBoxValue, + getStakerInfo, + getTokenPayoutRatio, + getValidatorState, + incrementRoundNumberBy, + logStakingPoolInfo, + removeStake, } from '../helpers/helpers' +import { AlgorandClient } from '@algorandfoundation/algokit-utils' -const FEE_SINK_ADDR = 'A7NMWS3NT3IUDMLVO26ULGXGIIOUQ3ND2TXSER6EBGRZNOBOUIQXHIBGDE' +describe('reti', () => { + const FEE_SINK_ADDR = 'A7NMWS3NT3IUDMLVO26ULGXGIIOUQ3ND2TXSER6EBGRZNOBOUIQXHIBGDE' -const MaxPoolsPerNode = 3 -// Periodically set this to max amount allowed in protocol (200 atm) but when testing more frequently this should be lowered to something like 20 stakers -// The ValidatorWFullPoolWRewards test is 'skip'ped for now - but should be periodically enabled for testing. -const MaxStakersPerPool = 200 + const MaxPoolsPerNode = 3 + // Periodically set this to max amount allowed in protocol (200 atm) but when testing more frequently this should be lowered to something like 20 stakers + // The ValidatorWFullPoolWRewards test is 'skip'ped for now - but should be periodically enabled for testing. + const MaxStakersPerPool = 200n -const fixture = algorandFixture({ testAccountFunding: AlgoAmount.Algos(10000) }) -const logs = algoKitLogCaptureFixture() + const fixture = algorandFixture({ testAccountFunding: AlgoAmount.Algos(10000) }) + const logs = algoKitLogCaptureFixture() -// algokit.Config.configure({ debug: true }); + // algokit.Config.configure({ debug: true }); -const MaxAlgoPerPool = AlgoAmount.Algos(100_000).microAlgos -let validatorMasterClient: ValidatorRegistryClient -let poolClient: StakingPoolClient + const MaxAlgoPerPool = AlgoAmount.Algos(100_000).microAlgos + let validatorMasterClient: ValidatorRegistryClient + let validatorMasterAlgorandClient: AlgorandClient + let validatorFactory: ValidatorRegistryFactory + let stakingPoolFactory: StakingPoolFactory + let mbrs: MbrAmounts -let validatorMbr: bigint -let poolMbr: bigint -let poolInitMbr: bigint -let stakerMbr: bigint - -// ===== -// First construct the 'template' pool and then the master validator contract that everything will use -beforeAll(async () => { + // ===== + // First construct the 'template' pool and then the master validator contract that everything will use + beforeAll(async () => { await fixture.beforeEach() + // testAccount here is the account that creates the Validator master contracts themselves - but basically one-time thing to be ignored - const { algod, testAccount } = fixture.context + const { algorand, testAccount } = fixture.context + validatorMasterAlgorandClient = algorand // Generate staking pool template instance that the validator registry will reference - poolClient = new StakingPoolClient( - { - sender: testAccount, - resolveBy: 'id', - id: 0, - }, - algod, - ) - const { approvalCompiled } = await poolClient.appClient.compile({ - deployTimeParams: { - nfdRegistryAppId: 0, - }, + stakingPoolFactory = validatorMasterAlgorandClient.client.getTypedAppFactory(StakingPoolFactory) + const { approvalProgram: stakingApprovalProgram } = await stakingPoolFactory.appFactory.compile({ + deployTimeParams: { + nfdRegistryAppId: 0, + }, + }) + validatorFactory = validatorMasterAlgorandClient.client.getTypedAppFactory(ValidatorRegistryFactory, { + defaultSender: testAccount.addr, + deployTimeParams: { + nfdRegistryAppId: 0, + }, }) - validatorMasterClient = new ValidatorRegistryClient( - { - sender: testAccount, - resolveBy: 'id', - id: 0, - deployTimeParams: { - nfdRegistryAppId: 0, - }, - }, - algod, - ) - const validatorApp = await validatorMasterClient.create.createApplication({}, { schema: { extraPages: 3 } }) + const { result, appClient } = await validatorFactory.send.create.createApplication({ args: [], extraProgramPages: 3 }) + validatorMasterClient = appClient // verify that the constructed validator contract is initialized as expected - expect(validatorApp.appId).toBeDefined() - expect(validatorApp.appAddress).toBeDefined() + expect(result.appId).toBeDefined() + expect(result.appAddress).toBeDefined() - const validatorGlobalState = await validatorMasterClient.appClient.getGlobalState() - expect(validatorGlobalState.numV.value).toEqual(0) - expect(validatorGlobalState.foo).toBeUndefined() // sanity check that undefined states doesn't match 0. + const validatorGlobalState = await validatorMasterClient.state.global.getAll() + expect(validatorGlobalState.numValidators).toEqual(0n) // need 3 ALGO for things to really work at all w/ this validator contract account so get that out of the way - await validatorMasterClient.appClient.fundAppAccount(AlgoAmount.Algos(3)) + await validatorMasterClient.appClient.fundAppAccount({ amount: AlgoAmount.Algos(3) }) // Load the staking pool contract bytecode into the validator contract via box storage so it can later deploy - const composer = validatorMasterClient - .compose() - .initStakingContract({ approvalProgramSize: approvalCompiled.compiledBase64ToBytes.length }) + const composer = validatorMasterClient.newGroup().initStakingContract({ args: { approvalProgramSize: stakingApprovalProgram.length } }) // load the StakingPool contract into box storage of the validator // call loadStakingContractData - chunking the data from approvalCompiled 2000 bytes at a time - for (let i = 0; i < approvalCompiled.compiledBase64ToBytes.length; i += 2000) { - composer.loadStakingContractData({ - offset: i, - data: approvalCompiled.compiledBase64ToBytes.subarray(i, i + 2000), - }) + for (let i = 0; i < stakingApprovalProgram.length; i += 2000) { + composer.loadStakingContractData({ + args: { + offset: i, + data: stakingApprovalProgram.subarray(i, i + 2000), + }, + }) } - await composer.finalizeStakingContract({}).execute({ populateAppCallResources: true }) - ;[validatorMbr, poolMbr, poolInitMbr, stakerMbr] = await getMbrAmountsFromValidatorClient(validatorMasterClient) -}) + await composer.finalizeStakingContract({ args: [] }).send({ populateAppCallResources: true }) + + // This method should be marked readonly so it uses simulate rather than firing a transaction + // The previous implementation used a manual call to simulate which works too of course, but this way we get typing + mbrs = (await validatorMasterClient.send.getMbrAmounts()).return! + }) -describe('MultValidatorAddCheck', () => { - beforeEach(fixture.beforeEach) - beforeEach(logs.beforeEach) - afterEach(logs.afterEach) + beforeEach(async () => { + await fixture.beforeEach() + // Propagate signers from any `beforeAll` calls + fixture.algorand.account.setSigners(validatorMasterAlgorandClient.account) + // Register the test account for this test with the validatorMasterClient + validatorMasterAlgorandClient.setSignerFromAccount(fixture.context.testAccount) + // Register any generated test accounts for this test with the validatorMasterClient + const generator = fixture.context.generateAccount + fixture.context.generateAccount = async (params) => { + const account = await generator({ initialFunds: params.initialFunds, suppressLog: true }) + validatorMasterAlgorandClient.setSignerFromAccount(account) + return account + } + }) + beforeEach(logs.beforeEach) + afterEach(logs.afterEach) + describe('MultValidatorAddCheck', () => { // Just verify adding new validators and their ids incrementing and mbrs being covered, etc., test('validatorAddTests', async () => { - const validatorOwnerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(500), - suppressLog: true, - }) - const validatorsAppRef = await validatorMasterClient.appClient.getAppReference() - const origMbr = (await fixture.context.algod.accountInformation(validatorsAppRef.appAddress).do())[ - 'min-balance' - ] - - const config = createValidatorConfig({ - owner: validatorOwnerAccount.addr, - manager: validatorOwnerAccount.addr, - validatorCommissionAddress: validatorOwnerAccount.addr, - }) - let expectedID = 1 - let validatorId = await addValidator( - fixture.context, - validatorMasterClient, - validatorOwnerAccount, - config, - validatorMbr, - ) - expect(validatorId).toEqual(expectedID) - const newMbr = (await fixture.context.algod.accountInformation(validatorsAppRef.appAddress).do())['min-balance'] - expect(newMbr).toEqual(origMbr + Number(validatorMbr)) - - expectedID += 1 - validatorId = await addValidator( - fixture.context, - validatorMasterClient, - validatorOwnerAccount, - config, - validatorMbr, - ) - expect(validatorId).toEqual(expectedID) - expectedID += 1 - validatorId = await addValidator( - fixture.context, - validatorMasterClient, - validatorOwnerAccount, - config, - validatorMbr, - ) - expect(validatorId).toEqual(expectedID) - }) -}) - -describe('StakeAdds', () => { - beforeEach(fixture.beforeEach) - beforeEach(logs.beforeEach) - afterEach(logs.afterEach) - + const validatorOwnerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(500), + suppressLog: true, + }) + const origMbr = (await fixture.algorand.account.getInformation(validatorMasterClient.appAddress)).minBalance + + const config = createValidatorConfig({ + owner: validatorOwnerAccount.addr, + manager: validatorOwnerAccount.addr, + validatorCommissionAddress: validatorOwnerAccount.addr, + }) + let expectedID = 1 + let validatorId = await addValidator(fixture.context, validatorMasterClient, validatorOwnerAccount, config, mbrs.addValidatorMbr) + expect(validatorId).toEqual(expectedID) + const newMbr = (await fixture.algorand.account.getInformation(validatorMasterClient.appAddress)).minBalance + expect(newMbr.microAlgo).toEqual(origMbr.microAlgo + mbrs.addValidatorMbr) + + expectedID += 1 + validatorId = await addValidator(fixture.context, validatorMasterClient, validatorOwnerAccount, config, mbrs.addValidatorMbr) + expect(validatorId).toEqual(expectedID) + expectedID += 1 + validatorId = await addValidator(fixture.context, validatorMasterClient, validatorOwnerAccount, config, mbrs.addValidatorMbr) + expect(validatorId).toEqual(expectedID) + }) + }) + + describe('StakeAdds', () => { let validatorId: number let validatorOwnerAccount: Account let poolAppId: bigint @@ -185,67 +160,61 @@ describe('StakeAdds', () => { // add validator and 1 pool for subsequent stake tests beforeAll(async () => { - // Fund a 'validator account' that will be the validator owner. - validatorOwnerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(500), - suppressLog: true, - }) - consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) - - const config = createValidatorConfig({ - owner: validatorOwnerAccount.addr, - manager: validatorOwnerAccount.addr, - validatorCommissionAddress: validatorOwnerAccount.addr, - minEntryStake: BigInt(AlgoAmount.Algos(1000).microAlgos), - maxAlgoPerPool: BigInt(MaxAlgoPerPool), // this comes into play in later tests !! - percentToValidator: 50000, // 5% - poolsPerNode: MaxPoolsPerNode, - }) - - validatorId = await addValidator( - fixture.context, - validatorMasterClient, - validatorOwnerAccount, - config, - validatorMbr, - ) - - // Add new pool - then we'll add stake and verify balances. - firstPoolKey = await addStakingPool( - fixture.context, - validatorMasterClient, - validatorId, - 1, - validatorOwnerAccount, - poolMbr, - poolInitMbr, - ) - // should be [validator id, pool id (1 based)] - expect(firstPoolKey.id).toEqual(BigInt(validatorId)) - expect(firstPoolKey.poolId).toEqual(1n) - - // get the app id via contract call - it should match what we just got back in poolKey[2] - poolAppId = ( - await validatorMasterClient.getPoolAppId( - { validatorId: firstPoolKey.id, poolId: firstPoolKey.poolId }, - { sendParams: { populateAppCallResources: true } }, - ) - ).return! - expect(firstPoolKey.poolAppId).toEqual(poolAppId) - - const stateData = await getValidatorState(validatorMasterClient, validatorId) - expect(stateData.numPools).toEqual(1) - expect(stateData.totalAlgoStaked).toEqual(0n) - expect(stateData.totalStakers).toEqual(0n) - - const validatorGlobalState = await validatorMasterClient.appClient.getGlobalState() - expect(validatorGlobalState.staked.value).toEqual(0) - expect(validatorGlobalState.numStakers.value).toEqual(0) - - const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(poolInfo.poolAppId).toEqual(BigInt(poolAppId)) - expect(poolInfo.totalStakers).toEqual(0) - expect(poolInfo.totalAlgoStaked).toEqual(0n) + // Fund a 'validator account' that will be the validator owner. + validatorOwnerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(500), + suppressLog: true, + }) + consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) + + const config = createValidatorConfig({ + owner: validatorOwnerAccount.addr, + manager: validatorOwnerAccount.addr, + validatorCommissionAddress: validatorOwnerAccount.addr, + minEntryStake: AlgoAmount.Algos(1000).microAlgos, + maxAlgoPerPool: MaxAlgoPerPool, // this comes into play in later tests !! + percentToValidator: 50000n, // 5% + poolsPerNode: BigInt(MaxPoolsPerNode), + }) + + validatorId = await addValidator(fixture.context, validatorMasterClient, validatorOwnerAccount, config, mbrs.addValidatorMbr) + + // Add new pool - then we'll add stake and verify balances. + firstPoolKey = await addStakingPool( + fixture.context, + validatorMasterClient, + validatorId, + 1, + validatorOwnerAccount, + mbrs.addPoolMbr, + mbrs.poolInitMbr, + ) + // should be [validator id, pool id (1 based)] + expect(firstPoolKey.id).toEqual(BigInt(validatorId)) + expect(firstPoolKey.poolId).toEqual(1n) + + // get the app id via contract call - it should match what we just got back in poolKey[2] + poolAppId = ( + await validatorMasterClient.send.getPoolAppId({ + args: { validatorId: firstPoolKey.id, poolId: firstPoolKey.poolId }, + populateAppCallResources: true, + }) + ).return! + expect(firstPoolKey.poolAppId).toEqual(poolAppId) + + const stateData = await getValidatorState(validatorMasterClient, validatorId) + expect(stateData.numPools).toEqual(1n) + expect(stateData.totalAlgoStaked).toEqual(0n) + expect(stateData.totalStakers).toEqual(0n) + + const validatorGlobalState = await validatorMasterClient.state.global.getAll() + expect(validatorGlobalState.totalAlgoStaked).toEqual(0n) + expect(validatorGlobalState.numStakers).toEqual(0n) + + const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(poolInfo.poolAppId).toEqual(poolAppId) + expect(poolInfo.totalStakers).toEqual(0n) + expect(poolInfo.totalAlgoStaked).toEqual(0n) }) // Creates dummy staker: @@ -254,630 +223,541 @@ describe('StakeAdds', () => { // tries to remove 200 algo (checks failure) because it would go below 1000 algo min. // adds 1000 algo more - should end at exactly 2000 algo staked test('firstStaker', async () => { - // get current balance of staker pool (should already include needed MBR in balance - but subtract it out, so it's seen as the '0' amount) - const origStakePoolInfo = await fixture.context.algod.accountInformation(getApplicationAddress(poolAppId)).do() - - // Fund a 'staker account' that will be the new 'staker' - const stakerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(5000), - suppressLog: true, - }) - // Start by funding 'not enough' (we pay minimum stake [but no mbr]) - should fail (!) - await expect( - addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, AlgoAmount.Algos(1000), 0n), - ).rejects.toThrowError() - - // now stake 1000(+mbr), min for this pool - for the first time - which means actual stake amount will be reduced - // by 'first time staker' fee to cover MBR (which goes to VALIDATOR contract account, not staker contract account!) - // we pay the extra here so the final staked amount should be exactly 1000 - const stakeAmount1 = AlgoAmount.MicroAlgos( - AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(Number(stakerMbr)).microAlgos, - ) - const [stakedPoolKey, fees1] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - stakeAmount1, - 0n, - ) - // should match info from first staking pool - expect(stakedPoolKey.id).toEqual(firstPoolKey.id) - expect(stakedPoolKey.poolId).toEqual(firstPoolKey.poolId) - expect(stakedPoolKey.poolAppId).toEqual(firstPoolKey.poolAppId) - - let poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(poolInfo.totalStakers).toEqual(1) - expect(poolInfo.totalAlgoStaked).toEqual(BigInt(stakeAmount1.microAlgos - Number(stakerMbr))) - - expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) - - let validatorGlobalState = await validatorMasterClient.appClient.getGlobalState() - expect(validatorGlobalState.staked.value).toEqual(stakeAmount1.microAlgos - Number(stakerMbr)) - expect(validatorGlobalState.numStakers.value).toEqual(1) - - const poolBalance1 = await fixture.context.algod.accountInformation(getApplicationAddress(poolAppId)).do() - expect(poolBalance1.amount).toEqual(origStakePoolInfo.amount + stakeAmount1.microAlgos - Number(stakerMbr)) - - // now try to remove partial amount - which should fail because it will take staked amount to < its 'minimum amount' - const ourPoolClient = new StakingPoolClient( - { sender: stakerAccount, resolveBy: 'id', id: stakedPoolKey.poolAppId }, - fixture.context.algod, - ) - await expect(removeStake(ourPoolClient, stakerAccount, AlgoAmount.Algos(200))).rejects.toThrowError() - - // verify pool stake didn't change! - poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(poolInfo.totalAlgoStaked).toEqual(BigInt(stakeAmount1.microAlgos - Number(stakerMbr))) - expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) - - validatorGlobalState = await validatorMasterClient.appClient.getGlobalState() - expect(validatorGlobalState.staked.value).toEqual(stakeAmount1.microAlgos - Number(stakerMbr)) - expect(validatorGlobalState.numStakers.value).toEqual(1) - - // stake again for 1000 more - should go to same pool (!) - const stakeAmount2 = AlgoAmount.Algos(1000) - const [stakedKey2, fees2] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - stakeAmount2, - 0n, - ) - // should be same as what we added prior - expect(stakedKey2.id).toEqual(firstPoolKey.id) - expect(stakedKey2.poolId).toEqual(firstPoolKey.poolId) - expect(stakedKey2.poolAppId).toEqual(firstPoolKey.poolAppId) - // verify pool state changed... - poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(poolInfo.totalAlgoStaked).toEqual( - BigInt(stakeAmount1.microAlgos - Number(stakerMbr) + stakeAmount2.microAlgos), - ) - // and global state changed - validatorGlobalState = await validatorMasterClient.appClient.getGlobalState() - expect(validatorGlobalState.staked.value).toEqual( - stakeAmount1.microAlgos - Number(stakerMbr) + stakeAmount2.microAlgos, - ) - - // ....and verify data for the 'staker' is correct as well - const stakerInfo = await getStakerInfo(ourPoolClient, stakerAccount) - expect(encodeAddress(stakerInfo.staker.publicKey)).toEqual(stakerAccount.addr) - // should be full 2000 algos (we included extra for mbr to begin with) - expect(stakerInfo.balance).toEqual(BigInt(AlgoAmount.Algos(2000).microAlgos)) - - expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) - - // let's also get list of all staked pools we're part of... should only contain 1 entry and just be our pool - const allPools = await getStakedPoolsForAccount(validatorMasterClient, stakerAccount) - expect(allPools).toHaveLength(1) - expect(allPools[0]).toEqual(firstPoolKey) - - // second balance check of pool - it should increase by full stake amount since existing staker staked again, so no additional - // mbr was needed - const poolBalance2 = await fixture.context.algod.accountInformation(getApplicationAddress(poolAppId)).do() - expect(poolBalance2.amount).toEqual(poolBalance1.amount + stakeAmount2.microAlgos) - - const stakerAcctBalance = await fixture.context.algod.accountInformation(stakerAccount.addr).do() - expect(stakerAcctBalance.amount).toEqual( - AlgoAmount.Algos(5000).microAlgos - // funded amount - stakeAmount1.microAlgos - - stakeAmount2.microAlgos - - fees1.microAlgos - - fees2.microAlgos, - ) - - // Verify 'total' staked from validator contract - const stateData = await getValidatorState(validatorMasterClient, validatorId) - expect(stateData.numPools).toEqual(1) - expect(stateData.totalAlgoStaked).toEqual( - BigInt(stakeAmount1.microAlgos + stakeAmount2.microAlgos - Number(stakerMbr)), - ) - expect(stateData.totalStakers).toEqual(1n) - // and. globally - validatorGlobalState = await validatorMasterClient.appClient.getGlobalState() - expect(validatorGlobalState.staked.value).toEqual( - stakeAmount1.microAlgos + stakeAmount2.microAlgos - Number(stakerMbr), - ) + // get current balance of staker pool (should already include needed MBR in balance - but subtract it out, so it's seen as the '0' amount) + const origStakePoolInfo = await fixture.context.algorand.account.getInformation(getApplicationAddress(poolAppId)) + + // Fund a 'staker account' that will be the new 'staker' + const stakerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(5000), + suppressLog: true, + }) + // Start by funding 'not enough' (we pay minimum stake [but no mbr]) - should fail (!) + await expect( + addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, AlgoAmount.Algos(1000), 0n), + ).rejects.toThrowError() + + // now stake 1000(+mbr), min for this pool - for the first time - which means actual stake amount will be reduced + // by 'first time staker' fee to cover MBR (which goes to VALIDATOR contract account, not staker contract account!) + // we pay the extra here so the final staked amount should be exactly 1000 + const stakeAmount1 = AlgoAmount.MicroAlgos(AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(mbrs.addStakerMbr).microAlgos) + const [stakedPoolKey, fees1] = await addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmount1, 0n) + // should match info from first staking pool + expect(stakedPoolKey.id).toEqual(firstPoolKey.id) + expect(stakedPoolKey.poolId).toEqual(firstPoolKey.poolId) + expect(stakedPoolKey.poolAppId).toEqual(firstPoolKey.poolAppId) + + let poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(poolInfo.totalStakers).toEqual(1n) + expect(poolInfo.totalAlgoStaked).toEqual(stakeAmount1.microAlgo - mbrs.addStakerMbr) + + expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) + + let validatorGlobalState = await validatorMasterClient.state.global.getAll() + expect(validatorGlobalState.totalAlgoStaked).toEqual(stakeAmount1.microAlgo - mbrs.addStakerMbr) + expect(validatorGlobalState.numStakers).toEqual(1n) + + const poolBalance1 = await fixture.context.algorand.account.getInformation(getApplicationAddress(poolAppId)) + expect(poolBalance1.balance.microAlgo).toEqual(origStakePoolInfo.balance.microAlgo + stakeAmount1.microAlgo - mbrs.addStakerMbr) + + // now try to remove partial amount - which should fail because it will take staked amount to < its 'minimum amount' + const ourPoolClient = stakingPoolFactory.getAppClientById({ + appId: stakedPoolKey.poolAppId, + defaultSender: stakerAccount.addr, + }) + await expect(removeStake(ourPoolClient, stakerAccount, AlgoAmount.Algos(200))).rejects.toThrowError() + + // verify pool stake didn't change! + poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(poolInfo.totalAlgoStaked).toEqual(stakeAmount1.microAlgos - mbrs.addStakerMbr) + expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) + + validatorGlobalState = await validatorMasterClient.state.global.getAll() + expect(validatorGlobalState.totalAlgoStaked).toEqual(stakeAmount1.microAlgos - mbrs.addStakerMbr) + expect(validatorGlobalState.numStakers).toEqual(1n) + + // stake again for 1000 more - should go to same pool (!) + const stakeAmount2 = AlgoAmount.Algos(1000) + const [stakedKey2, fees2] = await addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmount2, 0n) + // should be same as what we added prior + expect(stakedKey2.id).toEqual(firstPoolKey.id) + expect(stakedKey2.poolId).toEqual(firstPoolKey.poolId) + expect(stakedKey2.poolAppId).toEqual(firstPoolKey.poolAppId) + // verify pool state changed... + poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(poolInfo.totalAlgoStaked).toEqual(stakeAmount1.microAlgos - mbrs.addStakerMbr + stakeAmount2.microAlgos) + // and global state changed + validatorGlobalState = await validatorMasterClient.state.global.getAll() + expect(validatorGlobalState.totalAlgoStaked).toEqual(stakeAmount1.microAlgos - mbrs.addStakerMbr + stakeAmount2.microAlgos) + + // ....and verify data for the 'staker' is correct as well + const stakerInfo = await getStakerInfo(ourPoolClient, stakerAccount) + expect(stakerInfo.account).toEqual(stakerAccount.addr) + // should be full 2000 algos (we included extra for mbr to begin with) + expect(stakerInfo.balance).toEqual(AlgoAmount.Algos(2000).microAlgos) + + expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) + + // let's also get list of all staked pools we're part of... should only contain 1 entry and just be our pool + const allPools = await getStakedPoolsForAccount(validatorMasterClient, stakerAccount) + expect(allPools).toHaveLength(1) + expect(allPools[0]).toEqual(firstPoolKey) + + // second balance check of pool - it should increase by full stake amount since existing staker staked again, so no additional + // mbr was needed + const poolBalance2 = await fixture.context.algorand.account.getInformation(getApplicationAddress(poolAppId)) + expect(poolBalance2.balance.microAlgo).toEqual(poolBalance1.balance.microAlgo + stakeAmount2.microAlgo) + + const stakerAcctBalance = await fixture.context.algorand.account.getInformation(stakerAccount.addr) + expect(stakerAcctBalance.balance.microAlgo).toEqual( + AlgoAmount.Algos(5000).microAlgos - // funded amount + stakeAmount1.microAlgos - + stakeAmount2.microAlgos - + fees1.microAlgos - + fees2.microAlgos, + ) + + // Verify 'total' staked from validator contract + const stateData = await getValidatorState(validatorMasterClient, validatorId) + expect(stateData.numPools).toEqual(1n) + expect(stateData.totalAlgoStaked).toEqual(stakeAmount1.microAlgos + stakeAmount2.microAlgos - mbrs.addStakerMbr) + expect(stateData.totalStakers).toEqual(1n) + // and. globally + validatorGlobalState = await validatorMasterClient.state.global.getAll() + expect(validatorGlobalState.totalAlgoStaked).toEqual(stakeAmount1.microAlgos + stakeAmount2.microAlgos - mbrs.addStakerMbr) }) // Creates new staker account - // Adds 2000 algo to pool (not caring about mbr - so actual amount will be less the stakermbr amount) + // Adds 2000 algo to pool (not caring about mbr - so actual amount will be less the mbrs.addStakerMbr amount) test('nextStaker', async () => { - // get current balance of staker pool - const origStakePoolInfo = await fixture.context.algod.accountInformation(getApplicationAddress(poolAppId)).do() - // and of all pools - const origValidatorState = await getValidatorState(validatorMasterClient, validatorId) - - // Fund a 'staker account' that will be the new 'staker' - const stakerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(5000), - suppressLog: true, - }) - // add 2000 stake by random staker - should go to NEW slot - but this is still their first add, so they have to pay more mbr - // this time - since it's over minimum... don't pay 'extra' - so we should ensure that the MBR is NOT part of what we stake - const stakeAmount1 = AlgoAmount.Algos(2000) - const [stakedPoolKey, fees] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - stakeAmount1, - 0n, - ) - // should be same as what we added prior - expect(stakedPoolKey.id).toEqual(firstPoolKey.id) - expect(stakedPoolKey.poolId).toEqual(firstPoolKey.poolId) - expect(stakedPoolKey.poolAppId).toEqual(firstPoolKey.poolAppId) - - const poolBalance1 = await fixture.context.algod.accountInformation(getApplicationAddress(poolAppId)).do() - expect(poolBalance1.amount).toEqual(origStakePoolInfo.amount + stakeAmount1.microAlgos - Number(stakerMbr)) - - const stakerAcctBalance = await fixture.context.algod.accountInformation(stakerAccount.addr).do() - expect(stakerAcctBalance.amount).toEqual( - AlgoAmount.Algos(5000).microAlgos - // funded amount - stakeAmount1.microAlgos - - fees.microAlgos, - ) - - // let's also get list of all staked pools we're part of... should only contain 1 entry and just be our pool - const allPools = await getStakedPoolsForAccount(validatorMasterClient, stakerAccount) - expect(allPools).toHaveLength(1) - expect(allPools[0]).toEqual(firstPoolKey) - - // Verify 'total' staked from validator contract - const stateData = await getValidatorState(validatorMasterClient, validatorId) - expect(stateData.numPools).toEqual(1) - expect(stateData.totalAlgoStaked).toEqual( - origValidatorState.totalAlgoStaked + BigInt(stakeAmount1.microAlgos - Number(stakerMbr)), - ) - expect(stateData.totalStakers).toEqual(BigInt(2)) + // get current balance of staker pool + const origStakePoolInfo = await fixture.context.algorand.account.getInformation(getApplicationAddress(poolAppId)) + // and of all pools + const origValidatorState = await getValidatorState(validatorMasterClient, validatorId) + + // Fund a 'staker account' that will be the new 'staker' + const stakerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(5000), + suppressLog: true, + }) + // add 2000 stake by random staker - should go to NEW slot - but this is still their first add, so they have to pay more mbr + // this time - since it's over minimum... don't pay 'extra' - so we should ensure that the MBR is NOT part of what we stake + const stakeAmount1 = AlgoAmount.Algos(2000) + const [stakedPoolKey, fees] = await addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmount1, 0n) + // should be same as what we added prior + expect(stakedPoolKey.id).toEqual(firstPoolKey.id) + expect(stakedPoolKey.poolId).toEqual(firstPoolKey.poolId) + expect(stakedPoolKey.poolAppId).toEqual(firstPoolKey.poolAppId) + + const poolBalance1 = await fixture.context.algorand.account.getInformation(getApplicationAddress(poolAppId)) + expect(poolBalance1.balance.microAlgo).toEqual(origStakePoolInfo.balance.microAlgo + stakeAmount1.microAlgos - mbrs.addStakerMbr) + + const stakerAcctBalance = await fixture.context.algorand.account.getInformation(stakerAccount.addr) + expect(stakerAcctBalance.balance.microAlgo).toEqual( + AlgoAmount.Algos(5000).microAlgos - // funded amount + stakeAmount1.microAlgos - + fees.microAlgos, + ) + + // let's also get list of all staked pools we're part of... should only contain 1 entry and just be our pool + const allPools = await getStakedPoolsForAccount(validatorMasterClient, stakerAccount) + expect(allPools).toHaveLength(1) + expect(allPools[0]).toEqual(firstPoolKey) + + // Verify 'total' staked from validator contract + const stateData = await getValidatorState(validatorMasterClient, validatorId) + expect(stateData.numPools).toEqual(1n) + expect(stateData.totalAlgoStaked).toEqual(origValidatorState.totalAlgoStaked + stakeAmount1.microAlgos - mbrs.addStakerMbr) + expect(stateData.totalStakers).toEqual(2n) }) test('validatorPoolCheck', async () => { - const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(poolInfo.poolAppId).toEqual(BigInt(poolAppId)) - expect(poolInfo.totalStakers).toEqual(2) - expect(poolInfo.totalAlgoStaked).toEqual(BigInt(AlgoAmount.Algos(4000).microAlgos - Number(stakerMbr))) + const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(poolInfo.poolAppId).toEqual(poolAppId) + expect(poolInfo.totalStakers).toEqual(2n) + expect(poolInfo.totalAlgoStaked).toEqual(AlgoAmount.Algos(4000).microAlgos - mbrs.addStakerMbr) }) test('addMaxPoolsAndFill', async () => { - const pools: ValidatorPoolKey[] = [] - const stakers: Account[] = [] - const poolsToCreate = MaxPoolsPerNode - - // capture current 'total' state for all pools - const origValidatorState = await getValidatorState(validatorMasterClient, validatorId) - - // we create 'max pools per node' new pools on new node (first pool is still there which we added as part of beforeAll) - for (let i = 0; i < poolsToCreate; i += 1) { - const newPool = await addStakingPool( - fixture.context, - validatorMasterClient, - validatorId, - 2, // add to different node - otherwise we'll fail - validatorOwnerAccount, - poolMbr, - poolInitMbr, - ) - expect(newPool.poolId).toEqual(BigInt(2 + i)) - pools.push(newPool) - } - - for (let i = 0; i < poolsToCreate; i += 1) { - const poolInfo = await getPoolInfo(validatorMasterClient, pools[i]) - expect(poolInfo.poolAppId).toEqual(pools[i].poolAppId) - expect(poolInfo.totalStakers).toEqual(0) - expect(poolInfo.totalAlgoStaked).toEqual(0n) - } - - // now create X new stakers - for (let i = 0; i < poolsToCreate; i += 1) { - // fund some new staker accounts (4) - const stakerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.MicroAlgos(MaxAlgoPerPool + AlgoAmount.Algos(4000).microAlgos), - suppressLog: true, - }) - stakers.push(stakerAccount) - } - // have the first max-1 of the max new stakers - add such that each pool is basically completely full but just - // short, so we can still add a small amount later in a test. - // add stake for each - each time should work and go to new pool (starting with first pool we added - the one - // that's already there shouldn't have room). Then next add of same size should fail. then next add of something - // small should go to first pool again - const stakeAmount = AlgoAmount.MicroAlgos(MaxAlgoPerPool - AlgoAmount.Algos(1000).microAlgos) - for (let i = 0; i < poolsToCreate - 1; i += 1) { - const [stakedPoolKey] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakers[i], - stakeAmount, - 0n, - ) - // should go to each pool in succession since it's basically the entire pool - expect(stakedPoolKey.id).toEqual(pools[i].id) - expect(stakedPoolKey.poolId).toEqual(pools[i].poolId) - expect(stakedPoolKey.poolAppId).toEqual(pools[i].poolAppId) - - expect(await getStakedPoolsForAccount(validatorMasterClient, stakers[i])).toEqual([stakedPoolKey]) - } - // now try to add larger stake from staker max-1... should fail... nothing free - await expect( - addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakers[MaxPoolsPerNode - 1], - AlgoAmount.MicroAlgos(MaxAlgoPerPool + AlgoAmount.Algos(1000).microAlgos), - 0n, - ), - ).rejects.toThrowError() - - // For last staker - get their staked pool list - should be empty - expect(await getStakedPoolsForAccount(validatorMasterClient, stakers[MaxPoolsPerNode - 1])).toHaveLength(0) - // have stakermaxPools-1 stake large amount - just barely under max - so should only fit in last pool - const [fitTestStake1] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakers[MaxPoolsPerNode - 1], - AlgoAmount.MicroAlgos(MaxAlgoPerPool - AlgoAmount.Algos(1000).microAlgos), - 0n, - ) - expect(fitTestStake1.id).toEqual(pools[MaxPoolsPerNode - 1].id) - expect(fitTestStake1.poolId).toEqual(pools[MaxPoolsPerNode - 1].poolId) - expect(fitTestStake1.poolAppId).toEqual(pools[MaxPoolsPerNode - 1].poolAppId) - - // Now have staker maxPools-1 stake 1000 - it'll fit in last pool (just) since it first tries pools staker is already in - const [fitTestStake2] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakers[MaxPoolsPerNode - 1], - AlgoAmount.Algos(1000), - 0n, - ) - expect(fitTestStake2.id).toEqual(pools[MaxPoolsPerNode - 1].id) - expect(fitTestStake2.poolId).toEqual(pools[MaxPoolsPerNode - 1].poolId) - expect(fitTestStake2.poolAppId).toEqual(pools[MaxPoolsPerNode - 1].poolAppId) + const pools: ValidatorPoolKey[] = [] + const stakers: Account[] = [] + const poolsToCreate = MaxPoolsPerNode + + // capture current 'total' state for all pools + const origValidatorState = await getValidatorState(validatorMasterClient, validatorId) + + // we create 'max pools per node' new pools on new node (first pool is still there which we added as part of beforeAll) + for (let i = 0; i < poolsToCreate; i += 1) { + const newPool = await addStakingPool( + fixture.context, + validatorMasterClient, + validatorId, + 2, // add to different node - otherwise we'll fail + validatorOwnerAccount, + mbrs.addPoolMbr, + mbrs.poolInitMbr, + ) + expect(newPool.poolId).toEqual(BigInt(2 + i)) + pools.push(newPool) + } + + for (let i = 0; i < poolsToCreate; i += 1) { + const poolInfo = await getPoolInfo(validatorMasterClient, pools[i]) + expect(poolInfo.poolAppId).toEqual(pools[i].poolAppId) + expect(poolInfo.totalStakers).toEqual(0n) + expect(poolInfo.totalAlgoStaked).toEqual(0n) + } - // now try to add smallish stake from staker maxPools-1... should go to very first pool - // # of stakers shouldn't increase! They're new entrant into pool but already staked somewhere else ! - const [fitTestStake3] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakers[MaxPoolsPerNode - 1], - AlgoAmount.Algos(1000), - 0n, - ) - expect(fitTestStake3.id).toEqual(firstPoolKey.id) - expect(fitTestStake3.poolId).toEqual(firstPoolKey.poolId) - expect(fitTestStake3.poolAppId).toEqual(firstPoolKey.poolAppId) - - // For staker maxPools-1 - get their staked pool list - should now be two entries - pool maxPools+1 (pool #maxpools we added) then pool 1 (order of staking) - const lastStakerPools = await getStakedPoolsForAccount(validatorMasterClient, stakers[MaxPoolsPerNode - 1]) - expect(lastStakerPools).toHaveLength(2) - expect(lastStakerPools[0]).toEqual(pools[MaxPoolsPerNode - 1]) - expect(lastStakerPools[1]).toEqual(firstPoolKey) - - // Get 'total' staked from validator contract - const stateData = await getValidatorState(validatorMasterClient, validatorId) - consoleLogger.info( - `num pools: ${stateData.numPools}, total staked:${stateData.totalAlgoStaked}, stakers:${stateData.totalStakers}`, - ) - expect(stateData.numPools).toEqual(MaxPoolsPerNode + 1) - expect(stateData.totalAlgoStaked).toEqual( - origValidatorState.totalAlgoStaked + - BigInt(stakeAmount.microAlgos * MaxPoolsPerNode) - - BigInt(stakerMbr * BigInt(MaxPoolsPerNode)) + - BigInt(AlgoAmount.Algos(2000).microAlgos), - ) - expect(stateData.totalStakers).toEqual(BigInt(MaxPoolsPerNode + 2)) + // now create X new stakers + for (let i = 0; i < poolsToCreate; i += 1) { + // fund some new staker accounts (4) + const stakerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.MicroAlgos(MaxAlgoPerPool + AlgoAmount.Algos(4000).microAlgos), + suppressLog: true, + }) + stakers.push(stakerAccount) + } + // have the first max-1 of the max new stakers - add such that each pool is basically completely full but just + // short, so we can still add a small amount later in a test. + // add stake for each - each time should work and go to new pool (starting with first pool we added - the one + // that's already there shouldn't have room). Then next add of same size should fail. then next add of something + // small should go to first pool again + const stakeAmount = AlgoAmount.MicroAlgos(MaxAlgoPerPool - AlgoAmount.Algos(1000).microAlgos) + for (let i = 0; i < poolsToCreate - 1; i += 1) { + const [stakedPoolKey] = await addStake(fixture.context, validatorMasterClient, validatorId, stakers[i], stakeAmount, 0n) + // should go to each pool in succession since it's basically the entire pool + expect(stakedPoolKey.id).toEqual(pools[i].id) + expect(stakedPoolKey.poolId).toEqual(pools[i].poolId) + expect(stakedPoolKey.poolAppId).toEqual(pools[i].poolAppId) + + expect(await getStakedPoolsForAccount(validatorMasterClient, stakers[i])).toEqual([stakedPoolKey]) + } + // now try to add larger stake from staker max-1... should fail... nothing free + await expect( + addStake( + fixture.context, + validatorMasterClient, + validatorId, + stakers[MaxPoolsPerNode - 1], + AlgoAmount.MicroAlgos(MaxAlgoPerPool + AlgoAmount.Algos(1000).microAlgos), + 0n, + ), + ).rejects.toThrowError() + + // For last staker - get their staked pool list - should be empty + expect(await getStakedPoolsForAccount(validatorMasterClient, stakers[MaxPoolsPerNode - 1])).toHaveLength(0) + // have stakermaxPools-1 stake large amount - just barely under max - so should only fit in last pool + const [fitTestStake1] = await addStake( + fixture.context, + validatorMasterClient, + validatorId, + stakers[MaxPoolsPerNode - 1], + AlgoAmount.MicroAlgos(MaxAlgoPerPool - AlgoAmount.Algos(1000).microAlgos), + 0n, + ) + expect(fitTestStake1.id).toEqual(pools[MaxPoolsPerNode - 1].id) + expect(fitTestStake1.poolId).toEqual(pools[MaxPoolsPerNode - 1].poolId) + expect(fitTestStake1.poolAppId).toEqual(pools[MaxPoolsPerNode - 1].poolAppId) + + // Now have staker maxPools-1 stake 1000 - it'll fit in last pool (just) since it first tries pools staker is already in + const [fitTestStake2] = await addStake( + fixture.context, + validatorMasterClient, + validatorId, + stakers[MaxPoolsPerNode - 1], + AlgoAmount.Algos(1000), + 0n, + ) + expect(fitTestStake2.id).toEqual(pools[MaxPoolsPerNode - 1].id) + expect(fitTestStake2.poolId).toEqual(pools[MaxPoolsPerNode - 1].poolId) + expect(fitTestStake2.poolAppId).toEqual(pools[MaxPoolsPerNode - 1].poolAppId) + + // now try to add smallish stake from staker maxPools-1... should go to very first pool + // # of stakers shouldn't increase! They're new entrant into pool but already staked somewhere else ! + const [fitTestStake3] = await addStake( + fixture.context, + validatorMasterClient, + validatorId, + stakers[MaxPoolsPerNode - 1], + AlgoAmount.Algos(1000), + 0n, + ) + expect(fitTestStake3.id).toEqual(firstPoolKey.id) + expect(fitTestStake3.poolId).toEqual(firstPoolKey.poolId) + expect(fitTestStake3.poolAppId).toEqual(firstPoolKey.poolAppId) + + // For staker maxPools-1 - get their staked pool list - should now be two entries - pool maxPools+1 (pool #maxpools we added) then pool 1 (order of staking) + const lastStakerPools = await getStakedPoolsForAccount(validatorMasterClient, stakers[MaxPoolsPerNode - 1]) + expect(lastStakerPools).toHaveLength(2) + expect(lastStakerPools[0]).toEqual(pools[MaxPoolsPerNode - 1]) + expect(lastStakerPools[1]).toEqual(firstPoolKey) + + // Get 'total' staked from validator contract + const stateData = await getValidatorState(validatorMasterClient, validatorId) + consoleLogger.info(`num pools: ${stateData.numPools}, total staked:${stateData.totalAlgoStaked}, stakers:${stateData.totalStakers}`) + expect(stateData.numPools).toEqual(BigInt(MaxPoolsPerNode + 1)) + expect(stateData.totalAlgoStaked).toEqual( + origValidatorState.totalAlgoStaked + + stakeAmount.microAlgos * BigInt(MaxPoolsPerNode) - + mbrs.addStakerMbr * BigInt(MaxPoolsPerNode) + + AlgoAmount.Algos(2000).microAlgos, + ) + expect(stateData.totalStakers).toEqual(BigInt(MaxPoolsPerNode + 2)) }) test('addThenRemoveStake', async () => { - const stakerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(10_000), - suppressLog: true, - }) - let amountStaked = 0 - // smallish amount of stake - should just get added to first pool - const [addStake1, fees1] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - AlgoAmount.Algos(1100), - 0n, - ) - amountStaked += AlgoAmount.Algos(1100).microAlgos - expect(addStake1.id).toEqual(firstPoolKey.id) - expect(addStake1.poolId).toEqual(firstPoolKey.poolId) - expect(addStake1.poolAppId).toEqual(firstPoolKey.poolAppId) - - // add again. should go to same place - const [addStake2, fees2] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - AlgoAmount.Algos(2000), - 0n, - ) - amountStaked += AlgoAmount.Algos(2000).microAlgos - - expect(addStake2.id).toEqual(firstPoolKey.id) - expect(addStake2.poolId).toEqual(firstPoolKey.poolId) - expect(addStake2.poolAppId).toEqual(firstPoolKey.poolAppId) - - const stakerAcctBalance = await fixture.context.algod.accountInformation(stakerAccount.addr).do() - expect(stakerAcctBalance.amount).toEqual( - AlgoAmount.Algos(10_000).microAlgos - // funded amount - amountStaked - - fees1.microAlgos - - fees2.microAlgos, - ) - - // Verify the staked data matches.... - const allPools = await getStakedPoolsForAccount(validatorMasterClient, stakerAccount) - expect(allPools).toHaveLength(1) - expect(allPools[0]).toEqual(firstPoolKey) - // ....and verify data for the 'staker' is correct as well - const ourPoolClient = new StakingPoolClient( - { sender: stakerAccount, resolveBy: 'id', id: firstPoolKey.poolAppId }, - fixture.context.algod, - ) - // The amount 'actually' staked won't include the MBR amount - const stakerInfo = await getStakerInfo(ourPoolClient, stakerAccount) - expect(encodeAddress(stakerInfo.staker.publicKey)).toEqual(stakerAccount.addr) - expect(stakerInfo.balance).toEqual(BigInt(amountStaked - Number(stakerMbr))) - - // Get Pool info before removing stake.. - const preRemovePoolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - - // then remove the stake ! - const removeFees = await removeStake( - ourPoolClient, - stakerAccount, - AlgoAmount.MicroAlgos(Number(stakerInfo.balance)), - ) - const newBalance = await fixture.context.algod.accountInformation(stakerAccount.addr).do() - expect(newBalance.amount).toEqual( - stakerAcctBalance.amount + Number(stakerInfo.balance) - removeFees, // microAlgo for `removeStake fees - ) - - // stakers should have been reduced and stake amount should have been reduced by stake removed - const postRemovePoolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(postRemovePoolInfo.totalStakers).toEqual(preRemovePoolInfo.totalStakers - 1) - expect(postRemovePoolInfo.totalAlgoStaked).toEqual(preRemovePoolInfo.totalAlgoStaked - stakerInfo.balance) + const stakerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(10_000), + suppressLog: true, + }) + let amountStaked = 0n + // smallish amount of stake - should just get added to first pool + const [addStake1, fees1] = await addStake( + fixture.context, + validatorMasterClient, + validatorId, + stakerAccount, + AlgoAmount.Algos(1100), + 0n, + ) + amountStaked += AlgoAmount.Algos(1100).microAlgos + expect(addStake1.id).toEqual(firstPoolKey.id) + expect(addStake1.poolId).toEqual(firstPoolKey.poolId) + expect(addStake1.poolAppId).toEqual(firstPoolKey.poolAppId) + + // add again. should go to same place + const [addStake2, fees2] = await addStake( + fixture.context, + validatorMasterClient, + validatorId, + stakerAccount, + AlgoAmount.Algos(2000), + 0n, + ) + amountStaked += AlgoAmount.Algos(2000).microAlgos + + expect(addStake2.id).toEqual(firstPoolKey.id) + expect(addStake2.poolId).toEqual(firstPoolKey.poolId) + expect(addStake2.poolAppId).toEqual(firstPoolKey.poolAppId) + + const stakerAcctBalance = await fixture.context.algorand.account.getInformation(stakerAccount.addr) + expect(stakerAcctBalance.balance.microAlgo).toEqual( + AlgoAmount.Algos(10_000).microAlgos - // funded amount + amountStaked - + fees1.microAlgos - + fees2.microAlgos, + ) + + // Verify the staked data matches.... + const allPools = await getStakedPoolsForAccount(validatorMasterClient, stakerAccount) + expect(allPools).toHaveLength(1) + expect(allPools[0]).toEqual(firstPoolKey) + // ....and verify data for the 'staker' is correct as well + const ourPoolClient = stakingPoolFactory.getAppClientById({ appId: firstPoolKey.poolAppId, defaultSender: stakerAccount.addr }) + // The amount 'actually' staked won't include the MBR amount + const stakerInfo = await getStakerInfo(ourPoolClient, stakerAccount) + expect(stakerInfo.account).toEqual(stakerAccount.addr) + expect(stakerInfo.balance).toEqual(amountStaked - mbrs.addStakerMbr) + + // Get Pool info before removing stake.. + const preRemovePoolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + + // then remove the stake ! + const removeFees = await removeStake(ourPoolClient, stakerAccount, AlgoAmount.MicroAlgos(stakerInfo.balance)) + const newBalance = await fixture.context.algorand.account.getInformation(stakerAccount.addr) + expect(newBalance.balance.microAlgo).toEqual( + stakerAcctBalance.balance.microAlgo + stakerInfo.balance - removeFees, // microAlgo for `removeStake fees + ) + + // stakers should have been reduced and stake amount should have been reduced by stake removed + const postRemovePoolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(postRemovePoolInfo.totalStakers).toEqual(preRemovePoolInfo.totalStakers - 1n) + expect(postRemovePoolInfo.totalAlgoStaked).toEqual(preRemovePoolInfo.totalAlgoStaked - stakerInfo.balance) }) test('addThenRemoveAllStake', async () => { - const stakerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(10_000), - suppressLog: true, - }) - let amountStaked = 0 - // smallish amount of stake - should just get added to first pool - const [addStake1, addFees] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - AlgoAmount.Algos(1100), - 0n, - ) - amountStaked += AlgoAmount.Algos(1100).microAlgos - expect(addStake1.id).toEqual(firstPoolKey.id) - expect(addStake1.poolId).toEqual(firstPoolKey.poolId) - expect(addStake1.poolAppId).toEqual(firstPoolKey.poolAppId) - - const stakerAcctBalance = await fixture.context.algod.accountInformation(stakerAccount.addr).do() - expect(stakerAcctBalance.amount).toEqual( - AlgoAmount.Algos(10_000).microAlgos - // funded amount - amountStaked - - addFees.microAlgos, - ) - - // Verify the staked data matches.... - const allPools = await getStakedPoolsForAccount(validatorMasterClient, stakerAccount) - expect(allPools).toHaveLength(1) - expect(allPools[0]).toEqual(firstPoolKey) - // ....and verify data for the 'staker' is correct as well - const ourPoolClient = new StakingPoolClient( - { sender: stakerAccount, resolveBy: 'id', id: firstPoolKey.poolAppId }, - fixture.context.algod, - ) - // The amount 'actually' staked won't include the MBR amount - const stakerInfo = await getStakerInfo(ourPoolClient, stakerAccount) - expect(encodeAddress(stakerInfo.staker.publicKey)).toEqual(stakerAccount.addr) - expect(stakerInfo.balance).toEqual(BigInt(amountStaked - Number(stakerMbr))) - - // Get Pool info before removing stake.. - const preRemovePoolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - - // then remove ALL the stake (specifying 0 to remove all) - const removeFees = await removeStake(ourPoolClient, stakerAccount, AlgoAmount.MicroAlgos(0)) - const newBalance = await fixture.context.algod.accountInformation(stakerAccount.addr).do() - expect(newBalance.amount).toEqual( - stakerAcctBalance.amount + Number(stakerInfo.balance) - removeFees, // microAlgo for removeStake fees - ) - - // stakers should have been reduced and stake amount should have been reduced by stake removed - const postRemovePoolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(postRemovePoolInfo.totalStakers).toEqual(preRemovePoolInfo.totalStakers - 1) - expect(postRemovePoolInfo.totalAlgoStaked).toEqual(preRemovePoolInfo.totalAlgoStaked - stakerInfo.balance) + const stakerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(10_000), + suppressLog: true, + }) + let amountStaked = 0n + // smallish amount of stake - should just get added to first pool + const [addStake1, addFees] = await addStake( + fixture.context, + validatorMasterClient, + validatorId, + stakerAccount, + AlgoAmount.Algos(1100), + 0n, + ) + amountStaked += AlgoAmount.Algos(1100).microAlgos + expect(addStake1.id).toEqual(firstPoolKey.id) + expect(addStake1.poolId).toEqual(firstPoolKey.poolId) + expect(addStake1.poolAppId).toEqual(firstPoolKey.poolAppId) + + const stakerAcctBalance = await fixture.context.algorand.account.getInformation(stakerAccount.addr) + expect(stakerAcctBalance.balance.microAlgo).toEqual( + AlgoAmount.Algos(10_000).microAlgos - // funded amount + amountStaked - + addFees.microAlgos, + ) + + // Verify the staked data matches.... + const allPools = await getStakedPoolsForAccount(validatorMasterClient, stakerAccount) + expect(allPools).toHaveLength(1) + expect(allPools[0]).toEqual(firstPoolKey) + // ....and verify data for the 'staker' is correct as well + const ourPoolClient = stakingPoolFactory.getAppClientById({ appId: firstPoolKey.poolAppId, defaultSender: stakerAccount.addr }) + // The amount 'actually' staked won't include the MBR amount + const stakerInfo = await getStakerInfo(ourPoolClient, stakerAccount) + expect(stakerInfo.account).toEqual(stakerAccount.addr) + expect(stakerInfo.balance).toEqual(amountStaked - mbrs.addStakerMbr) + + // Get Pool info before removing stake.. + const preRemovePoolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + + // then remove ALL the stake (specifying 0 to remove all) + const removeFees = await removeStake(ourPoolClient, stakerAccount, AlgoAmount.MicroAlgos(0)) + const newBalance = await fixture.context.algorand.account.getInformation(stakerAccount.addr) + expect(newBalance.balance.microAlgo).toEqual( + stakerAcctBalance.balance.microAlgo + stakerInfo.balance - removeFees, // microAlgo for removeStake fees + ) + + // stakers should have been reduced and stake amount should have been reduced by stake removed + const postRemovePoolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(postRemovePoolInfo.totalStakers).toEqual(preRemovePoolInfo.totalStakers - 1n) + expect(postRemovePoolInfo.totalAlgoStaked).toEqual(preRemovePoolInfo.totalAlgoStaked - stakerInfo.balance) }) test('getStakeInfo', async () => { - await logStakingPoolInfo(fixture.context, firstPoolKey.poolAppId, 'getStakeInfo') + await logStakingPoolInfo(fixture.context, firstPoolKey.poolAppId, 'getStakeInfo') }) -}) - -describe('StakeAddWMixedRemove', () => { - beforeEach(fixture.beforeEach) - beforeEach(logs.beforeEach) - afterEach(logs.afterEach) + }) + describe('StakeAddWMixedRemove', () => { let validatorId: number let validatorOwnerAccount: Account let firstPoolKey: ValidatorPoolKey beforeAll(async () => { - validatorOwnerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(500), - suppressLog: true, - }) - const config = createValidatorConfig({ - owner: validatorOwnerAccount.addr, - manager: validatorOwnerAccount.addr, - validatorCommissionAddress: validatorOwnerAccount.addr, - minEntryStake: BigInt(AlgoAmount.Algos(1000).microAlgos), - maxAlgoPerPool: BigInt(MaxAlgoPerPool), - percentToValidator: 50000, - poolsPerNode: MaxPoolsPerNode, - }) - - validatorId = await addValidator( - fixture.context, - validatorMasterClient, - validatorOwnerAccount, - config, - validatorMbr, - ) - firstPoolKey = await addStakingPool( - fixture.context, - validatorMasterClient, - validatorId, - 1, - validatorOwnerAccount, - poolMbr, - poolInitMbr, - ) + validatorOwnerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(500), + suppressLog: true, + }) + const config = createValidatorConfig({ + owner: validatorOwnerAccount.addr, + manager: validatorOwnerAccount.addr, + validatorCommissionAddress: validatorOwnerAccount.addr, + minEntryStake: AlgoAmount.Algos(1000).microAlgos, + maxAlgoPerPool: MaxAlgoPerPool, + percentToValidator: 50000n, + poolsPerNode: BigInt(MaxPoolsPerNode), + }) + + validatorId = await addValidator(fixture.context, validatorMasterClient, validatorOwnerAccount, config, mbrs.addValidatorMbr) + firstPoolKey = await addStakingPool( + fixture.context, + validatorMasterClient, + validatorId, + 1, + validatorOwnerAccount, + mbrs.addPoolMbr, + mbrs.poolInitMbr, + ) }) test('addRemoveByStaker', async () => { - const stakerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(10_000), - suppressLog: true, - }) - let amountStaked = 0 - const [addStake1] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - AlgoAmount.Algos(1100), - 0n, - ) - amountStaked = AlgoAmount.Algos(1100).microAlgos - Number(stakerMbr) - expect(addStake1.id).toEqual(firstPoolKey.id) - expect(addStake1.poolId).toEqual(firstPoolKey.poolId) - expect(addStake1.poolAppId).toEqual(firstPoolKey.poolAppId) - - const stakerAcctBalance = await fixture.context.algod.accountInformation(stakerAccount.addr).do() - const ourPoolClient = new StakingPoolClient( - { sender: stakerAccount, resolveBy: 'id', id: firstPoolKey.poolAppId }, - fixture.context.algod, - ) - - // Get Pool info before removing stake.. - const preRemovePoolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - // then remove the stake ! - const removeFees = await removeStake(ourPoolClient, stakerAccount, AlgoAmount.MicroAlgos(0)) - const newBalance = await fixture.context.algod.accountInformation(stakerAccount.addr).do() - expect(newBalance.amount).toEqual( - stakerAcctBalance.amount + amountStaked - removeFees, // microAlgo for `removeStake fees - ) - - // stakers should have been reduced and stake amount should have been reduced by stake removed - const postRemovePoolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(postRemovePoolInfo.totalStakers).toEqual(preRemovePoolInfo.totalStakers - 1) - expect(postRemovePoolInfo.totalAlgoStaked).toEqual(preRemovePoolInfo.totalAlgoStaked - BigInt(amountStaked)) + const stakerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(10_000), + suppressLog: true, + }) + let amountStaked = 0n + const [addStake1] = await addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, AlgoAmount.Algos(1100), 0n) + amountStaked = AlgoAmount.Algos(1100).microAlgos - mbrs.addStakerMbr + expect(addStake1.id).toEqual(firstPoolKey.id) + expect(addStake1.poolId).toEqual(firstPoolKey.poolId) + expect(addStake1.poolAppId).toEqual(firstPoolKey.poolAppId) + + const stakerAcctBalance = await fixture.context.algorand.account.getInformation(stakerAccount.addr) + const ourPoolClient = stakingPoolFactory.getAppClientById({ appId: firstPoolKey.poolAppId, defaultSender: stakerAccount.addr }) + + // Get Pool info before removing stake.. + const preRemovePoolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + // then remove the stake ! + const removeFees = await removeStake(ourPoolClient, stakerAccount, AlgoAmount.MicroAlgos(0)) + const newBalance = await fixture.context.algorand.account.getInformation(stakerAccount.addr) + expect(newBalance.balance.microAlgo).toEqual( + stakerAcctBalance.balance.microAlgo + amountStaked - removeFees, // microAlgo for `removeStake fees + ) + + // stakers should have been reduced and stake amount should have been reduced by stake removed + const postRemovePoolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(postRemovePoolInfo.totalStakers).toEqual(preRemovePoolInfo.totalStakers - 1n) + expect(postRemovePoolInfo.totalAlgoStaked).toEqual(preRemovePoolInfo.totalAlgoStaked - BigInt(amountStaked)) }) test('addRemoveFail', async () => { - const stakerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(10_000), - suppressLog: true, - }) - const [addStake1] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - AlgoAmount.Algos(1100), - 0n, - ) - expect(addStake1.id).toEqual(firstPoolKey.id) - expect(addStake1.poolId).toEqual(firstPoolKey.poolId) - expect(addStake1.poolAppId).toEqual(firstPoolKey.poolAppId) + const stakerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(10_000), + suppressLog: true, + }) + const [addStake1] = await addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, AlgoAmount.Algos(1100), 0n) + expect(addStake1.id).toEqual(firstPoolKey.id) + expect(addStake1.poolId).toEqual(firstPoolKey.poolId) + expect(addStake1.poolAppId).toEqual(firstPoolKey.poolAppId) - const ourPoolClient = new StakingPoolClient( - { sender: stakerAccount, resolveBy: 'id', id: firstPoolKey.poolAppId }, - fixture.context.algod, - ) - const otherAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(10_000), - suppressLog: true, - }) + const ourPoolClient = stakingPoolFactory.getAppClientById({ appId: firstPoolKey.poolAppId, defaultSender: stakerAccount.addr }) + const otherAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(10_000), + suppressLog: true, + }) - await expect(removeStake(ourPoolClient, otherAccount, AlgoAmount.MicroAlgos(0))).rejects.toThrowError() + await expect(removeStake(ourPoolClient, otherAccount, AlgoAmount.MicroAlgos(0))).rejects.toThrowError() }) test('addRemoveByValidator', async () => { - const stakerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(10_000), - suppressLog: true, - }) - let amountStaked = 0 - const [addStake1] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - AlgoAmount.Algos(1100), - 0n, - ) - amountStaked = AlgoAmount.Algos(1100).microAlgos - Number(stakerMbr) - expect(addStake1.id).toEqual(firstPoolKey.id) - expect(addStake1.poolId).toEqual(firstPoolKey.poolId) - expect(addStake1.poolAppId).toEqual(firstPoolKey.poolAppId) - - const stakerAcctBalance = await fixture.context.algod.accountInformation(stakerAccount.addr).do() - const ourPoolClient = new StakingPoolClient( - { sender: validatorOwnerAccount, resolveBy: 'id', id: firstPoolKey.poolAppId }, - fixture.context.algod, - ) - - const preRemovePoolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - // client is sending txns via validatorOwnerAccount - but we're removing stakerAccount's stake (to them) - const removeFees = await removeStake(ourPoolClient, stakerAccount, AlgoAmount.MicroAlgos(0)) - const newBalance = await fixture.context.algod.accountInformation(stakerAccount.addr).do() - expect(newBalance.amount).toEqual( - stakerAcctBalance.amount + amountStaked - removeFees, // microAlgo for `removeStake fees - ) - - // stakers should have been reduced and stake amount should have been reduced by stake removed - const postRemovePoolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(postRemovePoolInfo.totalStakers).toEqual(preRemovePoolInfo.totalStakers - 1) - expect(postRemovePoolInfo.totalAlgoStaked).toEqual(preRemovePoolInfo.totalAlgoStaked - BigInt(amountStaked)) - }) -}) - -export async function verifyRewardAmounts( + const stakerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(10_000), + suppressLog: true, + }) + let amountStaked = 0n + const [addStake1] = await addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, AlgoAmount.Algos(1100), 0n) + amountStaked = AlgoAmount.Algos(1100).microAlgos - mbrs.addStakerMbr + expect(addStake1.id).toEqual(firstPoolKey.id) + expect(addStake1.poolId).toEqual(firstPoolKey.poolId) + expect(addStake1.poolAppId).toEqual(firstPoolKey.poolAppId) + + const stakerAcctBalance = await fixture.context.algorand.account.getInformation(stakerAccount.addr) + const ourPoolClient = stakingPoolFactory.getAppClientById({ + appId: firstPoolKey.poolAppId, + defaultSender: validatorOwnerAccount.addr, + }) + + const preRemovePoolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + // client is sending txns via validatorOwnerAccount - but we're removing stakerAccount's stake (to them) + const removeFees = await removeStake(ourPoolClient, stakerAccount, AlgoAmount.MicroAlgos(0)) + const newBalance = await fixture.context.algorand.account.getInformation(stakerAccount.addr) + expect(newBalance.balance.microAlgo).toEqual( + stakerAcctBalance.balance.microAlgo + amountStaked - removeFees, // microAlgo for `removeStake fees + ) + + // stakers should have been reduced and stake amount should have been reduced by stake removed + const postRemovePoolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(postRemovePoolInfo.totalStakers).toEqual(preRemovePoolInfo.totalStakers - 1n) + expect(postRemovePoolInfo.totalAlgoStaked).toEqual(preRemovePoolInfo.totalAlgoStaked - amountStaked) + }) + }) + + async function verifyRewardAmounts( context: AlgorandTestAutomationContext, algoRewardedAmount: bigint, tokenRewardedAmount: bigint, stakersPriorToReward: StakedInfo[], stakersAfterReward: StakedInfo[], epochRoundLength: number, -): Promise { + ): Promise { // iterate stakersPriorToReward and total the 'balance' value to get a 'total amount' // then determine if the stakersAfterReward version's balance incremented in accordance w/ their percentage of // the 'total' - where they get that percentage of the rewardedAmount. - const totalAmount = stakersPriorToReward.reduce((total, staker) => BigInt(total) + staker.balance, BigInt(0)) + const totalAmount = stakersPriorToReward.reduce((total, staker) => total + staker.balance, 0n) // Figure out the timestamp of prior block and use that as the 'current time' for purposes // of matching the epoch payout calculations in the contract @@ -886,491 +766,110 @@ export async function verifyRewardAmounts( const thisEpochBegin = lastBlock - (lastBlock % epochRoundLength) let numStakers = 0 for (let i = 0; i < stakersPriorToReward.length; i += 1) { - if (encodeAddress(stakersPriorToReward[i].staker.publicKey) === ALGORAND_ZERO_ADDRESS_STRING) { - continue - } - numStakers += 1 + if (stakersPriorToReward[i].account === ALGORAND_ZERO_ADDRESS_STRING) { + continue + } + numStakers += 1 } consoleLogger.info( - `verifyRewardAmounts checking ${numStakers} stakers. ` + - `reward:${algoRewardedAmount}, totalAmount:${totalAmount}, ` + - `epochBegin:${thisEpochBegin}, epochLength:${epochRoundLength}`, + `verifyRewardAmounts checking ${numStakers} stakers. ` + + `reward:${algoRewardedAmount}, totalAmount:${totalAmount}, ` + + `epochBegin:${thisEpochBegin}, epochLength:${epochRoundLength}`, ) // Iterate all stakers - determine which haven't been for entire epoch - pay them proportionally less for having // less time in pool. We keep track of their stake and then will later reduce the effective 'total staked' amount // by that so that the remaining stakers get the remaining reward + excess based on their % of stake against // remaining participants. - let partialStakeAmount: bigint = BigInt(0) + let partialStakeAmount: bigint = 0n let algoRewardsAvail: bigint = algoRewardedAmount let tokenRewardsAvail: bigint = tokenRewardedAmount for (let i = 0; i < stakersPriorToReward.length; i += 1) { - if (encodeAddress(stakersPriorToReward[i].staker.publicKey) === ALGORAND_ZERO_ADDRESS_STRING) { - continue - } - if (stakersPriorToReward[i].entryRound >= thisEpochBegin) { - consoleLogger.info(`staker:${i}, Entry:${stakersPriorToReward[i].entryRound} - after epoch - continuing`) - continue - } - const origBalance = stakersPriorToReward[i].balance - const origRwdTokenBal = stakersPriorToReward[i].rewardTokenBalance - const timeInPool: bigint = BigInt(thisEpochBegin) - stakersPriorToReward[i].entryRound - const timePercentage: bigint = (BigInt(timeInPool) * BigInt(1000)) / BigInt(epochRoundLength) // 34.7% becomes 347 - if (timePercentage < BigInt(1000)) { - // partial staker - const expectedReward = - (BigInt(origBalance) * algoRewardedAmount * BigInt(timePercentage)) / (totalAmount * BigInt(1000)) - consoleLogger.info( - `staker:${i}, Entry:${stakersPriorToReward[i].entryRound} TimePct:${timePercentage}, ` + - `PctTotal:${Number((origBalance * BigInt(1000)) / totalAmount) / 10} ` + - `ExpReward:${expectedReward}, ActReward:${stakersAfterReward[i].balance - origBalance} ` + - `${encodeAddress(stakersPriorToReward[i].staker.publicKey)}`, - ) - - if (origBalance + expectedReward !== stakersAfterReward[i].balance) { - consoleLogger.warn( - `staker:${i} expected: ${origBalance + expectedReward} reward but got: ${stakersAfterReward[i].balance}`, - ) - expect(stakersAfterReward[i].balance).toBe(origBalance + expectedReward) - } - const expectedTokenReward = - (BigInt(origBalance) * tokenRewardedAmount * BigInt(timePercentage)) / (totalAmount * BigInt(1000)) - consoleLogger.info( - `staker:${i}, ExpTokenReward:${expectedTokenReward}, ActTokenReward:${stakersAfterReward[i].rewardTokenBalance - origRwdTokenBal}`, - ) - - if (origRwdTokenBal + expectedTokenReward !== stakersAfterReward[i].rewardTokenBalance) { - consoleLogger.warn( - `staker:${i} expected: ${origRwdTokenBal + expectedTokenReward} reward but got: ${stakersAfterReward[i].rewardTokenBalance}`, - ) - expect(stakersAfterReward[i].rewardTokenBalance).toBe(origRwdTokenBal + expectedTokenReward) - } - - partialStakeAmount += origBalance - - algoRewardsAvail -= expectedReward - tokenRewardsAvail -= expectedTokenReward - } - } - const newPoolTotalStake = totalAmount - partialStakeAmount - - // now go through again and only worry about full 100% time-in-epoch stakers - for (let i = 0; i < stakersPriorToReward.length; i += 1) { - if (encodeAddress(stakersPriorToReward[i].staker.publicKey) === ALGORAND_ZERO_ADDRESS_STRING) { - continue - } - if (stakersPriorToReward[i].entryRound >= thisEpochBegin) { - consoleLogger.info( - `staker:${i}, ${encodeAddress(stakersPriorToReward[i].staker.publicKey)} SKIPPED because entry is newer at:${stakersPriorToReward[i].entryRound}`, - ) - } else { - const origBalance = stakersPriorToReward[i].balance - const origRwdTokenBal = stakersPriorToReward[i].rewardTokenBalance - const timeInPool: bigint = BigInt(thisEpochBegin) - stakersPriorToReward[i].entryRound - let timePercentage: bigint = (BigInt(timeInPool) * BigInt(1000)) / BigInt(epochRoundLength) // 34.7% becomes 347 - if (timePercentage < BigInt(1000)) { - continue - } - if (timePercentage > BigInt(1000)) { - timePercentage = BigInt(1000) - } - const expectedReward = (BigInt(origBalance) * algoRewardsAvail) / newPoolTotalStake - consoleLogger.info( - `staker:${i}, TimePct:${timePercentage}, PctTotal:${Number((origBalance * BigInt(1000)) / newPoolTotalStake) / 10} ExpReward:${expectedReward}, ActReward:${stakersAfterReward[i].balance - origBalance} ${encodeAddress(stakersPriorToReward[i].staker.publicKey)}`, - ) - const expectedTokenReward = (BigInt(origBalance) * tokenRewardsAvail) / newPoolTotalStake - consoleLogger.info( - `staker:${i}, ExpTokenReward:${expectedTokenReward}, ActTokenReward:${stakersAfterReward[i].rewardTokenBalance - origRwdTokenBal}`, - ) - - if (origRwdTokenBal + expectedTokenReward !== stakersAfterReward[i].rewardTokenBalance) { - consoleLogger.warn( - `staker:${i} expected: ${origRwdTokenBal + expectedTokenReward} reward but got: ${stakersAfterReward[i].rewardTokenBalance}`, - ) - expect(stakersAfterReward[i].rewardTokenBalance).toBe(origRwdTokenBal + expectedTokenReward) - } - } - } -} - -describe('StakeWRewards', () => { - beforeEach(fixture.beforeEach) - beforeEach(logs.beforeEach) - afterEach(logs.afterEach) - - let validatorId: number - let validatorOwnerAccount: Account - const stakerAccounts: Account[] = [] - let poolAppId: bigint - let firstPoolKey: ValidatorPoolKey - let firstPoolClient: StakingPoolClient - - const PctToValidator = 5 - const epochRoundLength = 4 - - // add validator and 1 pool for subsequent stake tests - beforeAll(async () => { - // Fund a 'validator account' that will be the validator owner. - validatorOwnerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(500), - suppressLog: true, - }) - consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) - - const config = createValidatorConfig({ - owner: validatorOwnerAccount.addr, - manager: validatorOwnerAccount.addr, - minEntryStake: BigInt(AlgoAmount.Algos(1000).microAlgos), - maxAlgoPerPool: BigInt(MaxAlgoPerPool), // this comes into play in later tests !! - percentToValidator: PctToValidator * 10000, - validatorCommissionAddress: validatorOwnerAccount.addr, - epochRoundLength, - }) - validatorId = await addValidator( - fixture.context, - validatorMasterClient, - validatorOwnerAccount, - config, - validatorMbr, - ) - - // Add new pool - then we'll add stake and verify balances. - firstPoolKey = await addStakingPool( - fixture.context, - validatorMasterClient, - validatorId, - 1, - validatorOwnerAccount, - poolMbr, - poolInitMbr, - ) - // should be [validator id, pool id (1 based)] - expect(firstPoolKey.id).toEqual(BigInt(validatorId)) - expect(firstPoolKey.poolId).toEqual(1n) - - firstPoolClient = new StakingPoolClient( - { sender: validatorOwnerAccount, resolveBy: 'id', id: firstPoolKey.poolAppId }, - fixture.context.algod, - ) - - // get the app id via contract call - it should match what we just got back in poolKey[2] - poolAppId = ( - await validatorMasterClient.getPoolAppId( - { validatorId: firstPoolKey.id, poolId: firstPoolKey.poolId }, - { sendParams: { populateAppCallResources: true } }, - ) - ).return! - expect(firstPoolKey.poolAppId).toEqual(poolAppId) - - const stateData = await getValidatorState(validatorMasterClient, validatorId) - expect(stateData.numPools).toEqual(1) - expect(stateData.totalAlgoStaked).toEqual(0n) - expect(stateData.totalStakers).toEqual(0n) - - const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(poolInfo.poolAppId).toEqual(BigInt(poolAppId)) - expect(poolInfo.totalStakers).toEqual(0) - expect(poolInfo.totalAlgoStaked).toEqual(0n) - }) - - // Creates dummy staker: - // adds 1000 algo (plus enough to cover staker mbr) - test('firstStaker', async () => { - // Fund a 'staker account' that will be the new 'staker' - const stakerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(5000), - suppressLog: true, - }) - stakerAccounts.push(stakerAccount) - - // now stake 1000(+mbr), min for this pool - for the first time - which means actual stake amount will be reduced - // by 'first time staker' fee to cover MBR (which goes to VALIDATOR contract account, not staker contract account!) - // we pay the extra here so the final staked amount should be exactly 1000 - const stakeAmount1 = AlgoAmount.MicroAlgos( - AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(Number(stakerMbr)).microAlgos, - ) - const [stakedPoolKey] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - stakeAmount1, - 0n, - ) - // should match info from first staking pool - expect(stakedPoolKey.id).toEqual(firstPoolKey.id) - expect(stakedPoolKey.poolId).toEqual(firstPoolKey.poolId) - expect(stakedPoolKey.poolAppId).toEqual(firstPoolKey.poolAppId) - - const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(poolInfo.totalStakers).toEqual(1) - expect(poolInfo.totalAlgoStaked).toEqual(BigInt(stakeAmount1.microAlgos - Number(stakerMbr))) - - expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) - }) - - test('testFirstRewards', async () => { - const origValidatorState = await getValidatorState(validatorMasterClient, validatorId) - const ownerBalance = await fixture.context.algod.accountInformation(validatorOwnerAccount.addr).do() - const stakersPriorToReward = await getStakeInfoFromBoxValue(firstPoolClient) - - const reward = AlgoAmount.Algos(200) - // put some test 'reward' algos into staking pool - await transferAlgos( - { - from: fixture.context.testAccount, - to: getApplicationAddress(firstPoolKey.poolAppId), - amount: reward, - }, - fixture.context.algod, - ) - await incrementRoundNumberBy(fixture.context, 320 + epochRoundLength + epochRoundLength / 2) - - const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - consoleLogger.info(`pool stakers:${poolInfo.totalStakers}, staked:${poolInfo.totalAlgoStaked}`) - - const payoutBefore = BigInt((await firstPoolClient.appClient.getGlobalState()).lastPayout.value as bigint) - const epochBefore = BigInt((await firstPoolClient.appClient.getGlobalState()).epochNumber.value as bigint) - - // Perform epoch payout calculation - we also get back how much it cost to issue the txn - const fees = await epochBalanceUpdate(firstPoolClient) - const expectedValidatorReward = reward.microAlgos * (PctToValidator / 100) - - expect(BigInt((await firstPoolClient.appClient.getGlobalState()).lastPayout.value as bigint)).toBeGreaterThan( - payoutBefore, - ) - expect(BigInt((await firstPoolClient.appClient.getGlobalState()).epochNumber.value as bigint)).toEqual( - epochBefore + 1n, - ) - - const newValidatorState = await getValidatorState(validatorMasterClient, validatorId) - const newOwnerBalance = await fixture.context.algod.accountInformation(validatorOwnerAccount.addr).do() - // validator owner should have gotten the expected reward (minus the fees they just paid ofc) - expect(newOwnerBalance.amount).toEqual(ownerBalance.amount - fees.microAlgos + expectedValidatorReward) - - // Verify all the stakers in the pool got what we think they should have - const stakersAfterReward = await getStakeInfoFromBoxValue(firstPoolClient) - - await verifyRewardAmounts( - fixture.context, - (BigInt(reward.microAlgos) - BigInt(expectedValidatorReward)) as bigint, - 0n, - stakersPriorToReward as StakedInfo[], - stakersAfterReward as StakedInfo[], - epochRoundLength, - ) - - // the total staked should have grown as well - reward minus what the validator was paid in their commission - expect(Number(newValidatorState.totalAlgoStaked)).toEqual( - Number(origValidatorState.totalAlgoStaked) + (reward.microAlgos - expectedValidatorReward), + if (stakersPriorToReward[i].account === ALGORAND_ZERO_ADDRESS_STRING) { + continue + } + if (stakersPriorToReward[i].entryRound >= thisEpochBegin) { + consoleLogger.info(`staker:${i}, Entry:${stakersPriorToReward[i].entryRound} - after epoch - continuing`) + continue + } + const origBalance = stakersPriorToReward[i].balance + const origRwdTokenBal = stakersPriorToReward[i].rewardTokenBalance + const timeInPool: bigint = BigInt(thisEpochBegin) - stakersPriorToReward[i].entryRound + const timePercentage: bigint = (timeInPool * 1000n) / BigInt(epochRoundLength) // 34.7% becomes 347 + if (timePercentage < 1000n) { + // partial staker + const expectedReward = (origBalance * algoRewardedAmount * timePercentage) / (totalAmount * 1000n) + consoleLogger.info( + `staker:${i}, Entry:${stakersPriorToReward[i].entryRound} TimePct:${timePercentage}, ` + + `PctTotal:${(origBalance * 1000n) / totalAmount / 10n} ` + + `ExpReward:${expectedReward}, ActReward:${stakersAfterReward[i].balance - origBalance} ` + + `${stakersPriorToReward[i].account}`, ) - const poolBalance = await getPoolAvailBalance(fixture.context, firstPoolKey) - expect(poolBalance).toEqual(newValidatorState.totalAlgoStaked) - }) - - test('extractRewards', async () => { - const origStakerBalance = await fixture.context.algod.accountInformation(stakerAccounts[0].addr).do() - - // Remove it all - const fees = await removeStake(firstPoolClient, stakerAccounts[0], AlgoAmount.Algos(1190)) - - const newStakerBalance = await fixture.context.algod.accountInformation(stakerAccounts[0].addr).do() - // 1000 algos staked + 190 reward (- fees for removing stake) - expect(newStakerBalance.amount).toEqual(origStakerBalance.amount + AlgoAmount.Algos(1190).microAlgos - fees) - - // no one should be left and be 0 balance - const postRemovePoolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(postRemovePoolInfo.totalStakers).toEqual(0) - expect(postRemovePoolInfo.totalAlgoStaked).toEqual(0n) - - const newValidatorState = await getValidatorState(validatorMasterClient, validatorId) - expect(Number(newValidatorState.totalAlgoStaked)).toEqual(0) - expect(Number(newValidatorState.totalStakers)).toEqual(0) - - const poolBalance = await getPoolAvailBalance(fixture.context, firstPoolKey) - expect(poolBalance).toEqual(newValidatorState.totalAlgoStaked) - }) - - test('testNoRewards', async () => { - await incrementRoundNumberBy(fixture.context, epochRoundLength) - - // Do epoch payout immediately with no new funds - should still succeed but basically do nothing - const ownerBalance = await fixture.context.algod.accountInformation(validatorOwnerAccount.addr).do() - const epochBefore = BigInt((await firstPoolClient.appClient.getGlobalState()).epochNumber.value as bigint) - const lastPayout = BigInt((await firstPoolClient.appClient.getGlobalState()).lastPayout.value as bigint) - const fees = await epochBalanceUpdate(firstPoolClient) - - const newGS = await firstPoolClient.appClient.getGlobalState() - expect(BigInt(newGS.epochNumber.value as bigint)).toEqual(epochBefore + 1n) - expect(newGS.lastPayout.value as bigint).toBeGreaterThan(lastPayout) - const newOwnerBalance = await fixture.context.algod.accountInformation(validatorOwnerAccount.addr).do() - expect(newOwnerBalance.amount).toEqual(ownerBalance.amount - fees.microAlgos) - }) - - test('testTooEarlyEpoch', async () => { - // put some test 'reward' algos into staking pool - await transferAlgos( - { - from: fixture.context.testAccount, - to: getApplicationAddress(firstPoolKey.poolAppId), - amount: AlgoAmount.Algos(100), - }, - fixture.context.algod, - ) - const params = await fixture.context.algod.getTransactionParams().do() - // add blocks to get to exact start of new epoch - if (params.firstRound % epochRoundLength !== 0) { - await incrementRoundNumberBy(fixture.context, epochRoundLength - (params.firstRound % epochRoundLength)) + if (origBalance + expectedReward !== stakersAfterReward[i].balance) { + consoleLogger.warn(`staker:${i} expected: ${origBalance + expectedReward} reward but got: ${stakersAfterReward[i].balance}`) + expect(stakersAfterReward[i].balance).toBe(origBalance + expectedReward) } - // this payout should work... - await epochBalanceUpdate(firstPoolClient) - - await transferAlgos( - { - from: fixture.context.testAccount, - to: getApplicationAddress(firstPoolKey.poolAppId), - amount: AlgoAmount.Algos(100), - }, - fixture.context.algod, - ) - // We added more again - but enough time shouldn't have passed to allow another payout - await expect(epochBalanceUpdate(firstPoolClient)).rejects.toThrowError() - - // and staked amount should still be 0 - const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(poolInfo.totalStakers).toEqual(0) - expect(poolInfo.totalAlgoStaked).toEqual(0n) - - await logStakingPoolInfo(fixture.context, firstPoolKey.poolAppId, 'should be no stakers !') - - // We added 200 algo in to bump the clock a bit - and cause transactions - this is basically future reward - // we did 1 payout - so balance should be 200 - (validator % of 100) - const poolBalance = await getPoolAvailBalance(fixture.context, firstPoolKey) - expect(poolBalance).toEqual( - BigInt(AlgoAmount.Algos(200).microAlgos) - - BigInt(AlgoAmount.Algos(100).microAlgos * (PctToValidator / 100)), + const expectedTokenReward = (origBalance * tokenRewardedAmount * timePercentage) / (totalAmount * 1000n) + consoleLogger.info( + `staker:${i}, ExpTokenReward:${expectedTokenReward}, ActTokenReward:${stakersAfterReward[i].rewardTokenBalance - origRwdTokenBal}`, ) - consoleLogger.info(`ending pool balance: ${poolBalance}`) - }) - test('testPartialReward', async () => { - // Create two (brand new!) stakers - with same amount entered - but we'll enter later to the first staker so - // it will be a 'partial' entry into the epoch (so we can ensure partial payout occurs) for the other stakers - // - this will verify the partial stakers have the reward divided correctly - const partialEpochStaker1 = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(5000), - suppressLog: true, - }) - const partialEpochStaker2 = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(5000), - suppressLog: true, - }) - stakerAccounts.push(partialEpochStaker1) - stakerAccounts.push(partialEpochStaker2) - - const params = await fixture.context.algod.getTransactionParams().do() - // add blocks to get to block prior to start of new epoch - await incrementRoundNumberBy(fixture.context, epochRoundLength - 1 - (params.firstRound % epochRoundLength)) - - // double-check no one should be left and be 0 balance - const checkPoolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(checkPoolInfo.totalStakers).toEqual(0) - expect(checkPoolInfo.totalAlgoStaked).toEqual(0n) + if (origRwdTokenBal + expectedTokenReward !== stakersAfterReward[i].rewardTokenBalance) { + consoleLogger.warn( + `staker:${i} expected: ${origRwdTokenBal + expectedTokenReward} reward but got: ${stakersAfterReward[i].rewardTokenBalance}`, + ) + expect(stakersAfterReward[i].rewardTokenBalance).toBe(origRwdTokenBal + expectedTokenReward) + } - const checkValidatorState = await getValidatorState(validatorMasterClient, validatorId) - expect(Number(checkValidatorState.totalAlgoStaked)).toEqual(0) - expect(Number(checkValidatorState.totalStakers)).toEqual(0) + partialStakeAmount += origBalance - // Ok, re-enter the pool so no need to pay MBR - const stakeAmount1 = AlgoAmount.Algos(1000) - // Add stake for first staker - const [aPoolKey] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccounts[0], - stakeAmount1, - 0n, - ) - expect(aPoolKey.poolAppId).toEqual(aPoolKey.poolAppId) + algoRewardsAvail -= expectedReward + tokenRewardsAvail -= expectedTokenReward + } + } + const newPoolTotalStake = totalAmount - partialStakeAmount - const staker1Info = await getStakerInfo(firstPoolClient, stakerAccounts[0]) - const stakingPoolGS = await firstPoolClient.appClient.getGlobalState() + // now go through again and only worry about full 100% time-in-epoch stakers + for (let i = 0; i < stakersPriorToReward.length; i += 1) { + if (stakersPriorToReward[i].account === ALGORAND_ZERO_ADDRESS_STRING) { + continue + } + if (stakersPriorToReward[i].entryRound >= thisEpochBegin) { consoleLogger.info( - `lastPayout:${stakingPoolGS.lastPayout.value}, staker1 entry round: ${staker1Info.entryRound}`, + `staker:${i}, ${stakersPriorToReward[i].account} SKIPPED because entry is newer at:${stakersPriorToReward[i].entryRound}`, ) - - // add next staker immediately after - with such small epoch it should be somewhat smaller reward - const partialStakersAmount = AlgoAmount.MicroAlgos( - AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(Number(stakerMbr)).microAlgos, - ) - // Add stake for each partial-epoch staker - const [newPoolKey] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - partialEpochStaker1, - partialStakersAmount, - 0n, - ) - - expect(newPoolKey.poolAppId).toEqual(aPoolKey.poolAppId) - const staker2Info = await getStakerInfo(firstPoolClient, partialEpochStaker1) - consoleLogger.info(`partialEpochStaker: new entry round: ${staker2Info.entryRound}`) - const [newPoolKey2] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - partialEpochStaker2, - partialStakersAmount, - 0n, - ) - - expect(newPoolKey2.poolAppId).toEqual(aPoolKey.poolAppId) - const staker3Info = await getStakerInfo(firstPoolClient, partialEpochStaker2) - consoleLogger.info(`partialEpochStaker: new entry round: ${staker3Info.entryRound}`) - - await logStakingPoolInfo(fixture.context, firstPoolKey.poolAppId, 'should have three stakers') - - // ok now do payouts - and see if we can verify the expected totals - const poolInfo = await getPoolInfo(validatorMasterClient, aPoolKey) - expect(poolInfo.totalStakers).toEqual(3) - // only subtract out 2 stakers mbr because only the 'fullEpochStaker' will be 'new' to staking - expect(poolInfo.totalAlgoStaked).toEqual( - BigInt(stakeAmount1.microAlgos + partialStakersAmount.microAlgos * 2) - 2n * stakerMbr, + } else { + const origBalance = stakersPriorToReward[i].balance + const origRwdTokenBal = stakersPriorToReward[i].rewardTokenBalance + const timeInPool: bigint = BigInt(thisEpochBegin) - stakersPriorToReward[i].entryRound + let timePercentage: bigint = (timeInPool * 1000n) / BigInt(epochRoundLength) // 34.7% becomes 347 + if (timePercentage < 1000n) { + continue + } + if (timePercentage > 1000n) { + timePercentage = 1000n + } + const expectedReward = (origBalance * algoRewardsAvail) / newPoolTotalStake + consoleLogger.info( + `staker:${i}, TimePct:${timePercentage}, PctTotal:${(origBalance * 1000n) / newPoolTotalStake / 10n} ExpReward:${expectedReward}, ActReward:${stakersAfterReward[i].balance - origBalance} ${stakersPriorToReward[i].account}`, ) - - // What's pool's current balance - const poolBalance = await getPoolAvailBalance(fixture.context, firstPoolKey) - const knownReward = poolBalance - poolInfo.totalAlgoStaked - const expectedValidatorReward = Number(knownReward) * (PctToValidator / 100) - - const stakersPriorToReward = await getStakeInfoFromBoxValue(firstPoolClient) - - await incrementRoundNumberBy(fixture.context, 320 + epochRoundLength) - - // do reward calcs - await epochBalanceUpdate(firstPoolClient) - const stakersAfterReward = await getStakeInfoFromBoxValue(firstPoolClient) - - await logStakingPoolInfo(fixture.context, firstPoolKey.poolAppId, 'after payouts') - await verifyRewardAmounts( - fixture.context, - knownReward - BigInt(expectedValidatorReward), - 0n, - stakersPriorToReward, - stakersAfterReward, - epochRoundLength, + const expectedTokenReward = (origBalance * tokenRewardsAvail) / newPoolTotalStake + consoleLogger.info( + `staker:${i}, ExpTokenReward:${expectedTokenReward}, ActTokenReward:${stakersAfterReward[i].rewardTokenBalance - origRwdTokenBal}`, ) - }) -}) -describe('StakeW0Commission', () => { - beforeEach(fixture.beforeEach) - beforeEach(logs.beforeEach) - afterEach(logs.afterEach) + if (origRwdTokenBal + expectedTokenReward !== stakersAfterReward[i].rewardTokenBalance) { + consoleLogger.warn( + `staker:${i} expected: ${origRwdTokenBal + expectedTokenReward} reward but got: ${stakersAfterReward[i].rewardTokenBalance}`, + ) + expect(stakersAfterReward[i].rewardTokenBalance).toBe(origRwdTokenBal + expectedTokenReward) + } + } + } + } + describe('StakeWRewards', () => { let validatorId: number let validatorOwnerAccount: Account const stakerAccounts: Account[] = [] @@ -1378,179 +877,322 @@ describe('StakeW0Commission', () => { let firstPoolKey: ValidatorPoolKey let firstPoolClient: StakingPoolClient - const PctToValidator = 0 - - // add validator and 1 pool for subsequent stake tests - beforeAll(async () => { - // Fund a 'validator account' that will be the validator owner. - validatorOwnerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(500), - suppressLog: true, - }) - consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) - - const config = createValidatorConfig({ - owner: validatorOwnerAccount.addr, - manager: validatorOwnerAccount.addr, - minEntryStake: BigInt(AlgoAmount.Algos(1000).microAlgos), - maxAlgoPerPool: BigInt(MaxAlgoPerPool), // this comes into play in later tests !! - percentToValidator: PctToValidator * 10000, - validatorCommissionAddress: validatorOwnerAccount.addr, - }) - validatorId = await addValidator( - fixture.context, - validatorMasterClient, - validatorOwnerAccount, - config, - validatorMbr, - ) - firstPoolKey = await addStakingPool( - fixture.context, - validatorMasterClient, - validatorId, - 1, - validatorOwnerAccount, - poolMbr, - poolInitMbr, - ) - expect(firstPoolKey.id).toEqual(BigInt(validatorId)) - expect(firstPoolKey.poolId).toEqual(1n) - - firstPoolClient = new StakingPoolClient( - { sender: validatorOwnerAccount, resolveBy: 'id', id: firstPoolKey.poolAppId }, - fixture.context.algod, - ) - poolAppId = ( - await validatorMasterClient.getPoolAppId( - { validatorId: firstPoolKey.id, poolId: firstPoolKey.poolId }, - { sendParams: { populateAppCallResources: true } }, - ) - ).return! - expect(firstPoolKey.poolAppId).toEqual(poolAppId) - }) - - // boilerplate at this point. just dd some stake - testing different commissions is all we care about - test('firstStaker', async () => { - // Fund a 'staker account' that will be the new 'staker' - const stakerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(5000), - suppressLog: true, - }) - stakerAccounts.push(stakerAccount) - - // now stake 1000(+mbr), min for this pool - for the first time - which means actual stake amount will be reduced - // by 'first time staker' fee to cover MBR (which goes to VALIDATOR contract account, not staker contract account!) - // we pay the extra here so the final staked amount should be exactly 1000 - const stakeAmount1 = AlgoAmount.MicroAlgos( - AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(Number(stakerMbr)).microAlgos, - ) - const [stakedPoolKey] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - stakeAmount1, - 0n, - ) - // should match info from first staking pool - expect(stakedPoolKey.id).toEqual(firstPoolKey.id) - expect(stakedPoolKey.poolId).toEqual(firstPoolKey.poolId) - expect(stakedPoolKey.poolAppId).toEqual(firstPoolKey.poolAppId) + const PctToValidator = 5 + const epochRoundLength = 4 - const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(poolInfo.totalStakers).toEqual(1) - expect(poolInfo.totalAlgoStaked).toEqual(BigInt(stakeAmount1.microAlgos - Number(stakerMbr))) + // add validator and 1 pool for subsequent stake tests + beforeAll(async () => { + // Fund a 'validator account' that will be the validator owner. + validatorOwnerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(500), + suppressLog: true, + }) + consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) + + const config = createValidatorConfig({ + owner: validatorOwnerAccount.addr, + manager: validatorOwnerAccount.addr, + minEntryStake: AlgoAmount.Algos(1000).microAlgos, + maxAlgoPerPool: MaxAlgoPerPool, // this comes into play in later tests !! + percentToValidator: BigInt(PctToValidator * 10000), + validatorCommissionAddress: validatorOwnerAccount.addr, + epochRoundLength: BigInt(epochRoundLength), + }) + validatorId = await addValidator(fixture.context, validatorMasterClient, validatorOwnerAccount, config, mbrs.addValidatorMbr) + + // Add new pool - then we'll add stake and verify balances. + firstPoolKey = await addStakingPool( + fixture.context, + validatorMasterClient, + validatorId, + 1, + validatorOwnerAccount, + mbrs.addPoolMbr, + mbrs.poolInitMbr, + ) + // should be [validator id, pool id (1 based)] + expect(firstPoolKey.id).toEqual(BigInt(validatorId)) + expect(firstPoolKey.poolId).toEqual(1n) + + firstPoolClient = stakingPoolFactory.getAppClientById({ appId: firstPoolKey.poolAppId, defaultSender: validatorOwnerAccount.addr }) + + // get the app id via contract call - it should match what we just got back in poolKey[2] + poolAppId = ( + await validatorMasterClient.send.getPoolAppId({ + args: { validatorId: firstPoolKey.id, poolId: firstPoolKey.poolId }, + populateAppCallResources: true, + }) + ).return! + expect(firstPoolKey.poolAppId).toEqual(poolAppId) + + const stateData = await getValidatorState(validatorMasterClient, validatorId) + expect(stateData.numPools).toEqual(1n) + expect(stateData.totalAlgoStaked).toEqual(0n) + expect(stateData.totalStakers).toEqual(0n) + + const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(poolInfo.poolAppId).toEqual(poolAppId) + expect(poolInfo.totalStakers).toEqual(0n) + expect(poolInfo.totalAlgoStaked).toEqual(0n) + }) - expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) + // Creates dummy staker: + // adds 1000 algo (plus enough to cover staker mbr) + test('firstStaker', async () => { + // Fund a 'staker account' that will be the new 'staker' + const stakerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(5000), + suppressLog: true, + }) + stakerAccounts.push(stakerAccount) + + // now stake 1000(+mbr), min for this pool - for the first time - which means actual stake amount will be reduced + // by 'first time staker' fee to cover MBR (which goes to VALIDATOR contract account, not staker contract account!) + // we pay the extra here so the final staked amount should be exactly 1000 + const stakeAmount1 = AlgoAmount.MicroAlgos(AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(mbrs.addStakerMbr).microAlgos) + const [stakedPoolKey] = await addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmount1, 0n) + // should match info from first staking pool + expect(stakedPoolKey.id).toEqual(firstPoolKey.id) + expect(stakedPoolKey.poolId).toEqual(firstPoolKey.poolId) + expect(stakedPoolKey.poolAppId).toEqual(firstPoolKey.poolAppId) + + const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(poolInfo.totalStakers).toEqual(1n) + expect(poolInfo.totalAlgoStaked).toEqual(stakeAmount1.microAlgos - mbrs.addStakerMbr) + + expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) }) test('testFirstRewards', async () => { - await incrementRoundNumberBy(fixture.context, 322) - - const origValidatorState = await getValidatorState(validatorMasterClient, validatorId) - const ownerBalance = await fixture.context.algod.accountInformation(validatorOwnerAccount.addr).do() - const stakersPriorToReward = await getStakeInfoFromBoxValue(firstPoolClient) + const origValidatorState = await getValidatorState(validatorMasterClient, validatorId) + const ownerBalance = await fixture.context.algorand.account.getInformation(validatorOwnerAccount.addr) + const stakersPriorToReward = await getStakeInfoFromBoxValue(firstPoolClient) - const reward = AlgoAmount.Algos(200) - // put some test 'reward' algos into staking pool - await transferAlgos( - { - from: fixture.context.testAccount, - to: getApplicationAddress(firstPoolKey.poolAppId), - amount: reward, - }, - fixture.context.algod, - ) + const reward = AlgoAmount.Algos(200) + // put some test 'reward' algos into staking pool + await fixture.algorand.send.payment({ + sender: fixture.context.testAccount.addr, + receiver: getApplicationAddress(firstPoolKey.poolAppId), + amount: reward, + }) + await incrementRoundNumberBy(fixture.context, 320 + epochRoundLength + epochRoundLength / 2) - const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - consoleLogger.info(`pool stakers:${poolInfo.totalStakers}, staked:${poolInfo.totalAlgoStaked}`) + const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + consoleLogger.info(`pool stakers:${poolInfo.totalStakers}, staked:${poolInfo.totalAlgoStaked}`) - const epochBefore = BigInt((await firstPoolClient.appClient.getGlobalState()).epochNumber.value as bigint) + const payoutBefore = (await firstPoolClient.state.global.lastPayout())! + const epochBefore = (await firstPoolClient.state.global.epochNumber())! - // Perform epoch payout calculation - we also get back how much it cost to issue the txn - const fees = await epochBalanceUpdate(firstPoolClient) - const expectedValidatorReward = reward.microAlgos * (PctToValidator / 100) + // Perform epoch payout calculation - we also get back how much it cost to issue the txn + const fees = await epochBalanceUpdate(firstPoolClient) + const expectedValidatorReward = (reward.microAlgos * BigInt(PctToValidator)) / 100n - expect(BigInt((await firstPoolClient.appClient.getGlobalState()).epochNumber.value as bigint)).toEqual( - epochBefore + 1n, - ) + expect(await firstPoolClient.state.global.lastPayout()).toBeGreaterThan(payoutBefore) + expect(await firstPoolClient.state.global.epochNumber()).toEqual(epochBefore + 1n) - const newValidatorState = await getValidatorState(validatorMasterClient, validatorId) - const newOwnerBalance = await fixture.context.algod.accountInformation(validatorOwnerAccount.addr).do() - // validator owner should have gotten the expected reward (minus the fees they just paid ofc) - expect(newOwnerBalance.amount).toEqual(ownerBalance.amount - fees.microAlgos + expectedValidatorReward) + const newValidatorState = await getValidatorState(validatorMasterClient, validatorId) + const newOwnerBalance = await fixture.context.algorand.account.getInformation(validatorOwnerAccount.addr) + // validator owner should have gotten the expected reward (minus the fees they just paid ofc) + expect(newOwnerBalance.balance.microAlgo).toEqual(ownerBalance.balance.microAlgo - fees.microAlgos + expectedValidatorReward) - // Verify all the stakers in the pool got what we think they should have - const stakersAfterReward = await getStakeInfoFromBoxValue(firstPoolClient) + // Verify all the stakers in the pool got what we think they should have + const stakersAfterReward = await getStakeInfoFromBoxValue(firstPoolClient) - await verifyRewardAmounts( - fixture.context, - (BigInt(reward.microAlgos) - BigInt(expectedValidatorReward)) as bigint, - 0n, - stakersPriorToReward as StakedInfo[], - stakersAfterReward as StakedInfo[], - 1 as number, - ) + await verifyRewardAmounts( + fixture.context, + reward.microAlgos - expectedValidatorReward, + 0n, + stakersPriorToReward as StakedInfo[], + stakersAfterReward as StakedInfo[], + epochRoundLength, + ) - // the total staked should have grown as well - reward minus what the validator was paid in their commission - expect(Number(newValidatorState.totalAlgoStaked)).toEqual( - Number(origValidatorState.totalAlgoStaked) + (reward.microAlgos - expectedValidatorReward), - ) + // the total staked should have grown as well - reward minus what the validator was paid in their commission + expect(newValidatorState.totalAlgoStaked).toEqual(origValidatorState.totalAlgoStaked + reward.microAlgos - expectedValidatorReward) - const poolBalance = await getPoolAvailBalance(fixture.context, firstPoolKey) - expect(poolBalance).toEqual(newValidatorState.totalAlgoStaked) + const poolBalance = await getPoolAvailBalance(fixture.context, firstPoolKey) + expect(poolBalance).toEqual(newValidatorState.totalAlgoStaked) }) test('extractRewards', async () => { - const origStakerBalance = await fixture.context.algod.accountInformation(stakerAccounts[0].addr).do() + const origStakerBalance = await fixture.context.algorand.account.getInformation(stakerAccounts[0].addr) - const expectedBalance = AlgoAmount.Algos(1000 + 200 - 200 * (PctToValidator / 100)) - // Remove it all - const fees = await removeStake(firstPoolClient, stakerAccounts[0], expectedBalance) + // Remove it all + const fees = await removeStake(firstPoolClient, stakerAccounts[0], AlgoAmount.Algos(1190)) - const newStakerBalance = await fixture.context.algod.accountInformation(stakerAccounts[0].addr).do() - // 1000 algos staked + 190 reward (- fees for removing stake) - expect(newStakerBalance.amount).toEqual(origStakerBalance.amount + expectedBalance.microAlgos - fees) + const newStakerBalance = await fixture.context.algorand.account.getInformation(stakerAccounts[0].addr) + // 1000 algos staked + 190 reward (- fees for removing stake) + expect(newStakerBalance.balance.microAlgo).toEqual(origStakerBalance.balance.microAlgo + AlgoAmount.Algos(1190).microAlgos - fees) - // no one should be left and be 0 balance - const postRemovePoolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(postRemovePoolInfo.totalStakers).toEqual(0) - expect(postRemovePoolInfo.totalAlgoStaked).toEqual(0n) + // no one should be left and be 0 balance + const postRemovePoolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(postRemovePoolInfo.totalStakers).toEqual(0n) + expect(postRemovePoolInfo.totalAlgoStaked).toEqual(0n) - const newValidatorState = await getValidatorState(validatorMasterClient, validatorId) - expect(Number(newValidatorState.totalAlgoStaked)).toEqual(0) - expect(Number(newValidatorState.totalStakers)).toEqual(0) + const newValidatorState = await getValidatorState(validatorMasterClient, validatorId) + expect(newValidatorState.totalAlgoStaked).toEqual(0n) + expect(newValidatorState.totalStakers).toEqual(0n) - const poolBalance = await getPoolAvailBalance(fixture.context, firstPoolKey) - expect(poolBalance).toEqual(newValidatorState.totalAlgoStaked) + const poolBalance = await getPoolAvailBalance(fixture.context, firstPoolKey) + expect(poolBalance).toEqual(newValidatorState.totalAlgoStaked) + }) + + test('testNoRewards', async () => { + await incrementRoundNumberBy(fixture.context, epochRoundLength) + + // Do epoch payout immediately with no new funds - should still succeed but basically do nothing + const ownerBalance = await fixture.context.algorand.account.getInformation(validatorOwnerAccount.addr) + const epochBefore = (await firstPoolClient.state.global.epochNumber())! + const lastPayout = (await firstPoolClient.state.global.lastPayout())! + const fees = await epochBalanceUpdate(firstPoolClient) + + const newGS = await firstPoolClient.state.global.getAll() + expect(newGS.epochNumber).toEqual(epochBefore + 1n) + expect(newGS.lastPayout).toBeGreaterThan(lastPayout) + const newOwnerBalance = await fixture.context.algorand.account.getInformation(validatorOwnerAccount.addr) + expect(newOwnerBalance.balance.microAlgo).toEqual(ownerBalance.balance.microAlgo - fees.microAlgos) }) -}) -describe('StakeW100Commission', () => { - beforeEach(fixture.beforeEach) - beforeEach(logs.beforeEach) - afterEach(logs.afterEach) + test('testTooEarlyEpoch', async () => { + // put some test 'reward' algos into staking pool + await fixture.algorand.send.payment({ + sender: fixture.context.testAccount.addr, + receiver: getApplicationAddress(firstPoolKey.poolAppId), + amount: AlgoAmount.Algos(100), + }) + const params = await fixture.context.algod.getTransactionParams().do() + // add blocks to get to exact start of new epoch + if (params.firstRound % epochRoundLength !== 0) { + await incrementRoundNumberBy(fixture.context, epochRoundLength - (params.firstRound % epochRoundLength)) + } + // this payout should work... + await epochBalanceUpdate(firstPoolClient) + + await fixture.algorand.send.payment({ + sender: fixture.context.testAccount.addr, + receiver: getApplicationAddress(firstPoolKey.poolAppId), + amount: AlgoAmount.Algos(100), + note: '2', + }) + // We added more again - but enough time shouldn't have passed to allow another payout + await expect(epochBalanceUpdate(firstPoolClient)).rejects.toThrowError() + + // and staked amount should still be 0 + const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(poolInfo.totalStakers).toEqual(0n) + expect(poolInfo.totalAlgoStaked).toEqual(0n) + + await logStakingPoolInfo(fixture.context, firstPoolKey.poolAppId, 'should be no stakers !') + + // We added 200 algo in to bump the clock a bit - and cause transactions - this is basically future reward + // we did 1 payout - so balance should be 200 - (validator % of 100) + const poolBalance = await getPoolAvailBalance(fixture.context, firstPoolKey) + expect(poolBalance).toEqual(AlgoAmount.Algos(200).microAlgos - (AlgoAmount.Algos(100).microAlgos * BigInt(PctToValidator)) / 100n) + consoleLogger.info(`ending pool balance: ${poolBalance}`) + }) + test('testPartialReward', async () => { + // Create two (brand new!) stakers - with same amount entered - but we'll enter later to the first staker so + // it will be a 'partial' entry into the epoch (so we can ensure partial payout occurs) for the other stakers + // - this will verify the partial stakers have the reward divided correctly + const partialEpochStaker1 = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(5000), + suppressLog: true, + }) + const partialEpochStaker2 = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(5000), + suppressLog: true, + }) + stakerAccounts.push(partialEpochStaker1) + stakerAccounts.push(partialEpochStaker2) + + const params = await fixture.context.algod.getTransactionParams().do() + // add blocks to get to block prior to start of new epoch + await incrementRoundNumberBy(fixture.context, epochRoundLength - 1 - (params.firstRound % epochRoundLength)) + + // double-check no one should be left and be 0 balance + const checkPoolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(checkPoolInfo.totalStakers).toEqual(0n) + expect(checkPoolInfo.totalAlgoStaked).toEqual(0n) + + const checkValidatorState = await getValidatorState(validatorMasterClient, validatorId) + expect(checkValidatorState.totalAlgoStaked).toEqual(0n) + expect(checkValidatorState.totalStakers).toEqual(0n) + + // Ok, re-enter the pool so no need to pay MBR + const stakeAmount1 = AlgoAmount.Algos(1000) + // Add stake for first staker + const [aPoolKey] = await addStake(fixture.context, validatorMasterClient, validatorId, stakerAccounts[0], stakeAmount1, 0n) + expect(aPoolKey.poolAppId).toEqual(aPoolKey.poolAppId) + + const staker1Info = await getStakerInfo(firstPoolClient, stakerAccounts[0]) + const stakingPoolGS = await firstPoolClient.state.global.getAll() + consoleLogger.info(`lastPayout:${stakingPoolGS.lastPayout}, staker1 entry round: ${staker1Info.entryRound}`) + + // add next staker immediately after - with such small epoch it should be somewhat smaller reward + const partialStakersAmount = AlgoAmount.MicroAlgos( + AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(mbrs.addStakerMbr).microAlgos, + ) + // Add stake for each partial-epoch staker + const [newPoolKey] = await addStake( + fixture.context, + validatorMasterClient, + validatorId, + partialEpochStaker1, + partialStakersAmount, + 0n, + ) + + expect(newPoolKey.poolAppId).toEqual(aPoolKey.poolAppId) + const staker2Info = await getStakerInfo(firstPoolClient, partialEpochStaker1) + consoleLogger.info(`partialEpochStaker: new entry round: ${staker2Info.entryRound}`) + const [newPoolKey2] = await addStake( + fixture.context, + validatorMasterClient, + validatorId, + partialEpochStaker2, + partialStakersAmount, + 0n, + ) + + expect(newPoolKey2.poolAppId).toEqual(aPoolKey.poolAppId) + const staker3Info = await getStakerInfo(firstPoolClient, partialEpochStaker2) + consoleLogger.info(`partialEpochStaker: new entry round: ${staker3Info.entryRound}`) + + await logStakingPoolInfo(fixture.context, firstPoolKey.poolAppId, 'should have three stakers') + + // ok now do payouts - and see if we can verify the expected totals + const poolInfo = await getPoolInfo(validatorMasterClient, aPoolKey) + expect(poolInfo.totalStakers).toEqual(3n) + // only subtract out 2 stakers mbr because only the 'fullEpochStaker' will be 'new' to staking + expect(poolInfo.totalAlgoStaked).toEqual(stakeAmount1.microAlgos + partialStakersAmount.microAlgos * 2n - 2n * mbrs.addStakerMbr) + + // What's pool's current balance + const poolBalance = await getPoolAvailBalance(fixture.context, firstPoolKey) + const knownReward = poolBalance - poolInfo.totalAlgoStaked + const expectedValidatorReward = (knownReward * BigInt(PctToValidator)) / 100n + + const stakersPriorToReward = await getStakeInfoFromBoxValue(firstPoolClient) + + await incrementRoundNumberBy(fixture.context, 320 + epochRoundLength) + + // do reward calcs + await epochBalanceUpdate(firstPoolClient) + const stakersAfterReward = await getStakeInfoFromBoxValue(firstPoolClient) + + await logStakingPoolInfo(fixture.context, firstPoolKey.poolAppId, 'after payouts') + await verifyRewardAmounts( + fixture.context, + knownReward - expectedValidatorReward, + 0n, + stakersPriorToReward, + stakersAfterReward, + epochRoundLength, + ) + }) + }) + + describe('StakeW0Commission', () => { let validatorId: number let validatorOwnerAccount: Account const stakerAccounts: Account[] = [] @@ -1558,563 +1200,617 @@ describe('StakeW100Commission', () => { let firstPoolKey: ValidatorPoolKey let firstPoolClient: StakingPoolClient - const PctToValidator = 100 + const PctToValidator = 0 // add validator and 1 pool for subsequent stake tests beforeAll(async () => { - // Fund a 'validator account' that will be the validator owner. - validatorOwnerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(500), - suppressLog: true, - }) - consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) - - const config = createValidatorConfig({ - owner: validatorOwnerAccount.addr, - manager: validatorOwnerAccount.addr, - minEntryStake: BigInt(AlgoAmount.Algos(1000).microAlgos), - maxAlgoPerPool: BigInt(MaxAlgoPerPool), // this comes into play in later tests !! - percentToValidator: PctToValidator * 10000, - validatorCommissionAddress: validatorOwnerAccount.addr, - }) - validatorId = await addValidator( - fixture.context, - validatorMasterClient, - validatorOwnerAccount, - config, - validatorMbr, - ) - firstPoolKey = await addStakingPool( - fixture.context, - validatorMasterClient, - validatorId, - 1, - validatorOwnerAccount, - poolMbr, - poolInitMbr, - ) - expect(firstPoolKey.id).toEqual(BigInt(validatorId)) - expect(firstPoolKey.poolId).toEqual(1n) - - firstPoolClient = new StakingPoolClient( - { sender: validatorOwnerAccount, resolveBy: 'id', id: firstPoolKey.poolAppId }, - fixture.context.algod, - ) - poolAppId = ( - await validatorMasterClient.getPoolAppId( - { validatorId: firstPoolKey.id, poolId: firstPoolKey.poolId }, - { sendParams: { populateAppCallResources: true } }, - ) - ).return! - expect(firstPoolKey.poolAppId).toEqual(poolAppId) + // Fund a 'validator account' that will be the validator owner. + validatorOwnerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(500), + suppressLog: true, + }) + consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) + + const config = createValidatorConfig({ + owner: validatorOwnerAccount.addr, + manager: validatorOwnerAccount.addr, + minEntryStake: AlgoAmount.Algos(1000).microAlgos, + maxAlgoPerPool: MaxAlgoPerPool, // this comes into play in later tests !! + percentToValidator: BigInt(PctToValidator * 10000), + validatorCommissionAddress: validatorOwnerAccount.addr, + }) + validatorId = await addValidator(fixture.context, validatorMasterClient, validatorOwnerAccount, config, mbrs.addValidatorMbr) + firstPoolKey = await addStakingPool( + fixture.context, + validatorMasterClient, + validatorId, + 1, + validatorOwnerAccount, + mbrs.addPoolMbr, + mbrs.poolInitMbr, + ) + expect(firstPoolKey.id).toEqual(BigInt(validatorId)) + expect(firstPoolKey.poolId).toEqual(1n) + + firstPoolClient = stakingPoolFactory.getAppClientById({ appId: firstPoolKey.poolAppId, defaultSender: validatorOwnerAccount.addr }) + poolAppId = ( + await validatorMasterClient.send.getPoolAppId({ + args: { validatorId: firstPoolKey.id, poolId: firstPoolKey.poolId }, + populateAppCallResources: true, + }) + ).return! + expect(firstPoolKey.poolAppId).toEqual(poolAppId) }) // boilerplate at this point. just dd some stake - testing different commissions is all we care about test('firstStaker', async () => { - // Fund a 'staker account' that will be the new 'staker' - const stakerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(5000), - suppressLog: true, - }) - stakerAccounts.push(stakerAccount) - - // now stake 1000(+mbr), min for this pool - for the first time - which means actual stake amount will be reduced - // by 'first time staker' fee to cover MBR (which goes to VALIDATOR contract account, not staker contract account!) - // we pay the extra here so the final staked amount should be exactly 1000 - const stakeAmount1 = AlgoAmount.MicroAlgos( - AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(Number(stakerMbr)).microAlgos, - ) - const [stakedPoolKey] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - stakeAmount1, - 0n, - ) - // should match info from first staking pool - expect(stakedPoolKey.id).toEqual(firstPoolKey.id) - expect(stakedPoolKey.poolId).toEqual(firstPoolKey.poolId) - expect(stakedPoolKey.poolAppId).toEqual(firstPoolKey.poolAppId) - - const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(poolInfo.totalStakers).toEqual(1) - expect(poolInfo.totalAlgoStaked).toEqual(BigInt(stakeAmount1.microAlgos - Number(stakerMbr))) - - expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) + // Fund a 'staker account' that will be the new 'staker' + const stakerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(5000), + suppressLog: true, + }) + stakerAccounts.push(stakerAccount) + + // now stake 1000(+mbr), min for this pool - for the first time - which means actual stake amount will be reduced + // by 'first time staker' fee to cover MBR (which goes to VALIDATOR contract account, not staker contract account!) + // we pay the extra here so the final staked amount should be exactly 1000 + const stakeAmount1 = AlgoAmount.MicroAlgos(AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(mbrs.addStakerMbr).microAlgos) + const [stakedPoolKey] = await addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmount1, 0n) + // should match info from first staking pool + expect(stakedPoolKey.id).toEqual(firstPoolKey.id) + expect(stakedPoolKey.poolId).toEqual(firstPoolKey.poolId) + expect(stakedPoolKey.poolAppId).toEqual(firstPoolKey.poolAppId) + + const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(poolInfo.totalStakers).toEqual(1n) + expect(poolInfo.totalAlgoStaked).toEqual(stakeAmount1.microAlgos - mbrs.addStakerMbr) + + expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) }) test('testFirstRewards', async () => { - const origValidatorState = await getValidatorState(validatorMasterClient, validatorId) - const ownerBalance = await fixture.context.algod.accountInformation(validatorOwnerAccount.addr).do() - const stakersPriorToReward = await getStakeInfoFromBoxValue(firstPoolClient) + await incrementRoundNumberBy(fixture.context, 322) - const reward = AlgoAmount.Algos(200) - // put some test 'reward' algos into staking pool - await transferAlgos( - { - from: fixture.context.testAccount, - to: getApplicationAddress(firstPoolKey.poolAppId), - amount: reward, - }, - fixture.context.algod, - ) + const origValidatorState = await getValidatorState(validatorMasterClient, validatorId) + const ownerBalance = await fixture.context.algorand.account.getInformation(validatorOwnerAccount.addr) + const stakersPriorToReward = await getStakeInfoFromBoxValue(firstPoolClient) - const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - consoleLogger.info(`pool stakers:${poolInfo.totalStakers}, staked:${poolInfo.totalAlgoStaked}`) + const reward = AlgoAmount.Algos(200) + // put some test 'reward' algos into staking pool + await fixture.algorand.send.payment({ + sender: fixture.context.testAccount.addr, + receiver: getApplicationAddress(firstPoolKey.poolAppId), + amount: reward, + }) - const epochBefore = BigInt((await firstPoolClient.appClient.getGlobalState()).epochNumber.value as bigint) + const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + consoleLogger.info(`pool stakers:${poolInfo.totalStakers}, staked:${poolInfo.totalAlgoStaked}`) - // Perform epoch payout calculation - we also get back how much it cost to issue the txn - const fees = await epochBalanceUpdate(firstPoolClient) - const expectedValidatorReward = reward.microAlgos * (PctToValidator / 100) + const epochBefore = (await firstPoolClient.state.global.epochNumber())! - expect(BigInt((await firstPoolClient.appClient.getGlobalState()).epochNumber.value as bigint)).toEqual( - epochBefore + 1n, - ) + // Perform epoch payout calculation - we also get back how much it cost to issue the txn + const fees = await epochBalanceUpdate(firstPoolClient) + const expectedValidatorReward = (reward.microAlgos * BigInt(PctToValidator)) / 100n - const newValidatorState = await getValidatorState(validatorMasterClient, validatorId) - const newOwnerBalance = await fixture.context.algod.accountInformation(validatorOwnerAccount.addr).do() - // validator owner should have gotten the expected reward (minus the fees they just paid ofc) - expect(newOwnerBalance.amount).toEqual(ownerBalance.amount - fees.microAlgos + expectedValidatorReward) + expect((await firstPoolClient.state.global.epochNumber())!).toEqual(epochBefore + 1n) - // Verify all the stakers in the pool got what we think they should have - const stakersAfterReward = await getStakeInfoFromBoxValue(firstPoolClient) + const newValidatorState = await getValidatorState(validatorMasterClient, validatorId) + const newOwnerBalance = await fixture.context.algorand.account.getInformation(validatorOwnerAccount.addr) + // validator owner should have gotten the expected reward (minus the fees they just paid ofc) + expect(newOwnerBalance.balance.microAlgo).toEqual(ownerBalance.balance.microAlgo - fees.microAlgos + expectedValidatorReward) - await verifyRewardAmounts( - fixture.context, - (BigInt(reward.microAlgos) - BigInt(expectedValidatorReward)) as bigint, - 0n, - stakersPriorToReward as StakedInfo[], - stakersAfterReward as StakedInfo[], - 1 as number, - ) + // Verify all the stakers in the pool got what we think they should have + const stakersAfterReward = await getStakeInfoFromBoxValue(firstPoolClient) - // the total staked should have grown as well - reward minus what the validator was paid in their commission - expect(Number(newValidatorState.totalAlgoStaked)).toEqual( - Number(origValidatorState.totalAlgoStaked) + (reward.microAlgos - expectedValidatorReward), - ) + await verifyRewardAmounts( + fixture.context, + reward.microAlgos - expectedValidatorReward, + 0n, + stakersPriorToReward as StakedInfo[], + stakersAfterReward as StakedInfo[], + 1 as number, + ) - const poolBalance = await getPoolAvailBalance(fixture.context, firstPoolKey) - expect(poolBalance).toEqual(newValidatorState.totalAlgoStaked) + // the total staked should have grown as well - reward minus what the validator was paid in their commission + expect(newValidatorState.totalAlgoStaked).toEqual(origValidatorState.totalAlgoStaked + (reward.microAlgos - expectedValidatorReward)) + + const poolBalance = await getPoolAvailBalance(fixture.context, firstPoolKey) + expect(poolBalance).toEqual(newValidatorState.totalAlgoStaked) }) test('extractRewards', async () => { - const origStakerBalance = await fixture.context.algod.accountInformation(stakerAccounts[0].addr).do() + const origStakerBalance = await fixture.context.algorand.account.getInformation(stakerAccounts[0].addr) - const expectedBalance = AlgoAmount.Algos(1000 + 200 - 200 * (PctToValidator / 100)) - // Remove it all - const fees = await removeStake(firstPoolClient, stakerAccounts[0], expectedBalance) + const expectedBalance = AlgoAmount.Algos(1000 + 200 - 200 * (PctToValidator / 100)) + // Remove it all + const fees = await removeStake(firstPoolClient, stakerAccounts[0], expectedBalance) - const newStakerBalance = await fixture.context.algod.accountInformation(stakerAccounts[0].addr).do() - // 1000 algos staked + 190 reward (- fees for removing stake) - expect(newStakerBalance.amount).toEqual(origStakerBalance.amount + expectedBalance.microAlgos - fees) + const newStakerBalance = await fixture.context.algorand.account.getInformation(stakerAccounts[0].addr) + // 1000 algos staked + 190 reward (- fees for removing stake) + expect(newStakerBalance.balance.microAlgo).toEqual(origStakerBalance.balance.microAlgo + expectedBalance.microAlgos - fees) - // no one should be left and be 0 balance - const postRemovePoolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(postRemovePoolInfo.totalStakers).toEqual(0) - expect(postRemovePoolInfo.totalAlgoStaked).toEqual(0n) + // no one should be left and be 0 balance + const postRemovePoolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(postRemovePoolInfo.totalStakers).toEqual(0n) + expect(postRemovePoolInfo.totalAlgoStaked).toEqual(0n) - const newValidatorState = await getValidatorState(validatorMasterClient, validatorId) - expect(Number(newValidatorState.totalAlgoStaked)).toEqual(0) - expect(Number(newValidatorState.totalStakers)).toEqual(0) + const newValidatorState = await getValidatorState(validatorMasterClient, validatorId) + expect(newValidatorState.totalAlgoStaked).toEqual(0n) + expect(newValidatorState.totalStakers).toEqual(0n) - const poolBalance = await getPoolAvailBalance(fixture.context, firstPoolKey) - expect(poolBalance).toEqual(newValidatorState.totalAlgoStaked) + const poolBalance = await getPoolAvailBalance(fixture.context, firstPoolKey) + expect(poolBalance).toEqual(newValidatorState.totalAlgoStaked) }) -}) - -describe('StakeWTokenWRewards', () => { - beforeEach(fixture.beforeEach) - beforeEach(logs.beforeEach) - afterEach(logs.afterEach) + }) + describe('StakeW100Commission', () => { let validatorId: number let validatorOwnerAccount: Account - let tokenCreatorAccount: Account - let validatorConfig: ValidatorConfig const stakerAccounts: Account[] = [] let poolAppId: bigint let firstPoolKey: ValidatorPoolKey let firstPoolClient: StakingPoolClient - let rewardTokenID: bigint - const PctToValidator = 5 - const decimals = 0 - const tokenRewardPerPayout = BigInt(1000 * 10 ** decimals) - const epochRoundLength = 4 + const PctToValidator = 100 // add validator and 1 pool for subsequent stake tests beforeAll(async () => { - // Create a reward token to pay out to stakers - tokenCreatorAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(5000), - suppressLog: true, - }) - rewardTokenID = await createAsset( - fixture.context.algod, - tokenCreatorAccount, - 'Reward Token', - 'RWDTOKEN', - 100_000, - decimals, - ) - - // Fund a 'validator account' that will be the validator owner. - validatorOwnerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(500), - suppressLog: true, - }) - consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) - - validatorConfig = createValidatorConfig({ - owner: validatorOwnerAccount.addr, - manager: validatorOwnerAccount.addr, - minEntryStake: BigInt(AlgoAmount.Algos(1000).microAlgos), - maxAlgoPerPool: BigInt(MaxAlgoPerPool), // this comes into play in later tests !! - percentToValidator: PctToValidator * 10000, - validatorCommissionAddress: validatorOwnerAccount.addr, - rewardTokenID, - rewardPerPayout: tokenRewardPerPayout, // 1000 tokens per epoch - epochRoundLength, - }) - validatorId = await addValidator( - fixture.context, - validatorMasterClient, - validatorOwnerAccount, - validatorConfig, - validatorMbr, - ) - - // Add new pool - then we'll add stake and verify balances. - // first pool needs extra .1 to cover MBR of opted-in reward token ! - firstPoolKey = await addStakingPool( - fixture.context, - validatorMasterClient, - validatorId, - 1, - validatorOwnerAccount, - poolMbr, - poolInitMbr + BigInt(AlgoAmount.Algos(0.1).microAlgos), - ) - // should be [validator id, pool id (1 based)] - expect(firstPoolKey.id).toEqual(BigInt(validatorId)) - expect(firstPoolKey.poolId).toEqual(1n) - - // now send a bunch of our reward token to the pool ! - await transferAsset( - { - from: tokenCreatorAccount, - to: getApplicationAddress(firstPoolKey.poolAppId), - assetId: Number(rewardTokenID), - amount: 5000 * 10 ** decimals, - }, - fixture.context.algod, - ) - - firstPoolClient = new StakingPoolClient( - { sender: validatorOwnerAccount, resolveBy: 'id', id: firstPoolKey.poolAppId }, - fixture.context.algod, - ) - - // get the app id via contract call - it should match what we just got back in the poolKey - poolAppId = ( - await validatorMasterClient.getPoolAppId( - { validatorId: firstPoolKey.id, poolId: firstPoolKey.poolId }, - { sendParams: { populateAppCallResources: true } }, - ) - ).return! - expect(firstPoolKey.poolAppId).toEqual(poolAppId) - - const stateData = await getValidatorState(validatorMasterClient, validatorId) - expect(stateData.numPools).toEqual(1) - expect(stateData.totalAlgoStaked).toEqual(0n) - expect(stateData.totalStakers).toEqual(0n) - expect(stateData.rewardTokenHeldBack).toEqual(0n) - - const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(poolInfo.poolAppId).toEqual(BigInt(poolAppId)) - expect(poolInfo.totalStakers).toEqual(0) - expect(poolInfo.totalAlgoStaked).toEqual(0n) + // Fund a 'validator account' that will be the validator owner. + validatorOwnerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(500), + suppressLog: true, + }) + consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) + + const config = createValidatorConfig({ + owner: validatorOwnerAccount.addr, + manager: validatorOwnerAccount.addr, + minEntryStake: AlgoAmount.Algos(1000).microAlgos, + maxAlgoPerPool: MaxAlgoPerPool, // this comes into play in later tests !! + percentToValidator: BigInt(PctToValidator * 10000), + validatorCommissionAddress: validatorOwnerAccount.addr, + }) + validatorId = await addValidator(fixture.context, validatorMasterClient, validatorOwnerAccount, config, mbrs.addValidatorMbr) + firstPoolKey = await addStakingPool( + fixture.context, + validatorMasterClient, + validatorId, + 1, + validatorOwnerAccount, + mbrs.addPoolMbr, + mbrs.poolInitMbr, + ) + expect(firstPoolKey.id).toEqual(BigInt(validatorId)) + expect(firstPoolKey.poolId).toEqual(1n) + + firstPoolClient = stakingPoolFactory.getAppClientById({ appId: firstPoolKey.poolAppId, defaultSender: validatorOwnerAccount.addr }) + poolAppId = ( + await validatorMasterClient.send.getPoolAppId({ + args: { validatorId: firstPoolKey.id, poolId: firstPoolKey.poolId }, + populateAppCallResources: true, + }) + ).return! + expect(firstPoolKey.poolAppId).toEqual(poolAppId) }) - // Creates dummy staker: - // adds 1000 algo (plus enough to cover staker mbr) + // boilerplate at this point. just dd some stake - testing different commissions is all we care about test('firstStaker', async () => { - // Fund a 'staker account' that will be the new 'staker' - const stakerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(5000), - suppressLog: true, - }) - stakerAccounts.push(stakerAccount) - // opt-in to reward token - await assetOptIn({ account: stakerAccount, assetId: Number(rewardTokenID) }, fixture.context.algod) - - // now stake 1000(+mbr), min for this pool - for the first time - which means actual stake amount will be reduced - // by 'first time staker' fee to cover MBR (which goes to VALIDATOR contract account, not staker contract account!) - // we pay the extra here so the final staked amount should be exactly 1000 - const stakeAmount1 = AlgoAmount.MicroAlgos( - AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(Number(stakerMbr)).microAlgos, - ) - const [stakedPoolKey] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - stakeAmount1, - 0n, - ) - // should match info from first staking pool - expect(stakedPoolKey.id).toEqual(firstPoolKey.id) - expect(stakedPoolKey.poolId).toEqual(firstPoolKey.poolId) - expect(stakedPoolKey.poolAppId).toEqual(firstPoolKey.poolAppId) - - const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(poolInfo.totalStakers).toEqual(1) - expect(poolInfo.totalAlgoStaked).toEqual(BigInt(stakeAmount1.microAlgos - Number(stakerMbr))) - - expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) + // Fund a 'staker account' that will be the new 'staker' + const stakerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(5000), + suppressLog: true, + }) + stakerAccounts.push(stakerAccount) + + // now stake 1000(+mbr), min for this pool - for the first time - which means actual stake amount will be reduced + // by 'first time staker' fee to cover MBR (which goes to VALIDATOR contract account, not staker contract account!) + // we pay the extra here so the final staked amount should be exactly 1000 + const stakeAmount1 = AlgoAmount.MicroAlgos(AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(mbrs.addStakerMbr).microAlgos) + const [stakedPoolKey] = await addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmount1, 0n) + // should match info from first staking pool + expect(stakedPoolKey.id).toEqual(firstPoolKey.id) + expect(stakedPoolKey.poolId).toEqual(firstPoolKey.poolId) + expect(stakedPoolKey.poolAppId).toEqual(firstPoolKey.poolAppId) + + const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(poolInfo.totalStakers).toEqual(1n) + expect(poolInfo.totalAlgoStaked).toEqual(stakeAmount1.microAlgos - mbrs.addStakerMbr) + + expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) }) test('testFirstRewards', async () => { - const origValidatorState = await getValidatorState(validatorMasterClient, validatorId) - const ownerBalance = await fixture.context.algod.accountInformation(validatorOwnerAccount.addr).do() - const stakersPriorToReward = await getStakeInfoFromBoxValue(firstPoolClient) + const origValidatorState = await getValidatorState(validatorMasterClient, validatorId) + const ownerBalance = await fixture.context.algorand.account.getInformation(validatorOwnerAccount.addr) + const stakersPriorToReward = await getStakeInfoFromBoxValue(firstPoolClient) - const reward = AlgoAmount.Algos(200) + const reward = AlgoAmount.Algos(200) + // put some test 'reward' algos into staking pool + await fixture.algorand.send.payment({ + sender: fixture.context.testAccount.addr, + receiver: getApplicationAddress(firstPoolKey.poolAppId), + amount: reward, + }) - // put some test 'reward' algos into staking pool - reward tokens are already there - await transferAlgos( - { - from: fixture.context.testAccount, - to: getApplicationAddress(firstPoolKey.poolAppId), - amount: reward, - }, - fixture.context.algod, - ) - await incrementRoundNumberBy(fixture.context, 320 + epochRoundLength + epochRoundLength / 2) + const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + consoleLogger.info(`pool stakers:${poolInfo.totalStakers}, staked:${poolInfo.totalAlgoStaked}`) - const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - consoleLogger.info(`pool stakers:${poolInfo.totalStakers}, staked:${poolInfo.totalAlgoStaked}`) + const epochBefore = (await firstPoolClient.state.global.epochNumber())! - // Perform epoch payout calculation - we also get back how much it cost to issue the txn - const fees = await epochBalanceUpdate(firstPoolClient) - const expectedValidatorReward = reward.microAlgos * (PctToValidator / 100) + // Perform epoch payout calculation - we also get back how much it cost to issue the txn + const fees = await epochBalanceUpdate(firstPoolClient) + const expectedValidatorReward = (reward.microAlgos * BigInt(PctToValidator)) / 100n - const newValidatorState = await getValidatorState(validatorMasterClient, validatorId) - const newOwnerBalance = await fixture.context.algod.accountInformation(validatorOwnerAccount.addr).do() - // validator owner should have gotten the expected reward (minus the fees they just paid ofc) - expect(newOwnerBalance.amount).toEqual(ownerBalance.amount - fees.microAlgos + expectedValidatorReward) + expect((await firstPoolClient.state.global.epochNumber())!).toEqual(epochBefore + 1n) - // Verify all the stakers in the pool got what we think they should have - const stakersAfterReward = await getStakeInfoFromBoxValue(firstPoolClient) + const newValidatorState = await getValidatorState(validatorMasterClient, validatorId) + const newOwnerBalance = await fixture.context.algorand.account.getInformation(validatorOwnerAccount.addr) + // validator owner should have gotten the expected reward (minus the fees they just paid ofc) + expect(newOwnerBalance.balance.microAlgo).toEqual(ownerBalance.balance.microAlgo - fees.microAlgos + expectedValidatorReward) - await verifyRewardAmounts( - fixture.context, - (BigInt(reward.microAlgos) - BigInt(expectedValidatorReward)) as bigint, - BigInt(tokenRewardPerPayout), - stakersPriorToReward as StakedInfo[], - stakersAfterReward as StakedInfo[], - 1 as number, - ) + // Verify all the stakers in the pool got what we think they should have + const stakersAfterReward = await getStakeInfoFromBoxValue(firstPoolClient) - // the total staked should have grown as well - reward minus what the validator was paid in their commission - expect(Number(newValidatorState.totalAlgoStaked)).toEqual( - Number(origValidatorState.totalAlgoStaked) + (reward.microAlgos - expectedValidatorReward), - ) - // await logStakingPoolInfo(fixture.context, firstPoolKey.poolAppId, 'tokenRewardCheck'); + await verifyRewardAmounts( + fixture.context, + reward.microAlgos - expectedValidatorReward, + 0n, + stakersPriorToReward as StakedInfo[], + stakersAfterReward as StakedInfo[], + 1, + ) - // the reward tokens 'held' back should've grown by the token payout amount - expect(newValidatorState.rewardTokenHeldBack).toEqual(BigInt(validatorConfig.rewardPerPayout)) + // the total staked should have grown as well - reward minus what the validator was paid in their commission + expect(newValidatorState.totalAlgoStaked).toEqual(origValidatorState.totalAlgoStaked + (reward.microAlgos - expectedValidatorReward)) - const poolBalance = await getPoolAvailBalance(fixture.context, firstPoolKey) - expect(poolBalance).toEqual(newValidatorState.totalAlgoStaked) + const poolBalance = await getPoolAvailBalance(fixture.context, firstPoolKey) + expect(poolBalance).toEqual(newValidatorState.totalAlgoStaked) }) test('extractRewards', async () => { - const origStakerBalance = await fixture.context.algod.accountInformation(stakerAccounts[0].addr).do() + const origStakerBalance = await fixture.context.algorand.account.getInformation(stakerAccounts[0].addr) - // Remove it all - const removeFees = await removeStake(firstPoolClient, stakerAccounts[0], AlgoAmount.Algos(1190)) + const expectedBalance = AlgoAmount.Algos(1000 + 200 - 200 * (PctToValidator / 100)) + // Remove it all + const fees = await removeStake(firstPoolClient, stakerAccounts[0], expectedBalance) - const newStakerBalance = await fixture.context.algod.accountInformation(stakerAccounts[0].addr).do() - // 1000 algos staked + 190 reward (- .004 in fees for removing stake) - expect(newStakerBalance.amount).toEqual( - origStakerBalance.amount + AlgoAmount.Algos(1190).microAlgos - removeFees, - ) - // verify that reward token payout came to us - const assetInfo = await fixture.context.algod - .accountAssetInformation(stakerAccounts[0].addr, Number(rewardTokenID)) - .do() - expect(BigInt(assetInfo['asset-holding'].amount)).toEqual(tokenRewardPerPayout) + const newStakerBalance = await fixture.context.algorand.account.getInformation(stakerAccounts[0].addr) + // 1000 algos staked + 190 reward (- fees for removing stake) + expect(newStakerBalance.balance.microAlgo).toEqual(origStakerBalance.balance.microAlgo + expectedBalance.microAlgos - fees) - // no one should be left and be 0 balance - const postRemovePoolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(postRemovePoolInfo.totalStakers).toEqual(0) - expect(postRemovePoolInfo.totalAlgoStaked).toEqual(0n) + // no one should be left and be 0 balance + const postRemovePoolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(postRemovePoolInfo.totalStakers).toEqual(0n) + expect(postRemovePoolInfo.totalAlgoStaked).toEqual(0n) - const newValidatorState = await getValidatorState(validatorMasterClient, validatorId) - expect(Number(newValidatorState.totalAlgoStaked)).toEqual(0) - expect(Number(newValidatorState.totalStakers)).toEqual(0) - expect(newValidatorState.rewardTokenHeldBack).toEqual(0n) + const newValidatorState = await getValidatorState(validatorMasterClient, validatorId) + expect(newValidatorState.totalAlgoStaked).toEqual(0n) + expect(newValidatorState.totalStakers).toEqual(0n) - const poolBalance = await getPoolAvailBalance(fixture.context, firstPoolKey) - expect(poolBalance).toEqual(newValidatorState.totalAlgoStaked) + const poolBalance = await getPoolAvailBalance(fixture.context, firstPoolKey) + expect(poolBalance).toEqual(newValidatorState.totalAlgoStaked) }) + }) - test('testPartialReward', async () => { - // Create second (brand new!) staker - with same amount entered - but we'll enter later to the first staker so - // it will be a 'partial' entry into the epoch (so we can ensure partial payout occurs) - const partialEpochStaker = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(5000), - suppressLog: true, - }) - stakerAccounts.push(partialEpochStaker) - // opt-in to reward token - await assetOptIn({ account: partialEpochStaker, assetId: Number(rewardTokenID) }, fixture.context.algod) + describe('StakeWTokenWRewards', () => { + let validatorId: number + let validatorOwnerAccount: Account + let tokenCreatorAccount: Account + let validatorConfig: ValidatorConfig + const stakerAccounts: Account[] = [] + let poolAppId: bigint + let firstPoolKey: ValidatorPoolKey + let firstPoolClient: StakingPoolClient - const params = await fixture.context.algod.getTransactionParams().do() - // add blocks to get to block prior to start of new epoch - await incrementRoundNumberBy(fixture.context, epochRoundLength - 1 - (params.firstRound % epochRoundLength)) - - // double-check no one should be left and be 0 balance - const checkPoolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(checkPoolInfo.totalStakers).toEqual(0) - expect(checkPoolInfo.totalAlgoStaked).toEqual(0n) - - const checkValidatorState = await getValidatorState(validatorMasterClient, validatorId) - expect(Number(checkValidatorState.totalAlgoStaked)).toEqual(0) - expect(Number(checkValidatorState.totalStakers)).toEqual(0) - - // Ok, re-enter the pool - but we'll be in right off the bat and be there for full epoch - // now stake 1000(+mbr), min for this pool - for the first time - which means actual stake amount will be reduced - // by 'first time staker' fee to cover MBR (which goes to VALIDATOR contract account, not staker contract account!) - // we pay the extra here so the final staked amount should be exactly 1000 - const stakeAmount1 = AlgoAmount.Algos(1000) - // Add stake for first staker - partial epoch - const [aPoolKey] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccounts[0], - stakeAmount1, - 0n, - ) - expect(aPoolKey.poolAppId).toEqual(firstPoolKey.poolAppId) + let rewardTokenId: bigint + const PctToValidator = 5 + const decimals = 0 + const tokenRewardPerPayout = BigInt(1000 * 10 ** decimals) + const epochRoundLength = 4 - const staker1Info = await getStakerInfo(firstPoolClient, stakerAccounts[0]) - const stakingPoolGS = await firstPoolClient.appClient.getGlobalState() - consoleLogger.info( - `lastPayout:${stakingPoolGS.lastPayout.value}, staker1 entry round: ${staker1Info.entryRound}`, - ) + // add validator and 1 pool for subsequent stake tests + beforeAll(async () => { + // Create a reward token to pay out to stakers + tokenCreatorAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(5000), + suppressLog: true, + }) + rewardTokenId = await createAsset(fixture.context, tokenCreatorAccount, 'Reward Token', 'RWDTOKEN', 100_000, decimals) + + // Fund a 'validator account' that will be the validator owner. + validatorOwnerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(500), + suppressLog: true, + }) + consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) + + validatorConfig = createValidatorConfig({ + owner: validatorOwnerAccount.addr, + manager: validatorOwnerAccount.addr, + minEntryStake: AlgoAmount.Algos(1000).microAlgos, + maxAlgoPerPool: MaxAlgoPerPool, // this comes into play in later tests !! + percentToValidator: BigInt(PctToValidator * 10000), + validatorCommissionAddress: validatorOwnerAccount.addr, + rewardTokenId, + rewardPerPayout: tokenRewardPerPayout, // 1000 tokens per epoch + epochRoundLength: BigInt(epochRoundLength), + }) + validatorId = await addValidator(fixture.context, validatorMasterClient, validatorOwnerAccount, validatorConfig, mbrs.addValidatorMbr) + + // Add new pool - then we'll add stake and verify balances. + // first pool needs extra .1 to cover MBR of opted-in reward token ! + firstPoolKey = await addStakingPool( + fixture.context, + validatorMasterClient, + validatorId, + 1, + validatorOwnerAccount, + mbrs.addPoolMbr, + mbrs.poolInitMbr + AlgoAmount.Algos(0.1).microAlgos, + ) + // should be [validator id, pool id (1 based)] + expect(firstPoolKey.id).toEqual(BigInt(validatorId)) + expect(firstPoolKey.poolId).toEqual(1n) + + // now send a bunch of our reward token to the pool ! + await fixture.algorand.send.assetTransfer({ + sender: tokenCreatorAccount.addr, + receiver: getApplicationAddress(firstPoolKey.poolAppId), + assetId: rewardTokenId, + amount: BigInt(5000 * 10 ** decimals), + }) + + firstPoolClient = stakingPoolFactory.getAppClientById({ appId: firstPoolKey.poolAppId, defaultSender: validatorOwnerAccount.addr }) + + // get the app id via contract call - it should match what we just got back in the poolKey + poolAppId = ( + await validatorMasterClient.send.getPoolAppId({ + args: { validatorId: firstPoolKey.id, poolId: firstPoolKey.poolId }, + populateAppCallResources: true, + }) + ).return! + expect(firstPoolKey.poolAppId).toEqual(poolAppId) + + const stateData = await getValidatorState(validatorMasterClient, validatorId) + expect(stateData.numPools).toEqual(1n) + expect(stateData.totalAlgoStaked).toEqual(0n) + expect(stateData.totalStakers).toEqual(0n) + expect(stateData.rewardTokenHeldBack).toEqual(0n) + + const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(poolInfo.poolAppId).toEqual(poolAppId) + expect(poolInfo.totalStakers).toEqual(0n) + expect(poolInfo.totalAlgoStaked).toEqual(0n) + }) - const stakeAmount2 = AlgoAmount.MicroAlgos( - AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(Number(stakerMbr)).microAlgos, - ) + // Creates dummy staker: + // adds 1000 algo (plus enough to cover staker mbr) + test('firstStaker', async () => { + // Fund a 'staker account' that will be the new 'staker' + const stakerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(5000), + suppressLog: true, + }) + stakerAccounts.push(stakerAccount) + // opt-in to reward token + await fixture.algorand.send.assetOptIn({ sender: stakerAccount.addr, assetId: rewardTokenId }) + + // now stake 1000(+mbr), min for this pool - for the first time - which means actual stake amount will be reduced + // by 'first time staker' fee to cover MBR (which goes to VALIDATOR contract account, not staker contract account!) + // we pay the extra here so the final staked amount should be exactly 1000 + const stakeAmount1 = AlgoAmount.MicroAlgos(AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(mbrs.addStakerMbr).microAlgos) + const [stakedPoolKey] = await addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmount1, 0n) + // should match info from first staking pool + expect(stakedPoolKey.id).toEqual(firstPoolKey.id) + expect(stakedPoolKey.poolId).toEqual(firstPoolKey.poolId) + expect(stakedPoolKey.poolAppId).toEqual(firstPoolKey.poolAppId) + + const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(poolInfo.totalStakers).toEqual(1n) + expect(poolInfo.totalAlgoStaked).toEqual(stakeAmount1.microAlgos - mbrs.addStakerMbr) + + expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) + }) - // Add stake for partial-epoch staker - const [newPoolKey] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - partialEpochStaker, - stakeAmount2, - 0n, - ) + test('testFirstRewards', async () => { + const origValidatorState = await getValidatorState(validatorMasterClient, validatorId) + const ownerBalance = await fixture.context.algorand.account.getInformation(validatorOwnerAccount.addr) + const stakersPriorToReward = await getStakeInfoFromBoxValue(firstPoolClient) - expect(newPoolKey.poolAppId).toEqual(aPoolKey.poolAppId) - const staker2Info = await getStakerInfo(firstPoolClient, partialEpochStaker) - consoleLogger.info(`partialEpochStaker: new entry round: ${staker2Info.entryRound}`) + const reward = AlgoAmount.Algos(200) - await logStakingPoolInfo(fixture.context, firstPoolKey.poolAppId, 'should have two stakers') + // put some test 'reward' algos into staking pool - reward tokens are already there + await fixture.algorand.send.payment({ + sender: fixture.context.testAccount.addr, + receiver: getApplicationAddress(firstPoolKey.poolAppId), + amount: reward, + }) + await incrementRoundNumberBy(fixture.context, 320 + epochRoundLength + epochRoundLength / 2) - // ok now do payouts - and see if we can verify the expected totals - const poolInfo = await getPoolInfo(validatorMasterClient, aPoolKey) - expect(poolInfo.totalStakers).toEqual(2) - // only subtract out 1 staker mbr because only the 'fullEpochStaker' will be 'new' to staking - expect(poolInfo.totalAlgoStaked).toEqual(BigInt(stakeAmount1.microAlgos + stakeAmount2.microAlgos) - stakerMbr) + const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + consoleLogger.info(`pool stakers:${poolInfo.totalStakers}, staked:${poolInfo.totalAlgoStaked}`) - // What's pool's current balance - const poolBalance = await getPoolAvailBalance(fixture.context, firstPoolKey) - const knownReward = poolBalance - poolInfo.totalAlgoStaked - const expectedValidatorReward = Number(knownReward) * (PctToValidator / 100) + // Perform epoch payout calculation - we also get back how much it cost to issue the txn + const fees = await epochBalanceUpdate(firstPoolClient) + const expectedValidatorReward = (reward.microAlgos * BigInt(PctToValidator)) / 100n - const stakersPriorToReward = await getStakeInfoFromBoxValue(firstPoolClient) + const newValidatorState = await getValidatorState(validatorMasterClient, validatorId) + const newOwnerBalance = await fixture.context.algorand.account.getInformation(validatorOwnerAccount.addr) + // validator owner should have gotten the expected reward (minus the fees they just paid ofc) + expect(newOwnerBalance.balance.microAlgo).toEqual(ownerBalance.balance.microAlgo - fees.microAlgos + expectedValidatorReward) + + // Verify all the stakers in the pool got what we think they should have + const stakersAfterReward = await getStakeInfoFromBoxValue(firstPoolClient) + + await verifyRewardAmounts( + fixture.context, + (reward.microAlgos - expectedValidatorReward) as bigint, + tokenRewardPerPayout, + stakersPriorToReward as StakedInfo[], + stakersAfterReward as StakedInfo[], + 1 as number, + ) + + // the total staked should have grown as well - reward minus what the validator was paid in their commission + expect(newValidatorState.totalAlgoStaked).toEqual(origValidatorState.totalAlgoStaked + reward.microAlgos - expectedValidatorReward) + // await logStakingPoolInfo(fixture.context, firstPoolKey.poolAppId, 'tokenRewardCheck'); + + // the reward tokens 'held' back should've grown by the token payout amount + expect(newValidatorState.rewardTokenHeldBack).toEqual(validatorConfig.rewardPerPayout) + + const poolBalance = await getPoolAvailBalance(fixture.context, firstPoolKey) + expect(poolBalance).toEqual(newValidatorState.totalAlgoStaked) + }) - await incrementRoundNumberBy(fixture.context, 320 + epochRoundLength) + test('extractRewards', async () => { + const origStakerBalance = await fixture.context.algorand.account.getInformation(stakerAccounts[0].addr) - // do reward calcs - await epochBalanceUpdate(firstPoolClient) - const stakersAfterReward = await getStakeInfoFromBoxValue(firstPoolClient) + // Remove it all + const removeFees = await removeStake(firstPoolClient, stakerAccounts[0], AlgoAmount.Algos(1190)) - await logStakingPoolInfo(fixture.context, firstPoolKey.poolAppId, 'after payouts') - await verifyRewardAmounts( - fixture.context, - knownReward - BigInt(expectedValidatorReward), - BigInt(tokenRewardPerPayout), - stakersPriorToReward, - stakersAfterReward, - epochRoundLength, - ) + const newStakerBalance = await fixture.context.algorand.account.getInformation(stakerAccounts[0].addr) + // 1000 algos staked + 190 reward (- .004 in fees for removing stake) + expect(newStakerBalance.balance.microAlgo).toEqual( + origStakerBalance.balance.microAlgo + AlgoAmount.Algos(1190).microAlgos - removeFees, + ) + // verify that reward token payout came to us + const assetInfo = await fixture.context.algorand.asset.getAccountInformation(stakerAccounts[0].addr, rewardTokenId) + expect(assetInfo.balance).toEqual(tokenRewardPerPayout) - // DON'T claim! we want some tokens remaining to be paid out left for following reclaimTokenRewards test - }) + // no one should be left and be 0 balance + const postRemovePoolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(postRemovePoolInfo.totalStakers).toEqual(0n) + expect(postRemovePoolInfo.totalAlgoStaked).toEqual(0n) - test('reclaimTokenRewards', async () => { - // as 'owner' get tokens back from reward pool - but we should only get back what's not held back - // so we verify some are held back and that we receive everything but that. - const pool1Address = getApplicationAddress(firstPoolKey.poolAppId) - const rewardTokenBalance = await fixture.context.algod - .accountAssetInformation(pool1Address, Number(rewardTokenID)) - .do() - - const validatorCurState = await getValidatorState(validatorMasterClient, validatorId) - const tokensHeldBack = validatorCurState.rewardTokenHeldBack - expect(tokensHeldBack).toBeGreaterThan(0n) - - const ownerTokenBalPre = await fixture.context.algod - .accountAssetInformation(tokenCreatorAccount.addr, Number(rewardTokenID)) - .do() - - // should fail - not owner of validator - await expect( - validatorMasterClient.emptyTokenRewards( - { validatorId, receiver: tokenCreatorAccount.addr }, - { sendParams: { fee: AlgoAmount.MicroAlgos(3000), populateAppCallResources: true } }, - ), - ).rejects.toThrowError() - // now get client with our owner as caller - const valAppRef = await validatorMasterClient.appClient.getAppReference() - const validatorClient = new ValidatorRegistryClient( - { - sender: validatorOwnerAccount, - resolveBy: 'id', - id: valAppRef.appId, - }, - fixture.context.algod, - ) + const newValidatorState = await getValidatorState(validatorMasterClient, validatorId) + expect(newValidatorState.totalAlgoStaked).toEqual(0n) + expect(newValidatorState.totalStakers).toEqual(0n) + expect(newValidatorState.rewardTokenHeldBack).toEqual(0n) - const sentAmount = ( - await validatorClient.emptyTokenRewards( - { validatorId, receiver: tokenCreatorAccount.addr }, - { sendParams: { fee: AlgoAmount.MicroAlgos(3000), populateAppCallResources: true } }, - ) - ).return! - expect(sentAmount).toEqual(BigInt(rewardTokenBalance['asset-holding'].amount) - tokensHeldBack) - const ownerTokenBal = await fixture.context.algod - .accountAssetInformation(tokenCreatorAccount.addr, Number(rewardTokenID)) - .do() - expect(ownerTokenBal['asset-holding'].amount).toEqual( - ownerTokenBalPre['asset-holding'].amount + Number(sentAmount), - ) + const poolBalance = await getPoolAvailBalance(fixture.context, firstPoolKey) + expect(poolBalance).toEqual(newValidatorState.totalAlgoStaked) }) -}) -describe('StakeUnstakeAccumTests', () => { - beforeEach(fixture.beforeEach) - beforeEach(logs.beforeEach) - afterEach(logs.afterEach) + test('testPartialReward', async () => { + // Create second (brand new!) staker - with same amount entered - but we'll enter later to the first staker so + // it will be a 'partial' entry into the epoch (so we can ensure partial payout occurs) + const partialEpochStaker = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(5000), + suppressLog: true, + }) + stakerAccounts.push(partialEpochStaker) + // opt-in to reward token + await fixture.algorand.send.assetOptIn({ sender: partialEpochStaker.addr, assetId: rewardTokenId }) + + const params = await fixture.context.algod.getTransactionParams().do() + // add blocks to get to block prior to start of new epoch + await incrementRoundNumberBy(fixture.context, epochRoundLength - 1 - (params.firstRound % epochRoundLength)) + + // double-check no one should be left and be 0 balance + const checkPoolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(checkPoolInfo.totalStakers).toEqual(0n) + expect(checkPoolInfo.totalAlgoStaked).toEqual(0n) + + const checkValidatorState = await getValidatorState(validatorMasterClient, validatorId) + expect(checkValidatorState.totalAlgoStaked).toEqual(0n) + expect(checkValidatorState.totalStakers).toEqual(0n) + + // Ok, re-enter the pool - but we'll be in right off the bat and be there for full epoch + // now stake 1000(+mbr), min for this pool - for the first time - which means actual stake amount will be reduced + // by 'first time staker' fee to cover MBR (which goes to VALIDATOR contract account, not staker contract account!) + // we pay the extra here so the final staked amount should be exactly 1000 + const stakeAmount1 = AlgoAmount.Algos(1000) + // Add stake for first staker - partial epoch + const [aPoolKey] = await addStake(fixture.context, validatorMasterClient, validatorId, stakerAccounts[0], stakeAmount1, 0n) + expect(aPoolKey.poolAppId).toEqual(firstPoolKey.poolAppId) + + const staker1Info = await getStakerInfo(firstPoolClient, stakerAccounts[0]) + const stakingPoolGS = await firstPoolClient.state.global.getAll() + consoleLogger.info(`lastPayout:${stakingPoolGS.lastPayout}, staker1 entry round: ${staker1Info.entryRound}`) + + const stakeAmount2 = AlgoAmount.MicroAlgos(AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(mbrs.addStakerMbr).microAlgos) + + // Add stake for partial-epoch staker + const [newPoolKey] = await addStake(fixture.context, validatorMasterClient, validatorId, partialEpochStaker, stakeAmount2, 0n) + + expect(newPoolKey.poolAppId).toEqual(aPoolKey.poolAppId) + const staker2Info = await getStakerInfo(firstPoolClient, partialEpochStaker) + consoleLogger.info(`partialEpochStaker: new entry round: ${staker2Info.entryRound}`) + + await logStakingPoolInfo(fixture.context, firstPoolKey.poolAppId, 'should have two stakers') + + // ok now do payouts - and see if we can verify the expected totals + const poolInfo = await getPoolInfo(validatorMasterClient, aPoolKey) + expect(poolInfo.totalStakers).toEqual(2n) + // only subtract out 1 staker mbr because only the 'fullEpochStaker' will be 'new' to staking + expect(poolInfo.totalAlgoStaked).toEqual(stakeAmount1.microAlgos + stakeAmount2.microAlgos - mbrs.addStakerMbr) + + // What's pool's current balance + const poolBalance = await getPoolAvailBalance(fixture.context, firstPoolKey) + const knownReward = poolBalance - poolInfo.totalAlgoStaked + const expectedValidatorReward = (knownReward * BigInt(PctToValidator)) / 100n + + const stakersPriorToReward = await getStakeInfoFromBoxValue(firstPoolClient) + + await incrementRoundNumberBy(fixture.context, 320 + epochRoundLength) + + // do reward calcs + await epochBalanceUpdate(firstPoolClient) + const stakersAfterReward = await getStakeInfoFromBoxValue(firstPoolClient) + + await logStakingPoolInfo(fixture.context, firstPoolKey.poolAppId, 'after payouts') + await verifyRewardAmounts( + fixture.context, + knownReward - expectedValidatorReward, + tokenRewardPerPayout, + stakersPriorToReward, + stakersAfterReward, + epochRoundLength, + ) + + // DON'T claim! we want some tokens remaining to be paid out left for following reclaimTokenRewards test + }) + test('reclaimTokenRewards', async () => { + // as 'owner' get tokens back from reward pool - but we should only get back what's not held back + // so we verify some are held back and that we receive everything but that. + const pool1Address = getApplicationAddress(firstPoolKey.poolAppId) + const rewardTokenBalance = await fixture.context.algorand.asset.getAccountInformation(pool1Address, rewardTokenId) + + const validatorCurState = await getValidatorState(validatorMasterClient, validatorId) + const tokensHeldBack = validatorCurState.rewardTokenHeldBack + expect(tokensHeldBack).toBeGreaterThan(0n) + + const ownerTokenBalPre = await fixture.context.algorand.asset.getAccountInformation(tokenCreatorAccount.addr, rewardTokenId) + + // should fail - not owner of validator + await expect( + validatorMasterClient.send.emptyTokenRewards({ + args: { validatorId, receiver: tokenCreatorAccount.addr }, + staticFee: AlgoAmount.MicroAlgos(3000), + populateAppCallResources: true, + }), + ).rejects.toThrowError() + // now get client with our owner as caller + const validatorClient = validatorFactory.getAppClientById({ + appId: validatorMasterClient.appId, + defaultSender: validatorOwnerAccount.addr, + }) + + const sentAmount = ( + await validatorClient.send.emptyTokenRewards({ + args: { validatorId, receiver: tokenCreatorAccount.addr }, + staticFee: AlgoAmount.MicroAlgos(3000), + populateAppCallResources: true, + }) + ).return! + expect(sentAmount).toEqual(rewardTokenBalance.balance - tokensHeldBack) + const ownerTokenBal = await fixture.context.algorand.asset.getAccountInformation(tokenCreatorAccount.addr, rewardTokenId) + expect(ownerTokenBal.balance).toEqual(ownerTokenBalPre.balance + sentAmount) + }) + }) + + describe('StakeUnstakeAccumTests', () => { let validatorId: number let validatorOwnerAccount: Account const stakerAccounts: Account[] = [] @@ -2127,150 +1823,133 @@ describe('StakeUnstakeAccumTests', () => { // add validator and 1 pool for subsequent stake tests beforeAll(async () => { - // Fund a 'validator account' that will be the validator owner. - validatorOwnerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(500), - suppressLog: true, - }) - consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) - - const config = createValidatorConfig({ - owner: validatorOwnerAccount.addr, - manager: validatorOwnerAccount.addr, - minEntryStake: BigInt(AlgoAmount.Algos(1000).microAlgos), - maxAlgoPerPool: BigInt(MaxAlgoPerPool), // this comes into play in later tests !! - percentToValidator: PctToValidator * 10000, - validatorCommissionAddress: validatorOwnerAccount.addr, - epochRoundLength, - }) - validatorId = await addValidator( - fixture.context, - validatorMasterClient, - validatorOwnerAccount, - config, - validatorMbr, - ) - - firstPoolKey = await addStakingPool( - fixture.context, - validatorMasterClient, - validatorId, - 1, - validatorOwnerAccount, - poolMbr, - poolInitMbr, - ) - // should be [validator id, pool id (1 based)] - expect(firstPoolKey.id).toEqual(BigInt(validatorId)) - expect(firstPoolKey.poolId).toEqual(1n) - - firstPoolClient = new StakingPoolClient( - { sender: validatorOwnerAccount, resolveBy: 'id', id: firstPoolKey.poolAppId }, - fixture.context.algod, - ) - - // get the app id via contract call - it should match what we just got back in poolKey[2] - poolAppId = ( - await validatorMasterClient.getPoolAppId( - { validatorId: firstPoolKey.id, poolId: firstPoolKey.poolId }, - { sendParams: { populateAppCallResources: true } }, - ) - ).return! - expect(firstPoolKey.poolAppId).toEqual(poolAppId) - - const stateData = await getValidatorState(validatorMasterClient, validatorId) - expect(stateData.numPools).toEqual(1) - expect(stateData.totalAlgoStaked).toEqual(0n) - expect(stateData.totalStakers).toEqual(0n) - - const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(poolInfo.poolAppId).toEqual(BigInt(poolAppId)) - expect(poolInfo.totalStakers).toEqual(0) - expect(poolInfo.totalAlgoStaked).toEqual(0n) - }) + // Fund a 'validator account' that will be the validator owner. + validatorOwnerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(500), + suppressLog: true, + }) + consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) + + const config = createValidatorConfig({ + owner: validatorOwnerAccount.addr, + manager: validatorOwnerAccount.addr, + minEntryStake: AlgoAmount.Algos(1000).microAlgos, + maxAlgoPerPool: MaxAlgoPerPool, // this comes into play in later tests !! + percentToValidator: BigInt(PctToValidator * 10000), + validatorCommissionAddress: validatorOwnerAccount.addr, + epochRoundLength: BigInt(epochRoundLength), + }) + validatorId = await addValidator(fixture.context, validatorMasterClient, validatorOwnerAccount, config, mbrs.addValidatorMbr) + + firstPoolKey = await addStakingPool( + fixture.context, + validatorMasterClient, + validatorId, + 1, + validatorOwnerAccount, + mbrs.addPoolMbr, + mbrs.poolInitMbr, + ) + // should be [validator id, pool id (1 based)] + expect(firstPoolKey.id).toEqual(BigInt(validatorId)) + expect(firstPoolKey.poolId).toEqual(1n) + + firstPoolClient = stakingPoolFactory.getAppClientById({ appId: firstPoolKey.poolAppId, defaultSender: validatorOwnerAccount.addr }) + + // get the app id via contract call - it should match what we just got back in poolKey[2] + poolAppId = ( + await validatorMasterClient.send.getPoolAppId({ + args: { validatorId: firstPoolKey.id, poolId: firstPoolKey.poolId }, + populateAppCallResources: true, + }) + ).return! + expect(firstPoolKey.poolAppId).toEqual(poolAppId) + + const stateData = await getValidatorState(validatorMasterClient, validatorId) + expect(stateData.numPools).toEqual(1n) + expect(stateData.totalAlgoStaked).toEqual(0n) + expect(stateData.totalStakers).toEqual(0n) + + const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(poolInfo.poolAppId).toEqual(poolAppId) + expect(poolInfo.totalStakers).toEqual(0n) + expect(poolInfo.totalAlgoStaked).toEqual(0n) + }) + + function bigIntFromBytes(bytes: Uint8Array): bigint { + let result = BigInt(0) + bytes.forEach((byte) => { + // eslint-disable-next-line no-bitwise + result = (result << BigInt(8)) | BigInt(byte) + }) + return result + } // Dummy staker - add 3000 algo - and then we'll slowly remove stake to see if we can trigger remove stake bug test('stakeAccumTests', async () => { - // Fund a 'staker account' that will be the new 'staker' - const stakerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(5000), - suppressLog: true, - }) - stakerAccounts.push(stakerAccount) - - const stakeAmount1 = AlgoAmount.MicroAlgos( - AlgoAmount.Algos(2000).microAlgos + AlgoAmount.MicroAlgos(Number(stakerMbr)).microAlgos, - ) - const [stakedPoolKey] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - stakeAmount1, - 0n, - ) - const params = await fixture.context.algod.status().do() - let lastBlock = params['last-round'] - - // should match info from first staking pool - expect(stakedPoolKey.id).toEqual(firstPoolKey.id) - expect(stakedPoolKey.poolId).toEqual(firstPoolKey.poolId) - expect(stakedPoolKey.poolAppId).toEqual(firstPoolKey.poolAppId) - - const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(poolInfo.totalStakers).toEqual(1) - expect(poolInfo.totalAlgoStaked).toEqual(BigInt(stakeAmount1.microAlgos - Number(stakerMbr))) - - expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) - - firstPoolClient = new StakingPoolClient( - { sender: validatorOwnerAccount, resolveBy: 'id', id: firstPoolKey.poolAppId }, - fixture.context.algod, - ) - const AVG_ROUNDS_PER_DAY = 30857 // approx 'daily' rounds for APR bins (60*60*24/2.8) - let poolGS = await firstPoolClient.getGlobalState() - const binRoundStart = poolGS.binRoundStart!.asBigInt() - let roundsRemaining = binRoundStart + BigInt(AVG_ROUNDS_PER_DAY) - BigInt(lastBlock) - consoleLogger.info(`bin start:${binRoundStart}, rounds remaining in bin:${roundsRemaining}`) - const stakeAccum = bigIntFromBytes(poolGS.stakeAccumulator!.asByteArray()) - expect(stakeAccum).toEqual(roundsRemaining * BigInt(stakeAmount1.microAlgos - Number(stakerMbr))) - - // Ok, now add 'more' stake - we're updating existing slot for pool - ensure accumulator is updated - const stakeAmount2 = AlgoAmount.Algos(1000) - await addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmount2, 0n) - lastBlock = (await fixture.context.algod.status().do())['last-round'] - roundsRemaining = binRoundStart + BigInt(AVG_ROUNDS_PER_DAY) - BigInt(lastBlock) - poolGS = await firstPoolClient.getGlobalState() - const secondStakeAccum = bigIntFromBytes(poolGS.stakeAccumulator!.asByteArray()) - expect(secondStakeAccum).toEqual(stakeAccum + BigInt(roundsRemaining) * BigInt(stakeAmount2.microAlgos)) - - // remove bits of stake - await removeStake(firstPoolClient, stakerAccounts[0], AlgoAmount.Algos(50)) - lastBlock = (await fixture.context.algod.status().do())['last-round'] - roundsRemaining = binRoundStart + BigInt(AVG_ROUNDS_PER_DAY) - BigInt(lastBlock) - poolGS = await firstPoolClient.getGlobalState() - const newStakeAccum = bigIntFromBytes(poolGS.stakeAccumulator!.asByteArray()) - expect(newStakeAccum).toEqual( - secondStakeAccum - BigInt(roundsRemaining) * BigInt(AlgoAmount.Algos(50).microAlgos), - ) - - // remove bits of stake - await removeStake(firstPoolClient, stakerAccounts[0], AlgoAmount.Algos(50)) - lastBlock = (await fixture.context.algod.status().do())['last-round'] - roundsRemaining = binRoundStart + BigInt(AVG_ROUNDS_PER_DAY) - BigInt(lastBlock) - poolGS = await firstPoolClient.getGlobalState() - const thirdStakeAccum = bigIntFromBytes(poolGS.stakeAccumulator!.asByteArray()) - expect(thirdStakeAccum).toEqual( - newStakeAccum - BigInt(roundsRemaining) * BigInt(AlgoAmount.Algos(50).microAlgos), - ) - }) -}) - -describe('TokenRewardOnlyTokens', () => { - beforeEach(fixture.beforeEach) - beforeEach(logs.beforeEach) - afterEach(logs.afterEach) - + // Fund a 'staker account' that will be the new 'staker' + const stakerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(5000), + suppressLog: true, + }) + stakerAccounts.push(stakerAccount) + + const stakeAmount1 = AlgoAmount.MicroAlgos(AlgoAmount.Algos(2000).microAlgos + AlgoAmount.MicroAlgos(mbrs.addStakerMbr).microAlgos) + const [stakedPoolKey] = await addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmount1, 0n) + const params = await fixture.context.algod.status().do() + let lastBlock = params['last-round'] + + // should match info from first staking pool + expect(stakedPoolKey.id).toEqual(firstPoolKey.id) + expect(stakedPoolKey.poolId).toEqual(firstPoolKey.poolId) + expect(stakedPoolKey.poolAppId).toEqual(firstPoolKey.poolAppId) + + const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(poolInfo.totalStakers).toEqual(1n) + expect(poolInfo.totalAlgoStaked).toEqual(stakeAmount1.microAlgos - mbrs.addStakerMbr) + + expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) + + firstPoolClient = stakingPoolFactory.getAppClientById({ appId: firstPoolKey.poolAppId, defaultSender: validatorOwnerAccount.addr }) + const AVG_ROUNDS_PER_DAY = 30857 // approx 'daily' rounds for APR bins (60*60*24/2.8) + let poolGS = await firstPoolClient.state.global.getAll() + const x = await firstPoolClient.appClient.getGlobalState() + const y = ABIType.from('uint128').decode((x.stakeAccumulator as any).valueRaw) + const z = bigIntFromBytes((x.stakeAccumulator as any).valueRaw) + const binRoundStart = poolGS.binRoundStart! + let roundsRemaining = binRoundStart + BigInt(AVG_ROUNDS_PER_DAY) - BigInt(lastBlock) + consoleLogger.info(`bin start:${binRoundStart}, rounds remaining in bin:${roundsRemaining}`) + const stakeAccum = poolGS.stakeAccumulator! + expect(stakeAccum).toEqual(roundsRemaining * stakeAmount1.microAlgos - mbrs.addStakerMbr) + + // Ok, now add 'more' stake - we're updating existing slot for pool - ensure accumulator is updated + const stakeAmount2 = AlgoAmount.Algos(1000) + await addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmount2, 0n) + lastBlock = (await fixture.context.algod.status().do())['last-round'] + roundsRemaining = binRoundStart + BigInt(AVG_ROUNDS_PER_DAY) - BigInt(lastBlock) + poolGS = await firstPoolClient.state.global.getAll() + const secondStakeAccum = poolGS.stakeAccumulator! + expect(secondStakeAccum).toEqual(stakeAccum + roundsRemaining * stakeAmount2.microAlgos) + + // remove bits of stake + await removeStake(firstPoolClient, stakerAccounts[0], AlgoAmount.Algos(50)) + lastBlock = (await fixture.context.algod.status().do())['last-round'] + roundsRemaining = binRoundStart + BigInt(AVG_ROUNDS_PER_DAY) - BigInt(lastBlock) + poolGS = await firstPoolClient.state.global.getAll() + const newStakeAccum = poolGS.stakeAccumulator! + expect(newStakeAccum).toEqual(secondStakeAccum - roundsRemaining * AlgoAmount.Algos(50).microAlgos) + + // remove bits of stake + await removeStake(firstPoolClient, stakerAccounts[0], AlgoAmount.Algos(50)) + lastBlock = (await fixture.context.algod.status().do())['last-round'] + roundsRemaining = binRoundStart + BigInt(AVG_ROUNDS_PER_DAY) - BigInt(lastBlock) + poolGS = await firstPoolClient.state.global.getAll() + const thirdStakeAccum = poolGS.stakeAccumulator! + expect(thirdStakeAccum).toEqual(newStakeAccum - roundsRemaining * AlgoAmount.Algos(50).microAlgos) + }) + }) + + describe('TokenRewardOnlyTokens', () => { let validatorId: number let validatorOwnerAccount: Account let validatorConfig: ValidatorConfig @@ -2278,171 +1957,144 @@ describe('TokenRewardOnlyTokens', () => { let firstPoolClient: StakingPoolClient let stakerAccount: Account - let rewardTokenID: bigint + let rewardTokenId: bigint const tokenRewardPerPayout = 1000n beforeAll(async () => { - // Create a reward token to pay out to stakers - const tokenCreatorAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(5000), - suppressLog: true, - }) - rewardTokenID = await createAsset( - fixture.context.algod, - tokenCreatorAccount, - 'Reward Token', - 'RWDTOKEN', - 100_000, - 0, - ) - - validatorOwnerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(500), - suppressLog: true, - }) - consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) - - validatorConfig = createValidatorConfig({ - owner: validatorOwnerAccount.addr, - manager: validatorOwnerAccount.addr, - minEntryStake: BigInt(AlgoAmount.Algos(1000).microAlgos), - maxAlgoPerPool: BigInt(MaxAlgoPerPool), // this comes into play in later tests !! - percentToValidator: 5 * 10000, - validatorCommissionAddress: validatorOwnerAccount.addr, - rewardTokenID, - rewardPerPayout: tokenRewardPerPayout, // 1000 tokens per epoch - }) - validatorId = await addValidator( - fixture.context, - validatorMasterClient, - validatorOwnerAccount, - validatorConfig, - validatorMbr, - ) - - // Add new pool - then we'll add stake and verify balances. - // first pool needs extra .1 to cover MBR of opted-in reward token ! - firstPoolKey = await addStakingPool( - fixture.context, - validatorMasterClient, - validatorId, - 1, - validatorOwnerAccount, - poolMbr, - poolInitMbr + BigInt(AlgoAmount.Algos(0.1).microAlgos), - ) - // should be [validator id, pool id (1 based)] - expect(firstPoolKey.id).toEqual(BigInt(validatorId)) - expect(firstPoolKey.poolId).toEqual(1n) - - await transferAsset( - { - from: tokenCreatorAccount, - to: getApplicationAddress(firstPoolKey.poolAppId), - assetId: Number(rewardTokenID), - amount: 5000, - }, - fixture.context.algod, - ) - - firstPoolClient = new StakingPoolClient( - { sender: validatorOwnerAccount, resolveBy: 'id', id: firstPoolKey.poolAppId }, - fixture.context.algod, - ) + // Create a reward token to pay out to stakers + const tokenCreatorAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(5000), + suppressLog: true, + }) + rewardTokenId = await createAsset(fixture.context, tokenCreatorAccount, 'Reward Token', 'RWDTOKEN', 100_000, 0) + + validatorOwnerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(500), + suppressLog: true, + }) + consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) + + validatorConfig = createValidatorConfig({ + owner: validatorOwnerAccount.addr, + manager: validatorOwnerAccount.addr, + minEntryStake: AlgoAmount.Algos(1000).microAlgos, + maxAlgoPerPool: MaxAlgoPerPool, // this comes into play in later tests !! + percentToValidator: BigInt(5 * 10000), + validatorCommissionAddress: validatorOwnerAccount.addr, + rewardTokenId, + rewardPerPayout: tokenRewardPerPayout, // 1000 tokens per epoch + }) + validatorId = await addValidator(fixture.context, validatorMasterClient, validatorOwnerAccount, validatorConfig, mbrs.addValidatorMbr) + + // Add new pool - then we'll add stake and verify balances. + // first pool needs extra .1 to cover MBR of opted-in reward token ! + firstPoolKey = await addStakingPool( + fixture.context, + validatorMasterClient, + validatorId, + 1, + validatorOwnerAccount, + mbrs.addPoolMbr, + mbrs.poolInitMbr + AlgoAmount.Algos(0.1).microAlgos, + ) + // should be [validator id, pool id (1 based)] + expect(firstPoolKey.id).toEqual(BigInt(validatorId)) + expect(firstPoolKey.poolId).toEqual(1n) + + await fixture.algorand.send.assetTransfer({ + sender: tokenCreatorAccount.addr, + receiver: getApplicationAddress(firstPoolKey.poolAppId), + assetId: rewardTokenId, + amount: BigInt(5000), + }) + + firstPoolClient = stakingPoolFactory.getAppClientById({ appId: firstPoolKey.poolAppId, defaultSender: validatorOwnerAccount.addr }) }) // Creates dummy staker: // adds 1000 algo (plus enough to cover staker mbr) test('firstStaker', async () => { - // Fund a 'staker account' that will be the new 'staker' - stakerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(5000), - suppressLog: true, - }) - // opt-in to reward token - await assetOptIn({ account: stakerAccount, assetId: Number(rewardTokenID) }, fixture.context.algod) - - // now stake 1000(+mbr), min for this pool - for the first time - which means actual stake amount will be reduced - // by 'first time staker' fee to cover MBR (which goes to VALIDATOR contract account, not staker contract account!) - // we pay the extra here so the final staked amount should be exactly 1000 - const stakeAmount1 = AlgoAmount.MicroAlgos( - AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(Number(stakerMbr)).microAlgos, - ) - await addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmount1, 0n) - const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(poolInfo.totalAlgoStaked).toEqual(BigInt(stakeAmount1.microAlgos - Number(stakerMbr))) - expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) + // Fund a 'staker account' that will be the new 'staker' + stakerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(5000), + suppressLog: true, + }) + // opt-in to reward token + await fixture.algorand.send.assetOptIn({ sender: stakerAccount.addr, assetId: rewardTokenId }) + + // now stake 1000(+mbr), min for this pool - for the first time - which means actual stake amount will be reduced + // by 'first time staker' fee to cover MBR (which goes to VALIDATOR contract account, not staker contract account!) + // we pay the extra here so the final staked amount should be exactly 1000 + const stakeAmount1 = AlgoAmount.MicroAlgos(AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(mbrs.addStakerMbr).microAlgos) + await addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmount1, 0n) + const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(poolInfo.totalAlgoStaked).toEqual(stakeAmount1.microAlgos - mbrs.addStakerMbr) + expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) }) test('testFirstRewards', async () => { - await incrementRoundNumberBy(fixture.context, 322) + await incrementRoundNumberBy(fixture.context, 322) - const origValidatorState = await getValidatorState(validatorMasterClient, validatorId) - const ownerBalance = await fixture.context.algod.accountInformation(validatorOwnerAccount.addr).do() - const stakersPriorToReward = await getStakeInfoFromBoxValue(firstPoolClient) + const origValidatorState = await getValidatorState(validatorMasterClient, validatorId) + const ownerBalance = await fixture.context.algorand.account.getInformation(validatorOwnerAccount.addr) + const stakersPriorToReward = await getStakeInfoFromBoxValue(firstPoolClient) - // Perform epoch payout calculation - should be 0 algo reward (!) - // we should just do token payout - const fees = await epochBalanceUpdate(firstPoolClient) + // Perform epoch payout calculation - should be 0 algo reward (!) + // we should just do token payout + const fees = await epochBalanceUpdate(firstPoolClient) - const newValidatorState = await getValidatorState(validatorMasterClient, validatorId) - const newOwnerBalance = await fixture.context.algod.accountInformation(validatorOwnerAccount.addr).do() - // validator owner balance shouldn't have changed (other than fees to call epoch update) - expect(newOwnerBalance.amount).toEqual(ownerBalance.amount - fees.microAlgos) + const newValidatorState = await getValidatorState(validatorMasterClient, validatorId) + const newOwnerBalance = await fixture.context.algorand.account.getInformation(validatorOwnerAccount.addr) + // validator owner balance shouldn't have changed (other than fees to call epoch update) + expect(newOwnerBalance.balance.microAlgo).toEqual(ownerBalance.balance.microAlgo - fees.microAlgos) - // Verify all the stakers in the pool got what we think they should have - const stakersAfterReward = await getStakeInfoFromBoxValue(firstPoolClient) + // Verify all the stakers in the pool got what we think they should have + const stakersAfterReward = await getStakeInfoFromBoxValue(firstPoolClient) - await verifyRewardAmounts( - fixture.context, - 0n, // 0 algo reward - BigInt(tokenRewardPerPayout), - stakersPriorToReward as StakedInfo[], - stakersAfterReward as StakedInfo[], - 1 as number, - ) + await verifyRewardAmounts( + fixture.context, + 0n, // 0 algo reward + tokenRewardPerPayout, + stakersPriorToReward as StakedInfo[], + stakersAfterReward as StakedInfo[], + 1 as number, + ) - // the total staked should have grown as well - reward minus what the validator was paid in their commission - expect(newValidatorState.totalAlgoStaked).toEqual(origValidatorState.totalAlgoStaked) + // the total staked should have grown as well - reward minus what the validator was paid in their commission + expect(newValidatorState.totalAlgoStaked).toEqual(origValidatorState.totalAlgoStaked) - // the reward tokens 'held' back should've grown by the token payout amount - expect(newValidatorState.rewardTokenHeldBack).toEqual(BigInt(validatorConfig.rewardPerPayout)) + // the reward tokens 'held' back should've grown by the token payout amount + expect(newValidatorState.rewardTokenHeldBack).toEqual(validatorConfig.rewardPerPayout) - const poolBalance = await getPoolAvailBalance(fixture.context, firstPoolKey) - expect(poolBalance).toEqual(newValidatorState.totalAlgoStaked) + const poolBalance = await getPoolAvailBalance(fixture.context, firstPoolKey) + expect(poolBalance).toEqual(newValidatorState.totalAlgoStaked) }) test('extractRewards', async () => { - const origStakerBalance = await fixture.context.algod.accountInformation(stakerAccount.addr).do() + const origStakerBalance = await fixture.context.algorand.account.getInformation(stakerAccount.addr) - // Remove it all - but w/ claimTokens call instead of removeStake - const removeFees = await claimTokens(firstPoolClient, stakerAccount) + // Remove it all - but w/ claimTokens call instead of removeStake + const removeFees = await claimTokens(firstPoolClient, stakerAccount) - const newStakerBalance = await fixture.context.algod.accountInformation(stakerAccount.addr).do() - // 1000 algos staked + 190 reward (- .004 in fees for removing stake) - expect(newStakerBalance.amount).toEqual(origStakerBalance.amount - removeFees) - // verify that reward token payout came to us - const assetInfo = await fixture.context.algod - .accountAssetInformation(stakerAccount.addr, Number(rewardTokenID)) - .do() - expect(BigInt(assetInfo['asset-holding'].amount)).toEqual(tokenRewardPerPayout) + const newStakerBalance = await fixture.context.algorand.account.getInformation(stakerAccount.addr) + // 1000 algos staked + 190 reward (- .004 in fees for removing stake) + expect(newStakerBalance.balance.microAlgo).toEqual(origStakerBalance.balance.microAlgo - removeFees) + // verify that reward token payout came to us + const assetInfo = await fixture.context.algorand.asset.getAccountInformation(stakerAccount.addr, rewardTokenId) + expect(assetInfo.balance).toEqual(tokenRewardPerPayout) - const newValidatorState = await getValidatorState(validatorMasterClient, validatorId) - // total staked should be same -staker shouldn't have gone away - token held back should've gone to 0 - expect(newValidatorState.totalAlgoStaked).toEqual(BigInt(AlgoAmount.Algos(1000).microAlgos)) - expect(newValidatorState.totalStakers).toEqual(1n) - expect(newValidatorState.rewardTokenHeldBack).toEqual(0n) + const newValidatorState = await getValidatorState(validatorMasterClient, validatorId) + // total staked should be same -staker shouldn't have gone away - token held back should've gone to 0 + expect(newValidatorState.totalAlgoStaked).toEqual(AlgoAmount.Algos(1000).microAlgos) + expect(newValidatorState.totalStakers).toEqual(1n) + expect(newValidatorState.rewardTokenHeldBack).toEqual(0n) - const poolBalance = await getPoolAvailBalance(fixture.context, firstPoolKey) - expect(poolBalance).toEqual(newValidatorState.totalAlgoStaked) + const poolBalance = await getPoolAvailBalance(fixture.context, firstPoolKey) + expect(poolBalance).toEqual(newValidatorState.totalAlgoStaked) }) -}) - -describe('DoublePoolWTokens', () => { - beforeEach(fixture.beforeEach) - beforeEach(logs.beforeEach) - afterEach(logs.afterEach) + }) + describe('DoublePoolWTokens', () => { let validatorId: number let validatorOwnerAccount: Account let validatorConfig: ValidatorConfig @@ -2451,489 +2103,212 @@ describe('DoublePoolWTokens', () => { const poolKeys: ValidatorPoolKey[] = [] const poolClients: StakingPoolClient[] = [] - let rewardTokenID: bigint + let rewardTokenId: bigint const PctToValidator = 5 const decimals = 0 const tokenRewardPerPayout = BigInt(1000 * 10 ** decimals) // add validator and 1 pool for subsequent stake tests beforeAll(async () => { - // Create a reward token to pay out to stakers - const tokenCreatorAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(5000), - suppressLog: true, - }) - rewardTokenID = await createAsset( - fixture.context.algod, - tokenCreatorAccount, - 'Reward Token', - 'RWDTOKEN', - 100_000, - decimals, - ) - - // Fund a 'validator account' that will be the validator owner. - validatorOwnerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(500), - suppressLog: true, - }) - consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) - - validatorConfig = createValidatorConfig({ - owner: validatorOwnerAccount.addr, - manager: validatorOwnerAccount.addr, - minEntryStake: BigInt(AlgoAmount.Algos(1000).microAlgos), - maxAlgoPerPool: BigInt(AlgoAmount.Algos(5_000).microAlgos), // just do 5k per pool - percentToValidator: PctToValidator * 10000, - validatorCommissionAddress: validatorOwnerAccount.addr, - rewardTokenID, - rewardPerPayout: tokenRewardPerPayout, // 1000 tokens per epoch - }) - validatorId = await addValidator( - fixture.context, - validatorMasterClient, - validatorOwnerAccount, - validatorConfig, - validatorMbr, - ) - - // Add new pool - then we'll add stake and verify balances. - // first pool needs extra .1 to cover MBR of opted-in reward token ! - poolKeys.push( - await addStakingPool( - fixture.context, - validatorMasterClient, - validatorId, - 1, - validatorOwnerAccount, - poolMbr, - poolInitMbr + BigInt(AlgoAmount.Algos(0.1).microAlgos), - ), - ) - // should be [validator id, pool id (1 based)] - expect(poolKeys[0].id).toEqual(BigInt(validatorId)) - expect(poolKeys[0].poolId).toEqual(1n) - - // now send a bunch of our reward token to the pool ! - await transferAsset( - { - from: tokenCreatorAccount, - to: getApplicationAddress(poolKeys[0].poolAppId), - assetId: Number(rewardTokenID), - amount: 5000 * 10 ** decimals, - }, - fixture.context.algod, - ) - - poolClients.push( - new StakingPoolClient( - { sender: validatorOwnerAccount, resolveBy: 'id', id: poolKeys[0].poolAppId }, - fixture.context.algod, - ), - ) - - // get the app id via contract call - it should match what we just got back in the poolKey - poolAppId = ( - await validatorMasterClient.getPoolAppId( - { validatorId: poolKeys[0].id, poolId: poolKeys[0].poolId }, - { sendParams: { populateAppCallResources: true } }, - ) - ).return! - expect(poolKeys[0].poolAppId).toEqual(poolAppId) - - const stateData = await getValidatorState(validatorMasterClient, validatorId) - expect(stateData.numPools).toEqual(1) - expect(stateData.totalAlgoStaked).toEqual(0n) - expect(stateData.totalStakers).toEqual(0n) - expect(stateData.rewardTokenHeldBack).toEqual(0n) - - const poolInfo = await getPoolInfo(validatorMasterClient, poolKeys[0]) - expect(poolInfo.poolAppId).toEqual(BigInt(poolAppId)) - expect(poolInfo.totalStakers).toEqual(0) - expect(poolInfo.totalAlgoStaked).toEqual(0n) - - // ok - all in working order. add second pool as well - no need to do - poolKeys.push( - await addStakingPool( - fixture.context, - validatorMasterClient, - validatorId, - 1, - validatorOwnerAccount, - poolMbr, - poolInitMbr, // no extra .1 for pool 2 ! - ), - ) - expect(poolKeys[1].poolId).toEqual(BigInt(2)) - poolClients.push( - new StakingPoolClient( - { sender: validatorOwnerAccount, resolveBy: 'id', id: poolKeys[1].poolAppId }, - fixture.context.algod, - ), - ) + // Create a reward token to pay out to stakers + const tokenCreatorAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(5000), + suppressLog: true, + }) + rewardTokenId = await createAsset(fixture.context, tokenCreatorAccount, 'Reward Token', 'RWDTOKEN', 100_000, decimals) + + // Fund a 'validator account' that will be the validator owner. + validatorOwnerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(500), + suppressLog: true, + }) + consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) + + validatorConfig = createValidatorConfig({ + owner: validatorOwnerAccount.addr, + manager: validatorOwnerAccount.addr, + minEntryStake: AlgoAmount.Algos(1000).microAlgos, + maxAlgoPerPool: AlgoAmount.Algos(5_000).microAlgos, // just do 5k per pool + percentToValidator: BigInt(PctToValidator * 10000), + validatorCommissionAddress: validatorOwnerAccount.addr, + rewardTokenId, + rewardPerPayout: tokenRewardPerPayout, // 1000 tokens per epoch + }) + validatorId = await addValidator(fixture.context, validatorMasterClient, validatorOwnerAccount, validatorConfig, mbrs.addValidatorMbr) + + // Add new pool - then we'll add stake and verify balances. + // first pool needs extra .1 to cover MBR of opted-in reward token ! + poolKeys.push( + await addStakingPool( + fixture.context, + validatorMasterClient, + validatorId, + 1, + validatorOwnerAccount, + mbrs.addPoolMbr, + mbrs.poolInitMbr + AlgoAmount.Algos(0.1).microAlgos, + ), + ) + // should be [validator id, pool id (1 based)] + expect(poolKeys[0].id).toEqual(BigInt(validatorId)) + expect(poolKeys[0].poolId).toEqual(1n) + + // now send a bunch of our reward token to the pool ! + await fixture.algorand.send.assetTransfer({ + sender: tokenCreatorAccount.addr, + receiver: getApplicationAddress(poolKeys[0].poolAppId), + assetId: rewardTokenId, + amount: BigInt(5000 * 10 ** decimals), + }) + + poolClients.push(stakingPoolFactory.getAppClientById({ appId: poolKeys[0].poolAppId, defaultSender: validatorOwnerAccount.addr })) + + // get the app id via contract call - it should match what we just got back in the poolKey + poolAppId = ( + await validatorMasterClient.send.getPoolAppId({ + args: { validatorId: poolKeys[0].id, poolId: poolKeys[0].poolId }, + populateAppCallResources: true, + }) + ).return! + expect(poolKeys[0].poolAppId).toEqual(poolAppId) + + const stateData = await getValidatorState(validatorMasterClient, validatorId) + expect(stateData.numPools).toEqual(1n) + expect(stateData.totalAlgoStaked).toEqual(0n) + expect(stateData.totalStakers).toEqual(0n) + expect(stateData.rewardTokenHeldBack).toEqual(0n) + + const poolInfo = await getPoolInfo(validatorMasterClient, poolKeys[0]) + expect(poolInfo.poolAppId).toEqual(poolAppId) + expect(poolInfo.totalStakers).toEqual(0n) + expect(poolInfo.totalAlgoStaked).toEqual(0n) + + // ok - all in working order. add second pool as well - no need to do + poolKeys.push( + await addStakingPool( + fixture.context, + validatorMasterClient, + validatorId, + 1, + validatorOwnerAccount, + mbrs.addPoolMbr, + mbrs.poolInitMbr, // no extra .1 for pool 2 ! + ), + ) + expect(poolKeys[1].poolId).toEqual(2n) + poolClients.push(stakingPoolFactory.getAppClientById({ appId: poolKeys[1].poolAppId, defaultSender: validatorOwnerAccount.addr })) }) // add 2 stakers - full pool amount each test('addStakers', async () => { - for (let i = 0; i < 2; i += 1) { - const stakerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(6000), - suppressLog: true, - }) - stakerAccounts.push(stakerAccount) - // opt-in to reward token - await assetOptIn({ account: stakerAccount, assetId: Number(rewardTokenID) }, fixture.context.algod) - - const stakeAmount = AlgoAmount.MicroAlgos( - AlgoAmount.Algos(5000).microAlgos + AlgoAmount.MicroAlgos(Number(stakerMbr)).microAlgos, - ) - const [stakedPoolKey] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - stakeAmount, - 0n, - ) - // each staker should land in diff pool because we're maxing the pool - expect(stakedPoolKey.id).toEqual(poolKeys[i].id) - expect(stakedPoolKey.poolId).toEqual(poolKeys[i].poolId) - expect(stakedPoolKey.poolAppId).toEqual(poolKeys[i].poolAppId) - - const poolInfo = await getPoolInfo(validatorMasterClient, poolKeys[i]) - expect(poolInfo.totalStakers).toEqual(1) - expect(poolInfo.totalAlgoStaked).toEqual(BigInt(stakeAmount.microAlgos - Number(stakerMbr))) - } + for (let i = 0; i < 2; i += 1) { + const stakerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(6000), + suppressLog: true, + }) + stakerAccounts.push(stakerAccount) + // opt-in to reward token + await fixture.algorand.send.assetOptIn({ sender: stakerAccount.addr, assetId: rewardTokenId }) - expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(BigInt(2)) - expect((await getValidatorState(validatorMasterClient, validatorId)).totalAlgoStaked).toEqual( - BigInt(AlgoAmount.Algos(10000).microAlgos), - ) - }) + const stakeAmount = AlgoAmount.MicroAlgos(AlgoAmount.Algos(5000).microAlgos + AlgoAmount.MicroAlgos(mbrs.addStakerMbr).microAlgos) + const [stakedPoolKey] = await addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmount, 0n) + // each staker should land in diff pool because we're maxing the pool + expect(stakedPoolKey.id).toEqual(poolKeys[i].id) + expect(stakedPoolKey.poolId).toEqual(poolKeys[i].poolId) + expect(stakedPoolKey.poolAppId).toEqual(poolKeys[i].poolAppId) - test('testFirstRewards', async () => { - await incrementRoundNumberBy(fixture.context, 322) - - let cumTokRewards = 0n - for (let poolIdx = 0; poolIdx < 2; poolIdx += 1) { - consoleLogger.info(`testing rewards payout for pool # ${poolIdx + 1}`) - const origValidatorState = await getValidatorState(validatorMasterClient, validatorId) - const ownerBalance = await fixture.context.algod.accountInformation(validatorOwnerAccount.addr).do() - const stakersPriorToReward = await getStakeInfoFromBoxValue(poolClients[poolIdx]) - const reward = AlgoAmount.Algos(200) - // put some test 'reward' algos into each staking pool - await transferAlgos( - { - from: fixture.context.testAccount, - to: getApplicationAddress(poolKeys[poolIdx].poolAppId), - amount: reward, - }, - fixture.context.algod, - ) - // Perform epoch payout calculation - we also get back how much it cost to issue the txn - const fees = await epochBalanceUpdate(poolClients[poolIdx]) - const expectedValidatorReward = reward.microAlgos * (PctToValidator / 100) - const newValidatorState = await getValidatorState(validatorMasterClient, validatorId) - const newOwnerBalance = await fixture.context.algod.accountInformation(validatorOwnerAccount.addr).do() - // validator owner should have gotten the expected reward (minus the fees they just paid ofc) - expect(newOwnerBalance.amount).toEqual(ownerBalance.amount - fees.microAlgos + expectedValidatorReward) - - // Verify all the stakers in the pool got what we think they should have - const stakersAfterReward = await getStakeInfoFromBoxValue(poolClients[poolIdx]) - - const payoutRatio = await getTokenPayoutRatio(validatorMasterClient, validatorId) - const tokenRewardForThisPool = - (BigInt(tokenRewardPerPayout) * payoutRatio.PoolPctOfWhole[poolIdx]) / BigInt(1_000_000) - cumTokRewards += tokenRewardForThisPool - - await verifyRewardAmounts( - fixture.context, - (BigInt(reward.microAlgos) - BigInt(expectedValidatorReward)) as bigint, - tokenRewardForThisPool, // we split evenly into 2 pools - so token reward should be as well - stakersPriorToReward as StakedInfo[], - stakersAfterReward as StakedInfo[], - 1 as number, - ) - - // the total staked should have grown as well - reward minus what the validator was paid in their commission - expect(Number(newValidatorState.totalAlgoStaked)).toEqual( - Number(origValidatorState.totalAlgoStaked) + (reward.microAlgos - expectedValidatorReward), - ) - - // the reward tokens 'held' back should've grown by the token payout amount for this pool - expect(newValidatorState.rewardTokenHeldBack).toEqual(cumTokRewards) - } - }) + const poolInfo = await getPoolInfo(validatorMasterClient, poolKeys[i]) + expect(poolInfo.totalStakers).toEqual(1n) + expect(poolInfo.totalAlgoStaked).toEqual(stakeAmount.microAlgos - mbrs.addStakerMbr) + } - test('extractRewards', async () => { - for (let i = 0; i < 2; i += 1) { - const origPoolInfo = await getPoolInfo(validatorMasterClient, poolKeys[i]) - const origValidatorState = await getValidatorState(validatorMasterClient, validatorId) - const stakerInfo = await getStakerInfo(poolClients[i], stakerAccounts[i]) - const origStakerBalance = await fixture.context.algod.accountInformation(stakerAccounts[i].addr).do() - const origStakerAssetBalance = await fixture.context.algod - .accountAssetInformation(stakerAccounts[i].addr, Number(rewardTokenID)) - .do() - - // Remove all stake - await removeStake(poolClients[i], stakerAccounts[i], AlgoAmount.Algos(0)) - const removeFees = AlgoAmount.MicroAlgos(7000).microAlgos - - const newStakerBalance = await fixture.context.algod.accountInformation(stakerAccounts[i].addr).do() - - expect(BigInt(newStakerBalance.amount)).toEqual( - BigInt(origStakerBalance.amount) + stakerInfo.balance - BigInt(removeFees), - ) - // verify that pending reward token payout came to us - const newStakerAssetBalance = await fixture.context.algod - .accountAssetInformation(stakerAccounts[i].addr, Number(rewardTokenID)) - .do() - expect(BigInt(newStakerAssetBalance['asset-holding'].amount)).toEqual( - BigInt(origStakerAssetBalance['asset-holding'].amount) + stakerInfo.rewardTokenBalance, - ) - - // no one should be left and be 0 balance - const postRemovePoolInfo = await getPoolInfo(validatorMasterClient, poolKeys[i]) - expect(postRemovePoolInfo.totalStakers).toEqual(origPoolInfo.totalStakers - 1) - expect(postRemovePoolInfo.totalAlgoStaked).toEqual( - BigInt(origPoolInfo.totalAlgoStaked - stakerInfo.balance), - ) - - const newValidatorState = await getValidatorState(validatorMasterClient, validatorId) - expect(newValidatorState.totalAlgoStaked).toEqual(origValidatorState.totalAlgoStaked - stakerInfo.balance) - expect(newValidatorState.totalStakers).toEqual(origValidatorState.totalStakers - 1n) - expect(newValidatorState.rewardTokenHeldBack).toEqual( - BigInt(origValidatorState.rewardTokenHeldBack - stakerInfo.rewardTokenBalance), - ) - } + expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(2n) + expect((await getValidatorState(validatorMasterClient, validatorId)).totalAlgoStaked).toEqual(AlgoAmount.Algos(10000).microAlgos) }) -}) -describe('TokenGatingByCreator', () => { - beforeEach(fixture.beforeEach) - beforeEach(logs.beforeEach) - afterEach(logs.afterEach) + test('testFirstRewards', async () => { + await incrementRoundNumberBy(fixture.context, 322) - let validatorId: number + let cumTokRewards = 0n + for (let poolIdx = 0; poolIdx < 2; poolIdx += 1) { + consoleLogger.info(`testing rewards payout for pool # ${poolIdx + 1}`) + const origValidatorState = await getValidatorState(validatorMasterClient, validatorId) + const ownerBalance = await fixture.context.algorand.account.getInformation(validatorOwnerAccount.addr) + const stakersPriorToReward = await getStakeInfoFromBoxValue(poolClients[poolIdx]) + const reward = AlgoAmount.Algos(200) + // put some test 'reward' algos into each staking pool + await fixture.algorand.send.payment({ + sender: fixture.context.testAccount.addr, + receiver: getApplicationAddress(poolKeys[poolIdx].poolAppId), + amount: reward, + }) + // Perform epoch payout calculation - we also get back how much it cost to issue the txn + const fees = await epochBalanceUpdate(poolClients[poolIdx]) + const expectedValidatorReward = (reward.microAlgos * BigInt(PctToValidator)) / 100n + const newValidatorState = await getValidatorState(validatorMasterClient, validatorId) + const newOwnerBalance = await fixture.context.algorand.account.getInformation(validatorOwnerAccount.addr) + // validator owner should have gotten the expected reward (minus the fees they just paid ofc) + expect(newOwnerBalance.balance.microAlgo).toEqual(ownerBalance.balance.microAlgo - fees.microAlgos + expectedValidatorReward) - let tokenCreatorAccount: Account - let validatorOwnerAccount: Account - let validatorConfig: ValidatorConfig - let firstPoolKey: ValidatorPoolKey + // Verify all the stakers in the pool got what we think they should have + const stakersAfterReward = await getStakeInfoFromBoxValue(poolClients[poolIdx]) - let gatingToken1Id: bigint - let gatingToken2Id: bigint + const payoutRatio = await getTokenPayoutRatio(validatorMasterClient, validatorId) + const tokenRewardForThisPool = (tokenRewardPerPayout * payoutRatio.poolPctOfWhole[poolIdx]) / 1_000_000n + cumTokRewards += tokenRewardForThisPool - // add validator and 1 pool for subsequent stake tests - beforeAll(async () => { - // Create a token that will be required for stakers to possess in order to stake - tokenCreatorAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(5000), - suppressLog: true, - }) - gatingToken1Id = await createAsset( - fixture.context.algod, - tokenCreatorAccount, - 'Gating Token 1', - 'GATETK1', - 10, - 0, - ) - gatingToken2Id = await createAsset( - fixture.context.algod, - tokenCreatorAccount, - 'Gating Token 2', - 'GATETK2', - 10, - 0, + await verifyRewardAmounts( + fixture.context, + reward.microAlgos - expectedValidatorReward, + tokenRewardForThisPool, // we split evenly into 2 pools - so token reward should be as well + stakersPriorToReward as StakedInfo[], + stakersAfterReward as StakedInfo[], + 1 as number, ) - // Fund a 'validator account' that will be the validator owner. - validatorOwnerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(500), - suppressLog: true, - }) - consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) - - validatorConfig = createValidatorConfig({ - owner: validatorOwnerAccount.addr, - manager: validatorOwnerAccount.addr, - minEntryStake: BigInt(AlgoAmount.Algos(1000).microAlgos), - maxAlgoPerPool: BigInt(MaxAlgoPerPool), // this comes into play in later tests !! - percentToValidator: 5 * 10000, - validatorCommissionAddress: validatorOwnerAccount.addr, - // stakers must possess any token created by tokenCreatorAccount - entryGatingType: GATING_TYPE_ASSETS_CREATED_BY, - entryGatingAddress: tokenCreatorAccount.addr, - gatingAssetMinBalance: 2n, // require 2 so we can see if only having 1 fails us - }) - validatorId = await addValidator( - fixture.context, - validatorMasterClient, - validatorOwnerAccount, - validatorConfig, - validatorMbr, + // the total staked should have grown as well - reward minus what the validator was paid in their commission + expect(newValidatorState.totalAlgoStaked).toEqual( + origValidatorState.totalAlgoStaked + (reward.microAlgos - expectedValidatorReward), ) - firstPoolKey = await addStakingPool( - fixture.context, - validatorMasterClient, - validatorId, - 1, - validatorOwnerAccount, - poolMbr, - poolInitMbr, - ) + // the reward tokens 'held' back should've grown by the token payout amount for this pool + expect(newValidatorState.rewardTokenHeldBack).toEqual(cumTokRewards) + } }) - describe('stakeTest', () => { - beforeEach(fixture.beforeEach) - beforeEach(logs.beforeEach) - afterEach(logs.afterEach) - - let stakerAccount: Account - let stakerCreatedTokenId: bigint - beforeAll(async () => { - // Fund a 'staker account' that will be the new 'staker' - stakerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(5000), - suppressLog: true, - }) - - await assetOptIn({ account: stakerAccount, assetId: Number(gatingToken1Id) }, fixture.context.algod) - await assetOptIn({ account: stakerAccount, assetId: Number(gatingToken2Id) }, fixture.context.algod) - // Send gating tokens to our staker for use in tests - await transferAsset( - { - from: tokenCreatorAccount, - to: stakerAccount, - assetId: Number(gatingToken1Id), - amount: 2, - }, - fixture.context.algod, - ) - await transferAsset( - { - from: tokenCreatorAccount, - to: stakerAccount, - assetId: Number(gatingToken2Id), - amount: 2, - }, - fixture.context.algod, - ) - - stakerCreatedTokenId = await createAsset( - fixture.context.algod, - stakerAccount, - 'Dummy Token', - 'DUMMY', - 10, - 0, - ) - }) - - test('stakeNoTokenOffered', async () => { - const stakeAmount1 = AlgoAmount.MicroAlgos( - AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(Number(stakerMbr)).microAlgos, - ) - await expect( - addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmount1, 0n), - ).rejects.toThrowError() - }) + test('extractRewards', async () => { + for (let i = 0; i < 2; i += 1) { + const origPoolInfo = await getPoolInfo(validatorMasterClient, poolKeys[i]) + const origValidatorState = await getValidatorState(validatorMasterClient, validatorId) + const stakerInfo = await getStakerInfo(poolClients[i], stakerAccounts[i]) + const origStakerBalance = await fixture.context.algorand.account.getInformation(stakerAccounts[i].addr) + const origStakerAssetBalance = await fixture.context.algorand.asset.getAccountInformation(stakerAccounts[i].addr, rewardTokenId) - test('stakeWrongTokenOffered', async () => { - const stakeAmount1 = AlgoAmount.MicroAlgos( - AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(Number(stakerMbr)).microAlgos, - ) - await expect( - addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - stakeAmount1, - stakerCreatedTokenId, - ), - ).rejects.toThrowError() - }) + // Remove all stake + await removeStake(poolClients[i], stakerAccounts[i], AlgoAmount.Algos(0)) + const removeFees = AlgoAmount.MicroAlgos(7000).microAlgos - test('stakeWGatingToken1', async () => { - const stakeAmount1 = AlgoAmount.MicroAlgos( - AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(Number(stakerMbr)).microAlgos, - ) - const [stakedPoolKey] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - stakeAmount1, - gatingToken1Id, - ) - // should match info from first staking pool - expect(stakedPoolKey.id).toEqual(firstPoolKey.id) - expect(stakedPoolKey.poolId).toEqual(firstPoolKey.poolId) - expect(stakedPoolKey.poolAppId).toEqual(firstPoolKey.poolAppId) - - const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(poolInfo.totalStakers).toEqual(1) - expect(poolInfo.totalAlgoStaked).toEqual(BigInt(stakeAmount1.microAlgos - Number(stakerMbr))) - - expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) - }) + const newStakerBalance = await fixture.context.algorand.account.getInformation(stakerAccounts[i].addr) - test('stakeWGatingToken2', async () => { - const stakeAmount2 = AlgoAmount.MicroAlgos(AlgoAmount.Algos(1000).microAlgos) - const [stakedPoolKey] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - stakeAmount2, - gatingToken2Id, - ) - // should match info from first staking pool - expect(stakedPoolKey.id).toEqual(firstPoolKey.id) - expect(stakedPoolKey.poolId).toEqual(firstPoolKey.poolId) - expect(stakedPoolKey.poolAppId).toEqual(firstPoolKey.poolAppId) - - const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(poolInfo.totalStakers).toEqual(1) - expect(poolInfo.totalAlgoStaked).toEqual(BigInt(stakeAmount2.microAlgos * 2)) - - expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) - }) + expect(newStakerBalance.balance.microAlgo).toEqual(origStakerBalance.balance.microAlgo + stakerInfo.balance - removeFees) + // verify that pending reward token payout came to us + const newStakerAssetBalance = await fixture.context.algorand.asset.getAccountInformation(stakerAccounts[i].addr, rewardTokenId) + expect(newStakerAssetBalance.balance).toEqual(origStakerAssetBalance.balance + stakerInfo.rewardTokenBalance) - test('stakeWGatingToken2NotMeetingBalReq', async () => { - // send 1 of the token back to creator - we should now fail to add more stake because we don't meet the token minimum - await transferAsset( - { - from: stakerAccount, - to: tokenCreatorAccount, - assetId: Number(gatingToken2Id), - amount: 1, - }, - fixture.context.algod, - ) + // no one should be left and be 0 balance + const postRemovePoolInfo = await getPoolInfo(validatorMasterClient, poolKeys[i]) + expect(postRemovePoolInfo.totalStakers).toEqual(origPoolInfo.totalStakers - 1n) + expect(postRemovePoolInfo.totalAlgoStaked).toEqual(origPoolInfo.totalAlgoStaked - stakerInfo.balance) - await expect( - addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - AlgoAmount.MicroAlgos(AlgoAmount.Algos(1000).microAlgos), - gatingToken2Id, - ), - ).rejects.toThrowError() - }) + const newValidatorState = await getValidatorState(validatorMasterClient, validatorId) + expect(newValidatorState.totalAlgoStaked).toEqual(origValidatorState.totalAlgoStaked - stakerInfo.balance) + expect(newValidatorState.totalStakers).toEqual(origValidatorState.totalStakers - 1n) + expect(newValidatorState.rewardTokenHeldBack).toEqual(origValidatorState.rewardTokenHeldBack - stakerInfo.rewardTokenBalance) + } }) -}) - -describe('TokenGatingByAsset', () => { - beforeEach(fixture.beforeEach) - beforeEach(logs.beforeEach) - afterEach(logs.afterEach) + }) + describe('TokenGatingByCreator', () => { let validatorId: number let tokenCreatorAccount: Account @@ -2946,208 +2321,155 @@ describe('TokenGatingByAsset', () => { // add validator and 1 pool for subsequent stake tests beforeAll(async () => { - // Create a token that will be required for stakers to possess in order to stake - tokenCreatorAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(5000), - suppressLog: true, - }) - gatingToken1Id = await createAsset( - fixture.context.algod, - tokenCreatorAccount, - 'Gating Token 1 [Other by same]', - 'GATETK1', - 10, - 0, - ) - gatingToken2Id = await createAsset( - fixture.context.algod, - tokenCreatorAccount, - 'Gating Token 2 [Required]', - 'GATETK2', - 10, - 0, - ) + // Create a token that will be required for stakers to possess in order to stake + tokenCreatorAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(5000), + suppressLog: true, + }) + gatingToken1Id = await createAsset(fixture.context, tokenCreatorAccount, 'Gating Token 1', 'GATETK1', 10, 0) + gatingToken2Id = await createAsset(fixture.context, tokenCreatorAccount, 'Gating Token 2', 'GATETK2', 10, 0) + + // Fund a 'validator account' that will be the validator owner. + validatorOwnerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(500), + suppressLog: true, + }) + consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) + + validatorConfig = createValidatorConfig({ + owner: validatorOwnerAccount.addr, + manager: validatorOwnerAccount.addr, + minEntryStake: AlgoAmount.Algos(1000).microAlgos, + maxAlgoPerPool: MaxAlgoPerPool, // this comes into play in later tests !! + percentToValidator: BigInt(5 * 10000), + validatorCommissionAddress: validatorOwnerAccount.addr, + // stakers must possess any token created by tokenCreatorAccount + entryGatingType: BigInt(GATING_TYPE_ASSETS_CREATED_BY), + entryGatingAddress: tokenCreatorAccount.addr, + gatingAssetMinBalance: 2n, // require 2 so we can see if only having 1 fails us + }) + validatorId = await addValidator(fixture.context, validatorMasterClient, validatorOwnerAccount, validatorConfig, mbrs.addValidatorMbr) + + firstPoolKey = await addStakingPool( + fixture.context, + validatorMasterClient, + validatorId, + 1, + validatorOwnerAccount, + mbrs.addPoolMbr, + mbrs.poolInitMbr, + ) + }) - // Fund a 'validator account' that will be the validator owner. - validatorOwnerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(500), - suppressLog: true, + describe('stakeTest', () => { + let stakerAccount: Account + let stakerCreatedTokenId: bigint + beforeAll(async () => { + // Fund a 'staker account' that will be the new 'staker' + stakerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(5000), + suppressLog: true, }) - consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) - validatorConfig = createValidatorConfig({ - owner: validatorOwnerAccount.addr, - manager: validatorOwnerAccount.addr, - minEntryStake: BigInt(AlgoAmount.Algos(1000).microAlgos), - maxAlgoPerPool: BigInt(MaxAlgoPerPool), // this comes into play in later tests !! - percentToValidator: 5 * 10000, - validatorCommissionAddress: validatorOwnerAccount.addr, - // stakers must possess ONLY the second gating token - explicit id ! - entryGatingType: GATING_TYPE_ASSET_ID, - entryGatingAssets: [gatingToken2Id, 0n, 0n, 0n], - gatingAssetMinBalance: 2n, // require 2 so we can see if only having 1 fails us + await fixture.algorand.send.assetOptIn({ sender: stakerAccount.addr, assetId: gatingToken1Id }) + await fixture.algorand.send.assetOptIn({ sender: stakerAccount.addr, assetId: gatingToken2Id }) + // Send gating tokens to our staker for use in tests + await fixture.algorand.send.assetTransfer({ + sender: tokenCreatorAccount.addr, + receiver: stakerAccount.addr, + assetId: gatingToken1Id, + amount: 2n, + }) + await fixture.algorand.send.assetTransfer({ + sender: tokenCreatorAccount.addr, + receiver: stakerAccount.addr, + assetId: gatingToken2Id, + amount: 2n, }) - validatorId = await addValidator( - fixture.context, - validatorMasterClient, - validatorOwnerAccount, - validatorConfig, - validatorMbr, - ) - firstPoolKey = await addStakingPool( - fixture.context, - validatorMasterClient, - validatorId, - 1, - validatorOwnerAccount, - poolMbr, - poolInitMbr, - ) - }) + stakerCreatedTokenId = await createAsset(fixture.context, stakerAccount, 'Dummy Token', 'DUMMY', 10, 0) + }) - describe('stakeTest', () => { - beforeEach(fixture.beforeEach) - beforeEach(logs.beforeEach) - afterEach(logs.afterEach) - - let stakerAccount: Account - let stakerCreatedTokenId: bigint - beforeAll(async () => { - // Fund a 'staker account' that will be the new 'staker' - stakerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(5000), - suppressLog: true, - }) + test('stakeNoTokenOffered', async () => { + const stakeAmount1 = AlgoAmount.MicroAlgos(AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(mbrs.addStakerMbr).microAlgos) + await expect(addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmount1, 0n)).rejects.toThrowError() + }) - await assetOptIn({ account: stakerAccount, assetId: Number(gatingToken1Id) }, fixture.context.algod) - await assetOptIn({ account: stakerAccount, assetId: Number(gatingToken2Id) }, fixture.context.algod) - // Send gating tokens to our staker for use in tests - await transferAsset( - { - from: tokenCreatorAccount, - to: stakerAccount, - assetId: Number(gatingToken1Id), - amount: 2, - }, - fixture.context.algod, - ) - await transferAsset( - { - from: tokenCreatorAccount, - to: stakerAccount, - assetId: Number(gatingToken2Id), - amount: 2, - }, - fixture.context.algod, - ) - - stakerCreatedTokenId = await createAsset( - fixture.context.algod, - stakerAccount, - 'Dummy Token', - 'DUMMY', - 10, - 0, - ) - }) + test('stakeWrongTokenOffered', async () => { + const stakeAmount1 = AlgoAmount.MicroAlgos(AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(mbrs.addStakerMbr).microAlgos) + await expect( + addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmount1, stakerCreatedTokenId), + ).rejects.toThrowError() + }) - test('stakeNoTokenOffered', async () => { - const stakeAmount1 = AlgoAmount.MicroAlgos( - AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(Number(stakerMbr)).microAlgos, - ) - await expect( - addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmount1, 0n), - ).rejects.toThrowError() - }) + test('stakeWGatingToken1', async () => { + const stakeAmount1 = AlgoAmount.MicroAlgos(AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(mbrs.addStakerMbr).microAlgos) + const [stakedPoolKey] = await addStake( + fixture.context, + validatorMasterClient, + validatorId, + stakerAccount, + stakeAmount1, + gatingToken1Id, + ) + // should match info from first staking pool + expect(stakedPoolKey.id).toEqual(firstPoolKey.id) + expect(stakedPoolKey.poolId).toEqual(firstPoolKey.poolId) + expect(stakedPoolKey.poolAppId).toEqual(firstPoolKey.poolAppId) - test('stakeWrongTokenOffered', async () => { - const stakeAmount1 = AlgoAmount.MicroAlgos( - AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(Number(stakerMbr)).microAlgos, - ) - await expect( - addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - stakeAmount1, - stakerCreatedTokenId, - ), - ).rejects.toThrowError() - }) + const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(poolInfo.totalStakers).toEqual(1n) + expect(poolInfo.totalAlgoStaked).toEqual(stakeAmount1.microAlgos - mbrs.addStakerMbr) - test('stakeWGatingToken1ShouldFail', async () => { - const stakeAmount1 = AlgoAmount.MicroAlgos( - AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(Number(stakerMbr)).microAlgos, - ) - await expect( - addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - stakeAmount1, - gatingToken1Id, - ), - ).rejects.toThrowError() - }) + expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) + }) - test('stakeWGatingToken2ShouldPass', async () => { - const stakeAmount1 = AlgoAmount.MicroAlgos( - AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(Number(stakerMbr)).microAlgos, - ) - const [stakedPoolKey] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - stakeAmount1, - gatingToken2Id, - ) - // should match info from first staking pool - expect(stakedPoolKey.id).toEqual(firstPoolKey.id) - expect(stakedPoolKey.poolId).toEqual(firstPoolKey.poolId) - expect(stakedPoolKey.poolAppId).toEqual(firstPoolKey.poolAppId) - - const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(poolInfo.totalStakers).toEqual(1) - expect(poolInfo.totalAlgoStaked).toEqual(BigInt(stakeAmount1.microAlgos - Number(stakerMbr))) - - expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) - }) + test('stakeWGatingToken2', async () => { + const stakeAmount2 = AlgoAmount.MicroAlgos(AlgoAmount.Algos(1000).microAlgos) + const [stakedPoolKey] = await addStake( + fixture.context, + validatorMasterClient, + validatorId, + stakerAccount, + stakeAmount2, + gatingToken2Id, + ) + // should match info from first staking pool + expect(stakedPoolKey.id).toEqual(firstPoolKey.id) + expect(stakedPoolKey.poolId).toEqual(firstPoolKey.poolId) + expect(stakedPoolKey.poolAppId).toEqual(firstPoolKey.poolAppId) - test('stakeWGatingToken2NotMeetingBalReq', async () => { - // send 1 of the token back to creator - we should now fail to add more stake because we don't meet the token minimum - await transferAsset( - { - from: stakerAccount, - to: tokenCreatorAccount, - assetId: Number(gatingToken2Id), - amount: 1, - }, - fixture.context.algod, - ) + const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(poolInfo.totalStakers).toEqual(1n) + expect(poolInfo.totalAlgoStaked).toEqual(stakeAmount2.microAlgos * 2n) - await expect( - addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - AlgoAmount.MicroAlgos(AlgoAmount.Algos(1000).microAlgos), - gatingToken2Id, - ), - ).rejects.toThrowError() + expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) + }) + + test('stakeWGatingToken2NotMeetingBalReq', async () => { + // send 1 of the token back to creator - we should now fail to add more stake because we don't meet the token minimum + await fixture.algorand.send.assetTransfer({ + sender: stakerAccount.addr, + receiver: tokenCreatorAccount.addr, + assetId: gatingToken2Id, + amount: 1n, }) - }) -}) -describe('TokenGatingMultAssets', () => { - beforeEach(fixture.beforeEach) - beforeEach(logs.beforeEach) - afterEach(logs.afterEach) + await expect( + addStake( + fixture.context, + validatorMasterClient, + validatorId, + stakerAccount, + AlgoAmount.MicroAlgos(AlgoAmount.Algos(1000).microAlgos), + gatingToken2Id, + ), + ).rejects.toThrowError() + }) + }) + }) + describe('TokenGatingByAsset', () => { let validatorId: number let tokenCreatorAccount: Account @@ -3155,643 +2477,647 @@ describe('TokenGatingMultAssets', () => { let validatorConfig: ValidatorConfig let firstPoolKey: ValidatorPoolKey - const gatingTokens: bigint[] = [] + let gatingToken1Id: bigint + let gatingToken2Id: bigint // add validator and 1 pool for subsequent stake tests beforeAll(async () => { - // Create a token that will be required for stakers to possess in order to stake - tokenCreatorAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(5000), - suppressLog: true, - }) - // create 4 dummy assets - for (let i = 0; i < 4; i += 1) { - gatingTokens.push( - await createAsset(fixture.context.algod, tokenCreatorAccount, `Gating Token ${i}`, `GATETK${i}`, 10, 0), - ) - } + // Create a token that will be required for stakers to possess in order to stake + tokenCreatorAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(5000), + suppressLog: true, + }) + gatingToken1Id = await createAsset(fixture.context, tokenCreatorAccount, 'Gating Token 1 [Other by same]', 'GATETK1', 10, 0) + gatingToken2Id = await createAsset(fixture.context, tokenCreatorAccount, 'Gating Token 2 [Required]', 'GATETK2', 10, 0) + + // Fund a 'validator account' that will be the validator owner. + validatorOwnerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(500), + suppressLog: true, + }) + consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) + + validatorConfig = createValidatorConfig({ + owner: validatorOwnerAccount.addr, + manager: validatorOwnerAccount.addr, + minEntryStake: AlgoAmount.Algos(1000).microAlgos, + maxAlgoPerPool: MaxAlgoPerPool, // this comes into play in later tests !! + percentToValidator: BigInt(5 * 10000), + validatorCommissionAddress: validatorOwnerAccount.addr, + // stakers must possess ONLY the second gating token - explicit id ! + entryGatingType: BigInt(GATING_TYPE_ASSET_ID), + entryGatingAssets: [gatingToken2Id, 0n, 0n, 0n], + gatingAssetMinBalance: 2n, // require 2 so we can see if only having 1 fails us + }) + validatorId = await addValidator(fixture.context, validatorMasterClient, validatorOwnerAccount, validatorConfig, mbrs.addValidatorMbr) + + firstPoolKey = await addStakingPool( + fixture.context, + validatorMasterClient, + validatorId, + 1, + validatorOwnerAccount, + mbrs.addPoolMbr, + mbrs.poolInitMbr, + ) + }) - validatorOwnerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(500), - suppressLog: true, + describe('stakeTest', () => { + let stakerAccount: Account + let stakerCreatedTokenId: bigint + beforeAll(async () => { + // Fund a 'staker account' that will be the new 'staker' + stakerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(5000), + suppressLog: true, }) - consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) - validatorConfig = createValidatorConfig({ - owner: validatorOwnerAccount.addr, - manager: validatorOwnerAccount.addr, - minEntryStake: BigInt(AlgoAmount.Algos(1000).microAlgos), - maxAlgoPerPool: BigInt(MaxAlgoPerPool), // this comes into play in later tests !! - percentToValidator: 5 * 10000, - validatorCommissionAddress: validatorOwnerAccount.addr, - // stakers must possess ONLY the second gating token - explicit id ! - entryGatingType: GATING_TYPE_ASSET_ID, - entryGatingAssets: [gatingTokens[0], gatingTokens[1], gatingTokens[2], gatingTokens[3]], - gatingAssetMinBalance: 2n, // require 2 so we can see if only having 1 fails + await fixture.algorand.send.assetOptIn({ sender: stakerAccount.addr, assetId: gatingToken1Id }) + await fixture.algorand.send.assetOptIn({ sender: stakerAccount.addr, assetId: gatingToken2Id }) + // Send gating tokens to our staker for use in tests + await fixture.algorand.send.assetTransfer({ + sender: tokenCreatorAccount.addr, + receiver: stakerAccount.addr, + assetId: gatingToken1Id, + amount: 2n, + }) + await fixture.algorand.send.assetTransfer({ + sender: tokenCreatorAccount.addr, + receiver: stakerAccount.addr, + assetId: gatingToken2Id, + amount: 2n, }) - validatorId = await addValidator( - fixture.context, - validatorMasterClient, - validatorOwnerAccount, - validatorConfig, - validatorMbr, - ) - - firstPoolKey = await addStakingPool( - fixture.context, - validatorMasterClient, - validatorId, - 1, - validatorOwnerAccount, - poolMbr, - poolInitMbr, - ) - }) - describe('stakeTest', () => { - beforeEach(fixture.beforeEach) - beforeEach(logs.beforeEach) - afterEach(logs.afterEach) - - let stakerAccount: Account - let stakerCreatedTokenId: bigint - beforeAll(async () => { - // Fund a 'staker account' that will be the new 'staker' - stakerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(8000), - suppressLog: true, - }) + stakerCreatedTokenId = await createAsset(fixture.context, stakerAccount, 'Dummy Token', 'DUMMY', 10, 0) + }) - for (let i = 0; i < 4; i += 1) { - await assetOptIn({ account: stakerAccount, assetId: Number(gatingTokens[i]) }, fixture.context.algod) - await transferAsset( - { - from: tokenCreatorAccount, - to: stakerAccount, - assetId: Number(gatingTokens[i]), - amount: 2, - }, - fixture.context.algod, - ) - } - stakerCreatedTokenId = await createAsset( - fixture.context.algod, - stakerAccount, - 'Dummy Token', - 'DUMMY', - 10, - 0, - ) - }) + test('stakeNoTokenOffered', async () => { + const stakeAmount1 = AlgoAmount.MicroAlgos(AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(mbrs.addStakerMbr).microAlgos) + await expect(addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmount1, 0n)).rejects.toThrowError() + }) - test('stakeNoTokenOffered', async () => { - const stakeAmount1 = AlgoAmount.MicroAlgos( - AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(Number(stakerMbr)).microAlgos, - ) - await expect( - addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmount1, 0n), - ).rejects.toThrowError() - }) + test('stakeWrongTokenOffered', async () => { + const stakeAmount1 = AlgoAmount.MicroAlgos(AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(mbrs.addStakerMbr).microAlgos) + await expect( + addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmount1, stakerCreatedTokenId), + ).rejects.toThrowError() + }) - test('stakeWrongTokenOffered', async () => { - const stakeAmount1 = AlgoAmount.MicroAlgos( - AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(Number(stakerMbr)).microAlgos, - ) - await expect( - addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - stakeAmount1, - stakerCreatedTokenId, - ), - ).rejects.toThrowError() - }) + test('stakeWGatingToken1ShouldFail', async () => { + const stakeAmount1 = AlgoAmount.MicroAlgos(AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(mbrs.addStakerMbr).microAlgos) + await expect( + addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmount1, gatingToken1Id), + ).rejects.toThrowError() + }) - test('stakeWGatingTokens', async () => { - const stakeAmount1 = AlgoAmount.MicroAlgos( - AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(Number(stakerMbr)).microAlgos, - ) - const [stakedPoolKey] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - stakeAmount1, - gatingTokens[0], - ) - expect(stakedPoolKey.id).toEqual(firstPoolKey.id) - expect(stakedPoolKey.poolId).toEqual(firstPoolKey.poolId) - expect(stakedPoolKey.poolAppId).toEqual(firstPoolKey.poolAppId) - - let poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(poolInfo.totalStakers).toEqual(1) - expect(poolInfo.totalAlgoStaked).toEqual(BigInt(stakeAmount1.microAlgos - Number(stakerMbr))) - - expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) - - // Now try w/ the rest of the tokens - all should succeed and should only add more stake - for (let i = 1; i < 4; i += 1) { - await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - AlgoAmount.Algos(1000), - gatingTokens[i], - ) - } - poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(poolInfo.totalStakers).toEqual(1) - expect(poolInfo.totalAlgoStaked).toEqual(BigInt(AlgoAmount.Algos(1000).microAlgos * 4)) - expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) - }) + test('stakeWGatingToken2ShouldPass', async () => { + const stakeAmount1 = AlgoAmount.MicroAlgos(AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(mbrs.addStakerMbr).microAlgos) + const [stakedPoolKey] = await addStake( + fixture.context, + validatorMasterClient, + validatorId, + stakerAccount, + stakeAmount1, + gatingToken2Id, + ) + // should match info from first staking pool + expect(stakedPoolKey.id).toEqual(firstPoolKey.id) + expect(stakedPoolKey.poolId).toEqual(firstPoolKey.poolId) + expect(stakedPoolKey.poolAppId).toEqual(firstPoolKey.poolAppId) - test('stakeWGatingToken2ShouldPass', async () => { - const stakeAmount1 = AlgoAmount.Algos(1000) - const [stakedPoolKey] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - stakeAmount1, - gatingTokens[1], - ) - expect(stakedPoolKey.id).toEqual(firstPoolKey.id) - expect(stakedPoolKey.poolId).toEqual(firstPoolKey.poolId) - expect(stakedPoolKey.poolAppId).toEqual(firstPoolKey.poolAppId) - - const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(poolInfo.totalStakers).toEqual(1) - expect(poolInfo.totalAlgoStaked).toEqual(BigInt(stakeAmount1.microAlgos * 5)) - expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) - }) + const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(poolInfo.totalStakers).toEqual(1n) + expect(poolInfo.totalAlgoStaked).toEqual(stakeAmount1.microAlgos - mbrs.addStakerMbr) - test('stakeWGatingToken2NotMeetingBalReq', async () => { - // send 1 of a token back to creator - we should now fail to add more stake because we don't meet the token minimum - await transferAsset( - { - from: stakerAccount, - to: tokenCreatorAccount, - assetId: Number(gatingTokens[1]), - amount: 1, - }, - fixture.context.algod, - ) + expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) + }) - await expect( - addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - AlgoAmount.MicroAlgos(AlgoAmount.Algos(1000).microAlgos), - gatingTokens[1], - ), - ).rejects.toThrowError() + test('stakeWGatingToken2NotMeetingBalReq', async () => { + // send 1 of the token back to creator - we should now fail to add more stake because we don't meet the token minimum + await fixture.algorand.send.assetTransfer({ + sender: stakerAccount.addr, + receiver: tokenCreatorAccount.addr, + assetId: gatingToken2Id, + amount: 1n, }) - }) -}) -describe('SaturatedValidator', () => { - beforeEach(fixture.beforeEach) - beforeEach(logs.beforeEach) - afterEach(logs.afterEach) + await expect( + addStake( + fixture.context, + validatorMasterClient, + validatorId, + stakerAccount, + AlgoAmount.MicroAlgos(AlgoAmount.Algos(1000).microAlgos), + gatingToken2Id, + ), + ).rejects.toThrowError() + }) + }) + }) + describe('TokenGatingMultAssets', () => { let validatorId: number + let tokenCreatorAccount: Account let validatorOwnerAccount: Account - let stakerAccount: Account let validatorConfig: ValidatorConfig - const pools: ValidatorPoolKey[] = [] + let firstPoolKey: ValidatorPoolKey + + const gatingTokens: bigint[] = [] // add validator and 1 pool for subsequent stake tests beforeAll(async () => { - // Fund a 'validator account' that will be the validator owner. - validatorOwnerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(500), - suppressLog: true, - }) - consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) - - validatorConfig = createValidatorConfig({ - owner: validatorOwnerAccount.addr, - manager: validatorOwnerAccount.addr, - minEntryStake: BigInt(AlgoAmount.Algos(1000).microAlgos), - maxAlgoPerPool: 0n, - percentToValidator: 5 * 10000, - validatorCommissionAddress: validatorOwnerAccount.addr, - }) - validatorId = await addValidator( - fixture.context, - validatorMasterClient, - validatorOwnerAccount, - validatorConfig, - validatorMbr, - ) - - pools.push( - await addStakingPool( - fixture.context, - validatorMasterClient, - validatorId, - 1, - validatorOwnerAccount, - poolMbr, - poolInitMbr, - ), - ) + // Create a token that will be required for stakers to possess in order to stake + tokenCreatorAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(5000), + suppressLog: true, + }) + // create 4 dummy assets + for (let i = 0; i < 4; i += 1) { + gatingTokens.push(await createAsset(fixture.context, tokenCreatorAccount, `Gating Token ${i}`, `GATETK${i}`, 10, 0)) + } + + validatorOwnerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(500), + suppressLog: true, + }) + consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) + + validatorConfig = createValidatorConfig({ + owner: validatorOwnerAccount.addr, + manager: validatorOwnerAccount.addr, + minEntryStake: AlgoAmount.Algos(1000).microAlgos, + maxAlgoPerPool: MaxAlgoPerPool, // this comes into play in later tests !! + percentToValidator: BigInt(5 * 10000), + validatorCommissionAddress: validatorOwnerAccount.addr, + // stakers must possess ONLY the second gating token - explicit id ! + entryGatingType: BigInt(GATING_TYPE_ASSET_ID), + entryGatingAssets: [gatingTokens[0], gatingTokens[1], gatingTokens[2], gatingTokens[3]], + gatingAssetMinBalance: 2n, // require 2 so we can see if only having 1 fails + }) + validatorId = await addValidator(fixture.context, validatorMasterClient, validatorOwnerAccount, validatorConfig, mbrs.addValidatorMbr) + + firstPoolKey = await addStakingPool( + fixture.context, + validatorMasterClient, + validatorId, + 1, + validatorOwnerAccount, + mbrs.addPoolMbr, + mbrs.poolInitMbr, + ) + }) + describe('stakeTest', () => { + let stakerAccount: Account + let stakerCreatedTokenId: bigint + beforeAll(async () => { + // Fund a 'staker account' that will be the new 'staker' stakerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(300e6), - suppressLog: true, + initialFunds: AlgoAmount.Algos(8000), + suppressLog: true, }) - }) - // Fill up the first pool completely - test('stakeFillingPool', async () => { - const constraints = await getProtocolConstraints(validatorMasterClient) - const stakeAmount = AlgoAmount.MicroAlgos(Number(constraints.MaxAlgoPerPool + stakerMbr)) - await addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmount, 0n) - expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) - const poolInfo = await getPoolInfo(validatorMasterClient, pools[0]) - expect(poolInfo.totalStakers).toEqual(1) - expect(poolInfo.totalAlgoStaked).toEqual(BigInt(stakeAmount.microAlgos - Number(stakerMbr))) + for (let i = 0; i < 4; i += 1) { + await fixture.algorand.send.assetOptIn({ sender: stakerAccount.addr, assetId: gatingTokens[i] }) + await fixture.algorand.send.assetTransfer({ + sender: tokenCreatorAccount.addr, + receiver: stakerAccount.addr, + assetId: gatingTokens[i], + amount: 2n, + }) + } + stakerCreatedTokenId = await createAsset(fixture.context, stakerAccount, 'Dummy Token', 'DUMMY', 10, 0) + }) - // try to add again - should fail + test('stakeNoTokenOffered', async () => { + const stakeAmount1 = AlgoAmount.MicroAlgos(AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(mbrs.addStakerMbr).microAlgos) + await expect(addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmount1, 0n)).rejects.toThrowError() + }) + + test('stakeWrongTokenOffered', async () => { + const stakeAmount1 = AlgoAmount.MicroAlgos(AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(mbrs.addStakerMbr).microAlgos) await expect( - addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - AlgoAmount.MicroAlgos(1000), - 0n, - ), + addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmount1, stakerCreatedTokenId), ).rejects.toThrowError() - }) + }) - // Now we add 2 more pools, total of 3 - and max state per pool should reduce accordingly. - test('addPools', async () => { - const constraints = await getProtocolConstraints(validatorMasterClient) - const curSoftMax = await getCurMaxStakePerPool(validatorMasterClient, validatorId) - expect(curSoftMax).toEqual(constraints.MaxAlgoPerPool) - - for (let i = 0; i < 2; i += 1) { - pools.push( - await addStakingPool( - fixture.context, - validatorMasterClient, - validatorId, - 1, - validatorOwnerAccount, - poolMbr, - poolInitMbr, - ), - ) - } - expect((await getValidatorState(validatorMasterClient, validatorId)).numPools).toEqual(3) - // Our maximum per pool should've changed now - to be max algo per validator / numNodes (3) - const newSoftMax = await getCurMaxStakePerPool(validatorMasterClient, validatorId) - expect(newSoftMax).toEqual( - BigInt(Math.min(Number(constraints.MaxAlgoPerValidator / 3n), Number(constraints.MaxAlgoPerPool))), + test('stakeWGatingTokens', async () => { + const stakeAmount1 = AlgoAmount.MicroAlgos(AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(mbrs.addStakerMbr).microAlgos) + const [stakedPoolKey] = await addStake( + fixture.context, + validatorMasterClient, + validatorId, + stakerAccount, + stakeAmount1, + gatingTokens[0], ) - }) + expect(stakedPoolKey.id).toEqual(firstPoolKey.id) + expect(stakedPoolKey.poolId).toEqual(firstPoolKey.poolId) + expect(stakedPoolKey.poolAppId).toEqual(firstPoolKey.poolAppId) - test('fillNewPools', async () => { - const constraints = await getProtocolConstraints(validatorMasterClient) - const newSoftMax = await getCurMaxStakePerPool(validatorMasterClient, validatorId) + let poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(poolInfo.totalStakers).toEqual(1n) + expect(poolInfo.totalAlgoStaked).toEqual(stakeAmount1.microAlgos - mbrs.addStakerMbr) - let [poolKey] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - AlgoAmount.MicroAlgos(Number(newSoftMax)), - 0n, + expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) + + // Now try w/ the rest of the tokens - all should succeed and should only add more stake + for (let i = 1; i < 4; i += 1) { + await addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, AlgoAmount.Algos(1000), gatingTokens[i]) + } + poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(poolInfo.totalStakers).toEqual(1n) + expect(poolInfo.totalAlgoStaked).toEqual(AlgoAmount.Algos(1000).microAlgos * 4n) + expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) + }) + + test('stakeWGatingToken2ShouldPass', async () => { + const stakeAmount1 = AlgoAmount.Algos(1000) + const [stakedPoolKey] = await addStake( + fixture.context, + validatorMasterClient, + validatorId, + stakerAccount, + stakeAmount1, + gatingTokens[1], ) - expect(poolKey.poolId).toEqual(2n) + expect(stakedPoolKey.id).toEqual(firstPoolKey.id) + expect(stakedPoolKey.poolId).toEqual(firstPoolKey.poolId) + expect(stakedPoolKey.poolAppId).toEqual(firstPoolKey.poolAppId) + + const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(poolInfo.totalStakers).toEqual(1n) + expect(poolInfo.totalAlgoStaked).toEqual(stakeAmount1.microAlgos * 5n) + expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) + }) - const state = await getValidatorState(validatorMasterClient, validatorId) - expect(state.totalAlgoStaked).toEqual(constraints.MaxAlgoPerPool + newSoftMax) + test('stakeWGatingToken2NotMeetingBalReq', async () => { + // send 1 of a token back to creator - we should now fail to add more stake because we don't meet the token minimum + await fixture.algorand.send.assetTransfer({ + sender: stakerAccount.addr, + receiver: tokenCreatorAccount.addr, + assetId: gatingTokens[1], + amount: 1n, + }) - // Fill again - this will put us at max and with current dev defaults at least - over saturation limit - // 3 pools of 70m (210m) vs saturation limit of 10% of 2b or 200m. - ;[poolKey] = await addStake( + await expect( + addStake( fixture.context, validatorMasterClient, validatorId, stakerAccount, - AlgoAmount.MicroAlgos(Number(newSoftMax)), - 0n, - ) - expect(poolKey.poolId).toEqual(3n) + AlgoAmount.MicroAlgos(AlgoAmount.Algos(1000).microAlgos), + gatingTokens[1], + ), + ).rejects.toThrowError() + }) }) + }) - test('testPenalties', async () => { - const state = await getValidatorState(validatorMasterClient, validatorId) - const origPoolBalance = await getPoolAvailBalance(fixture.context, pools[2]) + describe('SaturatedValidator', () => { + let validatorId: number - const tmpPoolClient = new StakingPoolClient( - { sender: validatorOwnerAccount, resolveBy: 'id', id: pools[2].poolAppId }, - fixture.context.algod, - ) - const poolInfo = await getPoolInfo(validatorMasterClient, pools[2]) - const rewardAmount = AlgoAmount.Algos(200).microAlgos - // ok, NOW it should be over the limit on next balance update - send a bit more algo - and it should be in - // saturated state now - so reward gets diminished, validator gets nothing, rest goes to fee sink - const rewardSender = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.MicroAlgos(rewardAmount + 4e6), - suppressLog: true, - }) - await transferAlgos( - { - from: rewardSender, - to: getApplicationAddress(pools[2].poolAppId), - amount: AlgoAmount.MicroAlgos(rewardAmount), - }, - fixture.context.algod, - ) - const wNewRewardPoolBal = await getPoolAvailBalance(fixture.context, pools[2]) - // pools account balance should be excess above totalAlgoStaked now... - expect(wNewRewardPoolBal).toEqual(poolInfo.totalAlgoStaked + BigInt(rewardAmount)) + let validatorOwnerAccount: Account + let stakerAccount: Account + let validatorConfig: ValidatorConfig + const pools: ValidatorPoolKey[] = [] - // but after epochBalanceUpdate - the 'staked amount' should have grown - but not by as much (depends on ratio of stake vs saturation limit) - const origFeeSinkBal = await fixture.context.algod.accountInformation(FEE_SINK_ADDR).do() - // make sure all the stakers are considered fully staked... - await incrementRoundNumberBy(fixture.context, 321) + // add validator and 1 pool for subsequent stake tests + beforeAll(async () => { + // Fund a 'validator account' that will be the validator owner. + validatorOwnerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(500), + suppressLog: true, + }) + consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) + + validatorConfig = createValidatorConfig({ + owner: validatorOwnerAccount.addr, + manager: validatorOwnerAccount.addr, + minEntryStake: AlgoAmount.Algos(1000).microAlgos, + maxAlgoPerPool: 0n, + percentToValidator: BigInt(5 * 10000), + validatorCommissionAddress: validatorOwnerAccount.addr, + }) + validatorId = await addValidator(fixture.context, validatorMasterClient, validatorOwnerAccount, validatorConfig, mbrs.addValidatorMbr) + + pools.push( + await addStakingPool( + fixture.context, + validatorMasterClient, + validatorId, + 1, + validatorOwnerAccount, + mbrs.addPoolMbr, + mbrs.poolInitMbr, + ), + ) + + stakerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(300e6), + suppressLog: true, + }) + }) + + // Fill up the first pool completely + test('stakeFillingPool', async () => { + const constraints = await getProtocolConstraints(validatorMasterClient) + const stakeAmount = AlgoAmount.MicroAlgos(constraints.maxAlgoPerPool + mbrs.addStakerMbr) + await addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmount, 0n) + expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(1n) + const poolInfo = await getPoolInfo(validatorMasterClient, pools[0]) + expect(poolInfo.totalStakers).toEqual(1n) + expect(poolInfo.totalAlgoStaked).toEqual(stakeAmount.microAlgos - mbrs.addStakerMbr) + + // try to add again - should fail + await expect( + addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, AlgoAmount.MicroAlgos(1000), 0n), + ).rejects.toThrowError() + }) - await epochBalanceUpdate(tmpPoolClient) + // Now we add 2 more pools, total of 3 - and max state per pool should reduce accordingly. + test('addPools', async () => { + const constraints = await getProtocolConstraints(validatorMasterClient) + const curSoftMax = await getCurMaxStakePerPool(validatorMasterClient, validatorId) + expect(curSoftMax).toEqual(constraints.maxAlgoPerPool) - const postSaturatedPoolBal = await getPoolAvailBalance(fixture.context, pools[2]) + for (let i = 0; i < 2; i += 1) { + pools.push( + await addStakingPool( + fixture.context, + validatorMasterClient, + validatorId, + 1, + validatorOwnerAccount, + mbrs.addPoolMbr, + mbrs.poolInitMbr, + ), + ) + } + expect((await getValidatorState(validatorMasterClient, validatorId)).numPools).toEqual(3n) + // Our maximum per pool should've changed now - to be max algo per validator / numNodes (3) + const newSoftMax = await getCurMaxStakePerPool(validatorMasterClient, validatorId) + expect(newSoftMax).toEqual(BigInt(Math.min(Number(constraints.maxAlgoPerValidator / 3n), Number(constraints.maxAlgoPerPool)))) + }) - const constraints = await getProtocolConstraints(validatorMasterClient) + test('fillNewPools', async () => { + const constraints = await getProtocolConstraints(validatorMasterClient) + const newSoftMax = (await getCurMaxStakePerPool(validatorMasterClient, validatorId)) as bigint - const normalValidatorCommission = BigInt(rewardAmount) * (5n / 100n) - let diminishedRewards = (BigInt(rewardAmount) * constraints.AmtConsideredSaturated) / state.totalAlgoStaked - if (diminishedRewards > BigInt(rewardAmount) - normalValidatorCommission) { - consoleLogger.info( - `reducing awards from ${diminishedRewards} to ${BigInt(rewardAmount) - normalValidatorCommission}`, - ) - diminishedRewards = BigInt(rewardAmount) - normalValidatorCommission - } + let [poolKey] = await addStake( + fixture.context, + validatorMasterClient, + validatorId, + stakerAccount, + AlgoAmount.MicroAlgos(newSoftMax), + 0n, + ) + expect(poolKey.poolId).toEqual(2n) - expect(postSaturatedPoolBal).toEqual(poolInfo.totalAlgoStaked + diminishedRewards) - // reward should've been reduced with rest going to fee sink - const newFeeSinkBal = await fixture.context.algod.accountInformation(FEE_SINK_ADDR).do() - expect(newFeeSinkBal.amount).toBeGreaterThanOrEqual( - origFeeSinkBal.amount + (rewardAmount - Number(diminishedRewards)), - ) - consoleLogger.info(`diminishedRewards:${diminishedRewards}`) + const state = await getValidatorState(validatorMasterClient, validatorId) + expect(state.totalAlgoStaked).toEqual(constraints.maxAlgoPerPool + newSoftMax) - // stake should've increased by diminishedRewards - const newPoolInfo = await getPoolInfo(validatorMasterClient, pools[2]) - const newPoolBalance = await getPoolAvailBalance(fixture.context, pools[2]) - expect(newPoolBalance).toEqual(origPoolBalance + diminishedRewards) - expect(newPoolBalance).toEqual(newPoolInfo.totalAlgoStaked) + // Fill again - this will put us at max and with current dev defaults at least - over saturation limit + // 3 pools of 70m (210m) vs saturation limit of 10% of 2b or 200m. + ;[poolKey] = await addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, AlgoAmount.MicroAlgos(newSoftMax), 0n) + expect(poolKey.poolId).toEqual(3n) }) -}) - -describe('StakeAddRemoveBugVerify', () => { - beforeEach(fixture.beforeEach) - beforeEach(logs.beforeEach) - afterEach(logs.afterEach) + test('testPenalties', async () => { + const state = await getValidatorState(validatorMasterClient, validatorId) + const origPoolBalance = await getPoolAvailBalance(fixture.context, pools[2]) + + const tmpPoolClient = stakingPoolFactory.getAppClientById({ appId: pools[2].poolAppId, defaultSender: validatorOwnerAccount.addr }) + + const poolInfo = await getPoolInfo(validatorMasterClient, pools[2]) + const rewardAmount = AlgoAmount.Algos(200).microAlgos + // ok, NOW it should be over the limit on next balance update - send a bit more algo - and it should be in + // saturated state now - so reward gets diminished, validator gets nothing, rest goes to fee sink + const rewardSender = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.MicroAlgos(rewardAmount + 4_000_000n), + suppressLog: true, + }) + await fixture.algorand.send.payment({ + sender: fixture.context.testAccount.addr, + receiver: getApplicationAddress(pools[2].poolAppId), + amount: AlgoAmount.MicroAlgos(rewardAmount), + }) + const wNewRewardPoolBal = await getPoolAvailBalance(fixture.context, pools[2]) + // pools account balance should be excess above totalAlgoStaked now... + expect(wNewRewardPoolBal).toEqual(poolInfo.totalAlgoStaked + rewardAmount) + + // but after epochBalanceUpdate - the 'staked amount' should have grown - but not by as much (depends on ratio of stake vs saturation limit) + const origFeeSinkBal = await fixture.context.algorand.account.getInformation(FEE_SINK_ADDR) + // make sure all the stakers are considered fully staked... + await incrementRoundNumberBy(fixture.context, 321) + + await epochBalanceUpdate(tmpPoolClient) + + const postSaturatedPoolBal = await getPoolAvailBalance(fixture.context, pools[2]) + + const constraints = await getProtocolConstraints(validatorMasterClient) + + const normalValidatorCommission = rewardAmount * (5n / 100n) + let diminishedRewards = (rewardAmount * constraints.amtConsideredSaturated) / state.totalAlgoStaked + if (diminishedRewards > rewardAmount - normalValidatorCommission) { + consoleLogger.info(`reducing awards from ${diminishedRewards} to ${rewardAmount - normalValidatorCommission}`) + diminishedRewards = rewardAmount - normalValidatorCommission + } + + expect(postSaturatedPoolBal).toEqual(poolInfo.totalAlgoStaked + diminishedRewards) + // reward should've been reduced with rest going to fee sink + const newFeeSinkBal = await fixture.context.algorand.account.getInformation(FEE_SINK_ADDR) + expect(newFeeSinkBal.balance.microAlgo).toBeGreaterThanOrEqual(origFeeSinkBal.balance.microAlgo + (rewardAmount - diminishedRewards)) + consoleLogger.info(`diminishedRewards:${diminishedRewards}`) + + // stake should've increased by diminishedRewards + const newPoolInfo = await getPoolInfo(validatorMasterClient, pools[2]) + const newPoolBalance = await getPoolAvailBalance(fixture.context, pools[2]) + expect(newPoolBalance).toEqual(origPoolBalance + diminishedRewards) + expect(newPoolBalance).toEqual(newPoolInfo.totalAlgoStaked) + }) + }) + + describe('StakeAddRemoveBugVerify', () => { let validatorId: number let validatorOwnerAccount: Account let firstPoolKey: ValidatorPoolKey let firstPoolClient: StakingPoolClient beforeAll(async () => { - validatorOwnerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(500), - suppressLog: true, - }) - const config = createValidatorConfig({ - owner: validatorOwnerAccount.addr, - manager: validatorOwnerAccount.addr, - validatorCommissionAddress: validatorOwnerAccount.addr, - minEntryStake: BigInt(AlgoAmount.Algos(1).microAlgos), - maxAlgoPerPool: BigInt(MaxAlgoPerPool), // this comes into play in later tests !! - percentToValidator: 50000, // 5% - poolsPerNode: MaxPoolsPerNode, - }) - validatorId = await addValidator( - fixture.context, - validatorMasterClient, - validatorOwnerAccount, - config, - validatorMbr, - ) - firstPoolKey = await addStakingPool( - fixture.context, - validatorMasterClient, - validatorId, - 1, - validatorOwnerAccount, - poolMbr, - poolInitMbr, - ) - firstPoolClient = new StakingPoolClient( - { sender: validatorOwnerAccount, resolveBy: 'id', id: firstPoolKey.poolAppId }, - fixture.context.algod, - ) + validatorOwnerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(500), + suppressLog: true, + }) + const config = createValidatorConfig({ + owner: validatorOwnerAccount.addr, + manager: validatorOwnerAccount.addr, + validatorCommissionAddress: validatorOwnerAccount.addr, + minEntryStake: AlgoAmount.Algos(1).microAlgos, + maxAlgoPerPool: MaxAlgoPerPool, // this comes into play in later tests !! + percentToValidator: 50000n, // 5% + poolsPerNode: BigInt(MaxPoolsPerNode), + }) + validatorId = await addValidator(fixture.context, validatorMasterClient, validatorOwnerAccount, config, mbrs.addValidatorMbr) + firstPoolKey = await addStakingPool( + fixture.context, + validatorMasterClient, + validatorId, + 1, + validatorOwnerAccount, + mbrs.addPoolMbr, + mbrs.poolInitMbr, + ) + firstPoolClient = stakingPoolFactory.getAppClientById({ appId: firstPoolKey.poolAppId, defaultSender: validatorOwnerAccount.addr }) }) test('addRemoveStakers', async () => { - const stakers: Account[] = [] - for (let i = 0; i < 3; i += 1) { - const stakerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.MicroAlgos(MaxAlgoPerPool + AlgoAmount.Algos(4000).microAlgos), - suppressLog: true, - }) - stakers.push(stakerAccount) - } - // we have 3 stakers, now stake 0, 2, 1. Remove 2 - add stake for 1 - // with 1.0 bug it'll add entry for staker 1 twice - const stakeAmt = AlgoAmount.MicroAlgos( - AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(Number(stakerMbr)).microAlgos, - ) - let [poolKey] = await addStake(fixture.context, validatorMasterClient, validatorId, stakers[0], stakeAmt, 0n) - expect(poolKey.id).toEqual(firstPoolKey.id) - ;[poolKey] = await addStake(fixture.context, validatorMasterClient, validatorId, stakers[2], stakeAmt, 0n) - expect(poolKey.id).toEqual(firstPoolKey.id) - ;[poolKey] = await addStake(fixture.context, validatorMasterClient, validatorId, stakers[1], stakeAmt, 0n) - expect(poolKey.id).toEqual(firstPoolKey.id) - - // ledger should be staker 0, 2, 1, {empty} - let stakerData = await getStakeInfoFromBoxValue(firstPoolClient) - expect(encodeAddress(stakerData[0].staker.publicKey)).toEqual(stakers[0].addr) - expect(encodeAddress(stakerData[1].staker.publicKey)).toEqual(stakers[2].addr) - expect(encodeAddress(stakerData[2].staker.publicKey)).toEqual(stakers[1].addr) - expect(encodeAddress(stakerData[3].staker.publicKey)).toEqual(ALGORAND_ZERO_ADDRESS_STRING) - expect(stakerData[0].balance).toEqual(1000n * 1000000n) - expect(stakerData[1].balance).toEqual(1000n * 1000000n) - expect(stakerData[2].balance).toEqual(1000n * 1000000n) - expect(stakerData[3].balance).toEqual(0n) - - // now remove staker 2's stake - and we should end up with ledger of 0, {empty}, 1, {empty} - await removeStake(firstPoolClient, stakers[2], AlgoAmount.Algos(1000)) - stakerData = await getStakeInfoFromBoxValue(firstPoolClient) - expect(encodeAddress(stakerData[0].staker.publicKey)).toEqual(stakers[0].addr) - expect(encodeAddress(stakerData[1].staker.publicKey)).toEqual(ALGORAND_ZERO_ADDRESS_STRING) - expect(encodeAddress(stakerData[2].staker.publicKey)).toEqual(stakers[1].addr) - expect(encodeAddress(stakerData[3].staker.publicKey)).toEqual(ALGORAND_ZERO_ADDRESS_STRING) - expect(stakerData[0].balance).toEqual(1000n * 1000000n) - expect(stakerData[1].balance).toEqual(0n) - expect(stakerData[2].balance).toEqual(1000n * 1000000n) - expect(stakerData[3].balance).toEqual(0n) - - // now try to add more stake for staker 1... prior bug means it'd re-add in the first empty slot ! - // verify it just adds to existing stake in later slot - ;[poolKey] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakers[1], - AlgoAmount.Algos(500), - 0n, - ) - expect(poolKey.id).toEqual(firstPoolKey.id) - - stakerData = await getStakeInfoFromBoxValue(firstPoolClient) - expect(encodeAddress(stakerData[0].staker.publicKey)).toEqual(stakers[0].addr) - expect(encodeAddress(stakerData[1].staker.publicKey)).toEqual(ALGORAND_ZERO_ADDRESS_STRING) - expect(encodeAddress(stakerData[2].staker.publicKey)).toEqual(stakers[1].addr) - expect(encodeAddress(stakerData[3].staker.publicKey)).toEqual(ALGORAND_ZERO_ADDRESS_STRING) - expect(stakerData[0].balance).toEqual(1000n * 1000000n) - expect(stakerData[1].balance).toEqual(0n) - expect(stakerData[2].balance).toEqual(1500n * 1000000n) - expect(stakerData[3].balance).toEqual(0n) - }) -}) - -describe('StakerMultiPoolAddRemoveBugVerify', () => { - beforeEach(fixture.beforeEach) - beforeEach(logs.beforeEach) - afterEach(logs.afterEach) - + const stakers: Account[] = [] + for (let i = 0; i < 3; i += 1) { + const stakerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.MicroAlgos(MaxAlgoPerPool + AlgoAmount.Algos(4000).microAlgos), + suppressLog: true, + }) + stakers.push(stakerAccount) + } + // we have 3 stakers, now stake 0, 2, 1. Remove 2 - add stake for 1 + // with 1.0 bug it'll add entry for staker 1 twice + const stakeAmt = AlgoAmount.MicroAlgos(AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(mbrs.addStakerMbr).microAlgos) + let [poolKey] = await addStake(fixture.context, validatorMasterClient, validatorId, stakers[0], stakeAmt, 0n) + expect(poolKey.id).toEqual(firstPoolKey.id) + ;[poolKey] = await addStake(fixture.context, validatorMasterClient, validatorId, stakers[2], stakeAmt, 0n) + expect(poolKey.id).toEqual(firstPoolKey.id) + ;[poolKey] = await addStake(fixture.context, validatorMasterClient, validatorId, stakers[1], stakeAmt, 0n) + expect(poolKey.id).toEqual(firstPoolKey.id) + + // ledger should be staker 0, 2, 1, {empty} + let stakerData = await getStakeInfoFromBoxValue(firstPoolClient) + expect(stakerData[0].account).toEqual(stakers[0].addr) + expect(stakerData[1].account).toEqual(stakers[2].addr) + expect(stakerData[2].account).toEqual(stakers[1].addr) + expect(stakerData[3].account).toEqual(ALGORAND_ZERO_ADDRESS_STRING) + expect(stakerData[0].balance).toEqual(1000n * 1000000n) + expect(stakerData[1].balance).toEqual(1000n * 1000000n) + expect(stakerData[2].balance).toEqual(1000n * 1000000n) + expect(stakerData[3].balance).toEqual(0n) + + // now remove staker 2's stake - and we should end up with ledger of 0, {empty}, 1, {empty} + await removeStake(firstPoolClient, stakers[2], AlgoAmount.Algos(1000)) + stakerData = await getStakeInfoFromBoxValue(firstPoolClient) + expect(stakerData[0].account).toEqual(stakers[0].addr) + expect(stakerData[1].account).toEqual(ALGORAND_ZERO_ADDRESS_STRING) + expect(stakerData[2].account).toEqual(stakers[1].addr) + expect(stakerData[3].account).toEqual(ALGORAND_ZERO_ADDRESS_STRING) + expect(stakerData[0].balance).toEqual(1000n * 1000000n) + expect(stakerData[1].balance).toEqual(0n) + expect(stakerData[2].balance).toEqual(1000n * 1000000n) + expect(stakerData[3].balance).toEqual(0n) + + // now try to add more stake for staker 1... prior bug means it'd re-add in the first empty slot ! + // verify it just adds to existing stake in later slot + ;[poolKey] = await addStake(fixture.context, validatorMasterClient, validatorId, stakers[1], AlgoAmount.Algos(500), 0n) + expect(poolKey.id).toEqual(firstPoolKey.id) + + stakerData = await getStakeInfoFromBoxValue(firstPoolClient) + expect(stakerData[0].account).toEqual(stakers[0].addr) + expect(stakerData[1].account).toEqual(ALGORAND_ZERO_ADDRESS_STRING) + expect(stakerData[2].account).toEqual(stakers[1].addr) + expect(stakerData[3].account).toEqual(ALGORAND_ZERO_ADDRESS_STRING) + expect(stakerData[0].balance).toEqual(1000n * 1000000n) + expect(stakerData[1].balance).toEqual(0n) + expect(stakerData[2].balance).toEqual(1500n * 1000000n) + expect(stakerData[3].balance).toEqual(0n) + }) + }) + + describe('StakerMultiPoolAddRemoveBugVerify', () => { const validatorIds: number[] = [] const poolKeys: ValidatorPoolKey[] = [] let validatorOwnerAccount: Account beforeAll(async () => { - validatorOwnerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(500), - suppressLog: true, - }) - const config = createValidatorConfig({ - owner: validatorOwnerAccount.addr, - manager: validatorOwnerAccount.addr, - validatorCommissionAddress: validatorOwnerAccount.addr, - minEntryStake: BigInt(AlgoAmount.Algos(1).microAlgos), - maxAlgoPerPool: BigInt(MaxAlgoPerPool), // this comes into play in later tests !! - percentToValidator: 50000, // 5% - poolsPerNode: MaxPoolsPerNode, - }) - validatorIds.push( - await addValidator(fixture.context, validatorMasterClient, validatorOwnerAccount, config, validatorMbr), - ) - poolKeys.push( - await addStakingPool( - fixture.context, - validatorMasterClient, - validatorIds[0], - 1, - validatorOwnerAccount, - poolMbr, - poolInitMbr, - ), - ) - validatorIds.push( - await addValidator(fixture.context, validatorMasterClient, validatorOwnerAccount, config, validatorMbr), - ) - poolKeys.push( - await addStakingPool( - fixture.context, - validatorMasterClient, - validatorIds[1], - 1, - validatorOwnerAccount, - poolMbr, - poolInitMbr, - ), - ) + validatorOwnerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(500), + suppressLog: true, + }) + const config = createValidatorConfig({ + owner: validatorOwnerAccount.addr, + manager: validatorOwnerAccount.addr, + validatorCommissionAddress: validatorOwnerAccount.addr, + minEntryStake: AlgoAmount.Algos(1).microAlgos, + maxAlgoPerPool: MaxAlgoPerPool, // this comes into play in later tests !! + percentToValidator: 50000n, // 5% + poolsPerNode: BigInt(MaxPoolsPerNode), + }) + validatorIds.push(await addValidator(fixture.context, validatorMasterClient, validatorOwnerAccount, config, mbrs.addValidatorMbr)) + poolKeys.push( + await addStakingPool( + fixture.context, + validatorMasterClient, + validatorIds[0], + 1, + validatorOwnerAccount, + mbrs.addPoolMbr, + mbrs.poolInitMbr, + ), + ) + validatorIds.push(await addValidator(fixture.context, validatorMasterClient, validatorOwnerAccount, config, mbrs.addValidatorMbr)) + poolKeys.push( + await addStakingPool( + fixture.context, + validatorMasterClient, + validatorIds[1], + 1, + validatorOwnerAccount, + mbrs.addPoolMbr, + mbrs.poolInitMbr, + ), + ) }) // Stake to validator 1, then stake to validator 2, then unstake all from validator 1 then stake again to // validator 2. With bug present, validator 2 will be listed twice in staker pool set and should fail this test test('stakeUnstakeReproduce', async () => { - const stakerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.MicroAlgos(MaxAlgoPerPool + AlgoAmount.Algos(4000).microAlgos), - suppressLog: true, - }) - const stakeAmt = AlgoAmount.MicroAlgos( - AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(Number(stakerMbr)).microAlgos, - ) - let [poolKey] = await addStake( - fixture.context, - validatorMasterClient, - validatorIds[0], - stakerAccount, - stakeAmt, - 0n, - ) - expect(poolKey.id).toEqual(poolKeys[0].id) - ;[poolKey] = await addStake( - fixture.context, - validatorMasterClient, - validatorIds[1], - stakerAccount, - stakeAmt, - 0n, - ) - expect(poolKey.id).toEqual(poolKeys[1].id) - - let stakerPools = await getStakedPoolsForAccount(validatorMasterClient, stakerAccount) - expect(stakerPools).toHaveLength(2) - expect(stakerPools[0].id).toEqual(poolKeys[0].id) - expect(stakerPools[1].id).toEqual(poolKeys[1].id) - - expect(stakerPools[0].poolAppId).toEqual(poolKeys[0].poolAppId) - expect(stakerPools[1].poolAppId).toEqual(poolKeys[1].poolAppId) - - // now unstake all from validator 1 - const val1Pool = new StakingPoolClient( - { sender: stakerAccount, resolveBy: 'id', id: poolKeys[0].poolAppId }, - fixture.context.algod, - ) - - await removeStake(val1Pool, stakerAccount, AlgoAmount.Algos(0)) - stakerPools = await getStakedPoolsForAccount(validatorMasterClient, stakerAccount) - expect(stakerPools).toHaveLength(1) - expect(stakerPools[0].id).toEqual(poolKeys[1].id) - - // stake more - but to validator 2 - prior bug would add 'new' entry in first internal slot - ;[poolKey] = await addStake( - fixture.context, - validatorMasterClient, - validatorIds[1], - stakerAccount, - stakeAmt, - 0n, - ) - expect(poolKey.id).toEqual(poolKeys[1].id) - - // with prior bug this will fail because validator 2 would be added 'again' in first internal slot - stakerPools = await getStakedPoolsForAccount(validatorMasterClient, stakerAccount) - expect(stakerPools).toHaveLength(1) - expect(stakerPools[0].id).toEqual(poolKeys[1].id) - }) -}) - -// Remove skip when want to do full pool (200 stakers) testing -describe.skip('ValidatorWFullPoolWRewards', () => { - beforeEach(fixture.beforeEach) - beforeEach(logs.beforeEach) - afterEach(logs.afterEach) - + const stakerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.MicroAlgos(MaxAlgoPerPool + AlgoAmount.Algos(4000).microAlgos), + suppressLog: true, + }) + const stakeAmt = AlgoAmount.MicroAlgos(AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(mbrs.addStakerMbr).microAlgos) + let [poolKey] = await addStake(fixture.context, validatorMasterClient, validatorIds[0], stakerAccount, stakeAmt, 0n) + expect(poolKey.id).toEqual(poolKeys[0].id) + ;[poolKey] = await addStake(fixture.context, validatorMasterClient, validatorIds[1], stakerAccount, stakeAmt, 0n) + expect(poolKey.id).toEqual(poolKeys[1].id) + + let stakerPools = await getStakedPoolsForAccount(validatorMasterClient, stakerAccount) + expect(stakerPools).toHaveLength(2) + expect(stakerPools[0].id).toEqual(poolKeys[0].id) + expect(stakerPools[1].id).toEqual(poolKeys[1].id) + + expect(stakerPools[0].poolAppId).toEqual(poolKeys[0].poolAppId) + expect(stakerPools[1].poolAppId).toEqual(poolKeys[1].poolAppId) + + // now unstake all from validator 1 + const val1Pool = stakingPoolFactory.getAppClientById({ appId: poolKeys[0].poolAppId, defaultSender: stakerAccount.addr }) + + await removeStake(val1Pool, stakerAccount, AlgoAmount.Algos(0)) + stakerPools = await getStakedPoolsForAccount(validatorMasterClient, stakerAccount) + expect(stakerPools).toHaveLength(1) + expect(stakerPools[0].id).toEqual(poolKeys[1].id) + + // stake more - but to validator 2 - prior bug would add 'new' entry in first internal slot + ;[poolKey] = await addStake(fixture.context, validatorMasterClient, validatorIds[1], stakerAccount, stakeAmt, 0n) + expect(poolKey.id).toEqual(poolKeys[1].id) + + // with prior bug this will fail because validator 2 would be added 'again' in first internal slot + stakerPools = await getStakedPoolsForAccount(validatorMasterClient, stakerAccount) + expect(stakerPools).toHaveLength(1) + expect(stakerPools[0].id).toEqual(poolKeys[1].id) + }) + }) + + // Remove skip when want to do full pool (200 stakers) testing + describe.skip('ValidatorWFullPoolWRewards', () => { let validatorId: number let validatorOwnerAccount: Account let poolAppId: bigint @@ -3799,706 +3125,607 @@ describe.skip('ValidatorWFullPoolWRewards', () => { let firstPoolClient: StakingPoolClient const PctToValidator = 5 - const NumStakers = MaxStakersPerPool + const NumStakers = Number(MaxStakersPerPool) // add validator and 1 pool for subsequent stake tests beforeAll(async () => { + // Fund a 'validator account' that will be the validator owner. + validatorOwnerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(500), + suppressLog: true, + }) + consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) + + const config = createValidatorConfig({ + owner: validatorOwnerAccount.addr, + manager: validatorOwnerAccount.addr, + minEntryStake: AlgoAmount.Algos(1000).microAlgos, + maxAlgoPerPool: AlgoAmount.Algos(1000 * NumStakers).microAlgos, // this comes into play in later tests !! + percentToValidator: BigInt(PctToValidator * 10000), + validatorCommissionAddress: validatorOwnerAccount.addr, + }) + validatorId = await addValidator(fixture.context, validatorMasterClient, validatorOwnerAccount, config, mbrs.addValidatorMbr) + + // Add new pool - then we'll add stake and verify balances. + firstPoolKey = await addStakingPool( + fixture.context, + validatorMasterClient, + validatorId, + 1, + validatorOwnerAccount, + mbrs.addPoolMbr, + mbrs.poolInitMbr, + ) + // should be [validator id, pool id (1 based)] + expect(firstPoolKey.id).toEqual(BigInt(validatorId)) + expect(firstPoolKey.poolId).toEqual(1n) + + firstPoolClient = stakingPoolFactory.getAppClientById({ appId: firstPoolKey.poolAppId, defaultSender: validatorOwnerAccount.addr }) + + // get the app id via contract call - it should match what we just got back in poolKey[2] + poolAppId = ( + await validatorMasterClient.send.getPoolAppId({ + args: { validatorId: firstPoolKey.id, poolId: firstPoolKey.poolId }, + populateAppCallResources: true, + }) + ).return! + expect(firstPoolKey.poolAppId).toEqual(poolAppId) + + const stateData = await getValidatorState(validatorMasterClient, validatorId) + expect(stateData.numPools).toEqual(1n) + expect(stateData.totalAlgoStaked).toEqual(0n) + expect(stateData.totalStakers).toEqual(0n) + + const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(poolInfo.poolAppId).toEqual(poolAppId) + expect(poolInfo.totalStakers).toEqual(0n) + expect(poolInfo.totalAlgoStaked).toEqual(0n) + }) + + // Creates maxStakersPerPool stakers: + test( + 'addStakers', + async () => { + for (let i = 0; i < NumStakers + 1; i += 1) { + const stakerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(5000), + suppressLog: true, + }) + + // now stake 1000(+mbr), min for this pool - for the first time - which means actual stake amount will be reduced + // by 'first time staker' fee to cover MBR (which goes to VALIDATOR contract account, not staker contract account!) + // we pay the extra here so the final staked amount should be exactly 1000 + const stakeAmount1 = AlgoAmount.MicroAlgos( + AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(mbrs.addStakerMbr).microAlgos, + ) + let stakedPoolKey: ValidatorPoolKey + if (i < NumStakers) { + consoleLogger.info(`adding staker:${i + 1}`) + ;[stakedPoolKey] = await addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmount1, 0n) + } else { + // staker # numStakers + 1 should fail because no pool is available (because we exceeded max algo) + await expect( + addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmount1, 0n), + ).rejects.toThrowError() + continue + } + // should match info from first staking pool + expect(stakedPoolKey.id).toEqual(firstPoolKey.id) + expect(stakedPoolKey.poolId).toEqual(firstPoolKey.poolId) + expect(stakedPoolKey.poolAppId).toEqual(firstPoolKey.poolAppId) + + const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + expect(poolInfo.totalStakers).toEqual(i + 1) + expect(poolInfo.totalAlgoStaked).toEqual(stakeAmount1.microAlgos - mbrs.addStakerMbr * BigInt(i + 1)) + + expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual(BigInt(i + 1)) + } + }, + 4 * 60 * 1000, // 4 mins + ) + + test('testFirstRewards', async () => { + // ensure everyone is completely in the epoch + await incrementRoundNumberBy(fixture.context, 320) + + const origValidatorState = await getValidatorState(validatorMasterClient, validatorId) + const ownerBalance = await fixture.context.algorand.account.getInformation(validatorOwnerAccount.addr) + const stakersPriorToReward = await getStakeInfoFromBoxValue(firstPoolClient) + + const reward = AlgoAmount.Algos(2000) + // put some test 'reward' algos into staking pool + await fixture.algorand.send.payment({ + sender: fixture.context.testAccount.addr, + receiver: getApplicationAddress(firstPoolKey.poolAppId), + amount: reward, + }) + + const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) + consoleLogger.info(`pool stakers:${poolInfo.totalStakers}, staked:${poolInfo.totalAlgoStaked}`) + + // Perform epoch payout calculation - we get back how much it cost to issue the txn + const fees = await epochBalanceUpdate(firstPoolClient) + const expectedValidatorReward = (reward.microAlgos * BigInt(PctToValidator)) / 100n + + const newValidatorState = await getValidatorState(validatorMasterClient, validatorId) + const newOwnerBalance = await fixture.context.algorand.account.getInformation(validatorOwnerAccount.addr) + // validator owner should have gotten the expected reward (minus the fees they just paid ofc) + expect(newOwnerBalance.balance.microAlgo).toEqual(ownerBalance.balance.microAlgo - fees.microAlgos + expectedValidatorReward) + + // Verify all the stakers in the pool got what we think they should have + const stakersAfterReward = await getStakeInfoFromBoxValue(firstPoolClient) + + // get time from most recent block to use as + await verifyRewardAmounts( + fixture.context, + reward.microAlgos - expectedValidatorReward, + 0n, + stakersPriorToReward, + stakersAfterReward, + 1, + ) + + // the total staked should have grown as well - reward minus what the validator was paid in their commission + expect(newValidatorState.totalAlgoStaked).toEqual(origValidatorState.totalAlgoStaked + (reward.microAlgos - expectedValidatorReward)) + + const poolBalance = await getPoolAvailBalance(fixture.context, firstPoolKey) + expect(poolBalance).toEqual(newValidatorState.totalAlgoStaked) + }) + }) + + describe('CoinFabrik Audit suggested extra tests', () => { + describe('HI-01 Token Reward Calculation Inconsistent for Partial Stakers', () => { + let validatorId: number + let validatorOwnerAccount: Account + let tokenCreatorAccount: Account + let partialEpochStaker: Account + let partialEpochStaker2: Account + let validatorConfig: ValidatorConfig + let poolAppId: bigint + let firstPoolKey: ValidatorPoolKey + let firstPoolClient: StakingPoolClient + + let rewardTokenId: bigint + const decimals = 0 + const tokenRewardPerPayout = BigInt(1000 * 10 ** decimals) + const epochRoundLength = 4 + + beforeAll(async () => { + // Create a reward token to pay out to stakers + tokenCreatorAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(5000), + suppressLog: true, + }) + rewardTokenId = await createAsset(fixture.context, tokenCreatorAccount, 'Reward Token', 'RWDTOKEN', 100_000, decimals) + // Fund a 'validator account' that will be the validator owner. validatorOwnerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(500), - suppressLog: true, + initialFunds: AlgoAmount.Algos(500), + suppressLog: true, }) consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) - const config = createValidatorConfig({ - owner: validatorOwnerAccount.addr, - manager: validatorOwnerAccount.addr, - minEntryStake: BigInt(AlgoAmount.Algos(1000).microAlgos), - maxAlgoPerPool: BigInt(AlgoAmount.Algos(1000 * NumStakers).microAlgos), // this comes into play in later tests !! - percentToValidator: PctToValidator * 10000, - validatorCommissionAddress: validatorOwnerAccount.addr, + validatorConfig = createValidatorConfig({ + owner: validatorOwnerAccount.addr, + manager: validatorOwnerAccount.addr, + minEntryStake: AlgoAmount.Algos(1000).microAlgos, + validatorCommissionAddress: validatorOwnerAccount.addr, + rewardTokenId, + rewardPerPayout: tokenRewardPerPayout, // 1000 tokens per epoch + epochRoundLength: BigInt(epochRoundLength), }) validatorId = await addValidator( - fixture.context, - validatorMasterClient, - validatorOwnerAccount, - config, - validatorMbr, + fixture.context, + validatorMasterClient, + validatorOwnerAccount, + validatorConfig, + mbrs.addValidatorMbr, ) // Add new pool - then we'll add stake and verify balances. + // first pool needs extra .1 to cover MBR of opted-in reward token ! firstPoolKey = await addStakingPool( - fixture.context, - validatorMasterClient, - validatorId, - 1, - validatorOwnerAccount, - poolMbr, - poolInitMbr, + fixture.context, + validatorMasterClient, + validatorId, + 1, + validatorOwnerAccount, + mbrs.addPoolMbr, + mbrs.poolInitMbr + AlgoAmount.Algos(0.1).microAlgos, ) // should be [validator id, pool id (1 based)] expect(firstPoolKey.id).toEqual(BigInt(validatorId)) expect(firstPoolKey.poolId).toEqual(1n) - firstPoolClient = new StakingPoolClient( - { sender: validatorOwnerAccount, resolveBy: 'id', id: firstPoolKey.poolAppId }, - fixture.context.algod, - ) + // now send a bunch of our reward token to the pool ! + await fixture.algorand.send.assetTransfer({ + sender: tokenCreatorAccount.addr, + receiver: getApplicationAddress(firstPoolKey.poolAppId), + assetId: rewardTokenId, + amount: BigInt(5000 * 10 ** decimals), + }) + + firstPoolClient = stakingPoolFactory.getAppClientById({ appId: firstPoolKey.poolAppId, defaultSender: validatorOwnerAccount.addr }) - // get the app id via contract call - it should match what we just got back in poolKey[2] + // get the app id via contract call - it should match what we just got back in the poolKey poolAppId = ( - await validatorMasterClient.getPoolAppId( - { validatorId: firstPoolKey.id, poolId: firstPoolKey.poolId }, - { sendParams: { populateAppCallResources: true } }, - ) + await validatorMasterClient.send.getPoolAppId({ + args: { validatorId: firstPoolKey.id, poolId: firstPoolKey.poolId }, + populateAppCallResources: true, + }) ).return! expect(firstPoolKey.poolAppId).toEqual(poolAppId) - const stateData = await getValidatorState(validatorMasterClient, validatorId) - expect(stateData.numPools).toEqual(1) - expect(stateData.totalAlgoStaked).toEqual(0n) - expect(stateData.totalStakers).toEqual(0n) + // Create stakers for test and opt it reward asset + partialEpochStaker = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(5000), + suppressLog: true, + }) + // stakerAccounts.push(partialEpochStaker) + await fixture.algorand.send.assetOptIn({ sender: partialEpochStaker.addr, assetId: rewardTokenId }) - const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(poolInfo.poolAppId).toEqual(BigInt(poolAppId)) - expect(poolInfo.totalStakers).toEqual(0) - expect(poolInfo.totalAlgoStaked).toEqual(0n) - }) + partialEpochStaker2 = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(5000), + suppressLog: true, + }) + // stakerAccounts.push(partialEpochStaker2) + await fixture.algorand.send.assetOptIn({ sender: partialEpochStaker2.addr, assetId: rewardTokenId }) + }) - // Creates maxStakersPerPool stakers: - test( - 'addStakers', - async () => { - for (let i = 0; i < NumStakers + 1; i += 1) { - const stakerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(5000), - suppressLog: true, - }) - - // now stake 1000(+mbr), min for this pool - for the first time - which means actual stake amount will be reduced - // by 'first time staker' fee to cover MBR (which goes to VALIDATOR contract account, not staker contract account!) - // we pay the extra here so the final staked amount should be exactly 1000 - const stakeAmount1 = AlgoAmount.MicroAlgos( - AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(Number(stakerMbr)).microAlgos, - ) - let stakedPoolKey: ValidatorPoolKey - if (i < NumStakers) { - consoleLogger.info(`adding staker:${i + 1}`) - ;[stakedPoolKey] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - stakeAmount1, - 0n, - ) - } else { - // staker # numStakers + 1 should fail because no pool is available (because we exceeded max algo) - await expect( - addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmount1, 0n), - ).rejects.toThrowError() - continue - } - // should match info from first staking pool - expect(stakedPoolKey.id).toEqual(firstPoolKey.id) - expect(stakedPoolKey.poolId).toEqual(firstPoolKey.poolId) - expect(stakedPoolKey.poolAppId).toEqual(firstPoolKey.poolAppId) - - const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - expect(poolInfo.totalStakers).toEqual(i + 1) - expect(poolInfo.totalAlgoStaked).toEqual( - BigInt(stakeAmount1.microAlgos - Number(stakerMbr)) * BigInt(i + 1), - ) - - expect((await getValidatorState(validatorMasterClient, validatorId)).totalStakers).toEqual( - BigInt(i + 1), - ) - } - }, - 4 * 60 * 1000, // 4 mins - ) + // FAILS - Reflects ISSUE H1-01 + test('Token partial epoch rewards distributed should not affect subsequent distributions during the same epoch update', async () => { + const params = await fixture.context.algod.getTransactionParams().do() - test('testFirstRewards', async () => { - // ensure everyone is completely in the epoch - await incrementRoundNumberBy(fixture.context, 320) + // increment rounds to get to the start of new epoch. This means that staking will occur 1 round after. + await incrementRoundNumberBy(fixture.context, epochRoundLength - (params.firstRound % epochRoundLength)) - const origValidatorState = await getValidatorState(validatorMasterClient, validatorId) - const ownerBalance = await fixture.context.algod.accountInformation(validatorOwnerAccount.addr).do() - const stakersPriorToReward = await getStakeInfoFromBoxValue(firstPoolClient) + // Stake 1000 Algos + MBR + const stakeAmount = AlgoAmount.MicroAlgos(AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(mbrs.addStakerMbr).microAlgos) - const reward = AlgoAmount.Algos(2000) - // put some test 'reward' algos into staking pool - await transferAlgos( - { - from: fixture.context.testAccount, - to: getApplicationAddress(firstPoolKey.poolAppId), - amount: reward, - }, - fixture.context.algod, - ) + // Add stake for first staker - partial epoch + const [aPoolKey] = await addStake(fixture.context, validatorMasterClient, validatorId, partialEpochStaker, stakeAmount, 0n) - const poolInfo = await getPoolInfo(validatorMasterClient, firstPoolKey) - consoleLogger.info(`pool stakers:${poolInfo.totalStakers}, staked:${poolInfo.totalAlgoStaked}`) + // Add stake for partial-epoch staker + const [newPoolKey] = await addStake(fixture.context, validatorMasterClient, validatorId, partialEpochStaker2, stakeAmount, 0n) + + expect(newPoolKey.poolAppId).toEqual(aPoolKey.poolAppId) - // Perform epoch payout calculation - we get back how much it cost to issue the txn - const fees = await epochBalanceUpdate(firstPoolClient) - const expectedValidatorReward = reward.microAlgos * (PctToValidator / 100) + const staker2Info = await getStakerInfo(firstPoolClient, partialEpochStaker) + consoleLogger.info(`partialEpochStaker: new entry round: ${staker2Info.entryRound}`) - const newValidatorState = await getValidatorState(validatorMasterClient, validatorId) - const newOwnerBalance = await fixture.context.algod.accountInformation(validatorOwnerAccount.addr).do() - // validator owner should have gotten the expected reward (minus the fees they just paid ofc) - expect(newOwnerBalance.amount).toEqual(ownerBalance.amount - fees.microAlgos + expectedValidatorReward) + await incrementRoundNumberBy(fixture.context, 320 + epochRoundLength) - // Verify all the stakers in the pool got what we think they should have - const stakersAfterReward = await getStakeInfoFromBoxValue(firstPoolClient) + const stakersPriorToReward = await getStakeInfoFromBoxValue(firstPoolClient) - // get time from most recent block to use as - await verifyRewardAmounts( - fixture.context, - BigInt(reward.microAlgos) - BigInt(expectedValidatorReward), - 0n, - stakersPriorToReward, - stakersAfterReward, - 1, - ) + await epochBalanceUpdate(firstPoolClient) - // the total staked should have grown as well - reward minus what the validator was paid in their commission - expect(Number(newValidatorState.totalAlgoStaked)).toEqual( - Number(origValidatorState.totalAlgoStaked) + (reward.microAlgos - expectedValidatorReward), - ) + const stakersAfterReward = await getStakeInfoFromBoxValue(firstPoolClient) - const poolBalance = await getPoolAvailBalance(fixture.context, firstPoolKey) - expect(poolBalance).toEqual(newValidatorState.totalAlgoStaked) + // Over 1000 rewards tokens, with 2 stakers with 50% of total each, we should get: + // partialEpochStaker (75%) should have: 375 tokens (1000 / 2 * 0.75) + // partialEpochStaker2 (50%) should have: 250 tokens (1000 / 2 * 0.5) + await verifyRewardAmounts(fixture.context, 0n, tokenRewardPerPayout, stakersPriorToReward, stakersAfterReward, epochRoundLength) + }) }) -}) -describe('CoinFabrik Audit suggested extra tests', () => { - describe('HI-01 Token Reward Calculation Inconsistent for Partial Stakers', () => { - beforeEach(fixture.beforeEach) - beforeEach(logs.beforeEach) - afterEach(logs.afterEach) - - let validatorId: number - let validatorOwnerAccount: Account - let tokenCreatorAccount: Account - let partialEpochStaker: Account - let partialEpochStaker2: Account - let validatorConfig: ValidatorConfig - let poolAppId: bigint - let firstPoolKey: ValidatorPoolKey - let firstPoolClient: StakingPoolClient - - let rewardTokenID: bigint - const decimals = 0 - const tokenRewardPerPayout = BigInt(1000 * 10 ** decimals) - const epochRoundLength = 4 - - beforeAll(async () => { - // Create a reward token to pay out to stakers - tokenCreatorAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(5000), - suppressLog: true, - }) - rewardTokenID = await createAsset( - fixture.context.algod, - tokenCreatorAccount, - 'Reward Token', - 'RWDTOKEN', - 100_000, - decimals, - ) - - // Fund a 'validator account' that will be the validator owner. - validatorOwnerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(500), - suppressLog: true, - }) - consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) - - validatorConfig = createValidatorConfig({ - owner: validatorOwnerAccount.addr, - manager: validatorOwnerAccount.addr, - minEntryStake: BigInt(AlgoAmount.Algos(1000).microAlgos), - validatorCommissionAddress: validatorOwnerAccount.addr, - rewardTokenID, - rewardPerPayout: tokenRewardPerPayout, // 1000 tokens per epoch - epochRoundLength, - }) - validatorId = await addValidator( - fixture.context, - validatorMasterClient, - validatorOwnerAccount, - validatorConfig, - validatorMbr, - ) - - // Add new pool - then we'll add stake and verify balances. - // first pool needs extra .1 to cover MBR of opted-in reward token ! - firstPoolKey = await addStakingPool( - fixture.context, - validatorMasterClient, - validatorId, - 1, - validatorOwnerAccount, - poolMbr, - poolInitMbr + BigInt(AlgoAmount.Algos(0.1).microAlgos), - ) - // should be [validator id, pool id (1 based)] - expect(firstPoolKey.id).toEqual(BigInt(validatorId)) - expect(firstPoolKey.poolId).toEqual(1n) - - // now send a bunch of our reward token to the pool ! - await transferAsset( - { - from: tokenCreatorAccount, - to: getApplicationAddress(firstPoolKey.poolAppId), - assetId: Number(rewardTokenID), - amount: 5000 * 10 ** decimals, - }, - fixture.context.algod, - ) - - firstPoolClient = new StakingPoolClient( - { sender: validatorOwnerAccount, resolveBy: 'id', id: firstPoolKey.poolAppId }, - fixture.context.algod, - ) - - // get the app id via contract call - it should match what we just got back in the poolKey - poolAppId = ( - await validatorMasterClient.getPoolAppId( - { validatorId: firstPoolKey.id, poolId: firstPoolKey.poolId }, - { sendParams: { populateAppCallResources: true } }, - ) - ).return! - expect(firstPoolKey.poolAppId).toEqual(poolAppId) - - // Create stakers for test and opt it reward asset - partialEpochStaker = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(5000), - suppressLog: true, - }) - // stakerAccounts.push(partialEpochStaker) - await assetOptIn({ account: partialEpochStaker, assetId: Number(rewardTokenID) }, fixture.context.algod) + describe('ME-02 Incorrect Validator SunsettingOn Verification', () => { + let validatorId: number + let validatorOwnerAccount: Account + let stakerAccount: Account + let newSunset: number - partialEpochStaker2 = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(5000), - suppressLog: true, - }) - // stakerAccounts.push(partialEpochStaker2) - await assetOptIn({ account: partialEpochStaker2, assetId: Number(rewardTokenID) }, fixture.context.algod) + beforeAll(async () => { + // Fund a 'validator account' that will be the validator owner. + validatorOwnerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(500), + suppressLog: true, + }) + consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) + + const config = createValidatorConfig({ + owner: validatorOwnerAccount.addr, + manager: validatorOwnerAccount.addr, + minEntryStake: AlgoAmount.Algos(1000).microAlgos, + validatorCommissionAddress: validatorOwnerAccount.addr, }) - // FAILS - Reflects ISSUE H1-01 - test('Token partial epoch rewards distributed should not affect subsequent distributions during the same epoch update', async () => { - const params = await fixture.context.algod.getTransactionParams().do() + validatorId = await addValidator(fixture.context, validatorMasterClient, validatorOwnerAccount, config, mbrs.addValidatorMbr) - // increment rounds to get to the start of new epoch. This means that staking will occur 1 round after. - await incrementRoundNumberBy(fixture.context, epochRoundLength - (params.firstRound % epochRoundLength)) + await addStakingPool( + fixture.context, + validatorMasterClient, + validatorId, + 1, + validatorOwnerAccount, + mbrs.addPoolMbr, + mbrs.poolInitMbr, + ) - // Stake 1000 Algos + MBR - const stakeAmount = AlgoAmount.MicroAlgos( - AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(Number(stakerMbr)).microAlgos, - ) + // set sunset 1 round after now + newSunset = (await fixture.context.algod.getTransactionParams().do()).firstRound + 1 - // Add stake for first staker - partial epoch - const [aPoolKey] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - partialEpochStaker, - stakeAmount, - 0n, - ) - - // Add stake for partial-epoch staker - const [newPoolKey] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - partialEpochStaker2, - stakeAmount, - 0n, - ) + await validatorMasterClient + .newGroup() + .changeValidatorSunsetInfo({ + args: { validatorId, sunsettingOn: newSunset, sunsettingTo: validatorId }, + sender: validatorOwnerAccount.addr, + }) + .send({ populateAppCallResources: true, suppressLog: true }) - expect(newPoolKey.poolAppId).toEqual(aPoolKey.poolAppId) + const newConfig = await validatorMasterClient + .newGroup() + .getValidatorConfig({ args: { validatorId }, sender: validatorOwnerAccount.addr }) + .send({ populateAppCallResources: true, suppressLog: true }) - const staker2Info = await getStakerInfo(firstPoolClient, partialEpochStaker) - consoleLogger.info(`partialEpochStaker: new entry round: ${staker2Info.entryRound}`) + // Check changes have been registered + expect(newConfig.returns[0]!.sunsettingOn).toEqual(BigInt(newSunset)) - await incrementRoundNumberBy(fixture.context, 320 + epochRoundLength) + // Fund a 'staker account' that will be the new 'staker' + stakerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(5000), + suppressLog: true, + }) + }) - const stakersPriorToReward = await getStakeInfoFromBoxValue(firstPoolClient) + // FAILS - Reflects ISSUE ME-02 + test('Cannot stake after sunsetting', async () => { + // Increment rounds to go beyond validator's sunset + await incrementRoundNumberBy(fixture.context, 3) - await epochBalanceUpdate(firstPoolClient) + // Let's check that we are past the new sunset value + expect(newSunset).toBeLessThan((await fixture.context.algod.getTransactionParams().do()).firstRound) - const stakersAfterReward = await getStakeInfoFromBoxValue(firstPoolClient) + const stakeAmount = AlgoAmount.MicroAlgos(AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(mbrs.addStakerMbr).microAlgos) - // Over 1000 rewards tokens, with 2 stakers with 50% of total each, we should get: - // partialEpochStaker (75%) should have: 375 tokens (1000 / 2 * 0.75) - // partialEpochStaker2 (50%) should have: 250 tokens (1000 / 2 * 0.5) - await verifyRewardAmounts( - fixture.context, - 0n, - BigInt(tokenRewardPerPayout), - stakersPriorToReward, - stakersAfterReward, - epochRoundLength, - ) - }) + // Staking should throw since we are past the validator's sunset + await expect(addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmount, 0n)).rejects.toThrowError() + }) }) - describe('ME-02 Incorrect Validator SunsettingOn Verification', () => { - beforeEach(fixture.beforeEach) - beforeEach(logs.beforeEach) - afterEach(logs.afterEach) - - let validatorId: number - let validatorOwnerAccount: Account - let stakerAccount: Account - let newSunset: number - - beforeAll(async () => { - // Fund a 'validator account' that will be the validator owner. - validatorOwnerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(500), - suppressLog: true, - }) - consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) + describe('ME-03 Incentivizing Pool Saturation for Staker Gain', () => { + let validatorId: number - const config = createValidatorConfig({ - owner: validatorOwnerAccount.addr, - manager: validatorOwnerAccount.addr, - minEntryStake: BigInt(AlgoAmount.Algos(1000).microAlgos), - validatorCommissionAddress: validatorOwnerAccount.addr, - }) + let validatorOwnerAccount: Account + let stakerAccount: Account + let validatorConfig: ValidatorConfig + const pools: ValidatorPoolKey[] = [] - validatorId = await addValidator( - fixture.context, - validatorMasterClient, - validatorOwnerAccount, - config, - validatorMbr, - ) + let pool0Client: StakingPoolClient + let pool1Client: StakingPoolClient - await addStakingPool( - fixture.context, - validatorMasterClient, - validatorId, - 1, - validatorOwnerAccount, - poolMbr, - poolInitMbr, - ) - - // set sunset 1 round after now - newSunset = (await fixture.context.algod.getTransactionParams().do()).firstRound + 1 - - await validatorMasterClient - .compose() - .changeValidatorSunsetInfo( - { validatorId, sunsettingOn: newSunset, sunsettingTo: validatorId }, - { sender: validatorOwnerAccount }, - ) - .execute({ populateAppCallResources: true, suppressLog: true }) - - const newConfig = await validatorMasterClient - .compose() - .getValidatorConfig({ validatorId }, { sender: validatorOwnerAccount }) - .execute({ populateAppCallResources: true, suppressLog: true }) - - // Check changes have been registered - expect(new ValidatorConfig(...newConfig.returns).sunsettingOn).toEqual(BigInt(newSunset)) - - // Fund a 'staker account' that will be the new 'staker' - stakerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(5000), - suppressLog: true, - }) - }) + const PctToValidator = 5 + const epochRoundLength = 4 + const rewardAmount = AlgoAmount.Algos(200).microAlgos + const expectedValidatorReward = (rewardAmount * BigInt(PctToValidator)) / 100n + const expectedNotSaturatedReward = rewardAmount - expectedValidatorReward - // FAILS - Reflects ISSUE ME-02 - test('Cannot stake after sunsetting', async () => { - // Increment rounds to go beyond validator's sunset - await incrementRoundNumberBy(fixture.context, 3) + // add validator and 3 pools for subsequent stake tests + beforeAll(async () => { + // Fund a 'validator account' that will be the validator owner. + validatorOwnerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(500), + suppressLog: true, + }) + consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) - // Let's check that we are past the new sunset value - expect(newSunset).toBeLessThan((await fixture.context.algod.getTransactionParams().do()).firstRound) + validatorConfig = createValidatorConfig({ + owner: validatorOwnerAccount.addr, + manager: validatorOwnerAccount.addr, + minEntryStake: AlgoAmount.Algos(1000).microAlgos, + percentToValidator: BigInt(PctToValidator * 10000), // 5 % + validatorCommissionAddress: validatorOwnerAccount.addr, + epochRoundLength: BigInt(epochRoundLength), + }) + validatorId = await addValidator( + fixture.context, + validatorMasterClient, + validatorOwnerAccount, + validatorConfig, + mbrs.addValidatorMbr, + ) - const stakeAmount = AlgoAmount.MicroAlgos( - AlgoAmount.Algos(1000).microAlgos + AlgoAmount.MicroAlgos(Number(stakerMbr)).microAlgos, - ) + // Get amount considered saturated from constraints (based on prior hardcoded 200m saturated or + // network template ensuring only 20% of stake is online) and create 3 pools. + // as may need at least three pools to reach saturation + // (ie: 136-200m Algos saturation level, 70m hardcap maxAllowedPerPool) + for (let i = 0; i < 3; i += 1) { + pools.push( + await addStakingPool( + fixture.context, + validatorMasterClient, + validatorId, + 1, + validatorOwnerAccount, + mbrs.addPoolMbr, + mbrs.poolInitMbr, + ), + ) + } - // Staking should throw since we are past the validator's sunset - await expect( - addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmount, 0n), - ).rejects.toThrowError() + const rewardSender = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.MicroAlgos(rewardAmount * 2n + 2_000_000n), + suppressLog: true, }) - }) - describe('ME-03 Incentivizing Pool Saturation for Staker Gain', () => { - beforeEach(fixture.beforeEach) - beforeEach(logs.beforeEach) - afterEach(logs.afterEach) - - let validatorId: number - - let validatorOwnerAccount: Account - let stakerAccount: Account - let validatorConfig: ValidatorConfig - const pools: ValidatorPoolKey[] = [] - - let pool0Client: StakingPoolClient - let pool1Client: StakingPoolClient - - const PctToValidator = 5 - const epochRoundLength = 4 - const rewardAmount = AlgoAmount.Algos(200).microAlgos - const expectedValidatorReward = rewardAmount * (PctToValidator / 100) - const expectedNotSaturatedReward = rewardAmount - expectedValidatorReward - - // add validator and 3 pools for subsequent stake tests - beforeAll(async () => { - // Fund a 'validator account' that will be the validator owner. - validatorOwnerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(500), - suppressLog: true, - }) - consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) - - validatorConfig = createValidatorConfig({ - owner: validatorOwnerAccount.addr, - manager: validatorOwnerAccount.addr, - minEntryStake: BigInt(AlgoAmount.Algos(1000).microAlgos), - percentToValidator: PctToValidator * 10000, // 5 % - validatorCommissionAddress: validatorOwnerAccount.addr, - epochRoundLength, - }) - validatorId = await addValidator( - fixture.context, - validatorMasterClient, - validatorOwnerAccount, - validatorConfig, - validatorMbr, - ) - - // Get amount considered saturated from constraints (based on prior hardcoded 200m saturated or - // network template ensuring only 20% of stake is online) and create 3 pools. - // as may need at least three pools to reach saturation - // (ie: 136-200m Algos saturation level, 70m hardcap maxAllowedPerPool) - for (let i = 0; i < 3; i += 1) { - pools.push( - await addStakingPool( - fixture.context, - validatorMasterClient, - validatorId, - 1, - validatorOwnerAccount, - poolMbr, - poolInitMbr, - ), - ) - } - - const rewardSender = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.MicroAlgos(rewardAmount * 2 + 2e6), - suppressLog: true, - }) + // Send 200 Algos rewards to pool 0 & 1 + for (let i = 0; i < 2; i += 1) { + await fixture.algorand.send.payment({ + sender: rewardSender.addr, + receiver: getApplicationAddress(pools[i].poolAppId), + amount: AlgoAmount.MicroAlgos(rewardAmount), + }) + } - // Send 200 Algos rewards to pool 0 & 1 - for (let i = 0; i < 2; i += 1) { - await transferAlgos( - { - from: rewardSender, - to: getApplicationAddress(pools[i].poolAppId), - amount: AlgoAmount.MicroAlgos(rewardAmount), - }, - fixture.context.algod, - ) - } - - pool0Client = new StakingPoolClient( - { sender: validatorOwnerAccount, resolveBy: 'id', id: pools[0].poolAppId }, - fixture.context.algod, - ) - - pool1Client = new StakingPoolClient( - { sender: validatorOwnerAccount, resolveBy: 'id', id: pools[1].poolAppId }, - fixture.context.algod, - ) - - stakerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(210e6), - suppressLog: true, - }) + pool0Client = stakingPoolFactory.getAppClientById({ appId: pools[0].poolAppId, defaultSender: validatorOwnerAccount.addr }) + + pool1Client = stakingPoolFactory.getAppClientById({ appId: pools[0].poolAppId, defaultSender: validatorOwnerAccount.addr }) + + stakerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(210e6), + suppressLog: true, + }) - // Transfer min bal to fee sink - await transferAlgos( - { - from: validatorOwnerAccount, - to: FEE_SINK_ADDR, - amount: AlgoAmount.Algos(0.1), - }, - fixture.context.algod, - ) + // Transfer min bal to fee sink + await fixture.algorand.send.payment({ + sender: validatorOwnerAccount.addr, + receiver: FEE_SINK_ADDR, + amount: AlgoAmount.Algos(0.1), }) + }) - // FAILS - Reflects ISSUE ME-03 - test('Saturation should not benefit stakers', async () => { - // First, let's take the validator just below saturation and updateRewards. - // Then, take the validator just over saturation, updateRewards and compare what stakers get in each case. - // first lets make sure AVM 'online stake numbers' match for algo movement we've made prior to this test - // increment by 320 rounds so AVM's view of online stake matches current balances. - await incrementRoundNumberBy(fixture.context, 320) + // FAILS - Reflects ISSUE ME-03 + test('Saturation should not benefit stakers', async () => { + // First, let's take the validator just below saturation and updateRewards. + // Then, take the validator just over saturation, updateRewards and compare what stakers get in each case. + // first lets make sure AVM 'online stake numbers' match for algo movement we've made prior to this test + // increment by 320 rounds so AVM's view of online stake matches current balances. + await incrementRoundNumberBy(fixture.context, 320) - function minBigInt(x: bigint, y: bigint): bigint { - return x < y ? x : y - } + function minBigInt(x: bigint, y: bigint): bigint { + return x < y ? x : y + } - const constraints = await getProtocolConstraints(validatorMasterClient) - const amtPerPool = minBigInt(constraints.MaxAlgoPerPool, constraints.AmtConsideredSaturated / 3n) + const constraints = await getProtocolConstraints(validatorMasterClient) + const amtPerPool = minBigInt(constraints.maxAlgoPerPool, constraints.amtConsideredSaturated / 3n) - const stakeAmounts: AlgoAmount[] = [] - stakeAmounts.push(AlgoAmount.MicroAlgos(Number(amtPerPool + stakerMbr))) - stakeAmounts.push(AlgoAmount.MicroAlgos(Number(amtPerPool))) + const stakeAmounts: AlgoAmount[] = [] + stakeAmounts.push(AlgoAmount.MicroAlgos(amtPerPool + mbrs.addStakerMbr)) + stakeAmounts.push(AlgoAmount.MicroAlgos(amtPerPool)) - for (let i = 0; i < 2; i += 1) { - await addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmounts[i], 0n) - } - expect((await getValidatorState(validatorMasterClient, validatorId)).totalAlgoStaked).toBeLessThan( - constraints.AmtConsideredSaturated, - ) + for (let i = 0; i < 2; i += 1) { + await addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, stakeAmounts[i], 0n) + } + expect((await getValidatorState(validatorMasterClient, validatorId)).totalAlgoStaked).toBeLessThan( + constraints.amtConsideredSaturated, + ) - // Pool 0 & Pool 1 have the same amount staked. Both have rewards for 200 Algos. - // Let's compare their rewards if pool 0 receives their rewards before validator gets slightly saturated, and pool 1 after. + // Pool 0 & Pool 1 have the same amount staked. Both have rewards for 200 Algos. + // Let's compare their rewards if pool 0 receives their rewards before validator gets slightly saturated, and pool 1 after. - const pool0BeforeRewards = await getPoolInfo(validatorMasterClient, pools[0]) - const pool1BeforeRewards = await getPoolInfo(validatorMasterClient, pools[1]) - const pool0StakersBeforeReward = await getStakeInfoFromBoxValue(pool0Client) - const pool1StakersBeforeReward = await getStakeInfoFromBoxValue(pool1Client) + const pool0BeforeRewards = await getPoolInfo(validatorMasterClient, pools[0]) + const pool1BeforeRewards = await getPoolInfo(validatorMasterClient, pools[1]) + const pool0StakersBeforeReward = await getStakeInfoFromBoxValue(pool0Client) + const pool1StakersBeforeReward = await getStakeInfoFromBoxValue(pool1Client) - expect(pool0BeforeRewards.totalAlgoStaked).toEqual(pool1BeforeRewards.totalAlgoStaked) - expect(pool0StakersBeforeReward[0].staker).toEqual(pool1StakersBeforeReward[0].staker) - expect(pool0StakersBeforeReward[0].balance).toEqual(pool1StakersBeforeReward[0].balance) + expect(pool0BeforeRewards.totalAlgoStaked).toEqual(pool1BeforeRewards.totalAlgoStaked) + expect(pool0StakersBeforeReward[0].account).toEqual(pool1StakersBeforeReward[0].account) + expect(pool0StakersBeforeReward[0].balance).toEqual(pool1StakersBeforeReward[0].balance) - // make sure all the stakers are considered fully staked... - await incrementRoundNumberBy(fixture.context, 320 + epochRoundLength + epochRoundLength / 2) + // make sure all the stakers are considered fully staked... + await incrementRoundNumberBy(fixture.context, 320 + epochRoundLength + epochRoundLength / 2) - // Distribute rewards to pool 0 WITHOUT saturation - await epochBalanceUpdate(pool0Client) + // Distribute rewards to pool 0 WITHOUT saturation + await epochBalanceUpdate(pool0Client) - const notSaturatedReward = (await getStakeInfoFromBoxValue(pool0Client))[0].totalRewarded + const notSaturatedReward = (await getStakeInfoFromBoxValue(pool0Client))[0].totalRewarded - expect(notSaturatedReward).toEqual(BigInt(expectedNotSaturatedReward)) + expect(notSaturatedReward).toEqual(expectedNotSaturatedReward) - // Now, slightly saturate the validator. Notice that total stake have been increased by rewards distribution - const validatorTotalStakeAfter = (await getValidatorState(validatorMasterClient, validatorId)) - .totalAlgoStaked + // Now, slightly saturate the validator. Notice that total stake have been increased by rewards distribution + const validatorTotalStakeAfter = (await getValidatorState(validatorMasterClient, validatorId)).totalAlgoStaked - // add 2 algo beyond to go into saturation - const amountToSaturation = AlgoAmount.MicroAlgos( - Number(constraints.AmtConsideredSaturated - validatorTotalStakeAfter + 1n), - ) + // add 2 algo beyond to go into saturation + const amountToSaturation = AlgoAmount.MicroAlgos(constraints.amtConsideredSaturated - validatorTotalStakeAfter + 1n) - const [aPoolKey] = await addStake( - fixture.context, - validatorMasterClient, - validatorId, - stakerAccount, - amountToSaturation, - 0n, - ) + const [aPoolKey] = await addStake(fixture.context, validatorMasterClient, validatorId, stakerAccount, amountToSaturation, 0n) - expect(aPoolKey.poolId).toEqual(3n) + expect(aPoolKey.poolId).toEqual(3n) - const validatorTotalStakeAfterSaturation = (await getValidatorState(validatorMasterClient, validatorId)) - .totalAlgoStaked + const validatorTotalStakeAfterSaturation = (await getValidatorState(validatorMasterClient, validatorId)).totalAlgoStaked - expect(validatorTotalStakeAfterSaturation).toEqual( - validatorTotalStakeAfter + BigInt(amountToSaturation.microAlgos), - ) - expect(validatorTotalStakeAfterSaturation).toEqual(constraints.AmtConsideredSaturated + 1n) + expect(validatorTotalStakeAfterSaturation).toEqual(validatorTotalStakeAfter + amountToSaturation.microAlgos) + expect(validatorTotalStakeAfterSaturation).toEqual(constraints.amtConsideredSaturated + 1n) - // Distribute rewards for pool 1 WITH saturation. Not necessary to forward rounds because pool1 has not been updated. - await epochBalanceUpdate(pool1Client) + // Distribute rewards for pool 1 WITH saturation. Not necessary to forward rounds because pool1 has not been updated. + await epochBalanceUpdate(pool1Client) - const saturatedReward = (await getStakeInfoFromBoxValue(pool1Client))[0].totalRewarded + const saturatedReward = (await getStakeInfoFromBoxValue(pool1Client))[0].totalRewarded - // Since staker had the same stake in both pools for 100% of the epoch, - // the reward with the validator saturated should be less or ar least equal - // to the reward with the validator NOT saturated to not incentivize adversary behavior. - expect(saturatedReward).toBeLessThanOrEqual(notSaturatedReward) - }) - }) + // Since staker had the same stake in both pools for 100% of the epoch, + // the reward with the validator saturated should be less or ar least equal + // to the reward with the validator NOT saturated to not incentivize adversary behavior. + expect(saturatedReward).toBeLessThanOrEqual(notSaturatedReward) + }) + }, 20_000) describe('MI-05 Inconsistent Configuration Validation', () => { - beforeEach(fixture.beforeEach) - beforeEach(logs.beforeEach) - afterEach(logs.afterEach) - - let validatorId: number - let validatorOwnerAccount: Account - - beforeAll(async () => { - // Fund a 'validator account' that will be the validator owner. - validatorOwnerAccount = await fixture.context.generateAccount({ - initialFunds: AlgoAmount.Algos(500), - suppressLog: true, - }) - consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) + let validatorId: number + let validatorOwnerAccount: Account - const config = createValidatorConfig({ - owner: validatorOwnerAccount.addr, - manager: validatorOwnerAccount.addr, - validatorCommissionAddress: validatorOwnerAccount.addr, - }) + beforeAll(async () => { + // Fund a 'validator account' that will be the validator owner. + validatorOwnerAccount = await fixture.context.generateAccount({ + initialFunds: AlgoAmount.Algos(500), + suppressLog: true, + }) + consoleLogger.info(`validator account ${validatorOwnerAccount.addr}`) - validatorId = await addValidator( - fixture.context, - validatorMasterClient, - validatorOwnerAccount, - config, - validatorMbr, - ) + const config = createValidatorConfig({ + owner: validatorOwnerAccount.addr, + manager: validatorOwnerAccount.addr, + validatorCommissionAddress: validatorOwnerAccount.addr, }) - // FAILS - Reflects ISSUE MI-05 - test('Validator Manager cannot be set to zero address', async () => { - const zeroAddress = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ' + validatorId = await addValidator(fixture.context, validatorMasterClient, validatorOwnerAccount, config, mbrs.addValidatorMbr) + }) - await expect( - validatorMasterClient - .compose() - .changeValidatorManager( - { - validatorId, - manager: zeroAddress, - }, - { sender: validatorOwnerAccount }, - ) - .execute({ populateAppCallResources: true, suppressLog: true }), - ).rejects.toThrowError() - }) + // FAILS - Reflects ISSUE MI-05 + test('Validator Manager cannot be set to zero address', async () => { + const zeroAddress = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ' + + await expect( + validatorMasterClient + .newGroup() + .changeValidatorManager({ + args: { + validatorId, + manager: zeroAddress, + }, + sender: validatorOwnerAccount.addr, + }) + .send({ populateAppCallResources: true, suppressLog: true }), + ).rejects.toThrowError() + }) - // FAILS - Reflects ISSUE MI-05 - test('Entry gating type cannot be > 4', async () => { - const badGatingType = 255 + // FAILS - Reflects ISSUE MI-05 + test('Entry gating type cannot be > 4', async () => { + const badGatingType = 255 - await expect( - validatorMasterClient - .compose() - .changeValidatorRewardInfo( - { - validatorId, - entryGatingType: badGatingType, - entryGatingAddress: validatorOwnerAccount.addr, - entryGatingAssets: [0, 0, 0, 0], - gatingAssetMinBalance: 0, - rewardPerPayout: 0, - }, - { sender: validatorOwnerAccount }, - ) - .execute({ populateAppCallResources: true, suppressLog: true }), - ).rejects.toThrowError() - }) + await expect( + validatorMasterClient + .newGroup() + .changeValidatorRewardInfo({ + args: { + validatorId, + entryGatingType: badGatingType, + entryGatingAddress: validatorOwnerAccount.addr, + entryGatingAssets: [0, 0, 0, 0], + gatingAssetMinBalance: 0, + rewardPerPayout: 0, + }, + sender: validatorOwnerAccount.addr, + }) + .send({ populateAppCallResources: true, suppressLog: true }), + ).rejects.toThrowError() + }) + + // FAILS - Reflects ISSUE MI-05 + // invalid test - sunsetting is timestamp, not round and setting before now is way to instantly sunset which + // may be desired outcome. + test.skip('SunsettingOn cannot be set before now', async () => { + // set the new sunset 1000 rounds before now + const badSunset = (await fixture.context.algod.getTransactionParams().do()).firstRound - 1000 + + await expect( + validatorMasterClient + .newGroup() + .changeValidatorSunsetInfo({ + args: { validatorId, sunsettingOn: badSunset, sunsettingTo: validatorId }, + sender: validatorOwnerAccount.addr, + }) + .send({ populateAppCallResources: true, suppressLog: true }), + ).rejects.toThrowError() + }) }) + }) }) diff --git a/contracts/contracts/clients_new/StakingPoolClient.ts b/contracts/contracts/clients_new/StakingPoolClient.ts new file mode 100644 index 00000000..fa6d39e1 --- /dev/null +++ b/contracts/contracts/clients_new/StakingPoolClient.ts @@ -0,0 +1,1925 @@ +/* eslint-disable */ +// @ts-nocheck +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^7 + */ +import { ABIReturn, AppReturn, SendAppTransactionResult } from '@algorandfoundation/algokit-utils/types/app' +import { Arc56Contract, getArc56ReturnValue } from '@algorandfoundation/algokit-utils/types/app-arc56' +import { + AppClient, + AppClientMethodCallParams, + AppClientParams, + AppClientBareCallParams, + CallOnComplete, + AppClientCompilationParams, + ResolveAppClientByCreatorAndName, + ResolveAppClientByNetwork, +} from '@algorandfoundation/algokit-utils/types/app-client' +import { AppFactory, AppFactoryAppClientParams, AppFactoryResolveAppClientByCreatorAndNameParams, AppFactoryDeployParams, AppFactoryParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import AlgoKitComposer, { AppCallMethodCall, AppMethodCallTransactionArgument, SimulateOptions } from '@algorandfoundation/algokit-utils/types/composer' +import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' +import SimulateResponse = modelsv2.SimulateResponse + +export const APP_SPEC: Arc56Contract = {"name":"StakingPool","desc":"","methods":[{"name":"createApplication","desc":"Initialize the staking pool w/ owner and manager, but can only be created by the validator contract.","args":[{"name":"creatingContractId","type":"uint64","desc":"id of contract that constructed us - the validator application (single global instance)"},{"name":"validatorId","type":"uint64","desc":"id of validator we're a staking pool of"},{"name":"poolId","type":"uint64","desc":"which pool id are we"},{"name":"minEntryStake","type":"uint64","desc":"minimum amount to be in pool, but also minimum amount balance can't go below (without removing all!)"}],"returns":{"type":"void"},"actions":{"create":["NoOp"],"call":[]}},{"name":"gas","desc":"gas is a dummy no-op call that can be used to pool-up resource references and opcode cost","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]}},{"name":"initStorage","desc":"Called after we're created and then funded, so we can create our large stakers ledger storage\nCaller has to get MBR amounts from ValidatorRegistry to know how much to fund us to cover the box storage cost\nIf this is pool 1 AND the validator has specified a reward token, opt-in to that token\nso that the validator can seed the pool with future rewards of that token.","args":[{"name":"mbrPayment","type":"pay","desc":"payment from caller which covers mbr increase of new staking pools' storage"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]}},{"name":"addStake","desc":"Adds stake to the given account.\nCan ONLY be called by the validator contract that created us\nMust receive payment from the validator contract for amount being staked.","args":[{"name":"stakedAmountPayment","type":"pay","desc":"prior payment coming from validator contract to us on behalf of staker."},{"name":"staker","type":"address","desc":"The account adding new stake"}],"returns":{"type":"uint64","desc":"uint64 new 'entry round' round number of stake add"},"actions":{"create":[],"call":["NoOp"]}},{"name":"removeStake","desc":"Removes stake on behalf of caller (removing own stake). If any token rewards exist, those are always sent in\nfull. Also notifies the validator contract for this pools validator of the staker / balance changes.","args":[{"name":"staker","type":"address","desc":"account to remove. normally same as sender, but the validator owner or manager can also call\nthis to remove the specified staker explicitly. The removed stake MUST only go to the staker of course. This is\nso a validator can shut down a poool and refund the stakers. It can also be used to kick out stakers who no longer\nmeet the gating requirements (determined by the node daemon)."},{"name":"amountToUnstake","type":"uint64","desc":"The amount of stake to be removed. Specify 0 to remove all stake."}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]}},{"name":"claimTokens","desc":"Claims all the available reward tokens a staker has available, sending their entire balance to the staker from\npool 1 (either directly, or via validator-pool1 to pay it out)\nAlso notifies the validator contract for this pools validator of the staker / balance changes.","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]}},{"name":"getStakerInfo","desc":"Retrieves the staked information for a given staker.","readonly":true,"args":[{"name":"staker","type":"address","desc":"The address of the staker."}],"returns":{"type":"(address,uint64,uint64,uint64,uint64)","desc":"StakedInfo - The staked information for the given staker.","struct":"StakedInfo"},"actions":{"create":[],"call":["NoOp"]}},{"name":"payTokenReward","desc":"[Internal protocol method] Remove a specified amount of 'community token' rewards for a staker.\nThis can ONLY be called by our validator and only if we're pool 1 - with the token.\nNote: this can also be called by validator as part of OWNER wanting to send the reward tokens\nsomewhere else (ie if they're sunsetting their validator and need the reward tokens back).\nIt's up to the validator to ensure that the balance in rewardTokenHeldBack is honored.","args":[{"name":"staker","type":"address","desc":"the staker account to send rewards to"},{"name":"rewardToken","type":"uint64","desc":"id of reward token (to avoid re-entrancy in calling validator back to get id)"},{"name":"amountToSend","type":"uint64","desc":"amount to send the staker (there is significant trust here(!) - also why only validator can call us"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]}},{"name":"updateAlgodVer","desc":"Update the (honor system) algod version for the node associated to this pool. The node management daemon\nshould compare its current nodes version to the version stored in global state, updating when different.\nThe reti node daemon composes its own version string using format:\nmajor.minor.build branch [commit hash],\nie: 3.22.0 rel/stable [6b508975]\n[ ONLY OWNER OR MANAGER CAN CALL ]","args":[{"name":"algodVer","type":"string","desc":"string representing the algorand node daemon version (reti node daemon composes its own meta version)"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]}},{"name":"epochBalanceUpdate","desc":"Updates the balance of stakers in the pool based on the received 'rewards' (current balance vs known staked balance)\nstakers outstanding balance is adjusted based on their % of stake and time in the current epoch - so that balance\ncompounds over time and staker can remove that amount at will.\nThe validator is paid their percentage each epoch payout.\n\n\nNote: ANYONE can call this.","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]}},{"name":"goOnline","desc":"Registers a staking pool key online against a participation key.\n[ ONLY OWNER OR MANAGER CAN CALL ]","args":[{"name":"feePayment","type":"pay","desc":"payment to cover extra fee of going online if offline - or 0 if not renewal"},{"name":"votePK","type":"byte[]","desc":"The vote public key."},{"name":"selectionPK","type":"byte[]","desc":"The selection public key."},{"name":"stateProofPK","type":"byte[]","desc":"The state proof public key."},{"name":"voteFirst","type":"uint64","desc":"The first vote index."},{"name":"voteLast","type":"uint64","desc":"The last vote index."},{"name":"voteKeyDilution","type":"uint64","desc":"The vote key dilution value."}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]}},{"name":"goOffline","desc":"Marks a staking pool key OFFLINE.\n[ ONLY OWNER OR MANAGER CAN CALL ]","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]}},{"name":"linkToNFD","args":[{"name":"nfdAppId","type":"uint64"},{"name":"nfdName","type":"string"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]}},{"name":"proxiedSetTokenPayoutRatio","desc":"proxiedSetTokenPayoutRatio is meant to be called by pools != 1 - calling US, pool #1\nWe need to verify that we are in fact being called by another of OUR pools (not us)\nand then we'll call the validator on their behalf to update the token payouts","args":[{"name":"poolKey","type":"(uint64,uint64,uint64)","desc":"ValidatorPoolKey tuple","struct":"ValidatorPoolKey"}],"returns":{"type":"(uint64[24],uint64)","struct":"PoolTokenPayoutRatio"},"actions":{"create":[],"call":["NoOp"]}}],"arcs":[4,56],"structs":{"StakedInfo":[{"name":"account","type":"address"},{"name":"balance","type":"uint64"},{"name":"totalRewarded","type":"uint64"},{"name":"rewardTokenBalance","type":"uint64"},{"name":"entryRound","type":"uint64"}],"PoolTokenPayoutRatio":[{"name":"poolPctOfWhole","type":"uint64[24]"},{"name":"updatedForPayout","type":"uint64"}],"ValidatorPoolKey":[{"name":"id","type":"uint64"},{"name":"poolId","type":"uint64"},{"name":"poolAppId","type":"uint64"}]},"state":{"schema":{"global":{"bytes":3,"ints":11},"local":{"bytes":0,"ints":0}},"keys":{"global":{"creatingValidatorContractAppId":{"key":"Y3JlYXRvckFwcA==","keyType":"AVMBytes","valueType":"uint64"},"validatorId":{"key":"dmFsaWRhdG9ySWQ=","keyType":"AVMBytes","valueType":"uint64"},"poolId":{"key":"cG9vbElk","keyType":"AVMBytes","valueType":"uint64"},"numStakers":{"key":"bnVtU3Rha2Vycw==","keyType":"AVMBytes","valueType":"uint64"},"totalAlgoStaked":{"key":"c3Rha2Vk","keyType":"AVMBytes","valueType":"uint64"},"minEntryStake":{"key":"bWluRW50cnlTdGFrZQ==","keyType":"AVMBytes","valueType":"uint64"},"lastPayout":{"key":"bGFzdFBheW91dA==","keyType":"AVMBytes","valueType":"uint64"},"epochNumber":{"key":"ZXBvY2hOdW1iZXI=","keyType":"AVMBytes","valueType":"uint64"},"algodVer":{"key":"YWxnb2RWZXI=","keyType":"AVMBytes","valueType":"byte[]"},"roundsPerDay":{"key":"cm91bmRzUGVyRGF5","keyType":"AVMBytes","valueType":"uint64"},"binRoundStart":{"key":"YmluUm91bmRTdGFydA==","keyType":"AVMBytes","valueType":"uint64"},"stakeAccumulator":{"key":"c3Rha2VBY2N1bXVsYXRvcg==","keyType":"AVMBytes","valueType":"uint128"},"rewardAccumulator":{"key":"cmV3YXJkQWNjdW11bGF0b3I=","keyType":"AVMBytes","valueType":"uint64"},"weightedMovingAverage":{"key":"ZXdtYQ==","keyType":"AVMBytes","valueType":"uint128"}},"local":{},"box":{"stakers":{"key":"c3Rha2Vycw==","keyType":"AVMBytes","valueType":"(address,uint64,uint64,uint64,uint64)[200]"}}},"maps":{"global":{},"local":{},"box":{}}},"bareActions":{"create":[],"call":[]},"sourceInfo":{"approval":[{"teal":1,"source":37,"pc":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293]},{"teal":9,"source":37,"pc":[294,295]},{"teal":10,"source":37,"pc":[296]},{"teal":11,"source":37,"pc":[297,298]},{"teal":18,"source":37,"pc":[299,300]},{"teal":19,"source":37,"pc":[301]},{"teal":20,"source":37,"pc":[302]},{"teal":21,"source":37,"pc":[303]},{"teal":22,"source":37,"pc":[304,305]},{"teal":23,"source":37,"pc":[306]},{"teal":24,"source":37,"pc":[307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332]},{"teal":28,"source":37,"errorMessage":"The requested action is not implemented in this contract. Are you using the correct OnComplete? Did you set your app ID?","pc":[333]},{"teal":33,"source":101,"pc":[334,335,336]},{"teal":34,"source":101,"pc":[337]},{"teal":37,"source":101,"pc":[338,339,340]},{"teal":38,"source":101,"pc":[341]},{"teal":41,"source":101,"pc":[342,343,344]},{"teal":42,"source":101,"pc":[345]},{"teal":45,"source":101,"pc":[346,347,348]},{"teal":46,"source":101,"pc":[349]},{"teal":49,"source":101,"pc":[350,351,352]},{"teal":50,"source":101,"pc":[353]},{"teal":51,"source":101,"pc":[354]},{"teal":61,"source":101,"pc":[355,356,357]},{"teal":66,"source":102,"pc":[358,359]},{"teal":67,"source":102,"pc":[360]},{"teal":68,"source":102,"pc":[361]},{"teal":69,"source":102,"pc":[362,363,364]},{"teal":74,"source":104,"pc":[365,366]},{"teal":75,"source":104,"pc":[367]},{"teal":76,"source":104,"pc":[368]},{"teal":77,"source":104,"pc":[369]},{"teal":81,"source":105,"pc":[370,371]},{"teal":82,"source":105,"pc":[372]},{"teal":83,"source":105,"pc":[373]},{"teal":84,"source":105,"pc":[374]},{"teal":85,"source":102,"pc":[375,376,377]},{"teal":90,"source":107,"pc":[378,379]},{"teal":91,"source":107,"pc":[380]},{"teal":92,"source":107,"pc":[381]},{"teal":93,"source":107,"pc":[382]},{"teal":97,"source":108,"pc":[383,384]},{"teal":98,"source":108,"pc":[385]},{"teal":99,"source":108,"pc":[386]},{"teal":100,"source":108,"pc":[387]},{"teal":105,"source":110,"pc":[388,389]},{"teal":106,"source":110,"pc":[390,391]},{"teal":107,"source":110,"pc":[392]},{"teal":110,"source":110,"errorMessage":"staking pool must have minimum entry of 1 algo","pc":[393]},{"teal":114,"source":111,"pc":[394]},{"teal":115,"source":111,"pc":[395,396]},{"teal":116,"source":111,"pc":[397]},{"teal":120,"source":112,"pc":[398]},{"teal":121,"source":112,"pc":[399,400]},{"teal":122,"source":112,"pc":[401]},{"teal":126,"source":113,"pc":[402]},{"teal":127,"source":113,"pc":[403,404]},{"teal":128,"source":113,"pc":[405]},{"teal":132,"source":114,"pc":[406,407]},{"teal":133,"source":114,"pc":[408]},{"teal":134,"source":114,"pc":[409]},{"teal":138,"source":115,"pc":[410,411]},{"teal":139,"source":115,"pc":[412]},{"teal":140,"source":115,"pc":[413]},{"teal":144,"source":116,"pc":[414,415]},{"teal":145,"source":116,"pc":[416,417]},{"teal":146,"source":116,"pc":[418]},{"teal":150,"source":117,"pc":[419,420]},{"teal":151,"source":117,"pc":[421,422]},{"teal":152,"source":117,"pc":[423]},{"teal":156,"source":118,"pc":[424,425]},{"teal":157,"source":118,"pc":[426]},{"teal":158,"source":118,"pc":[427]},{"teal":162,"source":120,"pc":[428,429,430]},{"teal":166,"source":121,"pc":[431,432]},{"teal":167,"source":121,"pc":[433,434]},{"teal":168,"source":121,"pc":[435,436]},{"teal":169,"source":121,"pc":[437,438]},{"teal":170,"source":121,"pc":[439]},{"teal":171,"source":121,"pc":[440]},{"teal":172,"source":121,"pc":[441]},{"teal":173,"source":121,"pc":[442]},{"teal":177,"source":122,"pc":[443,444]},{"teal":178,"source":122,"pc":[445,446]},{"teal":179,"source":122,"pc":[447]},{"teal":183,"source":123,"pc":[448,449]},{"teal":184,"source":123,"pc":[450]},{"teal":185,"source":123,"pc":[451]},{"teal":189,"source":124,"pc":[452,453]},{"teal":190,"source":124,"pc":[454,455]},{"teal":191,"source":124,"pc":[456]},{"teal":192,"source":101,"pc":[457]},{"teal":197,"source":130,"pc":[458,459,460]},{"teal":198,"source":130,"pc":[461]},{"teal":199,"source":130,"pc":[462]},{"teal":205,"source":130,"pc":[463,464,465]},{"teal":206,"source":130,"pc":[466]},{"teal":210,"source":132,"pc":[467,468,469]},{"teal":214,"source":136,"pc":[470,471,472]},{"teal":215,"source":136,"pc":[473,474]},{"teal":216,"source":136,"pc":[475,476]},{"teal":217,"source":136,"pc":[477]},{"teal":218,"source":136,"pc":[478]},{"teal":219,"source":132,"pc":[479]},{"teal":224,"source":146,"pc":[480,481]},{"teal":225,"source":146,"pc":[482]},{"teal":226,"source":146,"pc":[483]},{"teal":227,"source":146,"pc":[484]},{"teal":228,"source":146,"pc":[485,486]},{"teal":229,"source":146,"pc":[487]},{"teal":230,"source":146,"pc":[488]},{"teal":233,"source":146,"errorMessage":"argument 0 (mbrPayment) for initStorage must be a pay transaction","pc":[489]},{"teal":236,"source":146,"pc":[490,491,492]},{"teal":237,"source":146,"pc":[493]},{"teal":238,"source":146,"pc":[494]},{"teal":248,"source":146,"pc":[495,496,497]},{"teal":251,"source":146,"pc":[498,499]},{"teal":252,"source":146,"pc":[500,501]},{"teal":256,"source":147,"pc":[502]},{"teal":257,"source":147,"pc":[503]},{"teal":258,"source":147,"pc":[504]},{"teal":259,"source":147,"pc":[505]},{"teal":260,"source":147,"pc":[506]},{"teal":263,"source":147,"errorMessage":"staking pool already initialized","pc":[507]},{"teal":270,"source":150,"pc":[508]},{"teal":271,"source":150,"pc":[509]},{"teal":272,"source":150,"pc":[510,511]},{"teal":273,"source":150,"pc":[512,513]},{"teal":274,"source":150,"pc":[514,515]},{"teal":278,"source":151,"pc":[516]},{"teal":279,"source":151,"pc":[517]},{"teal":280,"source":151,"pc":[518,519]},{"teal":284,"source":152,"pc":[520]},{"teal":285,"source":152,"pc":[521]},{"teal":286,"source":152,"pc":[522]},{"teal":287,"source":152,"pc":[523,524]},{"teal":290,"source":150,"pc":[525]},{"teal":291,"source":150,"pc":[526,527]},{"teal":294,"source":150,"pc":[528]},{"teal":295,"source":150,"pc":[529,530]},{"teal":296,"source":150,"pc":[531]},{"teal":297,"source":150,"pc":[532]},{"teal":298,"source":150,"pc":[533,534]},{"teal":299,"source":150,"pc":[535,536,537]},{"teal":300,"source":150,"pc":[538,539]},{"teal":304,"source":154,"pc":[540,541]},{"teal":305,"source":154,"pc":[542,543,544]},{"teal":306,"source":154,"pc":[545]},{"teal":307,"source":154,"pc":[546]},{"teal":308,"source":154,"pc":[547]},{"teal":309,"source":154,"pc":[548,549]},{"teal":313,"source":155,"pc":[550,551]},{"teal":314,"source":155,"pc":[552]},{"teal":315,"source":155,"pc":[553,554,555]},{"teal":316,"source":155,"pc":[556]},{"teal":317,"source":155,"pc":[557]},{"teal":318,"source":155,"pc":[558]},{"teal":319,"source":155,"pc":[559]},{"teal":320,"source":155,"pc":[560]},{"teal":323,"source":155,"pc":[561,562,563]},{"teal":324,"source":155,"pc":[564,565]},{"teal":325,"source":155,"pc":[566,567,568]},{"teal":328,"source":155,"pc":[569]},{"teal":331,"source":155,"pc":[570,571]},{"teal":338,"source":157,"pc":[572,573]},{"teal":339,"source":158,"pc":[574,575]},{"teal":340,"source":157,"pc":[576]},{"teal":341,"source":159,"pc":[577,578,579]},{"teal":342,"source":159,"pc":[580,581,582]},{"teal":343,"source":158,"pc":[583]},{"teal":344,"source":156,"pc":[584,585]},{"teal":349,"source":162,"pc":[586,587]},{"teal":350,"source":162,"pc":[588,589]},{"teal":351,"source":162,"pc":[590,591]},{"teal":352,"source":162,"pc":[592]},{"teal":355,"source":162,"errorMessage":"transaction verification failed: {\"txn\":\"mbrPayment\",\"field\":\"receiver\",\"expected\":\"this.app.address\"}","pc":[593]},{"teal":358,"source":162,"pc":[594,595]},{"teal":359,"source":162,"pc":[596,597]},{"teal":360,"source":162,"pc":[598,599]},{"teal":361,"source":162,"pc":[600]},{"teal":364,"source":162,"errorMessage":"transaction verification failed: {\"txn\":\"mbrPayment\",\"field\":\"amount\",\"expected\":\"PoolInitMbr\"}","pc":[601]},{"teal":368,"source":163,"pc":[602]},{"teal":369,"source":163,"pc":[603,604,605]},{"teal":370,"source":163,"pc":[606]},{"teal":371,"source":163,"pc":[607]},{"teal":376,"source":165,"pc":[608,609]},{"teal":377,"source":165,"pc":[610]},{"teal":378,"source":165,"pc":[611,612,613]},{"teal":379,"source":165,"pc":[614]},{"teal":380,"source":165,"pc":[615]},{"teal":381,"source":165,"pc":[616]},{"teal":382,"source":165,"pc":[617]},{"teal":383,"source":165,"pc":[618]},{"teal":386,"source":165,"pc":[619,620,621]},{"teal":395,"source":167,"pc":[622]},{"teal":396,"source":167,"pc":[623,624]},{"teal":397,"source":167,"pc":[625,626]},{"teal":401,"source":168,"pc":[627,628]},{"teal":402,"source":168,"pc":[629,630,631]},{"teal":403,"source":168,"pc":[632]},{"teal":404,"source":168,"pc":[633,634]},{"teal":408,"source":169,"pc":[635,636]},{"teal":409,"source":169,"pc":[637,638]},{"teal":413,"source":170,"pc":[639]},{"teal":414,"source":170,"pc":[640,641]},{"teal":417,"source":167,"pc":[642]},{"teal":418,"source":167,"pc":[643,644]},{"teal":421,"source":167,"pc":[645]},{"teal":424,"source":146,"pc":[646]},{"teal":429,"source":185,"pc":[647,648]},{"teal":432,"source":185,"pc":[649,650,651]},{"teal":433,"source":185,"pc":[652]},{"teal":434,"source":185,"pc":[653]},{"teal":435,"source":185,"pc":[654,655]},{"teal":436,"source":185,"pc":[656]},{"teal":439,"source":185,"errorMessage":"argument 0 (staker) for addStake must be a address","pc":[657]},{"teal":442,"source":185,"pc":[658,659]},{"teal":443,"source":185,"pc":[660]},{"teal":444,"source":185,"pc":[661]},{"teal":445,"source":185,"pc":[662]},{"teal":446,"source":185,"pc":[663,664]},{"teal":447,"source":185,"pc":[665]},{"teal":448,"source":185,"pc":[666]},{"teal":451,"source":185,"errorMessage":"argument 1 (stakedAmountPayment) for addStake must be a pay transaction","pc":[667]},{"teal":454,"source":185,"pc":[668,669,670]},{"teal":455,"source":185,"pc":[671]},{"teal":456,"source":185,"pc":[672]},{"teal":457,"source":185,"pc":[673]},{"teal":458,"source":185,"pc":[674]},{"teal":459,"source":185,"pc":[675]},{"teal":472,"source":185,"pc":[676,677,678]},{"teal":475,"source":185,"pc":[679,680]},{"teal":476,"source":185,"pc":[681,682]},{"teal":480,"source":186,"pc":[683]},{"teal":481,"source":186,"pc":[684]},{"teal":482,"source":186,"pc":[685]},{"teal":483,"source":186,"pc":[686]},{"teal":486,"source":186,"errorMessage":"staking pool must be initialized first","pc":[687]},{"teal":493,"source":190,"pc":[688,689]},{"teal":494,"source":190,"pc":[690]},{"teal":495,"source":190,"pc":[691]},{"teal":496,"source":190,"pc":[692,693]},{"teal":497,"source":190,"pc":[694]},{"teal":498,"source":190,"pc":[695]},{"teal":501,"source":189,"errorMessage":"stake can only be added via the validator contract","pc":[696]},{"teal":505,"source":193,"pc":[697,698]},{"teal":506,"source":193,"pc":[699,700]},{"teal":507,"source":193,"pc":[701]},{"teal":508,"source":193,"pc":[702]},{"teal":512,"source":196,"pc":[703,704,705]},{"teal":521,"source":200,"pc":[706,707]},{"teal":522,"source":201,"pc":[708,709]},{"teal":523,"source":201,"pc":[710]},{"teal":524,"source":201,"pc":[711]},{"teal":525,"source":201,"pc":[712,713]},{"teal":526,"source":201,"pc":[714]},{"teal":527,"source":201,"pc":[715]},{"teal":530,"source":201,"errorMessage":"transaction verification failed: {\"txn\":\"stakedAmountPayment\",\"field\":\"sender\",\"expected\":\"this.creatingValidatorContractAppId.value.address\"}","pc":[716]},{"teal":533,"source":200,"pc":[717,718]},{"teal":534,"source":202,"pc":[719,720]},{"teal":535,"source":202,"pc":[721,722]},{"teal":536,"source":202,"pc":[723]},{"teal":539,"source":202,"errorMessage":"transaction verification failed: {\"txn\":\"stakedAmountPayment\",\"field\":\"receiver\",\"expected\":\"this.app.address\"}","pc":[724]},{"teal":542,"source":200,"pc":[725,726]},{"teal":543,"source":203,"pc":[727,728]},{"teal":544,"source":203,"pc":[729,730]},{"teal":545,"source":203,"pc":[731,732]},{"teal":546,"source":203,"pc":[733]},{"teal":549,"source":203,"errorMessage":"transaction verification failed: {\"txn\":\"stakedAmountPayment\",\"field\":\"amount\",\"expected\":\"stakedAmountPayment.amount\"}","pc":[734]},{"teal":553,"source":209,"pc":[735,736]},{"teal":554,"source":209,"pc":[737,738,739]},{"teal":555,"source":209,"pc":[740]},{"teal":556,"source":209,"pc":[741,742]},{"teal":560,"source":210,"pc":[743]},{"teal":561,"source":210,"pc":[744,745]},{"teal":565,"source":212,"pc":[746,747]},{"teal":566,"source":212,"pc":[748]},{"teal":567,"source":212,"pc":[749,750]},{"teal":568,"source":212,"pc":[751,752]},{"teal":569,"source":212,"pc":[753]},{"teal":570,"source":212,"pc":[754,755]},{"teal":571,"source":212,"pc":[756]},{"teal":572,"source":212,"pc":[757]},{"teal":576,"source":214,"pc":[758,759]},{"teal":577,"source":214,"pc":[760]},{"teal":578,"source":214,"pc":[761,762]},{"teal":579,"source":214,"pc":[763]},{"teal":580,"source":214,"pc":[764]},{"teal":581,"source":214,"pc":[765,766]},{"teal":582,"source":214,"pc":[767]},{"teal":583,"source":214,"pc":[768,769]},{"teal":588,"source":215,"pc":[770,771]},{"teal":589,"source":215,"pc":[772]},{"teal":590,"source":216,"pc":[773]},{"teal":591,"source":216,"pc":[774,775]},{"teal":592,"source":216,"pc":[776,777]},{"teal":593,"source":216,"pc":[778]},{"teal":594,"source":216,"pc":[779,780]},{"teal":595,"source":216,"pc":[781]},{"teal":596,"source":216,"pc":[782]},{"teal":597,"source":216,"pc":[783]},{"teal":598,"source":216,"pc":[784]},{"teal":599,"source":216,"pc":[785]},{"teal":600,"source":216,"pc":[786,787]},{"teal":601,"source":216,"pc":[788]},{"teal":604,"source":216,"errorMessage":"this.stakeAccumulator.value + (stakedAmountPayment.amount as uint128) * (roundsLeftInBin as uint128) overflowed 128 bits","pc":[789]},{"teal":605,"source":216,"pc":[790,791]},{"teal":606,"source":216,"pc":[792]},{"teal":607,"source":216,"pc":[793]},{"teal":608,"source":216,"pc":[794]},{"teal":609,"source":216,"pc":[795]},{"teal":610,"source":216,"pc":[796,797]},{"teal":611,"source":216,"pc":[798]},{"teal":612,"source":216,"pc":[799]},{"teal":613,"source":216,"pc":[800]},{"teal":614,"source":215,"pc":[801]},{"teal":618,"source":219,"pc":[802]},{"teal":619,"source":219,"pc":[803,804]},{"teal":624,"source":219,"pc":[805,806]},{"teal":625,"source":219,"pc":[807,808]},{"teal":626,"source":219,"pc":[809]},{"teal":627,"source":219,"pc":[810,811,812]},{"teal":632,"source":220,"pc":[813,814]},{"teal":633,"source":220,"pc":[815,816]},{"teal":634,"source":220,"pc":[817]},{"teal":635,"source":220,"pc":[818,819,820]},{"teal":640,"source":221,"pc":[821]},{"teal":641,"source":221,"pc":[822]},{"teal":642,"source":221,"pc":[823,824]},{"teal":643,"source":221,"pc":[825]},{"teal":644,"source":221,"pc":[826,827]},{"teal":645,"source":221,"pc":[828,829]},{"teal":646,"source":221,"pc":[830]},{"teal":647,"source":221,"pc":[831,832]},{"teal":648,"source":221,"pc":[833,834]},{"teal":649,"source":221,"pc":[835,836]},{"teal":650,"source":221,"pc":[837,838]},{"teal":651,"source":221,"pc":[839]},{"teal":656,"source":223,"pc":[840,841]},{"teal":657,"source":223,"pc":[842]},{"teal":658,"source":223,"pc":[843]},{"teal":659,"source":223,"pc":[844]},{"teal":660,"source":223,"pc":[845]},{"teal":661,"source":223,"pc":[846,847]},{"teal":662,"source":223,"pc":[848]},{"teal":663,"source":223,"pc":[849,850]},{"teal":668,"source":224,"pc":[851,852]},{"teal":669,"source":224,"pc":[853,854,855]},{"teal":670,"source":224,"pc":[856,857]},{"teal":671,"source":224,"pc":[858]},{"teal":672,"source":224,"pc":[859,860,861]},{"teal":677,"source":226,"pc":[862,863]},{"teal":678,"source":226,"pc":[864,865]},{"teal":679,"source":226,"pc":[866,867]},{"teal":680,"source":226,"pc":[868,869,870]},{"teal":681,"source":226,"pc":[871]},{"teal":682,"source":226,"pc":[872,873]},{"teal":683,"source":226,"pc":[874,875]},{"teal":684,"source":226,"pc":[876]},{"teal":685,"source":226,"pc":[877]},{"teal":686,"source":226,"pc":[878]},{"teal":687,"source":226,"pc":[879,880]},{"teal":691,"source":227,"pc":[881,882]},{"teal":692,"source":227,"pc":[883,884]},{"teal":693,"source":227,"pc":[885,886]},{"teal":694,"source":227,"pc":[887]},{"teal":695,"source":227,"pc":[888]},{"teal":696,"source":227,"pc":[889,890]},{"teal":700,"source":230,"pc":[891,892]},{"teal":701,"source":230,"pc":[893]},{"teal":702,"source":230,"pc":[894]},{"teal":703,"source":230,"pc":[895,896]},{"teal":704,"source":230,"pc":[897]},{"teal":705,"source":230,"pc":[898,899]},{"teal":706,"source":230,"pc":[900]},{"teal":710,"source":232,"pc":[901,902]},{"teal":711,"source":232,"pc":[903,904,905]},{"teal":717,"source":234,"pc":[906,907]},{"teal":718,"source":234,"pc":[908]},{"teal":719,"source":234,"pc":[909]},{"teal":720,"source":234,"pc":[910]},{"teal":721,"source":234,"pc":[911,912,913]},{"teal":722,"source":234,"pc":[914,915]},{"teal":723,"source":234,"pc":[916,917,918]},{"teal":724,"source":234,"pc":[919,920]},{"teal":725,"source":234,"pc":[921]},{"teal":726,"source":234,"pc":[922]},{"teal":729,"source":234,"pc":[923,924,925]},{"teal":734,"source":235,"pc":[926,927]},{"teal":735,"source":235,"pc":[928]},{"teal":736,"source":235,"pc":[929]},{"teal":737,"source":235,"pc":[930,931]},{"teal":744,"source":219,"pc":[932,933]},{"teal":745,"source":219,"pc":[934]},{"teal":746,"source":219,"pc":[935]},{"teal":747,"source":219,"pc":[936,937]},{"teal":748,"source":219,"pc":[938,939,940]},{"teal":754,"source":239,"pc":[941,942]},{"teal":755,"source":239,"pc":[943]},{"teal":756,"source":239,"pc":[944]},{"teal":757,"source":239,"pc":[945,946,947]},{"teal":761,"source":241,"errorMessage":"Staking pool full","pc":[948]},{"teal":766,"source":246,"pc":[949,950]},{"teal":767,"source":246,"pc":[951,952]},{"teal":768,"source":246,"pc":[953,954]},{"teal":769,"source":246,"pc":[955]},{"teal":770,"source":246,"pc":[956]},{"teal":773,"source":246,"errorMessage":"must stake at least the minimum for this pool","pc":[957]},{"teal":777,"source":248,"pc":[958,959]},{"teal":778,"source":248,"pc":[960]},{"teal":779,"source":248,"pc":[961]},{"teal":780,"source":248,"pc":[962]},{"teal":781,"source":248,"pc":[963]},{"teal":782,"source":248,"pc":[964]},{"teal":783,"source":248,"pc":[965]},{"teal":784,"source":248,"pc":[966,967]},{"teal":785,"source":248,"pc":[968]},{"teal":786,"source":248,"pc":[969,970]},{"teal":787,"source":248,"pc":[971]},{"teal":788,"source":248,"pc":[972,973]},{"teal":789,"source":248,"pc":[974]},{"teal":790,"source":248,"pc":[975]},{"teal":800,"source":249,"pc":[976,977]},{"teal":801,"source":249,"pc":[978]},{"teal":802,"source":249,"pc":[979]},{"teal":803,"source":249,"pc":[980]},{"teal":804,"source":249,"pc":[981]},{"teal":805,"source":250,"pc":[982,983]},{"teal":806,"source":251,"pc":[984,985]},{"teal":807,"source":251,"pc":[986,987]},{"teal":808,"source":251,"pc":[988]},{"teal":809,"source":251,"pc":[989]},{"teal":810,"source":252,"pc":[990,991]},{"teal":811,"source":252,"pc":[992]},{"teal":812,"source":253,"pc":[993,994]},{"teal":813,"source":253,"pc":[995]},{"teal":814,"source":254,"pc":[996,997]},{"teal":815,"source":254,"pc":[998]},{"teal":816,"source":254,"pc":[999]},{"teal":817,"source":249,"pc":[1000]},{"teal":818,"source":249,"pc":[1001,1002]},{"teal":819,"source":249,"pc":[1003]},{"teal":823,"source":256,"pc":[1004,1005]},{"teal":824,"source":256,"pc":[1006]},{"teal":825,"source":256,"pc":[1007]},{"teal":826,"source":256,"pc":[1008]},{"teal":827,"source":256,"pc":[1009,1010]},{"teal":828,"source":256,"pc":[1011]},{"teal":829,"source":256,"pc":[1012]},{"teal":833,"source":257,"pc":[1013,1014]},{"teal":837,"source":185,"pc":[1015,1016]},{"teal":840,"source":185,"pc":[1017,1018]},{"teal":841,"source":185,"pc":[1019]},{"teal":846,"source":271,"pc":[1020,1021,1022]},{"teal":847,"source":271,"pc":[1023]},{"teal":850,"source":271,"pc":[1024,1025,1026]},{"teal":851,"source":271,"pc":[1027]},{"teal":852,"source":271,"pc":[1028]},{"teal":853,"source":271,"pc":[1029,1030]},{"teal":854,"source":271,"pc":[1031]},{"teal":857,"source":271,"errorMessage":"argument 1 (staker) for removeStake must be a address","pc":[1032]},{"teal":860,"source":271,"pc":[1033,1034,1035]},{"teal":861,"source":271,"pc":[1036]},{"teal":862,"source":271,"pc":[1037]},{"teal":876,"source":271,"pc":[1038,1039,1040]},{"teal":879,"source":271,"pc":[1041,1042]},{"teal":880,"source":271,"pc":[1043,1044]},{"teal":885,"source":274,"pc":[1045,1046]},{"teal":886,"source":274,"pc":[1047,1048]},{"teal":887,"source":274,"pc":[1049]},{"teal":888,"source":274,"pc":[1050,1051,1052]},{"teal":896,"source":276,"pc":[1053,1054,1055]},{"teal":899,"source":275,"errorMessage":"If staker is not sender in removeStake call, then sender MUST be owner or manager of validator","pc":[1056]},{"teal":904,"source":281,"pc":[1057,1058,1059]},{"teal":908,"source":283,"pc":[1060]},{"teal":909,"source":283,"pc":[1061,1062]},{"teal":914,"source":283,"pc":[1063,1064]},{"teal":915,"source":283,"pc":[1065,1066]},{"teal":916,"source":283,"pc":[1067]},{"teal":917,"source":283,"pc":[1068,1069,1070]},{"teal":922,"source":284,"pc":[1071,1072]},{"teal":923,"source":284,"pc":[1073,1074]},{"teal":924,"source":284,"pc":[1075]},{"teal":925,"source":284,"pc":[1076,1077,1078]},{"teal":930,"source":285,"pc":[1079]},{"teal":931,"source":285,"pc":[1080]},{"teal":932,"source":285,"pc":[1081,1082]},{"teal":933,"source":285,"pc":[1083]},{"teal":934,"source":285,"pc":[1084,1085]},{"teal":935,"source":285,"pc":[1086,1087]},{"teal":936,"source":285,"pc":[1088]},{"teal":937,"source":285,"pc":[1089,1090]},{"teal":938,"source":285,"pc":[1091,1092]},{"teal":939,"source":285,"pc":[1093,1094]},{"teal":940,"source":285,"pc":[1095,1096]},{"teal":941,"source":285,"pc":[1097]},{"teal":946,"source":287,"pc":[1098,1099]},{"teal":947,"source":287,"pc":[1100]},{"teal":948,"source":287,"pc":[1101]},{"teal":949,"source":287,"pc":[1102]},{"teal":950,"source":287,"pc":[1103]},{"teal":951,"source":287,"pc":[1104,1105]},{"teal":952,"source":287,"pc":[1106]},{"teal":953,"source":287,"pc":[1107,1108]},{"teal":958,"source":288,"pc":[1109,1110]},{"teal":959,"source":288,"pc":[1111,1112,1113]},{"teal":960,"source":288,"pc":[1114,1115]},{"teal":961,"source":288,"pc":[1116]},{"teal":962,"source":288,"pc":[1117,1118,1119]},{"teal":968,"source":289,"pc":[1120,1121]},{"teal":969,"source":289,"pc":[1122]},{"teal":970,"source":289,"pc":[1123]},{"teal":971,"source":289,"pc":[1124,1125,1126]},{"teal":976,"source":291,"pc":[1127,1128]},{"teal":977,"source":291,"pc":[1129,1130,1131]},{"teal":978,"source":291,"pc":[1132]},{"teal":979,"source":291,"pc":[1133,1134]},{"teal":985,"source":293,"pc":[1135,1136]},{"teal":986,"source":293,"pc":[1137,1138,1139]},{"teal":987,"source":293,"pc":[1140]},{"teal":988,"source":293,"pc":[1141,1142]},{"teal":989,"source":293,"pc":[1143]},{"teal":990,"source":293,"pc":[1144,1145,1146]},{"teal":994,"source":294,"errorMessage":"Insufficient balance","pc":[1147]},{"teal":999,"source":296,"pc":[1148,1149]},{"teal":1000,"source":296,"pc":[1150,1151]},{"teal":1001,"source":296,"pc":[1152,1153]},{"teal":1002,"source":296,"pc":[1154,1155,1156]},{"teal":1003,"source":296,"pc":[1157]},{"teal":1004,"source":296,"pc":[1158,1159]},{"teal":1005,"source":296,"pc":[1160]},{"teal":1006,"source":296,"pc":[1161]},{"teal":1007,"source":296,"pc":[1162]},{"teal":1008,"source":296,"pc":[1163,1164]},{"teal":1012,"source":297,"pc":[1165,1166]},{"teal":1013,"source":297,"pc":[1167]},{"teal":1014,"source":297,"pc":[1168,1169]},{"teal":1015,"source":297,"pc":[1170]},{"teal":1016,"source":297,"pc":[1171,1172]},{"teal":1017,"source":297,"pc":[1173]},{"teal":1018,"source":297,"pc":[1174]},{"teal":1022,"source":299,"pc":[1175]},{"teal":1023,"source":299,"pc":[1176,1177]},{"teal":1028,"source":300,"pc":[1178,1179]},{"teal":1029,"source":300,"pc":[1180,1181,1182]},{"teal":1030,"source":300,"pc":[1183]},{"teal":1031,"source":300,"pc":[1184]},{"teal":1032,"source":300,"pc":[1185]},{"teal":1033,"source":300,"pc":[1186,1187,1188]},{"teal":1039,"source":302,"pc":[1189]},{"teal":1040,"source":302,"pc":[1190]},{"teal":1041,"source":302,"pc":[1191]},{"teal":1042,"source":302,"pc":[1192]},{"teal":1043,"source":302,"pc":[1193,1194,1195]},{"teal":1051,"source":303,"pc":[1196]},{"teal":1052,"source":303,"pc":[1197]},{"teal":1053,"source":303,"pc":[1198,1199]},{"teal":1054,"source":303,"pc":[1200,1201]},{"teal":1055,"source":303,"pc":[1202,1203]},{"teal":1059,"source":304,"pc":[1204]},{"teal":1060,"source":304,"pc":[1205]},{"teal":1061,"source":304,"pc":[1206,1207]},{"teal":1065,"source":305,"pc":[1208]},{"teal":1066,"source":305,"pc":[1209]},{"teal":1067,"source":305,"pc":[1210]},{"teal":1068,"source":305,"pc":[1211,1212]},{"teal":1071,"source":303,"pc":[1213]},{"teal":1072,"source":303,"pc":[1214,1215]},{"teal":1075,"source":303,"pc":[1216]},{"teal":1076,"source":303,"pc":[1217,1218]},{"teal":1077,"source":303,"pc":[1219]},{"teal":1078,"source":303,"pc":[1220]},{"teal":1079,"source":303,"pc":[1221,1222]},{"teal":1080,"source":303,"pc":[1223,1224,1225]},{"teal":1081,"source":303,"pc":[1226,1227]},{"teal":1089,"source":311,"pc":[1228]},{"teal":1090,"source":311,"pc":[1229,1230]},{"teal":1091,"source":311,"pc":[1231,1232]},{"teal":1095,"source":312,"pc":[1233,1234]},{"teal":1096,"source":312,"pc":[1235,1236,1237]},{"teal":1097,"source":312,"pc":[1238]},{"teal":1098,"source":312,"pc":[1239,1240]},{"teal":1102,"source":313,"pc":[1241,1242]},{"teal":1103,"source":313,"pc":[1243,1244]},{"teal":1107,"source":314,"pc":[1245,1246]},{"teal":1108,"source":314,"pc":[1247,1248,1249]},{"teal":1109,"source":314,"pc":[1250]},{"teal":1110,"source":314,"pc":[1251,1252]},{"teal":1113,"source":311,"pc":[1253]},{"teal":1114,"source":311,"pc":[1254,1255]},{"teal":1117,"source":311,"pc":[1256]},{"teal":1121,"source":316,"pc":[1257,1258]},{"teal":1122,"source":316,"pc":[1259,1260,1261]},{"teal":1123,"source":316,"pc":[1262]},{"teal":1124,"source":316,"pc":[1263,1264]},{"teal":1128,"source":317,"pc":[1265,1266]},{"teal":1129,"source":317,"pc":[1267,1268]},{"teal":1130,"source":317,"pc":[1269,1270]},{"teal":1131,"source":317,"pc":[1271,1272]},{"teal":1132,"source":302,"pc":[1273,1274,1275]},{"teal":1137,"source":322,"pc":[1276,1277]},{"teal":1138,"source":322,"pc":[1278,1279,1280]},{"teal":1139,"source":322,"pc":[1281]},{"teal":1140,"source":322,"pc":[1282,1283]},{"teal":1144,"source":323,"pc":[1284,1285]},{"teal":1145,"source":323,"pc":[1286,1287]},{"teal":1146,"source":323,"pc":[1288,1289]},{"teal":1147,"source":323,"pc":[1290,1291]},{"teal":1157,"source":329,"pc":[1292,1293]},{"teal":1158,"source":329,"pc":[1294,1295,1296]},{"teal":1159,"source":329,"pc":[1297]},{"teal":1160,"source":329,"pc":[1298]},{"teal":1161,"source":329,"pc":[1299]},{"teal":1162,"source":329,"pc":[1300]},{"teal":1163,"source":329,"pc":[1301,1302,1303]},{"teal":1164,"source":329,"pc":[1304,1305]},{"teal":1165,"source":329,"pc":[1306,1307,1308]},{"teal":1166,"source":329,"pc":[1309]},{"teal":1167,"source":329,"pc":[1310,1311]},{"teal":1168,"source":329,"pc":[1312]},{"teal":1169,"source":329,"pc":[1313]},{"teal":1170,"source":329,"pc":[1314]},{"teal":1174,"source":328,"errorMessage":"cannot reduce balance below minimum allowed stake unless all is removed","pc":[1315]},{"teal":1182,"source":336,"pc":[1316]},{"teal":1183,"source":336,"pc":[1317]},{"teal":1184,"source":336,"pc":[1318,1319]},{"teal":1188,"source":337,"pc":[1320,1321]},{"teal":1189,"source":337,"pc":[1322,1323]},{"teal":1193,"source":338,"pc":[1324,1325]},{"teal":1194,"source":338,"pc":[1326,1327]},{"teal":1198,"source":339,"pc":[1328,1329,1330,1331,1332,1333,1334,1335,1336,1337]},{"teal":1199,"source":339,"pc":[1338,1339]},{"teal":1202,"source":336,"pc":[1340]},{"teal":1203,"source":336,"pc":[1341,1342]},{"teal":1206,"source":336,"pc":[1343]},{"teal":1210,"source":341,"pc":[1344]},{"teal":1211,"source":341,"pc":[1345,1346]},{"teal":1216,"source":342,"pc":[1347,1348]},{"teal":1217,"source":342,"pc":[1349,1350,1351]},{"teal":1218,"source":342,"pc":[1352]},{"teal":1219,"source":342,"pc":[1353]},{"teal":1220,"source":342,"pc":[1354]},{"teal":1221,"source":342,"pc":[1355,1356,1357]},{"teal":1226,"source":344,"pc":[1358,1359]},{"teal":1227,"source":344,"pc":[1360]},{"teal":1228,"source":344,"pc":[1361]},{"teal":1229,"source":344,"pc":[1362]},{"teal":1230,"source":344,"pc":[1363,1364]},{"teal":1231,"source":344,"pc":[1365]},{"teal":1232,"source":344,"pc":[1366]},{"teal":1236,"source":345,"pc":[1367,1368]},{"teal":1237,"source":345,"pc":[1369]},{"teal":1238,"source":345,"pc":[1370,1371]},{"teal":1239,"source":345,"pc":[1372]},{"teal":1240,"source":345,"pc":[1373,1374]},{"teal":1244,"source":346,"pc":[1375,1376]},{"teal":1245,"source":346,"pc":[1377,1378]},{"teal":1246,"source":346,"pc":[1379,1380]},{"teal":1247,"source":346,"pc":[1381,1382]},{"teal":1251,"source":347,"pc":[1383,1384]},{"teal":1252,"source":347,"pc":[1385,1386]},{"teal":1253,"source":347,"pc":[1387,1388]},{"teal":1254,"source":347,"pc":[1389,1390]},{"teal":1258,"source":348,"pc":[1391]},{"teal":1259,"source":348,"pc":[1392,1393]},{"teal":1264,"source":351,"pc":[1394,1395]},{"teal":1265,"source":351,"pc":[1396]},{"teal":1266,"source":351,"pc":[1397]},{"teal":1267,"source":351,"pc":[1398,1399]},{"teal":1268,"source":351,"pc":[1400]},{"teal":1269,"source":351,"pc":[1401,1402]},{"teal":1270,"source":351,"pc":[1403]},{"teal":1274,"source":353,"pc":[1404,1405]},{"teal":1275,"source":353,"pc":[1406]},{"teal":1276,"source":353,"pc":[1407,1408]},{"teal":1277,"source":353,"pc":[1409]},{"teal":1278,"source":353,"pc":[1410]},{"teal":1279,"source":353,"pc":[1411,1412]},{"teal":1280,"source":353,"pc":[1413]},{"teal":1281,"source":353,"pc":[1414,1415]},{"teal":1285,"source":354,"pc":[1416,1417]},{"teal":1286,"source":354,"pc":[1418]},{"teal":1287,"source":354,"pc":[1419,1420]},{"teal":1288,"source":354,"pc":[1421]},{"teal":1289,"source":354,"pc":[1422]},{"teal":1290,"source":354,"pc":[1423]},{"teal":1291,"source":354,"pc":[1424]},{"teal":1292,"source":354,"pc":[1425,1426]},{"teal":1293,"source":354,"pc":[1427]},{"teal":1296,"source":354,"errorMessage":"(amountToUnstake as uint128) * (roundsLeftInBin as uint128) overflowed 128 bits","pc":[1428]},{"teal":1297,"source":354,"pc":[1429,1430]},{"teal":1298,"source":354,"pc":[1431]},{"teal":1299,"source":354,"pc":[1432]},{"teal":1300,"source":354,"pc":[1433]},{"teal":1301,"source":354,"pc":[1434]},{"teal":1302,"source":354,"pc":[1435,1436]},{"teal":1303,"source":354,"pc":[1437]},{"teal":1304,"source":354,"pc":[1438]},{"teal":1305,"source":354,"pc":[1439]},{"teal":1306,"source":354,"pc":[1440,1441]},{"teal":1310,"source":355,"pc":[1442,1443]},{"teal":1311,"source":355,"pc":[1444]},{"teal":1312,"source":355,"pc":[1445]},{"teal":1313,"source":355,"pc":[1446,1447]},{"teal":1314,"source":355,"pc":[1448]},{"teal":1315,"source":355,"pc":[1449]},{"teal":1316,"source":355,"pc":[1450]},{"teal":1317,"source":355,"pc":[1451,1452]},{"teal":1318,"source":355,"pc":[1453]},{"teal":1321,"source":355,"errorMessage":"this.stakeAccumulator.value - subtractAmount overflowed 128 bits","pc":[1454]},{"teal":1322,"source":355,"pc":[1455,1456]},{"teal":1323,"source":355,"pc":[1457]},{"teal":1324,"source":355,"pc":[1458]},{"teal":1325,"source":355,"pc":[1459]},{"teal":1326,"source":355,"pc":[1460]},{"teal":1327,"source":355,"pc":[1461,1462]},{"teal":1328,"source":355,"pc":[1463]},{"teal":1329,"source":355,"pc":[1464]},{"teal":1330,"source":355,"pc":[1465]},{"teal":1331,"source":355,"pc":[1466]},{"teal":1344,"source":360,"pc":[1467]},{"teal":1345,"source":360,"pc":[1468]},{"teal":1346,"source":360,"pc":[1469,1470]},{"teal":1347,"source":360,"pc":[1471,1472]},{"teal":1348,"source":360,"pc":[1473,1474]},{"teal":1352,"source":361,"pc":[1475]},{"teal":1353,"source":361,"pc":[1476]},{"teal":1354,"source":361,"pc":[1477,1478]},{"teal":1364,"source":363,"pc":[1479]},{"teal":1365,"source":363,"pc":[1480]},{"teal":1366,"source":363,"pc":[1481]},{"teal":1367,"source":363,"pc":[1482]},{"teal":1368,"source":363,"pc":[1483]},{"teal":1369,"source":363,"pc":[1484]},{"teal":1370,"source":363,"pc":[1485]},{"teal":1371,"source":363,"pc":[1486,1487,1488]},{"teal":1372,"source":363,"pc":[1489]},{"teal":1373,"source":363,"pc":[1490]},{"teal":1374,"source":363,"pc":[1491,1492]},{"teal":1375,"source":364,"pc":[1493,1494]},{"teal":1376,"source":364,"pc":[1495,1496]},{"teal":1377,"source":365,"pc":[1497,1498]},{"teal":1378,"source":365,"pc":[1499]},{"teal":1379,"source":365,"pc":[1500,1501]},{"teal":1380,"source":366,"pc":[1502,1503]},{"teal":1381,"source":366,"pc":[1504]},{"teal":1382,"source":366,"pc":[1505,1506]},{"teal":1383,"source":367,"pc":[1507,1508]},{"teal":1384,"source":367,"pc":[1509,1510]},{"teal":1385,"source":367,"pc":[1511]},{"teal":1386,"source":367,"pc":[1512,1513]},{"teal":1387,"source":367,"pc":[1514]},{"teal":1388,"source":367,"pc":[1515,1516]},{"teal":1391,"source":360,"pc":[1517]},{"teal":1392,"source":360,"pc":[1518,1519]},{"teal":1395,"source":360,"pc":[1520]},{"teal":1399,"source":370,"pc":[1521]},{"teal":1406,"source":283,"pc":[1522,1523]},{"teal":1407,"source":283,"pc":[1524]},{"teal":1408,"source":283,"pc":[1525]},{"teal":1409,"source":283,"pc":[1526,1527]},{"teal":1410,"source":283,"pc":[1528,1529,1530]},{"teal":1414,"source":373,"errorMessage":"account not found","pc":[1531]},{"teal":1415,"source":271,"pc":[1532]},{"teal":1420,"source":381,"pc":[1533,1534,1535]},{"teal":1421,"source":381,"pc":[1536]},{"teal":1422,"source":381,"pc":[1537]},{"teal":1430,"source":381,"pc":[1538,1539,1540]},{"teal":1433,"source":381,"pc":[1541,1542]},{"teal":1434,"source":381,"pc":[1543,1544]},{"teal":1438,"source":385,"pc":[1545,1546]},{"teal":1439,"source":385,"pc":[1547,1548]},{"teal":1443,"source":387,"pc":[1549]},{"teal":1444,"source":387,"pc":[1550,1551]},{"teal":1449,"source":387,"pc":[1552,1553]},{"teal":1450,"source":387,"pc":[1554,1555]},{"teal":1451,"source":387,"pc":[1556]},{"teal":1452,"source":387,"pc":[1557,1558,1559]},{"teal":1457,"source":388,"pc":[1560,1561]},{"teal":1458,"source":388,"pc":[1562,1563]},{"teal":1459,"source":388,"pc":[1564]},{"teal":1460,"source":388,"pc":[1565,1566,1567]},{"teal":1465,"source":389,"pc":[1568]},{"teal":1466,"source":389,"pc":[1569]},{"teal":1467,"source":389,"pc":[1570,1571]},{"teal":1468,"source":389,"pc":[1572]},{"teal":1469,"source":389,"pc":[1573,1574]},{"teal":1470,"source":389,"pc":[1575,1576]},{"teal":1471,"source":389,"pc":[1577]},{"teal":1472,"source":389,"pc":[1578,1579]},{"teal":1473,"source":389,"pc":[1580,1581]},{"teal":1474,"source":389,"pc":[1582,1583]},{"teal":1475,"source":389,"pc":[1584,1585]},{"teal":1476,"source":389,"pc":[1586]},{"teal":1481,"source":391,"pc":[1587,1588]},{"teal":1482,"source":391,"pc":[1589]},{"teal":1483,"source":391,"pc":[1590]},{"teal":1484,"source":391,"pc":[1591]},{"teal":1485,"source":391,"pc":[1592]},{"teal":1486,"source":391,"pc":[1593,1594]},{"teal":1487,"source":391,"pc":[1595]},{"teal":1488,"source":391,"pc":[1596,1597]},{"teal":1493,"source":392,"pc":[1598,1599]},{"teal":1494,"source":392,"pc":[1600,1601,1602]},{"teal":1495,"source":392,"pc":[1603,1604]},{"teal":1496,"source":392,"pc":[1605]},{"teal":1497,"source":392,"pc":[1606,1607,1608]},{"teal":1503,"source":393,"pc":[1609,1610]},{"teal":1504,"source":393,"pc":[1611,1612,1613]},{"teal":1505,"source":393,"pc":[1614]},{"teal":1506,"source":393,"pc":[1615]},{"teal":1507,"source":393,"pc":[1616]},{"teal":1508,"source":393,"pc":[1617,1618,1619]},{"teal":1513,"source":394,"pc":[1620]},{"teal":1518,"source":396,"pc":[1621]},{"teal":1519,"source":396,"pc":[1622,1623]},{"teal":1524,"source":398,"pc":[1624]},{"teal":1525,"source":398,"pc":[1625]},{"teal":1526,"source":398,"pc":[1626]},{"teal":1527,"source":398,"pc":[1627]},{"teal":1528,"source":398,"pc":[1628,1629,1630]},{"teal":1536,"source":399,"pc":[1631]},{"teal":1537,"source":399,"pc":[1632]},{"teal":1538,"source":399,"pc":[1633,1634]},{"teal":1539,"source":399,"pc":[1635,1636]},{"teal":1540,"source":399,"pc":[1637,1638]},{"teal":1544,"source":400,"pc":[1639]},{"teal":1545,"source":400,"pc":[1640]},{"teal":1546,"source":400,"pc":[1641,1642]},{"teal":1550,"source":401,"pc":[1643]},{"teal":1551,"source":401,"pc":[1644]},{"teal":1552,"source":401,"pc":[1645]},{"teal":1553,"source":401,"pc":[1646,1647]},{"teal":1556,"source":399,"pc":[1648]},{"teal":1557,"source":399,"pc":[1649,1650]},{"teal":1560,"source":399,"pc":[1651]},{"teal":1561,"source":399,"pc":[1652,1653]},{"teal":1562,"source":399,"pc":[1654]},{"teal":1563,"source":399,"pc":[1655]},{"teal":1564,"source":399,"pc":[1656,1657]},{"teal":1565,"source":399,"pc":[1658,1659,1660]},{"teal":1566,"source":399,"pc":[1661,1662]},{"teal":1574,"source":406,"pc":[1663]},{"teal":1575,"source":406,"pc":[1664,1665]},{"teal":1576,"source":406,"pc":[1666,1667]},{"teal":1580,"source":407,"pc":[1668,1669]},{"teal":1581,"source":407,"pc":[1670,1671,1672]},{"teal":1582,"source":407,"pc":[1673]},{"teal":1583,"source":407,"pc":[1674,1675]},{"teal":1587,"source":408,"pc":[1676,1677]},{"teal":1588,"source":408,"pc":[1678,1679]},{"teal":1592,"source":409,"pc":[1680,1681]},{"teal":1593,"source":409,"pc":[1682,1683,1684]},{"teal":1594,"source":409,"pc":[1685]},{"teal":1595,"source":409,"pc":[1686,1687]},{"teal":1598,"source":406,"pc":[1688]},{"teal":1599,"source":406,"pc":[1689,1690]},{"teal":1602,"source":406,"pc":[1691]},{"teal":1606,"source":411,"pc":[1692,1693]},{"teal":1607,"source":411,"pc":[1694,1695,1696]},{"teal":1608,"source":411,"pc":[1697]},{"teal":1609,"source":411,"pc":[1698,1699]},{"teal":1613,"source":412,"pc":[1700,1701]},{"teal":1614,"source":412,"pc":[1702,1703]},{"teal":1615,"source":412,"pc":[1704,1705]},{"teal":1616,"source":412,"pc":[1706,1707]},{"teal":1617,"source":398,"pc":[1708,1709,1710]},{"teal":1622,"source":417,"pc":[1711,1712]},{"teal":1623,"source":417,"pc":[1713,1714,1715]},{"teal":1624,"source":417,"pc":[1716]},{"teal":1625,"source":417,"pc":[1717,1718]},{"teal":1629,"source":418,"pc":[1719,1720]},{"teal":1630,"source":418,"pc":[1721,1722]},{"teal":1631,"source":418,"pc":[1723,1724]},{"teal":1632,"source":418,"pc":[1725,1726]},{"teal":1637,"source":422,"pc":[1727,1728]},{"teal":1638,"source":422,"pc":[1729]},{"teal":1639,"source":422,"pc":[1730]},{"teal":1640,"source":422,"pc":[1731,1732]},{"teal":1641,"source":422,"pc":[1733]},{"teal":1642,"source":422,"pc":[1734,1735]},{"teal":1643,"source":422,"pc":[1736]},{"teal":1656,"source":427,"pc":[1737]},{"teal":1657,"source":427,"pc":[1738]},{"teal":1658,"source":427,"pc":[1739,1740]},{"teal":1659,"source":427,"pc":[1741,1742]},{"teal":1660,"source":427,"pc":[1743,1744]},{"teal":1664,"source":428,"pc":[1745]},{"teal":1665,"source":428,"pc":[1746]},{"teal":1666,"source":428,"pc":[1747,1748]},{"teal":1676,"source":430,"pc":[1749]},{"teal":1677,"source":430,"pc":[1750]},{"teal":1678,"source":430,"pc":[1751]},{"teal":1679,"source":430,"pc":[1752]},{"teal":1680,"source":430,"pc":[1753]},{"teal":1681,"source":430,"pc":[1754]},{"teal":1682,"source":430,"pc":[1755]},{"teal":1683,"source":430,"pc":[1756,1757,1758]},{"teal":1684,"source":430,"pc":[1759]},{"teal":1685,"source":430,"pc":[1760]},{"teal":1686,"source":430,"pc":[1761,1762]},{"teal":1687,"source":431,"pc":[1763,1764]},{"teal":1688,"source":431,"pc":[1765,1766]},{"teal":1689,"source":432,"pc":[1767,1768]},{"teal":1690,"source":432,"pc":[1769,1770]},{"teal":1691,"source":433,"pc":[1771,1772]},{"teal":1692,"source":433,"pc":[1773]},{"teal":1693,"source":433,"pc":[1774,1775]},{"teal":1694,"source":434,"pc":[1776]},{"teal":1695,"source":434,"pc":[1777,1778]},{"teal":1696,"source":434,"pc":[1779]},{"teal":1697,"source":434,"pc":[1780,1781]},{"teal":1698,"source":434,"pc":[1782]},{"teal":1699,"source":434,"pc":[1783,1784]},{"teal":1702,"source":427,"pc":[1785]},{"teal":1703,"source":427,"pc":[1786,1787]},{"teal":1706,"source":427,"pc":[1788]},{"teal":1710,"source":437,"pc":[1789]},{"teal":1717,"source":387,"pc":[1790,1791]},{"teal":1718,"source":387,"pc":[1792]},{"teal":1719,"source":387,"pc":[1793]},{"teal":1720,"source":387,"pc":[1794,1795]},{"teal":1721,"source":387,"pc":[1796,1797,1798]},{"teal":1725,"source":440,"errorMessage":"account not found","pc":[1799]},{"teal":1726,"source":381,"pc":[1800]},{"teal":1731,"source":450,"pc":[1801,1802]},{"teal":1734,"source":451,"pc":[1803,1804,1805]},{"teal":1735,"source":451,"pc":[1806]},{"teal":1736,"source":451,"pc":[1807]},{"teal":1737,"source":451,"pc":[1808,1809]},{"teal":1738,"source":451,"pc":[1810]},{"teal":1741,"source":451,"errorMessage":"argument 0 (staker) for getStakerInfo must be a address","pc":[1811]},{"teal":1744,"source":450,"pc":[1812,1813,1814]},{"teal":1745,"source":450,"pc":[1815]},{"teal":1746,"source":450,"pc":[1816]},{"teal":1747,"source":450,"pc":[1817]},{"teal":1748,"source":450,"pc":[1818]},{"teal":1758,"source":450,"pc":[1819,1820,1821]},{"teal":1761,"source":450,"pc":[1822,1823]},{"teal":1765,"source":452,"pc":[1824]},{"teal":1766,"source":452,"pc":[1825,1826]},{"teal":1771,"source":452,"pc":[1827,1828]},{"teal":1772,"source":452,"pc":[1829,1830]},{"teal":1773,"source":452,"pc":[1831]},{"teal":1774,"source":452,"pc":[1832,1833,1834]},{"teal":1779,"source":453,"pc":[1835,1836]},{"teal":1780,"source":453,"pc":[1837,1838]},{"teal":1781,"source":453,"pc":[1839]},{"teal":1782,"source":453,"pc":[1840,1841,1842]},{"teal":1787,"source":454,"pc":[1843]},{"teal":1788,"source":454,"pc":[1844]},{"teal":1789,"source":454,"pc":[1845,1846]},{"teal":1790,"source":454,"pc":[1847]},{"teal":1791,"source":454,"pc":[1848,1849]},{"teal":1792,"source":454,"pc":[1850,1851]},{"teal":1793,"source":454,"pc":[1852]},{"teal":1794,"source":454,"pc":[1853,1854]},{"teal":1795,"source":454,"pc":[1855,1856]},{"teal":1796,"source":454,"pc":[1857,1858]},{"teal":1797,"source":454,"pc":[1859,1860]},{"teal":1798,"source":454,"pc":[1861]},{"teal":1804,"source":456,"pc":[1862,1863]},{"teal":1805,"source":456,"pc":[1864]},{"teal":1806,"source":456,"pc":[1865]},{"teal":1807,"source":456,"pc":[1866]},{"teal":1808,"source":456,"pc":[1867]},{"teal":1809,"source":456,"pc":[1868,1869]},{"teal":1810,"source":456,"pc":[1870]},{"teal":1811,"source":456,"pc":[1871,1872]},{"teal":1812,"source":456,"pc":[1873]},{"teal":1813,"source":456,"pc":[1874,1875]},{"teal":1814,"source":456,"pc":[1876]},{"teal":1815,"source":456,"pc":[1877,1878,1879]},{"teal":1820,"source":457,"pc":[1880,1881]},{"teal":1821,"source":457,"pc":[1882]},{"teal":1822,"source":457,"pc":[1883]},{"teal":1823,"source":457,"pc":[1884]},{"teal":1824,"source":457,"pc":[1885]},{"teal":1825,"source":457,"pc":[1886,1887]},{"teal":1826,"source":457,"pc":[1888]},{"teal":1827,"source":457,"pc":[1889,1890,1891]},{"teal":1834,"source":452,"pc":[1892,1893]},{"teal":1835,"source":452,"pc":[1894]},{"teal":1836,"source":452,"pc":[1895]},{"teal":1837,"source":452,"pc":[1896,1897]},{"teal":1838,"source":452,"pc":[1898,1899,1900]},{"teal":1842,"source":460,"errorMessage":"account not found","pc":[1901]},{"teal":1846,"source":450,"pc":[1902,1903]},{"teal":1847,"source":450,"pc":[1904]},{"teal":1852,"source":473,"pc":[1905,1906,1907]},{"teal":1853,"source":473,"pc":[1908]},{"teal":1856,"source":473,"pc":[1909,1910,1911]},{"teal":1857,"source":473,"pc":[1912]},{"teal":1860,"source":473,"pc":[1913,1914,1915]},{"teal":1861,"source":473,"pc":[1916]},{"teal":1862,"source":473,"pc":[1917]},{"teal":1863,"source":473,"pc":[1918,1919]},{"teal":1864,"source":473,"pc":[1920]},{"teal":1867,"source":473,"errorMessage":"argument 2 (staker) for payTokenReward must be a address","pc":[1921]},{"teal":1870,"source":473,"pc":[1922,1923,1924]},{"teal":1871,"source":473,"pc":[1925]},{"teal":1872,"source":473,"pc":[1926]},{"teal":1885,"source":473,"pc":[1927,1928,1929]},{"teal":1892,"source":476,"pc":[1930,1931]},{"teal":1893,"source":476,"pc":[1932]},{"teal":1894,"source":476,"pc":[1933]},{"teal":1895,"source":476,"pc":[1934,1935]},{"teal":1896,"source":476,"pc":[1936]},{"teal":1897,"source":476,"pc":[1937]},{"teal":1900,"source":475,"errorMessage":"this can only be called via the validator contract","pc":[1938]},{"teal":1904,"source":479,"pc":[1939]},{"teal":1905,"source":479,"pc":[1940]},{"teal":1906,"source":479,"pc":[1941]},{"teal":1907,"source":479,"pc":[1942]},{"teal":1910,"source":479,"errorMessage":"must be pool 1 in order to be called to pay out token rewards","pc":[1943]},{"teal":1914,"source":480,"pc":[1944,1945]},{"teal":1915,"source":480,"pc":[1946]},{"teal":1916,"source":480,"pc":[1947]},{"teal":1919,"source":480,"errorMessage":"can only claim token rewards from validator that has them","pc":[1948]},{"teal":1927,"source":483,"pc":[1949]},{"teal":1928,"source":483,"pc":[1950,1951]},{"teal":1929,"source":483,"pc":[1952,1953]},{"teal":1933,"source":484,"pc":[1954,1955]},{"teal":1934,"source":484,"pc":[1956,1957]},{"teal":1938,"source":485,"pc":[1958,1959]},{"teal":1939,"source":485,"pc":[1960,1961]},{"teal":1943,"source":486,"pc":[1962,1963]},{"teal":1944,"source":486,"pc":[1964,1965]},{"teal":1947,"source":483,"pc":[1966]},{"teal":1948,"source":483,"pc":[1967,1968]},{"teal":1951,"source":483,"pc":[1969]},{"teal":1952,"source":473,"pc":[1970]},{"teal":1957,"source":499,"pc":[1971,1972,1973]},{"teal":1958,"source":499,"pc":[1974,1975,1976]},{"teal":1961,"source":499,"pc":[1977,1978,1979]},{"teal":1962,"source":499,"pc":[1980]},{"teal":1963,"source":499,"pc":[1981]},{"teal":1975,"source":499,"pc":[1982,1983,1984]},{"teal":1979,"source":500,"pc":[1985,1986,1987]},{"teal":1982,"source":500,"errorMessage":"can only be called by owner or manager of validator","pc":[1988]},{"teal":1986,"source":501,"pc":[1989,1990,1991,1992,1993,1994,1995,1996,1997,1998]},{"teal":1987,"source":501,"pc":[1999,2000]},{"teal":1988,"source":501,"pc":[2001]},{"teal":1989,"source":499,"pc":[2002]},{"teal":1994,"source":512,"pc":[2003,2004,2005]},{"teal":1995,"source":512,"pc":[2006]},{"teal":1996,"source":512,"pc":[2007]},{"teal":2007,"source":512,"pc":[2008,2009,2010]},{"teal":2010,"source":512,"pc":[2011,2012]},{"teal":2011,"source":512,"pc":[2013,2014]},{"teal":2018,"source":514,"pc":[2015]},{"teal":2019,"source":514,"pc":[2016]},{"teal":2020,"source":514,"pc":[2017,2018]},{"teal":2021,"source":514,"pc":[2019,2020]},{"teal":2022,"source":514,"pc":[2021,2022]},{"teal":2026,"source":515,"pc":[2023]},{"teal":2027,"source":515,"pc":[2024]},{"teal":2028,"source":515,"pc":[2025,2026]},{"teal":2032,"source":516,"pc":[2027]},{"teal":2033,"source":516,"pc":[2028]},{"teal":2034,"source":516,"pc":[2029]},{"teal":2035,"source":516,"pc":[2030,2031]},{"teal":2038,"source":514,"pc":[2032]},{"teal":2039,"source":514,"pc":[2033,2034]},{"teal":2042,"source":514,"pc":[2035]},{"teal":2043,"source":514,"pc":[2036,2037]},{"teal":2044,"source":514,"pc":[2038]},{"teal":2045,"source":514,"pc":[2039]},{"teal":2046,"source":514,"pc":[2040,2041]},{"teal":2047,"source":514,"pc":[2042,2043,2044]},{"teal":2048,"source":514,"pc":[2045,2046]},{"teal":2052,"source":523,"pc":[2047,2048]},{"teal":2053,"source":523,"pc":[2049,2050,2051]},{"teal":2054,"source":523,"pc":[2052]},{"teal":2055,"source":523,"pc":[2053,2054]},{"teal":2059,"source":524,"pc":[2055,2056]},{"teal":2060,"source":524,"pc":[2057,2058]},{"teal":2064,"source":525,"pc":[2059,2060]},{"teal":2065,"source":525,"pc":[2061,2062]},{"teal":2066,"source":525,"pc":[2063,2064]},{"teal":2067,"source":525,"pc":[2065]},{"teal":2068,"source":525,"pc":[2066]},{"teal":2069,"source":525,"pc":[2067,2068]},{"teal":2073,"source":528,"pc":[2069,2070]},{"teal":2074,"source":528,"pc":[2071]},{"teal":2075,"source":528,"pc":[2072,2073]},{"teal":2076,"source":528,"pc":[2074]},{"teal":2077,"source":528,"pc":[2075,2076]},{"teal":2078,"source":528,"pc":[2077]},{"teal":2079,"source":528,"pc":[2078]},{"teal":2080,"source":528,"pc":[2079,2080]},{"teal":2084,"source":530,"pc":[2081,2082]},{"teal":2085,"source":530,"pc":[2083,2084]},{"teal":2086,"source":530,"pc":[2085]},{"teal":2089,"source":530,"errorMessage":"can't call epochBalanceUpdate in same epoch as prior call","pc":[2086]},{"teal":2093,"source":532,"pc":[2087,2088,2089]},{"teal":2097,"source":535,"pc":[2090,2091]},{"teal":2098,"source":535,"pc":[2092,2093]},{"teal":2099,"source":535,"pc":[2094]},{"teal":2103,"source":536,"pc":[2095,2096]},{"teal":2104,"source":536,"pc":[2097]},{"teal":2105,"source":536,"pc":[2098]},{"teal":2106,"source":536,"pc":[2099]},{"teal":2107,"source":536,"pc":[2100,2101]},{"teal":2108,"source":536,"pc":[2102]},{"teal":2109,"source":536,"pc":[2103]},{"teal":2113,"source":541,"pc":[2104,2105]},{"teal":2114,"source":541,"pc":[2106,2107,2108]},{"teal":2115,"source":541,"pc":[2109]},{"teal":2116,"source":541,"pc":[2110]},{"teal":2117,"source":541,"pc":[2111]},{"teal":2118,"source":541,"pc":[2112,2113]},{"teal":2122,"source":542,"pc":[2114,2115,2116]},{"teal":2123,"source":542,"pc":[2117,2118]},{"teal":2127,"source":543,"pc":[2119,2120]},{"teal":2128,"source":543,"pc":[2121,2122]},{"teal":2133,"source":548,"pc":[2123,2124]},{"teal":2134,"source":548,"pc":[2125,2126,2127]},{"teal":2140,"source":549,"pc":[2128]},{"teal":2141,"source":549,"pc":[2129]},{"teal":2142,"source":549,"pc":[2130]},{"teal":2143,"source":549,"pc":[2131]},{"teal":2144,"source":549,"pc":[2132,2133,2134]},{"teal":2152,"source":551,"pc":[2135]},{"teal":2153,"source":551,"pc":[2136]},{"teal":2154,"source":551,"pc":[2137,2138]},{"teal":2155,"source":551,"pc":[2139,2140]},{"teal":2156,"source":551,"pc":[2141,2142]},{"teal":2160,"source":552,"pc":[2143]},{"teal":2161,"source":552,"pc":[2144]},{"teal":2162,"source":552,"pc":[2145,2146]},{"teal":2166,"source":553,"pc":[2147]},{"teal":2167,"source":553,"pc":[2148]},{"teal":2168,"source":553,"pc":[2149]},{"teal":2169,"source":553,"pc":[2150,2151]},{"teal":2170,"source":553,"pc":[2152,2153,2154,2155,2156,2157,2158,2159,2160,2161]},{"teal":2171,"source":553,"pc":[2162,2163]},{"teal":2174,"source":551,"pc":[2164]},{"teal":2175,"source":551,"pc":[2165,2166]},{"teal":2178,"source":551,"pc":[2167]},{"teal":2179,"source":551,"pc":[2168,2169]},{"teal":2180,"source":551,"pc":[2170]},{"teal":2181,"source":551,"pc":[2171]},{"teal":2182,"source":551,"pc":[2172,2173]},{"teal":2183,"source":551,"pc":[2174,2175,2176]},{"teal":2184,"source":551,"pc":[2177]},{"teal":2185,"source":551,"pc":[2178,2179]},{"teal":2189,"source":555,"pc":[2180,2181]},{"teal":2190,"source":555,"pc":[2182,2183]},{"teal":2191,"source":555,"pc":[2184]},{"teal":2192,"source":555,"pc":[2185,2186]},{"teal":2198,"source":560,"pc":[2187]},{"teal":2199,"source":560,"pc":[2188]},{"teal":2200,"source":560,"pc":[2189]},{"teal":2201,"source":560,"pc":[2190]},{"teal":2202,"source":560,"pc":[2191,2192,2193]},{"teal":2210,"source":561,"pc":[2194]},{"teal":2211,"source":561,"pc":[2195]},{"teal":2212,"source":561,"pc":[2196,2197]},{"teal":2213,"source":561,"pc":[2198,2199]},{"teal":2214,"source":561,"pc":[2200,2201]},{"teal":2218,"source":562,"pc":[2202]},{"teal":2219,"source":562,"pc":[2203]},{"teal":2220,"source":562,"pc":[2204,2205]},{"teal":2224,"source":563,"pc":[2206]},{"teal":2225,"source":563,"pc":[2207]},{"teal":2226,"source":563,"pc":[2208]},{"teal":2227,"source":563,"pc":[2209,2210]},{"teal":2230,"source":561,"pc":[2211]},{"teal":2231,"source":561,"pc":[2212,2213]},{"teal":2234,"source":561,"pc":[2214]},{"teal":2235,"source":561,"pc":[2215,2216]},{"teal":2236,"source":561,"pc":[2217]},{"teal":2237,"source":561,"pc":[2218]},{"teal":2238,"source":561,"pc":[2219,2220]},{"teal":2239,"source":561,"pc":[2221,2222,2223]},{"teal":2240,"source":561,"pc":[2224,2225]},{"teal":2241,"source":560,"pc":[2226,2227,2228]},{"teal":2249,"source":567,"pc":[2229]},{"teal":2250,"source":567,"pc":[2230]},{"teal":2251,"source":567,"pc":[2231,2232]},{"teal":2252,"source":567,"pc":[2233,2234]},{"teal":2253,"source":567,"pc":[2235,2236]},{"teal":2257,"source":568,"pc":[2237,2238]},{"teal":2258,"source":568,"pc":[2239,2240]},{"teal":2262,"source":569,"pc":[2241]},{"teal":2263,"source":569,"pc":[2242]},{"teal":2264,"source":569,"pc":[2243]},{"teal":2265,"source":569,"pc":[2244]},{"teal":2266,"source":569,"pc":[2245]},{"teal":2267,"source":569,"pc":[2246]},{"teal":2268,"source":569,"pc":[2247]},{"teal":2269,"source":569,"pc":[2248,2249,2250]},{"teal":2270,"source":569,"pc":[2251]},{"teal":2271,"source":569,"pc":[2252]},{"teal":2272,"source":569,"pc":[2253,2254]},{"teal":2275,"source":567,"pc":[2255]},{"teal":2276,"source":567,"pc":[2256,2257]},{"teal":2279,"source":567,"pc":[2258]},{"teal":2280,"source":567,"pc":[2259,2260]},{"teal":2281,"source":567,"pc":[2261]},{"teal":2282,"source":567,"pc":[2262]},{"teal":2283,"source":567,"pc":[2263,2264]},{"teal":2284,"source":567,"pc":[2265,2266,2267]},{"teal":2285,"source":567,"pc":[2268,2269]},{"teal":2295,"source":576,"pc":[2270]},{"teal":2296,"source":576,"pc":[2271]},{"teal":2297,"source":576,"pc":[2272,2273]},{"teal":2298,"source":576,"pc":[2274,2275,2276,2277,2278,2279]},{"teal":2299,"source":576,"pc":[2280,2281]},{"teal":2303,"source":577,"pc":[2282]},{"teal":2304,"source":577,"pc":[2283]},{"teal":2305,"source":577,"pc":[2284,2285]},{"teal":2309,"source":578,"pc":[2286]},{"teal":2310,"source":578,"pc":[2287]},{"teal":2311,"source":578,"pc":[2288]},{"teal":2312,"source":578,"pc":[2289,2290]},{"teal":2315,"source":576,"pc":[2291]},{"teal":2316,"source":576,"pc":[2292,2293]},{"teal":2319,"source":576,"pc":[2294]},{"teal":2320,"source":576,"pc":[2295,2296]},{"teal":2321,"source":576,"pc":[2297]},{"teal":2322,"source":576,"pc":[2298]},{"teal":2323,"source":576,"pc":[2299,2300]},{"teal":2324,"source":576,"pc":[2301,2302,2303]},{"teal":2325,"source":576,"pc":[2304,2305]},{"teal":2329,"source":580,"pc":[2306,2307]},{"teal":2330,"source":580,"pc":[2308,2309,2310]},{"teal":2331,"source":580,"pc":[2311]},{"teal":2332,"source":580,"pc":[2312,2313]},{"teal":2336,"source":586,"pc":[2314,2315]},{"teal":2337,"source":586,"pc":[2316,2317]},{"teal":2338,"source":586,"pc":[2318]},{"teal":2339,"source":586,"pc":[2319,2320]},{"teal":2340,"source":586,"pc":[2321]},{"teal":2341,"source":586,"pc":[2322]},{"teal":2342,"source":586,"pc":[2323,2324]},{"teal":2343,"source":586,"pc":[2325,2326]},{"teal":2344,"source":586,"pc":[2327]},{"teal":2345,"source":586,"pc":[2328]},{"teal":2346,"source":586,"pc":[2329,2330]},{"teal":2350,"source":587,"pc":[2331]},{"teal":2351,"source":587,"pc":[2332,2333]},{"teal":2355,"source":588,"pc":[2334,2335,2336]},{"teal":2356,"source":588,"pc":[2337,2338]},{"teal":2361,"source":596,"pc":[2339,2340]},{"teal":2362,"source":596,"pc":[2341,2342,2343]},{"teal":2363,"source":596,"pc":[2344]},{"teal":2364,"source":596,"pc":[2345,2346]},{"teal":2365,"source":596,"pc":[2347]},{"teal":2366,"source":596,"pc":[2348,2349,2350]},{"teal":2371,"source":597,"pc":[2351]},{"teal":2372,"source":597,"pc":[2352,2353]},{"teal":2377,"source":603,"pc":[2354]},{"teal":2378,"source":603,"pc":[2355,2356]},{"teal":2382,"source":604,"pc":[2357]},{"teal":2383,"source":604,"pc":[2358,2359]},{"teal":2387,"source":605,"pc":[2360]},{"teal":2388,"source":605,"pc":[2361,2362]},{"teal":2392,"source":606,"pc":[2363]},{"teal":2393,"source":606,"pc":[2364,2365]},{"teal":2398,"source":607,"pc":[2366,2367]},{"teal":2399,"source":607,"pc":[2368,2369,2370]},{"teal":2405,"source":609,"pc":[2371,2372]},{"teal":2406,"source":609,"pc":[2373,2374]},{"teal":2407,"source":609,"pc":[2375,2376,2377]},{"teal":2408,"source":609,"pc":[2378]},{"teal":2409,"source":609,"pc":[2379,2380]},{"teal":2410,"source":609,"pc":[2381]},{"teal":2411,"source":609,"pc":[2382,2383]},{"teal":2412,"source":609,"pc":[2384]},{"teal":2413,"source":608,"pc":[2385,2386]},{"teal":2418,"source":613,"pc":[2387,2388]},{"teal":2419,"source":613,"pc":[2389,2390]},{"teal":2420,"source":613,"pc":[2391,2392,2393]},{"teal":2421,"source":613,"pc":[2394]},{"teal":2422,"source":613,"pc":[2395]},{"teal":2423,"source":613,"pc":[2396,2397,2398]},{"teal":2428,"source":619,"pc":[2399,2400]},{"teal":2429,"source":619,"pc":[2401]},{"teal":2430,"source":619,"pc":[2402]},{"teal":2431,"source":619,"pc":[2403]},{"teal":2432,"source":619,"pc":[2404]},{"teal":2433,"source":619,"pc":[2405]},{"teal":2434,"source":619,"pc":[2406,2407]},{"teal":2435,"source":619,"pc":[2408]},{"teal":2436,"source":619,"pc":[2409]},{"teal":2437,"source":619,"pc":[2410,2411]},{"teal":2438,"source":619,"pc":[2412]},{"teal":2439,"source":619,"pc":[2413]},{"teal":2440,"source":619,"pc":[2414,2415]},{"teal":2444,"source":622,"pc":[2416,2417]},{"teal":2445,"source":622,"pc":[2418,2419,2420]},{"teal":2446,"source":622,"pc":[2421]},{"teal":2447,"source":622,"pc":[2422,2423]},{"teal":2448,"source":622,"pc":[2424]},{"teal":2449,"source":622,"pc":[2425]},{"teal":2450,"source":622,"pc":[2426,2427]},{"teal":2451,"source":622,"pc":[2428]},{"teal":2452,"source":622,"pc":[2429]},{"teal":2453,"source":622,"pc":[2430]},{"teal":2454,"source":622,"pc":[2431]},{"teal":2455,"source":622,"pc":[2432]},{"teal":2458,"source":622,"errorMessage":"wideRatio failed","pc":[2433]},{"teal":2459,"source":622,"pc":[2434,2435]},{"teal":2467,"source":625,"pc":[2436,2437]},{"teal":2468,"source":625,"pc":[2438]},{"teal":2469,"source":625,"pc":[2439]},{"teal":2470,"source":625,"pc":[2440,2441,2442]},{"teal":2476,"source":630,"pc":[2443,2444]},{"teal":2477,"source":630,"pc":[2445,2446]},{"teal":2478,"source":630,"pc":[2447]},{"teal":2479,"source":630,"pc":[2448,2449,2450]},{"teal":2484,"source":631,"pc":[2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2473,2474]},{"teal":2485,"source":631,"pc":[2475]},{"teal":2489,"source":632,"pc":[2476]},{"teal":2497,"source":636,"pc":[2477,2478]},{"teal":2498,"source":636,"pc":[2479,2480,2481]},{"teal":2506,"source":643,"pc":[2482,2483]},{"teal":2507,"source":643,"pc":[2484,2485]},{"teal":2508,"source":643,"pc":[2486,2487,2488]},{"teal":2509,"source":643,"pc":[2489]},{"teal":2510,"source":642,"pc":[2490]},{"teal":2511,"source":642,"pc":[2491]},{"teal":2512,"source":644,"pc":[2492,2493]},{"teal":2513,"source":642,"pc":[2494]},{"teal":2514,"source":642,"pc":[2495]},{"teal":2515,"source":642,"pc":[2496]},{"teal":2516,"source":642,"pc":[2497]},{"teal":2517,"source":642,"pc":[2498]},{"teal":2520,"source":642,"errorMessage":"wideRatio failed","pc":[2499]},{"teal":2521,"source":642,"pc":[2500,2501]},{"teal":2525,"source":647,"pc":[2502,2503]},{"teal":2526,"source":647,"pc":[2504,2505]},{"teal":2527,"source":647,"pc":[2506]},{"teal":2528,"source":647,"pc":[2507]},{"teal":2529,"source":647,"pc":[2508,2509]},{"teal":2530,"source":647,"pc":[2510,2511,2512]},{"teal":2531,"source":647,"pc":[2513]},{"teal":2532,"source":647,"pc":[2514]},{"teal":2533,"source":647,"pc":[2515]},{"teal":2534,"source":647,"pc":[2516]},{"teal":2535,"source":647,"pc":[2517]},{"teal":2536,"source":647,"pc":[2518]},{"teal":2539,"source":647,"errorMessage":"wideRatio failed","pc":[2519]},{"teal":2540,"source":647,"pc":[2520,2521]},{"teal":2545,"source":649,"pc":[2522,2523]},{"teal":2546,"source":649,"pc":[2524,2525]},{"teal":2547,"source":649,"pc":[2526,2527]},{"teal":2548,"source":649,"pc":[2528]},{"teal":2549,"source":649,"pc":[2529]},{"teal":2550,"source":649,"pc":[2530,2531,2532]},{"teal":2555,"source":650,"pc":[2533,2534]},{"teal":2556,"source":650,"pc":[2535,2536]},{"teal":2557,"source":650,"pc":[2537]},{"teal":2558,"source":650,"pc":[2538,2539]},{"teal":2563,"source":653,"pc":[2540,2541]},{"teal":2564,"source":653,"pc":[2542,2543]},{"teal":2565,"source":653,"pc":[2544]},{"teal":2566,"source":653,"pc":[2545,2546]},{"teal":2574,"source":654,"pc":[2547]},{"teal":2575,"source":654,"pc":[2548]},{"teal":2576,"source":654,"pc":[2549,2550]},{"teal":2580,"source":655,"pc":[2551,2552]},{"teal":2581,"source":655,"pc":[2553,2554]},{"teal":2585,"source":656,"pc":[2555,2556]},{"teal":2586,"source":656,"pc":[2557]},{"teal":2587,"source":656,"pc":[2558]},{"teal":2588,"source":656,"pc":[2559,2560]},{"teal":2589,"source":656,"pc":[2561,2562]},{"teal":2593,"source":657,"pc":[2563,2564,2565,2566,2567,2568,2569,2570,2571,2572,2573,2574,2575,2576,2577,2578,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589,2590,2591,2592,2593,2594,2595,2596,2597,2598]},{"teal":2594,"source":657,"pc":[2599,2600]},{"teal":2597,"source":654,"pc":[2601]},{"teal":2598,"source":654,"pc":[2602,2603]},{"teal":2601,"source":654,"pc":[2604]},{"teal":2605,"source":660,"pc":[2605,2606]},{"teal":2606,"source":660,"pc":[2607,2608]},{"teal":2607,"source":636,"pc":[2609,2610,2611]},{"teal":2612,"source":661,"pc":[2612,2613]},{"teal":2613,"source":661,"pc":[2614,2615,2616]},{"teal":2614,"source":661,"pc":[2617]},{"teal":2615,"source":661,"pc":[2618]},{"teal":2616,"source":661,"pc":[2619]},{"teal":2617,"source":661,"pc":[2620,2621,2622]},{"teal":2625,"source":665,"pc":[2623,2624]},{"teal":2626,"source":665,"pc":[2625,2626]},{"teal":2627,"source":665,"pc":[2627,2628,2629]},{"teal":2628,"source":665,"pc":[2630]},{"teal":2629,"source":664,"pc":[2631]},{"teal":2630,"source":664,"pc":[2632]},{"teal":2631,"source":666,"pc":[2633,2634]},{"teal":2632,"source":664,"pc":[2635]},{"teal":2633,"source":664,"pc":[2636]},{"teal":2634,"source":664,"pc":[2637]},{"teal":2635,"source":664,"pc":[2638]},{"teal":2636,"source":664,"pc":[2639]},{"teal":2639,"source":664,"errorMessage":"wideRatio failed","pc":[2640]},{"teal":2640,"source":664,"pc":[2641,2642]},{"teal":2644,"source":670,"pc":[2643,2644]},{"teal":2645,"source":670,"pc":[2645,2646]},{"teal":2646,"source":670,"pc":[2647]},{"teal":2647,"source":670,"pc":[2648,2649]},{"teal":2652,"source":677,"pc":[2650,2651]},{"teal":2653,"source":677,"pc":[2652]},{"teal":2654,"source":677,"pc":[2653]},{"teal":2655,"source":677,"pc":[2654,2655,2656]},{"teal":2660,"source":680,"pc":[2657]},{"teal":2661,"source":680,"pc":[2658,2659]},{"teal":2667,"source":682,"pc":[2660,2661]},{"teal":2668,"source":682,"pc":[2662,2663,2664]},{"teal":2669,"source":682,"pc":[2665,2666]},{"teal":2670,"source":682,"pc":[2667,2668,2669]},{"teal":2671,"source":682,"pc":[2670]},{"teal":2672,"source":682,"pc":[2671]},{"teal":2673,"source":682,"pc":[2672,2673,2674]},{"teal":2674,"source":683,"pc":[2675,2676]},{"teal":2675,"source":683,"pc":[2677,2678,2679]},{"teal":2676,"source":683,"pc":[2680,2681]},{"teal":2677,"source":683,"pc":[2682]},{"teal":2678,"source":683,"pc":[2683,2684]},{"teal":2679,"source":683,"pc":[2685,2686,2687]},{"teal":2680,"source":683,"pc":[2688,2689]},{"teal":2681,"source":683,"pc":[2690]},{"teal":2682,"source":683,"pc":[2691]},{"teal":2683,"source":683,"pc":[2692,2693]},{"teal":2684,"source":683,"pc":[2694]},{"teal":2685,"source":682,"pc":[2695]},{"teal":2688,"source":681,"pc":[2696,2697,2698]},{"teal":2693,"source":685,"pc":[2699,2700]},{"teal":2694,"source":685,"pc":[2701,2702]},{"teal":2695,"source":685,"pc":[2703]},{"teal":2696,"source":685,"pc":[2704,2705,2706]},{"teal":2697,"source":685,"pc":[2707,2708]},{"teal":2698,"source":685,"pc":[2709,2710,2711]},{"teal":2701,"source":685,"pc":[2712,2713]},{"teal":2704,"source":685,"pc":[2714,2715]},{"teal":2712,"source":686,"pc":[2716]},{"teal":2713,"source":686,"pc":[2717]},{"teal":2714,"source":686,"pc":[2718,2719]},{"teal":2718,"source":687,"pc":[2720,2721]},{"teal":2719,"source":687,"pc":[2722,2723]},{"teal":2723,"source":688,"pc":[2724,2725]},{"teal":2724,"source":688,"pc":[2726,2727,2728]},{"teal":2725,"source":688,"pc":[2729,2730]},{"teal":2729,"source":689,"pc":[2731,2732,2733,2734,2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750,2751,2752,2753,2754,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765,2766,2767,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,2780,2781,2782,2783,2784,2785]},{"teal":2730,"source":689,"pc":[2786,2787]},{"teal":2733,"source":686,"pc":[2788]},{"teal":2734,"source":686,"pc":[2789,2790]},{"teal":2737,"source":686,"pc":[2791]},{"teal":2743,"source":692,"pc":[2792,2793]},{"teal":2744,"source":692,"pc":[2794,2795]},{"teal":2745,"source":692,"pc":[2796]},{"teal":2746,"source":692,"pc":[2797]},{"teal":2747,"source":692,"pc":[2798]},{"teal":2748,"source":692,"pc":[2799,2800,2801]},{"teal":2757,"source":693,"pc":[2802]},{"teal":2758,"source":693,"pc":[2803]},{"teal":2759,"source":693,"pc":[2804,2805]},{"teal":2763,"source":694,"pc":[2806,2807]},{"teal":2764,"source":694,"pc":[2808,2809]},{"teal":2765,"source":694,"pc":[2810]},{"teal":2766,"source":694,"pc":[2811,2812]},{"teal":2770,"source":695,"pc":[2813,2814]},{"teal":2771,"source":695,"pc":[2815,2816,2817]},{"teal":2772,"source":695,"pc":[2818,2819]},{"teal":2776,"source":696,"pc":[2820,2821,2822,2823,2824,2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837]},{"teal":2777,"source":696,"pc":[2838,2839]},{"teal":2780,"source":693,"pc":[2840]},{"teal":2781,"source":693,"pc":[2841,2842]},{"teal":2784,"source":693,"pc":[2843]},{"teal":2793,"source":708,"pc":[2844]},{"teal":2794,"source":708,"pc":[2845,2846]},{"teal":2799,"source":732,"pc":[2847,2848]},{"teal":2800,"source":732,"pc":[2849]},{"teal":2801,"source":732,"pc":[2850]},{"teal":2802,"source":732,"pc":[2851]},{"teal":2803,"source":732,"pc":[2852,2853,2854]},{"teal":2804,"source":732,"pc":[2855,2856]},{"teal":2805,"source":732,"pc":[2857]},{"teal":2806,"source":732,"pc":[2858]},{"teal":2807,"source":732,"pc":[2859]},{"teal":2810,"source":732,"pc":[2860,2861,2862]},{"teal":2815,"source":733,"pc":[2863]},{"teal":2816,"source":733,"pc":[2864,2865]},{"teal":2820,"source":734,"pc":[2866,2867]},{"teal":2821,"source":734,"pc":[2868,2869]},{"teal":2825,"source":736,"pc":[2870,2871]},{"teal":2826,"source":736,"pc":[2872,2873]},{"teal":2830,"source":737,"pc":[2874]},{"teal":2831,"source":737,"pc":[2875,2876]},{"teal":2836,"source":737,"pc":[2877,2878]},{"teal":2837,"source":737,"pc":[2879,2880]},{"teal":2838,"source":737,"pc":[2881]},{"teal":2839,"source":737,"pc":[2882,2883,2884]},{"teal":2844,"source":738,"pc":[2885,2886]},{"teal":2845,"source":738,"pc":[2887,2888]},{"teal":2846,"source":738,"pc":[2889]},{"teal":2847,"source":738,"pc":[2890,2891,2892]},{"teal":2852,"source":739,"pc":[2893]},{"teal":2853,"source":739,"pc":[2894]},{"teal":2854,"source":739,"pc":[2895,2896]},{"teal":2855,"source":739,"pc":[2897]},{"teal":2856,"source":739,"pc":[2898,2899]},{"teal":2857,"source":739,"pc":[2900,2901]},{"teal":2858,"source":739,"pc":[2902]},{"teal":2859,"source":739,"pc":[2903,2904]},{"teal":2860,"source":739,"pc":[2905,2906]},{"teal":2861,"source":739,"pc":[2907,2908]},{"teal":2862,"source":739,"pc":[2909,2910]},{"teal":2863,"source":739,"pc":[2911]},{"teal":2868,"source":741,"pc":[2912,2913]},{"teal":2869,"source":741,"pc":[2914]},{"teal":2870,"source":741,"pc":[2915]},{"teal":2871,"source":741,"pc":[2916]},{"teal":2872,"source":741,"pc":[2917]},{"teal":2873,"source":741,"pc":[2918,2919]},{"teal":2874,"source":741,"pc":[2920]},{"teal":2875,"source":741,"pc":[2921,2922]},{"teal":2880,"source":742,"pc":[2923,2924]},{"teal":2881,"source":742,"pc":[2925,2926,2927]},{"teal":2882,"source":742,"pc":[2928,2929]},{"teal":2883,"source":742,"pc":[2930]},{"teal":2884,"source":742,"pc":[2931,2932,2933]},{"teal":2890,"source":743,"pc":[2934,2935]},{"teal":2891,"source":743,"pc":[2936,2937,2938]},{"teal":2892,"source":743,"pc":[2939]},{"teal":2893,"source":743,"pc":[2940,2941]},{"teal":2894,"source":743,"pc":[2942]},{"teal":2895,"source":743,"pc":[2943,2944,2945]},{"teal":2900,"source":746,"pc":[2946,2947]},{"teal":2901,"source":746,"pc":[2948,2949]},{"teal":2902,"source":746,"pc":[2950,2951,2952]},{"teal":2903,"source":746,"pc":[2953]},{"teal":2904,"source":746,"pc":[2954]},{"teal":2905,"source":746,"pc":[2955,2956]},{"teal":2906,"source":743,"pc":[2957,2958,2959]},{"teal":2911,"source":750,"pc":[2960,2961]},{"teal":2912,"source":750,"pc":[2962,2963]},{"teal":2913,"source":750,"pc":[2964,2965,2966]},{"teal":2914,"source":750,"pc":[2967]},{"teal":2915,"source":750,"pc":[2968]},{"teal":2916,"source":750,"pc":[2969,2970]},{"teal":2921,"source":754,"pc":[2971,2972]},{"teal":2922,"source":754,"pc":[2973,2974]},{"teal":2923,"source":754,"pc":[2975]},{"teal":2924,"source":754,"pc":[2976,2977,2978]},{"teal":2929,"source":755,"pc":[2979,2980]},{"teal":2930,"source":755,"pc":[2981,2982]},{"teal":2931,"source":755,"pc":[2983,2984,2985]},{"teal":2932,"source":755,"pc":[2986]},{"teal":2933,"source":755,"pc":[2987]},{"teal":2934,"source":755,"pc":[2988,2989]},{"teal":2938,"source":756,"pc":[2990,2991]},{"teal":2939,"source":756,"pc":[2992,2993]},{"teal":2940,"source":756,"pc":[2994]},{"teal":2941,"source":756,"pc":[2995,2996]},{"teal":2942,"source":756,"pc":[2997]},{"teal":2943,"source":756,"pc":[2998,2999]},{"teal":2948,"source":758,"pc":[3000,3001]},{"teal":2949,"source":758,"pc":[3002]},{"teal":2950,"source":758,"pc":[3003]},{"teal":2951,"source":758,"pc":[3004,3005,3006]},{"teal":2959,"source":761,"pc":[3007,3008]},{"teal":2960,"source":761,"pc":[3009,3010,3011]},{"teal":2961,"source":761,"pc":[3012]},{"teal":2962,"source":761,"pc":[3013,3014]},{"teal":2963,"source":760,"pc":[3015]},{"teal":2964,"source":761,"pc":[3016,3017]},{"teal":2965,"source":760,"pc":[3018,3019]},{"teal":2966,"source":760,"pc":[3020,3021]},{"teal":2967,"source":760,"pc":[3022]},{"teal":2968,"source":760,"pc":[3023,3024]},{"teal":2969,"source":760,"pc":[3025]},{"teal":2970,"source":760,"pc":[3026,3027]},{"teal":2971,"source":760,"pc":[3028]},{"teal":2972,"source":760,"pc":[3029]},{"teal":2973,"source":762,"pc":[3030,3031]},{"teal":2974,"source":762,"pc":[3032]},{"teal":2975,"source":762,"pc":[3033,3034]},{"teal":2976,"source":760,"pc":[3035]},{"teal":2977,"source":760,"pc":[3036]},{"teal":2978,"source":760,"pc":[3037]},{"teal":2979,"source":760,"pc":[3038]},{"teal":2980,"source":760,"pc":[3039]},{"teal":2981,"source":760,"pc":[3040]},{"teal":2984,"source":760,"errorMessage":"wideRatio failed","pc":[3041]},{"teal":2985,"source":760,"pc":[3042,3043]},{"teal":2989,"source":767,"pc":[3044,3045]},{"teal":2990,"source":767,"pc":[3046,3047]},{"teal":2991,"source":767,"pc":[3048]},{"teal":2992,"source":767,"pc":[3049,3050]},{"teal":2996,"source":768,"pc":[3051,3052]},{"teal":2997,"source":768,"pc":[3053,3054]},{"teal":2998,"source":768,"pc":[3055,3056]},{"teal":2999,"source":768,"pc":[3057,3058,3059]},{"teal":3000,"source":768,"pc":[3060]},{"teal":3001,"source":768,"pc":[3061,3062]},{"teal":3002,"source":768,"pc":[3063]},{"teal":3003,"source":768,"pc":[3064]},{"teal":3004,"source":768,"pc":[3065]},{"teal":3005,"source":768,"pc":[3066,3067]},{"teal":3009,"source":769,"pc":[3068,3069]},{"teal":3010,"source":769,"pc":[3070,3071]},{"teal":3011,"source":769,"pc":[3072]},{"teal":3012,"source":769,"pc":[3073,3074]},{"teal":3020,"source":773,"pc":[3075,3076]},{"teal":3021,"source":773,"pc":[3077,3078,3079]},{"teal":3022,"source":773,"pc":[3080]},{"teal":3023,"source":773,"pc":[3081,3082]},{"teal":3024,"source":772,"pc":[3083]},{"teal":3025,"source":773,"pc":[3084,3085]},{"teal":3026,"source":772,"pc":[3086,3087]},{"teal":3027,"source":772,"pc":[3088,3089]},{"teal":3028,"source":772,"pc":[3090]},{"teal":3029,"source":772,"pc":[3091,3092]},{"teal":3030,"source":772,"pc":[3093]},{"teal":3031,"source":772,"pc":[3094,3095]},{"teal":3032,"source":772,"pc":[3096]},{"teal":3033,"source":772,"pc":[3097]},{"teal":3034,"source":774,"pc":[3098,3099]},{"teal":3035,"source":774,"pc":[3100]},{"teal":3036,"source":774,"pc":[3101,3102]},{"teal":3037,"source":772,"pc":[3103]},{"teal":3038,"source":772,"pc":[3104]},{"teal":3039,"source":772,"pc":[3105]},{"teal":3040,"source":772,"pc":[3106]},{"teal":3041,"source":772,"pc":[3107]},{"teal":3042,"source":772,"pc":[3108]},{"teal":3045,"source":772,"errorMessage":"wideRatio failed","pc":[3109]},{"teal":3046,"source":772,"pc":[3110,3111]},{"teal":3050,"source":778,"pc":[3112,3113]},{"teal":3051,"source":778,"pc":[3114,3115]},{"teal":3052,"source":778,"pc":[3116]},{"teal":3053,"source":778,"pc":[3117,3118]},{"teal":3057,"source":781,"pc":[3119,3120]},{"teal":3058,"source":781,"pc":[3121,3122]},{"teal":3059,"source":781,"pc":[3123,3124]},{"teal":3060,"source":781,"pc":[3125,3126,3127]},{"teal":3061,"source":781,"pc":[3128]},{"teal":3062,"source":781,"pc":[3129,3130]},{"teal":3063,"source":781,"pc":[3131]},{"teal":3064,"source":781,"pc":[3132]},{"teal":3065,"source":781,"pc":[3133]},{"teal":3066,"source":781,"pc":[3134,3135]},{"teal":3070,"source":782,"pc":[3136,3137]},{"teal":3071,"source":782,"pc":[3138,3139]},{"teal":3072,"source":782,"pc":[3140,3141]},{"teal":3073,"source":782,"pc":[3142,3143,3144]},{"teal":3074,"source":782,"pc":[3145]},{"teal":3075,"source":782,"pc":[3146,3147]},{"teal":3076,"source":782,"pc":[3148]},{"teal":3077,"source":782,"pc":[3149]},{"teal":3078,"source":782,"pc":[3150]},{"teal":3079,"source":782,"pc":[3151,3152]},{"teal":3083,"source":783,"pc":[3153,3154]},{"teal":3084,"source":783,"pc":[3155,3156]},{"teal":3085,"source":783,"pc":[3157]},{"teal":3086,"source":783,"pc":[3158,3159]},{"teal":3090,"source":785,"pc":[3160,3161]},{"teal":3091,"source":785,"pc":[3162]},{"teal":3092,"source":785,"pc":[3163]},{"teal":3093,"source":785,"pc":[3164,3165]},{"teal":3094,"source":785,"pc":[3166]},{"teal":3095,"source":785,"pc":[3167,3168]},{"teal":3096,"source":785,"pc":[3169]},{"teal":3107,"source":737,"pc":[3170,3171]},{"teal":3108,"source":737,"pc":[3172]},{"teal":3109,"source":737,"pc":[3173]},{"teal":3110,"source":737,"pc":[3174,3175]},{"teal":3111,"source":737,"pc":[3176,3177,3178]},{"teal":3116,"source":793,"pc":[3179,3180]},{"teal":3117,"source":793,"pc":[3181]},{"teal":3118,"source":793,"pc":[3182,3183]},{"teal":3119,"source":793,"pc":[3184]},{"teal":3120,"source":793,"pc":[3185,3186]},{"teal":3125,"source":797,"pc":[3187,3188]},{"teal":3126,"source":797,"pc":[3189]},{"teal":3127,"source":797,"pc":[3190]},{"teal":3128,"source":797,"pc":[3191,3192,3193]},{"teal":3133,"source":799,"pc":[3194]},{"teal":3134,"source":799,"pc":[3195,3196]},{"teal":3139,"source":799,"pc":[3197,3198]},{"teal":3140,"source":799,"pc":[3199,3200]},{"teal":3141,"source":799,"pc":[3201]},{"teal":3142,"source":799,"pc":[3202,3203,3204]},{"teal":3147,"source":800,"pc":[3205,3206]},{"teal":3148,"source":800,"pc":[3207,3208]},{"teal":3149,"source":800,"pc":[3209]},{"teal":3150,"source":800,"pc":[3210,3211,3212]},{"teal":3155,"source":801,"pc":[3213]},{"teal":3156,"source":801,"pc":[3214]},{"teal":3157,"source":801,"pc":[3215,3216]},{"teal":3158,"source":801,"pc":[3217]},{"teal":3159,"source":801,"pc":[3218,3219]},{"teal":3160,"source":801,"pc":[3220,3221]},{"teal":3161,"source":801,"pc":[3222]},{"teal":3162,"source":801,"pc":[3223,3224]},{"teal":3163,"source":801,"pc":[3225,3226]},{"teal":3164,"source":801,"pc":[3227,3228]},{"teal":3165,"source":801,"pc":[3229,3230]},{"teal":3166,"source":801,"pc":[3231]},{"teal":3171,"source":803,"pc":[3232,3233]},{"teal":3172,"source":803,"pc":[3234]},{"teal":3173,"source":803,"pc":[3235]},{"teal":3174,"source":803,"pc":[3236]},{"teal":3175,"source":803,"pc":[3237]},{"teal":3176,"source":803,"pc":[3238,3239]},{"teal":3177,"source":803,"pc":[3240]},{"teal":3178,"source":803,"pc":[3241,3242]},{"teal":3183,"source":804,"pc":[3243,3244]},{"teal":3184,"source":804,"pc":[3245,3246,3247]},{"teal":3185,"source":804,"pc":[3248,3249]},{"teal":3186,"source":804,"pc":[3250]},{"teal":3187,"source":804,"pc":[3251]},{"teal":3188,"source":804,"pc":[3252,3253,3254]},{"teal":3189,"source":804,"pc":[3255,3256]},{"teal":3190,"source":804,"pc":[3257,3258,3259]},{"teal":3191,"source":804,"pc":[3260]},{"teal":3192,"source":804,"pc":[3261,3262]},{"teal":3193,"source":804,"pc":[3263]},{"teal":3194,"source":804,"pc":[3264]},{"teal":3197,"source":804,"pc":[3265,3266,3267]},{"teal":3202,"source":805,"pc":[3268,3269]},{"teal":3203,"source":805,"pc":[3270,3271]},{"teal":3204,"source":805,"pc":[3272,3273,3274]},{"teal":3205,"source":805,"pc":[3275]},{"teal":3206,"source":805,"pc":[3276]},{"teal":3207,"source":805,"pc":[3277,3278]},{"teal":3212,"source":807,"pc":[3279,3280]},{"teal":3213,"source":807,"pc":[3281,3282]},{"teal":3214,"source":807,"pc":[3283]},{"teal":3215,"source":807,"pc":[3284,3285,3286]},{"teal":3221,"source":812,"pc":[3287,3288]},{"teal":3222,"source":812,"pc":[3289]},{"teal":3223,"source":812,"pc":[3290]},{"teal":3224,"source":812,"pc":[3291,3292,3293]},{"teal":3232,"source":814,"pc":[3294,3295]},{"teal":3233,"source":814,"pc":[3296,3297,3298]},{"teal":3234,"source":814,"pc":[3299]},{"teal":3235,"source":814,"pc":[3300,3301]},{"teal":3236,"source":813,"pc":[3302]},{"teal":3237,"source":813,"pc":[3303]},{"teal":3238,"source":815,"pc":[3304,3305]},{"teal":3239,"source":813,"pc":[3306]},{"teal":3240,"source":813,"pc":[3307]},{"teal":3241,"source":813,"pc":[3308]},{"teal":3242,"source":813,"pc":[3309]},{"teal":3243,"source":813,"pc":[3310]},{"teal":3246,"source":813,"errorMessage":"wideRatio failed","pc":[3311]},{"teal":3247,"source":813,"pc":[3312,3313]},{"teal":3251,"source":818,"pc":[3314,3315]},{"teal":3252,"source":818,"pc":[3316,3317]},{"teal":3253,"source":818,"pc":[3318,3319]},{"teal":3254,"source":818,"pc":[3320,3321,3322]},{"teal":3255,"source":818,"pc":[3323]},{"teal":3256,"source":818,"pc":[3324,3325]},{"teal":3257,"source":818,"pc":[3326]},{"teal":3258,"source":818,"pc":[3327]},{"teal":3259,"source":818,"pc":[3328]},{"teal":3260,"source":818,"pc":[3329,3330]},{"teal":3264,"source":819,"pc":[3331,3332]},{"teal":3265,"source":819,"pc":[3333,3334]},{"teal":3266,"source":819,"pc":[3335]},{"teal":3267,"source":819,"pc":[3336,3337]},{"teal":3273,"source":821,"pc":[3338,3339]},{"teal":3274,"source":821,"pc":[3340]},{"teal":3275,"source":821,"pc":[3341]},{"teal":3276,"source":821,"pc":[3342,3343,3344]},{"teal":3284,"source":823,"pc":[3345,3346]},{"teal":3285,"source":823,"pc":[3347,3348,3349]},{"teal":3286,"source":823,"pc":[3350]},{"teal":3287,"source":823,"pc":[3351,3352]},{"teal":3288,"source":822,"pc":[3353]},{"teal":3289,"source":822,"pc":[3354]},{"teal":3290,"source":824,"pc":[3355,3356]},{"teal":3291,"source":822,"pc":[3357]},{"teal":3292,"source":822,"pc":[3358]},{"teal":3293,"source":822,"pc":[3359]},{"teal":3294,"source":822,"pc":[3360]},{"teal":3295,"source":822,"pc":[3361]},{"teal":3298,"source":822,"errorMessage":"wideRatio failed","pc":[3362]},{"teal":3299,"source":822,"pc":[3363,3364]},{"teal":3303,"source":828,"pc":[3365,3366]},{"teal":3304,"source":828,"pc":[3367,3368]},{"teal":3305,"source":828,"pc":[3369,3370]},{"teal":3306,"source":828,"pc":[3371,3372,3373]},{"teal":3307,"source":828,"pc":[3374]},{"teal":3308,"source":828,"pc":[3375,3376]},{"teal":3309,"source":828,"pc":[3377]},{"teal":3310,"source":828,"pc":[3378]},{"teal":3311,"source":828,"pc":[3379]},{"teal":3312,"source":828,"pc":[3380,3381]},{"teal":3316,"source":829,"pc":[3382,3383]},{"teal":3317,"source":829,"pc":[3384,3385]},{"teal":3318,"source":829,"pc":[3386,3387]},{"teal":3319,"source":829,"pc":[3388,3389,3390]},{"teal":3320,"source":829,"pc":[3391]},{"teal":3321,"source":829,"pc":[3392,3393]},{"teal":3322,"source":829,"pc":[3394]},{"teal":3323,"source":829,"pc":[3395]},{"teal":3324,"source":829,"pc":[3396]},{"teal":3325,"source":829,"pc":[3397,3398]},{"teal":3329,"source":830,"pc":[3399,3400]},{"teal":3330,"source":830,"pc":[3401,3402]},{"teal":3331,"source":830,"pc":[3403]},{"teal":3332,"source":830,"pc":[3404,3405]},{"teal":3337,"source":834,"pc":[3406,3407]},{"teal":3338,"source":834,"pc":[3408]},{"teal":3339,"source":834,"pc":[3409]},{"teal":3340,"source":834,"pc":[3410,3411]},{"teal":3341,"source":834,"pc":[3412]},{"teal":3342,"source":834,"pc":[3413,3414]},{"teal":3343,"source":834,"pc":[3415]},{"teal":3352,"source":799,"pc":[3416,3417]},{"teal":3353,"source":799,"pc":[3418]},{"teal":3354,"source":799,"pc":[3419]},{"teal":3355,"source":799,"pc":[3420,3421]},{"teal":3356,"source":799,"pc":[3422,3423,3424]},{"teal":3365,"source":844,"pc":[3425,3426]},{"teal":3366,"source":844,"pc":[3427]},{"teal":3367,"source":844,"pc":[3428,3429]},{"teal":3368,"source":844,"pc":[3430]},{"teal":3369,"source":844,"pc":[3431]},{"teal":3370,"source":844,"pc":[3432,3433]},{"teal":3371,"source":844,"pc":[3434]},{"teal":3372,"source":844,"pc":[3435,3436]},{"teal":3376,"source":845,"pc":[3437,3438]},{"teal":3377,"source":845,"pc":[3439]},{"teal":3378,"source":845,"pc":[3440,3441]},{"teal":3379,"source":845,"pc":[3442]},{"teal":3380,"source":845,"pc":[3443,3444]},{"teal":3381,"source":845,"pc":[3445]},{"teal":3382,"source":845,"pc":[3446]},{"teal":3387,"source":846,"pc":[3447,3448]},{"teal":3388,"source":846,"pc":[3449]},{"teal":3389,"source":847,"pc":[3450]},{"teal":3390,"source":847,"pc":[3451,3452]},{"teal":3391,"source":847,"pc":[3453]},{"teal":3392,"source":847,"pc":[3454,3455]},{"teal":3393,"source":847,"pc":[3456]},{"teal":3394,"source":847,"pc":[3457]},{"teal":3395,"source":847,"pc":[3458]},{"teal":3396,"source":847,"pc":[3459]},{"teal":3397,"source":847,"pc":[3460]},{"teal":3398,"source":847,"pc":[3461,3462]},{"teal":3399,"source":847,"pc":[3463]},{"teal":3402,"source":847,"errorMessage":"this.stakeAccumulator.value + (increasedStake as uint128) * (roundsLeftInBin as uint128) overflowed 128 bits","pc":[3464]},{"teal":3403,"source":847,"pc":[3465,3466]},{"teal":3404,"source":847,"pc":[3467]},{"teal":3405,"source":847,"pc":[3468]},{"teal":3406,"source":847,"pc":[3469]},{"teal":3407,"source":847,"pc":[3470]},{"teal":3408,"source":847,"pc":[3471,3472]},{"teal":3409,"source":847,"pc":[3473]},{"teal":3410,"source":847,"pc":[3474]},{"teal":3411,"source":847,"pc":[3475]},{"teal":3412,"source":846,"pc":[3476]},{"teal":3416,"source":848,"pc":[3477,3478]},{"teal":3417,"source":848,"pc":[3479]},{"teal":3418,"source":848,"pc":[3480]},{"teal":3419,"source":848,"pc":[3481,3482]},{"teal":3420,"source":848,"pc":[3483]},{"teal":3421,"source":848,"pc":[3484]},{"teal":3434,"source":854,"pc":[3485]},{"teal":3435,"source":854,"pc":[3486]},{"teal":3436,"source":854,"pc":[3487,3488]},{"teal":3437,"source":854,"pc":[3489,3490,3491,3492,3493,3494]},{"teal":3438,"source":854,"pc":[3495,3496]},{"teal":3442,"source":855,"pc":[3497]},{"teal":3443,"source":855,"pc":[3498]},{"teal":3444,"source":855,"pc":[3499,3500]},{"teal":3454,"source":857,"pc":[3501]},{"teal":3455,"source":857,"pc":[3502]},{"teal":3456,"source":857,"pc":[3503]},{"teal":3457,"source":857,"pc":[3504]},{"teal":3458,"source":857,"pc":[3505]},{"teal":3459,"source":857,"pc":[3506]},{"teal":3460,"source":857,"pc":[3507]},{"teal":3461,"source":857,"pc":[3508,3509,3510]},{"teal":3462,"source":857,"pc":[3511]},{"teal":3463,"source":857,"pc":[3512]},{"teal":3464,"source":857,"pc":[3513,3514]},{"teal":3465,"source":858,"pc":[3515,3516]},{"teal":3466,"source":858,"pc":[3517]},{"teal":3467,"source":858,"pc":[3518,3519]},{"teal":3468,"source":859,"pc":[3520,3521]},{"teal":3469,"source":859,"pc":[3522]},{"teal":3470,"source":859,"pc":[3523,3524]},{"teal":3471,"source":860,"pc":[3525,3526]},{"teal":3472,"source":860,"pc":[3527]},{"teal":3473,"source":860,"pc":[3528,3529]},{"teal":3474,"source":861,"pc":[3530,3531]},{"teal":3475,"source":861,"pc":[3532]},{"teal":3476,"source":861,"pc":[3533,3534]},{"teal":3479,"source":854,"pc":[3535]},{"teal":3480,"source":854,"pc":[3536,3537]},{"teal":3483,"source":854,"pc":[3538]},{"teal":3484,"source":512,"pc":[3539]},{"teal":3489,"source":886,"pc":[3540,3541,3542]},{"teal":3490,"source":886,"pc":[3543]},{"teal":3493,"source":885,"pc":[3544,3545,3546]},{"teal":3494,"source":885,"pc":[3547]},{"teal":3497,"source":884,"pc":[3548,3549,3550]},{"teal":3498,"source":884,"pc":[3551]},{"teal":3501,"source":883,"pc":[3552,3553,3554]},{"teal":3502,"source":883,"pc":[3555,3556,3557]},{"teal":3505,"source":882,"pc":[3558,3559,3560]},{"teal":3506,"source":882,"pc":[3561,3562,3563]},{"teal":3509,"source":881,"pc":[3564,3565,3566]},{"teal":3510,"source":881,"pc":[3567,3568,3569]},{"teal":3513,"source":880,"pc":[3570,3571]},{"teal":3514,"source":880,"pc":[3572]},{"teal":3515,"source":880,"pc":[3573]},{"teal":3516,"source":880,"pc":[3574]},{"teal":3517,"source":880,"pc":[3575,3576]},{"teal":3518,"source":880,"pc":[3577]},{"teal":3519,"source":880,"pc":[3578]},{"teal":3522,"source":880,"errorMessage":"argument 6 (feePayment) for goOnline must be a pay transaction","pc":[3579]},{"teal":3525,"source":879,"pc":[3580,3581,3582]},{"teal":3526,"source":879,"pc":[3583]},{"teal":3527,"source":879,"pc":[3584]},{"teal":3543,"source":879,"pc":[3585,3586,3587]},{"teal":3546,"source":879,"pc":[3588,3589]},{"teal":3550,"source":888,"pc":[3590,3591,3592]},{"teal":3553,"source":888,"errorMessage":"can only be called by owner or manager of validator","pc":[3593]},{"teal":3557,"source":889,"pc":[3594,3595,3596]},{"teal":3558,"source":889,"pc":[3597,3598]},{"teal":3563,"source":890,"pc":[3599,3600]},{"teal":3564,"source":890,"pc":[3601,3602]},{"teal":3565,"source":890,"pc":[3603,3604]},{"teal":3566,"source":890,"pc":[3605]},{"teal":3569,"source":890,"errorMessage":"transaction verification failed: {\"txn\":\"feePayment\",\"field\":\"receiver\",\"expected\":\"this.app.address\"}","pc":[3606]},{"teal":3572,"source":890,"pc":[3607,3608]},{"teal":3573,"source":890,"pc":[3609,3610]},{"teal":3574,"source":890,"pc":[3611,3612]},{"teal":3575,"source":890,"pc":[3613]},{"teal":3578,"source":890,"errorMessage":"transaction verification failed: {\"txn\":\"feePayment\",\"field\":\"amount\",\"expected\":\"extraFee\"}","pc":[3614]},{"teal":3590,"source":891,"pc":[3615]},{"teal":3591,"source":891,"pc":[3616,3617]},{"teal":3592,"source":891,"pc":[3618,3619]},{"teal":3596,"source":892,"pc":[3620,3621]},{"teal":3597,"source":892,"pc":[3622,3623]},{"teal":3601,"source":893,"pc":[3624,3625]},{"teal":3602,"source":893,"pc":[3626,3627]},{"teal":3606,"source":894,"pc":[3628,3629]},{"teal":3607,"source":894,"pc":[3630,3631]},{"teal":3611,"source":895,"pc":[3632,3633]},{"teal":3612,"source":895,"pc":[3634,3635]},{"teal":3616,"source":896,"pc":[3636,3637]},{"teal":3617,"source":896,"pc":[3638,3639]},{"teal":3621,"source":897,"pc":[3640,3641]},{"teal":3622,"source":897,"pc":[3642,3643]},{"teal":3626,"source":898,"pc":[3644,3645]},{"teal":3627,"source":898,"pc":[3646,3647]},{"teal":3630,"source":891,"pc":[3648]},{"teal":3631,"source":879,"pc":[3649]},{"teal":3636,"source":907,"pc":[3650,3651,3652]},{"teal":3637,"source":907,"pc":[3653]},{"teal":3638,"source":907,"pc":[3654]},{"teal":3645,"source":907,"pc":[3655,3656,3657]},{"teal":3650,"source":910,"pc":[3658,3659]},{"teal":3651,"source":910,"pc":[3660]},{"teal":3652,"source":910,"pc":[3661]},{"teal":3653,"source":910,"pc":[3662,3663]},{"teal":3654,"source":910,"pc":[3664]},{"teal":3655,"source":910,"pc":[3665]},{"teal":3656,"source":910,"pc":[3666,3667,3668]},{"teal":3661,"source":911,"pc":[3669,3670,3671]},{"teal":3664,"source":911,"errorMessage":"can only be called by owner or manager of validator","pc":[3672]},{"teal":3669,"source":914,"pc":[3673]},{"teal":3670,"source":914,"pc":[3674,3675]},{"teal":3671,"source":914,"pc":[3676,3677]},{"teal":3674,"source":914,"pc":[3678]},{"teal":3675,"source":914,"pc":[3679,3680]},{"teal":3678,"source":914,"pc":[3681]},{"teal":3679,"source":907,"pc":[3682]},{"teal":3684,"source":920,"pc":[3683,3684,3685]},{"teal":3685,"source":920,"pc":[3686,3687,3688]},{"teal":3688,"source":920,"pc":[3689,3690,3691]},{"teal":3689,"source":920,"pc":[3692]},{"teal":3692,"source":920,"pc":[3693,3694,3695]},{"teal":3693,"source":920,"pc":[3696]},{"teal":3694,"source":920,"pc":[3697]},{"teal":3698,"source":920,"pc":[3698,3699,3700]},{"teal":3702,"source":921,"pc":[3701,3702,3703]},{"teal":3705,"source":921,"errorMessage":"can only be called by owner or manager of validator","pc":[3704]},{"teal":3713,"source":923,"pc":[3705]},{"teal":3714,"source":923,"pc":[3706]},{"teal":3715,"source":923,"pc":[3707,3708]},{"teal":3719,"source":924,"pc":[3709,3710]},{"teal":3720,"source":924,"pc":[3711,3712]},{"teal":3724,"source":925,"pc":[3713,3714,3715,3716,3717,3718,3719,3720,3721,3722,3723,3724,3725,3726,3727,3728,3729]},{"teal":3725,"source":925,"pc":[3730,3731]},{"teal":3726,"source":925,"pc":[3732,3733]},{"teal":3727,"source":925,"pc":[3734,3735]},{"teal":3728,"source":925,"pc":[3736,3737]},{"teal":3729,"source":925,"pc":[3738]},{"teal":3730,"source":925,"pc":[3739,3740]},{"teal":3731,"source":925,"pc":[3741,3742]},{"teal":3732,"source":925,"pc":[3743,3744]},{"teal":3736,"source":926,"pc":[3745,3746]},{"teal":3737,"source":926,"pc":[3747,3748]},{"teal":3740,"source":923,"pc":[3749]},{"teal":3741,"source":923,"pc":[3750,3751]},{"teal":3744,"source":923,"pc":[3752]},{"teal":3745,"source":920,"pc":[3753]},{"teal":3750,"source":936,"pc":[3754,3755]},{"teal":3753,"source":936,"pc":[3756,3757,3758]},{"teal":3754,"source":936,"pc":[3759]},{"teal":3755,"source":936,"pc":[3760]},{"teal":3756,"source":936,"pc":[3761,3762]},{"teal":3757,"source":936,"pc":[3763]},{"teal":3760,"source":936,"errorMessage":"argument 0 (poolKey) for proxiedSetTokenPayoutRatio must be a (uint64,uint64,uint64)","pc":[3764]},{"teal":3763,"source":936,"pc":[3765,3766,3767]},{"teal":3764,"source":936,"pc":[3768]},{"teal":3765,"source":936,"pc":[3769]},{"teal":3766,"source":936,"pc":[3770]},{"teal":3767,"source":936,"pc":[3771]},{"teal":3776,"source":936,"pc":[3772,3773,3774]},{"teal":3779,"source":936,"pc":[3775,3776]},{"teal":3783,"source":937,"pc":[3777]},{"teal":3784,"source":937,"pc":[3778]},{"teal":3785,"source":937,"pc":[3779,3780]},{"teal":3786,"source":937,"pc":[3781,3782,3783]},{"teal":3787,"source":937,"pc":[3784]},{"teal":3788,"source":937,"pc":[3785]},{"teal":3791,"source":937,"errorMessage":"caller must be part of same validator set!","pc":[3786]},{"teal":3795,"source":938,"pc":[3787]},{"teal":3796,"source":938,"pc":[3788]},{"teal":3797,"source":938,"pc":[3789]},{"teal":3798,"source":938,"pc":[3790]},{"teal":3801,"source":938,"errorMessage":"callee must be pool 1","pc":[3791]},{"teal":3805,"source":939,"pc":[3792,3793]},{"teal":3806,"source":939,"pc":[3794,3795,3796]},{"teal":3807,"source":939,"pc":[3797]},{"teal":3808,"source":939,"pc":[3798]},{"teal":3809,"source":939,"pc":[3799]},{"teal":3812,"source":939,"errorMessage":"caller must NOT be pool 1","pc":[3800]},{"teal":3819,"source":941,"pc":[3801]},{"teal":3820,"source":941,"pc":[3802]},{"teal":3821,"source":941,"pc":[3803,3804]},{"teal":3822,"source":941,"pc":[3805,3806]},{"teal":3823,"source":941,"pc":[3807,3808]},{"teal":3827,"source":942,"pc":[3809]},{"teal":3828,"source":942,"pc":[3810]},{"teal":3829,"source":942,"pc":[3811,3812]},{"teal":3833,"source":943,"pc":[3813,3814]},{"teal":3834,"source":943,"pc":[3815,3816,3817]},{"teal":3835,"source":943,"pc":[3818]},{"teal":3836,"source":943,"pc":[3819]},{"teal":3837,"source":943,"pc":[3820,3821]},{"teal":3838,"source":943,"pc":[3822,3823]},{"teal":3839,"source":943,"pc":[3824,3825,3826]},{"teal":3840,"source":943,"pc":[3827]},{"teal":3841,"source":943,"pc":[3828]},{"teal":3842,"source":943,"pc":[3829,3830]},{"teal":3845,"source":941,"pc":[3831]},{"teal":3846,"source":941,"pc":[3832,3833]},{"teal":3849,"source":941,"pc":[3834]},{"teal":3850,"source":941,"pc":[3835,3836]},{"teal":3851,"source":941,"pc":[3837]},{"teal":3852,"source":941,"pc":[3838]},{"teal":3853,"source":941,"pc":[3839,3840]},{"teal":3854,"source":941,"pc":[3841,3842,3843]},{"teal":3855,"source":941,"pc":[3844]},{"teal":3856,"source":941,"pc":[3845,3846]},{"teal":3860,"source":945,"pc":[3847,3848]},{"teal":3861,"source":945,"pc":[3849,3850]},{"teal":3862,"source":945,"pc":[3851,3852,3853]},{"teal":3863,"source":945,"pc":[3854]},{"teal":3864,"source":945,"pc":[3855]},{"teal":3865,"source":945,"pc":[3856]},{"teal":3869,"source":946,"pc":[3857,3858]},{"teal":3870,"source":946,"pc":[3859,3860]},{"teal":3871,"source":946,"pc":[3861,3862,3863]},{"teal":3872,"source":946,"pc":[3864]},{"teal":3873,"source":946,"pc":[3865,3866]},{"teal":3874,"source":946,"pc":[3867]},{"teal":3875,"source":946,"pc":[3868]},{"teal":3876,"source":946,"pc":[3869]},{"teal":3883,"source":948,"pc":[3870]},{"teal":3884,"source":948,"pc":[3871]},{"teal":3885,"source":948,"pc":[3872,3873]},{"teal":3886,"source":948,"pc":[3874,3875]},{"teal":3887,"source":948,"pc":[3876,3877]},{"teal":3891,"source":949,"pc":[3878]},{"teal":3892,"source":949,"pc":[3879]},{"teal":3893,"source":949,"pc":[3880,3881]},{"teal":3897,"source":950,"pc":[3882]},{"teal":3898,"source":950,"pc":[3883]},{"teal":3899,"source":950,"pc":[3884]},{"teal":3900,"source":950,"pc":[3885,3886]},{"teal":3903,"source":948,"pc":[3887]},{"teal":3904,"source":948,"pc":[3888,3889]},{"teal":3907,"source":948,"pc":[3890]},{"teal":3908,"source":948,"pc":[3891,3892]},{"teal":3909,"source":948,"pc":[3893]},{"teal":3910,"source":948,"pc":[3894]},{"teal":3911,"source":948,"pc":[3895,3896]},{"teal":3912,"source":948,"pc":[3897,3898,3899]},{"teal":3915,"source":936,"pc":[3900,3901]},{"teal":3916,"source":936,"pc":[3902]},{"teal":3920,"source":954,"pc":[3903,3904,3905]},{"teal":3923,"source":954,"pc":[3906,3907]},{"teal":3930,"source":955,"pc":[3908]},{"teal":3931,"source":955,"pc":[3909]},{"teal":3932,"source":955,"pc":[3910,3911]},{"teal":3933,"source":955,"pc":[3912,3913,3914,3915,3916,3917]},{"teal":3934,"source":955,"pc":[3918,3919]},{"teal":3938,"source":956,"pc":[3920]},{"teal":3939,"source":956,"pc":[3921]},{"teal":3940,"source":956,"pc":[3922,3923]},{"teal":3944,"source":957,"pc":[3924]},{"teal":3945,"source":957,"pc":[3925]},{"teal":3946,"source":957,"pc":[3926]},{"teal":3947,"source":957,"pc":[3927,3928]},{"teal":3950,"source":955,"pc":[3929]},{"teal":3951,"source":955,"pc":[3930,3931]},{"teal":3954,"source":955,"pc":[3932]},{"teal":3955,"source":955,"pc":[3933,3934]},{"teal":3956,"source":955,"pc":[3935]},{"teal":3957,"source":955,"pc":[3936]},{"teal":3958,"source":955,"pc":[3937,3938]},{"teal":3959,"source":955,"pc":[3939,3940,3941]},{"teal":3960,"source":955,"pc":[3942,3943]},{"teal":3964,"source":959,"pc":[3944,3945]},{"teal":3965,"source":959,"pc":[3946,3947]},{"teal":3966,"source":959,"pc":[3948,3949,3950]},{"teal":3967,"source":959,"pc":[3951]},{"teal":3968,"source":959,"pc":[3952]},{"teal":3969,"source":959,"pc":[3953,3954,3955]},{"teal":3970,"source":959,"pc":[3956,3957]},{"teal":3971,"source":959,"pc":[3958,3959]},{"teal":3972,"source":959,"pc":[3960,3961,3962]},{"teal":3973,"source":959,"pc":[3963]},{"teal":3974,"source":959,"pc":[3964]},{"teal":3978,"source":954,"pc":[3965,3966]},{"teal":3979,"source":954,"pc":[3967]},{"teal":3986,"source":966,"pc":[3968,3969,3970]},{"teal":3989,"source":966,"pc":[3971,3972]},{"teal":3993,"source":967,"pc":[3973,3974,3975]},{"teal":3994,"source":967,"pc":[3976,3977]},{"teal":3998,"source":969,"pc":[3978,3979]},{"teal":3999,"source":969,"pc":[3980,3981]},{"teal":4000,"source":969,"pc":[3982]},{"teal":4001,"source":969,"pc":[3983]},{"teal":4002,"source":969,"pc":[3984,3985]},{"teal":4003,"source":969,"pc":[3986]},{"teal":4004,"source":969,"pc":[3987]},{"teal":4005,"source":969,"pc":[3988]},{"teal":4006,"source":969,"pc":[3989]},{"teal":4007,"source":969,"pc":[3990]},{"teal":4010,"source":969,"errorMessage":"wideRatio failed","pc":[3991]},{"teal":4013,"source":966,"pc":[3992,3993]},{"teal":4014,"source":966,"pc":[3994]},{"teal":4018,"source":972,"pc":[3995,3996,3997]},{"teal":4023,"source":974,"pc":[3998,3999]},{"teal":4024,"source":974,"pc":[4000,4001]},{"teal":4025,"source":974,"pc":[4002]},{"teal":4026,"source":974,"pc":[4003]},{"teal":4027,"source":974,"pc":[4004,4005,4006]},{"teal":4032,"source":975,"pc":[4007,4008]},{"teal":4033,"source":975,"pc":[4009]},{"teal":4038,"source":977,"pc":[4010]},{"teal":4039,"source":972,"pc":[4011]},{"teal":4043,"source":980,"pc":[4012,4013,4014]},{"teal":4047,"source":981,"pc":[4015]},{"teal":4048,"source":980,"pc":[4016]},{"teal":4054,"source":987,"pc":[4017,4018,4019]},{"teal":4057,"source":987,"pc":[4020,4021]},{"teal":4058,"source":987,"pc":[4022,4023]},{"teal":4062,"source":988,"pc":[4024,4025]},{"teal":4063,"source":988,"pc":[4026]},{"teal":4064,"source":988,"pc":[4027]},{"teal":4065,"source":988,"pc":[4028,4029]},{"teal":4070,"source":989,"pc":[4030,4031]},{"teal":4071,"source":989,"pc":[4032,4033]},{"teal":4072,"source":989,"pc":[4034]},{"teal":4073,"source":989,"pc":[4035,4036]},{"teal":4074,"source":989,"pc":[4037]},{"teal":4075,"source":989,"pc":[4038]},{"teal":4076,"source":989,"pc":[4039]},{"teal":4077,"source":989,"pc":[4040]},{"teal":4080,"source":989,"errorMessage":"currentBinSize as uint64 overflowed 64 bits","pc":[4041]},{"teal":4081,"source":989,"pc":[4042,4043,4044,4045,4046,4047,4048,4049,4050,4051]},{"teal":4082,"source":989,"pc":[4052]},{"teal":4083,"source":989,"pc":[4053]},{"teal":4084,"source":989,"pc":[4054]},{"teal":4085,"source":989,"pc":[4055]},{"teal":4086,"source":989,"pc":[4056,4057]},{"teal":4087,"source":989,"pc":[4058]},{"teal":4088,"source":989,"pc":[4059]},{"teal":4089,"source":989,"pc":[4060]},{"teal":4090,"source":989,"pc":[4061]},{"teal":4091,"source":989,"pc":[4062]},{"teal":4092,"source":989,"pc":[4063]},{"teal":4093,"source":989,"pc":[4064,4065,4066]},{"teal":4099,"source":990,"pc":[4067,4068]},{"teal":4100,"source":990,"pc":[4069,4070]},{"teal":4101,"source":990,"pc":[4071]},{"teal":4102,"source":990,"pc":[4072,4073,4074]},{"teal":4107,"source":991,"pc":[4075]},{"teal":4108,"source":991,"pc":[4076]},{"teal":4109,"source":991,"pc":[4077,4078]},{"teal":4110,"source":991,"pc":[4079]},{"teal":4111,"source":991,"pc":[4080,4081]},{"teal":4112,"source":991,"pc":[4082,4083]},{"teal":4113,"source":991,"pc":[4084]},{"teal":4114,"source":991,"pc":[4085,4086]},{"teal":4115,"source":991,"pc":[4087,4088]},{"teal":4116,"source":991,"pc":[4089,4090]},{"teal":4117,"source":991,"pc":[4091,4092]},{"teal":4118,"source":991,"pc":[4093]},{"teal":4123,"source":993,"pc":[4094,4095]},{"teal":4124,"source":993,"pc":[4096,4097,4098,4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,4109,4110,4111,4112,4113]},{"teal":4125,"source":993,"pc":[4114]},{"teal":4126,"source":993,"pc":[4115]},{"teal":4127,"source":993,"pc":[4116]},{"teal":4128,"source":993,"pc":[4117,4118]},{"teal":4129,"source":993,"pc":[4119]},{"teal":4132,"source":993,"errorMessage":"currentBinSize * (365 as uint128) overflowed 128 bits","pc":[4120]},{"teal":4133,"source":993,"pc":[4121,4122]},{"teal":4134,"source":993,"pc":[4123]},{"teal":4135,"source":993,"pc":[4124]},{"teal":4136,"source":993,"pc":[4125]},{"teal":4137,"source":993,"pc":[4126]},{"teal":4138,"source":993,"pc":[4127,4128]},{"teal":4139,"source":993,"pc":[4129]},{"teal":4140,"source":993,"pc":[4130]},{"teal":4141,"source":993,"pc":[4131]},{"teal":4142,"source":993,"pc":[4132,4133]},{"teal":4146,"source":994,"pc":[4134,4135]},{"teal":4147,"source":994,"pc":[4136]},{"teal":4148,"source":994,"pc":[4137,4138]},{"teal":4149,"source":994,"pc":[4139]},{"teal":4150,"source":994,"pc":[4140]},{"teal":4151,"source":994,"pc":[4141]},{"teal":4152,"source":994,"pc":[4142,4143]},{"teal":4153,"source":994,"pc":[4144]},{"teal":4156,"source":994,"errorMessage":"this.stakeAccumulator.value / currentBinSize overflowed 128 bits","pc":[4145]},{"teal":4157,"source":994,"pc":[4146,4147]},{"teal":4158,"source":994,"pc":[4148]},{"teal":4159,"source":994,"pc":[4149]},{"teal":4160,"source":994,"pc":[4150]},{"teal":4161,"source":994,"pc":[4151]},{"teal":4162,"source":994,"pc":[4152,4153]},{"teal":4163,"source":994,"pc":[4154]},{"teal":4164,"source":994,"pc":[4155]},{"teal":4165,"source":994,"pc":[4156]},{"teal":4166,"source":994,"pc":[4157,4158]},{"teal":4171,"source":995,"pc":[4159,4160]},{"teal":4172,"source":995,"pc":[4161,4162]},{"teal":4173,"source":995,"pc":[4163]},{"teal":4174,"source":995,"pc":[4164,4165,4166]},{"teal":4181,"source":1000,"pc":[4167,4168]},{"teal":4182,"source":1000,"pc":[4169]},{"teal":4183,"source":1000,"pc":[4170]},{"teal":4184,"source":1000,"pc":[4171,4172,4173,4174,4175,4176,4177,4178,4179,4180,4181,4182,4183,4184,4185,4186,4187,4188]},{"teal":4185,"source":1000,"pc":[4189]},{"teal":4186,"source":1000,"pc":[4190,4191]},{"teal":4187,"source":1000,"pc":[4192]},{"teal":4188,"source":1001,"pc":[4193,4194]},{"teal":4189,"source":1001,"pc":[4195,4196]},{"teal":4190,"source":1001,"pc":[4197]},{"teal":4191,"source":1000,"pc":[4198]},{"teal":4192,"source":1000,"pc":[4199]},{"teal":4193,"source":1000,"pc":[4200]},{"teal":4194,"source":1000,"pc":[4201,4202]},{"teal":4195,"source":1000,"pc":[4203]},{"teal":4198,"source":1000,"errorMessage":"(((this.rewardAccumulator.value as uint128) * (10000 as uint128)) / avgStake) *\r\\n (approxRoundsPerYear / currentBinSize) overflowed 128 bits","pc":[4204]},{"teal":4199,"source":1000,"pc":[4205,4206]},{"teal":4200,"source":1000,"pc":[4207]},{"teal":4201,"source":1000,"pc":[4208]},{"teal":4202,"source":1000,"pc":[4209]},{"teal":4203,"source":1000,"pc":[4210]},{"teal":4204,"source":1000,"pc":[4211,4212]},{"teal":4205,"source":1000,"pc":[4213]},{"teal":4206,"source":1000,"pc":[4214]},{"teal":4207,"source":1000,"pc":[4215]},{"teal":4208,"source":999,"pc":[4216,4217]},{"teal":4212,"source":1003,"pc":[4218,4219,4220,4221,4222,4223,4224,4225,4226,4227,4228,4229,4230,4231,4232,4233,4234,4235]},{"teal":4213,"source":1003,"pc":[4236,4237]},{"teal":4218,"source":1005,"pc":[4238,4239]},{"teal":4219,"source":1005,"pc":[4240,4241,4242,4243,4244,4245,4246,4247,4248,4249,4250,4251,4252,4253,4254,4255,4256,4257]},{"teal":4220,"source":1005,"pc":[4258]},{"teal":4221,"source":1005,"pc":[4259,4260,4261]},{"teal":4226,"source":1006,"pc":[4262,4263,4264,4265,4266,4267,4268,4269,4270,4271,4272,4273,4274,4275,4276,4277,4278,4279]},{"teal":4227,"source":1006,"pc":[4280,4281]},{"teal":4234,"source":1008,"pc":[4282,4283]},{"teal":4235,"source":1008,"pc":[4284]},{"teal":4236,"source":1009,"pc":[4285]},{"teal":4237,"source":1009,"pc":[4286,4287]},{"teal":4238,"source":1009,"pc":[4288,4289]},{"teal":4239,"source":1009,"pc":[4290]},{"teal":4240,"source":1009,"pc":[4291]},{"teal":4241,"source":1009,"pc":[4292,4293]},{"teal":4242,"source":1009,"pc":[4294]},{"teal":4243,"source":1010,"pc":[4295,4296]},{"teal":4244,"source":1010,"pc":[4297,4298]},{"teal":4245,"source":1010,"pc":[4299]},{"teal":4246,"source":1010,"pc":[4300,4301]},{"teal":4247,"source":1010,"pc":[4302]},{"teal":4248,"source":1009,"pc":[4303]},{"teal":4249,"source":1009,"pc":[4304]},{"teal":4250,"source":1009,"pc":[4305]},{"teal":4251,"source":1009,"pc":[4306,4307]},{"teal":4252,"source":1009,"pc":[4308]},{"teal":4255,"source":1009,"errorMessage":"(this.weightedMovingAverage.value * ((100 as uint128) - alpha)) / (100 as uint128) +\r\\n (apr * alpha) / (100 as uint128) overflowed 128 bits","pc":[4309]},{"teal":4256,"source":1009,"pc":[4310,4311]},{"teal":4257,"source":1009,"pc":[4312]},{"teal":4258,"source":1009,"pc":[4313]},{"teal":4259,"source":1009,"pc":[4314]},{"teal":4260,"source":1009,"pc":[4315]},{"teal":4261,"source":1009,"pc":[4316,4317]},{"teal":4262,"source":1009,"pc":[4318]},{"teal":4263,"source":1009,"pc":[4319]},{"teal":4264,"source":1009,"pc":[4320]},{"teal":4265,"source":1008,"pc":[4321]},{"teal":4270,"source":1014,"pc":[4322,4323,4324]},{"teal":4274,"source":1015,"pc":[4325,4326]},{"teal":4275,"source":1015,"pc":[4327,4328]},{"teal":4276,"source":1015,"pc":[4329]},{"teal":4277,"source":1015,"pc":[4330]},{"teal":4278,"source":1015,"pc":[4331,4332]},{"teal":4279,"source":1015,"pc":[4333]},{"teal":4280,"source":1015,"pc":[4334]},{"teal":4281,"source":1015,"pc":[4335]},{"teal":4282,"source":1015,"pc":[4336]},{"teal":4283,"source":1015,"pc":[4337]},{"teal":4284,"source":1015,"pc":[4338,4339]},{"teal":4285,"source":1015,"pc":[4340]},{"teal":4288,"source":1015,"errorMessage":"(this.totalAlgoStaked.value as uint128) * (this.roundsPerDay.value as uint128) overflowed 128 bits","pc":[4341]},{"teal":4289,"source":1015,"pc":[4342,4343]},{"teal":4290,"source":1015,"pc":[4344]},{"teal":4291,"source":1015,"pc":[4345]},{"teal":4292,"source":1015,"pc":[4346]},{"teal":4293,"source":1015,"pc":[4347]},{"teal":4294,"source":1015,"pc":[4348,4349]},{"teal":4295,"source":1015,"pc":[4350]},{"teal":4296,"source":1015,"pc":[4351]},{"teal":4297,"source":1015,"pc":[4352]},{"teal":4298,"source":1015,"pc":[4353]},{"teal":4302,"source":1016,"pc":[4354,4355]},{"teal":4303,"source":1016,"pc":[4356]},{"teal":4304,"source":1016,"pc":[4357]},{"teal":4308,"source":1017,"pc":[4358,4359]},{"teal":4309,"source":1017,"pc":[4360,4361]},{"teal":4310,"source":1017,"pc":[4362,4363]},{"teal":4311,"source":1017,"pc":[4364,4365]},{"teal":4312,"source":1017,"pc":[4366]},{"teal":4313,"source":1017,"pc":[4367]},{"teal":4314,"source":1017,"pc":[4368]},{"teal":4315,"source":1017,"pc":[4369]},{"teal":4318,"source":987,"pc":[4370]},{"teal":4322,"source":1021,"pc":[4371,4372,4373]},{"teal":4326,"source":1022,"pc":[4374,4375]},{"teal":4327,"source":1022,"pc":[4376,4377,4378,4379]},{"teal":4328,"source":1022,"pc":[4380]},{"teal":4329,"source":1021,"pc":[4381]},{"teal":4332,"source":37,"pc":[4382,4383,4384,4385,4386,4387]},{"teal":4333,"source":37,"pc":[4388,4389,4390]},{"teal":4334,"source":37,"pc":[4391,4392,4393,4394]},{"teal":4337,"source":37,"errorMessage":"this contract does not implement the given ABI method for create NoOp","pc":[4395]},{"teal":4340,"source":37,"pc":[4396,4397,4398,4399,4400,4401]},{"teal":4341,"source":37,"pc":[4402,4403,4404,4405,4406,4407]},{"teal":4342,"source":37,"pc":[4408,4409,4410,4411,4412,4413]},{"teal":4343,"source":37,"pc":[4414,4415,4416,4417,4418,4419]},{"teal":4344,"source":37,"pc":[4420,4421,4422,4423,4424,4425]},{"teal":4345,"source":37,"pc":[4426,4427,4428,4429,4430,4431]},{"teal":4346,"source":37,"pc":[4432,4433,4434,4435,4436,4437]},{"teal":4347,"source":37,"pc":[4438,4439,4440,4441,4442,4443]},{"teal":4348,"source":37,"pc":[4444,4445,4446,4447,4448,4449]},{"teal":4349,"source":37,"pc":[4450,4451,4452,4453,4454,4455]},{"teal":4350,"source":37,"pc":[4456,4457,4458,4459,4460,4461]},{"teal":4351,"source":37,"pc":[4462,4463,4464,4465,4466,4467]},{"teal":4352,"source":37,"pc":[4468,4469]},{"teal":4353,"source":37,"pc":[4470,4471,4472]},{"teal":4354,"source":37,"pc":[4473,4474,4475,4476,4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,4490,4491,4492,4493,4494,4495,4496,4497,4498,4499,4500]},{"teal":4357,"source":37,"errorMessage":"this contract does not implement the given ABI method for call NoOp","pc":[4501]}],"clear":[]},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCgovLyBUaGlzIFRFQUwgd2FzIGdlbmVyYXRlZCBieSBURUFMU2NyaXB0IHYwLjEwMy4wCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbGdvcmFuZGZvdW5kYXRpb24vVEVBTFNjcmlwdAoKLy8gVGhpcyBjb250cmFjdCBpcyBjb21wbGlhbnQgd2l0aCBhbmQvb3IgaW1wbGVtZW50cyB0aGUgZm9sbG93aW5nIEFSQ3M6IFsgQVJDNCBdCgovLyBUaGUgZm9sbG93aW5nIGxpbmVzIG9mIFRFQUwgYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0ZW1wbGF0ZSB2YXJpYWJsZXMgaW4gc2NyYXRjaCBzbG90cwpwdXNoYnl0ZXMgVE1QTF9uZmRSZWdpc3RyeUFwcElkCmJ0b2kKc3RvcmUgMjAwCgovLyBUaGUgZm9sbG93aW5nIHRlbiBsaW5lcyBvZiBURUFMIGhhbmRsZSBpbml0aWFsIHByb2dyYW0gZmxvdwovLyBUaGlzIHBhdHRlcm4gaXMgdXNlZCB0byBtYWtlIGl0IGVhc3kgZm9yIGFueW9uZSB0byBwYXJzZSB0aGUgc3RhcnQgb2YgdGhlIHByb2dyYW0gYW5kIGRldGVybWluZSBpZiBhIHNwZWNpZmljIGFjdGlvbiBpcyBhbGxvd2VkCi8vIEhlcmUsIGFjdGlvbiByZWZlcnMgdG8gdGhlIE9uQ29tcGxldGUgaW4gY29tYmluYXRpb24gd2l0aCB3aGV0aGVyIHRoZSBhcHAgaXMgYmVpbmcgY3JlYXRlZCBvciBjYWxsZWQKLy8gRXZlcnkgcG9zc2libGUgYWN0aW9uIGZvciB0aGlzIGNvbnRyYWN0IGlzIHJlcHJlc2VudGVkIGluIHRoZSBzd2l0Y2ggc3RhdGVtZW50Ci8vIElmIHRoZSBhY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIGluIHRoZSBjb250cmFjdCwgaXRzIHJlc3BlY3RpdmUgYnJhbmNoIHdpbGwgYmUgIipOT1RfSU1QTEVNRU5URUQiIHdoaWNoIGp1c3QgY29udGFpbnMgImVyciIKdHhuIEFwcGxpY2F0aW9uSUQKIQppbnQgNgoqCnR4biBPbkNvbXBsZXRpb24KKwpzd2l0Y2ggKmNhbGxfTm9PcCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKmNyZWF0ZV9Ob09wICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRAoKKk5PVF9JTVBMRU1FTlRFRDoKCS8vIFRoZSByZXF1ZXN0ZWQgYWN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIGNvbnRyYWN0LiBBcmUgeW91IHVzaW5nIHRoZSBjb3JyZWN0IE9uQ29tcGxldGU/IERpZCB5b3Ugc2V0IHlvdXIgYXBwIElEPwoJZXJyCgovLyBjcmVhdGVBcHBsaWNhdGlvbih1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZAoqYWJpX3JvdXRlX2NyZWF0ZUFwcGxpY2F0aW9uOgoJLy8gbWluRW50cnlTdGFrZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyA0CglidG9pCgoJLy8gcG9vbElkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDMKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglidG9pCgoJLy8gY3JlYXRpbmdDb250cmFjdElkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGNyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkCgljYWxsc3ViIGNyZWF0ZUFwcGxpY2F0aW9uCglpbnQgMQoJcmV0dXJuCgovLyBjcmVhdGVBcHBsaWNhdGlvbihjcmVhdGluZ0NvbnRyYWN0SWQ6IEFwcElELCB2YWxpZGF0b3JJZDogdWludDY0LCBwb29sSWQ6IHVpbnQ2NCwgbWluRW50cnlTdGFrZTogdWludDY0KTogdm9pZAovLwovLyBJbml0aWFsaXplIHRoZSBzdGFraW5nIHBvb2wgdy8gb3duZXIgYW5kIG1hbmFnZXIsIGJ1dCBjYW4gb25seSBiZSBjcmVhdGVkIGJ5IHRoZSB2YWxpZGF0b3IgY29udHJhY3QuCi8vIEBwYXJhbSB7dWludDY0fSBjcmVhdGluZ0NvbnRyYWN0SWQgLSBpZCBvZiBjb250cmFjdCB0aGF0IGNvbnN0cnVjdGVkIHVzIC0gdGhlIHZhbGlkYXRvciBhcHBsaWNhdGlvbiAoc2luZ2xlIGdsb2JhbCBpbnN0YW5jZSkKLy8gQHBhcmFtIHt1aW50NjR9IHZhbGlkYXRvcklkIC0gaWQgb2YgdmFsaWRhdG9yIHdlJ3JlIGEgc3Rha2luZyBwb29sIG9mCi8vIEBwYXJhbSB7dWludDY0fSBwb29sSWQgLSB3aGljaCBwb29sIGlkIGFyZSB3ZQovLyBAcGFyYW0ge3VpbnQ2NH0gbWluRW50cnlTdGFrZSAtIG1pbmltdW0gYW1vdW50IHRvIGJlIGluIHBvb2wsIGJ1dCBhbHNvIG1pbmltdW0gYW1vdW50IGJhbGFuY2UgY2FuJ3QgZ28gYmVsb3cgKHdpdGhvdXQgcmVtb3ZpbmcgYWxsISkKY3JlYXRlQXBwbGljYXRpb246Cglwcm90byA0IDAKCgkvLyAqaWYwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MTAyCgkvLyBjcmVhdGluZ0NvbnRyYWN0SWQgPT09IEFwcElELmZyb21VaW50NjQoMCkKCWZyYW1lX2RpZyAtMSAvLyBjcmVhdGluZ0NvbnRyYWN0SWQ6IEFwcElECglpbnQgMAoJPT0KCWJ6ICppZjBfZWxzZQoKCS8vICppZjBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MTA0CgkvLyBhc3NlcnQodmFsaWRhdG9ySWQgPT09IDApCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJaW50IDAKCT09Cglhc3NlcnQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoxMDUKCS8vIGFzc2VydChwb29sSWQgPT09IDApCglmcmFtZV9kaWcgLTMgLy8gcG9vbElkOiB1aW50NjQKCWludCAwCgk9PQoJYXNzZXJ0CgliICppZjBfZW5kCgoqaWYwX2Vsc2U6CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoxMDcKCS8vIGFzc2VydCh2YWxpZGF0b3JJZCAhPT0gMCkKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpbnQgMAoJIT0KCWFzc2VydAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjEwOAoJLy8gYXNzZXJ0KHBvb2xJZCAhPT0gMCkKCWZyYW1lX2RpZyAtMyAvLyBwb29sSWQ6IHVpbnQ2NAoJaW50IDAKCSE9Cglhc3NlcnQKCippZjBfZW5kOgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MTEwCgkvLyBhc3NlcnQobWluRW50cnlTdGFrZSA+PSBNSU5fQUxHT19TVEFLRV9QRVJfUE9PTCwgJ3N0YWtpbmcgcG9vbCBtdXN0IGhhdmUgbWluaW11bSBlbnRyeSBvZiAxIGFsZ28nKQoJZnJhbWVfZGlnIC00IC8vIG1pbkVudHJ5U3Rha2U6IHVpbnQ2NAoJaW50IDEwMDAwMDAKCT49CgoJLy8gc3Rha2luZyBwb29sIG11c3QgaGF2ZSBtaW5pbXVtIGVudHJ5IG9mIDEgYWxnbwoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MTExCgkvLyB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSA9IGNyZWF0aW5nQ29udHJhY3RJZAoJYnl0ZSAweDYzNzI2NTYxNzQ2ZjcyNDE3MDcwIC8vICJjcmVhdG9yQXBwIgoJZnJhbWVfZGlnIC0xIC8vIGNyZWF0aW5nQ29udHJhY3RJZDogQXBwSUQKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MTEyCgkvLyB0aGlzLnZhbGlkYXRvcklkLnZhbHVlID0gdmFsaWRhdG9ySWQKCWJ5dGUgMHg3NjYxNmM2OTY0NjE3NDZmNzI0OTY0IC8vICJ2YWxpZGF0b3JJZCIKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogdWludDY0CglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjExMwoJLy8gdGhpcy5wb29sSWQudmFsdWUgPSBwb29sSWQKCWJ5dGUgMHg3MDZmNmY2YzQ5NjQgLy8gInBvb2xJZCIKCWZyYW1lX2RpZyAtMyAvLyBwb29sSWQ6IHVpbnQ2NAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoxMTQKCS8vIHRoaXMubnVtU3Rha2Vycy52YWx1ZSA9IDAKCWJ5dGUgMHg2ZTc1NmQ1Mzc0NjE2YjY1NzI3MyAvLyAibnVtU3Rha2VycyIKCWludCAwCglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjExNQoJLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgPSAwCglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglpbnQgMAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoxMTYKCS8vIHRoaXMubWluRW50cnlTdGFrZS52YWx1ZSA9IG1pbkVudHJ5U3Rha2UKCWJ5dGUgMHg2ZDY5NmU0NTZlNzQ3Mjc5NTM3NDYxNmI2NSAvLyAibWluRW50cnlTdGFrZSIKCWZyYW1lX2RpZyAtNCAvLyBtaW5FbnRyeVN0YWtlOiB1aW50NjQKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MTE3CgkvLyB0aGlzLmxhc3RQYXlvdXQudmFsdWUgPSBnbG9iYWxzLnJvdW5kCglieXRlIDB4NmM2MTczNzQ1MDYxNzk2Zjc1NzQgLy8gImxhc3RQYXlvdXQiCglnbG9iYWwgUm91bmQKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MTE4CgkvLyB0aGlzLmVwb2NoTnVtYmVyLnZhbHVlID0gMAoJYnl0ZSAweDY1NzA2ZjYzNjg0ZTc1NmQ2MjY1NzIgLy8gImVwb2NoTnVtYmVyIgoJaW50IDAKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MTIwCgkvLyB0aGlzLnNldFJvdW5kc1BlckRheSgpCgljYWxsc3ViIHNldFJvdW5kc1BlckRheQoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjEyMQoJLy8gdGhpcy5iaW5Sb3VuZFN0YXJ0LnZhbHVlID0gZ2xvYmFscy5yb3VuZCAtIChnbG9iYWxzLnJvdW5kICUgdGhpcy5yb3VuZHNQZXJEYXkudmFsdWUpCglieXRlIDB4NjI2OTZlNTI2Zjc1NmU2NDUzNzQ2MTcyNzQgLy8gImJpblJvdW5kU3RhcnQiCglnbG9iYWwgUm91bmQKCWdsb2JhbCBSb3VuZAoJYnl0ZSAweDcyNmY3NTZlNjQ3MzUwNjU3MjQ0NjE3OSAvLyAicm91bmRzUGVyRGF5IgoJYXBwX2dsb2JhbF9nZXQKCSUKCS0KCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MTIyCgkvLyB0aGlzLnN0YWtlQWNjdW11bGF0b3IudmFsdWUgPSAwIGFzIHVpbnQxMjgKCWJ5dGUgMHg3Mzc0NjE2YjY1NDE2MzYzNzU2ZDc1NmM2MTc0NmY3MiAvLyAic3Rha2VBY2N1bXVsYXRvciIKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoxMjMKCS8vIHRoaXMucmV3YXJkQWNjdW11bGF0b3IudmFsdWUgPSAwCglieXRlIDB4NzI2NTc3NjE3MjY0NDE2MzYzNzU2ZDc1NmM2MTc0NmY3MiAvLyAicmV3YXJkQWNjdW11bGF0b3IiCglpbnQgMAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoxMjQKCS8vIHRoaXMud2VpZ2h0ZWRNb3ZpbmdBdmVyYWdlLnZhbHVlID0gMCBhcyB1aW50MTI4CglieXRlIDB4NjU3NzZkNjEgLy8gImV3bWEiCglieXRlIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIGdhcygpdm9pZAoqYWJpX3JvdXRlX2dhczoKCS8vIGV4ZWN1dGUgZ2FzKCl2b2lkCgljYWxsc3ViIGdhcwoJaW50IDEKCXJldHVybgoKLy8gZ2FzKCk6IHZvaWQKLy8KLy8gZ2FzIGlzIGEgZHVtbXkgbm8tb3AgY2FsbCB0aGF0IGNhbiBiZSB1c2VkIHRvIHBvb2wtdXAgcmVzb3VyY2UgcmVmZXJlbmNlcyBhbmQgb3Bjb2RlIGNvc3QKZ2FzOgoJcHJvdG8gMCAwCglyZXRzdWIKCi8vIGNvc3RGb3JCb3hTdG9yYWdlKHRvdGFsTnVtQnl0ZXM6IHVpbnQ2NCk6IHVpbnQ2NApjb3N0Rm9yQm94U3RvcmFnZToKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjEzNgoJLy8gcmV0dXJuIFNDQk9YX1BFUkJPWCArIHRvdGFsTnVtQnl0ZXMgKiBTQ0JPWF9QRVJCWVRFCglpbnQgMjUwMAoJZnJhbWVfZGlnIC0xIC8vIHRvdGFsTnVtQnl0ZXM6IHVpbnQ2NAoJaW50IDQwMAoJKgoJKwoJcmV0c3ViCgovLyBpbml0U3RvcmFnZShwYXkpdm9pZAoqYWJpX3JvdXRlX2luaXRTdG9yYWdlOgoJLy8gbWJyUGF5bWVudDogcGF5Cgl0eG4gR3JvdXBJbmRleAoJaW50IDEKCS0KCWR1cAoJZ3R4bnMgVHlwZUVudW0KCWludCBwYXkKCT09CgoJLy8gYXJndW1lbnQgMCAobWJyUGF5bWVudCkgZm9yIGluaXRTdG9yYWdlIG11c3QgYmUgYSBwYXkgdHJhbnNhY3Rpb24KCWFzc2VydAoKCS8vIGV4ZWN1dGUgaW5pdFN0b3JhZ2UocGF5KXZvaWQKCWNhbGxzdWIgaW5pdFN0b3JhZ2UKCWludCAxCglyZXR1cm4KCi8vIGluaXRTdG9yYWdlKG1iclBheW1lbnQ6IFBheVR4bik6IHZvaWQKLy8KLy8gQ2FsbGVkIGFmdGVyIHdlJ3JlIGNyZWF0ZWQgYW5kIHRoZW4gZnVuZGVkLCBzbyB3ZSBjYW4gY3JlYXRlIG91ciBsYXJnZSBzdGFrZXJzIGxlZGdlciBzdG9yYWdlCi8vIENhbGxlciBoYXMgdG8gZ2V0IE1CUiBhbW91bnRzIGZyb20gVmFsaWRhdG9yUmVnaXN0cnkgdG8ga25vdyBob3cgbXVjaCB0byBmdW5kIHVzIHRvIGNvdmVyIHRoZSBib3ggc3RvcmFnZSBjb3N0Ci8vIElmIHRoaXMgaXMgcG9vbCAxIEFORCB0aGUgdmFsaWRhdG9yIGhhcyBzcGVjaWZpZWQgYSByZXdhcmQgdG9rZW4sIG9wdC1pbiB0byB0aGF0IHRva2VuCi8vIHNvIHRoYXQgdGhlIHZhbGlkYXRvciBjYW4gc2VlZCB0aGUgcG9vbCB3aXRoIGZ1dHVyZSByZXdhcmRzIG9mIHRoYXQgdG9rZW4uCi8vIEBwYXJhbSBtYnJQYXltZW50IHBheW1lbnQgZnJvbSBjYWxsZXIgd2hpY2ggY292ZXJzIG1iciBpbmNyZWFzZSBvZiBuZXcgc3Rha2luZyBwb29scycgc3RvcmFnZQppbml0U3RvcmFnZToKCXByb3RvIDEgMAoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDMKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoxNDcKCS8vIGFzc2VydCghdGhpcy5zdGFrZXJzLmV4aXN0cywgJ3N0YWtpbmcgcG9vbCBhbHJlYWR5IGluaXRpYWxpemVkJykKCWJ5dGUgMHg3Mzc0NjE2YjY1NzI3MyAvLyAic3Rha2VycyIKCWJveF9sZW4KCXN3YXAKCXBvcAoJIQoKCS8vIHN0YWtpbmcgcG9vbCBhbHJlYWR5IGluaXRpYWxpemVkCglhc3NlcnQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoxNTAKCS8vIHZhbGlkYXRvckNvbmZpZyA9IHNlbmRNZXRob2RDYWxsPHR5cGVvZiBWYWxpZGF0b3JSZWdpc3RyeS5wcm90b3R5cGUuZ2V0VmFsaWRhdG9yQ29uZmlnPih7CgkvLyAgICAgICAgICAgICBhcHBsaWNhdGlvbklEOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKCS8vICAgICAgICAgICAgIG1ldGhvZEFyZ3M6IFt0aGlzLnZhbGlkYXRvcklkLnZhbHVlXSwKCS8vICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgltZXRob2QgImdldFZhbGlkYXRvckNvbmZpZyh1aW50NjQpKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoxNTEKCS8vIGFwcGxpY2F0aW9uSUQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlCglieXRlIDB4NjM3MjY1NjE3NDZmNzI0MTcwNzAgLy8gImNyZWF0b3JBcHAiCglhcHBfZ2xvYmFsX2dldAoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MTUyCgkvLyBtZXRob2RBcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZV0KCWJ5dGUgMHg3NjYxNmM2OTY0NjE3NDZmNzI0OTY0IC8vICJ2YWxpZGF0b3JJZCIKCWFwcF9nbG9iYWxfZ2V0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCWl0eG4gTnVtTG9ncwoJaW50IDEKCS0KCWl0eG5hcyBMb2dzCglleHRyYWN0IDQgMAoJZnJhbWVfYnVyeSAwIC8vIHZhbGlkYXRvckNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MTU0CgkvLyBpc1Rva2VuRWxpZ2libGUgPSB2YWxpZGF0b3JDb25maWcucmV3YXJkVG9rZW5JZCAhPT0gMAoJZnJhbWVfZGlnIDAgLy8gdmFsaWRhdG9yQ29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMTUzIDgKCWJ0b2kKCWludCAwCgkhPQoJZnJhbWVfYnVyeSAxIC8vIGlzVG9rZW5FbGlnaWJsZTogYm9vbAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjE1NQoJLy8gZXh0cmFNQlIgPSBpc1Rva2VuRWxpZ2libGUgJiYgdGhpcy5wb29sSWQudmFsdWUgPT09IDEgPyBBU1NFVF9IT0xESU5HX0ZFRSA6IDAKCWZyYW1lX2RpZyAxIC8vIGlzVG9rZW5FbGlnaWJsZTogYm9vbAoJZHVwCglieiAqc2tpcF9hbmQwCglieXRlIDB4NzA2ZjZmNmM0OTY0IC8vICJwb29sSWQiCglhcHBfZ2xvYmFsX2dldAoJaW50IDEKCT09CgkmJgoKKnNraXBfYW5kMDoKCWJ6ICp0ZXJuYXJ5MF9mYWxzZQoJaW50IDEwMDAwMAoJYiAqdGVybmFyeTBfZW5kCgoqdGVybmFyeTBfZmFsc2U6CglpbnQgMAoKKnRlcm5hcnkwX2VuZDoKCWZyYW1lX2J1cnkgMiAvLyBleHRyYU1CUjogdWludDY0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MTU2CgkvLyBQb29sSW5pdE1iciA9CgkvLyAgICAgICAgICAgICBBTEdPUkFORF9BQ0NPVU5UX01JTl9CQUxBTkNFICsKCS8vICAgICAgICAgICAgIGV4dHJhTUJSICsKCS8vICAgICAgICAgICAgIHRoaXMuY29zdEZvckJveFN0b3JhZ2UoNyAvKiAnc3Rha2VycycgbmFtZSAqLyArIGxlbjxTdGFrZWRJbmZvPigpICogTUFYX1NUQUtFUlNfUEVSX1BPT0wpCglpbnQgMTAwMDAwCglmcmFtZV9kaWcgMiAvLyBleHRyYU1CUjogdWludDY0CgkrCglpbnQgMTI4MDcKCWNhbGxzdWIgY29zdEZvckJveFN0b3JhZ2UKCSsKCWZyYW1lX2J1cnkgMyAvLyBQb29sSW5pdE1icjogdWludDY0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MTYyCgkvLyB2ZXJpZnlQYXlUeG4obWJyUGF5bWVudCwgeyByZWNlaXZlcjogdGhpcy5hcHAuYWRkcmVzcywgYW1vdW50OiBQb29sSW5pdE1iciB9KQoJLy8gdmVyaWZ5IHJlY2VpdmVyCglmcmFtZV9kaWcgLTEgLy8gbWJyUGF5bWVudDogUGF5VHhuCglndHhucyBSZWNlaXZlcgoJZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCT09CgoJLy8gdHJhbnNhY3Rpb24gdmVyaWZpY2F0aW9uIGZhaWxlZDogeyJ0eG4iOiJtYnJQYXltZW50IiwiZmllbGQiOiJyZWNlaXZlciIsImV4cGVjdGVkIjoidGhpcy5hcHAuYWRkcmVzcyJ9Cglhc3NlcnQKCgkvLyB2ZXJpZnkgYW1vdW50CglmcmFtZV9kaWcgLTEgLy8gbWJyUGF5bWVudDogUGF5VHhuCglndHhucyBBbW91bnQKCWZyYW1lX2RpZyAzIC8vIFBvb2xJbml0TWJyOiB1aW50NjQKCT09CgoJLy8gdHJhbnNhY3Rpb24gdmVyaWZpY2F0aW9uIGZhaWxlZDogeyJ0eG4iOiJtYnJQYXltZW50IiwiZmllbGQiOiJhbW91bnQiLCJleHBlY3RlZCI6IlBvb2xJbml0TWJyIn0KCWFzc2VydAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjE2MwoJLy8gdGhpcy5zdGFrZXJzLmNyZWF0ZSgpCglieXRlIDB4NzM3NDYxNmI2NTcyNzMgLy8gInN0YWtlcnMiCglpbnQgMTI4MDAKCWJveF9jcmVhdGUKCXBvcAoKCS8vICppZjFfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoxNjUKCS8vIGlzVG9rZW5FbGlnaWJsZSAmJiB0aGlzLnBvb2xJZC52YWx1ZSA9PT0gMQoJZnJhbWVfZGlnIDEgLy8gaXNUb2tlbkVsaWdpYmxlOiBib29sCglkdXAKCWJ6ICpza2lwX2FuZDEKCWJ5dGUgMHg3MDZmNmY2YzQ5NjQgLy8gInBvb2xJZCIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMQoJPT0KCSYmCgoqc2tpcF9hbmQxOgoJYnogKmlmMV9lbmQKCgkvLyAqaWYxX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjE2NwoJLy8gc2VuZEFzc2V0VHJhbnNmZXIoewoJLy8gICAgICAgICAgICAgICAgIHhmZXJBc3NldDogQXNzZXRJRC5mcm9tVWludDY0KHZhbGlkYXRvckNvbmZpZy5yZXdhcmRUb2tlbklkKSwKCS8vICAgICAgICAgICAgICAgICBhc3NldFJlY2VpdmVyOiB0aGlzLmFwcC5hZGRyZXNzLAoJLy8gICAgICAgICAgICAgICAgIGFzc2V0QW1vdW50OiAwLAoJLy8gICAgICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBheGZlcgoJaXR4bl9maWVsZCBUeXBlRW51bQoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjE2OAoJLy8geGZlckFzc2V0OiBBc3NldElELmZyb21VaW50NjQodmFsaWRhdG9yQ29uZmlnLnJld2FyZFRva2VuSWQpCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JDb25maWc6ICh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KQoJZXh0cmFjdCAxNTMgOAoJYnRvaQoJaXR4bl9maWVsZCBYZmVyQXNzZXQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoxNjkKCS8vIGFzc2V0UmVjZWl2ZXI6IHRoaXMuYXBwLmFkZHJlc3MKCWdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCglpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoxNzAKCS8vIGFzc2V0QW1vdW50OiAwCglpbnQgMAoJaXR4bl9maWVsZCBBc3NldEFtb3VudAoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCippZjFfZW5kOgoJcmV0c3ViCgovLyBhZGRTdGFrZShwYXksYWRkcmVzcyl1aW50NjQKKmFiaV9yb3V0ZV9hZGRTdGFrZToKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gc3Rha2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKHN0YWtlcikgZm9yIGFkZFN0YWtlIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBzdGFrZWRBbW91bnRQYXltZW50OiBwYXkKCXR4biBHcm91cEluZGV4CglpbnQgMQoJLQoJZHVwCglndHhucyBUeXBlRW51bQoJaW50IHBheQoJPT0KCgkvLyBhcmd1bWVudCAxIChzdGFrZWRBbW91bnRQYXltZW50KSBmb3IgYWRkU3Rha2UgbXVzdCBiZSBhIHBheSB0cmFuc2FjdGlvbgoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBhZGRTdGFrZShwYXksYWRkcmVzcyl1aW50NjQKCWNhbGxzdWIgYWRkU3Rha2UKCWl0b2IKCWNvbmNhdAoJbG9nCglpbnQgMQoJcmV0dXJuCgovLyBhZGRTdGFrZShzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4sIHN0YWtlcjogQWRkcmVzcyk6IHVpbnQ2NAovLwovLyBBZGRzIHN0YWtlIHRvIHRoZSBnaXZlbiBhY2NvdW50LgovLyBDYW4gT05MWSBiZSBjYWxsZWQgYnkgdGhlIHZhbGlkYXRvciBjb250cmFjdCB0aGF0IGNyZWF0ZWQgdXMKLy8gTXVzdCByZWNlaXZlIHBheW1lbnQgZnJvbSB0aGUgdmFsaWRhdG9yIGNvbnRyYWN0IGZvciBhbW91bnQgYmVpbmcgc3Rha2VkLgovLwovLyBAcGFyYW0ge1BheVR4bn0gc3Rha2VkQW1vdW50UGF5bWVudCBwcmlvciBwYXltZW50IGNvbWluZyBmcm9tIHZhbGlkYXRvciBjb250cmFjdCB0byB1cyBvbiBiZWhhbGYgb2Ygc3Rha2VyLgovLyBAcGFyYW0ge0FkZHJlc3N9IHN0YWtlciAtIFRoZSBhY2NvdW50IGFkZGluZyBuZXcgc3Rha2UKLy8gQHRocm93cyB7RXJyb3J9IC0gVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBzdGFraW5nIHBvb2wgaXMgZnVsbC4KLy8gQHJldHVybnMge3VpbnQ2NH0gbmV3ICdlbnRyeSByb3VuZCcgcm91bmQgbnVtYmVyIG9mIHN0YWtlIGFkZAphZGRTdGFrZToKCXByb3RvIDIgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoxODYKCS8vIGFzc2VydCh0aGlzLnN0YWtlcnMuZXhpc3RzLCAnc3Rha2luZyBwb29sIG11c3QgYmUgaW5pdGlhbGl6ZWQgZmlyc3QnKQoJYnl0ZSAweDczNzQ2MTZiNjU3MjczIC8vICJzdGFrZXJzIgoJYm94X2xlbgoJc3dhcAoJcG9wCgoJLy8gc3Rha2luZyBwb29sIG11c3QgYmUgaW5pdGlhbGl6ZWQgZmlyc3QKCWFzc2VydAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjE4OQoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgdGhpcy50eG4uc2VuZGVyID09PSB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZS5hZGRyZXNzLAoJLy8gICAgICAgICAgICAgJ3N0YWtlIGNhbiBvbmx5IGJlIGFkZGVkIHZpYSB0aGUgdmFsaWRhdG9yIGNvbnRyYWN0JywKCS8vICAgICAgICAgKQoJdHhuIFNlbmRlcgoJYnl0ZSAweDYzNzI2NTYxNzQ2ZjcyNDE3MDcwIC8vICJjcmVhdG9yQXBwIgoJYXBwX2dsb2JhbF9nZXQKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCXBvcAoJPT0KCgkvLyBzdGFrZSBjYW4gb25seSBiZSBhZGRlZCB2aWEgdGhlIHZhbGlkYXRvciBjb250cmFjdAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MTkzCgkvLyBhc3NlcnQoc3Rha2VyICE9PSBnbG9iYWxzLnplcm9BZGRyZXNzKQoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MTk2CgkvLyB0aGlzLmNoZWNrSWZCaW5DbG9zZWQoKQoJY2FsbHN1YiBjaGVja0lmQmluQ2xvc2VkCgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MjAwCgkvLyB2ZXJpZnlQYXlUeG4oc3Rha2VkQW1vdW50UGF5bWVudCwgewoJLy8gICAgICAgICAgICAgc2VuZGVyOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZS5hZGRyZXNzLAoJLy8gICAgICAgICAgICAgcmVjZWl2ZXI6IHRoaXMuYXBwLmFkZHJlc3MsCgkvLyAgICAgICAgICAgICBhbW91bnQ6IHN0YWtlZEFtb3VudFBheW1lbnQuYW1vdW50LAoJLy8gICAgICAgICB9KQoJLy8gdmVyaWZ5IHNlbmRlcgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4bgoJZ3R4bnMgU2VuZGVyCglieXRlIDB4NjM3MjY1NjE3NDZmNzI0MTcwNzAgLy8gImNyZWF0b3JBcHAiCglhcHBfZ2xvYmFsX2dldAoJYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwoJcG9wCgk9PQoKCS8vIHRyYW5zYWN0aW9uIHZlcmlmaWNhdGlvbiBmYWlsZWQ6IHsidHhuIjoic3Rha2VkQW1vdW50UGF5bWVudCIsImZpZWxkIjoic2VuZGVyIiwiZXhwZWN0ZWQiOiJ0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZS5hZGRyZXNzIn0KCWFzc2VydAoKCS8vIHZlcmlmeSByZWNlaXZlcgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4bgoJZ3R4bnMgUmVjZWl2ZXIKCWdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCgk9PQoKCS8vIHRyYW5zYWN0aW9uIHZlcmlmaWNhdGlvbiBmYWlsZWQ6IHsidHhuIjoic3Rha2VkQW1vdW50UGF5bWVudCIsImZpZWxkIjoicmVjZWl2ZXIiLCJleHBlY3RlZCI6InRoaXMuYXBwLmFkZHJlc3MifQoJYXNzZXJ0CgoJLy8gdmVyaWZ5IGFtb3VudAoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4bgoJZ3R4bnMgQW1vdW50CglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBBbW91bnQKCT09CgoJLy8gdHJhbnNhY3Rpb24gdmVyaWZpY2F0aW9uIGZhaWxlZDogeyJ0eG4iOiJzdGFrZWRBbW91bnRQYXltZW50IiwiZmllbGQiOiJhbW91bnQiLCJleHBlY3RlZCI6InN0YWtlZEFtb3VudFBheW1lbnQuYW1vdW50In0KCWFzc2VydAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjIwOQoJLy8gZW50cnlSb3VuZCA9IGdsb2JhbHMucm91bmQgKyBBTEdPUkFORF9TVEFLSU5HX0JMT0NLX0RFTEFZCglnbG9iYWwgUm91bmQKCWludCAzMjAKCSsKCWZyYW1lX2J1cnkgMCAvLyBlbnRyeVJvdW5kOiB1aW50NjQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoyMTAKCS8vIGZpcnN0RW1wdHkgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjIxMgoJLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgKz0gc3Rha2VkQW1vdW50UGF5bWVudC5hbW91bnQKCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCWFwcF9nbG9iYWxfZ2V0CglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBBbW91bnQKCSsKCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCXN3YXAKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MjE0CgkvLyByb3VuZHNMZWZ0SW5CaW4gPSB0aGlzLmJpblJvdW5kU3RhcnQudmFsdWUgKyB0aGlzLnJvdW5kc1BlckRheS52YWx1ZSAtIGdsb2JhbHMucm91bmQKCWJ5dGUgMHg2MjY5NmU1MjZmNzU2ZTY0NTM3NDYxNzI3NCAvLyAiYmluUm91bmRTdGFydCIKCWFwcF9nbG9iYWxfZ2V0CglieXRlIDB4NzI2Zjc1NmU2NDczNTA2NTcyNDQ2MTc5IC8vICJyb3VuZHNQZXJEYXkiCglhcHBfZ2xvYmFsX2dldAoJKwoJZ2xvYmFsIFJvdW5kCgktCglmcmFtZV9idXJ5IDIgLy8gcm91bmRzTGVmdEluQmluOiB1aW50NjQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoyMTUKCS8vIHRoaXMuc3Rha2VBY2N1bXVsYXRvci52YWx1ZSA9CgkvLyAgICAgICAgICAgICB0aGlzLnN0YWtlQWNjdW11bGF0b3IudmFsdWUgKyAoc3Rha2VkQW1vdW50UGF5bWVudC5hbW91bnQgYXMgdWludDEyOCkgKiAocm91bmRzTGVmdEluQmluIGFzIHVpbnQxMjgpCglieXRlIDB4NzM3NDYxNmI2NTQxNjM2Mzc1NmQ3NTZjNjE3NDZmNzIgLy8gInN0YWtlQWNjdW11bGF0b3IiCglkdXAKCWFwcF9nbG9iYWxfZ2V0CglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBBbW91bnQKCWl0b2IKCWZyYW1lX2RpZyAyIC8vIHJvdW5kc0xlZnRJbkJpbjogdWludDY0CglpdG9iCgliKgoJYisKCWR1cAoJYml0bGVuCglpbnQgMTI4Cgk8PQoKCS8vIHRoaXMuc3Rha2VBY2N1bXVsYXRvci52YWx1ZSArIChzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCBhcyB1aW50MTI4KSAqIChyb3VuZHNMZWZ0SW5CaW4gYXMgdWludDEyOCkgb3ZlcmZsb3dlZCAxMjggYml0cwoJYXNzZXJ0CglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYKCWImCglkdXAKCWxlbgoJZHVwCglpbnQgMTYKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MjE5CgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3Rha2Vycy52YWx1ZS5sZW5ndGg7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDMgLy8gaTogdWludDY0CgoqZm9yXzA6CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoyMTkKCS8vIGkgPCB0aGlzLnN0YWtlcnMudmFsdWUubGVuZ3RoCglmcmFtZV9kaWcgMyAvLyBpOiB1aW50NjQKCWludCAyMDAKCTwKCWJ6ICpmb3JfMF9lbmQKCgkvLyAqaWYyX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MjIwCgkvLyBnbG9iYWxzLm9wY29kZUJ1ZGdldCA8IDMwMAoJZ2xvYmFsIE9wY29kZUJ1ZGdldAoJaW50IDMwMAoJPAoJYnogKmlmMl9lbmQKCgkvLyAqaWYyX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjIyMQoJLy8gaW5jcmVhc2VPcGNvZGVCdWRnZXQoKQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCWludCAwCglpdHhuX2ZpZWxkIEZlZQoJYnl0ZSBiNjQgQ29FQiAvLyAjcHJhZ21hIHZlcnNpb24gMTA7IGludCAxCglkdXAKCWl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCglpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCglpbnQgRGVsZXRlQXBwbGljYXRpb24KCWl0eG5fZmllbGQgT25Db21wbGV0aW9uCglpdHhuX3N1Ym1pdAoKKmlmMl9lbmQ6CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoyMjMKCS8vIGNtcFN0YWtlciA9IGNsb25lKHRoaXMuc3Rha2Vycy52YWx1ZVtpXSkKCWZyYW1lX2RpZyAzIC8vIGk6IHVpbnQ2NAoJaW50IDY0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCA2NAoJYnl0ZSAweDczNzQ2MTZiNjU3MjczIC8vICJzdGFrZXJzIgoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWZyYW1lX2J1cnkgNCAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCgkvLyAqaWYzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MjI0CgkvLyBjbXBTdGFrZXIuYWNjb3VudCA9PT0gc3Rha2VyCglmcmFtZV9kaWcgNCAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMCAzMgoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJPT0KCWJ6ICppZjNfZW5kCgoJLy8gKmlmM19jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoyMjYKCS8vIGNtcFN0YWtlci5iYWxhbmNlICs9IHN0YWtlZEFtb3VudFBheW1lbnQuYW1vdW50CglmcmFtZV9kaWcgNCAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWludCAzMiAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgNCAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMzIgOAoJYnRvaQoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4bgoJZ3R4bnMgQW1vdW50CgkrCglpdG9iCglyZXBsYWNlMwoJZnJhbWVfYnVyeSA0IC8vIGNtcFN0YWtlcjogKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjIyNwoJLy8gY21wU3Rha2VyLmVudHJ5Um91bmQgPSBlbnRyeVJvdW5kCglmcmFtZV9kaWcgNCAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWludCA1NiAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgMCAvLyBlbnRyeVJvdW5kOiB1aW50NjQKCWl0b2IKCXJlcGxhY2UzCglmcmFtZV9idXJ5IDQgLy8gY21wU3Rha2VyOiAoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MjMwCgkvLyB0aGlzLnN0YWtlcnMudmFsdWVbaV0gPSBjbXBTdGFrZXIKCWZyYW1lX2RpZyAzIC8vIGk6IHVpbnQ2NAoJaW50IDY0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWZyYW1lX2RpZyA0IC8vIGNtcFN0YWtlcjogKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJYnl0ZSAweDczNzQ2MTZiNjU3MjczIC8vICJzdGFrZXJzIgoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoyMzIKCS8vIHJldHVybiBlbnRyeVJvdW5kCglmcmFtZV9kaWcgMCAvLyBlbnRyeVJvdW5kOiB1aW50NjQKCWIgKmFkZFN0YWtlKnJldHVybgoKKmlmM19lbmQ6CgkvLyAqaWY0X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MjM0CgkvLyBmaXJzdEVtcHR5ID09PSAwICYmIGNtcFN0YWtlci5hY2NvdW50ID09PSBnbG9iYWxzLnplcm9BZGRyZXNzCglmcmFtZV9kaWcgMSAvLyBmaXJzdEVtcHR5OiB1aW50NjQKCWludCAwCgk9PQoJZHVwCglieiAqc2tpcF9hbmQyCglmcmFtZV9kaWcgNCAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMCAzMgoJZ2xvYmFsIFplcm9BZGRyZXNzCgk9PQoJJiYKCipza2lwX2FuZDI6CglieiAqaWY0X2VuZAoKCS8vICppZjRfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MjM1CgkvLyBmaXJzdEVtcHR5ID0gaSArIDEKCWZyYW1lX2RpZyAzIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMSAvLyBmaXJzdEVtcHR5OiB1aW50NjQKCippZjRfZW5kOgoKKmZvcl8wX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MjE5CgkvLyBpICs9IDEKCWZyYW1lX2RpZyAzIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMyAvLyBpOiB1aW50NjQKCWIgKmZvcl8wCgoqZm9yXzBfZW5kOgoJLy8gKmlmNV9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjIzOQoJLy8gZmlyc3RFbXB0eSA9PT0gMAoJZnJhbWVfZGlnIDEgLy8gZmlyc3RFbXB0eTogdWludDY0CglpbnQgMAoJPT0KCWJ6ICppZjVfZW5kCgoJLy8gKmlmNV9jb25zZXF1ZW50CgkvLyBTdGFraW5nIHBvb2wgZnVsbAoJZXJyCgoqaWY1X2VuZDoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjI0NgoJLy8gYXNzZXJ0KHN0YWtlZEFtb3VudFBheW1lbnQuYW1vdW50ID49IHRoaXMubWluRW50cnlTdGFrZS52YWx1ZSwgJ211c3Qgc3Rha2UgYXQgbGVhc3QgdGhlIG1pbmltdW0gZm9yIHRoaXMgcG9vbCcpCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBBbW91bnQKCWJ5dGUgMHg2ZDY5NmU0NTZlNzQ3Mjc5NTM3NDYxNmI2NSAvLyAibWluRW50cnlTdGFrZSIKCWFwcF9nbG9iYWxfZ2V0Cgk+PQoKCS8vIG11c3Qgc3Rha2UgYXQgbGVhc3QgdGhlIG1pbmltdW0gZm9yIHRoaXMgcG9vbAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MjQ4CgkvLyBhc3NlcnQodGhpcy5zdGFrZXJzLnZhbHVlW2ZpcnN0RW1wdHkgLSAxXS5hY2NvdW50ID09PSBnbG9iYWxzLnplcm9BZGRyZXNzKQoJZnJhbWVfZGlnIDEgLy8gZmlyc3RFbXB0eTogdWludDY0CglpbnQgMQoJLQoJaW50IDY0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgMzIKCWJ5dGUgMHg3Mzc0NjE2YjY1NzI3MyAvLyAic3Rha2VycyIKCWNvdmVyIDIKCWJveF9leHRyYWN0CglnbG9iYWwgWmVyb0FkZHJlc3MKCT09Cglhc3NlcnQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoyNDkKCS8vIHRoaXMuc3Rha2Vycy52YWx1ZVtmaXJzdEVtcHR5IC0gMV0gPSB7CgkvLyAgICAgICAgICAgICBhY2NvdW50OiBzdGFrZXIsCgkvLyAgICAgICAgICAgICBiYWxhbmNlOiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCwKCS8vICAgICAgICAgICAgIHRvdGFsUmV3YXJkZWQ6IDAsCgkvLyAgICAgICAgICAgICByZXdhcmRUb2tlbkJhbGFuY2U6IDAsCgkvLyAgICAgICAgICAgICBlbnRyeVJvdW5kOiBlbnRyeVJvdW5kLAoJLy8gICAgICAgICB9CglmcmFtZV9kaWcgMSAvLyBmaXJzdEVtcHR5OiB1aW50NjQKCWludCAxCgktCglpbnQgNjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4bgoJZ3R4bnMgQW1vdW50CglpdG9iCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCgljb25jYXQKCWZyYW1lX2RpZyAwIC8vIGVudHJ5Um91bmQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0CglieXRlIDB4NzM3NDYxNmI2NTcyNzMgLy8gInN0YWtlcnMiCgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjI1NgoJLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlICs9IDEKCWJ5dGUgMHg2ZTc1NmQ1Mzc0NjE2YjY1NzI3MyAvLyAibnVtU3Rha2VycyIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMQoJKwoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJc3dhcAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoyNTcKCS8vIHJldHVybiBlbnRyeVJvdW5kCglmcmFtZV9kaWcgMCAvLyBlbnRyeVJvdW5kOiB1aW50NjQKCiphZGRTdGFrZSpyZXR1cm46CgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCgkvLyBwb3AgYWxsIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHRoZSBzdGFjawoJcG9wbiA0CglyZXRzdWIKCi8vIHJlbW92ZVN0YWtlKGFkZHJlc3MsdWludDY0KXZvaWQKKmFiaV9yb3V0ZV9yZW1vdmVTdGFrZToKCS8vIGFtb3VudFRvVW5zdGFrZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglidG9pCgoJLy8gc3Rha2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDEgKHN0YWtlcikgZm9yIHJlbW92ZVN0YWtlIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBleGVjdXRlIHJlbW92ZVN0YWtlKGFkZHJlc3MsdWludDY0KXZvaWQKCWNhbGxzdWIgcmVtb3ZlU3Rha2UKCWludCAxCglyZXR1cm4KCi8vIHJlbW92ZVN0YWtlKHN0YWtlcjogQWRkcmVzcywgYW1vdW50VG9VbnN0YWtlOiB1aW50NjQpOiB2b2lkCi8vCi8vIFJlbW92ZXMgc3Rha2Ugb24gYmVoYWxmIG9mIGNhbGxlciAocmVtb3Zpbmcgb3duIHN0YWtlKS4gIElmIGFueSB0b2tlbiByZXdhcmRzIGV4aXN0LCB0aG9zZSBhcmUgYWx3YXlzIHNlbnQgaW4KLy8gZnVsbC4gQWxzbyBub3RpZmllcyB0aGUgdmFsaWRhdG9yIGNvbnRyYWN0IGZvciB0aGlzIHBvb2xzIHZhbGlkYXRvciBvZiB0aGUgc3Rha2VyIC8gYmFsYW5jZSBjaGFuZ2VzLgovLwovLyBAcGFyYW0ge0FkZHJlc3N9IHN0YWtlciAtIGFjY291bnQgdG8gcmVtb3ZlLiAgbm9ybWFsbHkgc2FtZSBhcyBzZW5kZXIsIGJ1dCB0aGUgdmFsaWRhdG9yIG93bmVyIG9yIG1hbmFnZXIgY2FuIGFsc28gY2FsbAovLyB0aGlzIHRvIHJlbW92ZSB0aGUgc3BlY2lmaWVkIHN0YWtlciBleHBsaWNpdGx5LiBUaGUgcmVtb3ZlZCBzdGFrZSBNVVNUIG9ubHkgZ28gdG8gdGhlIHN0YWtlciBvZiBjb3Vyc2UuICBUaGlzIGlzCi8vIHNvIGEgdmFsaWRhdG9yIGNhbiBzaHV0IGRvd24gYSBwb29vbCBhbmQgcmVmdW5kIHRoZSBzdGFrZXJzLiAgSXQgY2FuIGFsc28gYmUgdXNlZCB0byBraWNrIG91dCBzdGFrZXJzIHdobyBubyBsb25nZXIKLy8gbWVldCB0aGUgZ2F0aW5nIHJlcXVpcmVtZW50cyAoZGV0ZXJtaW5lZCBieSB0aGUgbm9kZSBkYWVtb24pLgovLyBAcGFyYW0ge3VpbnQ2NH0gYW1vdW50VG9VbnN0YWtlIC0gVGhlIGFtb3VudCBvZiBzdGFrZSB0byBiZSByZW1vdmVkLiAgU3BlY2lmeSAwIHRvIHJlbW92ZSBhbGwgc3Rha2UuCi8vIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgYWNjb3VudCBoYXMgaW5zdWZmaWNpZW50IGJhbGFuY2Ugb3IgaWYgdGhlIGFjY291bnQgaXMgbm90IGZvdW5kLgpyZW1vdmVTdGFrZToKCXByb3RvIDIgMAoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDYKCgkvLyAqaWY2X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6Mjc0CgkvLyBzdGFrZXIgIT09IHRoaXMudHhuLnNlbmRlcgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJdHhuIFNlbmRlcgoJIT0KCWJ6ICppZjZfZW5kCgoJLy8gKmlmNl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoyNzUKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICB0aGlzLmlzT3duZXJPck1hbmFnZXJDYWxsZXIoKSwKCS8vICAgICAgICAgICAgICAgICAnSWYgc3Rha2VyIGlzIG5vdCBzZW5kZXIgaW4gcmVtb3ZlU3Rha2UgY2FsbCwgdGhlbiBzZW5kZXIgTVVTVCBiZSBvd25lciBvciBtYW5hZ2VyIG9mIHZhbGlkYXRvcicsCgkvLyAgICAgICAgICAgICApCgljYWxsc3ViIGlzT3duZXJPck1hbmFnZXJDYWxsZXIKCgkvLyBJZiBzdGFrZXIgaXMgbm90IHNlbmRlciBpbiByZW1vdmVTdGFrZSBjYWxsLCB0aGVuIHNlbmRlciBNVVNUIGJlIG93bmVyIG9yIG1hbmFnZXIgb2YgdmFsaWRhdG9yCglhc3NlcnQKCippZjZfZW5kOgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MjgxCgkvLyB0aGlzLmNoZWNrSWZCaW5DbG9zZWQoKQoJY2FsbHN1YiBjaGVja0lmQmluQ2xvc2VkCgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MjgzCgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3Rha2Vycy52YWx1ZS5sZW5ndGg7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDAgLy8gaTogdWludDY0CgoqZm9yXzE6CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoyODMKCS8vIGkgPCB0aGlzLnN0YWtlcnMudmFsdWUubGVuZ3RoCglmcmFtZV9kaWcgMCAvLyBpOiB1aW50NjQKCWludCAyMDAKCTwKCWJ6ICpmb3JfMV9lbmQKCgkvLyAqaWY3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6Mjg0CgkvLyBnbG9iYWxzLm9wY29kZUJ1ZGdldCA8IDMwMAoJZ2xvYmFsIE9wY29kZUJ1ZGdldAoJaW50IDMwMAoJPAoJYnogKmlmN19lbmQKCgkvLyAqaWY3X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjI4NQoJLy8gaW5jcmVhc2VPcGNvZGVCdWRnZXQoKQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCWludCAwCglpdHhuX2ZpZWxkIEZlZQoJYnl0ZSBiNjQgQ29FQiAvLyAjcHJhZ21hIHZlcnNpb24gMTA7IGludCAxCglkdXAKCWl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCglpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCglpbnQgRGVsZXRlQXBwbGljYXRpb24KCWl0eG5fZmllbGQgT25Db21wbGV0aW9uCglpdHhuX3N1Ym1pdAoKKmlmN19lbmQ6CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoyODcKCS8vIGNtcFN0YWtlciA9IGNsb25lKHRoaXMuc3Rha2Vycy52YWx1ZVtpXSkKCWZyYW1lX2RpZyAwIC8vIGk6IHVpbnQ2NAoJaW50IDY0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCA2NAoJYnl0ZSAweDczNzQ2MTZiNjU3MjczIC8vICJzdGFrZXJzIgoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWZyYW1lX2J1cnkgMSAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCgkvLyAqaWY4X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6Mjg4CgkvLyBjbXBTdGFrZXIuYWNjb3VudCA9PT0gc3Rha2VyCglmcmFtZV9kaWcgMSAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMCAzMgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJPT0KCWJ6ICppZjhfZW5kCgoJLy8gKmlmOF9jb25zZXF1ZW50CgkvLyAqaWY5X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6Mjg5CgkvLyBhbW91bnRUb1Vuc3Rha2UgPT09IDAKCWZyYW1lX2RpZyAtMiAvLyBhbW91bnRUb1Vuc3Rha2U6IHVpbnQ2NAoJaW50IDAKCT09CglieiAqaWY5X2VuZAoKCS8vICppZjlfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MjkxCgkvLyBhbW91bnRUb1Vuc3Rha2UgPSBjbXBTdGFrZXIuYmFsYW5jZQoJZnJhbWVfZGlnIDEgLy8gY21wU3Rha2VyOiAoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCglleHRyYWN0IDMyIDgKCWJ0b2kKCWZyYW1lX2J1cnkgLTIgLy8gYW1vdW50VG9VbnN0YWtlOiB1aW50NjQKCippZjlfZW5kOgoJLy8gKmlmMTBfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoyOTMKCS8vIGNtcFN0YWtlci5iYWxhbmNlIDwgYW1vdW50VG9VbnN0YWtlCglmcmFtZV9kaWcgMSAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMzIgOAoJYnRvaQoJZnJhbWVfZGlnIC0yIC8vIGFtb3VudFRvVW5zdGFrZTogdWludDY0Cgk8CglieiAqaWYxMF9lbmQKCgkvLyAqaWYxMF9jb25zZXF1ZW50CgkvLyBJbnN1ZmZpY2llbnQgYmFsYW5jZQoJZXJyCgoqaWYxMF9lbmQ6CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoyOTYKCS8vIGNtcFN0YWtlci5iYWxhbmNlIC09IGFtb3VudFRvVW5zdGFrZQoJZnJhbWVfZGlnIDEgLy8gY21wU3Rha2VyOiAoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCglpbnQgMzIgLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIDEgLy8gY21wU3Rha2VyOiAoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCglleHRyYWN0IDMyIDgKCWJ0b2kKCWZyYW1lX2RpZyAtMiAvLyBhbW91bnRUb1Vuc3Rha2U6IHVpbnQ2NAoJLQoJaXRvYgoJcmVwbGFjZTMKCWZyYW1lX2J1cnkgMSAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoyOTcKCS8vIHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlIC09IGFtb3VudFRvVW5zdGFrZQoJYnl0ZSAweDczNzQ2MTZiNjU2NCAvLyAic3Rha2VkIgoJYXBwX2dsb2JhbF9nZXQKCWZyYW1lX2RpZyAtMiAvLyBhbW91bnRUb1Vuc3Rha2U6IHVpbnQ2NAoJLQoJYnl0ZSAweDczNzQ2MTZiNjU2NCAvLyAic3Rha2VkIgoJc3dhcAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoyOTkKCS8vIGFtb3VudFJld2FyZFRva2VuUmVtb3ZlZCA9IDAKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gYW1vdW50UmV3YXJkVG9rZW5SZW1vdmVkOiB1aW50NjQKCgkvLyAqaWYxMV9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjMwMAoJLy8gY21wU3Rha2VyLnJld2FyZFRva2VuQmFsYW5jZSA+IDAKCWZyYW1lX2RpZyAxIC8vIGNtcFN0YWtlcjogKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJZXh0cmFjdCA0OCA4CglidG9pCglpbnQgMAoJPgoJYnogKmlmMTFfZW5kCgoJLy8gKmlmMTFfY29uc2VxdWVudAoJLy8gKmlmMTJfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czozMDIKCS8vIHRoaXMucG9vbElkLnZhbHVlID09PSAxCglieXRlIDB4NzA2ZjZmNmM0OTY0IC8vICJwb29sSWQiCglhcHBfZ2xvYmFsX2dldAoJaW50IDEKCT09CglieiAqaWYxMl9lbHNlCgoJLy8gKmlmMTJfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MzAzCgkvLyB2YWxpZGF0b3JDb25maWcgPSBzZW5kTWV0aG9kQ2FsbDx0eXBlb2YgVmFsaWRhdG9yUmVnaXN0cnkucHJvdG90eXBlLmdldFZhbGlkYXRvckNvbmZpZz4oewoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3M6IFt0aGlzLnZhbGlkYXRvcklkLnZhbHVlXSwKCS8vICAgICAgICAgICAgICAgICAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJbWV0aG9kICJnZXRWYWxpZGF0b3JDb25maWcodWludDY0KSh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KSIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MzA0CgkvLyBhcHBsaWNhdGlvbklEOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZQoJYnl0ZSAweDYzNzI2NTYxNzQ2ZjcyNDE3MDcwIC8vICJjcmVhdG9yQXBwIgoJYXBwX2dsb2JhbF9nZXQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjMwNQoJLy8gbWV0aG9kQXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdCglieXRlIDB4NzY2MTZjNjk2NDYxNzQ2ZjcyNDk2NCAvLyAidmFsaWRhdG9ySWQiCglhcHBfZ2xvYmFsX2dldAoJaXRvYgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCgkvLyBTdWJtaXQgaW5uZXIgdHJhbnNhY3Rpb24KCWl0eG5fc3VibWl0CglpdHhuIE51bUxvZ3MKCWludCAxCgktCglpdHhuYXMgTG9ncwoJZXh0cmFjdCA0IDAKCWZyYW1lX2J1cnkgMyAvLyB2YWxpZGF0b3JDb25maWc6ICh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KQoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjMxMQoJLy8gc2VuZEFzc2V0VHJhbnNmZXIoewoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhmZXJBc3NldDogQXNzZXRJRC5mcm9tVWludDY0KHZhbGlkYXRvckNvbmZpZy5yZXdhcmRUb2tlbklkKSwKCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NldFJlY2VpdmVyOiBzdGFrZXIsCgkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXRBbW91bnQ6IGNtcFN0YWtlci5yZXdhcmRUb2tlbkJhbGFuY2UsCgkvLyAgICAgICAgICAgICAgICAgICAgICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGF4ZmVyCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MzEyCgkvLyB4ZmVyQXNzZXQ6IEFzc2V0SUQuZnJvbVVpbnQ2NCh2YWxpZGF0b3JDb25maWcucmV3YXJkVG9rZW5JZCkKCWZyYW1lX2RpZyAzIC8vIHZhbGlkYXRvckNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCglleHRyYWN0IDE1MyA4CglidG9pCglpdHhuX2ZpZWxkIFhmZXJBc3NldAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjMxMwoJLy8gYXNzZXRSZWNlaXZlcjogc3Rha2VyCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VyOiBBZGRyZXNzCglpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czozMTQKCS8vIGFzc2V0QW1vdW50OiBjbXBTdGFrZXIucmV3YXJkVG9rZW5CYWxhbmNlCglmcmFtZV9kaWcgMSAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgNDggOAoJYnRvaQoJaXR4bl9maWVsZCBBc3NldEFtb3VudAoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czozMTYKCS8vIGFtb3VudFJld2FyZFRva2VuUmVtb3ZlZCA9IGNtcFN0YWtlci5yZXdhcmRUb2tlbkJhbGFuY2UKCWZyYW1lX2RpZyAxIC8vIGNtcFN0YWtlcjogKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJZXh0cmFjdCA0OCA4CglidG9pCglmcmFtZV9idXJ5IDIgLy8gYW1vdW50UmV3YXJkVG9rZW5SZW1vdmVkOiB1aW50NjQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czozMTcKCS8vIGNtcFN0YWtlci5yZXdhcmRUb2tlbkJhbGFuY2UgPSAwCglmcmFtZV9kaWcgMSAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCglyZXBsYWNlMiA0OAoJZnJhbWVfYnVyeSAxIC8vIGNtcFN0YWtlcjogKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJYiAqaWYxMl9lbmQKCippZjEyX2Vsc2U6CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czozMjIKCS8vIGFtb3VudFJld2FyZFRva2VuUmVtb3ZlZCA9IGNtcFN0YWtlci5yZXdhcmRUb2tlbkJhbGFuY2UKCWZyYW1lX2RpZyAxIC8vIGNtcFN0YWtlcjogKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJZXh0cmFjdCA0OCA4CglidG9pCglmcmFtZV9idXJ5IDIgLy8gYW1vdW50UmV3YXJkVG9rZW5SZW1vdmVkOiB1aW50NjQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czozMjMKCS8vIGNtcFN0YWtlci5yZXdhcmRUb2tlbkJhbGFuY2UgPSAwCglmcmFtZV9kaWcgMSAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCglyZXBsYWNlMiA0OAoJZnJhbWVfYnVyeSAxIC8vIGNtcFN0YWtlcjogKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoKKmlmMTJfZW5kOgoKKmlmMTFfZW5kOgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MzI4CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgICAgIGNtcFN0YWtlci5iYWxhbmNlID09PSAwIHx8IGNtcFN0YWtlci5iYWxhbmNlID49IHRoaXMubWluRW50cnlTdGFrZS52YWx1ZSwKCS8vICAgICAgICAgICAgICAgICAgICAgJ2Nhbm5vdCByZWR1Y2UgYmFsYW5jZSBiZWxvdyBtaW5pbXVtIGFsbG93ZWQgc3Rha2UgdW5sZXNzIGFsbCBpcyByZW1vdmVkJywKCS8vICAgICAgICAgICAgICAgICApCglmcmFtZV9kaWcgMSAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMzIgOAoJYnRvaQoJaW50IDAKCT09CglkdXAKCWJueiAqc2tpcF9vcjAKCWZyYW1lX2RpZyAxIC8vIGNtcFN0YWtlcjogKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJZXh0cmFjdCAzMiA4CglidG9pCglieXRlIDB4NmQ2OTZlNDU2ZTc0NzI3OTUzNzQ2MTZiNjUgLy8gIm1pbkVudHJ5U3Rha2UiCglhcHBfZ2xvYmFsX2dldAoJPj0KCXx8Cgoqc2tpcF9vcjA6CgkvLyBjYW5ub3QgcmVkdWNlIGJhbGFuY2UgYmVsb3cgbWluaW11bSBhbGxvd2VkIHN0YWtlIHVubGVzcyBhbGwgaXMgcmVtb3ZlZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MzM2CgkvLyBzZW5kUGF5bWVudCh7CgkvLyAgICAgICAgICAgICAgICAgICAgIGFtb3VudDogYW1vdW50VG9VbnN0YWtlLAoJLy8gICAgICAgICAgICAgICAgICAgICByZWNlaXZlcjogc3Rha2VyLAoJLy8gICAgICAgICAgICAgICAgICAgICBub3RlOiAndW5zdGFrZWQnLAoJLy8gICAgICAgICAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgcGF5CglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MzM3CgkvLyBhbW91bnQ6IGFtb3VudFRvVW5zdGFrZQoJZnJhbWVfZGlnIC0yIC8vIGFtb3VudFRvVW5zdGFrZTogdWludDY0CglpdHhuX2ZpZWxkIEFtb3VudAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjMzOAoJLy8gcmVjZWl2ZXI6IHN0YWtlcgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJaXR4bl9maWVsZCBSZWNlaXZlcgoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjMzOQoJLy8gbm90ZTogJ3Vuc3Rha2VkJwoJYnl0ZSAweDc1NmU3Mzc0NjE2YjY1NjQgLy8gInVuc3Rha2VkIgoJaXR4bl9maWVsZCBOb3RlCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjM0MQoJLy8gc3Rha2VyUmVtb3ZlZCA9IGZhbHNlCglpbnQgMAoJZnJhbWVfYnVyeSA0IC8vIHN0YWtlclJlbW92ZWQ6IGJvb2wKCgkvLyAqaWYxM19jb25kaXRpb24KCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjM0MgoJLy8gY21wU3Rha2VyLmJhbGFuY2UgPT09IDAKCWZyYW1lX2RpZyAxIC8vIGNtcFN0YWtlcjogKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJZXh0cmFjdCAzMiA4CglidG9pCglpbnQgMAoJPT0KCWJ6ICppZjEzX2VuZAoKCS8vICppZjEzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjM0NAoJLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlIC09IDEKCWJ5dGUgMHg2ZTc1NmQ1Mzc0NjE2YjY1NzI3MyAvLyAibnVtU3Rha2VycyIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMQoJLQoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJc3dhcAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czozNDUKCS8vIGNtcFN0YWtlci5hY2NvdW50ID0gZ2xvYmFscy56ZXJvQWRkcmVzcwoJZnJhbWVfZGlnIDEgLy8gY21wU3Rha2VyOiAoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCglpbnQgMAoJZ2xvYmFsIFplcm9BZGRyZXNzCglyZXBsYWNlMwoJZnJhbWVfYnVyeSAxIC8vIGNtcFN0YWtlcjogKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjM0NgoJLy8gY21wU3Rha2VyLnRvdGFsUmV3YXJkZWQgPSAwCglmcmFtZV9kaWcgMSAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCglyZXBsYWNlMiA0MAoJZnJhbWVfYnVyeSAxIC8vIGNtcFN0YWtlcjogKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjM0NwoJLy8gY21wU3Rha2VyLnJld2FyZFRva2VuQmFsYW5jZSA9IDAKCWZyYW1lX2RpZyAxIC8vIGNtcFN0YWtlcjogKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAKCXJlcGxhY2UyIDQ4CglmcmFtZV9idXJ5IDEgLy8gY21wU3Rha2VyOiAoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MzQ4CgkvLyBzdGFrZXJSZW1vdmVkID0gdHJ1ZQoJaW50IDEKCWZyYW1lX2J1cnkgNCAvLyBzdGFrZXJSZW1vdmVkOiBib29sCgoqaWYxM19lbmQ6CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czozNTEKCS8vIHRoaXMuc3Rha2Vycy52YWx1ZVtpXSA9IGNtcFN0YWtlcgoJZnJhbWVfZGlnIDAgLy8gaTogdWludDY0CglpbnQgNjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJZnJhbWVfZGlnIDEgLy8gY21wU3Rha2VyOiAoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCglieXRlIDB4NzM3NDYxNmI2NTcyNzMgLy8gInN0YWtlcnMiCgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjM1MwoJLy8gcm91bmRzTGVmdEluQmluID0gdGhpcy5iaW5Sb3VuZFN0YXJ0LnZhbHVlICsgdGhpcy5yb3VuZHNQZXJEYXkudmFsdWUgLSBnbG9iYWxzLnJvdW5kCglieXRlIDB4NjI2OTZlNTI2Zjc1NmU2NDUzNzQ2MTcyNzQgLy8gImJpblJvdW5kU3RhcnQiCglhcHBfZ2xvYmFsX2dldAoJYnl0ZSAweDcyNmY3NTZlNjQ3MzUwNjU3MjQ0NjE3OSAvLyAicm91bmRzUGVyRGF5IgoJYXBwX2dsb2JhbF9nZXQKCSsKCWdsb2JhbCBSb3VuZAoJLQoJZnJhbWVfYnVyeSA1IC8vIHJvdW5kc0xlZnRJbkJpbjogdWludDY0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MzU0CgkvLyBzdWJ0cmFjdEFtb3VudDogdWludDEyOCA9IChhbW91bnRUb1Vuc3Rha2UgYXMgdWludDEyOCkgKiAocm91bmRzTGVmdEluQmluIGFzIHVpbnQxMjgpCglmcmFtZV9kaWcgLTIgLy8gYW1vdW50VG9VbnN0YWtlOiB1aW50NjQKCWl0b2IKCWZyYW1lX2RpZyA1IC8vIHJvdW5kc0xlZnRJbkJpbjogdWludDY0CglpdG9iCgliKgoJZHVwCgliaXRsZW4KCWludCAxMjgKCTw9CgoJLy8gKGFtb3VudFRvVW5zdGFrZSBhcyB1aW50MTI4KSAqIChyb3VuZHNMZWZ0SW5CaW4gYXMgdWludDEyOCkgb3ZlcmZsb3dlZCAxMjggYml0cwoJYXNzZXJ0CglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYKCWImCglkdXAKCWxlbgoJZHVwCglpbnQgMTYKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWZyYW1lX2J1cnkgNiAvLyBzdWJ0cmFjdEFtb3VudDogdWludDEyOAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjM1NQoJLy8gdGhpcy5zdGFrZUFjY3VtdWxhdG9yLnZhbHVlID0gdGhpcy5zdGFrZUFjY3VtdWxhdG9yLnZhbHVlIC0gc3VidHJhY3RBbW91bnQKCWJ5dGUgMHg3Mzc0NjE2YjY1NDE2MzYzNzU2ZDc1NmM2MTc0NmY3MiAvLyAic3Rha2VBY2N1bXVsYXRvciIKCWR1cAoJYXBwX2dsb2JhbF9nZXQKCWZyYW1lX2RpZyA2IC8vIHN1YnRyYWN0QW1vdW50OiB1aW50MTI4CgliLQoJZHVwCgliaXRsZW4KCWludCAxMjgKCTw9CgoJLy8gdGhpcy5zdGFrZUFjY3VtdWxhdG9yLnZhbHVlIC0gc3VidHJhY3RBbW91bnQgb3ZlcmZsb3dlZCAxMjggYml0cwoJYXNzZXJ0CglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYKCWImCglkdXAKCWxlbgoJZHVwCglpbnQgMTYKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MzYwCgkvLyBzZW5kTWV0aG9kQ2FsbDx0eXBlb2YgVmFsaWRhdG9yUmVnaXN0cnkucHJvdG90eXBlLnN0YWtlUmVtb3ZlZD4oewoJLy8gICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklEOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKCS8vICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJnczogWwoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgeyBpZDogdGhpcy52YWxpZGF0b3JJZC52YWx1ZSwgcG9vbElkOiB0aGlzLnBvb2xJZC52YWx1ZSwgcG9vbEFwcElkOiB0aGlzLmFwcC5pZCB9LAoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgc3Rha2VyLAoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50VG9VbnN0YWtlLAoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50UmV3YXJkVG9rZW5SZW1vdmVkLAoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgc3Rha2VyUmVtb3ZlZCwKCS8vICAgICAgICAgICAgICAgICAgICAgXSwKCS8vICAgICAgICAgICAgICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAic3Rha2VSZW1vdmVkKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wpdm9pZCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MzYxCgkvLyBhcHBsaWNhdGlvbklEOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZQoJYnl0ZSAweDYzNzI2NTYxNzQ2ZjcyNDE3MDcwIC8vICJjcmVhdG9yQXBwIgoJYXBwX2dsb2JhbF9nZXQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjM2MgoJLy8gbWV0aG9kQXJnczogWwoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgeyBpZDogdGhpcy52YWxpZGF0b3JJZC52YWx1ZSwgcG9vbElkOiB0aGlzLnBvb2xJZC52YWx1ZSwgcG9vbEFwcElkOiB0aGlzLmFwcC5pZCB9LAoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgc3Rha2VyLAoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50VG9VbnN0YWtlLAoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50UmV3YXJkVG9rZW5SZW1vdmVkLAoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgc3Rha2VyUmVtb3ZlZCwKCS8vICAgICAgICAgICAgICAgICAgICAgXQoJYnl0ZSAweDc2NjE2YzY5NjQ2MTc0NmY3MjQ5NjQgLy8gInZhbGlkYXRvcklkIgoJYXBwX2dsb2JhbF9nZXQKCWl0b2IKCWJ5dGUgMHg3MDZmNmY2YzQ5NjQgLy8gInBvb2xJZCIKCWFwcF9nbG9iYWxfZ2V0CglpdG9iCgljb25jYXQKCXR4bmEgQXBwbGljYXRpb25zIDAKCWl0b2IKCWNvbmNhdAoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZXI6IEFkZHJlc3MKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgLTIgLy8gYW1vdW50VG9VbnN0YWtlOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMiAvLyBhbW91bnRSZXdhcmRUb2tlblJlbW92ZWQ6IHVpbnQ2NAoJaXRvYgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWZyYW1lX2RpZyA0IC8vIHN0YWtlclJlbW92ZWQ6IGJvb2wKCWJ5dGUgMHgwMAoJaW50IDAKCXVuY292ZXIgMgoJc2V0Yml0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czozNzAKCS8vIHJldHVybgoJcmV0c3ViCgoqaWY4X2VuZDoKCipmb3JfMV9jb250aW51ZToKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjI4MwoJLy8gaSArPSAxCglmcmFtZV9kaWcgMCAvLyBpOiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDAgLy8gaTogdWludDY0CgliICpmb3JfMQoKKmZvcl8xX2VuZDoKCS8vIGFjY291bnQgbm90IGZvdW5kCgllcnIKCXJldHN1YgoKLy8gY2xhaW1Ub2tlbnMoKXZvaWQKKmFiaV9yb3V0ZV9jbGFpbVRva2VuczoKCS8vIGV4ZWN1dGUgY2xhaW1Ub2tlbnMoKXZvaWQKCWNhbGxzdWIgY2xhaW1Ub2tlbnMKCWludCAxCglyZXR1cm4KCi8vIGNsYWltVG9rZW5zKCk6IHZvaWQKLy8KLy8gQ2xhaW1zIGFsbCB0aGUgYXZhaWxhYmxlIHJld2FyZCB0b2tlbnMgYSBzdGFrZXIgaGFzIGF2YWlsYWJsZSwgc2VuZGluZyB0aGVpciBlbnRpcmUgYmFsYW5jZSB0byB0aGUgc3Rha2VyIGZyb20KLy8gcG9vbCAxIChlaXRoZXIgZGlyZWN0bHksIG9yIHZpYSB2YWxpZGF0b3ItPnBvb2wxIHRvIHBheSBpdCBvdXQpCi8vIEFsc28gbm90aWZpZXMgdGhlIHZhbGlkYXRvciBjb250cmFjdCBmb3IgdGhpcyBwb29scyB2YWxpZGF0b3Igb2YgdGhlIHN0YWtlciAvIGJhbGFuY2UgY2hhbmdlcy4KY2xhaW1Ub2tlbnM6Cglwcm90byAwIDAKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6Mzg1CgkvLyBzdGFrZXIgPSB0aGlzLnR4bi5zZW5kZXIKCXR4biBTZW5kZXIKCWZyYW1lX2J1cnkgMCAvLyBzdGFrZXI6IGFkZHJlc3MKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czozODcKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGFrZXJzLnZhbHVlLmxlbmd0aDsgaSArPSAxKQoJaW50IDAKCWZyYW1lX2J1cnkgMSAvLyBpOiB1aW50NjQKCipmb3JfMjoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjM4NwoJLy8gaSA8IHRoaXMuc3Rha2Vycy52YWx1ZS5sZW5ndGgKCWZyYW1lX2RpZyAxIC8vIGk6IHVpbnQ2NAoJaW50IDIwMAoJPAoJYnogKmZvcl8yX2VuZAoKCS8vICppZjE0X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6Mzg4CgkvLyBnbG9iYWxzLm9wY29kZUJ1ZGdldCA8IDMwMAoJZ2xvYmFsIE9wY29kZUJ1ZGdldAoJaW50IDMwMAoJPAoJYnogKmlmMTRfZW5kCgoJLy8gKmlmMTRfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6Mzg5CgkvLyBpbmNyZWFzZU9wY29kZUJ1ZGdldCgpCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJaW50IDAKCWl0eG5fZmllbGQgRmVlCglieXRlIGI2NCBDb0VCIC8vICNwcmFnbWEgdmVyc2lvbiAxMDsgaW50IDEKCWR1cAoJaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCWludCBEZWxldGVBcHBsaWNhdGlvbgoJaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KCWl0eG5fc3VibWl0CgoqaWYxNF9lbmQ6CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czozOTEKCS8vIGNtcFN0YWtlciA9IGNsb25lKHRoaXMuc3Rha2Vycy52YWx1ZVtpXSkKCWZyYW1lX2RpZyAxIC8vIGk6IHVpbnQ2NAoJaW50IDY0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCA2NAoJYnl0ZSAweDczNzQ2MTZiNjU3MjczIC8vICJzdGFrZXJzIgoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWZyYW1lX2J1cnkgMiAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCgkvLyAqaWYxNV9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjM5MgoJLy8gY21wU3Rha2VyLmFjY291bnQgPT09IHN0YWtlcgoJZnJhbWVfZGlnIDIgLy8gY21wU3Rha2VyOiAoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCglleHRyYWN0IDAgMzIKCWZyYW1lX2RpZyAwIC8vIHN0YWtlcjogYWRkcmVzcwoJPT0KCWJ6ICppZjE1X2VuZAoKCS8vICppZjE1X2NvbnNlcXVlbnQKCS8vICppZjE2X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MzkzCgkvLyBjbXBTdGFrZXIucmV3YXJkVG9rZW5CYWxhbmNlID09PSAwCglmcmFtZV9kaWcgMiAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgNDggOAoJYnRvaQoJaW50IDAKCT09CglieiAqaWYxNl9lbmQKCgkvLyAqaWYxNl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czozOTQKCS8vIHJldHVybgoJcmV0c3ViCgoqaWYxNl9lbmQ6CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czozOTYKCS8vIGFtb3VudFJld2FyZFRva2VuUmVtb3ZlZCA9IDAKCWludCAwCglmcmFtZV9idXJ5IDMgLy8gYW1vdW50UmV3YXJkVG9rZW5SZW1vdmVkOiB1aW50NjQKCgkvLyAqaWYxN19jb25kaXRpb24KCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjM5OAoJLy8gdGhpcy5wb29sSWQudmFsdWUgPT09IDEKCWJ5dGUgMHg3MDZmNmY2YzQ5NjQgLy8gInBvb2xJZCIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMQoJPT0KCWJ6ICppZjE3X2Vsc2UKCgkvLyAqaWYxN19jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czozOTkKCS8vIHZhbGlkYXRvckNvbmZpZyA9IHNlbmRNZXRob2RDYWxsPHR5cGVvZiBWYWxpZGF0b3JSZWdpc3RyeS5wcm90b3R5cGUuZ2V0VmFsaWRhdG9yQ29uZmlnPih7CgkvLyAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklEOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKCS8vICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3M6IFt0aGlzLnZhbGlkYXRvcklkLnZhbHVlXSwKCS8vICAgICAgICAgICAgICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgltZXRob2QgImdldFZhbGlkYXRvckNvbmZpZyh1aW50NjQpKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo0MDAKCS8vIGFwcGxpY2F0aW9uSUQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlCglieXRlIDB4NjM3MjY1NjE3NDZmNzI0MTcwNzAgLy8gImNyZWF0b3JBcHAiCglhcHBfZ2xvYmFsX2dldAoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NDAxCgkvLyBtZXRob2RBcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZV0KCWJ5dGUgMHg3NjYxNmM2OTY0NjE3NDZmNzI0OTY0IC8vICJ2YWxpZGF0b3JJZCIKCWFwcF9nbG9iYWxfZ2V0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCWl0eG4gTnVtTG9ncwoJaW50IDEKCS0KCWl0eG5hcyBMb2dzCglleHRyYWN0IDQgMAoJZnJhbWVfYnVyeSA0IC8vIHZhbGlkYXRvckNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NDA2CgkvLyBzZW5kQXNzZXRUcmFuc2Zlcih7CgkvLyAgICAgICAgICAgICAgICAgICAgICAgICB4ZmVyQXNzZXQ6IEFzc2V0SUQuZnJvbVVpbnQ2NCh2YWxpZGF0b3JDb25maWcucmV3YXJkVG9rZW5JZCksCgkvLyAgICAgICAgICAgICAgICAgICAgICAgICBhc3NldFJlY2VpdmVyOiBzdGFrZXIsCgkvLyAgICAgICAgICAgICAgICAgICAgICAgICBhc3NldEFtb3VudDogY21wU3Rha2VyLnJld2FyZFRva2VuQmFsYW5jZSwKCS8vICAgICAgICAgICAgICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBheGZlcgoJaXR4bl9maWVsZCBUeXBlRW51bQoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjQwNwoJLy8geGZlckFzc2V0OiBBc3NldElELmZyb21VaW50NjQodmFsaWRhdG9yQ29uZmlnLnJld2FyZFRva2VuSWQpCglmcmFtZV9kaWcgNCAvLyB2YWxpZGF0b3JDb25maWc6ICh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KQoJZXh0cmFjdCAxNTMgOAoJYnRvaQoJaXR4bl9maWVsZCBYZmVyQXNzZXQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo0MDgKCS8vIGFzc2V0UmVjZWl2ZXI6IHN0YWtlcgoJZnJhbWVfZGlnIDAgLy8gc3Rha2VyOiBhZGRyZXNzCglpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo0MDkKCS8vIGFzc2V0QW1vdW50OiBjbXBTdGFrZXIucmV3YXJkVG9rZW5CYWxhbmNlCglmcmFtZV9kaWcgMiAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgNDggOAoJYnRvaQoJaXR4bl9maWVsZCBBc3NldEFtb3VudAoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo0MTEKCS8vIGFtb3VudFJld2FyZFRva2VuUmVtb3ZlZCA9IGNtcFN0YWtlci5yZXdhcmRUb2tlbkJhbGFuY2UKCWZyYW1lX2RpZyAyIC8vIGNtcFN0YWtlcjogKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJZXh0cmFjdCA0OCA4CglidG9pCglmcmFtZV9idXJ5IDMgLy8gYW1vdW50UmV3YXJkVG9rZW5SZW1vdmVkOiB1aW50NjQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo0MTIKCS8vIGNtcFN0YWtlci5yZXdhcmRUb2tlbkJhbGFuY2UgPSAwCglmcmFtZV9kaWcgMiAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCglyZXBsYWNlMiA0OAoJZnJhbWVfYnVyeSAyIC8vIGNtcFN0YWtlcjogKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJYiAqaWYxN19lbmQKCippZjE3X2Vsc2U6CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo0MTcKCS8vIGFtb3VudFJld2FyZFRva2VuUmVtb3ZlZCA9IGNtcFN0YWtlci5yZXdhcmRUb2tlbkJhbGFuY2UKCWZyYW1lX2RpZyAyIC8vIGNtcFN0YWtlcjogKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJZXh0cmFjdCA0OCA4CglidG9pCglmcmFtZV9idXJ5IDMgLy8gYW1vdW50UmV3YXJkVG9rZW5SZW1vdmVkOiB1aW50NjQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo0MTgKCS8vIGNtcFN0YWtlci5yZXdhcmRUb2tlbkJhbGFuY2UgPSAwCglmcmFtZV9kaWcgMiAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCglyZXBsYWNlMiA0OAoJZnJhbWVfYnVyeSAyIC8vIGNtcFN0YWtlcjogKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoKKmlmMTdfZW5kOgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NDIyCgkvLyB0aGlzLnN0YWtlcnMudmFsdWVbaV0gPSBjbXBTdGFrZXIKCWZyYW1lX2RpZyAxIC8vIGk6IHVpbnQ2NAoJaW50IDY0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWZyYW1lX2RpZyAyIC8vIGNtcFN0YWtlcjogKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJYnl0ZSAweDczNzQ2MTZiNjU3MjczIC8vICJzdGFrZXJzIgoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo0MjcKCS8vIHNlbmRNZXRob2RDYWxsPHR5cGVvZiBWYWxpZGF0b3JSZWdpc3RyeS5wcm90b3R5cGUuc3Rha2VSZW1vdmVkPih7CgkvLyAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAoJLy8gICAgICAgICAgICAgICAgICAgICBtZXRob2RBcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgICAgICAgICB7IGlkOiB0aGlzLnZhbGlkYXRvcklkLnZhbHVlLCBwb29sSWQ6IHRoaXMucG9vbElkLnZhbHVlLCBwb29sQXBwSWQ6IHRoaXMuYXBwLmlkIH0sCgkvLyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFrZXIsCgkvLyAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvLyBubyBhbGdvIHJlbW92ZWQKCS8vICAgICAgICAgICAgICAgICAgICAgICAgIGFtb3VudFJld2FyZFRva2VuUmVtb3ZlZCwKCS8vICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAvLyBzdGFrZXIgaXNuJ3QgYmVpbmcgcmVtb3ZlZC4KCS8vICAgICAgICAgICAgICAgICAgICAgXSwKCS8vICAgICAgICAgICAgICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAic3Rha2VSZW1vdmVkKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wpdm9pZCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NDI4CgkvLyBhcHBsaWNhdGlvbklEOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZQoJYnl0ZSAweDYzNzI2NTYxNzQ2ZjcyNDE3MDcwIC8vICJjcmVhdG9yQXBwIgoJYXBwX2dsb2JhbF9nZXQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjQyOQoJLy8gbWV0aG9kQXJnczogWwoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgeyBpZDogdGhpcy52YWxpZGF0b3JJZC52YWx1ZSwgcG9vbElkOiB0aGlzLnBvb2xJZC52YWx1ZSwgcG9vbEFwcElkOiB0aGlzLmFwcC5pZCB9LAoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgc3Rha2VyLAoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgMCwgLy8gbm8gYWxnbyByZW1vdmVkCgkvLyAgICAgICAgICAgICAgICAgICAgICAgICBhbW91bnRSZXdhcmRUb2tlblJlbW92ZWQsCgkvLyAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgLy8gc3Rha2VyIGlzbid0IGJlaW5nIHJlbW92ZWQuCgkvLyAgICAgICAgICAgICAgICAgICAgIF0KCWJ5dGUgMHg3NjYxNmM2OTY0NjE3NDZmNzI0OTY0IC8vICJ2YWxpZGF0b3JJZCIKCWFwcF9nbG9iYWxfZ2V0CglpdG9iCglieXRlIDB4NzA2ZjZmNmM0OTY0IC8vICJwb29sSWQiCglhcHBfZ2xvYmFsX2dldAoJaXRvYgoJY29uY2F0Cgl0eG5hIEFwcGxpY2F0aW9ucyAwCglpdG9iCgljb25jYXQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMCAvLyBzdGFrZXI6IGFkZHJlc3MKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglieXRlIDB4MDAwMDAwMDAwMDAwMDAwMAoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWZyYW1lX2RpZyAzIC8vIGFtb3VudFJld2FyZFRva2VuUmVtb3ZlZDogdWludDY0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoJaW50IDAKCWJ5dGUgMHgwMAoJaW50IDAKCXVuY292ZXIgMgoJc2V0Yml0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo0MzcKCS8vIHJldHVybgoJcmV0c3ViCgoqaWYxNV9lbmQ6CgoqZm9yXzJfY29udGludWU6CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czozODcKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDEgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAxIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzIKCipmb3JfMl9lbmQ6CgkvLyBhY2NvdW50IG5vdCBmb3VuZAoJZXJyCglyZXRzdWIKCi8vIGdldFN0YWtlckluZm8oYWRkcmVzcykoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0U3Rha2VySW5mbzoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gc3Rha2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKHN0YWtlcikgZm9yIGdldFN0YWtlckluZm8gbXVzdCBiZSBhIGFkZHJlc3MKCWFzc2VydAoKCS8vIGV4ZWN1dGUgZ2V0U3Rha2VySW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWNhbGxzdWIgZ2V0U3Rha2VySW5mbwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFN0YWtlckluZm8oc3Rha2VyOiBBZGRyZXNzKTogU3Rha2VkSW5mbwovLwovLyBSZXRyaWV2ZXMgdGhlIHN0YWtlZCBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiBzdGFrZXIuCi8vCi8vIEBwYXJhbSB7QWRkcmVzc30gc3Rha2VyIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHN0YWtlci4KLy8gQHJldHVybnMge1N0YWtlZEluZm99IC0gVGhlIHN0YWtlZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuIHN0YWtlci4KLy8gQHRocm93cyB7RXJyb3J9IC0gSWYgdGhlIHN0YWtlcidzIGFjY291bnQgaXMgbm90IGZvdW5kLgpnZXRTdGFrZXJJbmZvOgoJcHJvdG8gMSAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo0NTIKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGFrZXJzLnZhbHVlLmxlbmd0aDsgaSArPSAxKQoJaW50IDAKCWZyYW1lX2J1cnkgMCAvLyBpOiB1aW50NjQKCipmb3JfMzoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjQ1MgoJLy8gaSA8IHRoaXMuc3Rha2Vycy52YWx1ZS5sZW5ndGgKCWZyYW1lX2RpZyAwIC8vIGk6IHVpbnQ2NAoJaW50IDIwMAoJPAoJYnogKmZvcl8zX2VuZAoKCS8vICppZjE4X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NDUzCgkvLyBnbG9iYWxzLm9wY29kZUJ1ZGdldCA8IDIwMAoJZ2xvYmFsIE9wY29kZUJ1ZGdldAoJaW50IDIwMAoJPAoJYnogKmlmMThfZW5kCgoJLy8gKmlmMThfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NDU0CgkvLyBpbmNyZWFzZU9wY29kZUJ1ZGdldCgpCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJaW50IDAKCWl0eG5fZmllbGQgRmVlCglieXRlIGI2NCBDb0VCIC8vICNwcmFnbWEgdmVyc2lvbiAxMDsgaW50IDEKCWR1cAoJaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCWludCBEZWxldGVBcHBsaWNhdGlvbgoJaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KCWl0eG5fc3VibWl0CgoqaWYxOF9lbmQ6CgkvLyAqaWYxOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjQ1NgoJLy8gdGhpcy5zdGFrZXJzLnZhbHVlW2ldLmFjY291bnQgPT09IHN0YWtlcgoJZnJhbWVfZGlnIDAgLy8gaTogdWludDY0CglpbnQgNjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCAzMgoJYnl0ZSAweDczNzQ2MTZiNjU3MjczIC8vICJzdGFrZXJzIgoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZXI6IEFkZHJlc3MKCT09CglieiAqaWYxOV9lbmQKCgkvLyAqaWYxOV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo0NTcKCS8vIHJldHVybiB0aGlzLnN0YWtlcnMudmFsdWVbaV0KCWZyYW1lX2RpZyAwIC8vIGk6IHVpbnQ2NAoJaW50IDY0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCA2NAoJYnl0ZSAweDczNzQ2MTZiNjU3MjczIC8vICJzdGFrZXJzIgoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWIgKmdldFN0YWtlckluZm8qcmV0dXJuCgoqaWYxOV9lbmQ6CgoqZm9yXzNfY29udGludWU6CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo0NTIKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDAgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAwIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzMKCipmb3JfM19lbmQ6CgkvLyBhY2NvdW50IG5vdCBmb3VuZAoJZXJyCgoqZ2V0U3Rha2VySW5mbypyZXR1cm46CgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gcGF5VG9rZW5SZXdhcmQoYWRkcmVzcyx1aW50NjQsdWludDY0KXZvaWQKKmFiaV9yb3V0ZV9wYXlUb2tlblJld2FyZDoKCS8vIGFtb3VudFRvU2VuZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglidG9pCgoJLy8gcmV3YXJkVG9rZW46IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJYnRvaQoKCS8vIHN0YWtlcjogYWRkcmVzcwoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZHVwCglsZW4KCWludCAzMgoJPT0KCgkvLyBhcmd1bWVudCAyIChzdGFrZXIpIGZvciBwYXlUb2tlblJld2FyZCBtdXN0IGJlIGEgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBwYXlUb2tlblJld2FyZChhZGRyZXNzLHVpbnQ2NCx1aW50NjQpdm9pZAoJY2FsbHN1YiBwYXlUb2tlblJld2FyZAoJaW50IDEKCXJldHVybgoKLy8gcGF5VG9rZW5SZXdhcmQoc3Rha2VyOiBBZGRyZXNzLCByZXdhcmRUb2tlbjogdWludDY0LCBhbW91bnRUb1NlbmQ6IHVpbnQ2NCk6IHZvaWQKLy8KLy8gW0ludGVybmFsIHByb3RvY29sIG1ldGhvZF0gUmVtb3ZlIGEgc3BlY2lmaWVkIGFtb3VudCBvZiAnY29tbXVuaXR5IHRva2VuJyByZXdhcmRzIGZvciBhIHN0YWtlci4KLy8gVGhpcyBjYW4gT05MWSBiZSBjYWxsZWQgYnkgb3VyIHZhbGlkYXRvciBhbmQgb25seSBpZiB3ZSdyZSBwb29sIDEgLSB3aXRoIHRoZSB0b2tlbi4KLy8gTm90ZTogdGhpcyBjYW4gYWxzbyBiZSBjYWxsZWQgYnkgdmFsaWRhdG9yIGFzIHBhcnQgb2YgT1dORVIgd2FudGluZyB0byBzZW5kIHRoZSByZXdhcmQgdG9rZW5zCi8vIHNvbWV3aGVyZSBlbHNlIChpZSBpZiB0aGV5J3JlIHN1bnNldHRpbmcgdGhlaXIgdmFsaWRhdG9yIGFuZCBuZWVkIHRoZSByZXdhcmQgdG9rZW5zIGJhY2spLgovLyBJdCdzIHVwIHRvIHRoZSB2YWxpZGF0b3IgdG8gZW5zdXJlIHRoYXQgdGhlIGJhbGFuY2UgaW4gcmV3YXJkVG9rZW5IZWxkQmFjayBpcyBob25vcmVkLgovLyBAcGFyYW0gc3Rha2VyIC0gdGhlIHN0YWtlciBhY2NvdW50IHRvIHNlbmQgcmV3YXJkcyB0bwovLyBAcGFyYW0gcmV3YXJkVG9rZW4gLSBpZCBvZiByZXdhcmQgdG9rZW4gKHRvIGF2b2lkIHJlLWVudHJhbmN5IGluIGNhbGxpbmcgdmFsaWRhdG9yIGJhY2sgdG8gZ2V0IGlkKQovLyBAcGFyYW0gYW1vdW50VG9TZW5kIC0gYW1vdW50IHRvIHNlbmQgdGhlIHN0YWtlciAodGhlcmUgaXMgc2lnbmlmaWNhbnQgdHJ1c3QgaGVyZSghKSAtIGFsc28gd2h5IG9ubHkgdmFsaWRhdG9yIGNhbiBjYWxsIHVzCnBheVRva2VuUmV3YXJkOgoJcHJvdG8gMyAwCgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NDc1CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICB0aGlzLnR4bi5zZW5kZXIgPT09IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLmFkZHJlc3MsCgkvLyAgICAgICAgICAgICAndGhpcyBjYW4gb25seSBiZSBjYWxsZWQgdmlhIHRoZSB2YWxpZGF0b3IgY29udHJhY3QnLAoJLy8gICAgICAgICApCgl0eG4gU2VuZGVyCglieXRlIDB4NjM3MjY1NjE3NDZmNzI0MTcwNzAgLy8gImNyZWF0b3JBcHAiCglhcHBfZ2xvYmFsX2dldAoJYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwoJcG9wCgk9PQoKCS8vIHRoaXMgY2FuIG9ubHkgYmUgY2FsbGVkIHZpYSB0aGUgdmFsaWRhdG9yIGNvbnRyYWN0Cglhc3NlcnQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo0NzkKCS8vIGFzc2VydCh0aGlzLnBvb2xJZC52YWx1ZSA9PT0gMSwgJ211c3QgYmUgcG9vbCAxIGluIG9yZGVyIHRvIGJlIGNhbGxlZCB0byBwYXkgb3V0IHRva2VuIHJld2FyZHMnKQoJYnl0ZSAweDcwNmY2ZjZjNDk2NCAvLyAicG9vbElkIgoJYXBwX2dsb2JhbF9nZXQKCWludCAxCgk9PQoKCS8vIG11c3QgYmUgcG9vbCAxIGluIG9yZGVyIHRvIGJlIGNhbGxlZCB0byBwYXkgb3V0IHRva2VuIHJld2FyZHMKCWFzc2VydAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjQ4MAoJLy8gYXNzZXJ0KHJld2FyZFRva2VuICE9PSAwLCAnY2FuIG9ubHkgY2xhaW0gdG9rZW4gcmV3YXJkcyBmcm9tIHZhbGlkYXRvciB0aGF0IGhhcyB0aGVtJykKCWZyYW1lX2RpZyAtMiAvLyByZXdhcmRUb2tlbjogdWludDY0CglpbnQgMAoJIT0KCgkvLyBjYW4gb25seSBjbGFpbSB0b2tlbiByZXdhcmRzIGZyb20gdmFsaWRhdG9yIHRoYXQgaGFzIHRoZW0KCWFzc2VydAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjQ4MwoJLy8gc2VuZEFzc2V0VHJhbnNmZXIoewoJLy8gICAgICAgICAgICAgeGZlckFzc2V0OiBBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW4pLAoJLy8gICAgICAgICAgICAgYXNzZXRSZWNlaXZlcjogc3Rha2VyLAoJLy8gICAgICAgICAgICAgYXNzZXRBbW91bnQ6IGFtb3VudFRvU2VuZCwKCS8vICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBheGZlcgoJaXR4bl9maWVsZCBUeXBlRW51bQoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjQ4NAoJLy8geGZlckFzc2V0OiBBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW4pCglmcmFtZV9kaWcgLTIgLy8gcmV3YXJkVG9rZW46IHVpbnQ2NAoJaXR4bl9maWVsZCBYZmVyQXNzZXQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo0ODUKCS8vIGFzc2V0UmVjZWl2ZXI6IHN0YWtlcgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NDg2CgkvLyBhc3NldEFtb3VudDogYW1vdW50VG9TZW5kCglmcmFtZV9kaWcgLTMgLy8gYW1vdW50VG9TZW5kOiB1aW50NjQKCWl0eG5fZmllbGQgQXNzZXRBbW91bnQKCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCgkvLyBTdWJtaXQgaW5uZXIgdHJhbnNhY3Rpb24KCWl0eG5fc3VibWl0CglyZXRzdWIKCi8vIHVwZGF0ZUFsZ29kVmVyKHN0cmluZyl2b2lkCiphYmlfcm91dGVfdXBkYXRlQWxnb2RWZXI6CgkvLyBhbGdvZFZlcjogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglleHRyYWN0IDIgMAoKCS8vIGV4ZWN1dGUgdXBkYXRlQWxnb2RWZXIoc3RyaW5nKXZvaWQKCWNhbGxzdWIgdXBkYXRlQWxnb2RWZXIKCWludCAxCglyZXR1cm4KCi8vIHVwZGF0ZUFsZ29kVmVyKGFsZ29kVmVyOiBzdHJpbmcpOiB2b2lkCi8vCi8vIFVwZGF0ZSB0aGUgKGhvbm9yIHN5c3RlbSkgYWxnb2QgdmVyc2lvbiBmb3IgdGhlIG5vZGUgYXNzb2NpYXRlZCB0byB0aGlzIHBvb2wuICBUaGUgbm9kZSBtYW5hZ2VtZW50IGRhZW1vbgovLyBzaG91bGQgY29tcGFyZSBpdHMgY3VycmVudCBub2RlcyB2ZXJzaW9uIHRvIHRoZSB2ZXJzaW9uIHN0b3JlZCBpbiBnbG9iYWwgc3RhdGUsIHVwZGF0aW5nIHdoZW4gZGlmZmVyZW50LgovLyBUaGUgcmV0aSBub2RlIGRhZW1vbiBjb21wb3NlcyBpdHMgb3duIHZlcnNpb24gc3RyaW5nIHVzaW5nIGZvcm1hdDoKLy8ge21ham9yfS57bWlub3J9LntidWlsZH0ge2JyYW5jaH0gW3tjb21taXQgaGFzaH1dLAovLyBpZTogMy4yMi4wIHJlbC9zdGFibGUgWzZiNTA4OTc1XQovLyBbIE9OTFkgT1dORVIgT1IgTUFOQUdFUiBDQU4gQ0FMTCBdCi8vIEBwYXJhbSB7c3RyaW5nfSBhbGdvZFZlciAtIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGFsZ29yYW5kIG5vZGUgZGFlbW9uIHZlcnNpb24gKHJldGkgbm9kZSBkYWVtb24gY29tcG9zZXMgaXRzIG93biBtZXRhIHZlcnNpb24pCnVwZGF0ZUFsZ29kVmVyOgoJcHJvdG8gMSAwCgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NTAwCgkvLyBhc3NlcnQodGhpcy5pc093bmVyT3JNYW5hZ2VyQ2FsbGVyKCksICdjYW4gb25seSBiZSBjYWxsZWQgYnkgb3duZXIgb3IgbWFuYWdlciBvZiB2YWxpZGF0b3InKQoJY2FsbHN1YiBpc093bmVyT3JNYW5hZ2VyQ2FsbGVyCgoJLy8gY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IG93bmVyIG9yIG1hbmFnZXIgb2YgdmFsaWRhdG9yCglhc3NlcnQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo1MDEKCS8vIHRoaXMuYWxnb2RWZXIudmFsdWUgPSBhbGdvZFZlcgoJYnl0ZSAweDYxNmM2NzZmNjQ1NjY1NzIgLy8gImFsZ29kVmVyIgoJZnJhbWVfZGlnIC0xIC8vIGFsZ29kVmVyOiBzdHJpbmcKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIGVwb2NoQmFsYW5jZVVwZGF0ZSgpdm9pZAoqYWJpX3JvdXRlX2Vwb2NoQmFsYW5jZVVwZGF0ZToKCS8vIGV4ZWN1dGUgZXBvY2hCYWxhbmNlVXBkYXRlKCl2b2lkCgljYWxsc3ViIGVwb2NoQmFsYW5jZVVwZGF0ZQoJaW50IDEKCXJldHVybgoKLy8gZXBvY2hCYWxhbmNlVXBkYXRlKCk6IHZvaWQKLy8KLy8gVXBkYXRlcyB0aGUgYmFsYW5jZSBvZiBzdGFrZXJzIGluIHRoZSBwb29sIGJhc2VkIG9uIHRoZSByZWNlaXZlZCAncmV3YXJkcycgKGN1cnJlbnQgYmFsYW5jZSB2cyBrbm93biBzdGFrZWQgYmFsYW5jZSkKLy8gc3Rha2VycyBvdXRzdGFuZGluZyBiYWxhbmNlIGlzIGFkanVzdGVkIGJhc2VkIG9uIHRoZWlyICUgb2Ygc3Rha2UgYW5kIHRpbWUgaW4gdGhlIGN1cnJlbnQgZXBvY2ggLSBzbyB0aGF0IGJhbGFuY2UKLy8gY29tcG91bmRzIG92ZXIgdGltZSBhbmQgc3Rha2VyIGNhbiByZW1vdmUgdGhhdCBhbW91bnQgYXQgd2lsbC4KLy8gVGhlIHZhbGlkYXRvciBpcyBwYWlkIHRoZWlyIHBlcmNlbnRhZ2UgZWFjaCBlcG9jaCBwYXlvdXQuCi8vCi8vIE5vdGU6IEFOWU9ORSBjYW4gY2FsbCB0aGlzLgplcG9jaEJhbGFuY2VVcGRhdGU6Cglwcm90byAwIDAKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiAzOQoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjUxNAoJLy8gdmFsaWRhdG9yQ29uZmlnID0gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFZhbGlkYXRvclJlZ2lzdHJ5LnByb3RvdHlwZS5nZXRWYWxpZGF0b3JDb25maWc+KHsKCS8vICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAoJLy8gICAgICAgICAgICAgbWV0aG9kQXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdLAoJLy8gICAgICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAiZ2V0VmFsaWRhdG9yQ29uZmlnKHVpbnQ2NCkodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkiCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjUxNQoJLy8gYXBwbGljYXRpb25JRDogdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUKCWJ5dGUgMHg2MzcyNjU2MTc0NmY3MjQxNzA3MCAvLyAiY3JlYXRvckFwcCIKCWFwcF9nbG9iYWxfZ2V0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo1MTYKCS8vIG1ldGhvZEFyZ3M6IFt0aGlzLnZhbGlkYXRvcklkLnZhbHVlXQoJYnl0ZSAweDc2NjE2YzY5NjQ2MTc0NmY3MjQ5NjQgLy8gInZhbGlkYXRvcklkIgoJYXBwX2dsb2JhbF9nZXQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoJaXR4biBOdW1Mb2dzCglpbnQgMQoJLQoJaXR4bmFzIExvZ3MKCWV4dHJhY3QgNCAwCglmcmFtZV9idXJ5IDAgLy8gdmFsaWRhdG9yQ29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo1MjMKCS8vIGVwb2NoUm91bmRMZW5ndGggPSB2YWxpZGF0b3JDb25maWcuZXBvY2hSb3VuZExlbmd0aCBhcyB1aW50NjQKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvckNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCglleHRyYWN0IDE2OSA0CglidG9pCglmcmFtZV9idXJ5IDEgLy8gZXBvY2hSb3VuZExlbmd0aDogdWludDY0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NTI0CgkvLyBjdXJSb3VuZCA9IGdsb2JhbHMucm91bmQKCWdsb2JhbCBSb3VuZAoJZnJhbWVfYnVyeSAyIC8vIGN1clJvdW5kOiB1aW50NjQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo1MjUKCS8vIHRoaXNFcG9jaEJlZ2luID0gY3VyUm91bmQgLSAoY3VyUm91bmQgJSBlcG9jaFJvdW5kTGVuZ3RoKQoJZnJhbWVfZGlnIDIgLy8gY3VyUm91bmQ6IHVpbnQ2NAoJZnJhbWVfZGlnIDIgLy8gY3VyUm91bmQ6IHVpbnQ2NAoJZnJhbWVfZGlnIDEgLy8gZXBvY2hSb3VuZExlbmd0aDogdWludDY0CgklCgktCglmcmFtZV9idXJ5IDMgLy8gdGhpc0Vwb2NoQmVnaW46IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjUyOAoJLy8gbGFzdFBheW91dEVwb2NoID0gdGhpcy5sYXN0UGF5b3V0LnZhbHVlIC0gKHRoaXMubGFzdFBheW91dC52YWx1ZSAlIGVwb2NoUm91bmRMZW5ndGgpCglieXRlIDB4NmM2MTczNzQ1MDYxNzk2Zjc1NzQgLy8gImxhc3RQYXlvdXQiCglhcHBfZ2xvYmFsX2dldAoJYnl0ZSAweDZjNjE3Mzc0NTA2MTc5NmY3NTc0IC8vICJsYXN0UGF5b3V0IgoJYXBwX2dsb2JhbF9nZXQKCWZyYW1lX2RpZyAxIC8vIGVwb2NoUm91bmRMZW5ndGg6IHVpbnQ2NAoJJQoJLQoJZnJhbWVfYnVyeSA0IC8vIGxhc3RQYXlvdXRFcG9jaDogdWludDY0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NTMwCgkvLyBhc3NlcnQobGFzdFBheW91dEVwb2NoICE9PSB0aGlzRXBvY2hCZWdpbiwgImNhbid0IGNhbGwgZXBvY2hCYWxhbmNlVXBkYXRlIGluIHNhbWUgZXBvY2ggYXMgcHJpb3IgY2FsbCIpCglmcmFtZV9kaWcgNCAvLyBsYXN0UGF5b3V0RXBvY2g6IHVpbnQ2NAoJZnJhbWVfZGlnIDMgLy8gdGhpc0Vwb2NoQmVnaW46IHVpbnQ2NAoJIT0KCgkvLyBjYW4ndCBjYWxsIGVwb2NoQmFsYW5jZVVwZGF0ZSBpbiBzYW1lIGVwb2NoIGFzIHByaW9yIGNhbGwKCWFzc2VydAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjUzMgoJLy8gdGhpcy5jaGVja0lmQmluQ2xvc2VkKCkKCWNhbGxzdWIgY2hlY2tJZkJpbkNsb3NlZAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjUzNQoJLy8gdGhpcy5sYXN0UGF5b3V0LnZhbHVlID0gY3VyUm91bmQKCWJ5dGUgMHg2YzYxNzM3NDUwNjE3OTZmNzU3NCAvLyAibGFzdFBheW91dCIKCWZyYW1lX2RpZyAyIC8vIGN1clJvdW5kOiB1aW50NjQKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NTM2CgkvLyB0aGlzLmVwb2NoTnVtYmVyLnZhbHVlICs9IDEKCWJ5dGUgMHg2NTcwNmY2MzY4NGU3NTZkNjI2NTcyIC8vICJlcG9jaE51bWJlciIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMQoJKwoJYnl0ZSAweDY1NzA2ZjYzNjg0ZTc1NmQ2MjY1NzIgLy8gImVwb2NoTnVtYmVyIgoJc3dhcAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo1NDEKCS8vIGlzVG9rZW5FbGlnaWJsZSA9IHZhbGlkYXRvckNvbmZpZy5yZXdhcmRUb2tlbklkICE9PSAwCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JDb25maWc6ICh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KQoJZXh0cmFjdCAxNTMgOAoJYnRvaQoJaW50IDAKCSE9CglmcmFtZV9idXJ5IDUgLy8gaXNUb2tlbkVsaWdpYmxlOiBib29sCgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NTQyCgkvLyBwb29sT25lQXBwSUQgPSB0aGlzLmFwcC5pZAoJdHhuYSBBcHBsaWNhdGlvbnMgMAoJZnJhbWVfYnVyeSA2IC8vIHBvb2xPbmVBcHBJRDogdWludDY0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NTQzCgkvLyBwb29sT25lQWRkcmVzcyA9IHRoaXMuYXBwLmFkZHJlc3MKCWdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCglmcmFtZV9idXJ5IDcgLy8gcG9vbE9uZUFkZHJlc3M6IGFkZHJlc3MKCgkvLyAqaWYyMF9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjU0OAoJLy8gaXNUb2tlbkVsaWdpYmxlCglmcmFtZV9kaWcgNSAvLyBpc1Rva2VuRWxpZ2libGU6IGJvb2wKCWJ6ICppZjIwX2VuZAoKCS8vICppZjIwX2NvbnNlcXVlbnQKCS8vICppZjIxX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NTQ5CgkvLyB0aGlzLnBvb2xJZC52YWx1ZSAhPT0gMQoJYnl0ZSAweDcwNmY2ZjZjNDk2NCAvLyAicG9vbElkIgoJYXBwX2dsb2JhbF9nZXQKCWludCAxCgkhPQoJYnogKmlmMjFfZW5kCgoJLy8gKmlmMjFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NTUxCgkvLyBwb29sT25lQXBwSUQgPSBzZW5kTWV0aG9kQ2FsbDx0eXBlb2YgVmFsaWRhdG9yUmVnaXN0cnkucHJvdG90eXBlLmdldFBvb2xBcHBJZD4oewoJLy8gICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklEOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKCS8vICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWUsIDFdLAoJLy8gICAgICAgICAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJbWV0aG9kICJnZXRQb29sQXBwSWQodWludDY0LHVpbnQ2NCl1aW50NjQiCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjU1MgoJLy8gYXBwbGljYXRpb25JRDogdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUKCWJ5dGUgMHg2MzcyNjU2MTc0NmY3MjQxNzA3MCAvLyAiY3JlYXRvckFwcCIKCWFwcF9nbG9iYWxfZ2V0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo1NTMKCS8vIG1ldGhvZEFyZ3M6IFt0aGlzLnZhbGlkYXRvcklkLnZhbHVlLCAxXQoJYnl0ZSAweDc2NjE2YzY5NjQ2MTc0NmY3MjQ5NjQgLy8gInZhbGlkYXRvcklkIgoJYXBwX2dsb2JhbF9nZXQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglieXRlIDB4MDAwMDAwMDAwMDAwMDAwMQoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCgkvLyBTdWJtaXQgaW5uZXIgdHJhbnNhY3Rpb24KCWl0eG5fc3VibWl0CglpdHhuIE51bUxvZ3MKCWludCAxCgktCglpdHhuYXMgTG9ncwoJZXh0cmFjdCA0IDAKCWJ0b2kKCWZyYW1lX2J1cnkgNiAvLyBwb29sT25lQXBwSUQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjU1NQoJLy8gcG9vbE9uZUFkZHJlc3MgPSBBcHBJRC5mcm9tVWludDY0KHBvb2xPbmVBcHBJRCkuYWRkcmVzcwoJZnJhbWVfZGlnIDYgLy8gcG9vbE9uZUFwcElEOiB1aW50NjQKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCXBvcAoJZnJhbWVfYnVyeSA3IC8vIHBvb2xPbmVBZGRyZXNzOiBhZGRyZXNzCgoqaWYyMV9lbmQ6CgkvLyAqaWYyMl9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjU2MAoJLy8gdGhpcy5wb29sSWQudmFsdWUgPT09IDEKCWJ5dGUgMHg3MDZmNmY2YzQ5NjQgLy8gInBvb2xJZCIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMQoJPT0KCWJ6ICppZjIyX2Vsc2UKCgkvLyAqaWYyMl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo1NjEKCS8vIHRva2VuUGF5b3V0UmF0aW8gPSBzZW5kTWV0aG9kQ2FsbDx0eXBlb2YgVmFsaWRhdG9yUmVnaXN0cnkucHJvdG90eXBlLnNldFRva2VuUGF5b3V0UmF0aW8+KHsKCS8vICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRDogdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUsCgkvLyAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3M6IFt0aGlzLnZhbGlkYXRvcklkLnZhbHVlXSwKCS8vICAgICAgICAgICAgICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAic2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KSIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NTYyCgkvLyBhcHBsaWNhdGlvbklEOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZQoJYnl0ZSAweDYzNzI2NTYxNzQ2ZjcyNDE3MDcwIC8vICJjcmVhdG9yQXBwIgoJYXBwX2dsb2JhbF9nZXQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjU2MwoJLy8gbWV0aG9kQXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdCglieXRlIDB4NzY2MTZjNjk2NDYxNzQ2ZjcyNDk2NCAvLyAidmFsaWRhdG9ySWQiCglhcHBfZ2xvYmFsX2dldAoJaXRvYgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCgkvLyBTdWJtaXQgaW5uZXIgdHJhbnNhY3Rpb24KCWl0eG5fc3VibWl0CglpdHhuIE51bUxvZ3MKCWludCAxCgktCglpdHhuYXMgTG9ncwoJZXh0cmFjdCA0IDAKCWZyYW1lX2J1cnkgOCAvLyB0b2tlblBheW91dFJhdGlvOiBQb29sVG9rZW5QYXlvdXRSYXRpbwoJYiAqaWYyMl9lbmQKCippZjIyX2Vsc2U6CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo1NjcKCS8vIHRva2VuUGF5b3V0UmF0aW8gPSBzZW5kTWV0aG9kQ2FsbDx0eXBlb2YgU3Rha2luZ1Bvb2wucHJvdG90eXBlLnByb3hpZWRTZXRUb2tlblBheW91dFJhdGlvPih7CgkvLyAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQocG9vbE9uZUFwcElEKSwKCS8vICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJnczogW3sgaWQ6IHRoaXMudmFsaWRhdG9ySWQudmFsdWUsIHBvb2xJZDogdGhpcy5wb29sSWQudmFsdWUsIHBvb2xBcHBJZDogdGhpcy5hcHAuaWQgfV0sCgkvLyAgICAgICAgICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgltZXRob2QgInByb3hpZWRTZXRUb2tlblBheW91dFJhdGlvKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpKHVpbnQ2NFsyNF0sdWludDY0KSIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NTY4CgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xPbmVBcHBJRCkKCWZyYW1lX2RpZyA2IC8vIHBvb2xPbmVBcHBJRDogdWludDY0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo1NjkKCS8vIG1ldGhvZEFyZ3M6IFt7IGlkOiB0aGlzLnZhbGlkYXRvcklkLnZhbHVlLCBwb29sSWQ6IHRoaXMucG9vbElkLnZhbHVlLCBwb29sQXBwSWQ6IHRoaXMuYXBwLmlkIH1dCglieXRlIDB4NzY2MTZjNjk2NDYxNzQ2ZjcyNDk2NCAvLyAidmFsaWRhdG9ySWQiCglhcHBfZ2xvYmFsX2dldAoJaXRvYgoJYnl0ZSAweDcwNmY2ZjZjNDk2NCAvLyAicG9vbElkIgoJYXBwX2dsb2JhbF9nZXQKCWl0b2IKCWNvbmNhdAoJdHhuYSBBcHBsaWNhdGlvbnMgMAoJaXRvYgoJY29uY2F0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCWl0eG4gTnVtTG9ncwoJaW50IDEKCS0KCWl0eG5hcyBMb2dzCglleHRyYWN0IDQgMAoJZnJhbWVfYnVyeSA4IC8vIHRva2VuUGF5b3V0UmF0aW86IFBvb2xUb2tlblBheW91dFJhdGlvCgoqaWYyMl9lbmQ6CgoqaWYyMF9lbmQ6CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo1NzYKCS8vIHZhbGlkYXRvclN0YXRlID0gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFZhbGlkYXRvclJlZ2lzdHJ5LnByb3RvdHlwZS5nZXRWYWxpZGF0b3JTdGF0ZT4oewoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25JRDogdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUsCgkvLyAgICAgICAgICAgICBtZXRob2RBcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZV0sCgkvLyAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJbWV0aG9kICJnZXRWYWxpZGF0b3JTdGF0ZSh1aW50NjQpKHVpbnQxNix1aW50NjQsdWludDY0LHVpbnQ2NCkiCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjU3NwoJLy8gYXBwbGljYXRpb25JRDogdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUKCWJ5dGUgMHg2MzcyNjU2MTc0NmY3MjQxNzA3MCAvLyAiY3JlYXRvckFwcCIKCWFwcF9nbG9iYWxfZ2V0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo1NzgKCS8vIG1ldGhvZEFyZ3M6IFt0aGlzLnZhbGlkYXRvcklkLnZhbHVlXQoJYnl0ZSAweDc2NjE2YzY5NjQ2MTc0NmY3MjQ5NjQgLy8gInZhbGlkYXRvcklkIgoJYXBwX2dsb2JhbF9nZXQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoJaXR4biBOdW1Mb2dzCglpbnQgMQoJLQoJaXR4bmFzIExvZ3MKCWV4dHJhY3QgNCAwCglmcmFtZV9idXJ5IDkgLy8gdmFsaWRhdG9yU3RhdGU6ICh1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQpCgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NTgwCgkvLyByZXdhcmRUb2tlbkhlbGRCYWNrID0gdmFsaWRhdG9yU3RhdGUucmV3YXJkVG9rZW5IZWxkQmFjawoJZnJhbWVfZGlnIDkgLy8gdmFsaWRhdG9yU3RhdGU6ICh1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQpCglleHRyYWN0IDE4IDgKCWJ0b2kKCWZyYW1lX2J1cnkgMTAgLy8gcmV3YXJkVG9rZW5IZWxkQmFjazogdWludDY0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NTg2CgkvLyBhbGdvUmV3YXJkQXZhaWwgPSB0aGlzLmFwcC5hZGRyZXNzLmJhbGFuY2UgLSB0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSAtIHRoaXMuYXBwLmFkZHJlc3MubWluQmFsYW5jZQoJZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCWFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQoJcG9wCglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglhcHBfZ2xvYmFsX2dldAoJLQoJZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCWFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQoJcG9wCgktCglmcmFtZV9idXJ5IDExIC8vIGFsZ29SZXdhcmRBdmFpbDogdWludDY0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NTg3CgkvLyBpc1Bvb2xTYXR1cmF0ZWQgPSBmYWxzZQoJaW50IDAKCWZyYW1lX2J1cnkgMTIgLy8gaXNQb29sU2F0dXJhdGVkOiBib29sCgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NTg4CgkvLyBhbGdvU2F0dXJhdGlvbkFtdCA9IHRoaXMuYWxnb1NhdHVyYXRpb25MZXZlbCgpCgljYWxsc3ViIGFsZ29TYXR1cmF0aW9uTGV2ZWwKCWZyYW1lX2J1cnkgMTMgLy8gYWxnb1NhdHVyYXRpb25BbXQ6IHVpbnQ2NAoKCS8vICppZjIzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NTk2CgkvLyB2YWxpZGF0b3JTdGF0ZS50b3RhbEFsZ29TdGFrZWQgPiBhbGdvU2F0dXJhdGlvbkFtdAoJZnJhbWVfZGlnIDkgLy8gdmFsaWRhdG9yU3RhdGU6ICh1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQpCglleHRyYWN0IDEwIDgKCWJ0b2kKCWZyYW1lX2RpZyAxMyAvLyBhbGdvU2F0dXJhdGlvbkFtdDogdWludDY0Cgk+CglieiAqaWYyM19lbmQKCgkvLyAqaWYyM19jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo1OTcKCS8vIGlzUG9vbFNhdHVyYXRlZCA9IHRydWUKCWludCAxCglmcmFtZV9idXJ5IDEyIC8vIGlzUG9vbFNhdHVyYXRlZDogYm9vbAoKKmlmMjNfZW5kOgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NjAzCgkvLyB0b2tlblJld2FyZEF2YWlsID0gMAoJaW50IDAKCWZyYW1lX2J1cnkgMTQgLy8gdG9rZW5SZXdhcmRBdmFpbDogdWludDY0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NjA0CgkvLyB0b2tlblJld2FyZFBhaWRPdXQgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAxNSAvLyB0b2tlblJld2FyZFBhaWRPdXQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjYwNQoJLy8gdmFsaWRhdG9yQ29tbWlzc2lvblBhaWRPdXQgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAxNiAvLyB2YWxpZGF0b3JDb21taXNzaW9uUGFpZE91dDogdWludDY0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NjA2CgkvLyBleGNlc3NUb0ZlZVNpbmsgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAxNyAvLyBleGNlc3NUb0ZlZVNpbms6IHVpbnQ2NAoKCS8vICppZjI0X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NjA3CgkvLyBpc1Rva2VuRWxpZ2libGUKCWZyYW1lX2RpZyA1IC8vIGlzVG9rZW5FbGlnaWJsZTogYm9vbAoJYnogKmlmMjRfZW5kCgoJLy8gKmlmMjRfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NjA4CgkvLyB0b2tlblJld2FyZEJhbCA9CgkvLyAgICAgICAgICAgICAgICAgcG9vbE9uZUFkZHJlc3MuYXNzZXRCYWxhbmNlKEFzc2V0SUQuZnJvbVVpbnQ2NCh2YWxpZGF0b3JDb25maWcucmV3YXJkVG9rZW5JZCkpIC0gcmV3YXJkVG9rZW5IZWxkQmFjawoJZnJhbWVfZGlnIDcgLy8gcG9vbE9uZUFkZHJlc3M6IGFkZHJlc3MKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvckNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCglleHRyYWN0IDE1MyA4CglidG9pCglhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKCXBvcAoJZnJhbWVfZGlnIDEwIC8vIHJld2FyZFRva2VuSGVsZEJhY2s6IHVpbnQ2NAoJLQoJZnJhbWVfYnVyeSAxOCAvLyB0b2tlblJld2FyZEJhbDogdWludDY0CgoJLy8gKmlmMjVfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo2MTMKCS8vIHRva2VuUmV3YXJkQmFsID49IHZhbGlkYXRvckNvbmZpZy5yZXdhcmRQZXJQYXlvdXQKCWZyYW1lX2RpZyAxOCAvLyB0b2tlblJld2FyZEJhbDogdWludDY0CglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JDb25maWc6ICh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KQoJZXh0cmFjdCAxNjEgOAoJYnRvaQoJPj0KCWJ6ICppZjI1X2VuZAoKCS8vICppZjI1X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjYxOQoJLy8gb3VyUG9vbFBjdE9mV2hvbGUgPSB0b2tlblBheW91dFJhdGlvLnBvb2xQY3RPZldob2xlW3RoaXMucG9vbElkLnZhbHVlIC0gMV0KCWZyYW1lX2RpZyA4IC8vIHRva2VuUGF5b3V0UmF0aW86IFBvb2xUb2tlblBheW91dFJhdGlvCglpbnQgMAoJYnl0ZSAweDcwNmY2ZjZjNDk2NCAvLyAicG9vbElkIgoJYXBwX2dsb2JhbF9nZXQKCWludCAxCgktCglpbnQgOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWZyYW1lX2J1cnkgMTkgLy8gb3VyUG9vbFBjdE9mV2hvbGU6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjYyMgoJLy8gdG9rZW5SZXdhcmRBdmFpbCA9IHdpZGVSYXRpbyhbdmFsaWRhdG9yQ29uZmlnLnJld2FyZFBlclBheW91dCwgb3VyUG9vbFBjdE9mV2hvbGVdLCBbMV8wMDBfMDAwXSkKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvckNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCglleHRyYWN0IDE2MSA4CglidG9pCglmcmFtZV9kaWcgMTkgLy8gb3VyUG9vbFBjdE9mV2hvbGU6IHVpbnQ2NAoJbXVsdwoJaW50IDAKCWludCAxXzAwMF8wMDAKCWRpdm1vZHcKCXBvcAoJcG9wCglzd2FwCgkhCgoJLy8gd2lkZVJhdGlvIGZhaWxlZAoJYXNzZXJ0CglmcmFtZV9idXJ5IDE0IC8vIHRva2VuUmV3YXJkQXZhaWw6IHVpbnQ2NAoKKmlmMjVfZW5kOgoKKmlmMjRfZW5kOgoJLy8gKmlmMjZfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo2MjUKCS8vIHRva2VuUmV3YXJkQXZhaWwgPT09IDAKCWZyYW1lX2RpZyAxNCAvLyB0b2tlblJld2FyZEF2YWlsOiB1aW50NjQKCWludCAwCgk9PQoJYnogKmlmMjZfZW5kCgoJLy8gKmlmMjZfY29uc2VxdWVudAoJLy8gKmlmMjdfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo2MzAKCS8vIGFsZ29SZXdhcmRBdmFpbCA8IDFfMDAwXzAwMAoJZnJhbWVfZGlnIDExIC8vIGFsZ29SZXdhcmRBdmFpbDogdWludDY0CglpbnQgMV8wMDBfMDAwCgk8CglieiAqaWYyN19lbmQKCgkvLyAqaWYyN19jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo2MzEKCS8vIGxvZygnIXRva2VuJiYhbm9hbGdvIHRvIHBheScpCglieXRlIDB4MjE3NDZmNmI2NTZlMjYyNjIxNmU2ZjYxNmM2NzZmMjA3NDZmMjA3MDYxNzkgLy8gIiF0b2tlbiYmIW5vYWxnbyB0byBwYXkiCglsb2cKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo2MzIKCS8vIHJldHVybgoJcmV0c3ViCgoqaWYyN19lbmQ6CgoqaWYyNl9lbmQ6CgkvLyAqaWYyOF9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjYzNgoJLy8gaXNQb29sU2F0dXJhdGVkCglmcmFtZV9kaWcgMTIgLy8gaXNQb29sU2F0dXJhdGVkOiBib29sCglieiAqaWYyOF9lbHNlaWYxX2NvbmRpdGlvbgoKCS8vICppZjI4X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjY0MgoJLy8gbm9ybWFsVmFsaWRhdG9yQ29tbWlzc2lvbiA9IHdpZGVSYXRpbygKCS8vICAgICAgICAgICAgICAgICBbYWxnb1Jld2FyZEF2YWlsLCB2YWxpZGF0b3JDb25maWcucGVyY2VudFRvVmFsaWRhdG9yIGFzIHVpbnQ2NF0sCgkvLyAgICAgICAgICAgICAgICAgWzFfMDAwXzAwMF0sCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgMTEgLy8gYWxnb1Jld2FyZEF2YWlsOiB1aW50NjQKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvckNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCglleHRyYWN0IDE3MyA0CglidG9pCgltdWx3CglpbnQgMAoJaW50IDFfMDAwXzAwMAoJZGl2bW9kdwoJcG9wCglwb3AKCXN3YXAKCSEKCgkvLyB3aWRlUmF0aW8gZmFpbGVkCglhc3NlcnQKCWZyYW1lX2J1cnkgMjAgLy8gbm9ybWFsVmFsaWRhdG9yQ29tbWlzc2lvbjogdWludDY0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NjQ3CgkvLyBkaW1pbmlzaGVkUmV3YXJkID0gd2lkZVJhdGlvKFthbGdvUmV3YXJkQXZhaWwsIGFsZ29TYXR1cmF0aW9uQW10XSwgW3ZhbGlkYXRvclN0YXRlLnRvdGFsQWxnb1N0YWtlZF0pCglmcmFtZV9kaWcgMTEgLy8gYWxnb1Jld2FyZEF2YWlsOiB1aW50NjQKCWZyYW1lX2RpZyAxMyAvLyBhbGdvU2F0dXJhdGlvbkFtdDogdWludDY0CgltdWx3CglpbnQgMAoJZnJhbWVfZGlnIDkgLy8gdmFsaWRhdG9yU3RhdGU6ICh1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQpCglleHRyYWN0IDEwIDgKCWJ0b2kKCWRpdm1vZHcKCXBvcAoJcG9wCglzd2FwCgkhCgoJLy8gd2lkZVJhdGlvIGZhaWxlZAoJYXNzZXJ0CglmcmFtZV9idXJ5IDIxIC8vIGRpbWluaXNoZWRSZXdhcmQ6IHVpbnQ2NAoKCS8vICppZjI5X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NjQ5CgkvLyBkaW1pbmlzaGVkUmV3YXJkID4gYWxnb1Jld2FyZEF2YWlsIC0gbm9ybWFsVmFsaWRhdG9yQ29tbWlzc2lvbgoJZnJhbWVfZGlnIDIxIC8vIGRpbWluaXNoZWRSZXdhcmQ6IHVpbnQ2NAoJZnJhbWVfZGlnIDExIC8vIGFsZ29SZXdhcmRBdmFpbDogdWludDY0CglmcmFtZV9kaWcgMjAgLy8gbm9ybWFsVmFsaWRhdG9yQ29tbWlzc2lvbjogdWludDY0CgktCgk+CglieiAqaWYyOV9lbmQKCgkvLyAqaWYyOV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo2NTAKCS8vIGRpbWluaXNoZWRSZXdhcmQgPSBhbGdvUmV3YXJkQXZhaWwgLSBub3JtYWxWYWxpZGF0b3JDb21taXNzaW9uCglmcmFtZV9kaWcgMTEgLy8gYWxnb1Jld2FyZEF2YWlsOiB1aW50NjQKCWZyYW1lX2RpZyAyMCAvLyBub3JtYWxWYWxpZGF0b3JDb21taXNzaW9uOiB1aW50NjQKCS0KCWZyYW1lX2J1cnkgMjEgLy8gZGltaW5pc2hlZFJld2FyZDogdWludDY0CgoqaWYyOV9lbmQ6CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo2NTMKCS8vIGV4Y2Vzc1RvRmVlU2luayA9IGFsZ29SZXdhcmRBdmFpbCAtIGRpbWluaXNoZWRSZXdhcmQKCWZyYW1lX2RpZyAxMSAvLyBhbGdvUmV3YXJkQXZhaWw6IHVpbnQ2NAoJZnJhbWVfZGlnIDIxIC8vIGRpbWluaXNoZWRSZXdhcmQ6IHVpbnQ2NAoJLQoJZnJhbWVfYnVyeSAxNyAvLyBleGNlc3NUb0ZlZVNpbms6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjY1NAoJLy8gc2VuZFBheW1lbnQoewoJLy8gICAgICAgICAgICAgICAgIGFtb3VudDogZXhjZXNzVG9GZWVTaW5rLAoJLy8gICAgICAgICAgICAgICAgIHJlY2VpdmVyOiBibG9ja3NbdGhpcy50eG4uZmlyc3RWYWxpZCAtIDFdLmZlZVNpbmssCgkvLyAgICAgICAgICAgICAgICAgbm90ZTogJ3Bvb2wgc2F0dXJhdGVkLCBleGNlc3MgdG8gZmVlIHNpbmsnLAoJLy8gICAgICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBwYXkKCWl0eG5fZmllbGQgVHlwZUVudW0KCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo2NTUKCS8vIGFtb3VudDogZXhjZXNzVG9GZWVTaW5rCglmcmFtZV9kaWcgMTcgLy8gZXhjZXNzVG9GZWVTaW5rOiB1aW50NjQKCWl0eG5fZmllbGQgQW1vdW50CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NjU2CgkvLyByZWNlaXZlcjogYmxvY2tzW3RoaXMudHhuLmZpcnN0VmFsaWQgLSAxXS5mZWVTaW5rCgl0eG4gRmlyc3RWYWxpZAoJaW50IDEKCS0KCWJsb2NrIEJsa0ZlZVNpbmsKCWl0eG5fZmllbGQgUmVjZWl2ZXIKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo2NTcKCS8vIG5vdGU6ICdwb29sIHNhdHVyYXRlZCwgZXhjZXNzIHRvIGZlZSBzaW5rJwoJYnl0ZSAweDcwNmY2ZjZjMjA3MzYxNzQ3NTcyNjE3NDY1NjQyYzIwNjU3ODYzNjU3MzczMjA3NDZmMjA2NjY1NjUyMDczNjk2ZTZiIC8vICJwb29sIHNhdHVyYXRlZCwgZXhjZXNzIHRvIGZlZSBzaW5rIgoJaXR4bl9maWVsZCBOb3RlCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjY2MAoJLy8gYWxnb1Jld2FyZEF2YWlsID0gZGltaW5pc2hlZFJld2FyZAoJZnJhbWVfZGlnIDIxIC8vIGRpbWluaXNoZWRSZXdhcmQ6IHVpbnQ2NAoJZnJhbWVfYnVyeSAxMSAvLyBhbGdvUmV3YXJkQXZhaWw6IHVpbnQ2NAoJYiAqaWYyOF9lbmQKCippZjI4X2Vsc2VpZjFfY29uZGl0aW9uOgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NjYxCgkvLyB2YWxpZGF0b3JDb25maWcucGVyY2VudFRvVmFsaWRhdG9yICE9PSAwCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JDb25maWc6ICh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KQoJZXh0cmFjdCAxNzMgNAoJYnRvaQoJaW50IDAKCSE9CglieiAqaWYyOF9lbmQKCgkvLyAqaWYyOF9lbHNlaWYxX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjY2NAoJLy8gdmFsaWRhdG9yQ29tbWlzc2lvblBhaWRPdXQgPSB3aWRlUmF0aW8oCgkvLyAgICAgICAgICAgICAgICAgW2FsZ29SZXdhcmRBdmFpbCwgdmFsaWRhdG9yQ29uZmlnLnBlcmNlbnRUb1ZhbGlkYXRvciBhcyB1aW50NjRdLAoJLy8gICAgICAgICAgICAgICAgIFsxXzAwMF8wMDBdLAoJLy8gICAgICAgICAgICAgKQoJZnJhbWVfZGlnIDExIC8vIGFsZ29SZXdhcmRBdmFpbDogdWludDY0CglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JDb25maWc6ICh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KQoJZXh0cmFjdCAxNzMgNAoJYnRvaQoJbXVsdwoJaW50IDAKCWludCAxXzAwMF8wMDAKCWRpdm1vZHcKCXBvcAoJcG9wCglzd2FwCgkhCgoJLy8gd2lkZVJhdGlvIGZhaWxlZAoJYXNzZXJ0CglmcmFtZV9idXJ5IDE2IC8vIHZhbGlkYXRvckNvbW1pc3Npb25QYWlkT3V0OiB1aW50NjQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo2NzAKCS8vIGFsZ29SZXdhcmRBdmFpbCAtPSB2YWxpZGF0b3JDb21taXNzaW9uUGFpZE91dAoJZnJhbWVfZGlnIDExIC8vIGFsZ29SZXdhcmRBdmFpbDogdWludDY0CglmcmFtZV9kaWcgMTYgLy8gdmFsaWRhdG9yQ29tbWlzc2lvblBhaWRPdXQ6IHVpbnQ2NAoJLQoJZnJhbWVfYnVyeSAxMSAvLyBhbGdvUmV3YXJkQXZhaWw6IHVpbnQ2NAoKCS8vICppZjMwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6Njc3CgkvLyB2YWxpZGF0b3JDb21taXNzaW9uUGFpZE91dCA+IDAKCWZyYW1lX2RpZyAxNiAvLyB2YWxpZGF0b3JDb21taXNzaW9uUGFpZE91dDogdWludDY0CglpbnQgMAoJPgoJYnogKmlmMzBfZW5kCgoJLy8gKmlmMzBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NjgwCgkvLyBtYW5hZ2VyVG9wT2ZmID0gMAoJaW50IDAKCWZyYW1lX2J1cnkgMjIgLy8gbWFuYWdlclRvcE9mZjogdWludDY0CgoJLy8gKmlmMzFfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo2ODIKCS8vIHZhbGlkYXRvckNvbmZpZy5tYW5hZ2VyICE9PSB2YWxpZGF0b3JDb25maWcudmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MgJiYKCS8vICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yQ29uZmlnLm1hbmFnZXIuYmFsYW5jZSAtIHZhbGlkYXRvckNvbmZpZy5tYW5hZ2VyLm1pbkJhbGFuY2UgPCAyXzEwMF8wMDAKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvckNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCglleHRyYWN0IDQwIDMyCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JDb25maWc6ICh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KQoJZXh0cmFjdCAxNzcgMzIKCSE9CglkdXAKCWJ6ICpza2lwX2FuZDMKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvckNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCglleHRyYWN0IDQwIDMyCglhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKCXBvcAoJZnJhbWVfZGlnIDAgLy8gdmFsaWRhdG9yQ29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgNDAgMzIKCWFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQoJcG9wCgktCglpbnQgMl8xMDBfMDAwCgk8CgkmJgoKKnNraXBfYW5kMzoKCWJ6ICppZjMxX2VuZAoKCS8vICppZjMxX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjY4NQoJLy8gbWFuYWdlclRvcE9mZiA9IHZhbGlkYXRvckNvbW1pc3Npb25QYWlkT3V0IDwgMl8xMDBfMDAwID8gdmFsaWRhdG9yQ29tbWlzc2lvblBhaWRPdXQgOiAyXzEwMF8wMDAKCWZyYW1lX2RpZyAxNiAvLyB2YWxpZGF0b3JDb21taXNzaW9uUGFpZE91dDogdWludDY0CglpbnQgMl8xMDBfMDAwCgk8CglieiAqdGVybmFyeTFfZmFsc2UKCWZyYW1lX2RpZyAxNiAvLyB2YWxpZGF0b3JDb21taXNzaW9uUGFpZE91dDogdWludDY0CgliICp0ZXJuYXJ5MV9lbmQKCip0ZXJuYXJ5MV9mYWxzZToKCWludCAyXzEwMF8wMDAKCip0ZXJuYXJ5MV9lbmQ6CglmcmFtZV9idXJ5IDIyIC8vIG1hbmFnZXJUb3BPZmY6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjY4NgoJLy8gc2VuZFBheW1lbnQoewoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50OiBtYW5hZ2VyVG9wT2ZmLAoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZXI6IHZhbGlkYXRvckNvbmZpZy5tYW5hZ2VyLAoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgbm90ZTogJ3ZhbGlkYXRvciByZXdhcmQgdG8gbWFuYWdlciBmb3IgZnVuZGluZyBlcG9jaCB1cGRhdGVzJywKCS8vICAgICAgICAgICAgICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBwYXkKCWl0eG5fZmllbGQgVHlwZUVudW0KCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo2ODcKCS8vIGFtb3VudDogbWFuYWdlclRvcE9mZgoJZnJhbWVfZGlnIDIyIC8vIG1hbmFnZXJUb3BPZmY6IHVpbnQ2NAoJaXR4bl9maWVsZCBBbW91bnQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo2ODgKCS8vIHJlY2VpdmVyOiB2YWxpZGF0b3JDb25maWcubWFuYWdlcgoJZnJhbWVfZGlnIDAgLy8gdmFsaWRhdG9yQ29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgNDAgMzIKCWl0eG5fZmllbGQgUmVjZWl2ZXIKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo2ODkKCS8vIG5vdGU6ICd2YWxpZGF0b3IgcmV3YXJkIHRvIG1hbmFnZXIgZm9yIGZ1bmRpbmcgZXBvY2ggdXBkYXRlcycKCWJ5dGUgMHg3NjYxNmM2OTY0NjE3NDZmNzIyMDcyNjU3NzYxNzI2NDIwNzQ2ZjIwNmQ2MTZlNjE2NzY1NzIyMDY2NmY3MjIwNjY3NTZlNjQ2OTZlNjcyMDY1NzA2ZjYzNjgyMDc1NzA2NDYxNzQ2NTczIC8vICJ2YWxpZGF0b3IgcmV3YXJkIHRvIG1hbmFnZXIgZm9yIGZ1bmRpbmcgZXBvY2ggdXBkYXRlcyIKCWl0eG5fZmllbGQgTm90ZQoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCippZjMxX2VuZDoKCS8vICppZjMyX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NjkyCgkvLyB2YWxpZGF0b3JDb21taXNzaW9uUGFpZE91dCAtIG1hbmFnZXJUb3BPZmYgPiAwCglmcmFtZV9kaWcgMTYgLy8gdmFsaWRhdG9yQ29tbWlzc2lvblBhaWRPdXQ6IHVpbnQ2NAoJZnJhbWVfZGlnIDIyIC8vIG1hbmFnZXJUb3BPZmY6IHVpbnQ2NAoJLQoJaW50IDAKCT4KCWJ6ICppZjMyX2VuZAoKCS8vICppZjMyX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjY5MwoJLy8gc2VuZFBheW1lbnQoewoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50OiB2YWxpZGF0b3JDb21taXNzaW9uUGFpZE91dCAtIG1hbmFnZXJUb3BPZmYsCgkvLyAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlcjogdmFsaWRhdG9yQ29uZmlnLnZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzLAoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgbm90ZTogJ3ZhbGlkYXRvciByZXdhcmQnLAoJLy8gICAgICAgICAgICAgICAgICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IHBheQoJaXR4bl9maWVsZCBUeXBlRW51bQoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjY5NAoJLy8gYW1vdW50OiB2YWxpZGF0b3JDb21taXNzaW9uUGFpZE91dCAtIG1hbmFnZXJUb3BPZmYKCWZyYW1lX2RpZyAxNiAvLyB2YWxpZGF0b3JDb21taXNzaW9uUGFpZE91dDogdWludDY0CglmcmFtZV9kaWcgMjIgLy8gbWFuYWdlclRvcE9mZjogdWludDY0CgktCglpdHhuX2ZpZWxkIEFtb3VudAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjY5NQoJLy8gcmVjZWl2ZXI6IHZhbGlkYXRvckNvbmZpZy52YWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcwoJZnJhbWVfZGlnIDAgLy8gdmFsaWRhdG9yQ29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMTc3IDMyCglpdHhuX2ZpZWxkIFJlY2VpdmVyCgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6Njk2CgkvLyBub3RlOiAndmFsaWRhdG9yIHJld2FyZCcKCWJ5dGUgMHg3NjYxNmM2OTY0NjE3NDZmNzIyMDcyNjU3NzYxNzI2NCAvLyAidmFsaWRhdG9yIHJld2FyZCIKCWl0eG5fZmllbGQgTm90ZQoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCippZjMyX2VuZDoKCippZjMwX2VuZDoKCippZjI4X2VuZDoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjcwOAoJLy8gaW5jcmVhc2VkU3Rha2UgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAyMyAvLyBpbmNyZWFzZWRTdGFrZTogdWludDY0CgoJLy8gKmlmMzNfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo3MzIKCS8vIGFsZ29SZXdhcmRBdmFpbCAhPT0gMCB8fCB0b2tlblJld2FyZEF2YWlsICE9PSAwCglmcmFtZV9kaWcgMTEgLy8gYWxnb1Jld2FyZEF2YWlsOiB1aW50NjQKCWludCAwCgkhPQoJZHVwCglibnogKnNraXBfb3IxCglmcmFtZV9kaWcgMTQgLy8gdG9rZW5SZXdhcmRBdmFpbDogdWludDY0CglpbnQgMAoJIT0KCXx8Cgoqc2tpcF9vcjE6CglieiAqaWYzM19lbmQKCgkvLyAqaWYzM19jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo3MzMKCS8vIHBhcnRpYWxTdGFrZXJzVG90YWxTdGFrZTogdWludDY0ID0gMAoJaW50IDAKCWZyYW1lX2J1cnkgMjQgLy8gcGFydGlhbFN0YWtlcnNUb3RhbFN0YWtlOiB1aW50NjQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo3MzQKCS8vIG9yaWdBbGdvUmV3YXJkID0gYWxnb1Jld2FyZEF2YWlsCglmcmFtZV9kaWcgMTEgLy8gYWxnb1Jld2FyZEF2YWlsOiB1aW50NjQKCWZyYW1lX2J1cnkgMjUgLy8gb3JpZ0FsZ29SZXdhcmQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjczNgoJLy8gb3JpZ1Rva2VuUmV3YXJkID0gdG9rZW5SZXdhcmRBdmFpbAoJZnJhbWVfZGlnIDE0IC8vIHRva2VuUmV3YXJkQXZhaWw6IHVpbnQ2NAoJZnJhbWVfYnVyeSAyNiAvLyBvcmlnVG9rZW5SZXdhcmQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjczNwoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnN0YWtlcnMudmFsdWUubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSAyNyAvLyBpOiB1aW50NjQKCipmb3JfNDoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjczNwoJLy8gaSA8IHRoaXMuc3Rha2Vycy52YWx1ZS5sZW5ndGgKCWZyYW1lX2RpZyAyNyAvLyBpOiB1aW50NjQKCWludCAyMDAKCTwKCWJ6ICpmb3JfNF9lbmQKCgkvLyAqaWYzNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjczOAoJLy8gZ2xvYmFscy5vcGNvZGVCdWRnZXQgPCA0MDAKCWdsb2JhbCBPcGNvZGVCdWRnZXQKCWludCA0MDAKCTwKCWJ6ICppZjM0X2VuZAoKCS8vICppZjM0X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjczOQoJLy8gaW5jcmVhc2VPcGNvZGVCdWRnZXQoKQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCWludCAwCglpdHhuX2ZpZWxkIEZlZQoJYnl0ZSBiNjQgQ29FQiAvLyAjcHJhZ21hIHZlcnNpb24gMTA7IGludCAxCglkdXAKCWl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCglpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCglpbnQgRGVsZXRlQXBwbGljYXRpb24KCWl0eG5fZmllbGQgT25Db21wbGV0aW9uCglpdHhuX3N1Ym1pdAoKKmlmMzRfZW5kOgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NzQxCgkvLyBjbXBTdGFrZXIgPSBjbG9uZSh0aGlzLnN0YWtlcnMudmFsdWVbaV0pCglmcmFtZV9kaWcgMjcgLy8gaTogdWludDY0CglpbnQgNjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDY0CglieXRlIDB4NzM3NDYxNmI2NTcyNzMgLy8gInN0YWtlcnMiCgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfYnVyeSAyOCAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCgkvLyAqaWYzNV9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjc0MgoJLy8gY21wU3Rha2VyLmFjY291bnQgIT09IGdsb2JhbHMuemVyb0FkZHJlc3MKCWZyYW1lX2RpZyAyOCAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMCAzMgoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYnogKmlmMzVfZW5kCgoJLy8gKmlmMzVfY29uc2VxdWVudAoJLy8gKmlmMzZfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo3NDMKCS8vIGNtcFN0YWtlci5lbnRyeVJvdW5kID49IHRoaXNFcG9jaEJlZ2luCglmcmFtZV9kaWcgMjggLy8gY21wU3Rha2VyOiAoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCglleHRyYWN0IDU2IDgKCWJ0b2kKCWZyYW1lX2RpZyAzIC8vIHRoaXNFcG9jaEJlZ2luOiB1aW50NjQKCT49CglieiAqaWYzNl9lbHNlCgoJLy8gKmlmMzZfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NzQ2CgkvLyBwYXJ0aWFsU3Rha2Vyc1RvdGFsU3Rha2UgKz0gY21wU3Rha2VyLmJhbGFuY2UKCWZyYW1lX2RpZyAyNCAvLyBwYXJ0aWFsU3Rha2Vyc1RvdGFsU3Rha2U6IHVpbnQ2NAoJZnJhbWVfZGlnIDI4IC8vIGNtcFN0YWtlcjogKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJZXh0cmFjdCAzMiA4CglidG9pCgkrCglmcmFtZV9idXJ5IDI0IC8vIHBhcnRpYWxTdGFrZXJzVG90YWxTdGFrZTogdWludDY0CgliICppZjM2X2VuZAoKKmlmMzZfZWxzZToKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjc1MAoJLy8gdGltZUluUG9vbCA9IHRoaXNFcG9jaEJlZ2luIC0gY21wU3Rha2VyLmVudHJ5Um91bmQKCWZyYW1lX2RpZyAzIC8vIHRoaXNFcG9jaEJlZ2luOiB1aW50NjQKCWZyYW1lX2RpZyAyOCAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgNTYgOAoJYnRvaQoJLQoJZnJhbWVfYnVyeSAyOSAvLyB0aW1lSW5Qb29sOiB1aW50NjQKCgkvLyAqaWYzN19jb25kaXRpb24KCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjc1NAoJLy8gdGltZUluUG9vbCA8IGVwb2NoUm91bmRMZW5ndGgKCWZyYW1lX2RpZyAyOSAvLyB0aW1lSW5Qb29sOiB1aW50NjQKCWZyYW1lX2RpZyAxIC8vIGVwb2NoUm91bmRMZW5ndGg6IHVpbnQ2NAoJPAoJYnogKmlmMzdfZW5kCgoJLy8gKmlmMzdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NzU1CgkvLyBwYXJ0aWFsU3Rha2Vyc1RvdGFsU3Rha2UgKz0gY21wU3Rha2VyLmJhbGFuY2UKCWZyYW1lX2RpZyAyNCAvLyBwYXJ0aWFsU3Rha2Vyc1RvdGFsU3Rha2U6IHVpbnQ2NAoJZnJhbWVfZGlnIDI4IC8vIGNtcFN0YWtlcjogKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJZXh0cmFjdCAzMiA4CglidG9pCgkrCglmcmFtZV9idXJ5IDI0IC8vIHBhcnRpYWxTdGFrZXJzVG90YWxTdGFrZTogdWludDY0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NzU2CgkvLyB0aW1lUGVyY2VudGFnZSA9ICh0aW1lSW5Qb29sICogMTAwMCkgLyBlcG9jaFJvdW5kTGVuZ3RoCglmcmFtZV9kaWcgMjkgLy8gdGltZUluUG9vbDogdWludDY0CglpbnQgMTAwMAoJKgoJZnJhbWVfZGlnIDEgLy8gZXBvY2hSb3VuZExlbmd0aDogdWludDY0CgkvCglmcmFtZV9idXJ5IDMwIC8vIHRpbWVQZXJjZW50YWdlOiB1aW50NjQKCgkvLyAqaWYzOF9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjc1OAoJLy8gdG9rZW5SZXdhcmRBdmFpbCA+IDAKCWZyYW1lX2RpZyAxNCAvLyB0b2tlblJld2FyZEF2YWlsOiB1aW50NjQKCWludCAwCgk+CglieiAqaWYzOF9lbmQKCgkvLyAqaWYzOF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo3NjAKCS8vIHN0YWtlclRva2VuUmV3YXJkID0gd2lkZVJhdGlvKAoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NtcFN0YWtlci5iYWxhbmNlLCBvcmlnVG9rZW5SZXdhcmQsIHRpbWVQZXJjZW50YWdlXSwKCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSwgMTAwMF0sCgkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKCWZyYW1lX2RpZyAyOCAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMzIgOAoJYnRvaQoJZnJhbWVfZGlnIDI2IC8vIG9yaWdUb2tlblJld2FyZDogdWludDY0CgltdWx3CglmcmFtZV9kaWcgMzAgLy8gdGltZVBlcmNlbnRhZ2U6IHVpbnQ2NAoJdW5jb3ZlciAyCglkaWcgMQoJKgoJY292ZXIgMgoJbXVsdwoJY292ZXIgMgoJKwoJc3dhcAoJYnl0ZSAweDczNzQ2MTZiNjU2NCAvLyAic3Rha2VkIgoJYXBwX2dsb2JhbF9nZXQKCWludCAxMDAwCgltdWx3CglkaXZtb2R3Cglwb3AKCXBvcAoJc3dhcAoJIQoKCS8vIHdpZGVSYXRpbyBmYWlsZWQKCWFzc2VydAoJZnJhbWVfYnVyeSAzMSAvLyBzdGFrZXJUb2tlblJld2FyZDogdWludDY0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NzY3CgkvLyB0b2tlblJld2FyZEF2YWlsIC09IHN0YWtlclRva2VuUmV3YXJkCglmcmFtZV9kaWcgMTQgLy8gdG9rZW5SZXdhcmRBdmFpbDogdWludDY0CglmcmFtZV9kaWcgMzEgLy8gc3Rha2VyVG9rZW5SZXdhcmQ6IHVpbnQ2NAoJLQoJZnJhbWVfYnVyeSAxNCAvLyB0b2tlblJld2FyZEF2YWlsOiB1aW50NjQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo3NjgKCS8vIGNtcFN0YWtlci5yZXdhcmRUb2tlbkJhbGFuY2UgKz0gc3Rha2VyVG9rZW5SZXdhcmQKCWZyYW1lX2RpZyAyOCAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWludCA0OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgMjggLy8gY21wU3Rha2VyOiAoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCglleHRyYWN0IDQ4IDgKCWJ0b2kKCWZyYW1lX2RpZyAzMSAvLyBzdGFrZXJUb2tlblJld2FyZDogdWludDY0CgkrCglpdG9iCglyZXBsYWNlMwoJZnJhbWVfYnVyeSAyOCAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo3NjkKCS8vIHRva2VuUmV3YXJkUGFpZE91dCArPSBzdGFrZXJUb2tlblJld2FyZAoJZnJhbWVfZGlnIDE1IC8vIHRva2VuUmV3YXJkUGFpZE91dDogdWludDY0CglmcmFtZV9kaWcgMzEgLy8gc3Rha2VyVG9rZW5SZXdhcmQ6IHVpbnQ2NAoJKwoJZnJhbWVfYnVyeSAxNSAvLyB0b2tlblJld2FyZFBhaWRPdXQ6IHVpbnQ2NAoKKmlmMzhfZW5kOgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NzcyCgkvLyBzdGFrZXJSZXdhcmQgPSB3aWRlUmF0aW8oCgkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbXBTdGFrZXIuYmFsYW5jZSwgb3JpZ0FsZ29SZXdhcmQsIHRpbWVQZXJjZW50YWdlXSwKCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlLCAxMDAwXSwKCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCglmcmFtZV9kaWcgMjggLy8gY21wU3Rha2VyOiAoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCglleHRyYWN0IDMyIDgKCWJ0b2kKCWZyYW1lX2RpZyAyNSAvLyBvcmlnQWxnb1Jld2FyZDogdWludDY0CgltdWx3CglmcmFtZV9kaWcgMzAgLy8gdGltZVBlcmNlbnRhZ2U6IHVpbnQ2NAoJdW5jb3ZlciAyCglkaWcgMQoJKgoJY292ZXIgMgoJbXVsdwoJY292ZXIgMgoJKwoJc3dhcAoJYnl0ZSAweDczNzQ2MTZiNjU2NCAvLyAic3Rha2VkIgoJYXBwX2dsb2JhbF9nZXQKCWludCAxMDAwCgltdWx3CglkaXZtb2R3Cglwb3AKCXBvcAoJc3dhcAoJIQoKCS8vIHdpZGVSYXRpbyBmYWlsZWQKCWFzc2VydAoJZnJhbWVfYnVyeSAzMiAvLyBzdGFrZXJSZXdhcmQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjc3OAoJLy8gYWxnb1Jld2FyZEF2YWlsIC09IHN0YWtlclJld2FyZAoJZnJhbWVfZGlnIDExIC8vIGFsZ29SZXdhcmRBdmFpbDogdWludDY0CglmcmFtZV9kaWcgMzIgLy8gc3Rha2VyUmV3YXJkOiB1aW50NjQKCS0KCWZyYW1lX2J1cnkgMTEgLy8gYWxnb1Jld2FyZEF2YWlsOiB1aW50NjQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo3ODEKCS8vIGNtcFN0YWtlci5iYWxhbmNlICs9IHN0YWtlclJld2FyZAoJZnJhbWVfZGlnIDI4IC8vIGNtcFN0YWtlcjogKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJaW50IDMyIC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAyOCAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMzIgOAoJYnRvaQoJZnJhbWVfZGlnIDMyIC8vIHN0YWtlclJld2FyZDogdWludDY0CgkrCglpdG9iCglyZXBsYWNlMwoJZnJhbWVfYnVyeSAyOCAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo3ODIKCS8vIGNtcFN0YWtlci50b3RhbFJld2FyZGVkICs9IHN0YWtlclJld2FyZAoJZnJhbWVfZGlnIDI4IC8vIGNtcFN0YWtlcjogKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJaW50IDQwIC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAyOCAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgNDAgOAoJYnRvaQoJZnJhbWVfZGlnIDMyIC8vIHN0YWtlclJld2FyZDogdWludDY0CgkrCglpdG9iCglyZXBsYWNlMwoJZnJhbWVfYnVyeSAyOCAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo3ODMKCS8vIGluY3JlYXNlZFN0YWtlICs9IHN0YWtlclJld2FyZAoJZnJhbWVfZGlnIDIzIC8vIGluY3JlYXNlZFN0YWtlOiB1aW50NjQKCWZyYW1lX2RpZyAzMiAvLyBzdGFrZXJSZXdhcmQ6IHVpbnQ2NAoJKwoJZnJhbWVfYnVyeSAyMyAvLyBpbmNyZWFzZWRTdGFrZTogdWludDY0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6Nzg1CgkvLyB0aGlzLnN0YWtlcnMudmFsdWVbaV0gPSBjbXBTdGFrZXIKCWZyYW1lX2RpZyAyNyAvLyBpOiB1aW50NjQKCWludCA2NAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglmcmFtZV9kaWcgMjggLy8gY21wU3Rha2VyOiAoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCglieXRlIDB4NzM3NDYxNmI2NTcyNzMgLy8gInN0YWtlcnMiCgljb3ZlciAyCglib3hfcmVwbGFjZQoKKmlmMzdfZW5kOgoKKmlmMzZfZW5kOgoKKmlmMzVfZW5kOgoKKmZvcl80X2NvbnRpbnVlOgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6NzM3CgkvLyBpICs9IDEKCWZyYW1lX2RpZyAyNyAvLyBpOiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDI3IC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzQKCipmb3JfNF9lbmQ6CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo3OTMKCS8vIG5ld1Bvb2xUb3RhbFN0YWtlID0gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgLSBwYXJ0aWFsU3Rha2Vyc1RvdGFsU3Rha2UKCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCWFwcF9nbG9iYWxfZ2V0CglmcmFtZV9kaWcgMjQgLy8gcGFydGlhbFN0YWtlcnNUb3RhbFN0YWtlOiB1aW50NjQKCS0KCWZyYW1lX2J1cnkgMzMgLy8gbmV3UG9vbFRvdGFsU3Rha2U6IHVpbnQ2NAoKCS8vICppZjM5X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6Nzk3CgkvLyBuZXdQb29sVG90YWxTdGFrZSA+IDAKCWZyYW1lX2RpZyAzMyAvLyBuZXdQb29sVG90YWxTdGFrZTogdWludDY0CglpbnQgMAoJPgoJYnogKmlmMzlfZW5kCgoJLy8gKmlmMzlfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6Nzk5CgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3Rha2Vycy52YWx1ZS5sZW5ndGg7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDM0IC8vIGk6IHVpbnQ2NAoKKmZvcl81OgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6Nzk5CgkvLyBpIDwgdGhpcy5zdGFrZXJzLnZhbHVlLmxlbmd0aAoJZnJhbWVfZGlnIDM0IC8vIGk6IHVpbnQ2NAoJaW50IDIwMAoJPAoJYnogKmZvcl81X2VuZAoKCS8vICppZjQwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6ODAwCgkvLyBnbG9iYWxzLm9wY29kZUJ1ZGdldCA8IDIwMAoJZ2xvYmFsIE9wY29kZUJ1ZGdldAoJaW50IDIwMAoJPAoJYnogKmlmNDBfZW5kCgoJLy8gKmlmNDBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6ODAxCgkvLyBpbmNyZWFzZU9wY29kZUJ1ZGdldCgpCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJaW50IDAKCWl0eG5fZmllbGQgRmVlCglieXRlIGI2NCBDb0VCIC8vICNwcmFnbWEgdmVyc2lvbiAxMDsgaW50IDEKCWR1cAoJaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCWludCBEZWxldGVBcHBsaWNhdGlvbgoJaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KCWl0eG5fc3VibWl0CgoqaWY0MF9lbmQ6CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo4MDMKCS8vIGNtcFN0YWtlciA9IGNsb25lKHRoaXMuc3Rha2Vycy52YWx1ZVtpXSkKCWZyYW1lX2RpZyAzNCAvLyBpOiB1aW50NjQKCWludCA2NAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgNjQKCWJ5dGUgMHg3Mzc0NjE2YjY1NzI3MyAvLyAic3Rha2VycyIKCWNvdmVyIDIKCWJveF9leHRyYWN0CglmcmFtZV9idXJ5IDM1IC8vIGNtcFN0YWtlcjogKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoKCS8vICppZjQxX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6ODA0CgkvLyBjbXBTdGFrZXIuYWNjb3VudCAhPT0gZ2xvYmFscy56ZXJvQWRkcmVzcyAmJiBjbXBTdGFrZXIuZW50cnlSb3VuZCA8IHRoaXNFcG9jaEJlZ2luCglmcmFtZV9kaWcgMzUgLy8gY21wU3Rha2VyOiAoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCglleHRyYWN0IDAgMzIKCWdsb2JhbCBaZXJvQWRkcmVzcwoJIT0KCWR1cAoJYnogKnNraXBfYW5kNAoJZnJhbWVfZGlnIDM1IC8vIGNtcFN0YWtlcjogKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJZXh0cmFjdCA1NiA4CglidG9pCglmcmFtZV9kaWcgMyAvLyB0aGlzRXBvY2hCZWdpbjogdWludDY0Cgk8CgkmJgoKKnNraXBfYW5kNDoKCWJ6ICppZjQxX2VuZAoKCS8vICppZjQxX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjgwNQoJLy8gdGltZUluUG9vbCA9IHRoaXNFcG9jaEJlZ2luIC0gY21wU3Rha2VyLmVudHJ5Um91bmQKCWZyYW1lX2RpZyAzIC8vIHRoaXNFcG9jaEJlZ2luOiB1aW50NjQKCWZyYW1lX2RpZyAzNSAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgNTYgOAoJYnRvaQoJLQoJZnJhbWVfYnVyeSAzNiAvLyB0aW1lSW5Qb29sOiB1aW50NjQKCgkvLyAqaWY0Ml9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjgwNwoJLy8gdGltZUluUG9vbCA+PSBlcG9jaFJvdW5kTGVuZ3RoCglmcmFtZV9kaWcgMzYgLy8gdGltZUluUG9vbDogdWludDY0CglmcmFtZV9kaWcgMSAvLyBlcG9jaFJvdW5kTGVuZ3RoOiB1aW50NjQKCT49CglieiAqaWY0Ml9lbmQKCgkvLyAqaWY0Ml9jb25zZXF1ZW50CgkvLyAqaWY0M19jb25kaXRpb24KCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjgxMgoJLy8gdG9rZW5SZXdhcmRBdmFpbCA+IDAKCWZyYW1lX2RpZyAxNCAvLyB0b2tlblJld2FyZEF2YWlsOiB1aW50NjQKCWludCAwCgk+CglieiAqaWY0M19lbmQKCgkvLyAqaWY0M19jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo4MTMKCS8vIHN0YWtlclRva2VuUmV3YXJkID0gd2lkZVJhdGlvKAoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NtcFN0YWtlci5iYWxhbmNlLCB0b2tlblJld2FyZEF2YWlsXSwKCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZXdQb29sVG90YWxTdGFrZV0sCgkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKCWZyYW1lX2RpZyAzNSAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMzIgOAoJYnRvaQoJZnJhbWVfZGlnIDE0IC8vIHRva2VuUmV3YXJkQXZhaWw6IHVpbnQ2NAoJbXVsdwoJaW50IDAKCWZyYW1lX2RpZyAzMyAvLyBuZXdQb29sVG90YWxTdGFrZTogdWludDY0CglkaXZtb2R3Cglwb3AKCXBvcAoJc3dhcAoJIQoKCS8vIHdpZGVSYXRpbyBmYWlsZWQKCWFzc2VydAoJZnJhbWVfYnVyeSAzNyAvLyBzdGFrZXJUb2tlblJld2FyZDogdWludDY0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6ODE4CgkvLyBjbXBTdGFrZXIucmV3YXJkVG9rZW5CYWxhbmNlICs9IHN0YWtlclRva2VuUmV3YXJkCglmcmFtZV9kaWcgMzUgLy8gY21wU3Rha2VyOiAoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCglpbnQgNDggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIDM1IC8vIGNtcFN0YWtlcjogKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJZXh0cmFjdCA0OCA4CglidG9pCglmcmFtZV9kaWcgMzcgLy8gc3Rha2VyVG9rZW5SZXdhcmQ6IHVpbnQ2NAoJKwoJaXRvYgoJcmVwbGFjZTMKCWZyYW1lX2J1cnkgMzUgLy8gY21wU3Rha2VyOiAoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6ODE5CgkvLyB0b2tlblJld2FyZFBhaWRPdXQgKz0gc3Rha2VyVG9rZW5SZXdhcmQKCWZyYW1lX2RpZyAxNSAvLyB0b2tlblJld2FyZFBhaWRPdXQ6IHVpbnQ2NAoJZnJhbWVfZGlnIDM3IC8vIHN0YWtlclRva2VuUmV3YXJkOiB1aW50NjQKCSsKCWZyYW1lX2J1cnkgMTUgLy8gdG9rZW5SZXdhcmRQYWlkT3V0OiB1aW50NjQKCippZjQzX2VuZDoKCS8vICppZjQ0X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6ODIxCgkvLyBhbGdvUmV3YXJkQXZhaWwgPiAwCglmcmFtZV9kaWcgMTEgLy8gYWxnb1Jld2FyZEF2YWlsOiB1aW50NjQKCWludCAwCgk+CglieiAqaWY0NF9lbmQKCgkvLyAqaWY0NF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo4MjIKCS8vIHN0YWtlclJld2FyZCA9IHdpZGVSYXRpbygKCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbXBTdGFrZXIuYmFsYW5jZSwgYWxnb1Jld2FyZEF2YWlsXSwKCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZXdQb29sVG90YWxTdGFrZV0sCgkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKCWZyYW1lX2RpZyAzNSAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMzIgOAoJYnRvaQoJZnJhbWVfZGlnIDExIC8vIGFsZ29SZXdhcmRBdmFpbDogdWludDY0CgltdWx3CglpbnQgMAoJZnJhbWVfZGlnIDMzIC8vIG5ld1Bvb2xUb3RhbFN0YWtlOiB1aW50NjQKCWRpdm1vZHcKCXBvcAoJcG9wCglzd2FwCgkhCgoJLy8gd2lkZVJhdGlvIGZhaWxlZAoJYXNzZXJ0CglmcmFtZV9idXJ5IDM4IC8vIHN0YWtlclJld2FyZDogdWludDY0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6ODI4CgkvLyBjbXBTdGFrZXIuYmFsYW5jZSArPSBzdGFrZXJSZXdhcmQKCWZyYW1lX2RpZyAzNSAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWludCAzMiAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgMzUgLy8gY21wU3Rha2VyOiAoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCglleHRyYWN0IDMyIDgKCWJ0b2kKCWZyYW1lX2RpZyAzOCAvLyBzdGFrZXJSZXdhcmQ6IHVpbnQ2NAoJKwoJaXRvYgoJcmVwbGFjZTMKCWZyYW1lX2J1cnkgMzUgLy8gY21wU3Rha2VyOiAoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6ODI5CgkvLyBjbXBTdGFrZXIudG90YWxSZXdhcmRlZCArPSBzdGFrZXJSZXdhcmQKCWZyYW1lX2RpZyAzNSAvLyBjbXBTdGFrZXI6IChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWludCA0MCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgMzUgLy8gY21wU3Rha2VyOiAoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCglleHRyYWN0IDQwIDgKCWJ0b2kKCWZyYW1lX2RpZyAzOCAvLyBzdGFrZXJSZXdhcmQ6IHVpbnQ2NAoJKwoJaXRvYgoJcmVwbGFjZTMKCWZyYW1lX2J1cnkgMzUgLy8gY21wU3Rha2VyOiAoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6ODMwCgkvLyBpbmNyZWFzZWRTdGFrZSArPSBzdGFrZXJSZXdhcmQKCWZyYW1lX2RpZyAyMyAvLyBpbmNyZWFzZWRTdGFrZTogdWludDY0CglmcmFtZV9kaWcgMzggLy8gc3Rha2VyUmV3YXJkOiB1aW50NjQKCSsKCWZyYW1lX2J1cnkgMjMgLy8gaW5jcmVhc2VkU3Rha2U6IHVpbnQ2NAoKKmlmNDRfZW5kOgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6ODM0CgkvLyB0aGlzLnN0YWtlcnMudmFsdWVbaV0gPSBjbXBTdGFrZXIKCWZyYW1lX2RpZyAzNCAvLyBpOiB1aW50NjQKCWludCA2NAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglmcmFtZV9kaWcgMzUgLy8gY21wU3Rha2VyOiAoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCglieXRlIDB4NzM3NDYxNmI2NTcyNzMgLy8gInN0YWtlcnMiCgljb3ZlciAyCglib3hfcmVwbGFjZQoKKmlmNDJfZW5kOgoKKmlmNDFfZW5kOgoKKmZvcl81X2NvbnRpbnVlOgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6Nzk5CgkvLyBpICs9IDEKCWZyYW1lX2RpZyAzNCAvLyBpOiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDM0IC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzUKCipmb3JfNV9lbmQ6CgoqaWYzOV9lbmQ6CgoqaWYzM19lbmQ6CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo4NDQKCS8vIHJvdW5kc0xlZnRJbkJpbiA9IHRoaXMuYmluUm91bmRTdGFydC52YWx1ZSArIHRoaXMucm91bmRzUGVyRGF5LnZhbHVlIC0gZ2xvYmFscy5yb3VuZAoJYnl0ZSAweDYyNjk2ZTUyNmY3NTZlNjQ1Mzc0NjE3Mjc0IC8vICJiaW5Sb3VuZFN0YXJ0IgoJYXBwX2dsb2JhbF9nZXQKCWJ5dGUgMHg3MjZmNzU2ZTY0NzM1MDY1NzI0NDYxNzkgLy8gInJvdW5kc1BlckRheSIKCWFwcF9nbG9iYWxfZ2V0CgkrCglnbG9iYWwgUm91bmQKCS0KCWZyYW1lX2J1cnkgMzkgLy8gcm91bmRzTGVmdEluQmluOiB1aW50NjQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo4NDUKCS8vIHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlICs9IGluY3JlYXNlZFN0YWtlCglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglhcHBfZ2xvYmFsX2dldAoJZnJhbWVfZGlnIDIzIC8vIGluY3JlYXNlZFN0YWtlOiB1aW50NjQKCSsKCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCXN3YXAKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6ODQ2CgkvLyB0aGlzLnN0YWtlQWNjdW11bGF0b3IudmFsdWUgPQoJLy8gICAgICAgICAgICAgdGhpcy5zdGFrZUFjY3VtdWxhdG9yLnZhbHVlICsgKGluY3JlYXNlZFN0YWtlIGFzIHVpbnQxMjgpICogKHJvdW5kc0xlZnRJbkJpbiBhcyB1aW50MTI4KQoJYnl0ZSAweDczNzQ2MTZiNjU0MTYzNjM3NTZkNzU2YzYxNzQ2ZjcyIC8vICJzdGFrZUFjY3VtdWxhdG9yIgoJZHVwCglhcHBfZ2xvYmFsX2dldAoJZnJhbWVfZGlnIDIzIC8vIGluY3JlYXNlZFN0YWtlOiB1aW50NjQKCWl0b2IKCWZyYW1lX2RpZyAzOSAvLyByb3VuZHNMZWZ0SW5CaW46IHVpbnQ2NAoJaXRvYgoJYioKCWIrCglkdXAKCWJpdGxlbgoJaW50IDEyOAoJPD0KCgkvLyB0aGlzLnN0YWtlQWNjdW11bGF0b3IudmFsdWUgKyAoaW5jcmVhc2VkU3Rha2UgYXMgdWludDEyOCkgKiAocm91bmRzTGVmdEluQmluIGFzIHVpbnQxMjgpIG92ZXJmbG93ZWQgMTI4IGJpdHMKCWFzc2VydAoJYnl0ZSAweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGCgliJgoJZHVwCglsZW4KCWR1cAoJaW50IDE2CgktCglzd2FwCglzdWJzdHJpbmczCglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjg0OAoJLy8gdGhpcy5yZXdhcmRBY2N1bXVsYXRvci52YWx1ZSA9IHRoaXMucmV3YXJkQWNjdW11bGF0b3IudmFsdWUgKyBpbmNyZWFzZWRTdGFrZQoJYnl0ZSAweDcyNjU3NzYxNzI2NDQxNjM2Mzc1NmQ3NTZjNjE3NDZmNzIgLy8gInJld2FyZEFjY3VtdWxhdG9yIgoJZHVwCglhcHBfZ2xvYmFsX2dldAoJZnJhbWVfZGlnIDIzIC8vIGluY3JlYXNlZFN0YWtlOiB1aW50NjQKCSsKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6ODU0CgkvLyBzZW5kTWV0aG9kQ2FsbDx0eXBlb2YgVmFsaWRhdG9yUmVnaXN0cnkucHJvdG90eXBlLnN0YWtlVXBkYXRlZFZpYVJld2FyZHM+KHsKCS8vICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAoJLy8gICAgICAgICAgICAgbWV0aG9kQXJnczogWwoJLy8gICAgICAgICAgICAgICAgIHsgaWQ6IHRoaXMudmFsaWRhdG9ySWQudmFsdWUsIHBvb2xJZDogdGhpcy5wb29sSWQudmFsdWUsIHBvb2xBcHBJZDogdGhpcy5hcHAuaWQgfSwKCS8vICAgICAgICAgICAgICAgICBpbmNyZWFzZWRTdGFrZSwKCS8vICAgICAgICAgICAgICAgICB0b2tlblJld2FyZFBhaWRPdXQsCgkvLyAgICAgICAgICAgICAgICAgdmFsaWRhdG9yQ29tbWlzc2lvblBhaWRPdXQsCgkvLyAgICAgICAgICAgICAgICAgZXhjZXNzVG9GZWVTaW5rLAoJLy8gICAgICAgICAgICAgXSwKCS8vICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgltZXRob2QgInN0YWtlVXBkYXRlZFZpYVJld2FyZHMoKHVpbnQ2NCx1aW50NjQsdWludDY0KSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6ODU1CgkvLyBhcHBsaWNhdGlvbklEOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZQoJYnl0ZSAweDYzNzI2NTYxNzQ2ZjcyNDE3MDcwIC8vICJjcmVhdG9yQXBwIgoJYXBwX2dsb2JhbF9nZXQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjg1NgoJLy8gbWV0aG9kQXJnczogWwoJLy8gICAgICAgICAgICAgICAgIHsgaWQ6IHRoaXMudmFsaWRhdG9ySWQudmFsdWUsIHBvb2xJZDogdGhpcy5wb29sSWQudmFsdWUsIHBvb2xBcHBJZDogdGhpcy5hcHAuaWQgfSwKCS8vICAgICAgICAgICAgICAgICBpbmNyZWFzZWRTdGFrZSwKCS8vICAgICAgICAgICAgICAgICB0b2tlblJld2FyZFBhaWRPdXQsCgkvLyAgICAgICAgICAgICAgICAgdmFsaWRhdG9yQ29tbWlzc2lvblBhaWRPdXQsCgkvLyAgICAgICAgICAgICAgICAgZXhjZXNzVG9GZWVTaW5rLAoJLy8gICAgICAgICAgICAgXQoJYnl0ZSAweDc2NjE2YzY5NjQ2MTc0NmY3MjQ5NjQgLy8gInZhbGlkYXRvcklkIgoJYXBwX2dsb2JhbF9nZXQKCWl0b2IKCWJ5dGUgMHg3MDZmNmY2YzQ5NjQgLy8gInBvb2xJZCIKCWFwcF9nbG9iYWxfZ2V0CglpdG9iCgljb25jYXQKCXR4bmEgQXBwbGljYXRpb25zIDAKCWl0b2IKCWNvbmNhdAoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWZyYW1lX2RpZyAyMyAvLyBpbmNyZWFzZWRTdGFrZTogdWludDY0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoJZnJhbWVfZGlnIDE1IC8vIHRva2VuUmV3YXJkUGFpZE91dDogdWludDY0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoJZnJhbWVfZGlnIDE2IC8vIHZhbGlkYXRvckNvbW1pc3Npb25QYWlkT3V0OiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMTcgLy8gZXhjZXNzVG9GZWVTaW5rOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoJcmV0c3ViCgovLyBnb09ubGluZShwYXksYnl0ZVtdLGJ5dGVbXSxieXRlW10sdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZAoqYWJpX3JvdXRlX2dvT25saW5lOgoJLy8gdm90ZUtleURpbHV0aW9uOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDYKCWJ0b2kKCgkvLyB2b3RlTGFzdDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyA1CglidG9pCgoJLy8gdm90ZUZpcnN0OiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDQKCWJ0b2kKCgkvLyBzdGF0ZVByb29mUEs6IGJ5dGVbXQoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwoJZXh0cmFjdCAyIDAKCgkvLyBzZWxlY3Rpb25QSzogYnl0ZVtdCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglleHRyYWN0IDIgMAoKCS8vIHZvdGVQSzogYnl0ZVtdCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglleHRyYWN0IDIgMAoKCS8vIGZlZVBheW1lbnQ6IHBheQoJdHhuIEdyb3VwSW5kZXgKCWludCAxCgktCglkdXAKCWd0eG5zIFR5cGVFbnVtCglpbnQgcGF5Cgk9PQoKCS8vIGFyZ3VtZW50IDYgKGZlZVBheW1lbnQpIGZvciBnb09ubGluZSBtdXN0IGJlIGEgcGF5IHRyYW5zYWN0aW9uCglhc3NlcnQKCgkvLyBleGVjdXRlIGdvT25saW5lKHBheSxieXRlW10sYnl0ZVtdLGJ5dGVbXSx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkCgljYWxsc3ViIGdvT25saW5lCglpbnQgMQoJcmV0dXJuCgovLyBnb09ubGluZShmZWVQYXltZW50OiBQYXlUeG4sIHZvdGVQSzogYnl0ZXMsIHNlbGVjdGlvblBLOiBieXRlcywgc3RhdGVQcm9vZlBLOiBieXRlcywgdm90ZUZpcnN0OiB1aW50NjQsIHZvdGVMYXN0OiB1aW50NjQsIHZvdGVLZXlEaWx1dGlvbjogdWludDY0KTogdm9pZAovLwovLyBSZWdpc3RlcnMgYSBzdGFraW5nIHBvb2wga2V5IG9ubGluZSBhZ2FpbnN0IGEgcGFydGljaXBhdGlvbiBrZXkuCi8vIFsgT05MWSBPV05FUiBPUiBNQU5BR0VSIENBTiBDQUxMIF0KLy8KLy8gQHBhcmFtIHtQYXlUeG59IGZlZVBheW1lbnQgLSBwYXltZW50IHRvIGNvdmVyIGV4dHJhIGZlZSBvZiBnb2luZyBvbmxpbmUgaWYgb2ZmbGluZSAtIG9yIDAgaWYgbm90IHJlbmV3YWwKLy8gQHBhcmFtIHtieXRlc30gdm90ZVBLIC0gVGhlIHZvdGUgcHVibGljIGtleS4KLy8gQHBhcmFtIHtieXRlc30gc2VsZWN0aW9uUEsgLSBUaGUgc2VsZWN0aW9uIHB1YmxpYyBrZXkuCi8vIEBwYXJhbSB7Ynl0ZXN9IHN0YXRlUHJvb2ZQSyAtIFRoZSBzdGF0ZSBwcm9vZiBwdWJsaWMga2V5LgovLyBAcGFyYW0ge3VpbnQ2NH0gdm90ZUZpcnN0IC0gVGhlIGZpcnN0IHZvdGUgaW5kZXguCi8vIEBwYXJhbSB7dWludDY0fSB2b3RlTGFzdCAtIFRoZSBsYXN0IHZvdGUgaW5kZXguCi8vIEBwYXJhbSB7dWludDY0fSB2b3RlS2V5RGlsdXRpb24gLSBUaGUgdm90ZSBrZXkgZGlsdXRpb24gdmFsdWUuCi8vIEB0aHJvd3Mge0Vycm9yfSBXaWxsIHRocm93IGFuIGVycm9yIGlmIHRoZSBjYWxsZXIgaXMgbm90IHRoZSBvd25lciBvciBhIG1hbmFnZXIuCmdvT25saW5lOgoJcHJvdG8gNyAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo4ODgKCS8vIGFzc2VydCh0aGlzLmlzT3duZXJPck1hbmFnZXJDYWxsZXIoKSwgJ2NhbiBvbmx5IGJlIGNhbGxlZCBieSBvd25lciBvciBtYW5hZ2VyIG9mIHZhbGlkYXRvcicpCgljYWxsc3ViIGlzT3duZXJPck1hbmFnZXJDYWxsZXIKCgkvLyBjYW4gb25seSBiZSBjYWxsZWQgYnkgb3duZXIgb3IgbWFuYWdlciBvZiB2YWxpZGF0b3IKCWFzc2VydAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjg4OQoJLy8gZXh0cmFGZWUgPSB0aGlzLmdldEdvT25saW5lRmVlKCkKCWNhbGxzdWIgZ2V0R29PbmxpbmVGZWUKCWZyYW1lX2J1cnkgMCAvLyBleHRyYUZlZTogdWludDY0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6ODkwCgkvLyB2ZXJpZnlQYXlUeG4oZmVlUGF5bWVudCwgeyByZWNlaXZlcjogdGhpcy5hcHAuYWRkcmVzcywgYW1vdW50OiBleHRyYUZlZSB9KQoJLy8gdmVyaWZ5IHJlY2VpdmVyCglmcmFtZV9kaWcgLTEgLy8gZmVlUGF5bWVudDogUGF5VHhuCglndHhucyBSZWNlaXZlcgoJZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCT09CgoJLy8gdHJhbnNhY3Rpb24gdmVyaWZpY2F0aW9uIGZhaWxlZDogeyJ0eG4iOiJmZWVQYXltZW50IiwiZmllbGQiOiJyZWNlaXZlciIsImV4cGVjdGVkIjoidGhpcy5hcHAuYWRkcmVzcyJ9Cglhc3NlcnQKCgkvLyB2ZXJpZnkgYW1vdW50CglmcmFtZV9kaWcgLTEgLy8gZmVlUGF5bWVudDogUGF5VHhuCglndHhucyBBbW91bnQKCWZyYW1lX2RpZyAwIC8vIGV4dHJhRmVlOiB1aW50NjQKCT09CgoJLy8gdHJhbnNhY3Rpb24gdmVyaWZpY2F0aW9uIGZhaWxlZDogeyJ0eG4iOiJmZWVQYXltZW50IiwiZmllbGQiOiJhbW91bnQiLCJleHBlY3RlZCI6ImV4dHJhRmVlIn0KCWFzc2VydAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjg5MQoJLy8gc2VuZE9ubGluZUtleVJlZ2lzdHJhdGlvbih7CgkvLyAgICAgICAgICAgICB2b3RlUEs6IHZvdGVQSywKCS8vICAgICAgICAgICAgIHNlbGVjdGlvblBLOiBzZWxlY3Rpb25QSywKCS8vICAgICAgICAgICAgIHN0YXRlUHJvb2ZQSzogc3RhdGVQcm9vZlBLLAoJLy8gICAgICAgICAgICAgdm90ZUZpcnN0OiB2b3RlRmlyc3QsCgkvLyAgICAgICAgICAgICB2b3RlTGFzdDogdm90ZUxhc3QsCgkvLyAgICAgICAgICAgICB2b3RlS2V5RGlsdXRpb246IHZvdGVLZXlEaWx1dGlvbiwKCS8vICAgICAgICAgICAgIGZlZTogZXh0cmFGZWUsCgkvLyAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQga2V5cmVnCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6ODkyCgkvLyB2b3RlUEs6IHZvdGVQSwoJZnJhbWVfZGlnIC0yIC8vIHZvdGVQSzogYnl0ZXMKCWl0eG5fZmllbGQgVm90ZVBLCgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6ODkzCgkvLyBzZWxlY3Rpb25QSzogc2VsZWN0aW9uUEsKCWZyYW1lX2RpZyAtMyAvLyBzZWxlY3Rpb25QSzogYnl0ZXMKCWl0eG5fZmllbGQgU2VsZWN0aW9uUEsKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo4OTQKCS8vIHN0YXRlUHJvb2ZQSzogc3RhdGVQcm9vZlBLCglmcmFtZV9kaWcgLTQgLy8gc3RhdGVQcm9vZlBLOiBieXRlcwoJaXR4bl9maWVsZCBTdGF0ZVByb29mUEsKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo4OTUKCS8vIHZvdGVGaXJzdDogdm90ZUZpcnN0CglmcmFtZV9kaWcgLTUgLy8gdm90ZUZpcnN0OiB1aW50NjQKCWl0eG5fZmllbGQgVm90ZUZpcnN0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6ODk2CgkvLyB2b3RlTGFzdDogdm90ZUxhc3QKCWZyYW1lX2RpZyAtNiAvLyB2b3RlTGFzdDogdWludDY0CglpdHhuX2ZpZWxkIFZvdGVMYXN0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6ODk3CgkvLyB2b3RlS2V5RGlsdXRpb246IHZvdGVLZXlEaWx1dGlvbgoJZnJhbWVfZGlnIC03IC8vIHZvdGVLZXlEaWx1dGlvbjogdWludDY0CglpdHhuX2ZpZWxkIFZvdGVLZXlEaWx1dGlvbgoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjg5OAoJLy8gZmVlOiBleHRyYUZlZQoJZnJhbWVfZGlnIDAgLy8gZXh0cmFGZWU6IHVpbnQ2NAoJaXR4bl9maWVsZCBGZWUKCgkvLyBTdWJtaXQgaW5uZXIgdHJhbnNhY3Rpb24KCWl0eG5fc3VibWl0CglyZXRzdWIKCi8vIGdvT2ZmbGluZSgpdm9pZAoqYWJpX3JvdXRlX2dvT2ZmbGluZToKCS8vIGV4ZWN1dGUgZ29PZmZsaW5lKCl2b2lkCgljYWxsc3ViIGdvT2ZmbGluZQoJaW50IDEKCXJldHVybgoKLy8gZ29PZmZsaW5lKCk6IHZvaWQKLy8KLy8gTWFya3MgYSBzdGFraW5nIHBvb2wga2V5IE9GRkxJTkUuCi8vIFsgT05MWSBPV05FUiBPUiBNQU5BR0VSIENBTiBDQUxMIF0KZ29PZmZsaW5lOgoJcHJvdG8gMCAwCgoJLy8gKmlmNDVfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo5MTAKCS8vIHRoaXMudHhuLnNlbmRlciAhPT0gdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUuYWRkcmVzcwoJdHhuIFNlbmRlcgoJYnl0ZSAweDYzNzI2NTYxNzQ2ZjcyNDE3MDcwIC8vICJjcmVhdG9yQXBwIgoJYXBwX2dsb2JhbF9nZXQKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCXBvcAoJIT0KCWJ6ICppZjQ1X2VuZAoKCS8vICppZjQ1X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjkxMQoJLy8gYXNzZXJ0KHRoaXMuaXNPd25lck9yTWFuYWdlckNhbGxlcigpLCAnY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IG93bmVyIG9yIG1hbmFnZXIgb2YgdmFsaWRhdG9yJykKCWNhbGxzdWIgaXNPd25lck9yTWFuYWdlckNhbGxlcgoKCS8vIGNhbiBvbmx5IGJlIGNhbGxlZCBieSBvd25lciBvciBtYW5hZ2VyIG9mIHZhbGlkYXRvcgoJYXNzZXJ0CgoqaWY0NV9lbmQ6CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo5MTQKCS8vIHNlbmRPZmZsaW5lS2V5UmVnaXN0cmF0aW9uKHt9KQoJaXR4bl9iZWdpbgoJaW50IGtleXJlZwoJaXR4bl9maWVsZCBUeXBlRW51bQoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCXJldHN1YgoKLy8gbGlua1RvTkZEKHVpbnQ2NCxzdHJpbmcpdm9pZAoqYWJpX3JvdXRlX2xpbmtUb05GRDoKCS8vIG5mZE5hbWU6IHN0cmluZwoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJZXh0cmFjdCAyIDAKCgkvLyBuZmRBcHBJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBsaW5rVG9ORkQodWludDY0LHN0cmluZyl2b2lkCgljYWxsc3ViIGxpbmtUb05GRAoJaW50IDEKCXJldHVybgoKLy8gbGlua1RvTkZEKG5mZEFwcElkOiB1aW50NjQsIG5mZE5hbWU6IHN0cmluZyk6IHZvaWQKbGlua1RvTkZEOgoJcHJvdG8gMiAwCgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6OTIxCgkvLyBhc3NlcnQodGhpcy5pc093bmVyT3JNYW5hZ2VyQ2FsbGVyKCksICdjYW4gb25seSBiZSBjYWxsZWQgYnkgb3duZXIgb3IgbWFuYWdlciBvZiB2YWxpZGF0b3InKQoJY2FsbHN1YiBpc093bmVyT3JNYW5hZ2VyQ2FsbGVyCgoJLy8gY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IG93bmVyIG9yIG1hbmFnZXIgb2YgdmFsaWRhdG9yCglhc3NlcnQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo5MjMKCS8vIHNlbmRBcHBDYWxsKHsKCS8vICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQodGhpcy5uZmRSZWdpc3RyeUFwcElkKSwKCS8vICAgICAgICAgICAgIGFwcGxpY2F0aW9uQXJnczogWyd2ZXJpZnlfbmZkX2FkZHInLCBuZmROYW1lLCBpdG9iKG5mZEFwcElkKSwgcmF3Qnl0ZXModGhpcy5hcHAuYWRkcmVzcyldLAoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25zOiBbQXBwSUQuZnJvbVVpbnQ2NChuZmRBcHBJZCldLAoJLy8gICAgICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo5MjQKCS8vIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQodGhpcy5uZmRSZWdpc3RyeUFwcElkKQoJbG9hZCAyMDAgLy8gVE1QTF9uZmRSZWdpc3RyeUFwcElkCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo5MjUKCS8vIGFwcGxpY2F0aW9uQXJnczogWyd2ZXJpZnlfbmZkX2FkZHInLCBuZmROYW1lLCBpdG9iKG5mZEFwcElkKSwgcmF3Qnl0ZXModGhpcy5hcHAuYWRkcmVzcyldCglieXRlIDB4NzY2NTcyNjk2Njc5NWY2ZTY2NjQ1ZjYxNjQ2NDcyIC8vICJ2ZXJpZnlfbmZkX2FkZHIiCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoJZnJhbWVfZGlnIC0yIC8vIG5mZE5hbWU6IHN0cmluZwoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWZyYW1lX2RpZyAtMSAvLyBuZmRBcHBJZDogdWludDY0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoJZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6OTI2CgkvLyBhcHBsaWNhdGlvbnM6IFtBcHBJRC5mcm9tVWludDY0KG5mZEFwcElkKV0KCWZyYW1lX2RpZyAtMSAvLyBuZmRBcHBJZDogdWludDY0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9ucwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCXJldHN1YgoKLy8gcHJveGllZFNldFRva2VuUGF5b3V0UmF0aW8oKHVpbnQ2NCx1aW50NjQsdWludDY0KSkodWludDY0WzI0XSx1aW50NjQpCiphYmlfcm91dGVfcHJveGllZFNldFRva2VuUGF5b3V0UmF0aW86CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHBvb2xLZXk6ICh1aW50NjQsdWludDY0LHVpbnQ2NCkKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWR1cAoJbGVuCglpbnQgMjQKCT09CgoJLy8gYXJndW1lbnQgMCAocG9vbEtleSkgZm9yIHByb3hpZWRTZXRUb2tlblBheW91dFJhdGlvIG11c3QgYmUgYSAodWludDY0LHVpbnQ2NCx1aW50NjQpCglhc3NlcnQKCgkvLyBleGVjdXRlIHByb3hpZWRTZXRUb2tlblBheW91dFJhdGlvKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpKHVpbnQ2NFsyNF0sdWludDY0KQoJY2FsbHN1YiBwcm94aWVkU2V0VG9rZW5QYXlvdXRSYXRpbwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIHByb3hpZWRTZXRUb2tlblBheW91dFJhdGlvKHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkpOiBQb29sVG9rZW5QYXlvdXRSYXRpbwovLwovLyBwcm94aWVkU2V0VG9rZW5QYXlvdXRSYXRpbyBpcyBtZWFudCB0byBiZSBjYWxsZWQgYnkgcG9vbHMgIT0gMSAtIGNhbGxpbmcgVVMsIHBvb2wgIzEKLy8gV2UgbmVlZCB0byB2ZXJpZnkgdGhhdCB3ZSBhcmUgaW4gZmFjdCBiZWluZyBjYWxsZWQgYnkgYW5vdGhlciBvZiBPVVIgcG9vbHMgKG5vdCB1cykKLy8gYW5kIHRoZW4gd2UnbGwgY2FsbCB0aGUgdmFsaWRhdG9yIG9uIHRoZWlyIGJlaGFsZiB0byB1cGRhdGUgdGhlIHRva2VuIHBheW91dHMKLy8gQHBhcmFtIHBvb2xLZXkgLSBWYWxpZGF0b3JQb29sS2V5IHR1cGxlCnByb3hpZWRTZXRUb2tlblBheW91dFJhdGlvOgoJcHJvdG8gMSAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo5MzcKCS8vIGFzc2VydCh0aGlzLnZhbGlkYXRvcklkLnZhbHVlID09PSBwb29sS2V5LmlkLCAnY2FsbGVyIG11c3QgYmUgcGFydCBvZiBzYW1lIHZhbGlkYXRvciBzZXQhJykKCWJ5dGUgMHg3NjYxNmM2OTY0NjE3NDZmNzI0OTY0IC8vICJ2YWxpZGF0b3JJZCIKCWFwcF9nbG9iYWxfZ2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCT09CgoJLy8gY2FsbGVyIG11c3QgYmUgcGFydCBvZiBzYW1lIHZhbGlkYXRvciBzZXQhCglhc3NlcnQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo5MzgKCS8vIGFzc2VydCh0aGlzLnBvb2xJZC52YWx1ZSA9PT0gMSwgJ2NhbGxlZSBtdXN0IGJlIHBvb2wgMScpCglieXRlIDB4NzA2ZjZmNmM0OTY0IC8vICJwb29sSWQiCglhcHBfZ2xvYmFsX2dldAoJaW50IDEKCT09CgoJLy8gY2FsbGVlIG11c3QgYmUgcG9vbCAxCglhc3NlcnQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo5MzkKCS8vIGFzc2VydChwb29sS2V5LnBvb2xJZCAhPT0gMSwgJ2NhbGxlciBtdXN0IE5PVCBiZSBwb29sIDEnKQoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMQoJIT0KCgkvLyBjYWxsZXIgbXVzdCBOT1QgYmUgcG9vbCAxCglhc3NlcnQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo5NDEKCS8vIGNhbGxlclBvb2xBcHBJRCA9IHNlbmRNZXRob2RDYWxsPHR5cGVvZiBWYWxpZGF0b3JSZWdpc3RyeS5wcm90b3R5cGUuZ2V0UG9vbEFwcElkPih7CgkvLyAgICAgICAgICAgICBhcHBsaWNhdGlvbklEOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKCS8vICAgICAgICAgICAgIG1ldGhvZEFyZ3M6IFtwb29sS2V5LmlkLCBwb29sS2V5LnBvb2xJZF0sCgkvLyAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJbWV0aG9kICJnZXRQb29sQXBwSWQodWludDY0LHVpbnQ2NCl1aW50NjQiCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjk0MgoJLy8gYXBwbGljYXRpb25JRDogdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUKCWJ5dGUgMHg2MzcyNjU2MTc0NmY3MjQxNzA3MCAvLyAiY3JlYXRvckFwcCIKCWFwcF9nbG9iYWxfZ2V0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo5NDMKCS8vIG1ldGhvZEFyZ3M6IFtwb29sS2V5LmlkLCBwb29sS2V5LnBvb2xJZF0KCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaXRvYgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCgkvLyBTdWJtaXQgaW5uZXIgdHJhbnNhY3Rpb24KCWl0eG5fc3VibWl0CglpdHhuIE51bUxvZ3MKCWludCAxCgktCglpdHhuYXMgTG9ncwoJZXh0cmFjdCA0IDAKCWJ0b2kKCWZyYW1lX2J1cnkgMCAvLyBjYWxsZXJQb29sQXBwSUQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjk0NQoJLy8gYXNzZXJ0KGNhbGxlclBvb2xBcHBJRCA9PT0gcG9vbEtleS5wb29sQXBwSWQpCglmcmFtZV9kaWcgMCAvLyBjYWxsZXJQb29sQXBwSUQ6IHVpbnQ2NAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJPT0KCWFzc2VydAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjk0NgoJLy8gYXNzZXJ0KHRoaXMudHhuLnNlbmRlciA9PT0gQXBwSUQuZnJvbVVpbnQ2NChwb29sS2V5LnBvb2xBcHBJZCkuYWRkcmVzcykKCXR4biBTZW5kZXIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCXBvcAoJPT0KCWFzc2VydAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjk0OAoJLy8gcmV0dXJuIHNlbmRNZXRob2RDYWxsPHR5cGVvZiBWYWxpZGF0b3JSZWdpc3RyeS5wcm90b3R5cGUuc2V0VG9rZW5QYXlvdXRSYXRpbz4oewoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25JRDogdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUsCgkvLyAgICAgICAgICAgICBtZXRob2RBcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZV0sCgkvLyAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJbWV0aG9kICJzZXRUb2tlblBheW91dFJhdGlvKHVpbnQ2NCkodWludDY0WzI0XSx1aW50NjQpIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo5NDkKCS8vIGFwcGxpY2F0aW9uSUQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlCglieXRlIDB4NjM3MjY1NjE3NDZmNzI0MTcwNzAgLy8gImNyZWF0b3JBcHAiCglhcHBfZ2xvYmFsX2dldAoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6OTUwCgkvLyBtZXRob2RBcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZV0KCWJ5dGUgMHg3NjYxNmM2OTY0NjE3NDZmNzI0OTY0IC8vICJ2YWxpZGF0b3JJZCIKCWFwcF9nbG9iYWxfZ2V0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCWl0eG4gTnVtTG9ncwoJaW50IDEKCS0KCWl0eG5hcyBMb2dzCglleHRyYWN0IDQgMAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoJcmV0c3ViCgovLyBpc093bmVyT3JNYW5hZ2VyQ2FsbGVyKCk6IGJvb2xlYW4KaXNPd25lck9yTWFuYWdlckNhbGxlcjoKCXByb3RvIDAgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6OTU1CgkvLyBPd25lckFuZE1hbmFnZXIgPSBzZW5kTWV0aG9kQ2FsbDx0eXBlb2YgVmFsaWRhdG9yUmVnaXN0cnkucHJvdG90eXBlLmdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcj4oewoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25JRDogdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUsCgkvLyAgICAgICAgICAgICBtZXRob2RBcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZV0sCgkvLyAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJbWV0aG9kICJnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo5NTYKCS8vIGFwcGxpY2F0aW9uSUQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlCglieXRlIDB4NjM3MjY1NjE3NDZmNzI0MTcwNzAgLy8gImNyZWF0b3JBcHAiCglhcHBfZ2xvYmFsX2dldAoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6OTU3CgkvLyBtZXRob2RBcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZV0KCWJ5dGUgMHg3NjYxNmM2OTY0NjE3NDZmNzI0OTY0IC8vICJ2YWxpZGF0b3JJZCIKCWFwcF9nbG9iYWxfZ2V0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCWl0eG4gTnVtTG9ncwoJaW50IDEKCS0KCWl0eG5hcyBMb2dzCglleHRyYWN0IDQgMAoJZnJhbWVfYnVyeSAwIC8vIE93bmVyQW5kTWFuYWdlcjogKGFkZHJlc3MsYWRkcmVzcykKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo5NTkKCS8vIHJldHVybiB0aGlzLnR4bi5zZW5kZXIgPT09IE93bmVyQW5kTWFuYWdlclswXSB8fCB0aGlzLnR4bi5zZW5kZXIgPT09IE93bmVyQW5kTWFuYWdlclsxXQoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIDAgLy8gT3duZXJBbmRNYW5hZ2VyOiAoYWRkcmVzcyxhZGRyZXNzKQoJZXh0cmFjdCAwIDMyCgk9PQoJZHVwCglibnogKnNraXBfb3IyCgl0eG4gU2VuZGVyCglmcmFtZV9kaWcgMCAvLyBPd25lckFuZE1hbmFnZXI6IChhZGRyZXNzLGFkZHJlc3MpCglleHRyYWN0IDMyIDMyCgk9PQoJfHwKCipza2lwX29yMjoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoJcmV0c3ViCgovLyBhbGdvU2F0dXJhdGlvbkxldmVsKCk6IHVpbnQ2NAovLwovLyBSZXR1cm5zIHRoZSBtYXhpbXVtIGFsbG93ZWQgc3Rha2UgcGVyIHZhbGlkYXRvciBiYXNlZCBvbiBhIHBlcmNlbnRhZ2Ugb2YgYWxsIGN1cnJlbnQgb25saW5lIHN0YWtlIGJlZm9yZQovLyB0aGUgdmFsaWRhdG9yIGlzIGNvbnNpZGVyZWQgc2F0dXJhdGVkIC0gd2hlcmUgcmV3YXJkcyBhcmUgZGltaW5pc2hlZC4KYWxnb1NhdHVyYXRpb25MZXZlbDoKCXByb3RvIDAgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6OTY3CgkvLyBvbmxpbmUgPSB0aGlzLmdldEN1cnJlbnRPbmxpbmVTdGFrZSgpCgljYWxsc3ViIGdldEN1cnJlbnRPbmxpbmVTdGFrZQoJZnJhbWVfYnVyeSAwIC8vIG9ubGluZTogdWludDY0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6OTY5CgkvLyByZXR1cm4gd2lkZVJhdGlvKFtvbmxpbmUsIE1BWF9WQUxJREFUT1JfU09GVF9QQ1RfT0ZfT05MSU5FXzFERUNJTUFMXSwgWzEwMDBdKQoJZnJhbWVfZGlnIDAgLy8gb25saW5lOiB1aW50NjQKCWludCAxMDAKCW11bHcKCWludCAwCglpbnQgMTAwMAoJZGl2bW9kdwoJcG9wCglwb3AKCXN3YXAKCSEKCgkvLyB3aWRlUmF0aW8gZmFpbGVkCglhc3NlcnQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gZ2V0R29PbmxpbmVGZWUoKTogdWludDY0CmdldEdvT25saW5lRmVlOgoJcHJvdG8gMCAxCgoJLy8gKmlmNDZfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo5NzQKCS8vICF0aGlzLmFwcC5hZGRyZXNzLmluY2VudGl2ZUVsaWdpYmxlCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJYWNjdF9wYXJhbXNfZ2V0IEFjY3RJbmNlbnRpdmVFbGlnaWJsZQoJcG9wCgkhCglieiAqaWY0Nl9lbmQKCgkvLyAqaWY0Nl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo5NzUKCS8vIHJldHVybiBnbG9iYWxzLnBheW91dHNHb09ubGluZUZlZQoJZ2xvYmFsIFBheW91dHNHb09ubGluZUZlZQoJcmV0c3ViCgoqaWY0Nl9lbmQ6CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo5NzcKCS8vIHJldHVybiAwCglpbnQgMAoJcmV0c3ViCgovLyBnZXRDdXJyZW50T25saW5lU3Rha2UoKTogdWludDY0CmdldEN1cnJlbnRPbmxpbmVTdGFrZToKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjk4MQoJLy8gcmV0dXJuIG9ubGluZVN0YWtlKCkKCW9ubGluZV9zdGFrZQoJcmV0c3ViCgovLyBjaGVja0lmQmluQ2xvc2VkKCk6IHZvaWQKLy8KLy8gQ2hlY2tzIGlmIHRoZSBjdXJyZW50IHJvdW5kIGlzIGluIGEgJ25ldyBjYWxjdWxhdGlvbiBiaW4nIChhcHByb3hpbWF0ZWx5IGRhaWx5KQpjaGVja0lmQmluQ2xvc2VkOgoJcHJvdG8gMCAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gNAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjk4OAoJLy8gY3VycmVudEJpblNpemUgPSB0aGlzLnJvdW5kc1BlckRheS52YWx1ZSBhcyB1aW50MTI4CglieXRlIDB4NzI2Zjc1NmU2NDczNTA2NTcyNDQ2MTc5IC8vICJyb3VuZHNQZXJEYXkiCglhcHBfZ2xvYmFsX2dldAoJaXRvYgoJZnJhbWVfYnVyeSAwIC8vIGN1cnJlbnRCaW5TaXplOiB1bnNhZmUgdWludDEyOAoKCS8vICppZjQ3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6OTg5CgkvLyBnbG9iYWxzLnJvdW5kID49IHRoaXMuYmluUm91bmRTdGFydC52YWx1ZSArIChjdXJyZW50QmluU2l6ZSBhcyB1aW50NjQpCglnbG9iYWwgUm91bmQKCWJ5dGUgMHg2MjY5NmU1MjZmNzU2ZTY0NTM3NDYxNzI3NCAvLyAiYmluUm91bmRTdGFydCIKCWFwcF9nbG9iYWxfZ2V0CglmcmFtZV9kaWcgMCAvLyBjdXJyZW50QmluU2l6ZTogdW5zYWZlIHVpbnQxMjgKCWR1cAoJYml0bGVuCglpbnQgNjQKCTw9CgoJLy8gY3VycmVudEJpblNpemUgYXMgdWludDY0IG92ZXJmbG93ZWQgNjQgYml0cwoJYXNzZXJ0CglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRgoJYiYKCWR1cAoJbGVuCglkdXAKCWludCA4CgktCglzd2FwCglzdWJzdHJpbmczCglidG9pCgkrCgk+PQoJYnogKmlmNDdfZW5kCgoJLy8gKmlmNDdfY29uc2VxdWVudAoJLy8gKmlmNDhfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo5OTAKCS8vIGdsb2JhbHMub3Bjb2RlQnVkZ2V0IDwgMzAwCglnbG9iYWwgT3Bjb2RlQnVkZ2V0CglpbnQgMzAwCgk8CglieiAqaWY0OF9lbmQKCgkvLyAqaWY0OF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo5OTEKCS8vIGluY3JlYXNlT3Bjb2RlQnVkZ2V0KCkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCWJ5dGUgYjY0IENvRUIgLy8gI3ByYWdtYSB2ZXJzaW9uIDEwOyBpbnQgMQoJZHVwCglpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQoJaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQoJaW50IERlbGV0ZUFwcGxpY2F0aW9uCglpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgoJaXR4bl9zdWJtaXQKCippZjQ4X2VuZDoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjk5MwoJLy8gYXBwcm94Um91bmRzUGVyWWVhcjogdWludDEyOCA9IGN1cnJlbnRCaW5TaXplICogKDM2NSBhcyB1aW50MTI4KQoJZnJhbWVfZGlnIDAgLy8gY3VycmVudEJpblNpemU6IHVuc2FmZSB1aW50MTI4CglieXRlIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxNmQKCWIqCglkdXAKCWJpdGxlbgoJaW50IDEyOAoJPD0KCgkvLyBjdXJyZW50QmluU2l6ZSAqICgzNjUgYXMgdWludDEyOCkgb3ZlcmZsb3dlZCAxMjggYml0cwoJYXNzZXJ0CglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYKCWImCglkdXAKCWxlbgoJZHVwCglpbnQgMTYKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWZyYW1lX2J1cnkgMSAvLyBhcHByb3hSb3VuZHNQZXJZZWFyOiB1aW50MTI4CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6OTk0CgkvLyBhdmdTdGFrZTogdWludDEyOCA9IHRoaXMuc3Rha2VBY2N1bXVsYXRvci52YWx1ZSAvIGN1cnJlbnRCaW5TaXplCglieXRlIDB4NzM3NDYxNmI2NTQxNjM2Mzc1NmQ3NTZjNjE3NDZmNzIgLy8gInN0YWtlQWNjdW11bGF0b3IiCglhcHBfZ2xvYmFsX2dldAoJZnJhbWVfZGlnIDAgLy8gY3VycmVudEJpblNpemU6IHVuc2FmZSB1aW50MTI4CgliLwoJZHVwCgliaXRsZW4KCWludCAxMjgKCTw9CgoJLy8gdGhpcy5zdGFrZUFjY3VtdWxhdG9yLnZhbHVlIC8gY3VycmVudEJpblNpemUgb3ZlcmZsb3dlZCAxMjggYml0cwoJYXNzZXJ0CglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYKCWImCglkdXAKCWxlbgoJZHVwCglpbnQgMTYKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWZyYW1lX2J1cnkgMiAvLyBhdmdTdGFrZTogdWludDEyOAoKCS8vICppZjQ5X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6OTk1CgkvLyBhdmdTdGFrZSAhPT0gMAoJZnJhbWVfZGlnIDIgLy8gYXZnU3Rha2U6IHVpbnQxMjgKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAoJYiE9CglieiAqaWY0OV9lbmQKCgkvLyAqaWY0OV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czo5OTkKCS8vIGFwcjogdWludDEyOCA9CgkvLyAgICAgICAgICAgICAgICAgICAgICgoKHRoaXMucmV3YXJkQWNjdW11bGF0b3IudmFsdWUgYXMgdWludDEyOCkgKiAoMTAwMDAgYXMgdWludDEyOCkpIC8gYXZnU3Rha2UpICoKCS8vICAgICAgICAgICAgICAgICAgICAgKGFwcHJveFJvdW5kc1BlclllYXIgLyBjdXJyZW50QmluU2l6ZSkKCWJ5dGUgMHg3MjY1Nzc2MTcyNjQ0MTYzNjM3NTZkNzU2YzYxNzQ2ZjcyIC8vICJyZXdhcmRBY2N1bXVsYXRvciIKCWFwcF9nbG9iYWxfZ2V0CglpdG9iCglieXRlIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI3MTAKCWIqCglmcmFtZV9kaWcgMiAvLyBhdmdTdGFrZTogdWludDEyOAoJYi8KCWZyYW1lX2RpZyAxIC8vIGFwcHJveFJvdW5kc1BlclllYXI6IHVpbnQxMjgKCWZyYW1lX2RpZyAwIC8vIGN1cnJlbnRCaW5TaXplOiB1bnNhZmUgdWludDEyOAoJYi8KCWIqCglkdXAKCWJpdGxlbgoJaW50IDEyOAoJPD0KCgkvLyAoKCh0aGlzLnJld2FyZEFjY3VtdWxhdG9yLnZhbHVlIGFzIHVpbnQxMjgpICogKDEwMDAwIGFzIHVpbnQxMjgpKSAvIGF2Z1N0YWtlKSAqDVxuICAgICAgICAgICAgICAgICAgICAoYXBwcm94Um91bmRzUGVyWWVhciAvIGN1cnJlbnRCaW5TaXplKSBvdmVyZmxvd2VkIDEyOCBiaXRzCglhc3NlcnQKCWJ5dGUgMHhGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgoJYiYKCWR1cAoJbGVuCglkdXAKCWludCAxNgoJLQoJc3dhcAoJc3Vic3RyaW5nMwoJZnJhbWVfYnVyeSAzIC8vIGFwcjogdWludDEyOAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjEwMDMKCS8vIGFscGhhOiB1aW50MTI4ID0gMTAgYXMgdWludDEyOAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBhCglmcmFtZV9idXJ5IDQgLy8gYWxwaGE6IHVuc2FmZSB1aW50MTI4CgoJLy8gKmlmNTBfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoxMDA1CgkvLyBhdmdTdGFrZSA+IDMwMDAwMDAwMDAwMAoJZnJhbWVfZGlnIDIgLy8gYXZnU3Rha2U6IHVpbnQxMjgKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNDVkOTY0YjgwMAoJYj4KCWJ6ICppZjUwX2VuZAoKCS8vICppZjUwX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjEwMDYKCS8vIGFscGhhID0gOTAgYXMgdWludDEyOAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDVhCglmcmFtZV9idXJ5IDQgLy8gYWxwaGE6IHVuc2FmZSB1aW50MTI4CgoqaWY1MF9lbmQ6CgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoxMDA4CgkvLyB0aGlzLndlaWdodGVkTW92aW5nQXZlcmFnZS52YWx1ZSA9CgkvLyAgICAgICAgICAgICAgICAgICAgICh0aGlzLndlaWdodGVkTW92aW5nQXZlcmFnZS52YWx1ZSAqICgoMTAwIGFzIHVpbnQxMjgpIC0gYWxwaGEpKSAvICgxMDAgYXMgdWludDEyOCkgKwoJLy8gICAgICAgICAgICAgICAgICAgICAoYXByICogYWxwaGEpIC8gKDEwMCBhcyB1aW50MTI4KQoJYnl0ZSAweDY1Nzc2ZDYxIC8vICJld21hIgoJZHVwCglhcHBfZ2xvYmFsX2dldAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDY0CglmcmFtZV9kaWcgNCAvLyBhbHBoYTogdW5zYWZlIHVpbnQxMjgKCWItCgliKgoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDY0CgliLwoJZnJhbWVfZGlnIDMgLy8gYXByOiB1aW50MTI4CglmcmFtZV9kaWcgNCAvLyBhbHBoYTogdW5zYWZlIHVpbnQxMjgKCWIqCglieXRlIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNjQKCWIvCgliKwoJZHVwCgliaXRsZW4KCWludCAxMjgKCTw9CgoJLy8gKHRoaXMud2VpZ2h0ZWRNb3ZpbmdBdmVyYWdlLnZhbHVlICogKCgxMDAgYXMgdWludDEyOCkgLSBhbHBoYSkpIC8gKDEwMCBhcyB1aW50MTI4KSArDVxuICAgICAgICAgICAgICAgICAgICAoYXByICogYWxwaGEpIC8gKDEwMCBhcyB1aW50MTI4KSBvdmVyZmxvd2VkIDEyOCBiaXRzCglhc3NlcnQKCWJ5dGUgMHhGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgoJYiYKCWR1cAoJbGVuCglkdXAKCWludCAxNgoJLQoJc3dhcAoJc3Vic3RyaW5nMwoJYXBwX2dsb2JhbF9wdXQKCippZjQ5X2VuZDoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjEwMTQKCS8vIHRoaXMuc2V0Um91bmRzUGVyRGF5KCkKCWNhbGxzdWIgc2V0Um91bmRzUGVyRGF5CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MTAxNQoJLy8gdGhpcy5zdGFrZUFjY3VtdWxhdG9yLnZhbHVlID0gKHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlIGFzIHVpbnQxMjgpICogKHRoaXMucm91bmRzUGVyRGF5LnZhbHVlIGFzIHVpbnQxMjgpCglieXRlIDB4NzM3NDYxNmI2NTQxNjM2Mzc1NmQ3NTZjNjE3NDZmNzIgLy8gInN0YWtlQWNjdW11bGF0b3IiCglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglhcHBfZ2xvYmFsX2dldAoJaXRvYgoJYnl0ZSAweDcyNmY3NTZlNjQ3MzUwNjU3MjQ0NjE3OSAvLyAicm91bmRzUGVyRGF5IgoJYXBwX2dsb2JhbF9nZXQKCWl0b2IKCWIqCglkdXAKCWJpdGxlbgoJaW50IDEyOAoJPD0KCgkvLyAodGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgYXMgdWludDEyOCkgKiAodGhpcy5yb3VuZHNQZXJEYXkudmFsdWUgYXMgdWludDEyOCkgb3ZlcmZsb3dlZCAxMjggYml0cwoJYXNzZXJ0CglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYKCWImCglkdXAKCWxlbgoJZHVwCglpbnQgMTYKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzXHN0YWtpbmdQb29sLmFsZ28udHM6MTAxNgoJLy8gdGhpcy5yZXdhcmRBY2N1bXVsYXRvci52YWx1ZSA9IDAKCWJ5dGUgMHg3MjY1Nzc2MTcyNjQ0MTYzNjM3NTZkNzU2YzYxNzQ2ZjcyIC8vICJyZXdhcmRBY2N1bXVsYXRvciIKCWludCAwCglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0c1xzdGFraW5nUG9vbC5hbGdvLnRzOjEwMTcKCS8vIHRoaXMuYmluUm91bmRTdGFydC52YWx1ZSA9IGdsb2JhbHMucm91bmQgLSAoZ2xvYmFscy5yb3VuZCAlIHRoaXMucm91bmRzUGVyRGF5LnZhbHVlKQoJYnl0ZSAweDYyNjk2ZTUyNmY3NTZlNjQ1Mzc0NjE3Mjc0IC8vICJiaW5Sb3VuZFN0YXJ0IgoJZ2xvYmFsIFJvdW5kCglnbG9iYWwgUm91bmQKCWJ5dGUgMHg3MjZmNzU2ZTY0NzM1MDY1NzI0NDYxNzkgLy8gInJvdW5kc1BlckRheSIKCWFwcF9nbG9iYWxfZ2V0CgklCgktCglhcHBfZ2xvYmFsX3B1dAoKKmlmNDdfZW5kOgoJcmV0c3ViCgovLyBzZXRSb3VuZHNQZXJEYXkoKTogdm9pZApzZXRSb3VuZHNQZXJEYXk6Cglwcm90byAwIDAKCgkvLyBjb250cmFjdHNcc3Rha2luZ1Bvb2wuYWxnby50czoxMDIyCgkvLyB0aGlzLnJvdW5kc1BlckRheS52YWx1ZSA9IEFWR19ST1VORFNfUEVSX0RBWQoJYnl0ZSAweDcyNmY3NTZlNjQ3MzUwNjU3MjQ0NjE3OSAvLyAicm91bmRzUGVyRGF5IgoJaW50IDMwODU3CglhcHBfZ2xvYmFsX3B1dAoJcmV0c3ViCgoqY3JlYXRlX05vT3A6CgltZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggKmFiaV9yb3V0ZV9jcmVhdGVBcHBsaWNhdGlvbgoKCS8vIHRoaXMgY29udHJhY3QgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBnaXZlbiBBQkkgbWV0aG9kIGZvciBjcmVhdGUgTm9PcAoJZXJyCgoqY2FsbF9Ob09wOgoJbWV0aG9kICJnYXMoKXZvaWQiCgltZXRob2QgImluaXRTdG9yYWdlKHBheSl2b2lkIgoJbWV0aG9kICJhZGRTdGFrZShwYXksYWRkcmVzcyl1aW50NjQiCgltZXRob2QgInJlbW92ZVN0YWtlKGFkZHJlc3MsdWludDY0KXZvaWQiCgltZXRob2QgImNsYWltVG9rZW5zKCl2b2lkIgoJbWV0aG9kICJnZXRTdGFrZXJJbmZvKGFkZHJlc3MpKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAicGF5VG9rZW5SZXdhcmQoYWRkcmVzcyx1aW50NjQsdWludDY0KXZvaWQiCgltZXRob2QgInVwZGF0ZUFsZ29kVmVyKHN0cmluZyl2b2lkIgoJbWV0aG9kICJlcG9jaEJhbGFuY2VVcGRhdGUoKXZvaWQiCgltZXRob2QgImdvT25saW5lKHBheSxieXRlW10sYnl0ZVtdLGJ5dGVbXSx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIgoJbWV0aG9kICJnb09mZmxpbmUoKXZvaWQiCgltZXRob2QgImxpbmtUb05GRCh1aW50NjQsc3RyaW5nKXZvaWQiCgltZXRob2QgInByb3hpZWRTZXRUb2tlblBheW91dFJhdGlvKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpKHVpbnQ2NFsyNF0sdWludDY0KSIKCXR4bmEgQXBwbGljYXRpb25BcmdzIDAKCW1hdGNoICphYmlfcm91dGVfZ2FzICphYmlfcm91dGVfaW5pdFN0b3JhZ2UgKmFiaV9yb3V0ZV9hZGRTdGFrZSAqYWJpX3JvdXRlX3JlbW92ZVN0YWtlICphYmlfcm91dGVfY2xhaW1Ub2tlbnMgKmFiaV9yb3V0ZV9nZXRTdGFrZXJJbmZvICphYmlfcm91dGVfcGF5VG9rZW5SZXdhcmQgKmFiaV9yb3V0ZV91cGRhdGVBbGdvZFZlciAqYWJpX3JvdXRlX2Vwb2NoQmFsYW5jZVVwZGF0ZSAqYWJpX3JvdXRlX2dvT25saW5lICphYmlfcm91dGVfZ29PZmZsaW5lICphYmlfcm91dGVfbGlua1RvTkZEICphYmlfcm91dGVfcHJveGllZFNldFRva2VuUGF5b3V0UmF0aW8KCgkvLyB0aGlzIGNvbnRyYWN0IGRvZXMgbm90IGltcGxlbWVudCB0aGUgZ2l2ZW4gQUJJIG1ldGhvZCBmb3IgY2FsbCBOb09wCgllcnI=","clear":"I3ByYWdtYSB2ZXJzaW9uIDEx"},"templateVariables":{"nfdRegistryAppId":{"type":"uint64"}},"scratchVariables":{"nfdRegistryAppId":{"type":"uint64","slot":200}},"compilerInfo":{"compiler":"algod","compilerVersion":{"major":3,"minor":26,"patch":231714,"commitHash":"8b6c443d"}}} + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +// Aliases for non-encoded ABI values + +type uint64 = bigint; +type pay = AppMethodCallTransactionArgument; +type address = string; +type byte = number; +type AVMBytes = Uint8Array; +type uint128 = bigint; + +// Type definitions for ARC-56 structs + +export type StakedInfo = { + account: address, + balance: uint64, + totalRewarded: uint64, + rewardTokenBalance: uint64, + entryRound: uint64 +} + +export type PoolTokenPayoutRatio = { + poolPctOfWhole: uint64[], + updatedForPayout: uint64 +} + +export type ValidatorPoolKey = { + id: uint64, + poolId: uint64, + poolAppId: uint64 +} + + +/** + * Deploy-time template variables + */ +export type TemplateVariables = { + nfdRegistryAppId: uint64, +} +/** + * Defines the types of available calls and state of the StakingPool smart contract. + */ +export type StakingPoolTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'createApplication(uint64,uint64,uint64,uint64)void' | 'createApplication', { + argsObj: { + /** + * id of contract that constructed us - the validator application (single global instance) + */ + creatingContractId: bigint | number + /** + * id of validator we're a staking pool of + */ + validatorId: bigint | number + /** + * which pool id are we + */ + poolId: bigint | number + /** + * minimum amount to be in pool, but also minimum amount balance can't go below (without removing all!) + */ + minEntryStake: bigint | number + } + argsTuple: [creatingContractId: bigint | number, validatorId: bigint | number, poolId: bigint | number, minEntryStake: bigint | number] + returns: void + }> + & Record<'gas()void' | 'gas', { + argsObj: { + } + argsTuple: [] + returns: void + }> + & Record<'initStorage(pay)void' | 'initStorage', { + argsObj: { + /** + * payment from caller which covers mbr increase of new staking pools' storage + */ + mbrPayment: AppMethodCallTransactionArgument + } + argsTuple: [mbrPayment: AppMethodCallTransactionArgument] + returns: void + }> + & Record<'addStake(pay,address)uint64' | 'addStake', { + argsObj: { + /** + * prior payment coming from validator contract to us on behalf of staker. + */ + stakedAmountPayment: AppMethodCallTransactionArgument + /** + * The account adding new stake + */ + staker: string + } + argsTuple: [stakedAmountPayment: AppMethodCallTransactionArgument, staker: string] + /** + * uint64 new 'entry round' round number of stake add + */ + returns: bigint + }> + & Record<'removeStake(address,uint64)void' | 'removeStake', { + argsObj: { + /** + * account to remove. normally same as sender, but the validator owner or manager can also call + this to remove the specified staker explicitly. The removed stake MUST only go to the staker of course. This is + so a validator can shut down a poool and refund the stakers. It can also be used to kick out stakers who no longer + meet the gating requirements (determined by the node daemon). + + */ + staker: string + /** + * The amount of stake to be removed. Specify 0 to remove all stake. + */ + amountToUnstake: bigint | number + } + argsTuple: [staker: string, amountToUnstake: bigint | number] + returns: void + }> + & Record<'claimTokens()void' | 'claimTokens', { + argsObj: { + } + argsTuple: [] + returns: void + }> + & Record<'getStakerInfo(address)(address,uint64,uint64,uint64,uint64)' | 'getStakerInfo', { + argsObj: { + /** + * The address of the staker. + */ + staker: string + } + argsTuple: [staker: string] + /** + * StakedInfo - The staked information for the given staker. + */ + returns: StakedInfo + }> + & Record<'payTokenReward(address,uint64,uint64)void' | 'payTokenReward', { + argsObj: { + /** + * the staker account to send rewards to + */ + staker: string + /** + * id of reward token (to avoid re-entrancy in calling validator back to get id) + */ + rewardToken: bigint | number + /** + * amount to send the staker (there is significant trust here(!) - also why only validator can call us + */ + amountToSend: bigint | number + } + argsTuple: [staker: string, rewardToken: bigint | number, amountToSend: bigint | number] + returns: void + }> + & Record<'updateAlgodVer(string)void' | 'updateAlgodVer', { + argsObj: { + /** + * string representing the algorand node daemon version (reti node daemon composes its own meta version) + */ + algodVer: string + } + argsTuple: [algodVer: string] + returns: void + }> + & Record<'epochBalanceUpdate()void' | 'epochBalanceUpdate', { + argsObj: { + } + argsTuple: [] + returns: void + }> + & Record<'goOnline(pay,byte[],byte[],byte[],uint64,uint64,uint64)void' | 'goOnline', { + argsObj: { + /** + * payment to cover extra fee of going online if offline - or 0 if not renewal + */ + feePayment: AppMethodCallTransactionArgument + /** + * The vote public key. + */ + votePk: Uint8Array + /** + * The selection public key. + */ + selectionPk: Uint8Array + /** + * The state proof public key. + */ + stateProofPk: Uint8Array + /** + * The first vote index. + */ + voteFirst: bigint | number + /** + * The last vote index. + */ + voteLast: bigint | number + /** + * The vote key dilution value. + */ + voteKeyDilution: bigint | number + } + argsTuple: [feePayment: AppMethodCallTransactionArgument, votePk: Uint8Array, selectionPk: Uint8Array, stateProofPk: Uint8Array, voteFirst: bigint | number, voteLast: bigint | number, voteKeyDilution: bigint | number] + returns: void + }> + & Record<'goOffline()void' | 'goOffline', { + argsObj: { + } + argsTuple: [] + returns: void + }> + & Record<'linkToNFD(uint64,string)void' | 'linkToNFD', { + argsObj: { + nfdAppId: bigint | number + nfdName: string + } + argsTuple: [nfdAppId: bigint | number, nfdName: string] + returns: void + }> + & Record<'proxiedSetTokenPayoutRatio((uint64,uint64,uint64))(uint64[24],uint64)' | 'proxiedSetTokenPayoutRatio', { + argsObj: { + /** + * ValidatorPoolKey tuple + */ + poolKey: ValidatorPoolKey + } + argsTuple: [poolKey: ValidatorPoolKey] + returns: PoolTokenPayoutRatio + }> + /** + * Defines the shape of the state of the application. + */ + state: { + global: { + keys: { + creatingValidatorContractAppId: bigint + validatorId: bigint + poolId: bigint + numStakers: bigint + totalAlgoStaked: bigint + minEntryStake: bigint + lastPayout: bigint + epochNumber: bigint + algodVer: Uint8Array + roundsPerDay: bigint + binRoundStart: bigint + stakeAccumulator: bigint + rewardAccumulator: bigint + weightedMovingAverage: bigint + } + } + box: { + keys: { + stakers: [[string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint]] + } + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type StakingPoolSignatures = keyof StakingPoolTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type StakingPoolNonVoidMethodSignatures = keyof StakingPoolTypes['methods'] extends infer T ? T extends keyof StakingPoolTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand> + } +> +/** + * Maps a method signature from the StakingPool smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = StakingPoolTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the StakingPool smart contract to the method's return type + */ +export type MethodReturn = StakingPoolTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed global state of the application. + */ +export type GlobalKeysState = StakingPoolTypes['state']['global']['keys'] + +/** + * Defines the shape of the keyed box state of the application. + */ +export type BoxKeysState = StakingPoolTypes['state']['box']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type StakingPoolCreateCallParams = + | Expand & {method: 'createApplication'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema> + | Expand & {method: 'createApplication(uint64,uint64,uint64,uint64)void'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema> +/** + * Defines arguments required for the deploy method. + */ +export type StakingPoolDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: StakingPoolCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the StakingPool smart contract + */ +export abstract class StakingPoolParamsFactory { + /** + * Gets available create ABI call param factories + */ + static get create() { + return { + _resolveByMethod(params: TParams) { + switch(params.method) { + case 'createApplication': + case 'createApplication(uint64,uint64,uint64,uint64)void': + return StakingPoolParamsFactory.create.createApplication(params) + } + throw new Error(`Unknown ' + verb + ' method`) + }, + + /** + * Constructs create ABI call params for the StakingPool smart contract using the createApplication(uint64,uint64,uint64,uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + createApplication(params: CallParams<'createApplication(uint64,uint64,uint64,uint64)void'> & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC}): AppClientMethodCallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC} { + return { + ...params, + method: 'createApplication(uint64,uint64,uint64,uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.creatingContractId, params.args.validatorId, params.args.poolId, params.args.minEntryStake], + } + }, + } + } + + /** + * Constructs a no op call for the gas()void ABI method + * + * gas is a dummy no-op call that can be used to pool-up resource references and opcode cost + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static gas(params: CallParams<'gas()void'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'gas()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the initStorage(pay)void ABI method + * + * Called after we're created and then funded, so we can create our large stakers ledger storage + Caller has to get MBR amounts from ValidatorRegistry to know how much to fund us to cover the box storage cost + If this is pool 1 AND the validator has specified a reward token, opt-in to that token + so that the validator can seed the pool with future rewards of that token. + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static initStorage(params: CallParams<'initStorage(pay)void'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'initStorage(pay)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.mbrPayment], + } + } + /** + * Constructs a no op call for the addStake(pay,address)uint64 ABI method + * + * Adds stake to the given account. + Can ONLY be called by the validator contract that created us + Must receive payment from the validator contract for amount being staked. + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static addStake(params: CallParams<'addStake(pay,address)uint64'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'addStake(pay,address)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.stakedAmountPayment, params.args.staker], + } + } + /** + * Constructs a no op call for the removeStake(address,uint64)void ABI method + * + * Removes stake on behalf of caller (removing own stake). If any token rewards exist, those are always sent in + full. Also notifies the validator contract for this pools validator of the staker / balance changes. + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static removeStake(params: CallParams<'removeStake(address,uint64)void'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'removeStake(address,uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.staker, params.args.amountToUnstake], + } + } + /** + * Constructs a no op call for the claimTokens()void ABI method + * + * Claims all the available reward tokens a staker has available, sending their entire balance to the staker from + pool 1 (either directly, or via validator-pool1 to pay it out) + Also notifies the validator contract for this pools validator of the staker / balance changes. + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static claimTokens(params: CallParams<'claimTokens()void'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'claimTokens()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the getStakerInfo(address)(address,uint64,uint64,uint64,uint64) ABI method + * + * Retrieves the staked information for a given staker. + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getStakerInfo(params: CallParams<'getStakerInfo(address)(address,uint64,uint64,uint64,uint64)'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'getStakerInfo(address)(address,uint64,uint64,uint64,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.staker], + } + } + /** + * Constructs a no op call for the payTokenReward(address,uint64,uint64)void ABI method + * + * [Internal protocol method] Remove a specified amount of 'community token' rewards for a staker. + This can ONLY be called by our validator and only if we're pool 1 - with the token. + Note: this can also be called by validator as part of OWNER wanting to send the reward tokens + somewhere else (ie if they're sunsetting their validator and need the reward tokens back). + It's up to the validator to ensure that the balance in rewardTokenHeldBack is honored. + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static payTokenReward(params: CallParams<'payTokenReward(address,uint64,uint64)void'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'payTokenReward(address,uint64,uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.staker, params.args.rewardToken, params.args.amountToSend], + } + } + /** + * Constructs a no op call for the updateAlgodVer(string)void ABI method + * + * Update the (honor system) algod version for the node associated to this pool. The node management daemon + should compare its current nodes version to the version stored in global state, updating when different. + The reti node daemon composes its own version string using format: + major.minor.build branch [commit hash], + ie: 3.22.0 rel/stable [6b508975] + [ ONLY OWNER OR MANAGER CAN CALL ] + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static updateAlgodVer(params: CallParams<'updateAlgodVer(string)void'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'updateAlgodVer(string)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.algodVer], + } + } + /** + * Constructs a no op call for the epochBalanceUpdate()void ABI method + * + * Updates the balance of stakers in the pool based on the received 'rewards' (current balance vs known staked balance) + stakers outstanding balance is adjusted based on their % of stake and time in the current epoch - so that balance + compounds over time and staker can remove that amount at will. + The validator is paid their percentage each epoch payout. + + + Note: ANYONE can call this. + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static epochBalanceUpdate(params: CallParams<'epochBalanceUpdate()void'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'epochBalanceUpdate()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the goOnline(pay,byte[],byte[],byte[],uint64,uint64,uint64)void ABI method + * + * Registers a staking pool key online against a participation key. + [ ONLY OWNER OR MANAGER CAN CALL ] + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static goOnline(params: CallParams<'goOnline(pay,byte[],byte[],byte[],uint64,uint64,uint64)void'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'goOnline(pay,byte[],byte[],byte[],uint64,uint64,uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.feePayment, params.args.votePk, params.args.selectionPk, params.args.stateProofPk, params.args.voteFirst, params.args.voteLast, params.args.voteKeyDilution], + } + } + /** + * Constructs a no op call for the goOffline()void ABI method + * + * Marks a staking pool key OFFLINE. + [ ONLY OWNER OR MANAGER CAN CALL ] + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static goOffline(params: CallParams<'goOffline()void'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'goOffline()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the linkToNFD(uint64,string)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static linkToNfd(params: CallParams<'linkToNFD(uint64,string)void'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'linkToNFD(uint64,string)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.nfdAppId, params.args.nfdName], + } + } + /** + * Constructs a no op call for the proxiedSetTokenPayoutRatio((uint64,uint64,uint64))(uint64[24],uint64) ABI method + * + * proxiedSetTokenPayoutRatio is meant to be called by pools != 1 - calling US, pool #1 + We need to verify that we are in fact being called by another of OUR pools (not us) + and then we'll call the validator on their behalf to update the token payouts + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static proxiedSetTokenPayoutRatio(params: CallParams<'proxiedSetTokenPayoutRatio((uint64,uint64,uint64))(uint64[24],uint64)'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'proxiedSetTokenPayoutRatio((uint64,uint64,uint64))(uint64[24],uint64)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.poolKey], + } + } +} + +/** + * A factory to create and deploy one or more instance of the StakingPool smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class StakingPoolFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: AppFactory + + /** + * Creates a new instance of `StakingPoolFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new StakingPoolClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new StakingPoolClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the StakingPool smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: StakingPoolDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + createParams: params.createParams?.method ? StakingPoolParamsFactory.create._resolveByMethod(params.createParams) : params.createParams, + }) + return { result: result.result, appClient: new StakingPoolClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = (($this) => { + return { + /** + * Gets available create methods + */ + get create() { + return { + /** + * Creates a new instance of the StakingPool smart contract using the createApplication(uint64,uint64,uint64,uint64)void ABI method. + * + * Initialize the staking pool w/ owner and manager, but can only be created by the validator contract. + * + * @param params The params for the smart contract call + * @returns The create params + */ + createApplication(params: Expand & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appFactory.params.create(StakingPoolParamsFactory.create.createApplication(params)) + }, + } + }, + + } + })(this) + + /** + * Create transactions for the current app + */ + readonly createTransaction = (($this) => { + return { + /** + * Gets available create methods + */ + get create() { + return { + /** + * Creates a new instance of the StakingPool smart contract using the createApplication(uint64,uint64,uint64,uint64)void ABI method. + * + * Initialize the staking pool w/ owner and manager, but can only be created by the validator contract. + * + * @param params The params for the smart contract call + * @returns The create params + */ + createApplication(params: Expand & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appFactory.params.create(StakingPoolParamsFactory.create.createApplication(params)) + }, + } + }, + + } + })(this) + + /** + * Send calls to the current app + */ + readonly send = (($this) => { + return { + /** + * Gets available create methods + */ + get create() { + return { + /** + * Creates a new instance of the StakingPool smart contract using an ABI method call using the createApplication(uint64,uint64,uint64,uint64)void ABI method. + * + * Initialize the staking pool w/ owner and manager, but can only be created by the validator contract. + * + * @param params The params for the smart contract call + * @returns The create result + */ + async createApplication(params: Expand & AppClientCompilationParams & CreateSchema & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appFactory.send.create(StakingPoolParamsFactory.create.createApplication(params)) + return { result: { ...result.result, return: result.result.return as undefined | MethodReturn<'createApplication(uint64,uint64,uint64,uint64)void'> }, appClient: new StakingPoolClient(result.appClient) } + }, + } + }, + + } + })(this) + +} +/** + * A client to make calls to the StakingPool smart contract + */ +export class StakingPoolClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: AppClient + + /** + * Creates a new instance of `StakingPoolClient` + * + * @param appClient An `AppClient` instance which has been created with the StakingPool app spec + */ + constructor(appClient: AppClient) + /** + * Creates a new instance of `StakingPoolClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: AppClient | Omit) { + this.appClient = appClientOrParams instanceof AppClient ? appClientOrParams : new AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Checks for decode errors on the given return value and maps the return value to the return type for the given method + * @returns The typed return value or undefined if there was no value + */ + decodeReturnValue(method: TSignature, returnValue: ABIReturn | undefined) { + return returnValue !== undefined ? getArc56ReturnValue>(returnValue, this.appClient.getABIMethod(method), APP_SPEC.structs) : undefined + } + + /** + * Returns a new `StakingPoolClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new StakingPoolClient(await AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `StakingPoolClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new StakingPoolClient(await AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = (($this) => { + return { + /** + * Makes a clear_state call to an existing instance of the StakingPool smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState(params?: Expand) { + return $this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the StakingPool smart contract using the gas()void ABI method. + * + * gas is a dummy no-op call that can be used to pool-up resource references and opcode cost + * + * @param params The params for the smart contract call + * @returns The call params + */ + gas(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + return $this.appClient.params.call(StakingPoolParamsFactory.gas(params)) + }, + /** + * Makes a call to the StakingPool smart contract using the initStorage(pay)void ABI method. + * + * Called after we're created and then funded, so we can create our large stakers ledger storage + Caller has to get MBR amounts from ValidatorRegistry to know how much to fund us to cover the box storage cost + If this is pool 1 AND the validator has specified a reward token, opt-in to that token + so that the validator can seed the pool with future rewards of that token. + + * + * @param params The params for the smart contract call + * @returns The call params + */ + initStorage(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(StakingPoolParamsFactory.initStorage(params)) + }, + /** + * Makes a call to the StakingPool smart contract using the addStake(pay,address)uint64 ABI method. + * + * Adds stake to the given account. + Can ONLY be called by the validator contract that created us + Must receive payment from the validator contract for amount being staked. + + * + * @param params The params for the smart contract call + * @returns The call params: uint64 new 'entry round' round number of stake add + */ + addStake(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(StakingPoolParamsFactory.addStake(params)) + }, + /** + * Makes a call to the StakingPool smart contract using the removeStake(address,uint64)void ABI method. + * + * Removes stake on behalf of caller (removing own stake). If any token rewards exist, those are always sent in + full. Also notifies the validator contract for this pools validator of the staker / balance changes. + + * + * @param params The params for the smart contract call + * @returns The call params + */ + removeStake(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(StakingPoolParamsFactory.removeStake(params)) + }, + /** + * Makes a call to the StakingPool smart contract using the claimTokens()void ABI method. + * + * Claims all the available reward tokens a staker has available, sending their entire balance to the staker from + pool 1 (either directly, or via validator-pool1 to pay it out) + Also notifies the validator contract for this pools validator of the staker / balance changes. + + * + * @param params The params for the smart contract call + * @returns The call params + */ + claimTokens(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + return $this.appClient.params.call(StakingPoolParamsFactory.claimTokens(params)) + }, + /** + * Makes a call to the StakingPool smart contract using the getStakerInfo(address)(address,uint64,uint64,uint64,uint64) ABI method. + * + * Retrieves the staked information for a given staker. + * + * @param params The params for the smart contract call + * @returns The call params: StakedInfo - The staked information for the given staker. + */ + getStakerInfo(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(StakingPoolParamsFactory.getStakerInfo(params)) + }, + /** + * Makes a call to the StakingPool smart contract using the payTokenReward(address,uint64,uint64)void ABI method. + * + * [Internal protocol method] Remove a specified amount of 'community token' rewards for a staker. + This can ONLY be called by our validator and only if we're pool 1 - with the token. + Note: this can also be called by validator as part of OWNER wanting to send the reward tokens + somewhere else (ie if they're sunsetting their validator and need the reward tokens back). + It's up to the validator to ensure that the balance in rewardTokenHeldBack is honored. + + * + * @param params The params for the smart contract call + * @returns The call params + */ + payTokenReward(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(StakingPoolParamsFactory.payTokenReward(params)) + }, + /** + * Makes a call to the StakingPool smart contract using the updateAlgodVer(string)void ABI method. + * + * Update the (honor system) algod version for the node associated to this pool. The node management daemon + should compare its current nodes version to the version stored in global state, updating when different. + The reti node daemon composes its own version string using format: + major.minor.build branch [commit hash], + ie: 3.22.0 rel/stable [6b508975] + [ ONLY OWNER OR MANAGER CAN CALL ] + + * + * @param params The params for the smart contract call + * @returns The call params + */ + updateAlgodVer(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(StakingPoolParamsFactory.updateAlgodVer(params)) + }, + /** + * Makes a call to the StakingPool smart contract using the epochBalanceUpdate()void ABI method. + * + * Updates the balance of stakers in the pool based on the received 'rewards' (current balance vs known staked balance) + stakers outstanding balance is adjusted based on their % of stake and time in the current epoch - so that balance + compounds over time and staker can remove that amount at will. + The validator is paid their percentage each epoch payout. + + + Note: ANYONE can call this. + + * + * @param params The params for the smart contract call + * @returns The call params + */ + epochBalanceUpdate(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + return $this.appClient.params.call(StakingPoolParamsFactory.epochBalanceUpdate(params)) + }, + /** + * Makes a call to the StakingPool smart contract using the goOnline(pay,byte[],byte[],byte[],uint64,uint64,uint64)void ABI method. + * + * Registers a staking pool key online against a participation key. + [ ONLY OWNER OR MANAGER CAN CALL ] + + * + * @param params The params for the smart contract call + * @returns The call params + */ + goOnline(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(StakingPoolParamsFactory.goOnline(params)) + }, + /** + * Makes a call to the StakingPool smart contract using the goOffline()void ABI method. + * + * Marks a staking pool key OFFLINE. + [ ONLY OWNER OR MANAGER CAN CALL ] + + * + * @param params The params for the smart contract call + * @returns The call params + */ + goOffline(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + return $this.appClient.params.call(StakingPoolParamsFactory.goOffline(params)) + }, + /** + * Makes a call to the StakingPool smart contract using the linkToNFD(uint64,string)void ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + linkToNfd(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(StakingPoolParamsFactory.linkToNfd(params)) + }, + /** + * Makes a call to the StakingPool smart contract using the proxiedSetTokenPayoutRatio((uint64,uint64,uint64))(uint64[24],uint64) ABI method. + * + * proxiedSetTokenPayoutRatio is meant to be called by pools != 1 - calling US, pool #1 + We need to verify that we are in fact being called by another of OUR pools (not us) + and then we'll call the validator on their behalf to update the token payouts + + * + * @param params The params for the smart contract call + * @returns The call params + */ + proxiedSetTokenPayoutRatio(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(StakingPoolParamsFactory.proxiedSetTokenPayoutRatio(params)) + }, + } + })(this) + + /** + * Create transactions for the current app + */ + readonly createTransaction = (($this) => { + return { + /** + * Makes a clear_state call to an existing instance of the StakingPool smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState(params?: Expand) { + return $this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the StakingPool smart contract using the gas()void ABI method. + * + * gas is a dummy no-op call that can be used to pool-up resource references and opcode cost + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + gas(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + return $this.appClient.createTransaction.call(StakingPoolParamsFactory.gas(params)) + }, + /** + * Makes a call to the StakingPool smart contract using the initStorage(pay)void ABI method. + * + * Called after we're created and then funded, so we can create our large stakers ledger storage + Caller has to get MBR amounts from ValidatorRegistry to know how much to fund us to cover the box storage cost + If this is pool 1 AND the validator has specified a reward token, opt-in to that token + so that the validator can seed the pool with future rewards of that token. + + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + initStorage(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(StakingPoolParamsFactory.initStorage(params)) + }, + /** + * Makes a call to the StakingPool smart contract using the addStake(pay,address)uint64 ABI method. + * + * Adds stake to the given account. + Can ONLY be called by the validator contract that created us + Must receive payment from the validator contract for amount being staked. + + * + * @param params The params for the smart contract call + * @returns The call transaction: uint64 new 'entry round' round number of stake add + */ + addStake(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(StakingPoolParamsFactory.addStake(params)) + }, + /** + * Makes a call to the StakingPool smart contract using the removeStake(address,uint64)void ABI method. + * + * Removes stake on behalf of caller (removing own stake). If any token rewards exist, those are always sent in + full. Also notifies the validator contract for this pools validator of the staker / balance changes. + + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + removeStake(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(StakingPoolParamsFactory.removeStake(params)) + }, + /** + * Makes a call to the StakingPool smart contract using the claimTokens()void ABI method. + * + * Claims all the available reward tokens a staker has available, sending their entire balance to the staker from + pool 1 (either directly, or via validator-pool1 to pay it out) + Also notifies the validator contract for this pools validator of the staker / balance changes. + + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + claimTokens(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + return $this.appClient.createTransaction.call(StakingPoolParamsFactory.claimTokens(params)) + }, + /** + * Makes a call to the StakingPool smart contract using the getStakerInfo(address)(address,uint64,uint64,uint64,uint64) ABI method. + * + * Retrieves the staked information for a given staker. + * + * @param params The params for the smart contract call + * @returns The call transaction: StakedInfo - The staked information for the given staker. + */ + getStakerInfo(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(StakingPoolParamsFactory.getStakerInfo(params)) + }, + /** + * Makes a call to the StakingPool smart contract using the payTokenReward(address,uint64,uint64)void ABI method. + * + * [Internal protocol method] Remove a specified amount of 'community token' rewards for a staker. + This can ONLY be called by our validator and only if we're pool 1 - with the token. + Note: this can also be called by validator as part of OWNER wanting to send the reward tokens + somewhere else (ie if they're sunsetting their validator and need the reward tokens back). + It's up to the validator to ensure that the balance in rewardTokenHeldBack is honored. + + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + payTokenReward(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(StakingPoolParamsFactory.payTokenReward(params)) + }, + /** + * Makes a call to the StakingPool smart contract using the updateAlgodVer(string)void ABI method. + * + * Update the (honor system) algod version for the node associated to this pool. The node management daemon + should compare its current nodes version to the version stored in global state, updating when different. + The reti node daemon composes its own version string using format: + major.minor.build branch [commit hash], + ie: 3.22.0 rel/stable [6b508975] + [ ONLY OWNER OR MANAGER CAN CALL ] + + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + updateAlgodVer(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(StakingPoolParamsFactory.updateAlgodVer(params)) + }, + /** + * Makes a call to the StakingPool smart contract using the epochBalanceUpdate()void ABI method. + * + * Updates the balance of stakers in the pool based on the received 'rewards' (current balance vs known staked balance) + stakers outstanding balance is adjusted based on their % of stake and time in the current epoch - so that balance + compounds over time and staker can remove that amount at will. + The validator is paid their percentage each epoch payout. + + + Note: ANYONE can call this. + + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + epochBalanceUpdate(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + return $this.appClient.createTransaction.call(StakingPoolParamsFactory.epochBalanceUpdate(params)) + }, + /** + * Makes a call to the StakingPool smart contract using the goOnline(pay,byte[],byte[],byte[],uint64,uint64,uint64)void ABI method. + * + * Registers a staking pool key online against a participation key. + [ ONLY OWNER OR MANAGER CAN CALL ] + + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + goOnline(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(StakingPoolParamsFactory.goOnline(params)) + }, + /** + * Makes a call to the StakingPool smart contract using the goOffline()void ABI method. + * + * Marks a staking pool key OFFLINE. + [ ONLY OWNER OR MANAGER CAN CALL ] + + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + goOffline(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + return $this.appClient.createTransaction.call(StakingPoolParamsFactory.goOffline(params)) + }, + /** + * Makes a call to the StakingPool smart contract using the linkToNFD(uint64,string)void ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + linkToNfd(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(StakingPoolParamsFactory.linkToNfd(params)) + }, + /** + * Makes a call to the StakingPool smart contract using the proxiedSetTokenPayoutRatio((uint64,uint64,uint64))(uint64[24],uint64) ABI method. + * + * proxiedSetTokenPayoutRatio is meant to be called by pools != 1 - calling US, pool #1 + We need to verify that we are in fact being called by another of OUR pools (not us) + and then we'll call the validator on their behalf to update the token payouts + + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + proxiedSetTokenPayoutRatio(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(StakingPoolParamsFactory.proxiedSetTokenPayoutRatio(params)) + }, + } + })(this) + + /** + * Send calls to the current app + */ + readonly send = (($this) => { + return { + /** + * Makes a clear_state call to an existing instance of the StakingPool smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState(params?: Expand) { + return $this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the StakingPool smart contract using the gas()void ABI method. + * + * gas is a dummy no-op call that can be used to pool-up resource references and opcode cost + * + * @param params The params for the smart contract call + * @returns The call result + */ + async gas(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + const result = await $this.appClient.send.call(StakingPoolParamsFactory.gas(params)) + return {...result, return: result.return as undefined | MethodReturn<'gas()void'>} + }, + /** + * Makes a call to the StakingPool smart contract using the initStorage(pay)void ABI method. + * + * Called after we're created and then funded, so we can create our large stakers ledger storage + Caller has to get MBR amounts from ValidatorRegistry to know how much to fund us to cover the box storage cost + If this is pool 1 AND the validator has specified a reward token, opt-in to that token + so that the validator can seed the pool with future rewards of that token. + + * + * @param params The params for the smart contract call + * @returns The call result + */ + async initStorage(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(StakingPoolParamsFactory.initStorage(params)) + return {...result, return: result.return as undefined | MethodReturn<'initStorage(pay)void'>} + }, + /** + * Makes a call to the StakingPool smart contract using the addStake(pay,address)uint64 ABI method. + * + * Adds stake to the given account. + Can ONLY be called by the validator contract that created us + Must receive payment from the validator contract for amount being staked. + + * + * @param params The params for the smart contract call + * @returns The call result: uint64 new 'entry round' round number of stake add + */ + async addStake(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(StakingPoolParamsFactory.addStake(params)) + return {...result, return: result.return as undefined | MethodReturn<'addStake(pay,address)uint64'>} + }, + /** + * Makes a call to the StakingPool smart contract using the removeStake(address,uint64)void ABI method. + * + * Removes stake on behalf of caller (removing own stake). If any token rewards exist, those are always sent in + full. Also notifies the validator contract for this pools validator of the staker / balance changes. + + * + * @param params The params for the smart contract call + * @returns The call result + */ + async removeStake(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(StakingPoolParamsFactory.removeStake(params)) + return {...result, return: result.return as undefined | MethodReturn<'removeStake(address,uint64)void'>} + }, + /** + * Makes a call to the StakingPool smart contract using the claimTokens()void ABI method. + * + * Claims all the available reward tokens a staker has available, sending their entire balance to the staker from + pool 1 (either directly, or via validator-pool1 to pay it out) + Also notifies the validator contract for this pools validator of the staker / balance changes. + + * + * @param params The params for the smart contract call + * @returns The call result + */ + async claimTokens(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + const result = await $this.appClient.send.call(StakingPoolParamsFactory.claimTokens(params)) + return {...result, return: result.return as undefined | MethodReturn<'claimTokens()void'>} + }, + /** + * Makes a call to the StakingPool smart contract using the getStakerInfo(address)(address,uint64,uint64,uint64,uint64) ABI method. + * + * Retrieves the staked information for a given staker. + * + * @param params The params for the smart contract call + * @returns The call result: StakedInfo - The staked information for the given staker. + */ + async getStakerInfo(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(StakingPoolParamsFactory.getStakerInfo(params)) + return {...result, return: result.return as undefined | MethodReturn<'getStakerInfo(address)(address,uint64,uint64,uint64,uint64)'>} + }, + /** + * Makes a call to the StakingPool smart contract using the payTokenReward(address,uint64,uint64)void ABI method. + * + * [Internal protocol method] Remove a specified amount of 'community token' rewards for a staker. + This can ONLY be called by our validator and only if we're pool 1 - with the token. + Note: this can also be called by validator as part of OWNER wanting to send the reward tokens + somewhere else (ie if they're sunsetting their validator and need the reward tokens back). + It's up to the validator to ensure that the balance in rewardTokenHeldBack is honored. + + * + * @param params The params for the smart contract call + * @returns The call result + */ + async payTokenReward(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(StakingPoolParamsFactory.payTokenReward(params)) + return {...result, return: result.return as undefined | MethodReturn<'payTokenReward(address,uint64,uint64)void'>} + }, + /** + * Makes a call to the StakingPool smart contract using the updateAlgodVer(string)void ABI method. + * + * Update the (honor system) algod version for the node associated to this pool. The node management daemon + should compare its current nodes version to the version stored in global state, updating when different. + The reti node daemon composes its own version string using format: + major.minor.build branch [commit hash], + ie: 3.22.0 rel/stable [6b508975] + [ ONLY OWNER OR MANAGER CAN CALL ] + + * + * @param params The params for the smart contract call + * @returns The call result + */ + async updateAlgodVer(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(StakingPoolParamsFactory.updateAlgodVer(params)) + return {...result, return: result.return as undefined | MethodReturn<'updateAlgodVer(string)void'>} + }, + /** + * Makes a call to the StakingPool smart contract using the epochBalanceUpdate()void ABI method. + * + * Updates the balance of stakers in the pool based on the received 'rewards' (current balance vs known staked balance) + stakers outstanding balance is adjusted based on their % of stake and time in the current epoch - so that balance + compounds over time and staker can remove that amount at will. + The validator is paid their percentage each epoch payout. + + + Note: ANYONE can call this. + + * + * @param params The params for the smart contract call + * @returns The call result + */ + async epochBalanceUpdate(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + const result = await $this.appClient.send.call(StakingPoolParamsFactory.epochBalanceUpdate(params)) + return {...result, return: result.return as undefined | MethodReturn<'epochBalanceUpdate()void'>} + }, + /** + * Makes a call to the StakingPool smart contract using the goOnline(pay,byte[],byte[],byte[],uint64,uint64,uint64)void ABI method. + * + * Registers a staking pool key online against a participation key. + [ ONLY OWNER OR MANAGER CAN CALL ] + + * + * @param params The params for the smart contract call + * @returns The call result + */ + async goOnline(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(StakingPoolParamsFactory.goOnline(params)) + return {...result, return: result.return as undefined | MethodReturn<'goOnline(pay,byte[],byte[],byte[],uint64,uint64,uint64)void'>} + }, + /** + * Makes a call to the StakingPool smart contract using the goOffline()void ABI method. + * + * Marks a staking pool key OFFLINE. + [ ONLY OWNER OR MANAGER CAN CALL ] + + * + * @param params The params for the smart contract call + * @returns The call result + */ + async goOffline(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + const result = await $this.appClient.send.call(StakingPoolParamsFactory.goOffline(params)) + return {...result, return: result.return as undefined | MethodReturn<'goOffline()void'>} + }, + /** + * Makes a call to the StakingPool smart contract using the linkToNFD(uint64,string)void ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async linkToNfd(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(StakingPoolParamsFactory.linkToNfd(params)) + return {...result, return: result.return as undefined | MethodReturn<'linkToNFD(uint64,string)void'>} + }, + /** + * Makes a call to the StakingPool smart contract using the proxiedSetTokenPayoutRatio((uint64,uint64,uint64))(uint64[24],uint64) ABI method. + * + * proxiedSetTokenPayoutRatio is meant to be called by pools != 1 - calling US, pool #1 + We need to verify that we are in fact being called by another of OUR pools (not us) + and then we'll call the validator on their behalf to update the token payouts + + * + * @param params The params for the smart contract call + * @returns The call result + */ + async proxiedSetTokenPayoutRatio(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(StakingPoolParamsFactory.proxiedSetTokenPayoutRatio(params)) + return {...result, return: result.return as undefined | MethodReturn<'proxiedSetTokenPayoutRatio((uint64,uint64,uint64))(uint64[24],uint64)'>} + }, + } + })(this) + + /** + * Methods to access state for the current StakingPool app + */ + state = { + /** + * Methods to access global state for the current StakingPool app + */ + global: { + /** + * Get all current keyed values from global state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.global.getAll() + return { + creatingValidatorContractAppId: result.creatingValidatorContractAppId, + validatorId: result.validatorId, + poolId: result.poolId, + numStakers: result.numStakers, + totalAlgoStaked: result.totalAlgoStaked, + minEntryStake: result.minEntryStake, + lastPayout: result.lastPayout, + epochNumber: result.epochNumber, + algodVer: result.algodVer, + roundsPerDay: result.roundsPerDay, + binRoundStart: result.binRoundStart, + stakeAccumulator: result.stakeAccumulator, + rewardAccumulator: result.rewardAccumulator, + weightedMovingAverage: result.weightedMovingAverage, + } + }, + /** + * Get the current value of the creatingValidatorContractAppId key in global state + */ + creatingValidatorContractAppId: async (): Promise => { return (await this.appClient.state.global.getValue("creatingValidatorContractAppId")) as bigint | undefined }, + /** + * Get the current value of the validatorId key in global state + */ + validatorId: async (): Promise => { return (await this.appClient.state.global.getValue("validatorId")) as bigint | undefined }, + /** + * Get the current value of the poolId key in global state + */ + poolId: async (): Promise => { return (await this.appClient.state.global.getValue("poolId")) as bigint | undefined }, + /** + * Get the current value of the numStakers key in global state + */ + numStakers: async (): Promise => { return (await this.appClient.state.global.getValue("numStakers")) as bigint | undefined }, + /** + * Get the current value of the totalAlgoStaked key in global state + */ + totalAlgoStaked: async (): Promise => { return (await this.appClient.state.global.getValue("totalAlgoStaked")) as bigint | undefined }, + /** + * Get the current value of the minEntryStake key in global state + */ + minEntryStake: async (): Promise => { return (await this.appClient.state.global.getValue("minEntryStake")) as bigint | undefined }, + /** + * Get the current value of the lastPayout key in global state + */ + lastPayout: async (): Promise => { return (await this.appClient.state.global.getValue("lastPayout")) as bigint | undefined }, + /** + * Get the current value of the epochNumber key in global state + */ + epochNumber: async (): Promise => { return (await this.appClient.state.global.getValue("epochNumber")) as bigint | undefined }, + /** + * Get the current value of the algodVer key in global state + */ + algodVer: async (): Promise => { return (await this.appClient.state.global.getValue("algodVer")) as Uint8Array | undefined }, + /** + * Get the current value of the roundsPerDay key in global state + */ + roundsPerDay: async (): Promise => { return (await this.appClient.state.global.getValue("roundsPerDay")) as bigint | undefined }, + /** + * Get the current value of the binRoundStart key in global state + */ + binRoundStart: async (): Promise => { return (await this.appClient.state.global.getValue("binRoundStart")) as bigint | undefined }, + /** + * Get the current value of the stakeAccumulator key in global state + */ + stakeAccumulator: async (): Promise => { return (await this.appClient.state.global.getValue("stakeAccumulator")) as bigint | undefined }, + /** + * Get the current value of the rewardAccumulator key in global state + */ + rewardAccumulator: async (): Promise => { return (await this.appClient.state.global.getValue("rewardAccumulator")) as bigint | undefined }, + /** + * Get the current value of the weightedMovingAverage key in global state + */ + weightedMovingAverage: async (): Promise => { return (await this.appClient.state.global.getValue("weightedMovingAverage")) as bigint | undefined }, + }, + /** + * Methods to access box state for the current StakingPool app + */ + box: { + /** + * Get all current keyed values from box state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.box.getAll() + return { + stakers: result.stakers, + } + }, + /** + * Get the current value of the stakers key in box state + */ + stakers: async (): Promise<[[string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint]] | undefined> => { return (await this.appClient.state.box.getValue("stakers")) as [[string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint], [string, bigint, bigint, bigint, bigint]] | undefined }, + }, + } + + public newGroup(): StakingPoolComposer { + const client = this + const composer = client.appClient.newGroup() + let promiseChain:Promise = Promise.resolve() + const resultMappers: Array any)> = [] + return { + /** + * Add a gas()void method call against the StakingPool contract + */ + gas(params: CallParams<'gas()void'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.gas(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a initStorage(pay)void method call against the StakingPool contract + */ + initStorage(params: CallParams<'initStorage(pay)void'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.initStorage(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a addStake(pay,address)uint64 method call against the StakingPool contract + */ + addStake(params: CallParams<'addStake(pay,address)uint64'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.addStake(params))) + resultMappers.push((v) => client.decodeReturnValue('addStake(pay,address)uint64', v)) + return this + }, + /** + * Add a removeStake(address,uint64)void method call against the StakingPool contract + */ + removeStake(params: CallParams<'removeStake(address,uint64)void'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.removeStake(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a claimTokens()void method call against the StakingPool contract + */ + claimTokens(params: CallParams<'claimTokens()void'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.claimTokens(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a getStakerInfo(address)(address,uint64,uint64,uint64,uint64) method call against the StakingPool contract + */ + getStakerInfo(params: CallParams<'getStakerInfo(address)(address,uint64,uint64,uint64,uint64)'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getStakerInfo(params))) + resultMappers.push((v) => client.decodeReturnValue('getStakerInfo(address)(address,uint64,uint64,uint64,uint64)', v)) + return this + }, + /** + * Add a payTokenReward(address,uint64,uint64)void method call against the StakingPool contract + */ + payTokenReward(params: CallParams<'payTokenReward(address,uint64,uint64)void'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.payTokenReward(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a updateAlgodVer(string)void method call against the StakingPool contract + */ + updateAlgodVer(params: CallParams<'updateAlgodVer(string)void'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateAlgodVer(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a epochBalanceUpdate()void method call against the StakingPool contract + */ + epochBalanceUpdate(params: CallParams<'epochBalanceUpdate()void'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.epochBalanceUpdate(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a goOnline(pay,byte[],byte[],byte[],uint64,uint64,uint64)void method call against the StakingPool contract + */ + goOnline(params: CallParams<'goOnline(pay,byte[],byte[],byte[],uint64,uint64,uint64)void'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.goOnline(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a goOffline()void method call against the StakingPool contract + */ + goOffline(params: CallParams<'goOffline()void'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.goOffline(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a linkToNFD(uint64,string)void method call against the StakingPool contract + */ + linkToNfd(params: CallParams<'linkToNFD(uint64,string)void'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.linkToNfd(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a proxiedSetTokenPayoutRatio((uint64,uint64,uint64))(uint64[24],uint64) method call against the StakingPool contract + */ + proxiedSetTokenPayoutRatio(params: CallParams<'proxiedSetTokenPayoutRatio((uint64,uint64,uint64))(uint64[24],uint64)'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.proxiedSetTokenPayoutRatio(params))) + resultMappers.push((v) => client.decodeReturnValue('proxiedSetTokenPayoutRatio((uint64,uint64,uint64))(uint64[24],uint64)', v)) + return this + }, + /** + * Add a clear state call to the StakingPool contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await composer.simulate(options) + return { + ...result, + returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) + } + } + } as unknown as StakingPoolComposer + } +} +export type StakingPoolComposer = { + /** + * Calls the gas()void ABI method. + * + * gas is a dummy no-op call that can be used to pool-up resource references and opcode cost + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + gas(params?: CallParams<'gas()void'>): StakingPoolComposer<[...TReturns, MethodReturn<'gas()void'> | undefined]> + + /** + * Calls the initStorage(pay)void ABI method. + * + * Called after we're created and then funded, so we can create our large stakers ledger storage + Caller has to get MBR amounts from ValidatorRegistry to know how much to fund us to cover the box storage cost + If this is pool 1 AND the validator has specified a reward token, opt-in to that token + so that the validator can seed the pool with future rewards of that token. + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + initStorage(params?: CallParams<'initStorage(pay)void'>): StakingPoolComposer<[...TReturns, MethodReturn<'initStorage(pay)void'> | undefined]> + + /** + * Calls the addStake(pay,address)uint64 ABI method. + * + * Adds stake to the given account. + Can ONLY be called by the validator contract that created us + Must receive payment from the validator contract for amount being staked. + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + addStake(params?: CallParams<'addStake(pay,address)uint64'>): StakingPoolComposer<[...TReturns, MethodReturn<'addStake(pay,address)uint64'> | undefined]> + + /** + * Calls the removeStake(address,uint64)void ABI method. + * + * Removes stake on behalf of caller (removing own stake). If any token rewards exist, those are always sent in + full. Also notifies the validator contract for this pools validator of the staker / balance changes. + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + removeStake(params?: CallParams<'removeStake(address,uint64)void'>): StakingPoolComposer<[...TReturns, MethodReturn<'removeStake(address,uint64)void'> | undefined]> + + /** + * Calls the claimTokens()void ABI method. + * + * Claims all the available reward tokens a staker has available, sending their entire balance to the staker from + pool 1 (either directly, or via validator-pool1 to pay it out) + Also notifies the validator contract for this pools validator of the staker / balance changes. + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + claimTokens(params?: CallParams<'claimTokens()void'>): StakingPoolComposer<[...TReturns, MethodReturn<'claimTokens()void'> | undefined]> + + /** + * Calls the getStakerInfo(address)(address,uint64,uint64,uint64,uint64) ABI method. + * + * Retrieves the staked information for a given staker. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getStakerInfo(params?: CallParams<'getStakerInfo(address)(address,uint64,uint64,uint64,uint64)'>): StakingPoolComposer<[...TReturns, MethodReturn<'getStakerInfo(address)(address,uint64,uint64,uint64,uint64)'> | undefined]> + + /** + * Calls the payTokenReward(address,uint64,uint64)void ABI method. + * + * [Internal protocol method] Remove a specified amount of 'community token' rewards for a staker. + This can ONLY be called by our validator and only if we're pool 1 - with the token. + Note: this can also be called by validator as part of OWNER wanting to send the reward tokens + somewhere else (ie if they're sunsetting their validator and need the reward tokens back). + It's up to the validator to ensure that the balance in rewardTokenHeldBack is honored. + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + payTokenReward(params?: CallParams<'payTokenReward(address,uint64,uint64)void'>): StakingPoolComposer<[...TReturns, MethodReturn<'payTokenReward(address,uint64,uint64)void'> | undefined]> + + /** + * Calls the updateAlgodVer(string)void ABI method. + * + * Update the (honor system) algod version for the node associated to this pool. The node management daemon + should compare its current nodes version to the version stored in global state, updating when different. + The reti node daemon composes its own version string using format: + major.minor.build branch [commit hash], + ie: 3.22.0 rel/stable [6b508975] + [ ONLY OWNER OR MANAGER CAN CALL ] + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + updateAlgodVer(params?: CallParams<'updateAlgodVer(string)void'>): StakingPoolComposer<[...TReturns, MethodReturn<'updateAlgodVer(string)void'> | undefined]> + + /** + * Calls the epochBalanceUpdate()void ABI method. + * + * Updates the balance of stakers in the pool based on the received 'rewards' (current balance vs known staked balance) + stakers outstanding balance is adjusted based on their % of stake and time in the current epoch - so that balance + compounds over time and staker can remove that amount at will. + The validator is paid their percentage each epoch payout. + + + Note: ANYONE can call this. + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + epochBalanceUpdate(params?: CallParams<'epochBalanceUpdate()void'>): StakingPoolComposer<[...TReturns, MethodReturn<'epochBalanceUpdate()void'> | undefined]> + + /** + * Calls the goOnline(pay,byte[],byte[],byte[],uint64,uint64,uint64)void ABI method. + * + * Registers a staking pool key online against a participation key. + [ ONLY OWNER OR MANAGER CAN CALL ] + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + goOnline(params?: CallParams<'goOnline(pay,byte[],byte[],byte[],uint64,uint64,uint64)void'>): StakingPoolComposer<[...TReturns, MethodReturn<'goOnline(pay,byte[],byte[],byte[],uint64,uint64,uint64)void'> | undefined]> + + /** + * Calls the goOffline()void ABI method. + * + * Marks a staking pool key OFFLINE. + [ ONLY OWNER OR MANAGER CAN CALL ] + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + goOffline(params?: CallParams<'goOffline()void'>): StakingPoolComposer<[...TReturns, MethodReturn<'goOffline()void'> | undefined]> + + /** + * Calls the linkToNFD(uint64,string)void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + linkToNfd(params?: CallParams<'linkToNFD(uint64,string)void'>): StakingPoolComposer<[...TReturns, MethodReturn<'linkToNFD(uint64,string)void'> | undefined]> + + /** + * Calls the proxiedSetTokenPayoutRatio((uint64,uint64,uint64))(uint64[24],uint64) ABI method. + * + * proxiedSetTokenPayoutRatio is meant to be called by pools != 1 - calling US, pool #1 + We need to verify that we are in fact being called by another of OUR pools (not us) + and then we'll call the validator on their behalf to update the token payouts + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + proxiedSetTokenPayoutRatio(params?: CallParams<'proxiedSetTokenPayoutRatio((uint64,uint64,uint64))(uint64[24],uint64)'>): StakingPoolComposer<[...TReturns, MethodReturn<'proxiedSetTokenPayoutRatio((uint64,uint64,uint64))(uint64[24],uint64)'> | undefined]> + + /** + * Makes a clear_state call to an existing instance of the StakingPool smart contract. + * + * @param args The arguments for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): StakingPoolComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): StakingPoolComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): AlgoKitComposer + /** + * Simulates the transaction group and returns the result + */ + simulate(options?: SimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type StakingPoolComposerResults = Expand + diff --git a/contracts/contracts/clients_new/ValidatorRegistryClient.ts b/contracts/contracts/clients_new/ValidatorRegistryClient.ts new file mode 100644 index 00000000..22ffc317 --- /dev/null +++ b/contracts/contracts/clients_new/ValidatorRegistryClient.ts @@ -0,0 +1,3614 @@ +/* eslint-disable */ +// @ts-nocheck +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^7 + */ +import { ABIReturn, AppReturn, SendAppTransactionResult } from '@algorandfoundation/algokit-utils/types/app' +import { Arc56Contract, getArc56ReturnValue } from '@algorandfoundation/algokit-utils/types/app-arc56' +import { + AppClient, + AppClientMethodCallParams, + AppClientParams, + AppClientBareCallParams, + CallOnComplete, + AppClientCompilationParams, + ResolveAppClientByCreatorAndName, + ResolveAppClientByNetwork, +} from '@algorandfoundation/algokit-utils/types/app-client' +import { AppFactory, AppFactoryAppClientParams, AppFactoryResolveAppClientByCreatorAndNameParams, AppFactoryDeployParams, AppFactoryParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import AlgoKitComposer, { AppCallMethodCall, AppMethodCallTransactionArgument, SimulateOptions } from '@algorandfoundation/algokit-utils/types/composer' +import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' +import SimulateResponse = modelsv2.SimulateResponse + +export const APP_SPEC: Arc56Contract = {"name":"ValidatorRegistry","desc":"","methods":[{"name":"createApplication","args":[],"returns":{"type":"void"},"actions":{"create":["NoOp"],"call":[]}},{"name":"initStakingContract","args":[{"name":"approvalProgramSize","type":"uint64"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]}},{"name":"loadStakingContractData","args":[{"name":"offset","type":"uint64"},{"name":"data","type":"byte[]"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]}},{"name":"finalizeStakingContract","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]}},{"name":"gas","desc":"gas is a dummy no-op call that can be used to pool-up resource references and opcode cost","args":[],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]}},{"name":"getMbrAmounts","desc":"Returns the MBR amounts needed for various actions:\n[\n addValidatorMbr: uint64 - mbr needed to add a new validator - paid to validator contract\n addPoolMbr: uint64 - mbr needed to add a new pool - paid to validator\n poolInitMbr: uint64 - mbr needed to initStorage() of pool - paid to pool itself\n addStakerMbr: uint64 - mbr staker needs to add to first staking payment (stays w/ validator)\n]","args":[],"returns":{"type":"(uint64,uint64,uint64,uint64)","struct":"MbrAmounts"},"actions":{"create":[],"call":["NoOp"]}},{"name":"getProtocolConstraints","desc":"Returns the protocol constraints so that UIs can limit what users specify for validator configuration parameters.","args":[],"returns":{"type":"(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)","struct":"Constraints"},"actions":{"create":[],"call":["NoOp"]}},{"name":"getNumValidators","desc":"Returns the current number of validators","readonly":true,"args":[],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]}},{"name":"getValidatorConfig","readonly":true,"args":[{"name":"validatorId","type":"uint64"}],"returns":{"type":"(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64)","struct":"ValidatorConfig"},"actions":{"create":[],"call":["NoOp"]}},{"name":"getValidatorState","readonly":true,"args":[{"name":"validatorId","type":"uint64"}],"returns":{"type":"(uint16,uint64,uint64,uint64)","struct":"ValidatorCurState"},"actions":{"create":[],"call":["NoOp"]}},{"name":"getValidatorOwnerAndManager","readonly":true,"args":[{"name":"validatorId","type":"uint64"}],"returns":{"type":"(address,address)"},"actions":{"create":[],"call":["NoOp"]}},{"name":"getPools","desc":"Return list of all pools for this validator.","readonly":true,"args":[{"name":"validatorId","type":"uint64","desc":"PoolInfo[] - array of pools\nNot callable from other contracts because 1K return but can be called w/ simulate which bumps log returns"}],"returns":{"type":"(uint64,uint16,uint64)[]"},"actions":{"create":[],"call":["NoOp"]}},{"name":"getPoolAppId","desc":"getPoolAppId is useful for callers to determine app to call for removing stake if they don't have staking or\nwant to get staker list for an account. The staking pool also uses it to get the app id of staking pool 1\n(which contains reward tokens if being used) so that the amount available can be determined.","readonly":true,"args":[{"name":"validatorId","type":"uint64"},{"name":"poolId","type":"uint64"}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]}},{"name":"getPoolInfo","readonly":true,"args":[{"name":"poolKey","type":"(uint64,uint64,uint64)","struct":"ValidatorPoolKey"}],"returns":{"type":"(uint64,uint16,uint64)","struct":"PoolInfo"},"actions":{"create":[],"call":["NoOp"]}},{"name":"getCurMaxStakePerPool","desc":"Calculate the maximum stake per pool for a given validator.\nNormally this would be maxAlgoPerPool, but it should also never go above MaxAllowedStake / numPools so\nas pools are added the max allowed per pool can reduce.","readonly":true,"args":[{"name":"validatorId","type":"uint64","desc":"The id of the validator."}],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]}},{"name":"doesStakerNeedToPayMBR","desc":"Helper callers can call w/ simulate to determine if 'AddStaker' MBR should be included w/ staking amount","readonly":true,"args":[{"name":"staker","type":"address"}],"returns":{"type":"bool"},"actions":{"create":[],"call":["NoOp"]}},{"name":"getStakedPoolsForAccount","desc":"Retrieves the staked pools for an account.","readonly":true,"args":[{"name":"staker","type":"address","desc":"The account to retrieve staked pools for.\n ValidatorPoolKey[] - The array of staked pools for the account."}],"returns":{"type":"(uint64,uint64,uint64)[]"},"actions":{"create":[],"call":["NoOp"]}},{"name":"getTokenPayoutRatio","desc":"Retrieves the token payout ratio for a given validator - returning the pool ratios of whole so that token\npayouts across pools can be based on a stable snaphost of stake.","readonly":true,"args":[{"name":"validatorId","type":"uint64","desc":"The id of the validator.\n PoolTokenPayoutRatio - The token payout ratio for the validator."}],"returns":{"type":"(uint64[24],uint64)","struct":"PoolTokenPayoutRatio"},"actions":{"create":[],"call":["NoOp"]}},{"name":"getNodePoolAssignments","readonly":true,"args":[{"name":"validatorId","type":"uint64"}],"returns":{"type":"((uint64[3])[8])","struct":"NodePoolAssignmentConfig"},"actions":{"create":[],"call":["NoOp"]}},{"name":"getNFDRegistryID","readonly":true,"args":[],"returns":{"type":"uint64"},"actions":{"create":[],"call":["NoOp"]}},{"name":"addValidator","desc":"Adds a new validator\nRequires at least 10 ALGO as the 'fee' for the transaction to help dissuade spammed validator adds.","args":[{"name":"mbrPayment","type":"pay","desc":"payment from caller which covers mbr increase of new validator storage"},{"name":"nfdName","type":"string","desc":"(Optional) Name of nfd (used as double-check against id specified in config)"},{"name":"config","type":"(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64)","desc":"ValidatorConfig struct","struct":"ValidatorConfig"}],"returns":{"type":"uint64","desc":"uint64 validator id"},"events":[{"name":"retiOP_addedValidator","args":[{"name":"id","type":"uint64"},{"name":"owner","type":"address"},{"name":"manager","type":"address"}],"desc":"Logs the addition of a new validator to the system, its initial owner and manager"}],"actions":{"create":[],"call":["NoOp"]}},{"name":"changeValidatorManager","desc":"Changes the Validator manager for a specific Validator id.\n[ ONLY OWNER CAN CHANGE ]","args":[{"name":"validatorId","type":"uint64","desc":"The id of the validator to change the manager for."},{"name":"manager","type":"address","desc":"The new manager address."}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]}},{"name":"changeValidatorSunsetInfo","desc":"Updates the sunset information for a given validator.\n[ ONLY OWNER CAN CHANGE ]","args":[{"name":"validatorId","type":"uint64","desc":"The id of the validator to update."},{"name":"sunsettingOn","type":"uint64","desc":"The new sunset timestamp."},{"name":"sunsettingTo","type":"uint64","desc":"The new sunset to validator id."}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]}},{"name":"changeValidatorNFD","desc":"Changes the NFD for a validator in the validatorList contract.\n[ ONLY OWNER CAN CHANGE ]","args":[{"name":"validatorId","type":"uint64","desc":"The id of the validator to update."},{"name":"nfdAppID","type":"uint64","desc":"The application id of the NFD to assign to the validator."},{"name":"nfdName","type":"string","desc":"The name of the NFD (which must match)"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]}},{"name":"changeValidatorCommissionAddress","desc":"Change the commission address that validator rewards are sent to.\n [ ONLY OWNER CAN CHANGE ]","args":[{"name":"validatorId","type":"uint64"},{"name":"commissionAddress","type":"address"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]}},{"name":"changeValidatorRewardInfo","desc":"Allow the additional rewards (gating entry, additional token rewards) information be changed at will.\n[ ONLY OWNER CAN CHANGE ]","args":[{"name":"validatorId","type":"uint64"},{"name":"EntryGatingType","type":"uint8"},{"name":"EntryGatingAddress","type":"address"},{"name":"EntryGatingAssets","type":"uint64[4]"},{"name":"GatingAssetMinBalance","type":"uint64"},{"name":"RewardPerPayout","type":"uint64"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]}},{"name":"addPool","desc":"Adds a new pool to a validator's pool set, returning the 'key' to reference the pool in the future for staking, etc.\nThe caller must pay the cost of the validators MBR increase as well as the MBR that will be needed for the pool itself.\n\n\n[ ONLY OWNER OR MANAGER CAN call ]","args":[{"name":"mbrPayment","type":"pay","desc":"payment from caller which covers mbr increase of adding a new pool"},{"name":"validatorId","type":"uint64","desc":"is id of validator to pool to (must be owner or manager)"},{"name":"nodeNum","type":"uint64","desc":"is node number to add to"}],"returns":{"type":"(uint64,uint64,uint64)","desc":"ValidatorPoolKey pool key to created pool","struct":"ValidatorPoolKey"},"events":[{"name":"retiOP_validatorAddedPool","args":[{"name":"id","type":"uint64"},{"name":"num","type":"uint16"},{"name":"poolAppId","type":"uint64"}],"desc":"Logs the addition of a new pool to a particular validator ID"}],"actions":{"create":[],"call":["NoOp"]}},{"name":"addStake","desc":"Adds stake to a validator pool.","args":[{"name":"stakedAmountPayment","type":"pay","desc":"payment coming from staker to place into a pool"},{"name":"validatorId","type":"uint64","desc":"The id of the validator."},{"name":"valueToVerify","type":"uint64","desc":"only if validator has gating to enter - this is asset id or nfd id that corresponds to gating.\nTxn sender is factored in as well if that is part of gating.\n*"}],"returns":{"type":"(uint64,uint64,uint64)","desc":"ValidatorPoolKey - The key of the validator pool.","struct":"ValidatorPoolKey"},"events":[{"name":"retiOP_stakeAdded","args":[{"name":"id","type":"uint64"},{"name":"poolNum","type":"uint16"},{"name":"poolAppId","type":"uint64"},{"name":"staker","type":"address"},{"name":"amountStaked","type":"uint64"}],"desc":"Logs how much stake was added by a staker to a particular staking pool"}],"actions":{"create":[],"call":["NoOp"]}},{"name":"setTokenPayoutRatio","desc":"setTokenPayoutRatio is called by Staking Pool # 1 (ONLY) to ask the validator (us) to calculate the ratios\nof stake in the pools for subsequent token payouts (ie: 2 pools, '100' algo total staked, 60 in pool 1, and 40\nin pool 2) This is done so we have a stable snapshot of stake - taken once per epoch - only triggered by\npool 1 doing payout. pools other than 1 doing payout call pool 1 to ask it do it first.\nIt would be 60/40% in the poolPctOfWhole values. The token reward payouts then use these values instead of\ntheir 'current' stake which changes as part of the payouts themselves (and people could be changing stake\nduring the epoch updates across pools)\n\n\nMultiple pools will call us via pool 1 (pool2-pool1-validator, etc.) so don't assert on pool1 calling multiple\ntimes in same epoch. Just return.","args":[{"name":"validatorId","type":"uint64","desc":"validator id (and thus pool) calling us. Verified so that sender MUST be pool 1 of this validator."}],"returns":{"type":"(uint64[24],uint64)","desc":"PoolTokenPayoutRatio - the finished ratio data","struct":"PoolTokenPayoutRatio"},"actions":{"create":[],"call":["NoOp"]}},{"name":"stakeUpdatedViaRewards","desc":"stakeUpdatedViaRewards is called by Staking pools to inform the validator (us) that a particular amount of total\nstake has been added to the specified pool. This is used to update the stats we have in our PoolInfo storage.\nThe calling App id is validated against our pool list as well.","args":[{"name":"poolKey","type":"(uint64,uint64,uint64)","desc":"ValidatorPoolKey type","struct":"ValidatorPoolKey"},{"name":"algoToAdd","type":"uint64","desc":"amount this validator's total stake increased via rewards"},{"name":"rewardTokenAmountReserved","type":"uint64","desc":"amount this validator's total stake increased via rewards (that should be"},{"name":"validatorCommission","type":"uint64","desc":"the commission amount the validator was paid, if any"},{"name":"saturatedBurnToFeeSink","type":"uint64","desc":"if the pool was in saturated state, the amount sent back to the fee sink.\nseen as 'accounted for/pending spent')"}],"returns":{"type":"void"},"events":[{"name":"retiOP_epochRewardUpdate","args":[{"name":"id","type":"uint64"},{"name":"poolNum","type":"uint16"},{"name":"poolAppId","type":"uint64"},{"name":"validatorCommission","type":"uint64"},{"name":"saturatedBurnToFeeSink","type":"uint64"},{"name":"algoAdded","type":"uint64"},{"name":"rewardTokenHeldBack","type":"uint64"}],"desc":"Logs how much algo was detected as being added to a staking pool as part of epoch reward calculations.\r\nCommission amount to validator, excess burned if pool is saturated, and the amount of tokens held back are logged as well."}],"actions":{"create":[],"call":["NoOp"]}},{"name":"stakeRemoved","desc":"stakeRemoved is called by Staking pools to inform the validator (us) that a particular amount of total stake has been removed\nfrom the specified pool. This is used to update the stats we have in our PoolInfo storage.\nIf any amount of rewardRemoved is specified, then that amount of reward is sent to the use\nThe calling App id is validated against our pool list as well.","args":[{"name":"poolKey","type":"(uint64,uint64,uint64)","desc":"calling us from which stake was removed","struct":"ValidatorPoolKey"},{"name":"staker","type":"address"},{"name":"amountRemoved","type":"uint64","desc":"algo amount removed"},{"name":"rewardRemoved","type":"uint64","desc":"if applicable, amount of token reward removed (by pool 1 caller) or TO remove and pay out (via pool 1 from different pool caller)"},{"name":"stakerRemoved","type":"bool"}],"returns":{"type":"void"},"events":[{"name":"retiOP_stakeRemoved","args":[{"name":"id","type":"uint64"},{"name":"poolNum","type":"uint16"},{"name":"poolAppId","type":"uint64"},{"name":"staker","type":"address"},{"name":"amountUnstaked","type":"uint64"},{"name":"rewardTokensReceived","type":"uint64"},{"name":"rewardTokenAssetId","type":"uint64"}],"desc":"Logs how much stake was removed by a staker from a particular staking pool"}],"actions":{"create":[],"call":["NoOp"]}},{"name":"findPoolForStaker","desc":"Finds the pool for a staker based on the provided validator id, staker address, and amount to stake.\nFirst checks the stakers 'already staked list' for the validator preferring those (adding if possible) then adds\nto new pool if necessary.","readonly":true,"args":[{"name":"validatorId","type":"uint64","desc":"The id of the validator."},{"name":"staker","type":"address","desc":"The address of the staker."},{"name":"amountToStake","type":"uint64","desc":"The amount to stake."}],"returns":{"type":"((uint64,uint64,uint64),bool,bool)","desc":"ValidatorPoolKey, boolean, boolean - The pool for the staker, true/false on whether the staker is 'new'\nto this VALIDATOR, and true/false if staker is new to the protocol."},"actions":{"create":[],"call":["NoOp"]}},{"name":"movePoolToNode","desc":"Find the specified pool (in any node number) and move it to the specified node.\nThe pool account is forced offline if moved so prior node will still run for 320 rounds but\nnew key goes online on new node soon after (320 rounds after it goes online)\nNo-op if success, asserts if not found or can't move (no space in target)\n[ ONLY OWNER OR MANAGER CAN CHANGE ]","args":[{"name":"validatorId","type":"uint64","desc":"The id of the validator."},{"name":"poolAppId","type":"uint64"},{"name":"nodeNum","type":"uint64"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]}},{"name":"emptyTokenRewards","desc":"Sends the reward tokens held in pool 1 to specified receiver.\nThis is intended to be used by the owner when they want to get reward tokens 'back' which they sent to\nthe first pool (likely because validator is sunsetting. Any tokens currently 'reserved' for stakers to claim will\nNOT be sent as they must be held back for stakers to later claim.\n[ ONLY OWNER CAN CALL]","args":[{"name":"validatorId","type":"uint64","desc":"The id of the validator."},{"name":"receiver","type":"address","desc":"the account to send the tokens to (must already be opted-in to the reward token)"}],"returns":{"type":"uint64","desc":"uint64 the amount of reward token sent"},"actions":{"create":[],"call":["NoOp"]}}],"events":[{"name":"retiOP_addedValidator","args":[{"name":"id","type":"uint64"},{"name":"owner","type":"address"},{"name":"manager","type":"address"}],"desc":"Logs the addition of a new validator to the system, its initial owner and manager"},{"name":"retiOP_validatorAddedPool","args":[{"name":"id","type":"uint64"},{"name":"num","type":"uint16"},{"name":"poolAppId","type":"uint64"}],"desc":"Logs the addition of a new pool to a particular validator ID"},{"name":"retiOP_stakeAdded","args":[{"name":"id","type":"uint64"},{"name":"poolNum","type":"uint16"},{"name":"poolAppId","type":"uint64"},{"name":"staker","type":"address"},{"name":"amountStaked","type":"uint64"}],"desc":"Logs how much stake was added by a staker to a particular staking pool"},{"name":"retiOP_epochRewardUpdate","args":[{"name":"id","type":"uint64"},{"name":"poolNum","type":"uint16"},{"name":"poolAppId","type":"uint64"},{"name":"validatorCommission","type":"uint64"},{"name":"saturatedBurnToFeeSink","type":"uint64"},{"name":"algoAdded","type":"uint64"},{"name":"rewardTokenHeldBack","type":"uint64"}],"desc":"Logs how much algo was detected as being added to a staking pool as part of epoch reward calculations.\r\nCommission amount to validator, excess burned if pool is saturated, and the amount of tokens held back are logged as well."},{"name":"retiOP_stakeRemoved","args":[{"name":"id","type":"uint64"},{"name":"poolNum","type":"uint16"},{"name":"poolAppId","type":"uint64"},{"name":"staker","type":"address"},{"name":"amountUnstaked","type":"uint64"},{"name":"rewardTokensReceived","type":"uint64"},{"name":"rewardTokenAssetId","type":"uint64"}],"desc":"Logs how much stake was removed by a staker from a particular staking pool"}],"arcs":[4,56],"structs":{"ValidatorInfo":[{"name":"config","type":[{"name":"id","type":"uint64"},{"name":"owner","type":"address"},{"name":"manager","type":"address"},{"name":"nfdForInfo","type":"uint64"},{"name":"entryGatingType","type":"uint8"},{"name":"entryGatingAddress","type":"address"},{"name":"entryGatingAssets","type":"uint64[4]"},{"name":"gatingAssetMinBalance","type":"uint64"},{"name":"rewardTokenId","type":"uint64"},{"name":"rewardPerPayout","type":"uint64"},{"name":"epochRoundLength","type":"uint32"},{"name":"percentToValidator","type":"uint32"},{"name":"validatorCommissionAddress","type":"address"},{"name":"minEntryStake","type":"uint64"},{"name":"maxAlgoPerPool","type":"uint64"},{"name":"poolsPerNode","type":"uint8"},{"name":"sunsettingOn","type":"uint64"},{"name":"sunsettingTo","type":"uint64"}]},{"name":"state","type":[{"name":"numPools","type":"uint16"},{"name":"totalStakers","type":"uint64"},{"name":"totalAlgoStaked","type":"uint64"},{"name":"rewardTokenHeldBack","type":"uint64"}]},{"name":"pools","type":"(uint64,uint16,uint64)[24]"},{"name":"tokenPayoutRatio","type":[{"name":"poolPctOfWhole","type":"uint64[24]"},{"name":"updatedForPayout","type":"uint64"}]},{"name":"nodePoolAssignments","type":[{"name":"nodes","type":"(uint64[3])[8]"}]}],"MbrAmounts":[{"name":"addValidatorMbr","type":"uint64"},{"name":"addPoolMbr","type":"uint64"},{"name":"poolInitMbr","type":"uint64"},{"name":"addStakerMbr","type":"uint64"}],"Constraints":[{"name":"epochPayoutRoundsMin","type":"uint64"},{"name":"epochPayoutRoundsMax","type":"uint64"},{"name":"minPctToValidatorWFourDecimals","type":"uint64"},{"name":"maxPctToValidatorWFourDecimals","type":"uint64"},{"name":"minEntryStake","type":"uint64"},{"name":"maxAlgoPerPool","type":"uint64"},{"name":"maxAlgoPerValidator","type":"uint64"},{"name":"amtConsideredSaturated","type":"uint64"},{"name":"maxNodes","type":"uint64"},{"name":"maxPoolsPerNode","type":"uint64"},{"name":"maxStakersPerPool","type":"uint64"}],"ValidatorConfig":[{"name":"id","type":"uint64"},{"name":"owner","type":"address"},{"name":"manager","type":"address"},{"name":"nfdForInfo","type":"uint64"},{"name":"entryGatingType","type":"uint8"},{"name":"entryGatingAddress","type":"address"},{"name":"entryGatingAssets","type":"uint64[4]"},{"name":"gatingAssetMinBalance","type":"uint64"},{"name":"rewardTokenId","type":"uint64"},{"name":"rewardPerPayout","type":"uint64"},{"name":"epochRoundLength","type":"uint32"},{"name":"percentToValidator","type":"uint32"},{"name":"validatorCommissionAddress","type":"address"},{"name":"minEntryStake","type":"uint64"},{"name":"maxAlgoPerPool","type":"uint64"},{"name":"poolsPerNode","type":"uint8"},{"name":"sunsettingOn","type":"uint64"},{"name":"sunsettingTo","type":"uint64"}],"ValidatorCurState":[{"name":"numPools","type":"uint16"},{"name":"totalStakers","type":"uint64"},{"name":"totalAlgoStaked","type":"uint64"},{"name":"rewardTokenHeldBack","type":"uint64"}],"PoolInfo":[{"name":"poolAppId","type":"uint64"},{"name":"totalStakers","type":"uint16"},{"name":"totalAlgoStaked","type":"uint64"}],"ValidatorPoolKey":[{"name":"id","type":"uint64"},{"name":"poolId","type":"uint64"},{"name":"poolAppId","type":"uint64"}],"PoolTokenPayoutRatio":[{"name":"poolPctOfWhole","type":"uint64[24]"},{"name":"updatedForPayout","type":"uint64"}],"NodePoolAssignmentConfig":[{"name":"nodes","type":"(uint64[3])[8]"}]},"state":{"schema":{"global":{"bytes":1,"ints":3},"local":{"bytes":0,"ints":0}},"keys":{"global":{"stakingPoolInitialized":{"key":"aW5pdA==","keyType":"AVMBytes","valueType":"bool"},"numValidators":{"key":"bnVtVg==","keyType":"AVMBytes","valueType":"uint64"},"numStakers":{"key":"bnVtU3Rha2Vycw==","keyType":"AVMBytes","valueType":"uint64"},"totalAlgoStaked":{"key":"c3Rha2Vk","keyType":"AVMBytes","valueType":"uint64"}},"local":{},"box":{"stakingPoolApprovalProgram":{"key":"cG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcw==","keyType":"AVMBytes","valueType":"byte[]"}}},"maps":{"global":{},"local":{},"box":{"validatorList":{"keyType":"uint64","valueType":"ValidatorInfo","prefix":"v"},"stakerPoolSet":{"keyType":"address","valueType":"(uint64,uint64,uint64)[6]","prefix":"sps"}}}},"bareActions":{"create":[],"call":[]},"sourceInfo":{"approval":[{"teal":1,"source":50,"pc":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170]},{"teal":9,"source":50,"pc":[171,172]},{"teal":10,"source":50,"pc":[173]},{"teal":11,"source":50,"pc":[174,175]},{"teal":18,"source":50,"pc":[176,177]},{"teal":19,"source":50,"pc":[178]},{"teal":20,"source":50,"pc":[179,180]},{"teal":21,"source":50,"pc":[181]},{"teal":22,"source":50,"pc":[182,183]},{"teal":23,"source":50,"pc":[184]},{"teal":24,"source":50,"pc":[185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210]},{"teal":28,"source":50,"errorMessage":"The requested action is not implemented in this contract. Are you using the correct OnComplete? Did you set your app ID?","pc":[211]},{"teal":33,"source":81,"pc":[212,213,214]},{"teal":34,"source":81,"pc":[215]},{"teal":35,"source":81,"pc":[216]},{"teal":39,"source":81,"pc":[217,218,219]},{"teal":43,"source":82,"pc":[220,221]},{"teal":44,"source":82,"pc":[222]},{"teal":45,"source":82,"pc":[223,224]},{"teal":46,"source":82,"pc":[225]},{"teal":47,"source":82,"pc":[226,227]},{"teal":48,"source":82,"pc":[228]},{"teal":49,"source":82,"pc":[229]},{"teal":53,"source":83,"pc":[230,231]},{"teal":54,"source":83,"pc":[232]},{"teal":55,"source":83,"pc":[233]},{"teal":59,"source":84,"pc":[234,235]},{"teal":60,"source":84,"pc":[236]},{"teal":61,"source":84,"pc":[237]},{"teal":65,"source":85,"pc":[238,239]},{"teal":66,"source":85,"pc":[240]},{"teal":67,"source":85,"pc":[241]},{"teal":68,"source":81,"pc":[242]},{"teal":73,"source":88,"pc":[243,244,245]},{"teal":74,"source":88,"pc":[246]},{"teal":77,"source":88,"pc":[247,248,249]},{"teal":78,"source":88,"pc":[250]},{"teal":79,"source":88,"pc":[251]},{"teal":83,"source":88,"pc":[252,253,254]},{"teal":87,"source":90,"pc":[255,256]},{"teal":88,"source":90,"pc":[257,258]},{"teal":89,"source":90,"pc":[259]},{"teal":90,"source":90,"pc":[260]},{"teal":91,"source":88,"pc":[261]},{"teal":96,"source":93,"pc":[262,263,264]},{"teal":97,"source":93,"pc":[265,266,267]},{"teal":100,"source":93,"pc":[268,269,270]},{"teal":101,"source":93,"pc":[271]},{"teal":104,"source":93,"pc":[272,273,274]},{"teal":105,"source":93,"pc":[275]},{"teal":106,"source":93,"pc":[276]},{"teal":110,"source":93,"pc":[277,278,279]},{"teal":114,"source":94,"pc":[280,281]},{"teal":115,"source":94,"pc":[282]},{"teal":116,"source":94,"pc":[283]},{"teal":117,"source":94,"pc":[284]},{"teal":118,"source":94,"pc":[285]},{"teal":119,"source":94,"pc":[286]},{"teal":123,"source":95,"pc":[287,288]},{"teal":124,"source":95,"pc":[289,290]},{"teal":125,"source":95,"pc":[291,292]},{"teal":126,"source":95,"pc":[293]},{"teal":127,"source":93,"pc":[294]},{"teal":132,"source":98,"pc":[295,296,297]},{"teal":133,"source":98,"pc":[298]},{"teal":134,"source":98,"pc":[299]},{"teal":138,"source":98,"pc":[300,301,302]},{"teal":142,"source":99,"pc":[303,304]},{"teal":143,"source":99,"pc":[305]},{"teal":144,"source":99,"pc":[306,307]},{"teal":145,"source":99,"pc":[308]},{"teal":146,"source":99,"pc":[309,310]},{"teal":147,"source":99,"pc":[311]},{"teal":148,"source":99,"pc":[312]},{"teal":149,"source":98,"pc":[313]},{"teal":154,"source":105,"pc":[314,315,316]},{"teal":155,"source":105,"pc":[317]},{"teal":156,"source":105,"pc":[318]},{"teal":162,"source":105,"pc":[319,320,321]},{"teal":163,"source":105,"pc":[322]},{"teal":168,"source":116,"pc":[323]},{"teal":171,"source":116,"pc":[324,325,326]},{"teal":172,"source":116,"pc":[327]},{"teal":173,"source":116,"pc":[328]},{"teal":174,"source":116,"pc":[329]},{"teal":175,"source":116,"pc":[330]},{"teal":187,"source":116,"pc":[331,332,333]},{"teal":212,"source":120,"pc":[334,335,336]},{"teal":213,"source":120,"pc":[337,338,339]},{"teal":214,"source":120,"pc":[340]},{"teal":215,"source":130,"pc":[341,342]},{"teal":216,"source":129,"pc":[343,344]},{"teal":217,"source":128,"pc":[345]},{"teal":218,"source":128,"pc":[346,347]},{"teal":219,"source":125,"pc":[348,349]},{"teal":220,"source":122,"pc":[350]},{"teal":221,"source":121,"pc":[351,352,353]},{"teal":222,"source":121,"pc":[354]},{"teal":223,"source":121,"pc":[355]},{"teal":224,"source":133,"pc":[356,357]},{"teal":225,"source":134,"pc":[358,359,360]},{"teal":226,"source":134,"pc":[361,362,363]},{"teal":227,"source":133,"pc":[364]},{"teal":228,"source":133,"pc":[365]},{"teal":229,"source":133,"pc":[366]},{"teal":230,"source":138,"pc":[367,368,369]},{"teal":231,"source":137,"pc":[370,371,372]},{"teal":232,"source":137,"pc":[373]},{"teal":233,"source":137,"pc":[374]},{"teal":234,"source":116,"pc":[375]},{"teal":239,"source":146,"pc":[376]},{"teal":242,"source":146,"pc":[377,378,379]},{"teal":243,"source":146,"pc":[380]},{"teal":244,"source":146,"pc":[381]},{"teal":245,"source":146,"pc":[382]},{"teal":246,"source":146,"pc":[383]},{"teal":252,"source":146,"pc":[384,385,386]},{"teal":268,"source":152,"pc":[387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428]},{"teal":269,"source":153,"pc":[429,430,431]},{"teal":270,"source":153,"pc":[432]},{"teal":271,"source":153,"pc":[433]},{"teal":272,"source":154,"pc":[434,435,436]},{"teal":273,"source":154,"pc":[437]},{"teal":274,"source":154,"pc":[438]},{"teal":275,"source":155,"pc":[439,440,441]},{"teal":276,"source":155,"pc":[442]},{"teal":277,"source":155,"pc":[443]},{"teal":278,"source":156,"pc":[444,445,446,447,448,449,450,451,452,453]},{"teal":279,"source":156,"pc":[454]},{"teal":280,"source":157,"pc":[455,456,457,458,459,460,461,462,463,464]},{"teal":281,"source":157,"pc":[465]},{"teal":282,"source":158,"pc":[466,467,468,469,470,471,472,473,474,475]},{"teal":283,"source":158,"pc":[476]},{"teal":284,"source":146,"pc":[477]},{"teal":289,"source":165,"pc":[478]},{"teal":292,"source":165,"pc":[479,480,481]},{"teal":293,"source":165,"pc":[482]},{"teal":294,"source":165,"pc":[483]},{"teal":295,"source":165,"pc":[484]},{"teal":296,"source":165,"pc":[485]},{"teal":297,"source":165,"pc":[486]},{"teal":303,"source":165,"pc":[487,488,489]},{"teal":307,"source":167,"pc":[490,491]},{"teal":308,"source":167,"pc":[492]},{"teal":309,"source":165,"pc":[493]},{"teal":314,"source":170,"pc":[494]},{"teal":317,"source":171,"pc":[495,496,497]},{"teal":318,"source":171,"pc":[498]},{"teal":321,"source":170,"pc":[499,500,501]},{"teal":322,"source":170,"pc":[502]},{"teal":323,"source":170,"pc":[503]},{"teal":324,"source":170,"pc":[504]},{"teal":325,"source":170,"pc":[505]},{"teal":329,"source":170,"pc":[506,507,508]},{"teal":333,"source":172,"pc":[509]},{"teal":334,"source":172,"pc":[510,511]},{"teal":335,"source":172,"pc":[512]},{"teal":336,"source":172,"pc":[513,514]},{"teal":337,"source":172,"pc":[515]},{"teal":338,"source":172,"pc":[516]},{"teal":339,"source":172,"pc":[517,518]},{"teal":340,"source":172,"pc":[519]},{"teal":341,"source":170,"pc":[520]},{"teal":346,"source":175,"pc":[521]},{"teal":349,"source":176,"pc":[522,523,524]},{"teal":350,"source":176,"pc":[525]},{"teal":353,"source":175,"pc":[526,527,528]},{"teal":354,"source":175,"pc":[529]},{"teal":355,"source":175,"pc":[530]},{"teal":356,"source":175,"pc":[531]},{"teal":357,"source":175,"pc":[532]},{"teal":361,"source":175,"pc":[533,534,535]},{"teal":365,"source":177,"pc":[536,537]},{"teal":366,"source":177,"pc":[538,539]},{"teal":367,"source":177,"pc":[540]},{"teal":368,"source":177,"pc":[541,542]},{"teal":369,"source":177,"pc":[543]},{"teal":370,"source":177,"pc":[544]},{"teal":371,"source":177,"pc":[545,546]},{"teal":372,"source":177,"pc":[547]},{"teal":373,"source":175,"pc":[548]},{"teal":378,"source":180,"pc":[549]},{"teal":381,"source":181,"pc":[550,551,552]},{"teal":382,"source":181,"pc":[553]},{"teal":385,"source":180,"pc":[554,555,556]},{"teal":386,"source":180,"pc":[557]},{"teal":387,"source":180,"pc":[558]},{"teal":388,"source":180,"pc":[559]},{"teal":389,"source":180,"pc":[560]},{"teal":393,"source":180,"pc":[561,562,563]},{"teal":400,"source":183,"pc":[564]},{"teal":401,"source":183,"pc":[565,566]},{"teal":402,"source":183,"pc":[567]},{"teal":403,"source":183,"pc":[568,569]},{"teal":404,"source":183,"pc":[570]},{"teal":405,"source":183,"pc":[571]},{"teal":406,"source":183,"pc":[572,573]},{"teal":407,"source":183,"pc":[574]},{"teal":408,"source":184,"pc":[575,576]},{"teal":409,"source":184,"pc":[577,578]},{"teal":410,"source":184,"pc":[579]},{"teal":411,"source":184,"pc":[580,581]},{"teal":412,"source":184,"pc":[582]},{"teal":413,"source":184,"pc":[583]},{"teal":414,"source":184,"pc":[584,585]},{"teal":415,"source":184,"pc":[586]},{"teal":416,"source":184,"pc":[587]},{"teal":417,"source":180,"pc":[588]},{"teal":422,"source":194,"pc":[589]},{"teal":425,"source":195,"pc":[590,591,592]},{"teal":426,"source":195,"pc":[593]},{"teal":429,"source":194,"pc":[594,595,596]},{"teal":430,"source":194,"pc":[597]},{"teal":431,"source":194,"pc":[598]},{"teal":432,"source":194,"pc":[599,600]},{"teal":433,"source":194,"pc":[601]},{"teal":434,"source":194,"pc":[602]},{"teal":435,"source":194,"pc":[603,604,605]},{"teal":436,"source":194,"pc":[606]},{"teal":437,"source":194,"pc":[607]},{"teal":438,"source":194,"pc":[608]},{"teal":439,"source":194,"pc":[609]},{"teal":440,"source":194,"pc":[610]},{"teal":441,"source":194,"pc":[611]},{"teal":450,"source":194,"pc":[612,613,614]},{"teal":453,"source":194,"pc":[615]},{"teal":454,"source":194,"pc":[616,617]},{"teal":458,"source":196,"pc":[618]},{"teal":459,"source":196,"pc":[619,620]},{"teal":463,"source":197,"pc":[621,622]},{"teal":464,"source":197,"pc":[623,624]},{"teal":465,"source":197,"pc":[625]},{"teal":466,"source":197,"pc":[626,627]},{"teal":467,"source":197,"pc":[628]},{"teal":468,"source":197,"pc":[629]},{"teal":469,"source":197,"pc":[630,631]},{"teal":470,"source":197,"pc":[632]},{"teal":471,"source":197,"pc":[633,634]},{"teal":475,"source":198,"pc":[635]},{"teal":476,"source":198,"pc":[636,637]},{"teal":481,"source":198,"pc":[638,639]},{"teal":482,"source":198,"pc":[640]},{"teal":483,"source":198,"pc":[641]},{"teal":484,"source":198,"pc":[642,643,644]},{"teal":489,"source":199,"pc":[645,646]},{"teal":490,"source":199,"pc":[647,648]},{"teal":491,"source":199,"pc":[649,650]},{"teal":492,"source":199,"pc":[651]},{"teal":493,"source":199,"pc":[652]},{"teal":494,"source":199,"pc":[653]},{"teal":495,"source":199,"pc":[654]},{"teal":496,"source":199,"pc":[655]},{"teal":497,"source":199,"pc":[656]},{"teal":498,"source":199,"pc":[657]},{"teal":499,"source":199,"pc":[658]},{"teal":500,"source":199,"pc":[659,660,661]},{"teal":503,"source":201,"pc":[662,663,664]},{"teal":508,"source":203,"pc":[665,666]},{"teal":509,"source":203,"pc":[667,668]},{"teal":510,"source":203,"pc":[669,670]},{"teal":511,"source":203,"pc":[671,672]},{"teal":512,"source":203,"pc":[673]},{"teal":513,"source":203,"pc":[674,675]},{"teal":514,"source":203,"pc":[676]},{"teal":515,"source":203,"pc":[677]},{"teal":516,"source":203,"pc":[678,679]},{"teal":521,"source":198,"pc":[680,681]},{"teal":522,"source":198,"pc":[682]},{"teal":523,"source":198,"pc":[683]},{"teal":524,"source":198,"pc":[684,685]},{"teal":525,"source":198,"pc":[686,687,688]},{"teal":530,"source":205,"pc":[689,690]},{"teal":533,"source":194,"pc":[691,692]},{"teal":536,"source":194,"pc":[693,694]},{"teal":537,"source":194,"pc":[695]},{"teal":542,"source":213,"pc":[696]},{"teal":545,"source":214,"pc":[697,698,699]},{"teal":546,"source":214,"pc":[700]},{"teal":549,"source":214,"pc":[701,702,703]},{"teal":550,"source":214,"pc":[704]},{"teal":553,"source":213,"pc":[705,706,707]},{"teal":554,"source":213,"pc":[708]},{"teal":555,"source":213,"pc":[709]},{"teal":556,"source":213,"pc":[710]},{"teal":557,"source":213,"pc":[711]},{"teal":558,"source":213,"pc":[712]},{"teal":566,"source":213,"pc":[713,714,715]},{"teal":573,"source":216,"pc":[716,717]},{"teal":574,"source":216,"pc":[718]},{"teal":575,"source":216,"pc":[719]},{"teal":576,"source":216,"pc":[720]},{"teal":577,"source":216,"pc":[721,722,723]},{"teal":578,"source":216,"pc":[724,725]},{"teal":579,"source":216,"pc":[726]},{"teal":580,"source":216,"pc":[727]},{"teal":581,"source":216,"pc":[728]},{"teal":585,"source":215,"errorMessage":"pool id must be between 1 and number of pools for this validator","pc":[729]},{"teal":589,"source":219,"pc":[730,731]},{"teal":590,"source":219,"pc":[732,733]},{"teal":591,"source":219,"pc":[734]},{"teal":592,"source":219,"pc":[735]},{"teal":593,"source":219,"pc":[736,737]},{"teal":594,"source":219,"pc":[738]},{"teal":595,"source":219,"pc":[739]},{"teal":596,"source":219,"pc":[740]},{"teal":597,"source":219,"pc":[741]},{"teal":598,"source":219,"pc":[742]},{"teal":599,"source":219,"pc":[743]},{"teal":600,"source":219,"pc":[744,745]},{"teal":601,"source":219,"pc":[746]},{"teal":602,"source":219,"pc":[747]},{"teal":603,"source":219,"pc":[748,749]},{"teal":604,"source":219,"pc":[750]},{"teal":605,"source":219,"pc":[751]},{"teal":606,"source":213,"pc":[752]},{"teal":611,"source":222,"pc":[753]},{"teal":614,"source":223,"pc":[754,755,756]},{"teal":615,"source":223,"pc":[757]},{"teal":616,"source":223,"pc":[758]},{"teal":617,"source":223,"pc":[759]},{"teal":618,"source":223,"pc":[760]},{"teal":621,"source":223,"errorMessage":"argument 0 (poolKey) for getPoolInfo must be a (uint64,uint64,uint64)","pc":[761]},{"teal":624,"source":222,"pc":[762,763,764]},{"teal":625,"source":222,"pc":[765]},{"teal":626,"source":222,"pc":[766]},{"teal":627,"source":222,"pc":[767]},{"teal":628,"source":222,"pc":[768]},{"teal":632,"source":222,"pc":[769,770,771]},{"teal":636,"source":224,"pc":[772,773]},{"teal":637,"source":224,"pc":[774,775]},{"teal":638,"source":224,"pc":[776,777,778]},{"teal":639,"source":224,"pc":[779]},{"teal":640,"source":224,"pc":[780]},{"teal":641,"source":224,"pc":[781]},{"teal":642,"source":224,"pc":[782,783]},{"teal":643,"source":224,"pc":[784]},{"teal":644,"source":224,"pc":[785]},{"teal":645,"source":224,"pc":[786,787]},{"teal":646,"source":224,"pc":[788]},{"teal":647,"source":224,"pc":[789,790]},{"teal":648,"source":224,"pc":[791,792,793]},{"teal":649,"source":224,"pc":[794]},{"teal":650,"source":224,"pc":[795]},{"teal":651,"source":224,"pc":[796]},{"teal":652,"source":224,"pc":[797,798]},{"teal":653,"source":224,"pc":[799]},{"teal":654,"source":222,"pc":[800]},{"teal":659,"source":234,"pc":[801]},{"teal":662,"source":235,"pc":[802,803,804]},{"teal":663,"source":235,"pc":[805]},{"teal":666,"source":234,"pc":[806,807,808]},{"teal":667,"source":234,"pc":[809]},{"teal":668,"source":234,"pc":[810]},{"teal":669,"source":234,"pc":[811]},{"teal":670,"source":234,"pc":[812]},{"teal":671,"source":234,"pc":[813]},{"teal":681,"source":234,"pc":[814,815,816]},{"teal":684,"source":234,"pc":[817]},{"teal":685,"source":234,"pc":[818,819]},{"teal":689,"source":236,"pc":[820,821]},{"teal":690,"source":236,"pc":[822,823]},{"teal":691,"source":236,"pc":[824]},{"teal":692,"source":236,"pc":[825,826]},{"teal":693,"source":236,"pc":[827]},{"teal":694,"source":236,"pc":[828]},{"teal":695,"source":236,"pc":[829,830]},{"teal":696,"source":236,"pc":[831]},{"teal":697,"source":236,"pc":[832]},{"teal":698,"source":236,"pc":[833,834]},{"teal":702,"source":237,"pc":[835,836,837]},{"teal":703,"source":237,"pc":[838,839]},{"teal":704,"source":237,"pc":[840]},{"teal":705,"source":237,"pc":[841,842]},{"teal":709,"source":238,"pc":[843,844,845]},{"teal":710,"source":238,"pc":[846]},{"teal":711,"source":238,"pc":[847]},{"teal":712,"source":238,"pc":[848,849]},{"teal":713,"source":238,"pc":[850]},{"teal":714,"source":238,"pc":[851]},{"teal":715,"source":238,"pc":[852,853]},{"teal":716,"source":238,"pc":[854]},{"teal":717,"source":238,"pc":[855]},{"teal":718,"source":238,"pc":[856,857]},{"teal":723,"source":239,"pc":[858,859]},{"teal":724,"source":239,"pc":[860]},{"teal":725,"source":239,"pc":[861]},{"teal":726,"source":239,"pc":[862,863,864]},{"teal":731,"source":240,"pc":[865,866,867]},{"teal":732,"source":240,"pc":[868,869]},{"teal":738,"source":242,"pc":[870,871]},{"teal":739,"source":242,"pc":[872,873]},{"teal":740,"source":242,"pc":[874]},{"teal":741,"source":242,"pc":[875,876,877]},{"teal":746,"source":243,"pc":[878,879]},{"teal":747,"source":243,"pc":[880,881]},{"teal":752,"source":245,"pc":[882,883]},{"teal":755,"source":234,"pc":[884,885]},{"teal":758,"source":234,"pc":[886,887]},{"teal":759,"source":234,"pc":[888]},{"teal":764,"source":252,"pc":[889]},{"teal":767,"source":253,"pc":[890,891,892]},{"teal":768,"source":253,"pc":[893]},{"teal":769,"source":253,"pc":[894]},{"teal":770,"source":253,"pc":[895,896]},{"teal":771,"source":253,"pc":[897]},{"teal":774,"source":253,"errorMessage":"argument 0 (staker) for doesStakerNeedToPayMBR must be a address","pc":[898]},{"teal":777,"source":252,"pc":[899,900,901]},{"teal":778,"source":252,"pc":[902,903]},{"teal":779,"source":252,"pc":[904]},{"teal":780,"source":252,"pc":[905,906]},{"teal":781,"source":252,"pc":[907]},{"teal":782,"source":252,"pc":[908]},{"teal":783,"source":252,"pc":[909]},{"teal":784,"source":252,"pc":[910]},{"teal":785,"source":252,"pc":[911]},{"teal":792,"source":252,"pc":[912,913,914]},{"teal":796,"source":254,"pc":[915]},{"teal":797,"source":254,"pc":[916,917]},{"teal":798,"source":254,"pc":[918]},{"teal":799,"source":254,"pc":[919]},{"teal":800,"source":254,"pc":[920]},{"teal":801,"source":254,"pc":[921]},{"teal":802,"source":254,"pc":[922]},{"teal":803,"source":252,"pc":[923]},{"teal":808,"source":263,"pc":[924]},{"teal":811,"source":264,"pc":[925,926,927]},{"teal":812,"source":264,"pc":[928]},{"teal":813,"source":264,"pc":[929]},{"teal":814,"source":264,"pc":[930,931]},{"teal":815,"source":264,"pc":[932]},{"teal":818,"source":264,"errorMessage":"argument 0 (staker) for getStakedPoolsForAccount must be a address","pc":[933]},{"teal":821,"source":263,"pc":[934,935,936]},{"teal":822,"source":263,"pc":[937]},{"teal":823,"source":263,"pc":[938]},{"teal":824,"source":263,"pc":[939]},{"teal":825,"source":263,"pc":[940]},{"teal":826,"source":263,"pc":[941]},{"teal":827,"source":263,"pc":[942,943,944]},{"teal":828,"source":263,"pc":[945]},{"teal":829,"source":263,"pc":[946]},{"teal":830,"source":263,"pc":[947]},{"teal":831,"source":263,"pc":[948]},{"teal":832,"source":263,"pc":[949]},{"teal":833,"source":263,"pc":[950]},{"teal":842,"source":263,"pc":[951,952,953]},{"teal":845,"source":263,"pc":[954]},{"teal":846,"source":263,"pc":[955,956]},{"teal":851,"source":265,"pc":[957]},{"teal":852,"source":265,"pc":[958,959]},{"teal":853,"source":265,"pc":[960]},{"teal":854,"source":265,"pc":[961]},{"teal":855,"source":265,"pc":[962]},{"teal":856,"source":265,"pc":[963]},{"teal":857,"source":265,"pc":[964]},{"teal":858,"source":265,"pc":[965,966,967]},{"teal":863,"source":266,"pc":[968]},{"teal":864,"source":266,"pc":[969,970,971]},{"teal":869,"source":268,"pc":[972]},{"teal":870,"source":268,"pc":[973,974]},{"teal":874,"source":269,"pc":[975]},{"teal":875,"source":269,"pc":[976,977]},{"teal":876,"source":269,"pc":[978]},{"teal":877,"source":269,"pc":[979]},{"teal":880,"source":269,"errorMessage":"box value does not exist: this.stakerPoolSet(staker).value","pc":[980]},{"teal":881,"source":269,"pc":[981,982]},{"teal":885,"source":270,"pc":[983]},{"teal":886,"source":270,"pc":[984,985]},{"teal":891,"source":270,"pc":[986,987]},{"teal":892,"source":270,"pc":[988,989]},{"teal":893,"source":270,"pc":[990]},{"teal":894,"source":270,"pc":[991,992,993]},{"teal":899,"source":271,"pc":[994,995]},{"teal":900,"source":271,"pc":[996,997]},{"teal":901,"source":271,"pc":[998]},{"teal":902,"source":271,"pc":[999]},{"teal":903,"source":271,"pc":[1000]},{"teal":904,"source":271,"pc":[1001]},{"teal":905,"source":271,"pc":[1002]},{"teal":906,"source":271,"pc":[1003]},{"teal":907,"source":271,"pc":[1004]},{"teal":908,"source":271,"pc":[1005]},{"teal":909,"source":271,"pc":[1006]},{"teal":910,"source":271,"pc":[1007,1008,1009]},{"teal":915,"source":272,"pc":[1010,1011]},{"teal":916,"source":272,"pc":[1012,1013]},{"teal":917,"source":272,"pc":[1014,1015]},{"teal":918,"source":272,"pc":[1016]},{"teal":919,"source":272,"pc":[1017]},{"teal":920,"source":272,"pc":[1018]},{"teal":921,"source":272,"pc":[1019]},{"teal":922,"source":272,"pc":[1020]},{"teal":923,"source":272,"pc":[1021,1022]},{"teal":930,"source":270,"pc":[1023,1024]},{"teal":931,"source":270,"pc":[1025]},{"teal":932,"source":270,"pc":[1026]},{"teal":933,"source":270,"pc":[1027,1028]},{"teal":934,"source":270,"pc":[1029,1030,1031]},{"teal":939,"source":275,"pc":[1032,1033]},{"teal":943,"source":263,"pc":[1034,1035]},{"teal":946,"source":263,"pc":[1036,1037]},{"teal":947,"source":263,"pc":[1038]},{"teal":952,"source":285,"pc":[1039]},{"teal":955,"source":286,"pc":[1040,1041,1042]},{"teal":956,"source":286,"pc":[1043]},{"teal":959,"source":285,"pc":[1044,1045,1046]},{"teal":960,"source":285,"pc":[1047]},{"teal":961,"source":285,"pc":[1048]},{"teal":962,"source":285,"pc":[1049]},{"teal":963,"source":285,"pc":[1050]},{"teal":973,"source":285,"pc":[1051,1052,1053]},{"teal":977,"source":287,"pc":[1054,1055]},{"teal":978,"source":287,"pc":[1056,1057]},{"teal":979,"source":287,"pc":[1058]},{"teal":980,"source":287,"pc":[1059,1060]},{"teal":981,"source":287,"pc":[1061]},{"teal":982,"source":287,"pc":[1062]},{"teal":983,"source":287,"pc":[1063,1064]},{"teal":984,"source":287,"pc":[1065]},{"teal":985,"source":285,"pc":[1066]},{"teal":990,"source":290,"pc":[1067]},{"teal":993,"source":291,"pc":[1068,1069,1070]},{"teal":994,"source":291,"pc":[1071]},{"teal":997,"source":290,"pc":[1072,1073,1074]},{"teal":998,"source":290,"pc":[1075]},{"teal":999,"source":290,"pc":[1076]},{"teal":1000,"source":290,"pc":[1077]},{"teal":1001,"source":290,"pc":[1078]},{"teal":1005,"source":290,"pc":[1079,1080,1081]},{"teal":1009,"source":292,"pc":[1082]},{"teal":1010,"source":292,"pc":[1083,1084]},{"teal":1011,"source":292,"pc":[1085]},{"teal":1012,"source":292,"pc":[1086]},{"teal":1013,"source":292,"pc":[1087]},{"teal":1014,"source":292,"pc":[1088]},{"teal":1015,"source":292,"pc":[1089]},{"teal":1018,"source":292,"errorMessage":"the specified validator id doesn't exist","pc":[1090]},{"teal":1022,"source":294,"pc":[1091,1092]},{"teal":1023,"source":294,"pc":[1093,1094]},{"teal":1024,"source":294,"pc":[1095]},{"teal":1025,"source":294,"pc":[1096,1097]},{"teal":1026,"source":294,"pc":[1098]},{"teal":1027,"source":294,"pc":[1099]},{"teal":1028,"source":294,"pc":[1100,1101]},{"teal":1029,"source":294,"pc":[1102]},{"teal":1030,"source":290,"pc":[1103]},{"teal":1035,"source":297,"pc":[1104]},{"teal":1038,"source":297,"pc":[1105,1106,1107]},{"teal":1039,"source":297,"pc":[1108]},{"teal":1040,"source":297,"pc":[1109]},{"teal":1041,"source":297,"pc":[1110]},{"teal":1042,"source":297,"pc":[1111]},{"teal":1043,"source":297,"pc":[1112]},{"teal":1047,"source":297,"pc":[1113,1114,1115]},{"teal":1051,"source":299,"pc":[1116,1117]},{"teal":1052,"source":297,"pc":[1118]},{"teal":1057,"source":310,"pc":[1119]},{"teal":1060,"source":310,"pc":[1120,1121,1122]},{"teal":1061,"source":310,"pc":[1123]},{"teal":1062,"source":310,"pc":[1124]},{"teal":1063,"source":310,"pc":[1125,1126]},{"teal":1064,"source":310,"pc":[1127]},{"teal":1067,"source":310,"errorMessage":"argument 0 (config) for addValidator must be a (uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64)","pc":[1128]},{"teal":1070,"source":310,"pc":[1129,1130,1131]},{"teal":1071,"source":310,"pc":[1132,1133,1134]},{"teal":1074,"source":310,"pc":[1135,1136]},{"teal":1075,"source":310,"pc":[1137]},{"teal":1076,"source":310,"pc":[1138]},{"teal":1077,"source":310,"pc":[1139]},{"teal":1078,"source":310,"pc":[1140,1141]},{"teal":1079,"source":310,"pc":[1142]},{"teal":1080,"source":310,"pc":[1143]},{"teal":1083,"source":310,"errorMessage":"argument 2 (mbrPayment) for addValidator must be a pay transaction","pc":[1144]},{"teal":1086,"source":310,"pc":[1145,1146,1147]},{"teal":1087,"source":310,"pc":[1148]},{"teal":1088,"source":310,"pc":[1149]},{"teal":1089,"source":310,"pc":[1150]},{"teal":1090,"source":310,"pc":[1151]},{"teal":1091,"source":310,"pc":[1152]},{"teal":1103,"source":310,"pc":[1153,1154,1155]},{"teal":1106,"source":310,"pc":[1156]},{"teal":1110,"source":311,"pc":[1157,1158]},{"teal":1111,"source":311,"pc":[1159,1160,1161]},{"teal":1116,"source":313,"pc":[1162,1163]},{"teal":1117,"source":313,"pc":[1164,1165]},{"teal":1118,"source":313,"pc":[1166,1167]},{"teal":1119,"source":313,"pc":[1168]},{"teal":1122,"source":313,"errorMessage":"transaction verification failed: {\"txn\":\"mbrPayment\",\"field\":\"receiver\",\"expected\":\"this.app.address\"}","pc":[1169]},{"teal":1125,"source":313,"pc":[1170,1171]},{"teal":1126,"source":313,"pc":[1172,1173]},{"teal":1127,"source":313,"pc":[1174,1175,1176]},{"teal":1128,"source":313,"pc":[1177,1178,1179]},{"teal":1129,"source":313,"pc":[1180]},{"teal":1130,"source":313,"pc":[1181]},{"teal":1133,"source":313,"errorMessage":"transaction verification failed: {\"txn\":\"mbrPayment\",\"field\":\"amount\",\"expected\":\"this.getMbrAmounts().addValidatorMbr\"}","pc":[1182]},{"teal":1137,"source":315,"pc":[1183,1184]},{"teal":1138,"source":315,"pc":[1185,1186]},{"teal":1139,"source":315,"pc":[1187,1188,1189,1190,1191]},{"teal":1140,"source":315,"pc":[1192]},{"teal":1143,"source":315,"errorMessage":"fee must be 10 ALGO or more to prevent spamming of validators","pc":[1193]},{"teal":1147,"source":318,"pc":[1194,1195]},{"teal":1148,"source":318,"pc":[1196]},{"teal":1149,"source":318,"pc":[1197]},{"teal":1150,"source":318,"pc":[1198]},{"teal":1151,"source":318,"pc":[1199,1200]},{"teal":1155,"source":319,"pc":[1201,1202]},{"teal":1156,"source":319,"pc":[1203,1204]},{"teal":1157,"source":319,"pc":[1205]},{"teal":1161,"source":321,"pc":[1206]},{"teal":1162,"source":321,"pc":[1207,1208]},{"teal":1163,"source":321,"pc":[1209]},{"teal":1164,"source":321,"pc":[1210]},{"teal":1165,"source":321,"pc":[1211,1212,1213]},{"teal":1166,"source":321,"pc":[1214]},{"teal":1167,"source":321,"pc":[1215]},{"teal":1171,"source":322,"pc":[1216]},{"teal":1172,"source":322,"pc":[1217,1218]},{"teal":1173,"source":322,"pc":[1219]},{"teal":1174,"source":322,"pc":[1220,1221]},{"teal":1175,"source":322,"pc":[1222]},{"teal":1176,"source":322,"pc":[1223]},{"teal":1177,"source":322,"pc":[1224,1225]},{"teal":1178,"source":322,"pc":[1226]},{"teal":1182,"source":323,"pc":[1227]},{"teal":1183,"source":323,"pc":[1228,1229]},{"teal":1184,"source":323,"pc":[1230]},{"teal":1185,"source":323,"pc":[1231]},{"teal":1186,"source":323,"pc":[1232,1233]},{"teal":1187,"source":323,"pc":[1234]},{"teal":1188,"source":323,"pc":[1235]},{"teal":1189,"source":323,"pc":[1236,1237]},{"teal":1190,"source":323,"pc":[1238]},{"teal":1195,"source":326,"pc":[1239,1240]},{"teal":1196,"source":326,"pc":[1241,1242,1243]},{"teal":1197,"source":326,"pc":[1244]},{"teal":1198,"source":326,"pc":[1245]},{"teal":1199,"source":326,"pc":[1246]},{"teal":1200,"source":326,"pc":[1247,1248,1249]},{"teal":1205,"source":328,"pc":[1250,1251]},{"teal":1206,"source":328,"pc":[1252,1253,1254]},{"teal":1207,"source":328,"pc":[1255]},{"teal":1208,"source":328,"pc":[1256,1257,1258]},{"teal":1211,"source":328,"errorMessage":"provided NFD must be valid","pc":[1259]},{"teal":1218,"source":331,"pc":[1260,1261]},{"teal":1219,"source":331,"pc":[1262,1263]},{"teal":1220,"source":331,"pc":[1264,1265,1266]},{"teal":1221,"source":331,"pc":[1267]},{"teal":1222,"source":331,"pc":[1268,1269]},{"teal":1223,"source":331,"pc":[1270]},{"teal":1226,"source":331,"errorMessage":"global state value does not exist: AppID.fromUint64(config.nfdForInfo).globalState('i.owner.a')","pc":[1271]},{"teal":1227,"source":331,"pc":[1272]},{"teal":1230,"source":330,"errorMessage":"If specifying NFD, account adding validator must be owner","pc":[1273]},{"teal":1237,"source":336,"pc":[1274,1275]},{"teal":1238,"source":336,"pc":[1276,1277,1278]},{"teal":1239,"source":336,"pc":[1279]},{"teal":1240,"source":336,"pc":[1280,1281]},{"teal":1241,"source":336,"pc":[1282]},{"teal":1242,"source":336,"pc":[1283]},{"teal":1243,"source":336,"pc":[1284,1285,1286]},{"teal":1244,"source":337,"pc":[1287,1288]},{"teal":1245,"source":337,"pc":[1289,1290,1291]},{"teal":1246,"source":337,"pc":[1292]},{"teal":1247,"source":337,"pc":[1293,1294]},{"teal":1248,"source":337,"pc":[1295]},{"teal":1249,"source":336,"pc":[1296]},{"teal":1252,"source":335,"pc":[1297,1298,1299]},{"teal":1260,"source":341,"pc":[1300,1301]},{"teal":1261,"source":341,"pc":[1302,1303,1304]},{"teal":1262,"source":341,"pc":[1305]},{"teal":1263,"source":341,"pc":[1306,1307,1308]},{"teal":1266,"source":340,"errorMessage":"provided NFD App id for gating must be valid NFD","pc":[1309]},{"teal":1271,"source":345,"pc":[1310,1311,1312,1313,1314,1315]},{"teal":1272,"source":345,"pc":[1316,1317]},{"teal":1273,"source":345,"pc":[1318]},{"teal":1274,"source":345,"pc":[1319,1320]},{"teal":1275,"source":345,"pc":[1321,1322,1323]},{"teal":1276,"source":345,"pc":[1324]},{"teal":1277,"source":345,"pc":[1325,1326]},{"teal":1278,"source":345,"pc":[1327,1328,1329]},{"teal":1279,"source":345,"pc":[1330]},{"teal":1280,"source":345,"pc":[1331]},{"teal":1281,"source":345,"pc":[1332]},{"teal":1285,"source":346,"pc":[1333,1334]},{"teal":1288,"source":310,"pc":[1335,1336]},{"teal":1289,"source":310,"pc":[1337]},{"teal":1294,"source":356,"pc":[1338,1339,1340]},{"teal":1295,"source":356,"pc":[1341]},{"teal":1296,"source":356,"pc":[1342]},{"teal":1297,"source":356,"pc":[1343,1344]},{"teal":1298,"source":356,"pc":[1345]},{"teal":1301,"source":356,"errorMessage":"argument 0 (manager) for changeValidatorManager must be a address","pc":[1346]},{"teal":1304,"source":356,"pc":[1347,1348,1349]},{"teal":1305,"source":356,"pc":[1350]},{"teal":1308,"source":356,"pc":[1351,1352,1353]},{"teal":1309,"source":356,"pc":[1354]},{"teal":1310,"source":356,"pc":[1355]},{"teal":1320,"source":356,"pc":[1356,1357,1358]},{"teal":1324,"source":357,"pc":[1359,1360]},{"teal":1325,"source":357,"pc":[1361,1362,1363]},{"teal":1329,"source":358,"pc":[1364,1365]},{"teal":1330,"source":358,"pc":[1366,1367]},{"teal":1331,"source":358,"pc":[1368]},{"teal":1334,"source":358,"errorMessage":"needs to at least be valid address","pc":[1369]},{"teal":1338,"source":359,"pc":[1370,1371]},{"teal":1339,"source":359,"pc":[1372,1373]},{"teal":1340,"source":359,"pc":[1374]},{"teal":1341,"source":359,"pc":[1375,1376]},{"teal":1342,"source":359,"pc":[1377]},{"teal":1343,"source":359,"pc":[1378]},{"teal":1344,"source":359,"pc":[1379,1380]},{"teal":1345,"source":359,"pc":[1381]},{"teal":1346,"source":356,"pc":[1382]},{"teal":1351,"source":370,"pc":[1383,1384,1385]},{"teal":1352,"source":370,"pc":[1386]},{"teal":1355,"source":370,"pc":[1387,1388,1389]},{"teal":1356,"source":370,"pc":[1390]},{"teal":1359,"source":370,"pc":[1391,1392,1393]},{"teal":1360,"source":370,"pc":[1394]},{"teal":1363,"source":370,"pc":[1395,1396,1397]},{"teal":1364,"source":370,"pc":[1398]},{"teal":1365,"source":370,"pc":[1399]},{"teal":1376,"source":370,"pc":[1400,1401,1402]},{"teal":1380,"source":371,"pc":[1403,1404]},{"teal":1381,"source":371,"pc":[1405,1406,1407]},{"teal":1385,"source":372,"pc":[1408,1409]},{"teal":1386,"source":372,"pc":[1410,1411]},{"teal":1387,"source":372,"pc":[1412]},{"teal":1388,"source":372,"pc":[1413]},{"teal":1389,"source":372,"pc":[1414,1415]},{"teal":1390,"source":372,"pc":[1416]},{"teal":1391,"source":372,"pc":[1417]},{"teal":1392,"source":372,"pc":[1418,1419]},{"teal":1393,"source":372,"pc":[1420]},{"teal":1397,"source":373,"pc":[1421,1422,1423]},{"teal":1398,"source":373,"pc":[1424,1425]},{"teal":1399,"source":373,"pc":[1426]},{"teal":1400,"source":373,"pc":[1427]},{"teal":1401,"source":373,"pc":[1428,1429]},{"teal":1402,"source":373,"pc":[1430]},{"teal":1403,"source":373,"pc":[1431]},{"teal":1404,"source":373,"pc":[1432,1433]},{"teal":1405,"source":373,"pc":[1434]},{"teal":1406,"source":370,"pc":[1435]},{"teal":1411,"source":384,"pc":[1436,1437,1438]},{"teal":1412,"source":384,"pc":[1439,1440,1441]},{"teal":1415,"source":384,"pc":[1442,1443,1444]},{"teal":1416,"source":384,"pc":[1445]},{"teal":1419,"source":384,"pc":[1446,1447,1448]},{"teal":1420,"source":384,"pc":[1449]},{"teal":1423,"source":384,"pc":[1450,1451,1452]},{"teal":1424,"source":384,"pc":[1453]},{"teal":1425,"source":384,"pc":[1454]},{"teal":1436,"source":384,"pc":[1455,1456,1457]},{"teal":1440,"source":385,"pc":[1458,1459]},{"teal":1441,"source":385,"pc":[1460,1461,1462]},{"teal":1445,"source":387,"pc":[1463,1464]},{"teal":1446,"source":387,"pc":[1465,1466,1467]},{"teal":1449,"source":387,"errorMessage":"provided NFD must be valid","pc":[1468]},{"teal":1456,"source":390,"pc":[1469,1470]},{"teal":1457,"source":390,"pc":[1471,1472]},{"teal":1458,"source":390,"pc":[1473,1474]},{"teal":1459,"source":390,"pc":[1475]},{"teal":1462,"source":390,"errorMessage":"global state value does not exist: AppID.fromUint64(nfdAppID).globalState('i.owner.a')","pc":[1476]},{"teal":1463,"source":390,"pc":[1477]},{"teal":1466,"source":389,"errorMessage":"If specifying NFD, account adding validator must be owner","pc":[1478]},{"teal":1470,"source":393,"pc":[1479,1480]},{"teal":1471,"source":393,"pc":[1481,1482]},{"teal":1472,"source":393,"pc":[1483]},{"teal":1473,"source":393,"pc":[1484]},{"teal":1474,"source":393,"pc":[1485,1486]},{"teal":1475,"source":393,"pc":[1487]},{"teal":1476,"source":393,"pc":[1488]},{"teal":1477,"source":393,"pc":[1489,1490]},{"teal":1478,"source":393,"pc":[1491]},{"teal":1479,"source":384,"pc":[1492]},{"teal":1484,"source":400,"pc":[1493,1494,1495]},{"teal":1485,"source":400,"pc":[1496]},{"teal":1486,"source":400,"pc":[1497]},{"teal":1487,"source":400,"pc":[1498,1499]},{"teal":1488,"source":400,"pc":[1500]},{"teal":1491,"source":400,"errorMessage":"argument 0 (commissionAddress) for changeValidatorCommissionAddress must be a address","pc":[1501]},{"teal":1494,"source":400,"pc":[1502,1503,1504]},{"teal":1495,"source":400,"pc":[1505]},{"teal":1498,"source":400,"pc":[1506,1507,1508]},{"teal":1499,"source":400,"pc":[1509]},{"teal":1500,"source":400,"pc":[1510]},{"teal":1507,"source":400,"pc":[1511,1512,1513]},{"teal":1511,"source":401,"pc":[1514,1515]},{"teal":1512,"source":401,"pc":[1516,1517,1518]},{"teal":1516,"source":402,"pc":[1519,1520]},{"teal":1517,"source":402,"pc":[1521,1522]},{"teal":1518,"source":402,"pc":[1523]},{"teal":1519,"source":402,"pc":[1524]},{"teal":1523,"source":403,"pc":[1525,1526,1527]},{"teal":1524,"source":403,"pc":[1528,1529]},{"teal":1525,"source":403,"pc":[1530]},{"teal":1526,"source":403,"pc":[1531,1532]},{"teal":1527,"source":403,"pc":[1533]},{"teal":1528,"source":403,"pc":[1534]},{"teal":1529,"source":403,"pc":[1535,1536]},{"teal":1530,"source":403,"pc":[1537]},{"teal":1531,"source":400,"pc":[1538]},{"teal":1536,"source":416,"pc":[1539,1540,1541]},{"teal":1537,"source":416,"pc":[1542]},{"teal":1540,"source":415,"pc":[1543,1544,1545]},{"teal":1541,"source":415,"pc":[1546]},{"teal":1544,"source":414,"pc":[1547,1548,1549]},{"teal":1545,"source":414,"pc":[1550]},{"teal":1546,"source":414,"pc":[1551]},{"teal":1547,"source":414,"pc":[1552,1553]},{"teal":1548,"source":414,"pc":[1554]},{"teal":1551,"source":414,"errorMessage":"argument 2 (EntryGatingAssets) for changeValidatorRewardInfo must be a uint64[4]","pc":[1555]},{"teal":1554,"source":413,"pc":[1556,1557,1558]},{"teal":1555,"source":413,"pc":[1559]},{"teal":1556,"source":413,"pc":[1560]},{"teal":1557,"source":413,"pc":[1561,1562]},{"teal":1558,"source":413,"pc":[1563]},{"teal":1561,"source":413,"errorMessage":"argument 3 (EntryGatingAddress) for changeValidatorRewardInfo must be a address","pc":[1564]},{"teal":1564,"source":412,"pc":[1565,1566,1567]},{"teal":1565,"source":412,"pc":[1568]},{"teal":1566,"source":412,"pc":[1569]},{"teal":1567,"source":412,"pc":[1570]},{"teal":1568,"source":412,"pc":[1571]},{"teal":1571,"source":412,"errorMessage":"argument 4 (EntryGatingType) for changeValidatorRewardInfo must be a uint8","pc":[1572]},{"teal":1572,"source":412,"pc":[1573]},{"teal":1575,"source":411,"pc":[1574,1575,1576]},{"teal":1576,"source":411,"pc":[1577]},{"teal":1579,"source":410,"pc":[1578,1579,1580]},{"teal":1580,"source":410,"pc":[1581]},{"teal":1581,"source":410,"pc":[1582]},{"teal":1588,"source":410,"pc":[1583,1584,1585]},{"teal":1592,"source":418,"pc":[1586,1587]},{"teal":1593,"source":418,"pc":[1588,1589,1590]},{"teal":1600,"source":421,"pc":[1591,1592]},{"teal":1601,"source":421,"pc":[1593]},{"teal":1602,"source":421,"pc":[1594]},{"teal":1603,"source":421,"pc":[1595]},{"teal":1604,"source":421,"pc":[1596,1597,1598]},{"teal":1605,"source":421,"pc":[1599,1600]},{"teal":1606,"source":421,"pc":[1601,1602]},{"teal":1607,"source":421,"pc":[1603]},{"teal":1608,"source":421,"pc":[1604]},{"teal":1612,"source":420,"errorMessage":"invalid Entry gating type","pc":[1605]},{"teal":1617,"source":424,"pc":[1606,1607]},{"teal":1618,"source":424,"pc":[1608]},{"teal":1619,"source":424,"pc":[1609]},{"teal":1620,"source":424,"pc":[1610,1611,1612]},{"teal":1625,"source":425,"pc":[1613,1614]},{"teal":1626,"source":425,"pc":[1615,1616]},{"teal":1627,"source":425,"pc":[1617]},{"teal":1628,"source":425,"pc":[1618]},{"teal":1635,"source":428,"pc":[1619,1620]},{"teal":1636,"source":428,"pc":[1621,1622]},{"teal":1637,"source":428,"pc":[1623]},{"teal":1638,"source":428,"pc":[1624]},{"teal":1639,"source":428,"pc":[1625,1626,1627]},{"teal":1640,"source":429,"pc":[1628,1629]},{"teal":1641,"source":429,"pc":[1630,1631]},{"teal":1642,"source":429,"pc":[1632]},{"teal":1643,"source":428,"pc":[1633]},{"teal":1646,"source":427,"pc":[1634,1635,1636]},{"teal":1651,"source":431,"pc":[1637,1638]},{"teal":1652,"source":431,"pc":[1639,1640,1641]},{"teal":1653,"source":431,"pc":[1642]},{"teal":1654,"source":431,"pc":[1643,1644,1645]},{"teal":1657,"source":431,"errorMessage":"provided NFD App id for gating must be valid NFD","pc":[1646]},{"teal":1662,"source":433,"pc":[1647,1648]},{"teal":1663,"source":433,"pc":[1649,1650]},{"teal":1664,"source":433,"pc":[1651]},{"teal":1665,"source":433,"pc":[1652,1653,1654]},{"teal":1666,"source":433,"pc":[1655]},{"teal":1667,"source":433,"pc":[1656,1657]},{"teal":1668,"source":433,"pc":[1658]},{"teal":1669,"source":433,"pc":[1659]},{"teal":1670,"source":433,"pc":[1660,1661]},{"teal":1671,"source":433,"pc":[1662]},{"teal":1675,"source":434,"pc":[1663,1664]},{"teal":1676,"source":434,"pc":[1665,1666]},{"teal":1677,"source":434,"pc":[1667]},{"teal":1678,"source":434,"pc":[1668,1669]},{"teal":1679,"source":434,"pc":[1670]},{"teal":1680,"source":434,"pc":[1671]},{"teal":1681,"source":434,"pc":[1672,1673]},{"teal":1682,"source":434,"pc":[1674]},{"teal":1686,"source":435,"pc":[1675,1676]},{"teal":1687,"source":435,"pc":[1677,1678]},{"teal":1688,"source":435,"pc":[1679]},{"teal":1689,"source":435,"pc":[1680,1681]},{"teal":1690,"source":435,"pc":[1682]},{"teal":1691,"source":435,"pc":[1683]},{"teal":1692,"source":435,"pc":[1684,1685]},{"teal":1693,"source":435,"pc":[1686]},{"teal":1697,"source":436,"pc":[1687,1688]},{"teal":1698,"source":436,"pc":[1689,1690]},{"teal":1699,"source":436,"pc":[1691]},{"teal":1700,"source":436,"pc":[1692]},{"teal":1701,"source":436,"pc":[1693,1694]},{"teal":1702,"source":436,"pc":[1695]},{"teal":1703,"source":436,"pc":[1696]},{"teal":1704,"source":436,"pc":[1697,1698]},{"teal":1705,"source":436,"pc":[1699]},{"teal":1709,"source":437,"pc":[1700,1701,1702]},{"teal":1710,"source":437,"pc":[1703,1704]},{"teal":1711,"source":437,"pc":[1705]},{"teal":1712,"source":437,"pc":[1706]},{"teal":1713,"source":437,"pc":[1707,1708]},{"teal":1714,"source":437,"pc":[1709]},{"teal":1715,"source":437,"pc":[1710]},{"teal":1716,"source":437,"pc":[1711,1712]},{"teal":1717,"source":437,"pc":[1713]},{"teal":1718,"source":410,"pc":[1714]},{"teal":1723,"source":451,"pc":[1715]},{"teal":1726,"source":451,"pc":[1716,1717,1718]},{"teal":1727,"source":451,"pc":[1719]},{"teal":1730,"source":451,"pc":[1720,1721,1722]},{"teal":1731,"source":451,"pc":[1723]},{"teal":1734,"source":451,"pc":[1724,1725]},{"teal":1735,"source":451,"pc":[1726]},{"teal":1736,"source":451,"pc":[1727]},{"teal":1737,"source":451,"pc":[1728]},{"teal":1738,"source":451,"pc":[1729,1730]},{"teal":1739,"source":451,"pc":[1731]},{"teal":1740,"source":451,"pc":[1732]},{"teal":1743,"source":451,"errorMessage":"argument 2 (mbrPayment) for addPool must be a pay transaction","pc":[1733]},{"teal":1746,"source":451,"pc":[1734,1735,1736]},{"teal":1747,"source":451,"pc":[1737]},{"teal":1748,"source":451,"pc":[1738]},{"teal":1749,"source":451,"pc":[1739]},{"teal":1750,"source":451,"pc":[1740]},{"teal":1763,"source":451,"pc":[1741,1742,1743]},{"teal":1766,"source":451,"pc":[1744]},{"teal":1767,"source":451,"pc":[1745]},{"teal":1771,"source":452,"pc":[1746,1747]},{"teal":1772,"source":452,"pc":[1748,1749,1750]},{"teal":1777,"source":455,"pc":[1751,1752]},{"teal":1778,"source":455,"pc":[1753,1754]},{"teal":1779,"source":455,"pc":[1755,1756]},{"teal":1780,"source":455,"pc":[1757]},{"teal":1783,"source":455,"errorMessage":"transaction verification failed: {\"txn\":\"mbrPayment\",\"field\":\"receiver\",\"expected\":\"this.app.address\"}","pc":[1758]},{"teal":1786,"source":455,"pc":[1759,1760]},{"teal":1787,"source":455,"pc":[1761,1762]},{"teal":1788,"source":455,"pc":[1763,1764,1765]},{"teal":1789,"source":455,"pc":[1766,1767,1768]},{"teal":1790,"source":455,"pc":[1769]},{"teal":1791,"source":455,"pc":[1770]},{"teal":1794,"source":455,"errorMessage":"transaction verification failed: {\"txn\":\"mbrPayment\",\"field\":\"amount\",\"expected\":\"this.getMbrAmounts().addPoolMbr\"}","pc":[1771]},{"teal":1798,"source":457,"pc":[1772]},{"teal":1799,"source":457,"pc":[1773,1774]},{"teal":1800,"source":457,"pc":[1775]},{"teal":1801,"source":457,"pc":[1776]},{"teal":1802,"source":457,"pc":[1777]},{"teal":1803,"source":457,"pc":[1778]},{"teal":1804,"source":457,"pc":[1779]},{"teal":1807,"source":457,"errorMessage":"specified validator id isn't valid","pc":[1780]},{"teal":1811,"source":459,"pc":[1781,1782]},{"teal":1812,"source":459,"pc":[1783,1784]},{"teal":1813,"source":459,"pc":[1785]},{"teal":1814,"source":459,"pc":[1786,1787]},{"teal":1815,"source":459,"pc":[1788]},{"teal":1816,"source":459,"pc":[1789]},{"teal":1817,"source":459,"pc":[1790,1791]},{"teal":1818,"source":459,"pc":[1792]},{"teal":1819,"source":459,"pc":[1793]},{"teal":1820,"source":459,"pc":[1794,1795]},{"teal":1825,"source":460,"pc":[1796,1797]},{"teal":1826,"source":58,"pc":[1798]},{"teal":1827,"source":460,"pc":[1799]},{"teal":1828,"source":460,"pc":[1800,1801,1802]},{"teal":1832,"source":461,"errorMessage":"already at max pool size","pc":[1803]},{"teal":1837,"source":463,"pc":[1804,1805]},{"teal":1838,"source":463,"pc":[1806]},{"teal":1839,"source":463,"pc":[1807]},{"teal":1840,"source":463,"pc":[1808,1809]},{"teal":1862,"source":466,"pc":[1810]},{"teal":1863,"source":466,"pc":[1811,1812]},{"teal":1864,"source":466,"pc":[1813,1814]},{"teal":1868,"source":467,"pc":[1815]},{"teal":1869,"source":467,"pc":[1816,1817]},{"teal":1876,"source":469,"pc":[1818,1819]},{"teal":1877,"source":469,"pc":[1820]},{"teal":1878,"source":469,"pc":[1821,1822]},{"teal":1879,"source":469,"pc":[1823]},{"teal":1880,"source":469,"pc":[1824,1825]},{"teal":1881,"source":470,"pc":[1826,1827]},{"teal":1882,"source":470,"pc":[1828,1829]},{"teal":1883,"source":470,"pc":[1830,1831]},{"teal":1884,"source":470,"pc":[1832]},{"teal":1887,"source":470,"errorMessage":"box value does not exist: this.stakingPoolApprovalProgram.size","pc":[1833]},{"teal":1888,"source":470,"pc":[1834,1835]},{"teal":1889,"source":470,"pc":[1836]},{"teal":1890,"source":470,"pc":[1837]},{"teal":1891,"source":470,"pc":[1838,1839]},{"teal":1895,"source":472,"pc":[1840,1841,1842]},{"teal":1896,"source":472,"pc":[1843,1844]},{"teal":1900,"source":473,"pc":[1845,1846]},{"teal":1901,"source":473,"pc":[1847,1848]},{"teal":1905,"source":474,"pc":[1849,1850]},{"teal":1906,"source":474,"pc":[1851,1852]},{"teal":1910,"source":475,"pc":[1853,1854]},{"teal":1911,"source":475,"pc":[1855,1856]},{"teal":1922,"source":478,"pc":[1857,1858,1859,1860,1861,1862]},{"teal":1923,"source":478,"pc":[1863,1864]},{"teal":1924,"source":479,"pc":[1865,1866,1867]},{"teal":1925,"source":479,"pc":[1868]},{"teal":1926,"source":479,"pc":[1869,1870]},{"teal":1927,"source":480,"pc":[1871,1872]},{"teal":1928,"source":480,"pc":[1873]},{"teal":1929,"source":480,"pc":[1874,1875]},{"teal":1930,"source":481,"pc":[1876,1877]},{"teal":1931,"source":481,"pc":[1878]},{"teal":1932,"source":481,"pc":[1879,1880]},{"teal":1933,"source":482,"pc":[1881,1882]},{"teal":1934,"source":482,"pc":[1883]},{"teal":1935,"source":482,"pc":[1884]},{"teal":1936,"source":482,"pc":[1885,1886]},{"teal":1937,"source":482,"pc":[1887]},{"teal":1938,"source":482,"pc":[1888]},{"teal":1939,"source":482,"pc":[1889,1890]},{"teal":1940,"source":482,"pc":[1891]},{"teal":1941,"source":482,"pc":[1892]},{"teal":1942,"source":482,"pc":[1893]},{"teal":1943,"source":482,"pc":[1894,1895]},{"teal":1946,"source":466,"pc":[1896]},{"teal":1947,"source":466,"pc":[1897,1898]},{"teal":1950,"source":466,"pc":[1899]},{"teal":1954,"source":486,"pc":[1900,1901]},{"teal":1955,"source":486,"pc":[1902,1903]},{"teal":1956,"source":486,"pc":[1904]},{"teal":1957,"source":486,"pc":[1905,1906,1907]},{"teal":1958,"source":486,"pc":[1908]},{"teal":1959,"source":486,"pc":[1909,1910]},{"teal":1960,"source":486,"pc":[1911]},{"teal":1961,"source":486,"pc":[1912]},{"teal":1962,"source":486,"pc":[1913,1914]},{"teal":1963,"source":486,"pc":[1915]},{"teal":1967,"source":489,"pc":[1916,1917]},{"teal":1968,"source":489,"pc":[1918,1919]},{"teal":1972,"source":490,"pc":[1920,1921]},{"teal":1973,"source":490,"pc":[1922,1923]},{"teal":1974,"source":490,"pc":[1924]},{"teal":1975,"source":490,"pc":[1925]},{"teal":1976,"source":490,"pc":[1926,1927]},{"teal":1977,"source":490,"pc":[1928]},{"teal":1978,"source":490,"pc":[1929]},{"teal":1979,"source":490,"pc":[1930]},{"teal":1980,"source":490,"pc":[1931]},{"teal":1981,"source":490,"pc":[1932,1933]},{"teal":1982,"source":490,"pc":[1934]},{"teal":1983,"source":490,"pc":[1935]},{"teal":1984,"source":490,"pc":[1936,1937]},{"teal":1985,"source":490,"pc":[1938]},{"teal":1986,"source":490,"pc":[1939]},{"teal":1987,"source":490,"pc":[1940,1941]},{"teal":1988,"source":490,"pc":[1942]},{"teal":1992,"source":491,"pc":[1943,1944]},{"teal":1993,"source":491,"pc":[1945,1946]},{"teal":1994,"source":491,"pc":[1947,1948]},{"teal":1995,"source":491,"pc":[1949,1950,1951]},{"teal":2003,"source":493,"pc":[1952,1953,1954,1955,1956,1957]},{"teal":2004,"source":494,"pc":[1958,1959]},{"teal":2005,"source":494,"pc":[1960]},{"teal":2006,"source":495,"pc":[1961,1962]},{"teal":2007,"source":495,"pc":[1963]},{"teal":2008,"source":495,"pc":[1964]},{"teal":2009,"source":495,"pc":[1965]},{"teal":2010,"source":495,"pc":[1966,1967]},{"teal":2011,"source":495,"pc":[1968]},{"teal":2014,"source":495,"errorMessage":"numPools as uint16 overflowed 16 bits","pc":[1969]},{"teal":2015,"source":495,"pc":[1970,1971,1972]},{"teal":2016,"source":495,"pc":[1973]},{"teal":2017,"source":496,"pc":[1974,1975]},{"teal":2018,"source":496,"pc":[1976]},{"teal":2019,"source":496,"pc":[1977]},{"teal":2020,"source":493,"pc":[1978]},{"teal":2021,"source":493,"pc":[1979]},{"teal":2025,"source":499,"pc":[1980,1981]},{"teal":2026,"source":499,"pc":[1982]},{"teal":2027,"source":499,"pc":[1983,1984]},{"teal":2028,"source":499,"pc":[1985]},{"teal":2029,"source":499,"pc":[1986]},{"teal":2030,"source":499,"pc":[1987,1988]},{"teal":2031,"source":499,"pc":[1989]},{"teal":2032,"source":499,"pc":[1990]},{"teal":2035,"source":451,"pc":[1991,1992]},{"teal":2038,"source":451,"pc":[1993,1994]},{"teal":2039,"source":451,"pc":[1995]},{"teal":2044,"source":511,"pc":[1996]},{"teal":2047,"source":511,"pc":[1997,1998,1999]},{"teal":2048,"source":511,"pc":[2000]},{"teal":2051,"source":511,"pc":[2001,2002,2003]},{"teal":2052,"source":511,"pc":[2004]},{"teal":2055,"source":511,"pc":[2005,2006]},{"teal":2056,"source":511,"pc":[2007]},{"teal":2057,"source":511,"pc":[2008]},{"teal":2058,"source":511,"pc":[2009]},{"teal":2059,"source":511,"pc":[2010,2011]},{"teal":2060,"source":511,"pc":[2012]},{"teal":2061,"source":511,"pc":[2013]},{"teal":2064,"source":511,"errorMessage":"argument 2 (stakedAmountPayment) for addStake must be a pay transaction","pc":[2014]},{"teal":2067,"source":511,"pc":[2015,2016,2017]},{"teal":2068,"source":511,"pc":[2018]},{"teal":2069,"source":511,"pc":[2019]},{"teal":2070,"source":511,"pc":[2020]},{"teal":2071,"source":511,"pc":[2021]},{"teal":2083,"source":511,"pc":[2022,2023,2024]},{"teal":2086,"source":511,"pc":[2025]},{"teal":2087,"source":511,"pc":[2026,2027]},{"teal":2091,"source":512,"pc":[2028]},{"teal":2092,"source":512,"pc":[2029,2030]},{"teal":2093,"source":512,"pc":[2031]},{"teal":2094,"source":512,"pc":[2032]},{"teal":2095,"source":512,"pc":[2033]},{"teal":2096,"source":512,"pc":[2034]},{"teal":2097,"source":512,"pc":[2035]},{"teal":2100,"source":512,"errorMessage":"specified validator id isn't valid","pc":[2036]},{"teal":2105,"source":515,"pc":[2037,2038]},{"teal":2106,"source":515,"pc":[2039]},{"teal":2107,"source":515,"pc":[2040]},{"teal":2108,"source":515,"pc":[2041,2042]},{"teal":2109,"source":515,"pc":[2043]},{"teal":2110,"source":515,"pc":[2044]},{"teal":2111,"source":515,"pc":[2045,2046]},{"teal":2112,"source":515,"pc":[2047]},{"teal":2113,"source":515,"pc":[2048]},{"teal":2114,"source":515,"pc":[2049]},{"teal":2115,"source":515,"pc":[2050]},{"teal":2116,"source":515,"pc":[2051,2052,2053]},{"teal":2124,"source":518,"pc":[2054,2055]},{"teal":2125,"source":518,"pc":[2056]},{"teal":2126,"source":518,"pc":[2057]},{"teal":2127,"source":518,"pc":[2058,2059]},{"teal":2128,"source":518,"pc":[2060]},{"teal":2129,"source":518,"pc":[2061]},{"teal":2130,"source":518,"pc":[2062,2063]},{"teal":2131,"source":518,"pc":[2064]},{"teal":2132,"source":518,"pc":[2065]},{"teal":2133,"source":518,"pc":[2066,2067]},{"teal":2134,"source":518,"pc":[2068]},{"teal":2137,"source":517,"errorMessage":"can't stake with a validator that is past its sunsetting time","pc":[2069]},{"teal":2142,"source":523,"pc":[2070,2071]},{"teal":2143,"source":523,"pc":[2072,2073]},{"teal":2151,"source":527,"pc":[2074,2075]},{"teal":2152,"source":528,"pc":[2076,2077]},{"teal":2153,"source":528,"pc":[2078,2079]},{"teal":2154,"source":528,"pc":[2080]},{"teal":2157,"source":528,"errorMessage":"transaction verification failed: {\"txn\":\"stakedAmountPayment\",\"field\":\"sender\",\"expected\":\"staker\"}","pc":[2081]},{"teal":2160,"source":527,"pc":[2082,2083]},{"teal":2161,"source":529,"pc":[2084,2085]},{"teal":2162,"source":529,"pc":[2086,2087]},{"teal":2163,"source":529,"pc":[2088]},{"teal":2166,"source":529,"errorMessage":"transaction verification failed: {\"txn\":\"stakedAmountPayment\",\"field\":\"receiver\",\"expected\":\"this.app.address\"}","pc":[2089]},{"teal":2170,"source":535,"pc":[2090,2091]},{"teal":2171,"source":535,"pc":[2092,2093]},{"teal":2172,"source":535,"pc":[2094,2095,2096]},{"teal":2176,"source":537,"pc":[2097,2098]},{"teal":2177,"source":537,"pc":[2099,2100]},{"teal":2178,"source":537,"pc":[2101,2102]},{"teal":2182,"source":538,"pc":[2103]},{"teal":2183,"source":538,"pc":[2104,2105]},{"teal":2188,"source":540,"pc":[2106,2107]},{"teal":2189,"source":540,"pc":[2108,2109,2110]},{"teal":2190,"source":540,"pc":[2111,2112,2113]},{"teal":2195,"source":543,"pc":[2114,2115,2116]},{"teal":2196,"source":543,"pc":[2117,2118,2119]},{"teal":2197,"source":543,"pc":[2120]},{"teal":2198,"source":543,"pc":[2121,2122]},{"teal":2202,"source":544,"pc":[2123,2124]},{"teal":2203,"source":544,"pc":[2125,2126]},{"teal":2204,"source":544,"pc":[2127]},{"teal":2205,"source":544,"pc":[2128,2129]},{"teal":2209,"source":545,"pc":[2130]},{"teal":2210,"source":545,"pc":[2131,2132]},{"teal":2211,"source":545,"pc":[2133]},{"teal":2212,"source":545,"pc":[2134,2135,2136]},{"teal":2213,"source":545,"pc":[2137]},{"teal":2214,"source":545,"pc":[2138]},{"teal":2222,"source":550,"pc":[2139,2140]},{"teal":2223,"source":550,"pc":[2141]},{"teal":2224,"source":550,"pc":[2142]},{"teal":2225,"source":550,"pc":[2143,2144]},{"teal":2226,"source":550,"pc":[2145]},{"teal":2227,"source":550,"pc":[2146]},{"teal":2228,"source":550,"pc":[2147,2148]},{"teal":2229,"source":550,"pc":[2149]},{"teal":2230,"source":550,"pc":[2150]},{"teal":2231,"source":550,"pc":[2151,2152]},{"teal":2232,"source":550,"pc":[2153]},{"teal":2233,"source":550,"pc":[2154,2155,2156]},{"teal":2234,"source":550,"pc":[2157]},{"teal":2237,"source":549,"errorMessage":"total staked for all of a validators pools may not exceed hard cap","pc":[2158]},{"teal":2241,"source":556,"pc":[2159,2160]},{"teal":2242,"source":556,"pc":[2161,2162]},{"teal":2243,"source":556,"pc":[2163,2164]},{"teal":2244,"source":556,"pc":[2165,2166,2167]},{"teal":2245,"source":556,"pc":[2168,2169]},{"teal":2251,"source":558,"pc":[2170,2171]},{"teal":2252,"source":558,"pc":[2172,2173]},{"teal":2253,"source":558,"pc":[2174,2175]},{"teal":2254,"source":558,"pc":[2176,2177]},{"teal":2255,"source":558,"pc":[2178]},{"teal":2256,"source":558,"pc":[2179,2180]},{"teal":2260,"source":559,"pc":[2181,2182]},{"teal":2261,"source":559,"pc":[2183,2184]},{"teal":2262,"source":559,"pc":[2185,2186]},{"teal":2263,"source":559,"pc":[2187,2188,2189]},{"teal":2264,"source":559,"pc":[2190]},{"teal":2265,"source":559,"pc":[2191,2192]},{"teal":2270,"source":560,"pc":[2193,2194]},{"teal":2271,"source":560,"pc":[2195,2196]},{"teal":2272,"source":560,"pc":[2197,2198]},{"teal":2273,"source":560,"pc":[2199,2200,2201]},{"teal":2274,"source":560,"pc":[2202]},{"teal":2275,"source":560,"pc":[2203]},{"teal":2276,"source":560,"pc":[2204]},{"teal":2277,"source":560,"pc":[2205,2206,2207]},{"teal":2281,"source":561,"errorMessage":"No pool available with free stake. Validator needs to add another pool","pc":[2208]},{"teal":2286,"source":565,"pc":[2209,2210]},{"teal":2287,"source":565,"pc":[2211,2212]},{"teal":2288,"source":565,"pc":[2213,2214]},{"teal":2289,"source":565,"pc":[2215,2216,2217]},{"teal":2290,"source":565,"pc":[2218,2219]},{"teal":2291,"source":565,"pc":[2220,2221,2222]},{"teal":2301,"source":573,"pc":[2223,2224]},{"teal":2302,"source":572,"pc":[2225,2226]},{"teal":2303,"source":571,"pc":[2227,2228]},{"teal":2304,"source":570,"pc":[2229,2230]},{"teal":2305,"source":570,"pc":[2231,2232]},{"teal":2306,"source":570,"pc":[2233,2234]},{"teal":2307,"source":570,"pc":[2235,2236,2237]},{"teal":2308,"source":569,"pc":[2238,2239]},{"teal":2309,"source":568,"pc":[2240,2241,2242]},{"teal":2319,"source":575,"pc":[2243,2244,2245,2246,2247,2248]},{"teal":2320,"source":576,"pc":[2249,2250]},{"teal":2321,"source":576,"pc":[2251]},{"teal":2322,"source":577,"pc":[2252,2253]},{"teal":2323,"source":577,"pc":[2254,2255]},{"teal":2324,"source":577,"pc":[2256,2257]},{"teal":2325,"source":577,"pc":[2258,2259,2260]},{"teal":2326,"source":577,"pc":[2261]},{"teal":2327,"source":577,"pc":[2262]},{"teal":2328,"source":577,"pc":[2263]},{"teal":2329,"source":577,"pc":[2264]},{"teal":2330,"source":577,"pc":[2265,2266]},{"teal":2331,"source":577,"pc":[2267]},{"teal":2334,"source":577,"errorMessage":"poolKey.poolId as uint16 overflowed 16 bits","pc":[2268]},{"teal":2335,"source":577,"pc":[2269,2270,2271]},{"teal":2336,"source":577,"pc":[2272]},{"teal":2337,"source":578,"pc":[2273,2274]},{"teal":2338,"source":578,"pc":[2275,2276]},{"teal":2339,"source":578,"pc":[2277,2278]},{"teal":2340,"source":578,"pc":[2279,2280,2281]},{"teal":2341,"source":578,"pc":[2282]},{"teal":2342,"source":578,"pc":[2283]},{"teal":2343,"source":578,"pc":[2284]},{"teal":2344,"source":580,"pc":[2285,2286]},{"teal":2345,"source":580,"pc":[2287]},{"teal":2346,"source":579,"pc":[2288,2289]},{"teal":2347,"source":579,"pc":[2290]},{"teal":2348,"source":579,"pc":[2291]},{"teal":2349,"source":575,"pc":[2292]},{"teal":2350,"source":575,"pc":[2293]},{"teal":2354,"source":583,"pc":[2294,2295]},{"teal":2355,"source":583,"pc":[2296,2297]},{"teal":2356,"source":583,"pc":[2298,2299]},{"teal":2357,"source":583,"pc":[2300,2301,2302]},{"teal":2360,"source":511,"pc":[2303,2304]},{"teal":2363,"source":511,"pc":[2305,2306]},{"teal":2364,"source":511,"pc":[2307]},{"teal":2369,"source":601,"pc":[2308]},{"teal":2372,"source":601,"pc":[2309,2310,2311]},{"teal":2373,"source":601,"pc":[2312]},{"teal":2376,"source":601,"pc":[2313,2314,2315]},{"teal":2377,"source":601,"pc":[2316]},{"teal":2378,"source":601,"pc":[2317]},{"teal":2379,"source":601,"pc":[2318]},{"teal":2380,"source":601,"pc":[2319]},{"teal":2398,"source":601,"pc":[2320,2321,2322]},{"teal":2401,"source":601,"pc":[2323]},{"teal":2402,"source":601,"pc":[2324,2325]},{"teal":2406,"source":603,"pc":[2326,2327]},{"teal":2407,"source":603,"pc":[2328]},{"teal":2408,"source":603,"pc":[2329]},{"teal":2409,"source":603,"pc":[2330,2331]},{"teal":2410,"source":603,"pc":[2332]},{"teal":2411,"source":603,"pc":[2333]},{"teal":2412,"source":603,"pc":[2334,2335]},{"teal":2413,"source":603,"pc":[2336]},{"teal":2414,"source":603,"pc":[2337]},{"teal":2415,"source":603,"pc":[2338,2339]},{"teal":2419,"source":604,"pc":[2340,2341]},{"teal":2420,"source":604,"pc":[2342]},{"teal":2421,"source":604,"pc":[2343]},{"teal":2422,"source":604,"pc":[2344]},{"teal":2427,"source":606,"pc":[2345,2346]},{"teal":2428,"source":606,"pc":[2347,2348]},{"teal":2429,"source":606,"pc":[2349,2350]},{"teal":2430,"source":606,"pc":[2351]},{"teal":2431,"source":606,"pc":[2352]},{"teal":2432,"source":606,"pc":[2353,2354,2355]},{"teal":2437,"source":607,"pc":[2356,2357]},{"teal":2438,"source":607,"pc":[2358,2359]},{"teal":2439,"source":607,"pc":[2360]},{"teal":2440,"source":607,"pc":[2361,2362]},{"teal":2441,"source":607,"pc":[2363]},{"teal":2442,"source":607,"pc":[2364]},{"teal":2443,"source":607,"pc":[2365,2366]},{"teal":2444,"source":607,"pc":[2367]},{"teal":2445,"source":607,"pc":[2368,2369,2370]},{"teal":2450,"source":613,"pc":[2371,2372]},{"teal":2451,"source":613,"pc":[2373,2374]},{"teal":2455,"source":614,"pc":[2375,2376]},{"teal":2456,"source":614,"pc":[2377]},{"teal":2457,"source":614,"pc":[2378]},{"teal":2458,"source":614,"pc":[2379,2380]},{"teal":2459,"source":614,"pc":[2381]},{"teal":2460,"source":614,"pc":[2382]},{"teal":2461,"source":614,"pc":[2383,2384]},{"teal":2462,"source":614,"pc":[2385]},{"teal":2463,"source":614,"pc":[2386]},{"teal":2464,"source":614,"pc":[2387,2388]},{"teal":2469,"source":615,"pc":[2389,2390]},{"teal":2470,"source":615,"pc":[2391]},{"teal":2471,"source":615,"pc":[2392]},{"teal":2472,"source":615,"pc":[2393,2394,2395]},{"teal":2478,"source":617,"pc":[2396,2397]},{"teal":2479,"source":617,"pc":[2398,2399,2400,2401,2402,2403,2404,2405,2406,2407,2408,2409]},{"teal":2480,"source":617,"pc":[2410]},{"teal":2483,"source":617,"errorMessage":"global state value does not exist: AppID.fromUint64(pool1AppID).globalState('lastPayout')","pc":[2411]},{"teal":2484,"source":617,"pc":[2412,2413]},{"teal":2485,"source":617,"pc":[2414]},{"teal":2486,"source":617,"pc":[2415,2416,2417]},{"teal":2491,"source":618,"pc":[2418,2419]},{"teal":2492,"source":618,"pc":[2420,2421]},{"teal":2493,"source":618,"pc":[2422]},{"teal":2494,"source":618,"pc":[2423,2424]},{"teal":2495,"source":618,"pc":[2425]},{"teal":2496,"source":618,"pc":[2426]},{"teal":2497,"source":618,"pc":[2427,2428]},{"teal":2498,"source":618,"pc":[2429]},{"teal":2499,"source":618,"pc":[2430,2431,2432]},{"teal":2504,"source":620,"pc":[2433,2434,2435]},{"teal":2505,"source":620,"pc":[2436,2437]},{"teal":2506,"source":620,"pc":[2438]},{"teal":2507,"source":620,"pc":[2439,2440]},{"teal":2508,"source":620,"pc":[2441]},{"teal":2509,"source":620,"pc":[2442]},{"teal":2510,"source":620,"pc":[2443,2444]},{"teal":2511,"source":620,"pc":[2445]},{"teal":2512,"source":620,"pc":[2446]},{"teal":2513,"source":620,"pc":[2447,2448]},{"teal":2517,"source":621,"pc":[2449,2450]},{"teal":2518,"source":621,"pc":[2451,2452]},{"teal":2519,"source":621,"pc":[2453,2454]},{"teal":2520,"source":621,"pc":[2455]},{"teal":2521,"source":621,"pc":[2456]},{"teal":2522,"source":621,"pc":[2457,2458]},{"teal":2527,"source":623,"pc":[2459,2460]},{"teal":2528,"source":623,"pc":[2461,2462]},{"teal":2529,"source":623,"pc":[2463,2464]},{"teal":2530,"source":623,"pc":[2465]},{"teal":2531,"source":623,"pc":[2466]},{"teal":2532,"source":623,"pc":[2467,2468]},{"teal":2533,"source":623,"pc":[2469]},{"teal":2534,"source":623,"pc":[2470,2471,2472]},{"teal":2539,"source":624,"pc":[2473,2474]},{"teal":2540,"source":624,"pc":[2475,2476]},{"teal":2541,"source":624,"pc":[2477]},{"teal":2542,"source":624,"pc":[2478,2479]},{"teal":2543,"source":624,"pc":[2480]},{"teal":2544,"source":624,"pc":[2481]},{"teal":2545,"source":624,"pc":[2482,2483]},{"teal":2546,"source":624,"pc":[2484]},{"teal":2547,"source":624,"pc":[2485,2486,2487]},{"teal":2554,"source":627,"pc":[2488,2489]},{"teal":2555,"source":627,"pc":[2490,2491]},{"teal":2556,"source":627,"pc":[2492]},{"teal":2557,"source":627,"pc":[2493]},{"teal":2558,"source":627,"pc":[2494,2495]},{"teal":2559,"source":627,"pc":[2496]},{"teal":2560,"source":627,"pc":[2497]},{"teal":2561,"source":627,"pc":[2498,2499]},{"teal":2562,"source":627,"pc":[2500]},{"teal":2566,"source":629,"pc":[2501,2502]},{"teal":2567,"source":629,"pc":[2503,2504]},{"teal":2568,"source":629,"pc":[2505]},{"teal":2569,"source":629,"pc":[2506,2507]},{"teal":2570,"source":629,"pc":[2508]},{"teal":2571,"source":629,"pc":[2509]},{"teal":2572,"source":629,"pc":[2510,2511]},{"teal":2573,"source":629,"pc":[2512]},{"teal":2574,"source":629,"pc":[2513]},{"teal":2575,"source":629,"pc":[2514,2515]},{"teal":2579,"source":630,"pc":[2516,2517]},{"teal":2580,"source":630,"pc":[2518]},{"teal":2581,"source":630,"pc":[2519]},{"teal":2582,"source":630,"pc":[2520,2521]},{"teal":2583,"source":630,"pc":[2522]},{"teal":2584,"source":630,"pc":[2523]},{"teal":2585,"source":630,"pc":[2524,2525]},{"teal":2586,"source":630,"pc":[2526]},{"teal":2587,"source":630,"pc":[2527]},{"teal":2588,"source":630,"pc":[2528,2529]},{"teal":2592,"source":631,"pc":[2530]},{"teal":2593,"source":631,"pc":[2531,2532]},{"teal":2598,"source":631,"pc":[2533,2534]},{"teal":2599,"source":631,"pc":[2535,2536]},{"teal":2600,"source":631,"pc":[2537]},{"teal":2601,"source":631,"pc":[2538,2539,2540]},{"teal":2608,"source":637,"pc":[2541,2542]},{"teal":2609,"source":637,"pc":[2543,2544]},{"teal":2610,"source":637,"pc":[2545,2546]},{"teal":2611,"source":637,"pc":[2547]},{"teal":2612,"source":637,"pc":[2548]},{"teal":2613,"source":637,"pc":[2549,2550]},{"teal":2614,"source":637,"pc":[2551]},{"teal":2615,"source":637,"pc":[2552]},{"teal":2616,"source":637,"pc":[2553]},{"teal":2617,"source":637,"pc":[2554,2555]},{"teal":2618,"source":637,"pc":[2556]},{"teal":2619,"source":637,"pc":[2557]},{"teal":2620,"source":637,"pc":[2558,2559]},{"teal":2621,"source":637,"pc":[2560]},{"teal":2622,"source":637,"pc":[2561]},{"teal":2623,"source":637,"pc":[2562,2563]},{"teal":2624,"source":636,"pc":[2564]},{"teal":2625,"source":636,"pc":[2565]},{"teal":2626,"source":638,"pc":[2566,2567]},{"teal":2627,"source":636,"pc":[2568]},{"teal":2628,"source":636,"pc":[2569]},{"teal":2629,"source":636,"pc":[2570]},{"teal":2630,"source":636,"pc":[2571]},{"teal":2631,"source":636,"pc":[2572]},{"teal":2634,"source":636,"errorMessage":"wideRatio failed","pc":[2573]},{"teal":2635,"source":636,"pc":[2574,2575]},{"teal":2639,"source":640,"pc":[2576,2577]},{"teal":2640,"source":640,"pc":[2578,2579]},{"teal":2641,"source":640,"pc":[2580]},{"teal":2642,"source":640,"pc":[2581]},{"teal":2643,"source":640,"pc":[2582]},{"teal":2644,"source":640,"pc":[2583,2584]},{"teal":2645,"source":640,"pc":[2585]},{"teal":2646,"source":640,"pc":[2586]},{"teal":2647,"source":640,"pc":[2587,2588]},{"teal":2648,"source":640,"pc":[2589]},{"teal":2649,"source":640,"pc":[2590]},{"teal":2650,"source":640,"pc":[2591,2592]},{"teal":2651,"source":640,"pc":[2593]},{"teal":2656,"source":631,"pc":[2594,2595]},{"teal":2657,"source":631,"pc":[2596]},{"teal":2658,"source":631,"pc":[2597]},{"teal":2659,"source":631,"pc":[2598,2599]},{"teal":2660,"source":631,"pc":[2600,2601,2602]},{"teal":2665,"source":642,"pc":[2603,2604]},{"teal":2666,"source":642,"pc":[2605,2606]},{"teal":2667,"source":642,"pc":[2607]},{"teal":2668,"source":642,"pc":[2608,2609]},{"teal":2669,"source":642,"pc":[2610]},{"teal":2670,"source":642,"pc":[2611]},{"teal":2671,"source":642,"pc":[2612,2613]},{"teal":2672,"source":642,"pc":[2614]},{"teal":2676,"source":601,"pc":[2615,2616]},{"teal":2679,"source":601,"pc":[2617,2618]},{"teal":2680,"source":601,"pc":[2619]},{"teal":2685,"source":661,"pc":[2620,2621,2622]},{"teal":2686,"source":661,"pc":[2623]},{"teal":2689,"source":660,"pc":[2624,2625,2626]},{"teal":2690,"source":660,"pc":[2627]},{"teal":2693,"source":659,"pc":[2628,2629,2630]},{"teal":2694,"source":659,"pc":[2631]},{"teal":2697,"source":658,"pc":[2632,2633,2634]},{"teal":2698,"source":658,"pc":[2635]},{"teal":2701,"source":657,"pc":[2636,2637,2638]},{"teal":2702,"source":657,"pc":[2639]},{"teal":2703,"source":657,"pc":[2640]},{"teal":2704,"source":657,"pc":[2641]},{"teal":2705,"source":657,"pc":[2642]},{"teal":2708,"source":657,"errorMessage":"argument 4 (poolKey) for stakeUpdatedViaRewards must be a (uint64,uint64,uint64)","pc":[2643]},{"teal":2711,"source":656,"pc":[2644,2645,2646]},{"teal":2712,"source":656,"pc":[2647]},{"teal":2713,"source":656,"pc":[2648]},{"teal":2727,"source":656,"pc":[2649,2650,2651]},{"teal":2731,"source":663,"pc":[2652,2653]},{"teal":2732,"source":663,"pc":[2654,2655,2656]},{"teal":2736,"source":666,"pc":[2657,2658]},{"teal":2737,"source":666,"pc":[2659,2660]},{"teal":2738,"source":666,"pc":[2661,2662,2663]},{"teal":2739,"source":666,"pc":[2664]},{"teal":2740,"source":666,"pc":[2665]},{"teal":2741,"source":666,"pc":[2666]},{"teal":2742,"source":666,"pc":[2667,2668]},{"teal":2743,"source":666,"pc":[2669]},{"teal":2744,"source":666,"pc":[2670]},{"teal":2745,"source":666,"pc":[2671,2672]},{"teal":2746,"source":666,"pc":[2673]},{"teal":2747,"source":666,"pc":[2674,2675]},{"teal":2748,"source":666,"pc":[2676,2677]},{"teal":2749,"source":666,"pc":[2678,2679,2680]},{"teal":2750,"source":666,"pc":[2681]},{"teal":2751,"source":666,"pc":[2682]},{"teal":2752,"source":666,"pc":[2683]},{"teal":2753,"source":666,"pc":[2684,2685]},{"teal":2754,"source":666,"pc":[2686]},{"teal":2755,"source":666,"pc":[2687]},{"teal":2756,"source":666,"pc":[2688,2689]},{"teal":2757,"source":666,"pc":[2690]},{"teal":2758,"source":666,"pc":[2691]},{"teal":2759,"source":666,"pc":[2692]},{"teal":2760,"source":666,"pc":[2693,2694]},{"teal":2761,"source":666,"pc":[2695,2696,2697]},{"teal":2762,"source":666,"pc":[2698]},{"teal":2763,"source":666,"pc":[2699]},{"teal":2764,"source":666,"pc":[2700]},{"teal":2765,"source":666,"pc":[2701,2702]},{"teal":2766,"source":666,"pc":[2703]},{"teal":2767,"source":666,"pc":[2704]},{"teal":2768,"source":666,"pc":[2705,2706]},{"teal":2769,"source":666,"pc":[2707]},{"teal":2770,"source":666,"pc":[2708]},{"teal":2771,"source":666,"pc":[2709]},{"teal":2772,"source":666,"pc":[2710,2711]},{"teal":2773,"source":666,"pc":[2712,2713,2714]},{"teal":2774,"source":666,"pc":[2715]},{"teal":2775,"source":666,"pc":[2716]},{"teal":2776,"source":666,"pc":[2717]},{"teal":2777,"source":666,"pc":[2718,2719]},{"teal":2778,"source":666,"pc":[2720]},{"teal":2782,"source":667,"pc":[2721,2722]},{"teal":2783,"source":667,"pc":[2723]},{"teal":2784,"source":667,"pc":[2724]},{"teal":2785,"source":667,"pc":[2725]},{"teal":2786,"source":667,"pc":[2726,2727]},{"teal":2787,"source":667,"pc":[2728,2729,2730]},{"teal":2788,"source":667,"pc":[2731]},{"teal":2789,"source":667,"pc":[2732]},{"teal":2790,"source":667,"pc":[2733]},{"teal":2791,"source":667,"pc":[2734,2735]},{"teal":2792,"source":667,"pc":[2736]},{"teal":2793,"source":667,"pc":[2737]},{"teal":2794,"source":667,"pc":[2738,2739]},{"teal":2795,"source":667,"pc":[2740]},{"teal":2796,"source":667,"pc":[2741]},{"teal":2797,"source":667,"pc":[2742]},{"teal":2798,"source":667,"pc":[2743,2744]},{"teal":2799,"source":667,"pc":[2745,2746,2747]},{"teal":2800,"source":667,"pc":[2748]},{"teal":2801,"source":667,"pc":[2749]},{"teal":2802,"source":667,"pc":[2750]},{"teal":2803,"source":667,"pc":[2751,2752]},{"teal":2804,"source":667,"pc":[2753]},{"teal":2808,"source":668,"pc":[2754,2755]},{"teal":2809,"source":668,"pc":[2756]},{"teal":2810,"source":668,"pc":[2757]},{"teal":2811,"source":668,"pc":[2758]},{"teal":2812,"source":668,"pc":[2759,2760]},{"teal":2813,"source":668,"pc":[2761,2762,2763]},{"teal":2814,"source":668,"pc":[2764]},{"teal":2815,"source":668,"pc":[2765]},{"teal":2816,"source":668,"pc":[2766]},{"teal":2817,"source":668,"pc":[2767,2768]},{"teal":2818,"source":668,"pc":[2769]},{"teal":2819,"source":668,"pc":[2770]},{"teal":2820,"source":668,"pc":[2771,2772]},{"teal":2821,"source":668,"pc":[2773]},{"teal":2822,"source":668,"pc":[2774]},{"teal":2823,"source":668,"pc":[2775]},{"teal":2824,"source":668,"pc":[2776,2777]},{"teal":2825,"source":668,"pc":[2778,2779,2780]},{"teal":2826,"source":668,"pc":[2781]},{"teal":2827,"source":668,"pc":[2782]},{"teal":2828,"source":668,"pc":[2783]},{"teal":2829,"source":668,"pc":[2784,2785]},{"teal":2830,"source":668,"pc":[2786]},{"teal":2834,"source":670,"pc":[2787,2788]},{"teal":2835,"source":670,"pc":[2789]},{"teal":2836,"source":670,"pc":[2790,2791]},{"teal":2837,"source":670,"pc":[2792]},{"teal":2838,"source":670,"pc":[2793,2794]},{"teal":2839,"source":670,"pc":[2795]},{"teal":2840,"source":670,"pc":[2796]},{"teal":2844,"source":673,"pc":[2797,2798]},{"teal":2845,"source":673,"pc":[2799,2800,2801]},{"teal":2846,"source":673,"pc":[2802]},{"teal":2847,"source":673,"pc":[2803,2804,2805]},{"teal":2859,"source":675,"pc":[2806,2807,2808,2809,2810,2811]},{"teal":2860,"source":676,"pc":[2812,2813]},{"teal":2861,"source":676,"pc":[2814,2815,2816]},{"teal":2862,"source":676,"pc":[2817]},{"teal":2863,"source":676,"pc":[2818]},{"teal":2864,"source":677,"pc":[2819,2820]},{"teal":2865,"source":677,"pc":[2821,2822,2823]},{"teal":2866,"source":677,"pc":[2824]},{"teal":2867,"source":677,"pc":[2825]},{"teal":2868,"source":677,"pc":[2826]},{"teal":2869,"source":677,"pc":[2827]},{"teal":2870,"source":677,"pc":[2828,2829]},{"teal":2871,"source":677,"pc":[2830]},{"teal":2874,"source":677,"errorMessage":"poolKey.poolId as uint16 overflowed 16 bits","pc":[2831]},{"teal":2875,"source":677,"pc":[2832,2833,2834]},{"teal":2876,"source":677,"pc":[2835]},{"teal":2877,"source":678,"pc":[2836,2837]},{"teal":2878,"source":678,"pc":[2838,2839,2840]},{"teal":2879,"source":678,"pc":[2841]},{"teal":2880,"source":678,"pc":[2842]},{"teal":2881,"source":678,"pc":[2843]},{"teal":2882,"source":682,"pc":[2844,2845]},{"teal":2883,"source":682,"pc":[2846]},{"teal":2884,"source":682,"pc":[2847]},{"teal":2885,"source":681,"pc":[2848,2849]},{"teal":2886,"source":681,"pc":[2850]},{"teal":2887,"source":681,"pc":[2851]},{"teal":2888,"source":679,"pc":[2852,2853]},{"teal":2889,"source":679,"pc":[2854]},{"teal":2890,"source":679,"pc":[2855]},{"teal":2891,"source":680,"pc":[2856,2857]},{"teal":2892,"source":680,"pc":[2858]},{"teal":2893,"source":680,"pc":[2859]},{"teal":2894,"source":675,"pc":[2860]},{"teal":2895,"source":675,"pc":[2861]},{"teal":2896,"source":656,"pc":[2862]},{"teal":2901,"source":703,"pc":[2863,2864,2865]},{"teal":2902,"source":703,"pc":[2866]},{"teal":2903,"source":703,"pc":[2867]},{"teal":2904,"source":703,"pc":[2868]},{"teal":2905,"source":703,"pc":[2869]},{"teal":2908,"source":703,"errorMessage":"argument 0 (stakerRemoved) for stakeRemoved must be a bool","pc":[2870]},{"teal":2909,"source":703,"pc":[2871]},{"teal":2910,"source":703,"pc":[2872]},{"teal":2913,"source":702,"pc":[2873,2874,2875]},{"teal":2914,"source":702,"pc":[2876]},{"teal":2917,"source":701,"pc":[2877,2878,2879]},{"teal":2918,"source":701,"pc":[2880]},{"teal":2921,"source":700,"pc":[2881,2882,2883]},{"teal":2922,"source":700,"pc":[2884]},{"teal":2923,"source":700,"pc":[2885]},{"teal":2924,"source":700,"pc":[2886,2887]},{"teal":2925,"source":700,"pc":[2888]},{"teal":2928,"source":700,"errorMessage":"argument 3 (staker) for stakeRemoved must be a address","pc":[2889]},{"teal":2931,"source":699,"pc":[2890,2891,2892]},{"teal":2932,"source":699,"pc":[2893]},{"teal":2933,"source":699,"pc":[2894]},{"teal":2934,"source":699,"pc":[2895]},{"teal":2935,"source":699,"pc":[2896]},{"teal":2938,"source":699,"errorMessage":"argument 4 (poolKey) for stakeRemoved must be a (uint64,uint64,uint64)","pc":[2897]},{"teal":2941,"source":698,"pc":[2898,2899,2900]},{"teal":2942,"source":698,"pc":[2901]},{"teal":2943,"source":698,"pc":[2902]},{"teal":2958,"source":698,"pc":[2903,2904,2905]},{"teal":2961,"source":698,"pc":[2906]},{"teal":2962,"source":698,"pc":[2907,2908]},{"teal":2967,"source":705,"pc":[2909,2910]},{"teal":2968,"source":705,"pc":[2911,2912]},{"teal":2969,"source":705,"pc":[2913]},{"teal":2970,"source":705,"pc":[2914,2915,2916]},{"teal":2975,"source":706,"pc":[2917]},{"teal":2976,"source":706,"pc":[2918,2919]},{"teal":2977,"source":706,"pc":[2920,2921]},{"teal":2978,"source":706,"pc":[2922]},{"teal":2979,"source":706,"pc":[2923,2924]},{"teal":2980,"source":706,"pc":[2925,2926]},{"teal":2981,"source":706,"pc":[2927]},{"teal":2982,"source":706,"pc":[2928,2929]},{"teal":2983,"source":706,"pc":[2930,2931]},{"teal":2984,"source":706,"pc":[2932,2933]},{"teal":2985,"source":706,"pc":[2934,2935]},{"teal":2986,"source":706,"pc":[2936]},{"teal":2991,"source":708,"pc":[2937,2938]},{"teal":2992,"source":708,"pc":[2939,2940,2941]},{"teal":2996,"source":712,"pc":[2942,2943]},{"teal":2997,"source":712,"pc":[2944]},{"teal":2998,"source":712,"pc":[2945]},{"teal":2999,"source":712,"pc":[2946]},{"teal":3000,"source":712,"pc":[2947,2948,2949]},{"teal":3001,"source":712,"pc":[2950,2951]},{"teal":3002,"source":712,"pc":[2952]},{"teal":3003,"source":712,"pc":[2953]},{"teal":3004,"source":712,"pc":[2954]},{"teal":3008,"source":712,"errorMessage":"should only be called if algo or reward was removed","pc":[2955]},{"teal":3012,"source":715,"pc":[2956,2957]},{"teal":3013,"source":715,"pc":[2958,2959]},{"teal":3014,"source":715,"pc":[2960,2961,2962]},{"teal":3015,"source":715,"pc":[2963]},{"teal":3016,"source":715,"pc":[2964]},{"teal":3017,"source":715,"pc":[2965]},{"teal":3018,"source":715,"pc":[2966,2967]},{"teal":3019,"source":715,"pc":[2968]},{"teal":3020,"source":715,"pc":[2969]},{"teal":3021,"source":715,"pc":[2970,2971]},{"teal":3022,"source":715,"pc":[2972]},{"teal":3023,"source":715,"pc":[2973,2974]},{"teal":3024,"source":715,"pc":[2975,2976]},{"teal":3025,"source":715,"pc":[2977,2978,2979]},{"teal":3026,"source":715,"pc":[2980]},{"teal":3027,"source":715,"pc":[2981]},{"teal":3028,"source":715,"pc":[2982]},{"teal":3029,"source":715,"pc":[2983,2984]},{"teal":3030,"source":715,"pc":[2985]},{"teal":3031,"source":715,"pc":[2986]},{"teal":3032,"source":715,"pc":[2987,2988]},{"teal":3033,"source":715,"pc":[2989]},{"teal":3034,"source":715,"pc":[2990]},{"teal":3035,"source":715,"pc":[2991]},{"teal":3036,"source":715,"pc":[2992,2993]},{"teal":3037,"source":715,"pc":[2994,2995,2996]},{"teal":3038,"source":715,"pc":[2997]},{"teal":3039,"source":715,"pc":[2998]},{"teal":3040,"source":715,"pc":[2999]},{"teal":3041,"source":715,"pc":[3000,3001]},{"teal":3042,"source":715,"pc":[3002]},{"teal":3043,"source":715,"pc":[3003]},{"teal":3044,"source":715,"pc":[3004,3005]},{"teal":3045,"source":715,"pc":[3006]},{"teal":3046,"source":715,"pc":[3007]},{"teal":3047,"source":715,"pc":[3008]},{"teal":3048,"source":715,"pc":[3009,3010]},{"teal":3049,"source":715,"pc":[3011,3012,3013]},{"teal":3050,"source":715,"pc":[3014]},{"teal":3051,"source":715,"pc":[3015]},{"teal":3052,"source":715,"pc":[3016]},{"teal":3053,"source":715,"pc":[3017,3018]},{"teal":3054,"source":715,"pc":[3019]},{"teal":3058,"source":716,"pc":[3020,3021]},{"teal":3059,"source":716,"pc":[3022]},{"teal":3060,"source":716,"pc":[3023]},{"teal":3061,"source":716,"pc":[3024]},{"teal":3062,"source":716,"pc":[3025,3026]},{"teal":3063,"source":716,"pc":[3027,3028,3029]},{"teal":3064,"source":716,"pc":[3030]},{"teal":3065,"source":716,"pc":[3031]},{"teal":3066,"source":716,"pc":[3032]},{"teal":3067,"source":716,"pc":[3033,3034]},{"teal":3068,"source":716,"pc":[3035]},{"teal":3069,"source":716,"pc":[3036]},{"teal":3070,"source":716,"pc":[3037,3038]},{"teal":3071,"source":716,"pc":[3039]},{"teal":3072,"source":716,"pc":[3040]},{"teal":3073,"source":716,"pc":[3041]},{"teal":3074,"source":716,"pc":[3042,3043]},{"teal":3075,"source":716,"pc":[3044,3045,3046]},{"teal":3076,"source":716,"pc":[3047]},{"teal":3077,"source":716,"pc":[3048]},{"teal":3078,"source":716,"pc":[3049]},{"teal":3079,"source":716,"pc":[3050,3051]},{"teal":3080,"source":716,"pc":[3052]},{"teal":3084,"source":717,"pc":[3053,3054]},{"teal":3085,"source":717,"pc":[3055]},{"teal":3086,"source":717,"pc":[3056,3057]},{"teal":3087,"source":717,"pc":[3058]},{"teal":3088,"source":717,"pc":[3059,3060]},{"teal":3089,"source":717,"pc":[3061]},{"teal":3090,"source":717,"pc":[3062]},{"teal":3095,"source":719,"pc":[3063,3064]},{"teal":3096,"source":719,"pc":[3065]},{"teal":3097,"source":719,"pc":[3066]},{"teal":3098,"source":719,"pc":[3067,3068,3069]},{"teal":3103,"source":720,"pc":[3070,3071]},{"teal":3104,"source":720,"pc":[3072]},{"teal":3105,"source":720,"pc":[3073]},{"teal":3106,"source":720,"pc":[3074,3075]},{"teal":3107,"source":720,"pc":[3076,3077,3078]},{"teal":3108,"source":720,"pc":[3079]},{"teal":3109,"source":720,"pc":[3080]},{"teal":3110,"source":720,"pc":[3081]},{"teal":3111,"source":720,"pc":[3082,3083]},{"teal":3112,"source":720,"pc":[3084]},{"teal":3113,"source":720,"pc":[3085]},{"teal":3114,"source":720,"pc":[3086,3087]},{"teal":3118,"source":721,"pc":[3088,3089]},{"teal":3119,"source":721,"pc":[3090]},{"teal":3120,"source":721,"pc":[3091]},{"teal":3123,"source":721,"errorMessage":"rewardRemoved can't be set if validator doesn't have reward token!","pc":[3092]},{"teal":3130,"source":723,"pc":[3093,3094]},{"teal":3131,"source":723,"pc":[3095]},{"teal":3132,"source":723,"pc":[3096]},{"teal":3133,"source":723,"pc":[3097,3098]},{"teal":3134,"source":723,"pc":[3099,3100,3101]},{"teal":3135,"source":723,"pc":[3102]},{"teal":3136,"source":723,"pc":[3103]},{"teal":3137,"source":723,"pc":[3104]},{"teal":3138,"source":723,"pc":[3105,3106]},{"teal":3139,"source":723,"pc":[3107]},{"teal":3140,"source":723,"pc":[3108]},{"teal":3141,"source":723,"pc":[3109,3110]},{"teal":3142,"source":723,"pc":[3111]},{"teal":3145,"source":722,"errorMessage":"reward being removed must be covered by hold back amount","pc":[3112]},{"teal":3149,"source":728,"pc":[3113,3114]},{"teal":3150,"source":728,"pc":[3115]},{"teal":3151,"source":728,"pc":[3116]},{"teal":3152,"source":728,"pc":[3117]},{"teal":3153,"source":728,"pc":[3118,3119]},{"teal":3154,"source":728,"pc":[3120,3121,3122]},{"teal":3155,"source":728,"pc":[3123]},{"teal":3156,"source":728,"pc":[3124]},{"teal":3157,"source":728,"pc":[3125]},{"teal":3158,"source":728,"pc":[3126,3127]},{"teal":3159,"source":728,"pc":[3128]},{"teal":3160,"source":728,"pc":[3129]},{"teal":3161,"source":728,"pc":[3130,3131]},{"teal":3162,"source":728,"pc":[3132]},{"teal":3163,"source":728,"pc":[3133]},{"teal":3164,"source":728,"pc":[3134]},{"teal":3165,"source":728,"pc":[3135,3136]},{"teal":3166,"source":728,"pc":[3137,3138,3139]},{"teal":3167,"source":728,"pc":[3140]},{"teal":3168,"source":728,"pc":[3141]},{"teal":3169,"source":728,"pc":[3142]},{"teal":3170,"source":728,"pc":[3143,3144]},{"teal":3171,"source":728,"pc":[3145]},{"teal":3176,"source":733,"pc":[3146,3147]},{"teal":3177,"source":733,"pc":[3148,3149,3150]},{"teal":3178,"source":733,"pc":[3151]},{"teal":3179,"source":733,"pc":[3152]},{"teal":3180,"source":733,"pc":[3153]},{"teal":3181,"source":733,"pc":[3154,3155,3156]},{"teal":3189,"source":734,"pc":[3157]},{"teal":3190,"source":734,"pc":[3158,3159]},{"teal":3191,"source":734,"pc":[3160,3161]},{"teal":3192,"source":734,"pc":[3162,3163]},{"teal":3193,"source":734,"pc":[3164,3165]},{"teal":3197,"source":735,"pc":[3166,3167]},{"teal":3198,"source":735,"pc":[3168]},{"teal":3199,"source":735,"pc":[3169]},{"teal":3200,"source":735,"pc":[3170,3171]},{"teal":3201,"source":735,"pc":[3172,3173,3174]},{"teal":3202,"source":735,"pc":[3175]},{"teal":3203,"source":735,"pc":[3176]},{"teal":3204,"source":735,"pc":[3177]},{"teal":3205,"source":735,"pc":[3178,3179]},{"teal":3206,"source":735,"pc":[3180]},{"teal":3207,"source":735,"pc":[3181]},{"teal":3208,"source":735,"pc":[3182,3183]},{"teal":3212,"source":736,"pc":[3184,3185]},{"teal":3213,"source":736,"pc":[3186,3187]},{"teal":3214,"source":736,"pc":[3188,3189]},{"teal":3215,"source":736,"pc":[3190]},{"teal":3216,"source":736,"pc":[3191,3192]},{"teal":3217,"source":736,"pc":[3193,3194]},{"teal":3218,"source":736,"pc":[3195]},{"teal":3219,"source":736,"pc":[3196,3197]},{"teal":3222,"source":734,"pc":[3198]},{"teal":3223,"source":734,"pc":[3199,3200]},{"teal":3226,"source":734,"pc":[3201]},{"teal":3239,"source":739,"pc":[3202,3203]},{"teal":3240,"source":740,"pc":[3204,3205]},{"teal":3241,"source":740,"pc":[3206,3207,3208]},{"teal":3242,"source":740,"pc":[3209]},{"teal":3243,"source":740,"pc":[3210]},{"teal":3244,"source":741,"pc":[3211,3212]},{"teal":3245,"source":741,"pc":[3213,3214,3215]},{"teal":3246,"source":741,"pc":[3216]},{"teal":3247,"source":741,"pc":[3217]},{"teal":3248,"source":741,"pc":[3218]},{"teal":3249,"source":741,"pc":[3219]},{"teal":3250,"source":741,"pc":[3220,3221]},{"teal":3251,"source":741,"pc":[3222]},{"teal":3254,"source":741,"errorMessage":"poolKey.poolId as uint16 overflowed 16 bits","pc":[3223]},{"teal":3255,"source":741,"pc":[3224,3225,3226]},{"teal":3256,"source":741,"pc":[3227]},{"teal":3257,"source":742,"pc":[3228,3229]},{"teal":3258,"source":742,"pc":[3230,3231,3232]},{"teal":3259,"source":742,"pc":[3233]},{"teal":3260,"source":742,"pc":[3234]},{"teal":3261,"source":742,"pc":[3235]},{"teal":3262,"source":743,"pc":[3236,3237]},{"teal":3263,"source":743,"pc":[3238]},{"teal":3264,"source":744,"pc":[3239,3240]},{"teal":3265,"source":744,"pc":[3241]},{"teal":3266,"source":744,"pc":[3242]},{"teal":3267,"source":746,"pc":[3243,3244]},{"teal":3268,"source":746,"pc":[3245]},{"teal":3269,"source":746,"pc":[3246]},{"teal":3270,"source":745,"pc":[3247,3248]},{"teal":3271,"source":745,"pc":[3249]},{"teal":3272,"source":745,"pc":[3250]},{"teal":3273,"source":739,"pc":[3251]},{"teal":3274,"source":739,"pc":[3252]},{"teal":3275,"source":719,"pc":[3253,3254,3255]},{"teal":3289,"source":749,"pc":[3256,3257]},{"teal":3290,"source":750,"pc":[3258,3259]},{"teal":3291,"source":750,"pc":[3260,3261,3262]},{"teal":3292,"source":750,"pc":[3263]},{"teal":3293,"source":750,"pc":[3264]},{"teal":3294,"source":751,"pc":[3265,3266]},{"teal":3295,"source":751,"pc":[3267,3268,3269]},{"teal":3296,"source":751,"pc":[3270]},{"teal":3297,"source":751,"pc":[3271]},{"teal":3298,"source":751,"pc":[3272]},{"teal":3299,"source":751,"pc":[3273]},{"teal":3300,"source":751,"pc":[3274,3275]},{"teal":3301,"source":751,"pc":[3276]},{"teal":3304,"source":751,"errorMessage":"poolKey.poolId as uint16 overflowed 16 bits","pc":[3277]},{"teal":3305,"source":751,"pc":[3278,3279,3280]},{"teal":3306,"source":751,"pc":[3281]},{"teal":3307,"source":752,"pc":[3282,3283]},{"teal":3308,"source":752,"pc":[3284,3285,3286]},{"teal":3309,"source":752,"pc":[3287]},{"teal":3310,"source":752,"pc":[3288]},{"teal":3311,"source":752,"pc":[3289]},{"teal":3312,"source":753,"pc":[3290,3291]},{"teal":3313,"source":753,"pc":[3292]},{"teal":3314,"source":754,"pc":[3293,3294]},{"teal":3315,"source":754,"pc":[3295]},{"teal":3316,"source":754,"pc":[3296]},{"teal":3317,"source":757,"pc":[3297,3298]},{"teal":3318,"source":757,"pc":[3299]},{"teal":3319,"source":756,"pc":[3300,3301]},{"teal":3320,"source":756,"pc":[3302]},{"teal":3321,"source":749,"pc":[3303]},{"teal":3322,"source":749,"pc":[3304]},{"teal":3328,"source":761,"pc":[3305,3306]},{"teal":3329,"source":761,"pc":[3307,3308,3309]},{"teal":3334,"source":763,"pc":[3310,3311]},{"teal":3335,"source":763,"pc":[3312,3313]},{"teal":3336,"source":763,"pc":[3314,3315,3316]},{"teal":3337,"source":763,"pc":[3317]},{"teal":3338,"source":763,"pc":[3318]},{"teal":3339,"source":763,"pc":[3319]},{"teal":3340,"source":763,"pc":[3320,3321]},{"teal":3341,"source":763,"pc":[3322]},{"teal":3342,"source":763,"pc":[3323]},{"teal":3343,"source":763,"pc":[3324]},{"teal":3344,"source":763,"pc":[3325]},{"teal":3345,"source":763,"pc":[3326,3327]},{"teal":3346,"source":763,"pc":[3328,3329]},{"teal":3347,"source":763,"pc":[3330,3331,3332]},{"teal":3348,"source":763,"pc":[3333]},{"teal":3349,"source":763,"pc":[3334]},{"teal":3350,"source":763,"pc":[3335]},{"teal":3351,"source":763,"pc":[3336,3337]},{"teal":3352,"source":763,"pc":[3338]},{"teal":3353,"source":763,"pc":[3339]},{"teal":3354,"source":763,"pc":[3340]},{"teal":3355,"source":763,"pc":[3341]},{"teal":3356,"source":763,"pc":[3342,3343]},{"teal":3357,"source":763,"pc":[3344]},{"teal":3358,"source":763,"pc":[3345,3346]},{"teal":3359,"source":763,"pc":[3347,3348,3349]},{"teal":3360,"source":763,"pc":[3350]},{"teal":3361,"source":763,"pc":[3351]},{"teal":3362,"source":763,"pc":[3352]},{"teal":3363,"source":763,"pc":[3353,3354]},{"teal":3364,"source":763,"pc":[3355]},{"teal":3365,"source":763,"pc":[3356]},{"teal":3366,"source":763,"pc":[3357]},{"teal":3367,"source":763,"pc":[3358]},{"teal":3368,"source":763,"pc":[3359]},{"teal":3369,"source":763,"pc":[3360,3361,3362]},{"teal":3370,"source":763,"pc":[3363]},{"teal":3371,"source":763,"pc":[3364,3365]},{"teal":3372,"source":763,"pc":[3366,3367,3368]},{"teal":3373,"source":763,"pc":[3369]},{"teal":3374,"source":763,"pc":[3370]},{"teal":3375,"source":763,"pc":[3371]},{"teal":3376,"source":763,"pc":[3372,3373]},{"teal":3377,"source":763,"pc":[3374]},{"teal":3385,"source":766,"pc":[3375,3376]},{"teal":3386,"source":766,"pc":[3377,3378,3379]},{"teal":3387,"source":766,"pc":[3380]},{"teal":3388,"source":766,"pc":[3381]},{"teal":3389,"source":767,"pc":[3382,3383]},{"teal":3390,"source":767,"pc":[3384,3385,3386]},{"teal":3391,"source":767,"pc":[3387]},{"teal":3392,"source":767,"pc":[3388]},{"teal":3393,"source":767,"pc":[3389]},{"teal":3394,"source":768,"pc":[3390,3391]},{"teal":3395,"source":768,"pc":[3392,3393,3394]},{"teal":3396,"source":768,"pc":[3395]},{"teal":3397,"source":768,"pc":[3396]},{"teal":3398,"source":768,"pc":[3397]},{"teal":3399,"source":765,"pc":[3398,3399]},{"teal":3400,"source":765,"pc":[3400,3401,3402]},{"teal":3401,"source":765,"pc":[3403,3404]},{"teal":3405,"source":770,"pc":[3405,3406]},{"teal":3406,"source":770,"pc":[3407,3408]},{"teal":3407,"source":770,"pc":[3409,3410]},{"teal":3408,"source":770,"pc":[3411]},{"teal":3409,"source":770,"pc":[3412]},{"teal":3410,"source":770,"pc":[3413,3414]},{"teal":3414,"source":771,"pc":[3415,3416]},{"teal":3415,"source":771,"pc":[3417,3418]},{"teal":3416,"source":771,"pc":[3419,3420]},{"teal":3417,"source":771,"pc":[3421]},{"teal":3418,"source":771,"pc":[3422]},{"teal":3419,"source":771,"pc":[3423,3424]},{"teal":3424,"source":773,"pc":[3425,3426]},{"teal":3425,"source":773,"pc":[3427,3428,3429]},{"teal":3430,"source":774,"pc":[3430,3431]},{"teal":3431,"source":774,"pc":[3432]},{"teal":3432,"source":774,"pc":[3433]},{"teal":3433,"source":774,"pc":[3434]},{"teal":3434,"source":774,"pc":[3435,3436]},{"teal":3435,"source":774,"pc":[3437,3438,3439]},{"teal":3436,"source":774,"pc":[3440]},{"teal":3437,"source":774,"pc":[3441]},{"teal":3438,"source":774,"pc":[3442]},{"teal":3439,"source":774,"pc":[3443,3444]},{"teal":3440,"source":774,"pc":[3445]},{"teal":3441,"source":774,"pc":[3446]},{"teal":3442,"source":774,"pc":[3447]},{"teal":3443,"source":774,"pc":[3448]},{"teal":3444,"source":774,"pc":[3449]},{"teal":3445,"source":774,"pc":[3450]},{"teal":3446,"source":774,"pc":[3451,3452]},{"teal":3447,"source":774,"pc":[3453,3454,3455]},{"teal":3448,"source":774,"pc":[3456]},{"teal":3449,"source":774,"pc":[3457]},{"teal":3450,"source":774,"pc":[3458]},{"teal":3451,"source":774,"pc":[3459,3460]},{"teal":3452,"source":774,"pc":[3461]},{"teal":3458,"source":777,"pc":[3462,3463]},{"teal":3459,"source":777,"pc":[3464,3465,3466]},{"teal":3464,"source":778,"pc":[3467,3468]},{"teal":3465,"source":778,"pc":[3469]},{"teal":3466,"source":778,"pc":[3470]},{"teal":3467,"source":778,"pc":[3471]},{"teal":3468,"source":778,"pc":[3472,3473]},{"teal":3469,"source":778,"pc":[3474]},{"teal":3470,"source":778,"pc":[3475]},{"teal":3475,"source":698,"pc":[3476]},{"teal":3480,"source":794,"pc":[3477]},{"teal":3483,"source":798,"pc":[3478,3479,3480]},{"teal":3484,"source":798,"pc":[3481]},{"teal":3487,"source":797,"pc":[3482,3483,3484]},{"teal":3488,"source":797,"pc":[3485]},{"teal":3489,"source":797,"pc":[3486]},{"teal":3490,"source":797,"pc":[3487,3488]},{"teal":3491,"source":797,"pc":[3489]},{"teal":3494,"source":797,"errorMessage":"argument 1 (staker) for findPoolForStaker must be a address","pc":[3490]},{"teal":3497,"source":796,"pc":[3491,3492,3493]},{"teal":3498,"source":796,"pc":[3494]},{"teal":3501,"source":794,"pc":[3495,3496,3497]},{"teal":3502,"source":794,"pc":[3498]},{"teal":3503,"source":794,"pc":[3499]},{"teal":3504,"source":794,"pc":[3500]},{"teal":3505,"source":794,"pc":[3501]},{"teal":3519,"source":794,"pc":[3502,3503,3504]},{"teal":3522,"source":794,"pc":[3505]},{"teal":3523,"source":794,"pc":[3506,3507]},{"teal":3527,"source":800,"pc":[3508]},{"teal":3528,"source":800,"pc":[3509,3510]},{"teal":3532,"source":801,"pc":[3511]},{"teal":3533,"source":801,"pc":[3512,3513]},{"teal":3537,"source":809,"pc":[3514,3515]},{"teal":3538,"source":809,"pc":[3516,3517,3518]},{"teal":3539,"source":809,"pc":[3519,3520]},{"teal":3544,"source":812,"pc":[3521]},{"teal":3545,"source":812,"pc":[3522,3523]},{"teal":3546,"source":812,"pc":[3524]},{"teal":3547,"source":812,"pc":[3525]},{"teal":3548,"source":812,"pc":[3526]},{"teal":3549,"source":812,"pc":[3527]},{"teal":3550,"source":812,"pc":[3528,3529,3530]},{"teal":3555,"source":813,"pc":[3531]},{"teal":3556,"source":813,"pc":[3532,3533]},{"teal":3557,"source":813,"pc":[3534]},{"teal":3558,"source":813,"pc":[3535]},{"teal":3561,"source":813,"errorMessage":"box value does not exist: this.stakerPoolSet(staker).value","pc":[3536]},{"teal":3562,"source":813,"pc":[3537,3538]},{"teal":3566,"source":814,"pc":[3539,3540]},{"teal":3567,"source":814,"pc":[3541]},{"teal":3568,"source":814,"pc":[3542]},{"teal":3569,"source":814,"pc":[3543]},{"teal":3573,"source":815,"pc":[3544]},{"teal":3574,"source":815,"pc":[3545,3546]},{"teal":3579,"source":815,"pc":[3547,3548]},{"teal":3580,"source":815,"pc":[3549,3550]},{"teal":3581,"source":815,"pc":[3551]},{"teal":3582,"source":815,"pc":[3552,3553,3554]},{"teal":3587,"source":816,"pc":[3555,3556]},{"teal":3588,"source":816,"pc":[3557,3558]},{"teal":3589,"source":816,"pc":[3559]},{"teal":3590,"source":816,"pc":[3560,3561,3562]},{"teal":3595,"source":817,"pc":[3563]},{"teal":3596,"source":817,"pc":[3564,3565]},{"teal":3597,"source":817,"pc":[3566,3567]},{"teal":3598,"source":817,"pc":[3568]},{"teal":3599,"source":817,"pc":[3569,3570]},{"teal":3600,"source":817,"pc":[3571,3572]},{"teal":3601,"source":817,"pc":[3573]},{"teal":3602,"source":817,"pc":[3574,3575]},{"teal":3603,"source":817,"pc":[3576,3577]},{"teal":3604,"source":817,"pc":[3578,3579]},{"teal":3605,"source":817,"pc":[3580,3581]},{"teal":3606,"source":817,"pc":[3582]},{"teal":3612,"source":819,"pc":[3583,3584]},{"teal":3613,"source":819,"pc":[3585,3586]},{"teal":3614,"source":819,"pc":[3587]},{"teal":3615,"source":819,"pc":[3588]},{"teal":3616,"source":819,"pc":[3589]},{"teal":3617,"source":819,"pc":[3590]},{"teal":3618,"source":819,"pc":[3591]},{"teal":3619,"source":819,"pc":[3592]},{"teal":3620,"source":819,"pc":[3593]},{"teal":3621,"source":819,"pc":[3594]},{"teal":3622,"source":819,"pc":[3595]},{"teal":3623,"source":819,"pc":[3596,3597,3598]},{"teal":3626,"source":820,"pc":[3599,3600,3601]},{"teal":3631,"source":822,"pc":[3602]},{"teal":3632,"source":822,"pc":[3603,3604]},{"teal":3637,"source":823,"pc":[3605,3606]},{"teal":3638,"source":823,"pc":[3607,3608]},{"teal":3639,"source":823,"pc":[3609]},{"teal":3640,"source":823,"pc":[3610]},{"teal":3641,"source":823,"pc":[3611]},{"teal":3642,"source":823,"pc":[3612]},{"teal":3643,"source":823,"pc":[3613]},{"teal":3644,"source":823,"pc":[3614]},{"teal":3645,"source":823,"pc":[3615]},{"teal":3646,"source":823,"pc":[3616,3617]},{"teal":3647,"source":823,"pc":[3618]},{"teal":3648,"source":823,"pc":[3619,3620,3621]},{"teal":3653,"source":825,"pc":[3622]},{"teal":3654,"source":825,"pc":[3623,3624]},{"teal":3661,"source":827,"pc":[3625,3626]},{"teal":3662,"source":827,"pc":[3627,3628]},{"teal":3663,"source":827,"pc":[3629,3630]},{"teal":3664,"source":827,"pc":[3631]},{"teal":3665,"source":827,"pc":[3632]},{"teal":3666,"source":827,"pc":[3633]},{"teal":3667,"source":827,"pc":[3634]},{"teal":3668,"source":827,"pc":[3635]},{"teal":3669,"source":827,"pc":[3636]},{"teal":3670,"source":827,"pc":[3637]},{"teal":3671,"source":827,"pc":[3638]},{"teal":3672,"source":827,"pc":[3639]},{"teal":3673,"source":827,"pc":[3640,3641]},{"teal":3674,"source":827,"pc":[3642]},{"teal":3675,"source":827,"pc":[3643]},{"teal":3676,"source":827,"pc":[3644,3645]},{"teal":3677,"source":827,"pc":[3646]},{"teal":3678,"source":827,"pc":[3647]},{"teal":3679,"source":827,"pc":[3648]},{"teal":3680,"source":827,"pc":[3649,3650]},{"teal":3681,"source":827,"pc":[3651]},{"teal":3682,"source":827,"pc":[3652]},{"teal":3683,"source":827,"pc":[3653,3654]},{"teal":3684,"source":827,"pc":[3655]},{"teal":3685,"source":827,"pc":[3656]},{"teal":3686,"source":828,"pc":[3657,3658]},{"teal":3687,"source":827,"pc":[3659]},{"teal":3688,"source":829,"pc":[3660,3661]},{"teal":3689,"source":828,"pc":[3662]},{"teal":3690,"source":826,"pc":[3663,3664,3665]},{"teal":3695,"source":831,"pc":[3666,3667]},{"teal":3696,"source":831,"pc":[3668,3669]},{"teal":3697,"source":831,"pc":[3670]},{"teal":3698,"source":831,"pc":[3671]},{"teal":3699,"source":831,"pc":[3672]},{"teal":3700,"source":831,"pc":[3673]},{"teal":3701,"source":831,"pc":[3674,3675]},{"teal":3702,"source":831,"pc":[3676]},{"teal":3703,"source":831,"pc":[3677,3678]},{"teal":3704,"source":831,"pc":[3679]},{"teal":3705,"source":831,"pc":[3680]},{"teal":3706,"source":831,"pc":[3681,3682]},{"teal":3707,"source":831,"pc":[3683]},{"teal":3708,"source":831,"pc":[3684]},{"teal":3709,"source":831,"pc":[3685,3686,3687]},{"teal":3718,"source":815,"pc":[3688,3689]},{"teal":3719,"source":815,"pc":[3690]},{"teal":3720,"source":815,"pc":[3691]},{"teal":3721,"source":815,"pc":[3692,3693]},{"teal":3722,"source":815,"pc":[3694,3695,3696]},{"teal":3732,"source":839,"pc":[3697,3698]},{"teal":3733,"source":839,"pc":[3699,3700]},{"teal":3734,"source":839,"pc":[3701]},{"teal":3735,"source":839,"pc":[3702]},{"teal":3736,"source":839,"pc":[3703,3704]},{"teal":3737,"source":839,"pc":[3705]},{"teal":3738,"source":839,"pc":[3706]},{"teal":3739,"source":839,"pc":[3707,3708]},{"teal":3740,"source":839,"pc":[3709]},{"teal":3741,"source":839,"pc":[3710]},{"teal":3742,"source":839,"pc":[3711]},{"teal":3745,"source":838,"errorMessage":"must stake at least the minimum for this pool","pc":[3712]},{"teal":3749,"source":844,"pc":[3713,3714]},{"teal":3750,"source":844,"pc":[3715,3716]},{"teal":3751,"source":844,"pc":[3717]},{"teal":3752,"source":844,"pc":[3718,3719]},{"teal":3753,"source":844,"pc":[3720]},{"teal":3754,"source":844,"pc":[3721]},{"teal":3755,"source":844,"pc":[3722,3723]},{"teal":3756,"source":844,"pc":[3724]},{"teal":3757,"source":844,"pc":[3725,3726]},{"teal":3761,"source":845,"pc":[3727,3728]},{"teal":3762,"source":845,"pc":[3729,3730]},{"teal":3763,"source":845,"pc":[3731]},{"teal":3764,"source":845,"pc":[3732,3733]},{"teal":3765,"source":845,"pc":[3734]},{"teal":3766,"source":845,"pc":[3735]},{"teal":3767,"source":845,"pc":[3736,3737]},{"teal":3768,"source":845,"pc":[3738]},{"teal":3769,"source":845,"pc":[3739]},{"teal":3770,"source":845,"pc":[3740,3741]},{"teal":3774,"source":846,"pc":[3742]},{"teal":3775,"source":846,"pc":[3743,3744]},{"teal":3780,"source":846,"pc":[3745,3746]},{"teal":3781,"source":846,"pc":[3747,3748]},{"teal":3782,"source":846,"pc":[3749]},{"teal":3783,"source":846,"pc":[3750,3751,3752]},{"teal":3788,"source":847,"pc":[3753,3754]},{"teal":3789,"source":847,"pc":[3755,3756]},{"teal":3790,"source":847,"pc":[3757,3758]},{"teal":3791,"source":847,"pc":[3759]},{"teal":3792,"source":847,"pc":[3760,3761]},{"teal":3793,"source":847,"pc":[3762]},{"teal":3794,"source":847,"pc":[3763]},{"teal":3795,"source":847,"pc":[3764]},{"teal":3796,"source":847,"pc":[3765]},{"teal":3797,"source":847,"pc":[3766,3767]},{"teal":3798,"source":847,"pc":[3768]},{"teal":3799,"source":847,"pc":[3769,3770]},{"teal":3800,"source":847,"pc":[3771]},{"teal":3801,"source":847,"pc":[3772,3773,3774]},{"teal":3810,"source":849,"pc":[3775,3776]},{"teal":3811,"source":849,"pc":[3777]},{"teal":3812,"source":849,"pc":[3778,3779]},{"teal":3813,"source":849,"pc":[3780]},{"teal":3814,"source":849,"pc":[3781]},{"teal":3815,"source":849,"pc":[3782]},{"teal":3816,"source":849,"pc":[3783]},{"teal":3817,"source":849,"pc":[3784,3785]},{"teal":3818,"source":849,"pc":[3786,3787]},{"teal":3819,"source":849,"pc":[3788,3789]},{"teal":3820,"source":849,"pc":[3790]},{"teal":3821,"source":849,"pc":[3791]},{"teal":3822,"source":849,"pc":[3792]},{"teal":3823,"source":849,"pc":[3793]},{"teal":3824,"source":849,"pc":[3794]},{"teal":3825,"source":849,"pc":[3795]},{"teal":3826,"source":849,"pc":[3796]},{"teal":3827,"source":849,"pc":[3797]},{"teal":3828,"source":850,"pc":[3798,3799]},{"teal":3829,"source":850,"pc":[3800]},{"teal":3830,"source":850,"pc":[3801,3802]},{"teal":3831,"source":850,"pc":[3803]},{"teal":3832,"source":851,"pc":[3804]},{"teal":3833,"source":851,"pc":[3805,3806]},{"teal":3834,"source":851,"pc":[3807]},{"teal":3835,"source":848,"pc":[3808]},{"teal":3836,"source":848,"pc":[3809,3810,3811]},{"teal":3843,"source":846,"pc":[3812,3813]},{"teal":3844,"source":846,"pc":[3814]},{"teal":3845,"source":846,"pc":[3815]},{"teal":3846,"source":846,"pc":[3816,3817]},{"teal":3847,"source":846,"pc":[3818,3819,3820]},{"teal":3852,"source":856,"pc":[3821,3822]},{"teal":3853,"source":856,"pc":[3823]},{"teal":3854,"source":856,"pc":[3824,3825]},{"teal":3855,"source":856,"pc":[3826]},{"teal":3856,"source":856,"pc":[3827,3828]},{"teal":3857,"source":856,"pc":[3829]},{"teal":3858,"source":856,"pc":[3830,3831]},{"teal":3859,"source":856,"pc":[3832]},{"teal":3860,"source":856,"pc":[3833,3834]},{"teal":3861,"source":856,"pc":[3835]},{"teal":3862,"source":856,"pc":[3836]},{"teal":3863,"source":856,"pc":[3837,3838]},{"teal":3864,"source":856,"pc":[3839]},{"teal":3865,"source":856,"pc":[3840]},{"teal":3869,"source":794,"pc":[3841,3842]},{"teal":3872,"source":794,"pc":[3843,3844]},{"teal":3873,"source":794,"pc":[3845]},{"teal":3878,"source":870,"pc":[3846,3847,3848]},{"teal":3879,"source":870,"pc":[3849]},{"teal":3882,"source":870,"pc":[3850,3851,3852]},{"teal":3883,"source":870,"pc":[3853]},{"teal":3886,"source":870,"pc":[3854,3855,3856]},{"teal":3887,"source":870,"pc":[3857]},{"teal":3890,"source":870,"pc":[3858,3859,3860]},{"teal":3891,"source":870,"pc":[3861]},{"teal":3892,"source":870,"pc":[3862]},{"teal":3906,"source":870,"pc":[3863,3864,3865]},{"teal":3909,"source":870,"pc":[3866]},{"teal":3910,"source":870,"pc":[3867,3868]},{"teal":3914,"source":871,"pc":[3869,3870]},{"teal":3915,"source":871,"pc":[3871,3872,3873]},{"teal":3919,"source":873,"pc":[3874,3875]},{"teal":3920,"source":873,"pc":[3876,3877]},{"teal":3921,"source":873,"pc":[3878]},{"teal":3922,"source":873,"pc":[3879,3880]},{"teal":3923,"source":873,"pc":[3881]},{"teal":3924,"source":873,"pc":[3882]},{"teal":3925,"source":873,"pc":[3883,3884]},{"teal":3926,"source":873,"pc":[3885]},{"teal":3927,"source":873,"pc":[3886,3887]},{"teal":3931,"source":874,"pc":[3888,3889]},{"teal":3932,"source":874,"pc":[3890]},{"teal":3933,"source":874,"pc":[3891]},{"teal":3934,"source":874,"pc":[3892]},{"teal":3935,"source":874,"pc":[3893,3894,3895]},{"teal":3936,"source":874,"pc":[3896,3897]},{"teal":3937,"source":874,"pc":[3898]},{"teal":3938,"source":874,"pc":[3899]},{"teal":3939,"source":874,"pc":[3900]},{"teal":3943,"source":874,"errorMessage":"node number out of allowable range","pc":[3901]},{"teal":3947,"source":876,"pc":[3902]},{"teal":3948,"source":876,"pc":[3903,3904]},{"teal":3953,"source":876,"pc":[3905,3906]},{"teal":3954,"source":876,"pc":[3907]},{"teal":3955,"source":876,"pc":[3908]},{"teal":3956,"source":876,"pc":[3909,3910,3911]},{"teal":3960,"source":877,"pc":[3912]},{"teal":3961,"source":877,"pc":[3913,3914]},{"teal":3966,"source":877,"pc":[3915,3916]},{"teal":3967,"source":877,"pc":[3917,3918]},{"teal":3968,"source":877,"pc":[3919]},{"teal":3969,"source":877,"pc":[3920,3921,3922]},{"teal":3974,"source":878,"pc":[3923,3924]},{"teal":3975,"source":878,"pc":[3925]},{"teal":3976,"source":878,"pc":[3926,3927]},{"teal":3977,"source":878,"pc":[3928]},{"teal":3978,"source":878,"pc":[3929]},{"teal":3979,"source":878,"pc":[3930]},{"teal":3980,"source":878,"pc":[3931]},{"teal":3981,"source":878,"pc":[3932]},{"teal":3982,"source":878,"pc":[3933,3934]},{"teal":3983,"source":878,"pc":[3935]},{"teal":3984,"source":878,"pc":[3936]},{"teal":3985,"source":878,"pc":[3937]},{"teal":3986,"source":878,"pc":[3938]},{"teal":3987,"source":878,"pc":[3939]},{"teal":3988,"source":878,"pc":[3940]},{"teal":3989,"source":878,"pc":[3941,3942]},{"teal":3990,"source":878,"pc":[3943]},{"teal":3991,"source":878,"pc":[3944,3945,3946]},{"teal":3996,"source":879,"pc":[3947,3948]},{"teal":3997,"source":879,"pc":[3949]},{"teal":3998,"source":879,"pc":[3950]},{"teal":3999,"source":879,"pc":[3951,3952]},{"teal":4000,"source":879,"pc":[3953]},{"teal":4003,"source":879,"errorMessage":"can't move to same node","pc":[3954]},{"teal":4007,"source":881,"pc":[3955,3956]},{"teal":4008,"source":881,"pc":[3957,3958]},{"teal":4009,"source":881,"pc":[3959]},{"teal":4010,"source":881,"pc":[3960]},{"teal":4011,"source":881,"pc":[3961]},{"teal":4012,"source":881,"pc":[3962]},{"teal":4013,"source":881,"pc":[3963]},{"teal":4014,"source":881,"pc":[3964,3965]},{"teal":4015,"source":881,"pc":[3966]},{"teal":4016,"source":881,"pc":[3967]},{"teal":4017,"source":881,"pc":[3968]},{"teal":4018,"source":881,"pc":[3969,3970]},{"teal":4019,"source":881,"pc":[3971]},{"teal":4020,"source":881,"pc":[3972,3973]},{"teal":4021,"source":881,"pc":[3974]},{"teal":4022,"source":881,"pc":[3975]},{"teal":4023,"source":881,"pc":[3976,3977]},{"teal":4024,"source":881,"pc":[3978]},{"teal":4030,"source":884,"pc":[3979]},{"teal":4031,"source":884,"pc":[3980,3981]},{"teal":4032,"source":884,"pc":[3982,3983]},{"teal":4033,"source":884,"pc":[3984,3985,3986,3987,3988,3989]},{"teal":4034,"source":884,"pc":[3990,3991]},{"teal":4038,"source":885,"pc":[3992,3993]},{"teal":4039,"source":885,"pc":[3994,3995]},{"teal":4042,"source":884,"pc":[3996]},{"teal":4043,"source":884,"pc":[3997,3998]},{"teal":4046,"source":884,"pc":[3999]},{"teal":4050,"source":889,"pc":[4000,4001]},{"teal":4051,"source":889,"pc":[4002,4003]},{"teal":4052,"source":889,"pc":[4004,4005]},{"teal":4053,"source":889,"pc":[4006,4007,4008]},{"teal":4057,"source":890,"pc":[4009]},{"teal":4064,"source":877,"pc":[4010,4011]},{"teal":4065,"source":877,"pc":[4012]},{"teal":4066,"source":877,"pc":[4013]},{"teal":4067,"source":877,"pc":[4014,4015]},{"teal":4068,"source":877,"pc":[4016,4017,4018]},{"teal":4075,"source":876,"pc":[4019,4020]},{"teal":4076,"source":876,"pc":[4021]},{"teal":4077,"source":876,"pc":[4022]},{"teal":4078,"source":876,"pc":[4023,4024]},{"teal":4079,"source":876,"pc":[4025,4026,4027]},{"teal":4083,"source":894,"errorMessage":"couldn't find pool app id in nodes to move","pc":[4028]},{"teal":4084,"source":870,"pc":[4029]},{"teal":4089,"source":908,"pc":[4030]},{"teal":4092,"source":908,"pc":[4031,4032,4033]},{"teal":4093,"source":908,"pc":[4034]},{"teal":4094,"source":908,"pc":[4035]},{"teal":4095,"source":908,"pc":[4036,4037]},{"teal":4096,"source":908,"pc":[4038]},{"teal":4099,"source":908,"errorMessage":"argument 0 (receiver) for emptyTokenRewards must be a address","pc":[4039]},{"teal":4102,"source":908,"pc":[4040,4041,4042]},{"teal":4103,"source":908,"pc":[4043]},{"teal":4106,"source":908,"pc":[4044,4045,4046]},{"teal":4107,"source":908,"pc":[4047]},{"teal":4108,"source":908,"pc":[4048]},{"teal":4109,"source":908,"pc":[4049]},{"teal":4110,"source":908,"pc":[4050]},{"teal":4111,"source":908,"pc":[4051]},{"teal":4125,"source":908,"pc":[4052,4053,4054]},{"teal":4128,"source":908,"pc":[4055]},{"teal":4129,"source":908,"pc":[4056,4057]},{"teal":4133,"source":909,"pc":[4058,4059]},{"teal":4134,"source":909,"pc":[4060,4061,4062]},{"teal":4138,"source":910,"pc":[4063,4064]},{"teal":4139,"source":910,"pc":[4065]},{"teal":4140,"source":910,"pc":[4066]},{"teal":4141,"source":910,"pc":[4067,4068]},{"teal":4142,"source":910,"pc":[4069]},{"teal":4143,"source":910,"pc":[4070]},{"teal":4144,"source":910,"pc":[4071,4072]},{"teal":4145,"source":910,"pc":[4073]},{"teal":4146,"source":910,"pc":[4074]},{"teal":4147,"source":910,"pc":[4075,4076]},{"teal":4151,"source":911,"pc":[4077,4078]},{"teal":4152,"source":911,"pc":[4079]},{"teal":4153,"source":911,"pc":[4080]},{"teal":4154,"source":911,"pc":[4081,4082]},{"teal":4155,"source":911,"pc":[4083]},{"teal":4156,"source":911,"pc":[4084]},{"teal":4157,"source":911,"pc":[4085,4086]},{"teal":4158,"source":911,"pc":[4087]},{"teal":4159,"source":911,"pc":[4088]},{"teal":4160,"source":911,"pc":[4089,4090]},{"teal":4164,"source":912,"pc":[4091,4092]},{"teal":4165,"source":912,"pc":[4093]},{"teal":4166,"source":912,"pc":[4094]},{"teal":4169,"source":912,"errorMessage":"this validator doesn't have a reward token defined","pc":[4095]},{"teal":4173,"source":913,"pc":[4096,4097]},{"teal":4174,"source":913,"pc":[4098]},{"teal":4175,"source":913,"pc":[4099]},{"teal":4176,"source":913,"pc":[4100,4101]},{"teal":4177,"source":913,"pc":[4102]},{"teal":4178,"source":913,"pc":[4103]},{"teal":4179,"source":913,"pc":[4104,4105]},{"teal":4180,"source":913,"pc":[4106]},{"teal":4181,"source":913,"pc":[4107]},{"teal":4182,"source":913,"pc":[4108,4109]},{"teal":4187,"source":916,"pc":[4110,4111]},{"teal":4188,"source":916,"pc":[4112,4113]},{"teal":4189,"source":916,"pc":[4114]},{"teal":4190,"source":916,"pc":[4115,4116]},{"teal":4191,"source":916,"pc":[4117,4118]},{"teal":4192,"source":916,"pc":[4119]},{"teal":4193,"source":916,"pc":[4120,4121]},{"teal":4194,"source":916,"pc":[4122]},{"teal":4195,"source":915,"pc":[4123,4124]},{"teal":4202,"source":919,"pc":[4125]},{"teal":4203,"source":919,"pc":[4126,4127]},{"teal":4204,"source":919,"pc":[4128,4129]},{"teal":4205,"source":919,"pc":[4130,4131]},{"teal":4206,"source":919,"pc":[4132,4133]},{"teal":4210,"source":920,"pc":[4134,4135]},{"teal":4211,"source":920,"pc":[4136,4137]},{"teal":4215,"source":921,"pc":[4138,4139]},{"teal":4216,"source":921,"pc":[4140,4141]},{"teal":4217,"source":921,"pc":[4142,4143]},{"teal":4218,"source":921,"pc":[4144]},{"teal":4219,"source":921,"pc":[4145,4146]},{"teal":4220,"source":921,"pc":[4147,4148]},{"teal":4221,"source":921,"pc":[4149]},{"teal":4222,"source":921,"pc":[4150,4151]},{"teal":4225,"source":919,"pc":[4152]},{"teal":4226,"source":919,"pc":[4153,4154]},{"teal":4229,"source":919,"pc":[4155]},{"teal":4236,"source":924,"pc":[4156,4157]},{"teal":4237,"source":924,"pc":[4158,4159]},{"teal":4238,"source":924,"pc":[4160]},{"teal":4239,"source":924,"pc":[4161,4162]},{"teal":4240,"source":924,"pc":[4163,4164]},{"teal":4241,"source":924,"pc":[4165]},{"teal":4242,"source":924,"pc":[4166,4167]},{"teal":4243,"source":924,"pc":[4168]},{"teal":4246,"source":923,"errorMessage":"balance of remaining reward tokens should match the held back amount","pc":[4169]},{"teal":4250,"source":927,"pc":[4170,4171]},{"teal":4253,"source":908,"pc":[4172,4173]},{"teal":4256,"source":908,"pc":[4174,4175]},{"teal":4257,"source":908,"pc":[4176]},{"teal":4261,"source":1019,"pc":[4177,4178,4179]},{"teal":4268,"source":1021,"pc":[4180,4181]},{"teal":4269,"source":1021,"pc":[4182]},{"teal":4270,"source":1021,"pc":[4183,4184]},{"teal":4271,"source":1021,"pc":[4185]},{"teal":4272,"source":1021,"pc":[4186,4187]},{"teal":4273,"source":1021,"pc":[4188]},{"teal":4274,"source":1021,"pc":[4189]},{"teal":4275,"source":1021,"pc":[4190,4191]},{"teal":4276,"source":1021,"pc":[4192]},{"teal":4277,"source":1021,"pc":[4193]},{"teal":4280,"source":1020,"errorMessage":"can only be called by validator owner","pc":[4194]},{"teal":4281,"source":1019,"pc":[4195]},{"teal":4285,"source":1026,"pc":[4196,4197,4198]},{"teal":4293,"source":1028,"pc":[4199,4200]},{"teal":4294,"source":1028,"pc":[4201]},{"teal":4295,"source":1028,"pc":[4202,4203]},{"teal":4296,"source":1028,"pc":[4204]},{"teal":4297,"source":1028,"pc":[4205,4206]},{"teal":4298,"source":1028,"pc":[4207]},{"teal":4299,"source":1028,"pc":[4208]},{"teal":4300,"source":1028,"pc":[4209,4210]},{"teal":4301,"source":1028,"pc":[4211]},{"teal":4302,"source":1028,"pc":[4212]},{"teal":4303,"source":1028,"pc":[4213]},{"teal":4304,"source":1028,"pc":[4214,4215,4216]},{"teal":4305,"source":1029,"pc":[4217,4218]},{"teal":4306,"source":1029,"pc":[4219,4220]},{"teal":4307,"source":1029,"pc":[4221,4222]},{"teal":4308,"source":1029,"pc":[4223]},{"teal":4309,"source":1029,"pc":[4224,4225]},{"teal":4310,"source":1029,"pc":[4226]},{"teal":4311,"source":1029,"pc":[4227]},{"teal":4312,"source":1029,"pc":[4228,4229]},{"teal":4313,"source":1029,"pc":[4230]},{"teal":4314,"source":1029,"pc":[4231]},{"teal":4315,"source":1028,"pc":[4232]},{"teal":4319,"source":1027,"errorMessage":"can only be called by owner or manager of validator","pc":[4233]},{"teal":4320,"source":1026,"pc":[4234]},{"teal":4328,"source":1039,"pc":[4235,4236,4237]},{"teal":4332,"source":1040,"pc":[4238]},{"teal":4333,"source":1040,"pc":[4239,4240]},{"teal":4334,"source":1040,"pc":[4241,4242,4243]},{"teal":4335,"source":1040,"pc":[4244]},{"teal":4336,"source":1040,"pc":[4245]},{"teal":4337,"source":1040,"pc":[4246]},{"teal":4338,"source":1040,"pc":[4247]},{"teal":4339,"source":1040,"pc":[4248]},{"teal":4340,"source":1040,"pc":[4249]},{"teal":4343,"source":1040,"errorMessage":"the specified validator id isn't valid","pc":[4250]},{"teal":4347,"source":1041,"pc":[4251,4252]},{"teal":4348,"source":1041,"pc":[4253,4254,4255]},{"teal":4349,"source":1041,"pc":[4256]},{"teal":4350,"source":58,"pc":[4257]},{"teal":4351,"source":1041,"pc":[4258]},{"teal":4354,"source":1041,"errorMessage":"pool id not in valid range","pc":[4259]},{"teal":4361,"source":1043,"pc":[4260,4261]},{"teal":4362,"source":1043,"pc":[4262,4263,4264]},{"teal":4363,"source":1043,"pc":[4265]},{"teal":4364,"source":1043,"pc":[4266]},{"teal":4365,"source":1043,"pc":[4267]},{"teal":4366,"source":1043,"pc":[4268]},{"teal":4367,"source":1043,"pc":[4269,4270,4271]},{"teal":4368,"source":1043,"pc":[4272,4273]},{"teal":4369,"source":1043,"pc":[4274,4275,4276]},{"teal":4370,"source":1043,"pc":[4277]},{"teal":4371,"source":1043,"pc":[4278,4279]},{"teal":4372,"source":1043,"pc":[4280,4281]},{"teal":4373,"source":1043,"pc":[4282]},{"teal":4374,"source":1043,"pc":[4283,4284]},{"teal":4375,"source":1043,"pc":[4285,4286,4287]},{"teal":4376,"source":1043,"pc":[4288]},{"teal":4377,"source":1043,"pc":[4289]},{"teal":4378,"source":1043,"pc":[4290]},{"teal":4379,"source":1043,"pc":[4291,4292]},{"teal":4380,"source":1043,"pc":[4293]},{"teal":4381,"source":1043,"pc":[4294]},{"teal":4382,"source":1043,"pc":[4295]},{"teal":4383,"source":1043,"pc":[4296]},{"teal":4387,"source":1042,"errorMessage":"pool id outside of range of pools created for this validator","pc":[4297]},{"teal":4394,"source":1049,"pc":[4298,4299]},{"teal":4395,"source":1049,"pc":[4300,4301,4302]},{"teal":4396,"source":1049,"pc":[4303]},{"teal":4397,"source":1049,"pc":[4304,4305]},{"teal":4398,"source":1049,"pc":[4306,4307]},{"teal":4399,"source":1049,"pc":[4308,4309,4310]},{"teal":4400,"source":1049,"pc":[4311]},{"teal":4401,"source":1049,"pc":[4312]},{"teal":4402,"source":1049,"pc":[4313]},{"teal":4403,"source":1049,"pc":[4314,4315]},{"teal":4404,"source":1049,"pc":[4316]},{"teal":4405,"source":1049,"pc":[4317]},{"teal":4406,"source":1049,"pc":[4318]},{"teal":4407,"source":1049,"pc":[4319]},{"teal":4408,"source":1049,"pc":[4320]},{"teal":4409,"source":1049,"pc":[4321]},{"teal":4410,"source":1049,"pc":[4322,4323]},{"teal":4411,"source":1049,"pc":[4324,4325,4326]},{"teal":4412,"source":1049,"pc":[4327]},{"teal":4413,"source":1049,"pc":[4328]},{"teal":4414,"source":1049,"pc":[4329]},{"teal":4415,"source":1049,"pc":[4330,4331]},{"teal":4416,"source":1049,"pc":[4332]},{"teal":4417,"source":1049,"pc":[4333]},{"teal":4418,"source":1049,"pc":[4334]},{"teal":4421,"source":1048,"errorMessage":"The passed in app id doesn't match the passed in ids","pc":[4335]},{"teal":4425,"source":1053,"pc":[4336,4337]},{"teal":4426,"source":1053,"pc":[4338,4339]},{"teal":4427,"source":1053,"pc":[4340,4341,4342]},{"teal":4428,"source":1053,"pc":[4343]},{"teal":4429,"source":1053,"pc":[4344,4345]},{"teal":4430,"source":1053,"pc":[4346]},{"teal":4431,"source":1053,"pc":[4347]},{"teal":4432,"source":1053,"pc":[4348]},{"teal":4436,"source":1055,"pc":[4349,4350]},{"teal":4437,"source":1055,"pc":[4351,4352,4353]},{"teal":4438,"source":1055,"pc":[4354]},{"teal":4439,"source":1055,"pc":[4355,4356]},{"teal":4440,"source":1055,"pc":[4357,4358,4359]},{"teal":4441,"source":1055,"pc":[4360]},{"teal":4442,"source":1055,"pc":[4361,4362,4363,4364,4365,4366,4367,4368,4369,4370,4371,4372,4373]},{"teal":4443,"source":1055,"pc":[4374]},{"teal":4446,"source":1055,"errorMessage":"global state value does not exist: AppID.fromUint64(poolKey.poolAppId).globalState('validatorId')","pc":[4375]},{"teal":4447,"source":1055,"pc":[4376]},{"teal":4448,"source":1055,"pc":[4377]},{"teal":4452,"source":1056,"pc":[4378,4379]},{"teal":4453,"source":1056,"pc":[4380,4381,4382]},{"teal":4454,"source":1056,"pc":[4383]},{"teal":4455,"source":1056,"pc":[4384,4385]},{"teal":4456,"source":1056,"pc":[4386,4387,4388]},{"teal":4457,"source":1056,"pc":[4389]},{"teal":4458,"source":1056,"pc":[4390,4391,4392,4393,4394,4395,4396,4397]},{"teal":4459,"source":1056,"pc":[4398]},{"teal":4462,"source":1056,"errorMessage":"global state value does not exist: AppID.fromUint64(poolKey.poolAppId).globalState('poolId')","pc":[4399]},{"teal":4463,"source":1056,"pc":[4400]},{"teal":4464,"source":1056,"pc":[4401]},{"teal":4465,"source":1039,"pc":[4402]},{"teal":4474,"source":1065,"pc":[4403,4404,4405]},{"teal":4477,"source":1065,"pc":[4406]},{"teal":4478,"source":1065,"pc":[4407]},{"teal":4482,"source":1066,"pc":[4408]},{"teal":4483,"source":1066,"pc":[4409,4410]},{"teal":4484,"source":1066,"pc":[4411]},{"teal":4485,"source":1066,"pc":[4412]},{"teal":4486,"source":1066,"pc":[4413,4414]},{"teal":4491,"source":1067,"pc":[4415,4416]},{"teal":4492,"source":1067,"pc":[4417]},{"teal":4493,"source":1066,"pc":[4418]},{"teal":4494,"source":1066,"pc":[4419,4420]},{"teal":4495,"source":1066,"pc":[4421]},{"teal":4496,"source":1066,"pc":[4422]},{"teal":4497,"source":1066,"pc":[4423,4424]},{"teal":4498,"source":1066,"pc":[4425]},{"teal":4499,"source":1067,"pc":[4426]},{"teal":4500,"source":1067,"pc":[4427]},{"teal":4501,"source":1067,"pc":[4428]},{"teal":4502,"source":1067,"pc":[4429,4430,4431]},{"teal":4507,"source":1070,"pc":[4432,4433]},{"teal":4508,"source":1070,"pc":[4434]},{"teal":4509,"source":1066,"pc":[4435]},{"teal":4510,"source":1066,"pc":[4436,4437]},{"teal":4511,"source":1066,"pc":[4438]},{"teal":4512,"source":1066,"pc":[4439]},{"teal":4513,"source":1066,"pc":[4440,4441]},{"teal":4514,"source":1066,"pc":[4442]},{"teal":4515,"source":1070,"pc":[4443]},{"teal":4516,"source":1070,"pc":[4444,4445]},{"teal":4517,"source":1070,"pc":[4446]},{"teal":4520,"source":1070,"errorMessage":"global state value does not exist: AppID.fromUint64(validatorConfig.nfdForInfo).globalState('i.owner.a')","pc":[4447]},{"teal":4521,"source":1070,"pc":[4448,4449]},{"teal":4526,"source":1072,"pc":[4450]},{"teal":4527,"source":1072,"pc":[4451,4452]},{"teal":4528,"source":1066,"pc":[4453]},{"teal":4529,"source":1066,"pc":[4454,4455]},{"teal":4530,"source":1066,"pc":[4456]},{"teal":4531,"source":1066,"pc":[4457]},{"teal":4532,"source":1066,"pc":[4458,4459]},{"teal":4533,"source":1066,"pc":[4460]},{"teal":4534,"source":1072,"pc":[4461,4462]},{"teal":4535,"source":1072,"pc":[4463]},{"teal":4536,"source":1072,"pc":[4464]},{"teal":4537,"source":1072,"pc":[4465,4466,4467]},{"teal":4538,"source":1072,"pc":[4468,4469]},{"teal":4539,"source":1072,"pc":[4470,4471]},{"teal":4540,"source":1066,"pc":[4472]},{"teal":4541,"source":1066,"pc":[4473,4474]},{"teal":4542,"source":1066,"pc":[4475]},{"teal":4543,"source":1066,"pc":[4476]},{"teal":4544,"source":1066,"pc":[4477,4478]},{"teal":4545,"source":1066,"pc":[4479]},{"teal":4546,"source":1072,"pc":[4480,4481]},{"teal":4547,"source":1072,"pc":[4482]},{"teal":4548,"source":1072,"pc":[4483]},{"teal":4551,"source":1072,"pc":[4484,4485,4486]},{"teal":4556,"source":1074,"pc":[4487,4488]},{"teal":4557,"source":1074,"pc":[4489,4490]},{"teal":4558,"source":1074,"pc":[4491]},{"teal":4559,"source":1074,"pc":[4492,4493]},{"teal":4560,"source":1074,"pc":[4494]},{"teal":4561,"source":1074,"pc":[4495]},{"teal":4562,"source":1074,"pc":[4496,4497]},{"teal":4563,"source":1074,"pc":[4498]},{"teal":4568,"source":1065,"pc":[4499]},{"teal":4572,"source":1079,"pc":[4500,4501,4502]},{"teal":4576,"source":1081,"pc":[4503,4504]},{"teal":4577,"source":1081,"pc":[4505,4506,4507]},{"teal":4578,"source":1081,"pc":[4508,4509]},{"teal":4579,"source":1081,"pc":[4510]},{"teal":4580,"source":1081,"pc":[4511]},{"teal":4584,"source":1082,"pc":[4512,4513]},{"teal":4585,"source":1082,"pc":[4514,4515,4516]},{"teal":4586,"source":1082,"pc":[4517,4518]},{"teal":4587,"source":1082,"pc":[4519]},{"teal":4588,"source":1082,"pc":[4520]},{"teal":4592,"source":1083,"pc":[4521,4522]},{"teal":4593,"source":1083,"pc":[4523,4524]},{"teal":4594,"source":1083,"pc":[4525,4526,4527]},{"teal":4595,"source":1083,"pc":[4528]},{"teal":4598,"source":1083,"errorMessage":"sender must be owner to add new validator","pc":[4529]},{"teal":4605,"source":1086,"pc":[4530,4531]},{"teal":4606,"source":1086,"pc":[4532,4533,4534]},{"teal":4607,"source":1086,"pc":[4535]},{"teal":4608,"source":1086,"pc":[4536]},{"teal":4609,"source":1086,"pc":[4537]},{"teal":4610,"source":1086,"pc":[4538]},{"teal":4611,"source":1086,"pc":[4539,4540,4541]},{"teal":4612,"source":1086,"pc":[4542,4543]},{"teal":4613,"source":1086,"pc":[4544,4545,4546]},{"teal":4614,"source":1086,"pc":[4547]},{"teal":4615,"source":1086,"pc":[4548,4549]},{"teal":4616,"source":1086,"pc":[4550]},{"teal":4617,"source":1086,"pc":[4551]},{"teal":4621,"source":1085,"errorMessage":"gating type not valid","pc":[4552]},{"teal":4628,"source":1090,"pc":[4553,4554]},{"teal":4629,"source":1090,"pc":[4555,4556,4557]},{"teal":4630,"source":1090,"pc":[4558]},{"teal":4631,"source":1090,"pc":[4559]},{"teal":4632,"source":1090,"pc":[4560]},{"teal":4633,"source":1090,"pc":[4561]},{"teal":4634,"source":1090,"pc":[4562,4563,4564]},{"teal":4635,"source":1090,"pc":[4565,4566]},{"teal":4636,"source":1090,"pc":[4567,4568,4569]},{"teal":4637,"source":1090,"pc":[4570]},{"teal":4638,"source":1090,"pc":[4571,4572]},{"teal":4639,"source":1090,"pc":[4573]},{"teal":4640,"source":1090,"pc":[4574]},{"teal":4644,"source":1089,"errorMessage":"epoch length not in allowable range","pc":[4575]},{"teal":4651,"source":1094,"pc":[4576,4577]},{"teal":4652,"source":1094,"pc":[4578,4579,4580]},{"teal":4653,"source":1094,"pc":[4581]},{"teal":4654,"source":1094,"pc":[4582]},{"teal":4655,"source":1094,"pc":[4583]},{"teal":4656,"source":1094,"pc":[4584]},{"teal":4657,"source":1094,"pc":[4585,4586,4587]},{"teal":4658,"source":1094,"pc":[4588,4589]},{"teal":4659,"source":1094,"pc":[4590,4591,4592]},{"teal":4660,"source":1094,"pc":[4593]},{"teal":4661,"source":1094,"pc":[4594,4595]},{"teal":4662,"source":1094,"pc":[4596]},{"teal":4663,"source":1094,"pc":[4597]},{"teal":4667,"source":1093,"errorMessage":"commission percentage not valid","pc":[4598]},{"teal":4672,"source":1097,"pc":[4599,4600]},{"teal":4673,"source":1097,"pc":[4601,4602,4603]},{"teal":4674,"source":1097,"pc":[4604]},{"teal":4675,"source":1097,"pc":[4605]},{"teal":4676,"source":1097,"pc":[4606]},{"teal":4677,"source":1097,"pc":[4607,4608,4609]},{"teal":4685,"source":1099,"pc":[4610,4611]},{"teal":4686,"source":1099,"pc":[4612,4613,4614]},{"teal":4687,"source":1099,"pc":[4615,4616]},{"teal":4688,"source":1099,"pc":[4617]},{"teal":4691,"source":1098,"errorMessage":"validatorCommissionAddress must be set if percent to validator is not 0","pc":[4618]},{"teal":4696,"source":1103,"pc":[4619,4620]},{"teal":4697,"source":1103,"pc":[4621,4622,4623]},{"teal":4698,"source":1103,"pc":[4624]},{"teal":4699,"source":1103,"pc":[4625,4626]},{"teal":4700,"source":1103,"pc":[4627]},{"teal":4703,"source":1103,"errorMessage":"staking pool must have minimum entry of 1 algo","pc":[4628]},{"teal":4710,"source":1106,"pc":[4629,4630]},{"teal":4711,"source":1106,"pc":[4631,4632,4633]},{"teal":4712,"source":1106,"pc":[4634]},{"teal":4713,"source":1106,"pc":[4635]},{"teal":4714,"source":1106,"pc":[4636]},{"teal":4715,"source":1106,"pc":[4637]},{"teal":4716,"source":1106,"pc":[4638,4639,4640]},{"teal":4717,"source":1106,"pc":[4641,4642]},{"teal":4718,"source":1106,"pc":[4643,4644,4645]},{"teal":4719,"source":1106,"pc":[4646]},{"teal":4720,"source":1106,"pc":[4647,4648]},{"teal":4721,"source":1106,"pc":[4649]},{"teal":4722,"source":1106,"pc":[4650]},{"teal":4726,"source":1105,"errorMessage":"number of pools per node must be be between 1 and the maximum allowed number","pc":[4651]},{"teal":4731,"source":1109,"pc":[4652,4653]},{"teal":4732,"source":1109,"pc":[4654,4655,4656]},{"teal":4733,"source":1109,"pc":[4657]},{"teal":4734,"source":1109,"pc":[4658]},{"teal":4735,"source":1109,"pc":[4659]},{"teal":4736,"source":1109,"pc":[4660,4661,4662]},{"teal":4741,"source":1110,"pc":[4663,4664]},{"teal":4742,"source":1110,"pc":[4665,4666,4667]},{"teal":4743,"source":1110,"pc":[4668]},{"teal":4744,"source":1110,"pc":[4669,4670]},{"teal":4745,"source":1110,"pc":[4671]},{"teal":4748,"source":1110,"errorMessage":"sunsettingOn must be later than now if set","pc":[4672]},{"teal":4751,"source":1079,"pc":[4673]},{"teal":4765,"source":1125,"pc":[4674,4675,4676]},{"teal":4768,"source":1125,"pc":[4677]},{"teal":4769,"source":1125,"pc":[4678,4679]},{"teal":4773,"source":1132,"pc":[4680,4681]},{"teal":4774,"source":1132,"pc":[4682,4683]},{"teal":4775,"source":1132,"pc":[4684,4685,4686]},{"teal":4776,"source":1132,"pc":[4687]},{"teal":4777,"source":1132,"pc":[4688]},{"teal":4778,"source":1132,"pc":[4689]},{"teal":4779,"source":1132,"pc":[4690,4691]},{"teal":4780,"source":1132,"pc":[4692]},{"teal":4781,"source":1132,"pc":[4693]},{"teal":4782,"source":1132,"pc":[4694]},{"teal":4783,"source":1132,"pc":[4695]},{"teal":4784,"source":1132,"pc":[4696]},{"teal":4785,"source":1132,"pc":[4697]},{"teal":4786,"source":1132,"pc":[4698,4699]},{"teal":4787,"source":1132,"pc":[4700,4701,4702]},{"teal":4788,"source":1132,"pc":[4703]},{"teal":4789,"source":1132,"pc":[4704]},{"teal":4790,"source":1132,"pc":[4705]},{"teal":4791,"source":1132,"pc":[4706,4707]},{"teal":4792,"source":1132,"pc":[4708]},{"teal":4793,"source":1132,"pc":[4709]},{"teal":4794,"source":1132,"pc":[4710,4711]},{"teal":4807,"source":1141,"pc":[4712]},{"teal":4808,"source":1141,"pc":[4713]},{"teal":4809,"source":1141,"pc":[4714,4715]},{"teal":4813,"source":1141,"pc":[4716,4717]},{"teal":4814,"source":1141,"pc":[4718,4719]},{"teal":4815,"source":1141,"pc":[4720,4721]},{"teal":4816,"source":1141,"pc":[4722]},{"teal":4817,"source":1141,"pc":[4723,4724]},{"teal":4821,"source":1141,"pc":[4725,4726]},{"teal":4822,"source":1141,"pc":[4727,4728]},{"teal":4823,"source":1141,"pc":[4729]},{"teal":4824,"source":1141,"pc":[4730,4731]},{"teal":4827,"source":1141,"pc":[4732]},{"teal":4828,"source":1141,"pc":[4733,4734]},{"teal":4829,"source":1136,"pc":[4735]},{"teal":4830,"source":1136,"pc":[4736,4737]},{"teal":4831,"source":1136,"pc":[4738,4739]},{"teal":4832,"source":1136,"pc":[4740,4741,4742,4743,4744,4745]},{"teal":4833,"source":1136,"pc":[4746,4747]},{"teal":4837,"source":1137,"pc":[4748,4749]},{"teal":4838,"source":1137,"pc":[4750,4751]},{"teal":4848,"source":1143,"pc":[4752,4753]},{"teal":4849,"source":1143,"pc":[4754,4755]},{"teal":4850,"source":1143,"pc":[4756,4757]},{"teal":4853,"source":1136,"pc":[4758]},{"teal":4854,"source":1136,"pc":[4759,4760]},{"teal":4857,"source":1136,"pc":[4761]},{"teal":4858,"source":1136,"pc":[4762,4763]},{"teal":4859,"source":1136,"pc":[4764]},{"teal":4860,"source":1136,"pc":[4765]},{"teal":4861,"source":1136,"pc":[4766,4767]},{"teal":4862,"source":1136,"pc":[4768,4769,4770]},{"teal":4863,"source":1136,"pc":[4771]},{"teal":4868,"source":1146,"pc":[4772,4773]},{"teal":4869,"source":1146,"pc":[4774,4775,4776]},{"teal":4870,"source":1146,"pc":[4777]},{"teal":4871,"source":1146,"pc":[4778,4779,4780]},{"teal":4876,"source":1147,"pc":[4781]},{"teal":4877,"source":1147,"pc":[4782,4783]},{"teal":4878,"source":1147,"pc":[4784,4785]},{"teal":4879,"source":1147,"pc":[4786]},{"teal":4880,"source":1147,"pc":[4787,4788]},{"teal":4881,"source":1147,"pc":[4789,4790]},{"teal":4882,"source":1147,"pc":[4791]},{"teal":4883,"source":1147,"pc":[4792,4793]},{"teal":4884,"source":1147,"pc":[4794,4795]},{"teal":4885,"source":1147,"pc":[4796,4797]},{"teal":4886,"source":1147,"pc":[4798,4799]},{"teal":4887,"source":1147,"pc":[4800]},{"teal":4892,"source":1151,"pc":[4801,4802]},{"teal":4893,"source":1151,"pc":[4803,4804]},{"teal":4894,"source":1151,"pc":[4805]},{"teal":4897,"source":1151,"errorMessage":"global state value does not exist: AppID.fromUint64(poolAppId).globalState('numStakers')","pc":[4806]},{"teal":4898,"source":1151,"pc":[4807,4808]},{"teal":4902,"source":1152,"pc":[4809,4810]},{"teal":4903,"source":1152,"pc":[4811,4812]},{"teal":4904,"source":1152,"pc":[4813]},{"teal":4907,"source":1152,"errorMessage":"global state value does not exist: AppID.fromUint64(poolAppId).globalState('staked')","pc":[4814]},{"teal":4908,"source":1152,"pc":[4815,4816]},{"teal":4912,"source":1153,"pc":[4817,4818]},{"teal":4913,"source":1153,"pc":[4819,4820]},{"teal":4914,"source":1153,"pc":[4821,4822,4823]},{"teal":4915,"source":1153,"pc":[4824]},{"teal":4916,"source":1153,"pc":[4825]},{"teal":4917,"source":1153,"pc":[4826]},{"teal":4918,"source":1153,"pc":[4827,4828]},{"teal":4919,"source":1153,"pc":[4829]},{"teal":4920,"source":1153,"pc":[4830]},{"teal":4921,"source":1153,"pc":[4831]},{"teal":4922,"source":1153,"pc":[4832]},{"teal":4923,"source":1153,"pc":[4833,4834]},{"teal":4924,"source":1153,"pc":[4835]},{"teal":4925,"source":1153,"pc":[4836,4837,4838]},{"teal":4926,"source":1153,"pc":[4839]},{"teal":4927,"source":1153,"pc":[4840,4841]},{"teal":4928,"source":1153,"pc":[4842,4843,4844]},{"teal":4929,"source":1153,"pc":[4845]},{"teal":4930,"source":1153,"pc":[4846]},{"teal":4931,"source":1153,"pc":[4847]},{"teal":4932,"source":1153,"pc":[4848,4849]},{"teal":4933,"source":1153,"pc":[4850]},{"teal":4937,"source":1154,"pc":[4851,4852]},{"teal":4938,"source":1154,"pc":[4853,4854]},{"teal":4939,"source":1154,"pc":[4855,4856,4857]},{"teal":4940,"source":1154,"pc":[4858]},{"teal":4941,"source":1154,"pc":[4859]},{"teal":4942,"source":1154,"pc":[4860]},{"teal":4943,"source":1154,"pc":[4861,4862]},{"teal":4944,"source":1154,"pc":[4863]},{"teal":4945,"source":1154,"pc":[4864]},{"teal":4946,"source":1154,"pc":[4865,4866]},{"teal":4947,"source":1154,"pc":[4867]},{"teal":4948,"source":1154,"pc":[4868,4869]},{"teal":4949,"source":1154,"pc":[4870]},{"teal":4950,"source":1154,"pc":[4871]},{"teal":4951,"source":1154,"pc":[4872,4873]},{"teal":4952,"source":1154,"pc":[4874,4875,4876]},{"teal":4953,"source":1154,"pc":[4877]},{"teal":4954,"source":1154,"pc":[4878]},{"teal":4955,"source":1154,"pc":[4879]},{"teal":4956,"source":1154,"pc":[4880,4881]},{"teal":4957,"source":1154,"pc":[4882]},{"teal":4962,"source":1157,"pc":[4883,4884]},{"teal":4963,"source":1157,"pc":[4885,4886,4887]},{"teal":4968,"source":1158,"pc":[4888,4889]},{"teal":4969,"source":1158,"pc":[4890]},{"teal":4970,"source":1158,"pc":[4891]},{"teal":4971,"source":1158,"pc":[4892]},{"teal":4972,"source":1158,"pc":[4893,4894]},{"teal":4973,"source":1158,"pc":[4895,4896,4897]},{"teal":4974,"source":1158,"pc":[4898]},{"teal":4975,"source":1158,"pc":[4899]},{"teal":4976,"source":1158,"pc":[4900]},{"teal":4977,"source":1158,"pc":[4901,4902]},{"teal":4978,"source":1158,"pc":[4903]},{"teal":4979,"source":1158,"pc":[4904]},{"teal":4980,"source":1158,"pc":[4905]},{"teal":4981,"source":1158,"pc":[4906]},{"teal":4982,"source":1158,"pc":[4907]},{"teal":4983,"source":1158,"pc":[4908]},{"teal":4984,"source":1158,"pc":[4909,4910]},{"teal":4985,"source":1158,"pc":[4911,4912,4913]},{"teal":4986,"source":1158,"pc":[4914]},{"teal":4987,"source":1158,"pc":[4915]},{"teal":4988,"source":1158,"pc":[4916]},{"teal":4989,"source":1158,"pc":[4917,4918]},{"teal":4990,"source":1158,"pc":[4919]},{"teal":4996,"source":1160,"pc":[4920,4921]},{"teal":4997,"source":1160,"pc":[4922,4923,4924]},{"teal":5002,"source":1161,"pc":[4925,4926]},{"teal":5003,"source":1161,"pc":[4927]},{"teal":5004,"source":1161,"pc":[4928]},{"teal":5005,"source":1161,"pc":[4929]},{"teal":5006,"source":1161,"pc":[4930,4931]},{"teal":5007,"source":1161,"pc":[4932]},{"teal":5008,"source":1161,"pc":[4933]},{"teal":5013,"source":1163,"pc":[4934,4935]},{"teal":5014,"source":1163,"pc":[4936]},{"teal":5015,"source":1163,"pc":[4937]},{"teal":5016,"source":1163,"pc":[4938]},{"teal":5017,"source":1163,"pc":[4939,4940]},{"teal":5018,"source":1163,"pc":[4941,4942,4943]},{"teal":5019,"source":1163,"pc":[4944]},{"teal":5020,"source":1163,"pc":[4945]},{"teal":5021,"source":1163,"pc":[4946]},{"teal":5022,"source":1163,"pc":[4947,4948]},{"teal":5023,"source":1163,"pc":[4949]},{"teal":5024,"source":1163,"pc":[4950]},{"teal":5025,"source":1163,"pc":[4951,4952]},{"teal":5026,"source":1163,"pc":[4953,4954]},{"teal":5027,"source":1163,"pc":[4955,4956]},{"teal":5028,"source":1163,"pc":[4957]},{"teal":5029,"source":1163,"pc":[4958]},{"teal":5030,"source":1163,"pc":[4959]},{"teal":5031,"source":1163,"pc":[4960]},{"teal":5032,"source":1163,"pc":[4961,4962]},{"teal":5033,"source":1163,"pc":[4963,4964,4965]},{"teal":5034,"source":1163,"pc":[4966]},{"teal":5035,"source":1163,"pc":[4967]},{"teal":5036,"source":1163,"pc":[4968]},{"teal":5037,"source":1163,"pc":[4969,4970]},{"teal":5038,"source":1163,"pc":[4971]},{"teal":5042,"source":1164,"pc":[4972,4973]},{"teal":5043,"source":1164,"pc":[4974]},{"teal":5044,"source":1164,"pc":[4975,4976]},{"teal":5045,"source":1164,"pc":[4977,4978]},{"teal":5046,"source":1164,"pc":[4979,4980]},{"teal":5047,"source":1164,"pc":[4981]},{"teal":5048,"source":1164,"pc":[4982]},{"teal":5049,"source":1164,"pc":[4983,4984]},{"teal":5050,"source":1164,"pc":[4985]},{"teal":5051,"source":1164,"pc":[4986]},{"teal":5052,"source":1125,"pc":[4987]},{"teal":5056,"source":1167,"pc":[4988,4989,4990]},{"teal":5059,"source":1167,"pc":[4991]},{"teal":5060,"source":1167,"pc":[4992,4993]},{"teal":5064,"source":1168,"pc":[4994]},{"teal":5065,"source":1168,"pc":[4995,4996]},{"teal":5066,"source":1168,"pc":[4997]},{"teal":5067,"source":1168,"pc":[4998]},{"teal":5068,"source":1168,"pc":[4999]},{"teal":5069,"source":1168,"pc":[5000]},{"teal":5070,"source":1168,"pc":[5001]},{"teal":5074,"source":1170,"pc":[5002]},{"teal":5075,"source":1170,"pc":[5003,5004]},{"teal":5076,"source":1170,"pc":[5005]},{"teal":5077,"source":1170,"pc":[5006]},{"teal":5080,"source":1170,"errorMessage":"box value does not exist: this.stakerPoolSet(staker).value","pc":[5007]},{"teal":5081,"source":1170,"pc":[5008,5009]},{"teal":5085,"source":1171,"pc":[5010]},{"teal":5086,"source":1171,"pc":[5011,5012]},{"teal":5090,"source":1172,"pc":[5013]},{"teal":5091,"source":1172,"pc":[5014,5015]},{"teal":5096,"source":1172,"pc":[5016,5017]},{"teal":5097,"source":1172,"pc":[5018,5019]},{"teal":5098,"source":1172,"pc":[5020]},{"teal":5099,"source":1172,"pc":[5021,5022,5023]},{"teal":5104,"source":1173,"pc":[5024,5025]},{"teal":5105,"source":1173,"pc":[5026,5027]},{"teal":5106,"source":1173,"pc":[5028]},{"teal":5107,"source":1173,"pc":[5029]},{"teal":5108,"source":1173,"pc":[5030]},{"teal":5109,"source":1173,"pc":[5031]},{"teal":5110,"source":1173,"pc":[5032,5033]},{"teal":5111,"source":1173,"pc":[5034]},{"teal":5112,"source":1173,"pc":[5035,5036,5037]},{"teal":5117,"source":1175,"pc":[5038]},{"teal":5123,"source":1177,"pc":[5039,5040]},{"teal":5124,"source":1177,"pc":[5041]},{"teal":5125,"source":1177,"pc":[5042]},{"teal":5126,"source":1177,"pc":[5043]},{"teal":5127,"source":1177,"pc":[5044,5045,5046]},{"teal":5128,"source":1177,"pc":[5047,5048]},{"teal":5129,"source":1177,"pc":[5049,5050]},{"teal":5130,"source":1177,"pc":[5051]},{"teal":5131,"source":1177,"pc":[5052]},{"teal":5132,"source":1177,"pc":[5053]},{"teal":5133,"source":1177,"pc":[5054]},{"teal":5134,"source":1177,"pc":[5055]},{"teal":5135,"source":1177,"pc":[5056]},{"teal":5136,"source":1177,"pc":[5057]},{"teal":5137,"source":1177,"pc":[5058]},{"teal":5138,"source":1177,"pc":[5059]},{"teal":5139,"source":1177,"pc":[5060]},{"teal":5142,"source":1177,"pc":[5061,5062,5063]},{"teal":5147,"source":1178,"pc":[5064,5065]},{"teal":5148,"source":1178,"pc":[5066]},{"teal":5149,"source":1178,"pc":[5067]},{"teal":5150,"source":1178,"pc":[5068,5069]},{"teal":5157,"source":1172,"pc":[5070,5071]},{"teal":5158,"source":1172,"pc":[5072]},{"teal":5159,"source":1172,"pc":[5073]},{"teal":5160,"source":1172,"pc":[5074,5075]},{"teal":5161,"source":1172,"pc":[5076,5077,5078]},{"teal":5167,"source":1181,"pc":[5079,5080]},{"teal":5168,"source":1181,"pc":[5081]},{"teal":5169,"source":1181,"pc":[5082]},{"teal":5170,"source":1181,"pc":[5083,5084,5085]},{"teal":5174,"source":1182,"errorMessage":"No empty slot available in the staker pool set","pc":[5086]},{"teal":5179,"source":1184,"pc":[5087,5088]},{"teal":5180,"source":1184,"pc":[5089]},{"teal":5181,"source":1184,"pc":[5090]},{"teal":5182,"source":1184,"pc":[5091]},{"teal":5183,"source":1184,"pc":[5092]},{"teal":5184,"source":1184,"pc":[5093,5094]},{"teal":5185,"source":1184,"pc":[5095]},{"teal":5186,"source":1184,"pc":[5096,5097]},{"teal":5187,"source":1184,"pc":[5098]},{"teal":5188,"source":1184,"pc":[5099,5100]},{"teal":5189,"source":1184,"pc":[5101]},{"teal":5190,"source":1167,"pc":[5102]},{"teal":5201,"source":1195,"pc":[5103,5104,5105]},{"teal":5204,"source":1195,"pc":[5106]},{"teal":5205,"source":1195,"pc":[5107,5108]},{"teal":5209,"source":1197,"pc":[5109]},{"teal":5210,"source":1197,"pc":[5110,5111]},{"teal":5214,"source":1198,"pc":[5112]},{"teal":5215,"source":1198,"pc":[5113,5114]},{"teal":5219,"source":1199,"pc":[5115]},{"teal":5220,"source":1199,"pc":[5116,5117]},{"teal":5224,"source":1201,"pc":[5118]},{"teal":5225,"source":1201,"pc":[5119,5120]},{"teal":5226,"source":1201,"pc":[5121]},{"teal":5227,"source":1201,"pc":[5122]},{"teal":5230,"source":1201,"errorMessage":"box value does not exist: this.stakerPoolSet(staker).value","pc":[5123]},{"teal":5231,"source":1201,"pc":[5124,5125]},{"teal":5235,"source":1202,"pc":[5126]},{"teal":5236,"source":1202,"pc":[5127,5128]},{"teal":5241,"source":1202,"pc":[5129,5130]},{"teal":5242,"source":1202,"pc":[5131,5132]},{"teal":5243,"source":1202,"pc":[5133]},{"teal":5244,"source":1202,"pc":[5134,5135,5136]},{"teal":5249,"source":1203,"pc":[5137,5138]},{"teal":5250,"source":1203,"pc":[5139,5140]},{"teal":5251,"source":1203,"pc":[5141]},{"teal":5252,"source":1203,"pc":[5142]},{"teal":5253,"source":1203,"pc":[5143]},{"teal":5254,"source":1203,"pc":[5144]},{"teal":5255,"source":1203,"pc":[5145]},{"teal":5256,"source":1203,"pc":[5146]},{"teal":5257,"source":1203,"pc":[5147]},{"teal":5258,"source":1203,"pc":[5148]},{"teal":5259,"source":1203,"pc":[5149]},{"teal":5260,"source":1203,"pc":[5150,5151,5152]},{"teal":5263,"source":1204,"pc":[5153,5154,5155]},{"teal":5268,"source":1206,"pc":[5156,5157]},{"teal":5269,"source":1206,"pc":[5158]},{"teal":5270,"source":1206,"pc":[5159]},{"teal":5271,"source":1206,"pc":[5160,5161]},{"teal":5276,"source":1207,"pc":[5162,5163]},{"teal":5277,"source":1207,"pc":[5164,5165]},{"teal":5278,"source":1207,"pc":[5166]},{"teal":5279,"source":1207,"pc":[5167]},{"teal":5280,"source":1207,"pc":[5168]},{"teal":5281,"source":1207,"pc":[5169]},{"teal":5282,"source":1207,"pc":[5170]},{"teal":5283,"source":1207,"pc":[5171]},{"teal":5284,"source":1207,"pc":[5172]},{"teal":5285,"source":1207,"pc":[5173,5174]},{"teal":5286,"source":1207,"pc":[5175,5176,5177]},{"teal":5287,"source":1207,"pc":[5178]},{"teal":5288,"source":1207,"pc":[5179]},{"teal":5289,"source":1207,"pc":[5180,5181,5182]},{"teal":5295,"source":1208,"pc":[5183,5184]},{"teal":5296,"source":1208,"pc":[5185,5186]},{"teal":5297,"source":1208,"pc":[5187]},{"teal":5298,"source":1208,"pc":[5188]},{"teal":5299,"source":1208,"pc":[5189]},{"teal":5300,"source":1208,"pc":[5190]},{"teal":5301,"source":1208,"pc":[5191,5192]},{"teal":5302,"source":1208,"pc":[5193]},{"teal":5303,"source":1208,"pc":[5194,5195,5196]},{"teal":5308,"source":1209,"pc":[5197]},{"teal":5309,"source":1209,"pc":[5198,5199]},{"teal":5313,"source":1211,"pc":[5200,5201]},{"teal":5314,"source":1211,"pc":[5202]},{"teal":5315,"source":1211,"pc":[5203]},{"teal":5316,"source":1211,"pc":[5204,5205,5206,5207,5208,5209,5210,5211,5212,5213,5214,5215,5216,5217,5218,5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229]},{"teal":5317,"source":1211,"pc":[5230]},{"teal":5318,"source":1211,"pc":[5231,5232]},{"teal":5319,"source":1211,"pc":[5233]},{"teal":5320,"source":1211,"pc":[5234,5235]},{"teal":5321,"source":1211,"pc":[5236]},{"teal":5322,"source":1208,"pc":[5237,5238,5239]},{"teal":5327,"source":1213,"pc":[5240,5241]},{"teal":5328,"source":1213,"pc":[5242]},{"teal":5329,"source":1213,"pc":[5243]},{"teal":5330,"source":1213,"pc":[5244,5245]},{"teal":5339,"source":1202,"pc":[5246,5247]},{"teal":5340,"source":1202,"pc":[5248]},{"teal":5341,"source":1202,"pc":[5249]},{"teal":5342,"source":1202,"pc":[5250,5251]},{"teal":5343,"source":1202,"pc":[5252,5253,5254]},{"teal":5349,"source":1217,"pc":[5255,5256]},{"teal":5350,"source":1217,"pc":[5257]},{"teal":5351,"source":1217,"pc":[5258,5259,5260]},{"teal":5355,"source":1218,"errorMessage":"No matching slot found when told to remove a pool from the stakers set","pc":[5261]},{"teal":5360,"source":1221,"pc":[5262,5263]},{"teal":5361,"source":1221,"pc":[5264]},{"teal":5362,"source":1221,"pc":[5265,5266]},{"teal":5363,"source":1221,"pc":[5267]},{"teal":5364,"source":1221,"pc":[5268]},{"teal":5365,"source":1221,"pc":[5269]},{"teal":5366,"source":1221,"pc":[5270]},{"teal":5367,"source":1221,"pc":[5271,5272]},{"teal":5368,"source":1221,"pc":[5273]},{"teal":5369,"source":1221,"pc":[5274]},{"teal":5370,"source":1221,"pc":[5275]},{"teal":5373,"source":1195,"pc":[5276,5277]},{"teal":5376,"source":1195,"pc":[5278,5279]},{"teal":5377,"source":1195,"pc":[5280]},{"teal":5381,"source":1224,"pc":[5281,5282,5283]},{"teal":5384,"source":1224,"pc":[5284]},{"teal":5385,"source":1224,"pc":[5285,5286]},{"teal":5389,"source":1225,"pc":[5287,5288]},{"teal":5390,"source":1225,"pc":[5289,5290]},{"teal":5391,"source":1225,"pc":[5291]},{"teal":5392,"source":1225,"pc":[5292,5293]},{"teal":5393,"source":1225,"pc":[5294]},{"teal":5394,"source":1225,"pc":[5295]},{"teal":5395,"source":1225,"pc":[5296,5297]},{"teal":5396,"source":1225,"pc":[5298]},{"teal":5397,"source":1225,"pc":[5299,5300]},{"teal":5401,"source":1226,"pc":[5301,5302,5303]},{"teal":5402,"source":1226,"pc":[5304]},{"teal":5403,"source":1226,"pc":[5305]},{"teal":5404,"source":1226,"pc":[5306,5307]},{"teal":5405,"source":1226,"pc":[5308]},{"teal":5406,"source":1226,"pc":[5309]},{"teal":5407,"source":1226,"pc":[5310,5311]},{"teal":5408,"source":1226,"pc":[5312]},{"teal":5409,"source":1226,"pc":[5313]},{"teal":5410,"source":1226,"pc":[5314,5315]},{"teal":5414,"source":1228,"pc":[5316,5317]},{"teal":5415,"source":1228,"pc":[5318]},{"teal":5416,"source":1228,"pc":[5319]},{"teal":5417,"source":1228,"pc":[5320]},{"teal":5418,"source":1228,"pc":[5321,5322,5323]},{"teal":5419,"source":1228,"pc":[5324,5325]},{"teal":5420,"source":1228,"pc":[5326]},{"teal":5421,"source":1228,"pc":[5327]},{"teal":5422,"source":1228,"pc":[5328]},{"teal":5426,"source":1228,"errorMessage":"node number not in valid range","pc":[5329]},{"teal":5430,"source":1230,"pc":[5330]},{"teal":5431,"source":1230,"pc":[5331,5332]},{"teal":5436,"source":1230,"pc":[5333,5334]},{"teal":5437,"source":1230,"pc":[5335,5336]},{"teal":5438,"source":1230,"pc":[5337]},{"teal":5439,"source":1230,"pc":[5338,5339,5340]},{"teal":5444,"source":1231,"pc":[5341,5342]},{"teal":5445,"source":1231,"pc":[5343]},{"teal":5446,"source":1231,"pc":[5344,5345]},{"teal":5447,"source":1231,"pc":[5346]},{"teal":5448,"source":1231,"pc":[5347]},{"teal":5449,"source":1231,"pc":[5348]},{"teal":5450,"source":1231,"pc":[5349]},{"teal":5451,"source":1231,"pc":[5350]},{"teal":5452,"source":1231,"pc":[5351]},{"teal":5453,"source":1231,"pc":[5352]},{"teal":5454,"source":1231,"pc":[5353,5354]},{"teal":5455,"source":1231,"pc":[5355]},{"teal":5456,"source":1231,"pc":[5356]},{"teal":5457,"source":1231,"pc":[5357]},{"teal":5458,"source":1231,"pc":[5358]},{"teal":5459,"source":1231,"pc":[5359]},{"teal":5460,"source":1231,"pc":[5360]},{"teal":5461,"source":1231,"pc":[5361]},{"teal":5462,"source":1231,"pc":[5362]},{"teal":5463,"source":1231,"pc":[5363,5364,5365]},{"teal":5468,"source":1233,"pc":[5366,5367]},{"teal":5469,"source":1233,"pc":[5368,5369]},{"teal":5470,"source":1233,"pc":[5370]},{"teal":5471,"source":1233,"pc":[5371]},{"teal":5472,"source":1233,"pc":[5372]},{"teal":5473,"source":1233,"pc":[5373]},{"teal":5474,"source":1233,"pc":[5374]},{"teal":5475,"source":1233,"pc":[5375]},{"teal":5476,"source":1233,"pc":[5376]},{"teal":5477,"source":1233,"pc":[5377,5378]},{"teal":5478,"source":1233,"pc":[5379]},{"teal":5479,"source":1233,"pc":[5380]},{"teal":5480,"source":1233,"pc":[5381]},{"teal":5481,"source":1233,"pc":[5382,5383]},{"teal":5482,"source":1233,"pc":[5384]},{"teal":5483,"source":1233,"pc":[5385]},{"teal":5484,"source":1233,"pc":[5386,5387]},{"teal":5485,"source":1233,"pc":[5388]},{"teal":5486,"source":1233,"pc":[5389]},{"teal":5487,"source":1233,"pc":[5390,5391]},{"teal":5488,"source":1233,"pc":[5392]},{"teal":5492,"source":1234,"pc":[5393]},{"teal":5499,"source":1230,"pc":[5394,5395]},{"teal":5500,"source":1230,"pc":[5396]},{"teal":5501,"source":1230,"pc":[5397]},{"teal":5502,"source":1230,"pc":[5398,5399]},{"teal":5503,"source":1230,"pc":[5400,5401,5402]},{"teal":5507,"source":1237,"errorMessage":"no available space in specified node for this pool","pc":[5403]},{"teal":5508,"source":1224,"pc":[5404]},{"teal":5518,"source":1247,"pc":[5405,5406,5407]},{"teal":5521,"source":1247,"pc":[5408]},{"teal":5522,"source":1247,"pc":[5409,5410]},{"teal":5526,"source":1248,"pc":[5411,5412]},{"teal":5527,"source":1248,"pc":[5413]},{"teal":5528,"source":1248,"pc":[5414]},{"teal":5529,"source":1248,"pc":[5415,5416]},{"teal":5530,"source":1248,"pc":[5417]},{"teal":5531,"source":1248,"pc":[5418]},{"teal":5532,"source":1248,"pc":[5419,5420]},{"teal":5533,"source":1248,"pc":[5421]},{"teal":5534,"source":1248,"pc":[5422]},{"teal":5535,"source":1248,"pc":[5423,5424]},{"teal":5540,"source":1249,"pc":[5425,5426]},{"teal":5541,"source":1249,"pc":[5427]},{"teal":5542,"source":1249,"pc":[5428]},{"teal":5543,"source":1249,"pc":[5429,5430,5431]},{"teal":5548,"source":1250,"pc":[5432]},{"teal":5553,"source":1252,"pc":[5433,5434]},{"teal":5554,"source":1252,"pc":[5435,5436]},{"teal":5558,"source":1253,"pc":[5437]},{"teal":5559,"source":1253,"pc":[5438,5439]},{"teal":5560,"source":1253,"pc":[5440]},{"teal":5561,"source":1253,"pc":[5441,5442]},{"teal":5562,"source":1253,"pc":[5443]},{"teal":5563,"source":1253,"pc":[5444]},{"teal":5564,"source":1253,"pc":[5445,5446]},{"teal":5565,"source":1253,"pc":[5447]},{"teal":5566,"source":1253,"pc":[5448,5449]},{"teal":5573,"source":1257,"pc":[5450,5451]},{"teal":5574,"source":1257,"pc":[5452]},{"teal":5575,"source":1257,"pc":[5453]},{"teal":5576,"source":1257,"pc":[5454]},{"teal":5577,"source":1257,"pc":[5455,5456,5457]},{"teal":5578,"source":1258,"pc":[5458,5459]},{"teal":5579,"source":1258,"pc":[5460,5461]},{"teal":5580,"source":1258,"pc":[5462]},{"teal":5581,"source":1257,"pc":[5463]},{"teal":5584,"source":1258,"pc":[5464]},{"teal":5585,"source":1258,"pc":[5465,5466,5467]},{"teal":5586,"source":1259,"pc":[5468,5469]},{"teal":5587,"source":1259,"pc":[5470,5471]},{"teal":5588,"source":1259,"pc":[5472]},{"teal":5589,"source":1258,"pc":[5473]},{"teal":5592,"source":1256,"pc":[5474,5475,5476]},{"teal":5597,"source":1261,"pc":[5477,5478]},{"teal":5598,"source":1261,"pc":[5479]},{"teal":5599,"source":1261,"pc":[5480]},{"teal":5600,"source":1261,"pc":[5481]},{"teal":5604,"source":1262,"pc":[5482,5483]},{"teal":5605,"source":1262,"pc":[5484]},{"teal":5606,"source":1262,"pc":[5485]},{"teal":5607,"source":1262,"pc":[5486,5487]},{"teal":5608,"source":1262,"pc":[5488]},{"teal":5609,"source":1262,"pc":[5489]},{"teal":5610,"source":1262,"pc":[5490,5491]},{"teal":5611,"source":1262,"pc":[5492]},{"teal":5612,"source":1262,"pc":[5493]},{"teal":5613,"source":1262,"pc":[5494,5495]},{"teal":5618,"source":1263,"pc":[5496,5497]},{"teal":5619,"source":1263,"pc":[5498]},{"teal":5620,"source":1263,"pc":[5499]},{"teal":5621,"source":1263,"pc":[5500,5501,5502]},{"teal":5626,"source":1264,"pc":[5503]},{"teal":5627,"source":1264,"pc":[5504,5505]},{"teal":5635,"source":1267,"pc":[5506,5507]},{"teal":5636,"source":1267,"pc":[5508,5509]},{"teal":5637,"source":1267,"pc":[5510,5511]},{"teal":5638,"source":1267,"pc":[5512]},{"teal":5639,"source":1267,"pc":[5513,5514]},{"teal":5640,"source":1267,"pc":[5515]},{"teal":5643,"source":1266,"errorMessage":"must have required minimum balance of validator defined token to add stake","pc":[5516]},{"teal":5649,"source":1271,"pc":[5517,5518]},{"teal":5650,"source":1271,"pc":[5519]},{"teal":5651,"source":1271,"pc":[5520]},{"teal":5652,"source":1271,"pc":[5521,5522,5523]},{"teal":5660,"source":1273,"pc":[5524,5525]},{"teal":5661,"source":1273,"pc":[5526,5527]},{"teal":5662,"source":1273,"pc":[5528]},{"teal":5663,"source":1273,"pc":[5529,5530]},{"teal":5664,"source":1273,"pc":[5531,5532,5533]},{"teal":5665,"source":1273,"pc":[5534]},{"teal":5668,"source":1272,"errorMessage":"specified asset must be created by creator that the validator defined as a requirement to stake","pc":[5535]},{"teal":5674,"source":1277,"pc":[5536,5537]},{"teal":5675,"source":1277,"pc":[5538,5539]},{"teal":5676,"source":1277,"pc":[5540]},{"teal":5677,"source":1277,"pc":[5541,5542,5543]},{"teal":5682,"source":1278,"pc":[5544]},{"teal":5683,"source":1278,"pc":[5545,5546]},{"teal":5687,"source":1279,"pc":[5547,5548]},{"teal":5688,"source":1279,"pc":[5549,5550,5551]},{"teal":5689,"source":1279,"pc":[5552]},{"teal":5690,"source":1279,"pc":[5553,5554]},{"teal":5691,"source":1279,"pc":[5555,5556,5557]},{"teal":5692,"source":1279,"pc":[5558]},{"teal":5693,"source":1279,"pc":[5559,5560]},{"teal":5694,"source":1279,"pc":[5561]},{"teal":5695,"source":1279,"pc":[5562,5563]},{"teal":5701,"source":1280,"pc":[5564,5565]},{"teal":5702,"source":1280,"pc":[5566,5567]},{"teal":5703,"source":1280,"pc":[5568]},{"teal":5704,"source":1280,"pc":[5569,5570,5571]},{"teal":5709,"source":1281,"pc":[5572]},{"teal":5710,"source":1281,"pc":[5573,5574]},{"teal":5711,"source":1282,"pc":[5575,5576,5577]},{"teal":5717,"source":1279,"pc":[5578,5579]},{"teal":5718,"source":1279,"pc":[5580]},{"teal":5719,"source":1279,"pc":[5581]},{"teal":5720,"source":1279,"pc":[5582]},{"teal":5721,"source":1279,"pc":[5583,5584]},{"teal":5722,"source":1279,"pc":[5585]},{"teal":5723,"source":1279,"pc":[5586,5587,5588]},{"teal":5724,"source":1279,"pc":[5589,5590]},{"teal":5725,"source":1279,"pc":[5591,5592]},{"teal":5726,"source":1279,"pc":[5593,5594]},{"teal":5727,"source":1279,"pc":[5595]},{"teal":5728,"source":1279,"pc":[5596]},{"teal":5729,"source":1279,"pc":[5597]},{"teal":5730,"source":1279,"pc":[5598,5599]},{"teal":5731,"source":1279,"pc":[5600,5601,5602]},{"teal":5736,"source":1285,"pc":[5603,5604]},{"teal":5739,"source":1285,"errorMessage":"specified asset must be identical to the asset id defined as a requirement to stake","pc":[5605]},{"teal":5745,"source":1287,"pc":[5606,5607]},{"teal":5746,"source":1287,"pc":[5608,5609]},{"teal":5747,"source":1287,"pc":[5610]},{"teal":5748,"source":1287,"pc":[5611,5612,5613]},{"teal":5756,"source":1291,"pc":[5614,5615]},{"teal":5757,"source":1291,"pc":[5616,5617]},{"teal":5758,"source":1291,"pc":[5618]},{"teal":5759,"source":1291,"pc":[5619,5620]},{"teal":5760,"source":1291,"pc":[5621,5622,5623]},{"teal":5761,"source":1291,"pc":[5624]},{"teal":5762,"source":1291,"pc":[5625,5626,5627]},{"teal":5765,"source":1290,"errorMessage":"specified asset must be created by creator that is one of the linked addresses in an nfd","pc":[5628]},{"teal":5771,"source":1295,"pc":[5629,5630]},{"teal":5772,"source":1295,"pc":[5631,5632]},{"teal":5773,"source":1295,"pc":[5633]},{"teal":5774,"source":1295,"pc":[5634,5635,5636]},{"teal":5779,"source":1297,"pc":[5637,5638]},{"teal":5780,"source":1297,"pc":[5639,5640]},{"teal":5784,"source":1298,"pc":[5641,5642]},{"teal":5785,"source":1298,"pc":[5643,5644,5645]},{"teal":5788,"source":1298,"errorMessage":"provided NFD must be valid","pc":[5646]},{"teal":5796,"source":1302,"pc":[5647,5648]},{"teal":5797,"source":1302,"pc":[5649,5650]},{"teal":5798,"source":1302,"pc":[5651]},{"teal":5801,"source":1302,"errorMessage":"global state value does not exist: AppID.fromUint64(userOfferedNFDAppID).globalState('i.owner.a')","pc":[5652]},{"teal":5802,"source":1303,"pc":[5653,5654]},{"teal":5803,"source":1302,"pc":[5655]},{"teal":5804,"source":1303,"pc":[5656]},{"teal":5805,"source":1303,"pc":[5657,5658,5659]},{"teal":5806,"source":1303,"pc":[5660,5661]},{"teal":5807,"source":1303,"pc":[5662,5663]},{"teal":5808,"source":1303,"pc":[5664,5665,5666]},{"teal":5809,"source":1303,"pc":[5667]},{"teal":5813,"source":1301,"errorMessage":"provided nfd for entry isn't owned or linked to the staker","pc":[5668]},{"teal":5821,"source":1309,"pc":[5669,5670]},{"teal":5822,"source":1309,"pc":[5671,5672,5673,5674,5675,5676,5677,5678,5679,5680,5681,5682,5683,5684,5685]},{"teal":5823,"source":1309,"pc":[5686]},{"teal":5826,"source":1309,"errorMessage":"global state value does not exist: AppID.fromUint64(userOfferedNFDAppID).globalState('i.parentAppID')","pc":[5687]},{"teal":5827,"source":1309,"pc":[5688]},{"teal":5828,"source":1310,"pc":[5689,5690]},{"teal":5829,"source":1310,"pc":[5691,5692,5693]},{"teal":5830,"source":1310,"pc":[5694]},{"teal":5831,"source":1309,"pc":[5695]},{"teal":5834,"source":1308,"errorMessage":"specified nfd must be a segment of the nfd the validator specified as a requirement","pc":[5696]},{"teal":5837,"source":1247,"pc":[5697]},{"teal":5849,"source":1325,"pc":[5698,5699,5700]},{"teal":5852,"source":1325,"pc":[5701]},{"teal":5856,"source":1327,"pc":[5702,5703]},{"teal":5857,"source":1327,"pc":[5704,5705,5706,5707,5708,5709,5710,5711]},{"teal":5858,"source":1327,"pc":[5712]},{"teal":5861,"source":1327,"errorMessage":"global state value does not exist: AppID.fromUint64(nfdAppID).globalState('i.name')","pc":[5713]},{"teal":5862,"source":1327,"pc":[5714,5715]},{"teal":5870,"source":1329,"pc":[5716]},{"teal":5871,"source":1329,"pc":[5717,5718]},{"teal":5872,"source":1329,"pc":[5719,5720]},{"teal":5873,"source":1331,"pc":[5721,5722,5723,5724,5725,5726]},{"teal":5874,"source":1331,"pc":[5727,5728]},{"teal":5878,"source":1330,"pc":[5729,5730]},{"teal":5879,"source":1330,"pc":[5731,5732]},{"teal":5883,"source":1332,"pc":[5733,5734]},{"teal":5884,"source":1332,"pc":[5735]},{"teal":5885,"source":1332,"pc":[5736]},{"teal":5886,"source":1332,"pc":[5737]},{"teal":5887,"source":1332,"pc":[5738,5739,5740]},{"teal":5888,"source":1332,"pc":[5741]},{"teal":5889,"source":1332,"pc":[5742]},{"teal":5890,"source":1332,"pc":[5743,5744]},{"teal":5891,"source":1332,"pc":[5745,5746]},{"teal":5892,"source":1332,"pc":[5747]},{"teal":5893,"source":1332,"pc":[5748,5749]},{"teal":5896,"source":1329,"pc":[5750]},{"teal":5897,"source":1329,"pc":[5751,5752]},{"teal":5900,"source":1329,"pc":[5753]},{"teal":5901,"source":1329,"pc":[5754,5755]},{"teal":5902,"source":1329,"pc":[5756]},{"teal":5903,"source":1329,"pc":[5757]},{"teal":5904,"source":1329,"pc":[5758,5759]},{"teal":5905,"source":1329,"pc":[5760,5761,5762]},{"teal":5906,"source":1329,"pc":[5763]},{"teal":5907,"source":1329,"pc":[5764]},{"teal":5910,"source":1325,"pc":[5765,5766]},{"teal":5911,"source":1325,"pc":[5767]},{"teal":5922,"source":1344,"pc":[5768,5769,5770]},{"teal":5925,"source":1344,"pc":[5771]},{"teal":5926,"source":1344,"pc":[5772,5773]},{"teal":5933,"source":1345,"pc":[5774]},{"teal":5934,"source":1345,"pc":[5775,5776]},{"teal":5935,"source":1345,"pc":[5777,5778]},{"teal":5939,"source":1346,"pc":[5779,5780]},{"teal":5940,"source":1346,"pc":[5781,5782]},{"teal":5944,"source":1347,"pc":[5783,5784,5785,5786,5787,5788,5789,5790,5791,5792,5793,5794,5795,5796,5797]},{"teal":5945,"source":1347,"pc":[5798,5799]},{"teal":5946,"source":1347,"pc":[5800,5801,5802,5803,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814]},{"teal":5947,"source":1347,"pc":[5815,5816]},{"teal":5950,"source":1345,"pc":[5817]},{"teal":5951,"source":1345,"pc":[5818,5819]},{"teal":5954,"source":1345,"pc":[5820]},{"teal":5958,"source":1349,"pc":[5821,5822]},{"teal":5959,"source":1349,"pc":[5823,5824]},{"teal":5963,"source":1350,"pc":[5825]},{"teal":5964,"source":1350,"pc":[5826,5827]},{"teal":5969,"source":1350,"pc":[5828,5829]},{"teal":5970,"source":1350,"pc":[5830,5831]},{"teal":5971,"source":1350,"pc":[5832]},{"teal":5972,"source":1350,"pc":[5833]},{"teal":5973,"source":1350,"pc":[5834,5835,5836]},{"teal":5977,"source":1351,"pc":[5837,5838]},{"teal":5978,"source":1351,"pc":[5839,5840]},{"teal":5979,"source":1351,"pc":[5841,5842]},{"teal":5980,"source":1351,"pc":[5843]},{"teal":5981,"source":1351,"pc":[5844,5845]},{"teal":5986,"source":1352,"pc":[5846,5847]},{"teal":5987,"source":1352,"pc":[5848,5849]},{"teal":5988,"source":1352,"pc":[5850]},{"teal":5989,"source":1352,"pc":[5851]},{"teal":5990,"source":1352,"pc":[5852,5853,5854]},{"teal":5991,"source":1352,"pc":[5855,5856]},{"teal":5992,"source":1352,"pc":[5857,5858]},{"teal":5993,"source":1352,"pc":[5859]},{"teal":5994,"source":1352,"pc":[5860]},{"teal":5997,"source":1352,"pc":[5861,5862,5863]},{"teal":6002,"source":1353,"pc":[5864]},{"teal":6003,"source":1353,"pc":[5865,5866,5867]},{"teal":6010,"source":1350,"pc":[5868,5869]},{"teal":6011,"source":1350,"pc":[5870,5871]},{"teal":6012,"source":1350,"pc":[5872]},{"teal":6013,"source":1350,"pc":[5873,5874]},{"teal":6014,"source":1350,"pc":[5875,5876,5877]},{"teal":6019,"source":1356,"pc":[5878]},{"teal":6023,"source":1344,"pc":[5879,5880]},{"teal":6026,"source":1344,"pc":[5881,5882]},{"teal":6027,"source":1344,"pc":[5883]},{"teal":6035,"source":1364,"pc":[5884,5885,5886]},{"teal":6038,"source":1364,"pc":[5887]},{"teal":6042,"source":1365,"pc":[5888,5889,5890]},{"teal":6043,"source":1365,"pc":[5891,5892]},{"teal":6047,"source":1367,"pc":[5893,5894]},{"teal":6048,"source":1367,"pc":[5895,5896]},{"teal":6049,"source":1367,"pc":[5897]},{"teal":6050,"source":1367,"pc":[5898]},{"teal":6051,"source":1367,"pc":[5899,5900]},{"teal":6052,"source":1367,"pc":[5901]},{"teal":6053,"source":1367,"pc":[5902]},{"teal":6054,"source":1367,"pc":[5903]},{"teal":6055,"source":1367,"pc":[5904]},{"teal":6056,"source":1367,"pc":[5905]},{"teal":6059,"source":1367,"errorMessage":"wideRatio failed","pc":[5906]},{"teal":6062,"source":1364,"pc":[5907,5908]},{"teal":6063,"source":1364,"pc":[5909]},{"teal":6070,"source":1374,"pc":[5910,5911,5912]},{"teal":6073,"source":1374,"pc":[5913]},{"teal":6077,"source":1375,"pc":[5914,5915,5916]},{"teal":6078,"source":1375,"pc":[5917,5918]},{"teal":6082,"source":1377,"pc":[5919,5920]},{"teal":6083,"source":1377,"pc":[5921,5922,5923]},{"teal":6084,"source":1377,"pc":[5924]},{"teal":6085,"source":1377,"pc":[5925]},{"teal":6086,"source":1377,"pc":[5926,5927]},{"teal":6087,"source":1377,"pc":[5928]},{"teal":6088,"source":1377,"pc":[5929]},{"teal":6089,"source":1377,"pc":[5930]},{"teal":6090,"source":1377,"pc":[5931]},{"teal":6091,"source":1377,"pc":[5932]},{"teal":6094,"source":1377,"errorMessage":"wideRatio failed","pc":[5933]},{"teal":6097,"source":1374,"pc":[5934,5935]},{"teal":6098,"source":1374,"pc":[5936]},{"teal":6104,"source":1383,"pc":[5937,5938,5939]},{"teal":6108,"source":1384,"pc":[5940,5941]},{"teal":6109,"source":1383,"pc":[5942]},{"teal":6113,"source":1387,"pc":[5943,5944,5945]},{"teal":6117,"source":1388,"pc":[5946]},{"teal":6118,"source":1387,"pc":[5947]},{"teal":6122,"source":1391,"pc":[5948,5949,5950]},{"teal":6125,"source":1391,"pc":[5951]},{"teal":6129,"source":1400,"pc":[5952,5953]},{"teal":6130,"source":1400,"pc":[5954,5955]},{"teal":6134,"source":1401,"pc":[5956,5957]},{"teal":6135,"source":1401,"pc":[5958,5959]},{"teal":6136,"source":1401,"pc":[5960,5961]},{"teal":6137,"source":1401,"pc":[5962]},{"teal":6138,"source":1401,"pc":[5963]},{"teal":6139,"source":1401,"pc":[5964,5965]},{"teal":6143,"source":1402,"pc":[5966,5967]},{"teal":6144,"source":1402,"pc":[5968,5969]},{"teal":6145,"source":1402,"pc":[5970,5971]},{"teal":6146,"source":1402,"pc":[5972]},{"teal":6147,"source":1402,"pc":[5973]},{"teal":6148,"source":1402,"pc":[5974,5975]},{"teal":6152,"source":1403,"pc":[5976,5977]},{"teal":6153,"source":1403,"pc":[5978,5979]},{"teal":6154,"source":1403,"pc":[5980,5981]},{"teal":6155,"source":1403,"pc":[5982]},{"teal":6156,"source":1403,"pc":[5983]},{"teal":6157,"source":1403,"pc":[5984,5985]},{"teal":6161,"source":1404,"pc":[5986,5987]},{"teal":6162,"source":1404,"pc":[5988,5989]},{"teal":6163,"source":1404,"pc":[5990,5991]},{"teal":6164,"source":1404,"pc":[5992]},{"teal":6165,"source":1404,"pc":[5993]},{"teal":6166,"source":1404,"pc":[5994,5995]},{"teal":6170,"source":1405,"pc":[5996,5997]},{"teal":6171,"source":1405,"pc":[5998,5999]},{"teal":6172,"source":1405,"pc":[6000,6001]},{"teal":6173,"source":1405,"pc":[6002]},{"teal":6174,"source":1405,"pc":[6003]},{"teal":6175,"source":1405,"pc":[6004,6005]},{"teal":6179,"source":1406,"pc":[6006,6007]},{"teal":6180,"source":1406,"pc":[6008,6009]},{"teal":6181,"source":1406,"pc":[6010,6011]},{"teal":6182,"source":1406,"pc":[6012]},{"teal":6183,"source":1406,"pc":[6013]},{"teal":6184,"source":1406,"pc":[6014,6015]},{"teal":6188,"source":1407,"pc":[6016,6017]},{"teal":6189,"source":1407,"pc":[6018,6019]},{"teal":6190,"source":1407,"pc":[6020,6021]},{"teal":6191,"source":1407,"pc":[6022]},{"teal":6192,"source":1407,"pc":[6023]},{"teal":6193,"source":1407,"pc":[6024,6025]},{"teal":6197,"source":1408,"pc":[6026,6027]},{"teal":6200,"source":1391,"pc":[6028,6029]},{"teal":6201,"source":1391,"pc":[6030]},{"teal":6205,"source":1411,"pc":[6031,6032,6033]},{"teal":6209,"source":1415,"pc":[6034,6035,6036]},{"teal":6210,"source":1415,"pc":[6037,6038]},{"teal":6211,"source":1415,"pc":[6039,6040,6041]},{"teal":6212,"source":1415,"pc":[6042]},{"teal":6213,"source":1415,"pc":[6043]},{"teal":6214,"source":1411,"pc":[6044]},{"teal":6217,"source":50,"pc":[6045,6046,6047,6048,6049,6050]},{"teal":6218,"source":50,"pc":[6051,6052,6053]},{"teal":6219,"source":50,"pc":[6054,6055,6056,6057]},{"teal":6222,"source":50,"errorMessage":"this contract does not implement the given ABI method for create NoOp","pc":[6058]},{"teal":6225,"source":50,"pc":[6059,6060,6061,6062,6063,6064]},{"teal":6226,"source":50,"pc":[6065,6066,6067,6068,6069,6070]},{"teal":6227,"source":50,"pc":[6071,6072,6073,6074,6075,6076]},{"teal":6228,"source":50,"pc":[6077,6078,6079,6080,6081,6082]},{"teal":6229,"source":50,"pc":[6083,6084,6085,6086,6087,6088]},{"teal":6230,"source":50,"pc":[6089,6090,6091,6092,6093,6094]},{"teal":6231,"source":50,"pc":[6095,6096,6097,6098,6099,6100]},{"teal":6232,"source":50,"pc":[6101,6102,6103,6104,6105,6106]},{"teal":6233,"source":50,"pc":[6107,6108,6109,6110,6111,6112]},{"teal":6234,"source":50,"pc":[6113,6114,6115,6116,6117,6118]},{"teal":6235,"source":50,"pc":[6119,6120,6121,6122,6123,6124]},{"teal":6236,"source":50,"pc":[6125,6126,6127,6128,6129,6130]},{"teal":6237,"source":50,"pc":[6131,6132,6133,6134,6135,6136]},{"teal":6238,"source":50,"pc":[6137,6138,6139,6140,6141,6142]},{"teal":6239,"source":50,"pc":[6143,6144,6145,6146,6147,6148]},{"teal":6240,"source":50,"pc":[6149,6150,6151,6152,6153,6154]},{"teal":6241,"source":50,"pc":[6155,6156,6157,6158,6159,6160]},{"teal":6242,"source":50,"pc":[6161,6162,6163,6164,6165,6166]},{"teal":6243,"source":50,"pc":[6167,6168,6169,6170,6171,6172]},{"teal":6244,"source":50,"pc":[6173,6174,6175,6176,6177,6178]},{"teal":6245,"source":50,"pc":[6179,6180,6181,6182,6183,6184]},{"teal":6246,"source":50,"pc":[6185,6186,6187,6188,6189,6190]},{"teal":6247,"source":50,"pc":[6191,6192,6193,6194,6195,6196]},{"teal":6248,"source":50,"pc":[6197,6198,6199,6200,6201,6202]},{"teal":6249,"source":50,"pc":[6203,6204,6205,6206,6207,6208]},{"teal":6250,"source":50,"pc":[6209,6210,6211,6212,6213,6214]},{"teal":6251,"source":50,"pc":[6215,6216,6217,6218,6219,6220]},{"teal":6252,"source":50,"pc":[6221,6222,6223,6224,6225,6226]},{"teal":6253,"source":50,"pc":[6227,6228,6229,6230,6231,6232]},{"teal":6254,"source":50,"pc":[6233,6234,6235,6236,6237,6238]},{"teal":6255,"source":50,"pc":[6239,6240,6241,6242,6243,6244]},{"teal":6256,"source":50,"pc":[6245,6246,6247,6248,6249,6250]},{"teal":6257,"source":50,"pc":[6251,6252,6253,6254,6255,6256]},{"teal":6258,"source":50,"pc":[6257,6258,6259]},{"teal":6259,"source":50,"pc":[6260,6261,6262,6263,6264,6265,6266,6267,6268,6269,6270,6271,6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287,6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305,6306,6307,6308,6309,6310,6311,6312,6313,6314,6315,6316,6317,6318,6319,6320,6321,6322,6323,6324,6325,6326,6327]},{"teal":6262,"source":50,"errorMessage":"this contract does not implement the given ABI method for call NoOp","pc":[6328]}],"clear":[]},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDExCgovLyBUaGlzIFRFQUwgd2FzIGdlbmVyYXRlZCBieSBURUFMU2NyaXB0IHYwLjEwMy4wCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbGdvcmFuZGZvdW5kYXRpb24vVEVBTFNjcmlwdAoKLy8gVGhpcyBjb250cmFjdCBpcyBjb21wbGlhbnQgd2l0aCBhbmQvb3IgaW1wbGVtZW50cyB0aGUgZm9sbG93aW5nIEFSQ3M6IFsgQVJDNCBdCgovLyBUaGUgZm9sbG93aW5nIGxpbmVzIG9mIFRFQUwgYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0ZW1wbGF0ZSB2YXJpYWJsZXMgaW4gc2NyYXRjaCBzbG90cwpwdXNoYnl0ZXMgVE1QTF9uZmRSZWdpc3RyeUFwcElkCmJ0b2kKc3RvcmUgMjAwCgovLyBUaGUgZm9sbG93aW5nIHRlbiBsaW5lcyBvZiBURUFMIGhhbmRsZSBpbml0aWFsIHByb2dyYW0gZmxvdwovLyBUaGlzIHBhdHRlcm4gaXMgdXNlZCB0byBtYWtlIGl0IGVhc3kgZm9yIGFueW9uZSB0byBwYXJzZSB0aGUgc3RhcnQgb2YgdGhlIHByb2dyYW0gYW5kIGRldGVybWluZSBpZiBhIHNwZWNpZmljIGFjdGlvbiBpcyBhbGxvd2VkCi8vIEhlcmUsIGFjdGlvbiByZWZlcnMgdG8gdGhlIE9uQ29tcGxldGUgaW4gY29tYmluYXRpb24gd2l0aCB3aGV0aGVyIHRoZSBhcHAgaXMgYmVpbmcgY3JlYXRlZCBvciBjYWxsZWQKLy8gRXZlcnkgcG9zc2libGUgYWN0aW9uIGZvciB0aGlzIGNvbnRyYWN0IGlzIHJlcHJlc2VudGVkIGluIHRoZSBzd2l0Y2ggc3RhdGVtZW50Ci8vIElmIHRoZSBhY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIGluIHRoZSBjb250cmFjdCwgaXRzIHJlc3BlY3RpdmUgYnJhbmNoIHdpbGwgYmUgIipOT1RfSU1QTEVNRU5URUQiIHdoaWNoIGp1c3QgY29udGFpbnMgImVyciIKdHhuIEFwcGxpY2F0aW9uSUQKIQppbnQgNgoqCnR4biBPbkNvbXBsZXRpb24KKwpzd2l0Y2ggKmNhbGxfTm9PcCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKmNyZWF0ZV9Ob09wICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRCAqTk9UX0lNUExFTUVOVEVEICpOT1RfSU1QTEVNRU5URUQgKk5PVF9JTVBMRU1FTlRFRAoKKk5PVF9JTVBMRU1FTlRFRDoKCS8vIFRoZSByZXF1ZXN0ZWQgYWN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIGNvbnRyYWN0LiBBcmUgeW91IHVzaW5nIHRoZSBjb3JyZWN0IE9uQ29tcGxldGU/IERpZCB5b3Ugc2V0IHlvdXIgYXBwIElEPwoJZXJyCgovLyBjcmVhdGVBcHBsaWNhdGlvbigpdm9pZAoqYWJpX3JvdXRlX2NyZWF0ZUFwcGxpY2F0aW9uOgoJLy8gZXhlY3V0ZSBjcmVhdGVBcHBsaWNhdGlvbigpdm9pZAoJY2FsbHN1YiBjcmVhdGVBcHBsaWNhdGlvbgoJaW50IDEKCXJldHVybgoKLy8gY3JlYXRlQXBwbGljYXRpb24oKTogdm9pZApjcmVhdGVBcHBsaWNhdGlvbjoKCXByb3RvIDAgMAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyCgkvLyB0aGlzLnN0YWtpbmdQb29sSW5pdGlhbGl6ZWQudmFsdWUgPSBmYWxzZQoJYnl0ZSAweDY5NmU2OTc0IC8vICJpbml0IgoJaW50IDAKCWJ5dGUgMHgwMAoJaW50IDAKCXVuY292ZXIgMgoJc2V0Yml0CglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgzCgkvLyB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgPSAwCglieXRlIDB4NmU3NTZkNTYgLy8gIm51bVYiCglpbnQgMAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NAoJLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlID0gMAoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJaW50IDAKCWFwcF9nbG9iYWxfcHV0CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODUKCS8vIHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlID0gMAoJYnl0ZSAweDczNzQ2MTZiNjU2NCAvLyAic3Rha2VkIgoJaW50IDAKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIGluaXRTdGFraW5nQ29udHJhY3QodWludDY0KXZvaWQKKmFiaV9yb3V0ZV9pbml0U3Rha2luZ0NvbnRyYWN0OgoJLy8gYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBpbml0U3Rha2luZ0NvbnRyYWN0KHVpbnQ2NCl2b2lkCgljYWxsc3ViIGluaXRTdGFraW5nQ29udHJhY3QKCWludCAxCglyZXR1cm4KCi8vIGluaXRTdGFraW5nQ29udHJhY3QoYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0KTogdm9pZAppbml0U3Rha2luZ0NvbnRyYWN0OgoJcHJvdG8gMSAwCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTAKCS8vIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uY3JlYXRlKGFwcHJvdmFsUHJvZ3JhbVNpemUpCglieXRlIDB4NzA2ZjZmNmM1NDY1NmQ3MDZjNjE3NDY1NDE3MDcwNzI2Zjc2NjE2YzQyNzk3NDY1NzMgLy8gInBvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMiCglmcmFtZV9kaWcgLTEgLy8gYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0Cglib3hfY3JlYXRlCglwb3AKCXJldHN1YgoKLy8gbG9hZFN0YWtpbmdDb250cmFjdERhdGEodWludDY0LGJ5dGVbXSl2b2lkCiphYmlfcm91dGVfbG9hZFN0YWtpbmdDb250cmFjdERhdGE6CgkvLyBkYXRhOiBieXRlW10KCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWV4dHJhY3QgMiAwCgoJLy8gb2Zmc2V0OiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGxvYWRTdGFraW5nQ29udHJhY3REYXRhKHVpbnQ2NCxieXRlW10pdm9pZAoJY2FsbHN1YiBsb2FkU3Rha2luZ0NvbnRyYWN0RGF0YQoJaW50IDEKCXJldHVybgoKLy8gbG9hZFN0YWtpbmdDb250cmFjdERhdGEob2Zmc2V0OiB1aW50NjQsIGRhdGE6IGJ5dGVzKTogdm9pZApsb2FkU3Rha2luZ0NvbnRyYWN0RGF0YToKCXByb3RvIDIgMAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk0CgkvLyBhc3NlcnQoIXRoaXMuc3Rha2luZ1Bvb2xJbml0aWFsaXplZC52YWx1ZSkKCWJ5dGUgMHg2OTZlNjk3NCAvLyAiaW5pdCIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMAoJZ2V0Yml0CgkhCglhc3NlcnQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5NQoJLy8gdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5yZXBsYWNlKG9mZnNldCwgZGF0YSkKCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWZyYW1lX2RpZyAtMSAvLyBvZmZzZXQ6IHVpbnQ2NAoJZnJhbWVfZGlnIC0yIC8vIGRhdGE6IGJ5dGVzCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdCgpdm9pZAoqYWJpX3JvdXRlX2ZpbmFsaXplU3Rha2luZ0NvbnRyYWN0OgoJLy8gZXhlY3V0ZSBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdCgpdm9pZAoJY2FsbHN1YiBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdAoJaW50IDEKCXJldHVybgoKLy8gZmluYWxpemVTdGFraW5nQ29udHJhY3QoKTogdm9pZApmaW5hbGl6ZVN0YWtpbmdDb250cmFjdDoKCXByb3RvIDAgMAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk5CgkvLyB0aGlzLnN0YWtpbmdQb29sSW5pdGlhbGl6ZWQudmFsdWUgPSB0cnVlCglieXRlIDB4Njk2ZTY5NzQgLy8gImluaXQiCglpbnQgMQoJYnl0ZSAweDAwCglpbnQgMAoJdW5jb3ZlciAyCglzZXRiaXQKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIGdhcygpdm9pZAoqYWJpX3JvdXRlX2dhczoKCS8vIGV4ZWN1dGUgZ2FzKCl2b2lkCgljYWxsc3ViIGdhcwoJaW50IDEKCXJldHVybgoKLy8gZ2FzKCk6IHZvaWQKLy8KLy8gZ2FzIGlzIGEgZHVtbXkgbm8tb3AgY2FsbCB0aGF0IGNhbiBiZSB1c2VkIHRvIHBvb2wtdXAgcmVzb3VyY2UgcmVmZXJlbmNlcyBhbmQgb3Bjb2RlIGNvc3QKZ2FzOgoJcHJvdG8gMCAwCglyZXRzdWIKCi8vIGdldE1ickFtb3VudHMoKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0TWJyQW1vdW50czoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXRNYnJBbW91bnRzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0TWJyQW1vdW50cygpOiBNYnJBbW91bnRzCi8vCi8vIFJldHVybnMgdGhlIE1CUiBhbW91bnRzIG5lZWRlZCBmb3IgdmFyaW91cyBhY3Rpb25zOgovLyBbCi8vIGFkZFZhbGlkYXRvck1icjogdWludDY0IC0gbWJyIG5lZWRlZCB0byBhZGQgYSBuZXcgdmFsaWRhdG9yIC0gcGFpZCB0byB2YWxpZGF0b3IgY29udHJhY3QKLy8gYWRkUG9vbE1icjogdWludDY0IC0gbWJyIG5lZWRlZCB0byBhZGQgYSBuZXcgcG9vbCAtIHBhaWQgdG8gdmFsaWRhdG9yCi8vIHBvb2xJbml0TWJyOiB1aW50NjQgLSBtYnIgbmVlZGVkIHRvIGluaXRTdG9yYWdlKCkgb2YgcG9vbCAtIHBhaWQgdG8gcG9vbCBpdHNlbGYKLy8gYWRkU3Rha2VyTWJyOiB1aW50NjQgLSBtYnIgc3Rha2VyIG5lZWRzIHRvIGFkZCB0byBmaXJzdCBzdGFraW5nIHBheW1lbnQgKHN0YXlzIHcvIHZhbGlkYXRvcikKLy8gXQpnZXRNYnJBbW91bnRzOgoJcHJvdG8gMCAxCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5CgkvLyByZXR1cm4gewoJLy8gICAgICAgICAgICAgYWRkVmFsaWRhdG9yTWJyOiB0aGlzLmNvc3RGb3JCb3hTdG9yYWdlKDEgLyogdiBwcmVmaXggKi8gKyBsZW48VmFsaWRhdG9ySWRUeXBlPigpICsgbGVuPFZhbGlkYXRvckluZm8+KCkpLAoJLy8gICAgICAgICAgICAgYWRkUG9vbE1icjogdGhpcy5taW5CYWxhbmNlRm9yQWNjb3VudCgKCS8vICAgICAgICAgICAgICAgICAxLAoJLy8gICAgICAgICAgICAgICAgIC8vIHdlIGNvdWxkIGNhbGN1bGF0ZSB0aGlzIGRpcmVjdGx5IGJ5IHJlZmVyZW5jaW5nIHRoZSBzaXplIG9mIHN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtIGJ1dCBpdCB3b3VsZAoJLy8gICAgICAgICAgICAgICAgIC8vIG1lYW4gb3VyIGNhbGxlcnMgd291bGQgaGF2ZSB0byByZWZlcmVuY2UgdGhlIGJveCBBTkQgYnV5IHVwIGkvbyAtIHNvIGp1c3QgZ28gbWF4IG9uIGV4dHJhIHBhZ2VzCgkvLyAgICAgICAgICAgICAgICAgMywKCS8vICAgICAgICAgICAgICAgICAwLAoJLy8gICAgICAgICAgICAgICAgIDAsCgkvLyAgICAgICAgICAgICAgICAgMCwKCS8vICAgICAgICAgICAgICAgICBTdGFraW5nUG9vbC5zY2hlbWEuZ2xvYmFsLm51bVVpbnQsCgkvLyAgICAgICAgICAgICAgICAgU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1CeXRlU2xpY2UsCgkvLyAgICAgICAgICAgICApLAoJLy8gICAgICAgICAgICAgcG9vbEluaXRNYnI6CgkvLyAgICAgICAgICAgICAgICAgQUxHT1JBTkRfQUNDT1VOVF9NSU5fQkFMQU5DRSArCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5jb3N0Rm9yQm94U3RvcmFnZSg3IC8qICdzdGFrZXJzJyBuYW1lICovICsgbGVuPFN0YWtlZEluZm8+KCkgKiBNQVhfU1RBS0VSU19QRVJfUE9PTCksCgkvLyAgICAgICAgICAgICBhZGRTdGFrZXJNYnI6CgkvLyAgICAgICAgICAgICAgICAgLy8gaG93IG11Y2ggdG8gY2hhcmdlIGZvciBmaXJzdCB0aW1lIGEgc3Rha2VyIGFkZHMgc3Rha2UgLSBzaW5jZSB3ZSBhZGQgYSB0cmFja2luZyBib3ggcGVyIHN0YWtlcgoJLy8gICAgICAgICAgICAgICAgIHRoaXMuY29zdEZvckJveFN0b3JhZ2UoCgkvLyAgICAgICAgICAgICAgICAgICAgIDMgLyogJ3NwcycgcHJlZml4ICovICsgbGVuPEFkZHJlc3M+KCkgKyBsZW48VmFsaWRhdG9yUG9vbEtleT4oKSAqIE1BWF9QT09MU19QRVJfU1RBS0VSLAoJLy8gICAgICAgICAgICAgICAgICksIC8vIHNpemUgb2Yga2V5ICsgYWxsIHZhbHVlcwoJLy8gICAgICAgICB9CglpbnQgMTEwMQoJY2FsbHN1YiBjb3N0Rm9yQm94U3RvcmFnZQoJaXRvYgoJaW50IDMKCWludCAxMQoJaW50IDAKCWR1cG4gMgoJaW50IDMKCWludCAxCgljYWxsc3ViIG1pbkJhbGFuY2VGb3JBY2NvdW50CglpdG9iCgljb25jYXQKCWludCAxMDAwMDAKCWludCAxMjgwNwoJY2FsbHN1YiBjb3N0Rm9yQm94U3RvcmFnZQoJKwoJaXRvYgoJY29uY2F0CglpbnQgMTc5CgljYWxsc3ViIGNvc3RGb3JCb3hTdG9yYWdlCglpdG9iCgljb25jYXQKCXJldHN1YgoKLy8gZ2V0UHJvdG9jb2xDb25zdHJhaW50cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0UHJvdG9jb2xDb25zdHJhaW50czoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXRQcm90b2NvbENvbnN0cmFpbnRzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWNhbGxzdWIgZ2V0UHJvdG9jb2xDb25zdHJhaW50cwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFByb3RvY29sQ29uc3RyYWludHMoKTogQ29uc3RyYWludHMKLy8KLy8gUmV0dXJucyB0aGUgcHJvdG9jb2wgY29uc3RyYWludHMgc28gdGhhdCBVSXMgY2FuIGxpbWl0IHdoYXQgdXNlcnMgc3BlY2lmeSBmb3IgdmFsaWRhdG9yIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KZ2V0UHJvdG9jb2xDb25zdHJhaW50czoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0NwoJLy8gcmV0dXJuIHsKCS8vICAgICAgICAgICAgIGVwb2NoUGF5b3V0Um91bmRzTWluOiBNSU5fRVBPQ0hfTEVOR1RILAoJLy8gICAgICAgICAgICAgZXBvY2hQYXlvdXRSb3VuZHNNYXg6IE1BWF9FUE9DSF9MRU5HVEgsCgkvLyAgICAgICAgICAgICBtaW5QY3RUb1ZhbGlkYXRvcldGb3VyRGVjaW1hbHM6IE1JTl9QQ1RfVE9fVkFMSURBVE9SLAoJLy8gICAgICAgICAgICAgbWF4UGN0VG9WYWxpZGF0b3JXRm91ckRlY2ltYWxzOiBNQVhfUENUX1RPX1ZBTElEQVRPUiwKCS8vICAgICAgICAgICAgIG1pbkVudHJ5U3Rha2U6IE1JTl9BTEdPX1NUQUtFX1BFUl9QT09MLAoJLy8gICAgICAgICAgICAgbWF4QWxnb1BlclBvb2w6IHRoaXMubWF4QWxnb0FsbG93ZWRQZXJQb29sKCksCgkvLyAgICAgICAgICAgICBtYXhBbGdvUGVyVmFsaWRhdG9yOiB0aGlzLm1heEFsbG93ZWRTdGFrZSgpLAoJLy8gICAgICAgICAgICAgYW10Q29uc2lkZXJlZFNhdHVyYXRlZDogdGhpcy5hbGdvU2F0dXJhdGlvbkxldmVsKCksCgkvLyAgICAgICAgICAgICBtYXhOb2RlczogTUFYX05PREVTLAoJLy8gICAgICAgICAgICAgbWF4UG9vbHNQZXJOb2RlOiBNQVhfUE9PTFNfUEVSX05PREUsCgkvLyAgICAgICAgICAgICBtYXhTdGFrZXJzUGVyUG9vbDogTUFYX1NUQUtFUlNfUEVSX1BPT0wsCgkvLyAgICAgICAgIH0KCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDBmNDI0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGY0MjQwMDAwMDAwMDAwMDBmNDI0MAoJY2FsbHN1YiBtYXhBbGdvQWxsb3dlZFBlclBvb2wKCWl0b2IKCWNvbmNhdAoJY2FsbHN1YiBtYXhBbGxvd2VkU3Rha2UKCWl0b2IKCWNvbmNhdAoJY2FsbHN1YiBhbGdvU2F0dXJhdGlvbkxldmVsCglpdG9iCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDA4Cgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAzCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMGM4Cgljb25jYXQKCXJldHN1YgoKLy8gZ2V0TnVtVmFsaWRhdG9ycygpdWludDY0CiphYmlfcm91dGVfZ2V0TnVtVmFsaWRhdG9yczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gZXhlY3V0ZSBnZXROdW1WYWxpZGF0b3JzKCl1aW50NjQKCWNhbGxzdWIgZ2V0TnVtVmFsaWRhdG9ycwoJaXRvYgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldE51bVZhbGlkYXRvcnMoKTogdWludDY0Ci8vCi8vIFJldHVybnMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHZhbGlkYXRvcnMKZ2V0TnVtVmFsaWRhdG9yczoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE2NwoJLy8gcmV0dXJuIHRoaXMubnVtVmFsaWRhdG9ycy52YWx1ZQoJYnl0ZSAweDZlNzU2ZDU2IC8vICJudW1WIgoJYXBwX2dsb2JhbF9nZXQKCXJldHN1YgoKLy8gZ2V0VmFsaWRhdG9yQ29uZmlnKHVpbnQ2NCkodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKKmFiaV9yb3V0ZV9nZXRWYWxpZGF0b3JDb25maWc6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFZhbGlkYXRvckNvbmZpZyh1aW50NjQpKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCgljYWxsc3ViIGdldFZhbGlkYXRvckNvbmZpZwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvckNvbmZpZyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogVmFsaWRhdG9yQ29uZmlnCmdldFZhbGlkYXRvckNvbmZpZzoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE3MgoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnCglpbnQgMAoJaW50IDI0MgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCXJldHN1YgoKLy8gZ2V0VmFsaWRhdG9yU3RhdGUodWludDY0KSh1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQpCiphYmlfcm91dGVfZ2V0VmFsaWRhdG9yU3RhdGU6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFZhbGlkYXRvclN0YXRlKHVpbnQ2NCkodWludDE2LHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBnZXRWYWxpZGF0b3JTdGF0ZQoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvclN0YXRlKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBWYWxpZGF0b3JDdXJTdGF0ZQpnZXRWYWxpZGF0b3JTdGF0ZToKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE3NwoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUKCWludCAyNDIgLy8gaGVhZE9mZnNldAoJaW50IDI2CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpCiphYmlfcm91dGVfZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpCgljYWxsc3ViIGdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcih2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogW0FkZHJlc3MsIEFkZHJlc3NdCmdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcjoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE4MgoJLy8gcmV0dXJuIFsKCS8vICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLAoJLy8gICAgICAgICAgICAgdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWFuYWdlciwKCS8vICAgICAgICAgXQoJaW50IDgKCWludCAzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWludCA0MAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJY29uY2F0CglyZXRzdWIKCi8vIGdldFBvb2xzKHVpbnQ2NCkodWludDY0LHVpbnQxNix1aW50NjQpW10KKmFiaV9yb3V0ZV9nZXRQb29sczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0UG9vbHModWludDY0KSh1aW50NjQsdWludDE2LHVpbnQ2NClbXQoJY2FsbHN1YiBnZXRQb29scwoJZHVwCglsZW4KCWludCAxOAoJLwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFBvb2xzKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBQb29sSW5mb1tdCi8vCi8vIFJldHVybiBsaXN0IG9mIGFsbCBwb29scyBmb3IgdGhpcyB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWxpZGF0b3JJZAovLyBAcmV0dXJuIHtQb29sSW5mb1tdfSAtIGFycmF5IG9mIHBvb2xzCi8vIE5vdCBjYWxsYWJsZSBmcm9tIG90aGVyIGNvbnRyYWN0cyBiZWNhdXNlID4xSyByZXR1cm4gYnV0IGNhbiBiZSBjYWxsZWQgdy8gc2ltdWxhdGUgd2hpY2ggYnVtcHMgbG9nIHJldHVybnMKZ2V0UG9vbHM6Cglwcm90byAxIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiAyCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk2CgkvLyByZXREYXRhOiBQb29sSW5mb1tdID0gW10KCWJ5dGUgMHgKCWZyYW1lX2J1cnkgMCAvLyByZXREYXRhOiBQb29sSW5mb1tdCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk3CgkvLyBwb29sU2V0ID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29scykKCWludCAyNjggLy8gaGVhZE9mZnNldAoJaW50IDQzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWZyYW1lX2J1cnkgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE5OAoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBwb29sU2V0Lmxlbmd0aDsgaSArPSAxKQoJaW50IDAKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCipmb3JfMDoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE5OAoJLy8gaSA8IHBvb2xTZXQubGVuZ3RoCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCAyNAoJPAoJYnogKmZvcl8wX2VuZAoKCS8vICppZjBfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxOTkKCS8vIHBvb2xTZXRbaV0ucG9vbEFwcElkID09PSAwCglmcmFtZV9kaWcgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWYwX2VuZAoKCS8vICppZjBfY29uc2VxdWVudAoJYiAqZm9yXzBfZW5kCgoqaWYwX2VuZDoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIwMwoJLy8gcmV0RGF0YS5wdXNoKHBvb2xTZXRbaV0pCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBQb29sSW5mb1tdCglmcmFtZV9kaWcgMSAvLyBwb29sU2V0OiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDE4CglleHRyYWN0MwoJY29uY2F0CglmcmFtZV9idXJ5IDAgLy8gcmV0RGF0YTogUG9vbEluZm9bXQoKKmZvcl8wX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTk4CgkvLyBpICs9IDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCWIgKmZvcl8wCgoqZm9yXzBfZW5kOgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjA1CgkvLyByZXR1cm4gcmV0RGF0YQoJZnJhbWVfZGlnIDAgLy8gcmV0RGF0YTogUG9vbEluZm9bXQoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDIKCXJldHN1YgoKLy8gZ2V0UG9vbEFwcElkKHVpbnQ2NCx1aW50NjQpdWludDY0CiphYmlfcm91dGVfZ2V0UG9vbEFwcElkOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBwb29sSWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJYnRvaQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldFBvb2xBcHBJZCh1aW50NjQsdWludDY0KXVpbnQ2NAoJY2FsbHN1YiBnZXRQb29sQXBwSWQKCWl0b2IKCWNvbmNhdAoJbG9nCglpbnQgMQoJcmV0dXJuCgovLyBnZXRQb29sQXBwSWQodmFsaWRhdG9ySWQ6IHVpbnQ2NCwgcG9vbElkOiB1aW50NjQpOiB1aW50NjQKLy8KLy8gZ2V0UG9vbEFwcElkIGlzIHVzZWZ1bCBmb3IgY2FsbGVycyB0byBkZXRlcm1pbmUgYXBwIHRvIGNhbGwgZm9yIHJlbW92aW5nIHN0YWtlIGlmIHRoZXkgZG9uJ3QgaGF2ZSBzdGFraW5nIG9yCi8vIHdhbnQgdG8gZ2V0IHN0YWtlciBsaXN0IGZvciBhbiBhY2NvdW50LiAgVGhlIHN0YWtpbmcgcG9vbCBhbHNvIHVzZXMgaXQgdG8gZ2V0IHRoZSBhcHAgaWQgb2Ygc3Rha2luZyBwb29sIDEKLy8gKHdoaWNoIGNvbnRhaW5zIHJld2FyZCB0b2tlbnMgaWYgYmVpbmcgdXNlZCkgc28gdGhhdCB0aGUgYW1vdW50IGF2YWlsYWJsZSBjYW4gYmUgZGV0ZXJtaW5lZC4KZ2V0UG9vbEFwcElkOgoJcHJvdG8gMiAxCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjE1CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBwb29sSWQgIT09IDAgJiYgcG9vbElkIDw9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHMubGVuZ3RoLAoJLy8gICAgICAgICAgICAgJ3Bvb2wgaWQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIG51bWJlciBvZiBwb29scyBmb3IgdGhpcyB2YWxpZGF0b3InLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTIgLy8gcG9vbElkOiB1aW50NjQKCWludCAwCgkhPQoJZHVwCglieiAqc2tpcF9hbmQwCglmcmFtZV9kaWcgLTIgLy8gcG9vbElkOiB1aW50NjQKCWludCAyNAoJPD0KCSYmCgoqc2tpcF9hbmQwOgoJLy8gcG9vbCBpZCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgbnVtYmVyIG9mIHBvb2xzIGZvciB0aGlzIHZhbGlkYXRvcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjE5CgkvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1twb29sSWQgLSAxXS5wb29sQXBwSWQKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0yIC8vIHBvb2xJZDogdWludDY0CglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCXJldHN1YgoKLy8gZ2V0UG9vbEluZm8oKHVpbnQ2NCx1aW50NjQsdWludDY0KSkodWludDY0LHVpbnQxNix1aW50NjQpCiphYmlfcm91dGVfZ2V0UG9vbEluZm86CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHBvb2xLZXk6ICh1aW50NjQsdWludDY0LHVpbnQ2NCkKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWR1cAoJbGVuCglpbnQgMjQKCT09CgoJLy8gYXJndW1lbnQgMCAocG9vbEtleSkgZm9yIGdldFBvb2xJbmZvIG11c3QgYmUgYSAodWludDY0LHVpbnQ2NCx1aW50NjQpCglhc3NlcnQKCgkvLyBleGVjdXRlIGdldFBvb2xJbmZvKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpKHVpbnQ2NCx1aW50MTYsdWludDY0KQoJY2FsbHN1YiBnZXRQb29sSW5mbwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldFBvb2xJbmZvKHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkpOiBQb29sSW5mbwpnZXRQb29sSW5mbzoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIyNAoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRDdXJNYXhTdGFrZVBlclBvb2wodWludDY0KXVpbnQ2NAoqYWJpX3JvdXRlX2dldEN1ck1heFN0YWtlUGVyUG9vbDoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHVpbnQ2NCl1aW50NjQKCWNhbGxzdWIgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sCglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiB1aW50NjQKLy8KLy8gQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIHN0YWtlIHBlciBwb29sIGZvciBhIGdpdmVuIHZhbGlkYXRvci4KLy8gTm9ybWFsbHkgdGhpcyB3b3VsZCBiZSBtYXhBbGdvUGVyUG9vbCwgYnV0IGl0IHNob3VsZCBhbHNvIG5ldmVyIGdvIGFib3ZlIE1heEFsbG93ZWRTdGFrZSAvIG51bVBvb2xzIHNvCi8vIGFzIHBvb2xzIGFyZSBhZGRlZCB0aGUgbWF4IGFsbG93ZWQgcGVyIHBvb2wgY2FuIHJlZHVjZS4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCmdldEN1ck1heFN0YWtlUGVyUG9vbDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzYKCS8vIG51bVBvb2xzID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyBhcyB1aW50NjQKCWludCAyNDIKCWludCAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIG51bVBvb2xzOiB1aW50NjQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzcKCS8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzID0gdGhpcy5tYXhBbGxvd2VkU3Rha2UoKSAvIG51bVBvb2xzCgljYWxsc3ViIG1heEFsbG93ZWRTdGFrZQoJZnJhbWVfZGlnIDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoJLwoJZnJhbWVfYnVyeSAxIC8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzOiB1aW50NjQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzgKCS8vIG1heFBlclBvb2w6IHVpbnQ2NCA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1heEFsZ29QZXJQb29sCglpbnQgMjE3CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCgkvLyAqaWYxX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjM5CgkvLyBtYXhQZXJQb29sID09PSAwCglmcmFtZV9kaWcgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCWludCAwCgk9PQoJYnogKmlmMV9lbmQKCgkvLyAqaWYxX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI0MAoJLy8gbWF4UGVyUG9vbCA9IHRoaXMubWF4QWxnb0FsbG93ZWRQZXJQb29sKCkKCWNhbGxzdWIgbWF4QWxnb0FsbG93ZWRQZXJQb29sCglmcmFtZV9idXJ5IDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoqaWYxX2VuZDoKCS8vICppZjJfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNDIKCS8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzIDwgbWF4UGVyUG9vbAoJZnJhbWVfZGlnIDEgLy8gaGFyZE1heERpdmlkZWRCZXR3ZWVuUG9vbHM6IHVpbnQ2NAoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8CglieiAqaWYyX2VuZAoKCS8vICppZjJfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjQzCgkvLyBtYXhQZXJQb29sID0gaGFyZE1heERpdmlkZWRCZXR3ZWVuUG9vbHMKCWZyYW1lX2RpZyAxIC8vIGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzOiB1aW50NjQKCWZyYW1lX2J1cnkgMiAvLyBtYXhQZXJQb29sOiB1aW50NjQKCippZjJfZW5kOgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjQ1CgkvLyByZXR1cm4gbWF4UGVyUG9vbAoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCgoJLy8gcG9wIGFsbCBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUgc3RhY2sKCXBvcG4gMgoJcmV0c3ViCgovLyBkb2VzU3Rha2VyTmVlZFRvUGF5TUJSKGFkZHJlc3MpYm9vbAoqYWJpX3JvdXRlX2RvZXNTdGFrZXJOZWVkVG9QYXlNQlI6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHN0YWtlcjogYWRkcmVzcwoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZHVwCglsZW4KCWludCAzMgoJPT0KCgkvLyBhcmd1bWVudCAwIChzdGFrZXIpIGZvciBkb2VzU3Rha2VyTmVlZFRvUGF5TUJSIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBleGVjdXRlIGRvZXNTdGFrZXJOZWVkVG9QYXlNQlIoYWRkcmVzcylib29sCgljYWxsc3ViIGRvZXNTdGFrZXJOZWVkVG9QYXlNQlIKCWJ5dGUgMHgwMAoJaW50IDAKCXVuY292ZXIgMgoJc2V0Yml0Cgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZG9lc1N0YWtlck5lZWRUb1BheU1CUihzdGFrZXI6IEFkZHJlc3MpOiBib29sZWFuCi8vCi8vIEhlbHBlciBjYWxsZXJzIGNhbiBjYWxsIHcvIHNpbXVsYXRlIHRvIGRldGVybWluZSBpZiAnQWRkU3Rha2VyJyBNQlIgc2hvdWxkIGJlIGluY2x1ZGVkIHcvIHN0YWtpbmcgYW1vdW50Ci8vIEBwYXJhbSBzdGFrZXIKZG9lc1N0YWtlck5lZWRUb1BheU1CUjoKCXByb3RvIDEgMQoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI1NAoJLy8gcmV0dXJuICF0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS5leGlzdHMKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZXI6IEFkZHJlc3MKCWNvbmNhdAoJYm94X2xlbgoJc3dhcAoJcG9wCgkhCglyZXRzdWIKCi8vIGdldFN0YWtlZFBvb2xzRm9yQWNjb3VudChhZGRyZXNzKSh1aW50NjQsdWludDY0LHVpbnQ2NClbXQoqYWJpX3JvdXRlX2dldFN0YWtlZFBvb2xzRm9yQWNjb3VudDoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gc3Rha2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKHN0YWtlcikgZm9yIGdldFN0YWtlZFBvb2xzRm9yQWNjb3VudCBtdXN0IGJlIGEgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBnZXRTdGFrZWRQb29sc0ZvckFjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCx1aW50NjQpW10KCWNhbGxzdWIgZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50CglkdXAKCWxlbgoJaW50IDI0CgkvCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0Cgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50KHN0YWtlcjogQWRkcmVzcyk6IFZhbGlkYXRvclBvb2xLZXlbXQovLwovLyBSZXRyaWV2ZXMgdGhlIHN0YWtlZCBwb29scyBmb3IgYW4gYWNjb3VudC4KLy8KLy8gQHBhcmFtIHtBZGRyZXNzfSBzdGFrZXIgLSBUaGUgYWNjb3VudCB0byByZXRyaWV2ZSBzdGFrZWQgcG9vbHMgZm9yLgovLyBAcmV0dXJuIHtWYWxpZGF0b3JQb29sS2V5W119IC0gVGhlIGFycmF5IG9mIHN0YWtlZCBwb29scyBmb3IgdGhlIGFjY291bnQuCmdldFN0YWtlZFBvb2xzRm9yQWNjb3VudDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyAqaWYzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjY1CgkvLyAhdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikuZXhpc3RzCglieXRlIDB4NzM3MDczIC8vICJzcHMiCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoJIQoJYnogKmlmM19lbmQKCgkvLyAqaWYzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2NgoJLy8gcmV0dXJuIFtdCglieXRlIDB4CgliICpnZXRTdGFrZWRQb29sc0ZvckFjY291bnQqcmV0dXJuCgoqaWYzX2VuZDoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2OAoJLy8gcmV0RGF0YTogVmFsaWRhdG9yUG9vbEtleVtdID0gW10KCWJ5dGUgMHgKCWZyYW1lX2J1cnkgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjkKCS8vIHBvb2xTZXQgPSBjbG9uZSh0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZSkKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZXI6IEFkZHJlc3MKCWNvbmNhdAoJYm94X2dldAoKCS8vIGJveCB2YWx1ZSBkb2VzIG5vdCBleGlzdDogdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUKCWFzc2VydAoJZnJhbWVfYnVyeSAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzAKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgcG9vbFNldC5sZW5ndGg7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzE6CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzAKCS8vIGkgPCBwb29sU2V0Lmxlbmd0aAoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl8xX2VuZAoKCS8vICppZjRfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzEKCS8vIHBvb2xTZXRbaV0uaWQgIT09IDAKCWZyYW1lX2RpZyAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgkhPQoJYnogKmlmNF9lbmQKCgkvLyAqaWY0X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI3MgoJLy8gcmV0RGF0YS5wdXNoKHBvb2xTZXRbaV0pCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCWZyYW1lX2RpZyAxIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWNvbmNhdAoJZnJhbWVfYnVyeSAwIC8vIHJldERhdGE6IFZhbGlkYXRvclBvb2xLZXlbXQoKKmlmNF9lbmQ6CgoqZm9yXzFfY29udGludWU6CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzAKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzEKCipmb3JfMV9lbmQ6CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzUKCS8vIHJldHVybiByZXREYXRhCglmcmFtZV9kaWcgMCAvLyByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10KCipnZXRTdGFrZWRQb29sc0ZvckFjY291bnQqcmV0dXJuOgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCgoJLy8gcG9wIGFsbCBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUgc3RhY2sKCXBvcG4gMgoJcmV0c3ViCgovLyBnZXRUb2tlblBheW91dFJhdGlvKHVpbnQ2NCkodWludDY0WzI0XSx1aW50NjQpCiphYmlfcm91dGVfZ2V0VG9rZW5QYXlvdXRSYXRpbzoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZ2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KQoJY2FsbHN1YiBnZXRUb2tlblBheW91dFJhdGlvCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0VG9rZW5QYXlvdXRSYXRpbyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogUG9vbFRva2VuUGF5b3V0UmF0aW8KLy8KLy8gUmV0cmlldmVzIHRoZSB0b2tlbiBwYXlvdXQgcmF0aW8gZm9yIGEgZ2l2ZW4gdmFsaWRhdG9yIC0gcmV0dXJuaW5nIHRoZSBwb29sIHJhdGlvcyBvZiB3aG9sZSBzbyB0aGF0IHRva2VuCi8vIHBheW91dHMgYWNyb3NzIHBvb2xzIGNhbiBiZSBiYXNlZCBvbiBhIHN0YWJsZSBzbmFwaG9zdCBvZiBzdGFrZS4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEByZXR1cm4ge1Bvb2xUb2tlblBheW91dFJhdGlvfSAtIFRoZSB0b2tlbiBwYXlvdXQgcmF0aW8gZm9yIHRoZSB2YWxpZGF0b3IuCmdldFRva2VuUGF5b3V0UmF0aW86Cglwcm90byAxIDEKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyODcKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCXJldHN1YgoKLy8gZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cyh1aW50NjQpKCh1aW50NjRbM10pWzhdKQoqYWJpX3JvdXRlX2dldE5vZGVQb29sQXNzaWdubWVudHM6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGdldE5vZGVQb29sQXNzaWdubWVudHModWludDY0KSgodWludDY0WzNdKVs4XSkKCWNhbGxzdWIgZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGdldE5vZGVQb29sQXNzaWdubWVudHModmFsaWRhdG9ySWQ6IHVpbnQ2NCk6IE5vZGVQb29sQXNzaWdubWVudENvbmZpZwpnZXROb2RlUG9vbEFzc2lnbm1lbnRzOgoJcHJvdG8gMSAxCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjkyCgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS5leGlzdHMsICJ0aGUgc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBkb2Vzbid0IGV4aXN0IikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoKCS8vIHRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGRvZXNuJ3QgZXhpc3QKCWFzc2VydAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI5NAoJLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUubm9kZVBvb2xBc3NpZ25tZW50cwoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJcmV0c3ViCgovLyBnZXRORkRSZWdpc3RyeUlEKCl1aW50NjQKKmFiaV9yb3V0ZV9nZXRORkRSZWdpc3RyeUlEOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBleGVjdXRlIGdldE5GRFJlZ2lzdHJ5SUQoKXVpbnQ2NAoJY2FsbHN1YiBnZXRORkRSZWdpc3RyeUlECglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZ2V0TkZEUmVnaXN0cnlJRCgpOiB1aW50NjQKZ2V0TkZEUmVnaXN0cnlJRDoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI5OQoJLy8gcmV0dXJuIHRoaXMubmZkUmVnaXN0cnlBcHBJZAoJbG9hZCAyMDAgLy8gVE1QTF9uZmRSZWdpc3RyeUFwcElkCglyZXRzdWIKCi8vIGFkZFZhbGlkYXRvcihwYXksc3RyaW5nLCh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KSl1aW50NjQKKmFiaV9yb3V0ZV9hZGRWYWxpZGF0b3I6CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIGNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDI0MgoJPT0KCgkvLyBhcmd1bWVudCAwIChjb25maWcpIGZvciBhZGRWYWxpZGF0b3IgbXVzdCBiZSBhICh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KQoJYXNzZXJ0CgoJLy8gbmZkTmFtZTogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglleHRyYWN0IDIgMAoKCS8vIG1iclBheW1lbnQ6IHBheQoJdHhuIEdyb3VwSW5kZXgKCWludCAxCgktCglkdXAKCWd0eG5zIFR5cGVFbnVtCglpbnQgcGF5Cgk9PQoKCS8vIGFyZ3VtZW50IDIgKG1iclBheW1lbnQpIGZvciBhZGRWYWxpZGF0b3IgbXVzdCBiZSBhIHBheSB0cmFuc2FjdGlvbgoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBhZGRWYWxpZGF0b3IocGF5LHN0cmluZywodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkpdWludDY0CgljYWxsc3ViIGFkZFZhbGlkYXRvcgoJaXRvYgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFZhbGlkYXRvcihtYnJQYXltZW50OiBQYXlUeG4sIG5mZE5hbWU6IHN0cmluZywgY29uZmlnOiBWYWxpZGF0b3JDb25maWcpOiB1aW50NjQKLy8KLy8gQWRkcyBhIG5ldyB2YWxpZGF0b3IKLy8gUmVxdWlyZXMgYXQgbGVhc3QgMTAgQUxHTyBhcyB0aGUgJ2ZlZScgZm9yIHRoZSB0cmFuc2FjdGlvbiB0byBoZWxwIGRpc3N1YWRlIHNwYW1tZWQgdmFsaWRhdG9yIGFkZHMuCi8vCi8vIEBwYXJhbSB7UGF5VHhufSBtYnJQYXltZW50IHBheW1lbnQgZnJvbSBjYWxsZXIgd2hpY2ggY292ZXJzIG1iciBpbmNyZWFzZSBvZiBuZXcgdmFsaWRhdG9yIHN0b3JhZ2UKLy8gQHBhcmFtIHtzdHJpbmd9IG5mZE5hbWUgKE9wdGlvbmFsKSBOYW1lIG9mIG5mZCAodXNlZCBhcyBkb3VibGUtY2hlY2sgYWdhaW5zdCBpZCBzcGVjaWZpZWQgaW4gY29uZmlnKQovLyBAcGFyYW0ge1ZhbGlkYXRvckNvbmZpZ30gY29uZmlnIFZhbGlkYXRvckNvbmZpZyBzdHJ1Y3QKLy8gQHJldHVybnMge3VpbnQ2NH0gdmFsaWRhdG9yIGlkCmFkZFZhbGlkYXRvcjoKCXByb3RvIDMgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzExCgkvLyB0aGlzLnZhbGlkYXRlQ29uZmlnKGNvbmZpZykKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJY2FsbHN1YiB2YWxpZGF0ZUNvbmZpZwoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxMwoJLy8gdmVyaWZ5UGF5VHhuKG1iclBheW1lbnQsIHsgcmVjZWl2ZXI6IHRoaXMuYXBwLmFkZHJlc3MsIGFtb3VudDogdGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkVmFsaWRhdG9yTWJyIH0pCgkvLyB2ZXJpZnkgcmVjZWl2ZXIKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIFJlY2VpdmVyCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6InJlY2VpdmVyIiwiZXhwZWN0ZWQiOiJ0aGlzLmFwcC5hZGRyZXNzIn0KCWFzc2VydAoKCS8vIHZlcmlmeSBhbW91bnQKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCglleHRyYWN0IDAgOAoJYnRvaQoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6ImFtb3VudCIsImV4cGVjdGVkIjoidGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkVmFsaWRhdG9yTWJyIn0KCWFzc2VydAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxNQoJLy8gYXNzZXJ0KG1iclBheW1lbnQuZmVlID4gMTAgKiAxMDAwMDAwLCAnZmVlIG11c3QgYmUgMTAgQUxHTyBvciBtb3JlIHRvIHByZXZlbnQgc3BhbW1pbmcgb2YgdmFsaWRhdG9ycycpCglmcmFtZV9kaWcgLTEgLy8gbWJyUGF5bWVudDogUGF5VHhuCglndHhucyBGZWUKCWludCAxMDAwMDAwMAoJPgoKCS8vIGZlZSBtdXN0IGJlIDEwIEFMR08gb3IgbW9yZSB0byBwcmV2ZW50IHNwYW1taW5nIG9mIHZhbGlkYXRvcnMKCWFzc2VydAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxOAoJLy8gdmFsaWRhdG9ySWQgPSB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgKyAxCglieXRlIDB4NmU3NTZkNTYgLy8gIm51bVYiCglhcHBfZ2xvYmFsX2dldAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzE5CgkvLyB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgPSB2YWxpZGF0b3JJZAoJYnl0ZSAweDZlNzU2ZDU2IC8vICJudW1WIgoJZnJhbWVfZGlnIDAgLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMjEKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkuY3JlYXRlKCkKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJaW50IDEwOTIKCWJveF9jcmVhdGUKCXBvcAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMyMgoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcgPSBjb25maWcKCWludCAwCglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMjMKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLmlkID0gdmFsaWRhdG9ySWQKCWludCAwCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gKmlmNV9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMyNgoJLy8gY29uZmlnLm5mZEZvckluZm8gIT09IDAKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA3MiA4CglidG9pCglpbnQgMAoJIT0KCWJ6ICppZjVfZW5kCgoJLy8gKmlmNV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMjgKCS8vIGFzc2VydCh0aGlzLmlzTkZEQXBwSURWYWxpZChjb25maWcubmZkRm9ySW5mbyksICdwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZCcpCglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgNzIgOAoJYnRvaQoJY2FsbHN1YiBpc05GREFwcElEVmFsaWQKCgkvLyBwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzMwCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgdGhpcy50eG4uc2VuZGVyID09PSAoQXBwSUQuZnJvbVVpbnQ2NChjb25maWcubmZkRm9ySW5mbykuZ2xvYmFsU3RhdGUoJ2kub3duZXIuYScpIGFzIEFkZHJlc3MpLAoJLy8gICAgICAgICAgICAgICAgICdJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXInLAoJLy8gICAgICAgICAgICAgKQoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIC0zIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDcyIDgKCWJ0b2kKCWJ5dGUgMHg2OTJlNmY3NzZlNjU3MjJlNjEgLy8gImkub3duZXIuYSIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KGNvbmZpZy5uZmRGb3JJbmZvKS5nbG9iYWxTdGF0ZSgnaS5vd25lci5hJykKCWFzc2VydAoJPT0KCgkvLyBJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXIKCWFzc2VydAoKKmlmNV9lbmQ6CgkvLyAqaWY2X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzM2CgkvLyBjb25maWcuZW50cnlHYXRpbmdUeXBlID09PSBHQVRJTkdfVFlQRV9DUkVBVEVEX0JZX05GRF9BRERSRVNTRVMgfHwKCS8vICAgICAgICAgICAgIGNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX1NFR01FTlRfT0ZfTkZECglmcmFtZV9kaWcgLTMgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgODAgMQoJYnRvaQoJaW50IDMKCT09CglkdXAKCWJueiAqc2tpcF9vcjAKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4MCAxCglidG9pCglpbnQgNAoJPT0KCXx8Cgoqc2tpcF9vcjA6CglieiAqaWY2X2VuZAoKCS8vICppZjZfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzQwCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5pc05GREFwcElEVmFsaWQoY29uZmlnLmVudHJ5R2F0aW5nQXNzZXRzWzBdKSwKCS8vICAgICAgICAgICAgICAgICAncHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZEJywKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAxMTMgOAoJYnRvaQoJY2FsbHN1YiBpc05GREFwcElEVmFsaWQKCgkvLyBwcm92aWRlZCBORkQgQXBwIGlkIGZvciBnYXRpbmcgbXVzdCBiZSB2YWxpZCBORkQKCWFzc2VydAoKKmlmNl9lbmQ6CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNDUKCS8vIHRoaXMucmV0aU9QX2FkZGVkVmFsaWRhdG9yLmxvZyh7IGlkOiB2YWxpZGF0b3JJZCwgb3duZXI6IGNvbmZpZy5vd25lciwgbWFuYWdlcjogY29uZmlnLm1hbmFnZXIgfSkKCWJ5dGUgMHhhOGRkMjFjYiAvLyByZXRpT1BfYWRkZWRWYWxpZGF0b3IodWludDY0LGFkZHJlc3MsYWRkcmVzcykKCWZyYW1lX2RpZyAwIC8vIHZhbGlkYXRvcklkOiB1aW50NjQKCWl0b2IKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4IDMyCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA0MCAzMgoJY29uY2F0Cgljb25jYXQKCWxvZwoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM0NgoJLy8gcmV0dXJuIHZhbGlkYXRvcklkCglmcmFtZV9kaWcgMCAvLyB2YWxpZGF0b3JJZDogdWludDY0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvck1hbmFnZXIodWludDY0LGFkZHJlc3Mpdm9pZAoqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvck1hbmFnZXI6CgkvLyBtYW5hZ2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKG1hbmFnZXIpIGZvciBjaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyKHVpbnQ2NCxhZGRyZXNzKXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yTWFuYWdlcgoJaW50IDEKCXJldHVybgoKLy8gY2hhbmdlVmFsaWRhdG9yTWFuYWdlcih2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBtYW5hZ2VyOiBBZGRyZXNzKTogdm9pZAovLwovLyBDaGFuZ2VzIHRoZSBWYWxpZGF0b3IgbWFuYWdlciBmb3IgYSBzcGVjaWZpYyBWYWxpZGF0b3IgaWQuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gY2hhbmdlIHRoZSBtYW5hZ2VyIGZvci4KLy8gQHBhcmFtIHtBZGRyZXNzfSBtYW5hZ2VyIC0gVGhlIG5ldyBtYW5hZ2VyIGFkZHJlc3MuCmNoYW5nZVZhbGlkYXRvck1hbmFnZXI6Cglwcm90byAyIDAKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNTcKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM1OAoJLy8gYXNzZXJ0KG1hbmFnZXIgIT09IGdsb2JhbHMuemVyb0FkZHJlc3MsICduZWVkcyB0byBhdCBsZWFzdCBiZSB2YWxpZCBhZGRyZXNzJykKCWZyYW1lX2RpZyAtMiAvLyBtYW5hZ2VyOiBBZGRyZXNzCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CgoJLy8gbmVlZHMgdG8gYXQgbGVhc3QgYmUgdmFsaWQgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzU5CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5tYW5hZ2VyID0gbWFuYWdlcgoJaW50IDQwCglmcmFtZV9kaWcgLTIgLy8gbWFuYWdlcjogQWRkcmVzcwoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCXJldHN1YgoKLy8gY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyh1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkCiphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbzoKCS8vIHN1bnNldHRpbmdUbzogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglidG9pCgoJLy8gc3Vuc2V0dGluZ09uOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbwoJaW50IDEKCXJldHVybgoKLy8gY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBzdW5zZXR0aW5nT246IHVpbnQ2NCwgc3Vuc2V0dGluZ1RvOiBWYWxpZGF0b3JJZFR5cGUpOiB2b2lkCi8vCi8vIFVwZGF0ZXMgdGhlIHN1bnNldCBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiB2YWxpZGF0b3IuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gdXBkYXRlLgovLyBAcGFyYW0ge3VpbnQ2NH0gc3Vuc2V0dGluZ09uIC0gVGhlIG5ldyBzdW5zZXQgdGltZXN0YW1wLgovLyBAcGFyYW0ge3VpbnQ2NH0gc3Vuc2V0dGluZ1RvIC0gVGhlIG5ldyBzdW5zZXQgdG8gdmFsaWRhdG9yIGlkLgpjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvOgoJcHJvdG8gMyAwCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzcxCgkvLyB0aGlzLmNhbGxlck11c3RCZU93bmVyKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgY2FsbGVyTXVzdEJlT3duZXIKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNzIKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnN1bnNldHRpbmdPbiA9IHN1bnNldHRpbmdPbgoJaW50IDIyNgoJZnJhbWVfZGlnIC0yIC8vIHN1bnNldHRpbmdPbjogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM3MwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcuc3Vuc2V0dGluZ1RvID0gc3Vuc2V0dGluZ1RvCglpbnQgMjM0CglmcmFtZV9kaWcgLTMgLy8gc3Vuc2V0dGluZ1RvOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvck5GRCh1aW50NjQsdWludDY0LHN0cmluZyl2b2lkCiphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yTkZEOgoJLy8gbmZkTmFtZTogc3RyaW5nCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglleHRyYWN0IDIgMAoKCS8vIG5mZEFwcElEOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBjaGFuZ2VWYWxpZGF0b3JORkQodWludDY0LHVpbnQ2NCxzdHJpbmcpdm9pZAoJY2FsbHN1YiBjaGFuZ2VWYWxpZGF0b3JORkQKCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvck5GRCh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBuZmRBcHBJRDogdWludDY0LCBuZmROYW1lOiBzdHJpbmcpOiB2b2lkCi8vCi8vIENoYW5nZXMgdGhlIE5GRCBmb3IgYSB2YWxpZGF0b3IgaW4gdGhlIHZhbGlkYXRvckxpc3QgY29udHJhY3QuCi8vIFsgT05MWSBPV05FUiBDQU4gQ0hBTkdFIF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdG8gdXBkYXRlLgovLyBAcGFyYW0ge3VpbnQ2NH0gbmZkQXBwSUQgLSBUaGUgYXBwbGljYXRpb24gaWQgb2YgdGhlIE5GRCB0byBhc3NpZ24gdG8gdGhlIHZhbGlkYXRvci4KLy8gQHBhcmFtIHtzdHJpbmd9IG5mZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgTkZEICh3aGljaCBtdXN0IG1hdGNoKQpjaGFuZ2VWYWxpZGF0b3JORkQ6Cglwcm90byAzIDAKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozODUKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM4NwoJLy8gYXNzZXJ0KHRoaXMuaXNORkRBcHBJRFZhbGlkKG5mZEFwcElEKSwgJ3Byb3ZpZGVkIE5GRCBtdXN0IGJlIHZhbGlkJykKCWZyYW1lX2RpZyAtMiAvLyBuZmRBcHBJRDogdWludDY0CgljYWxsc3ViIGlzTkZEQXBwSURWYWxpZAoKCS8vIHByb3ZpZGVkIE5GRCBtdXN0IGJlIHZhbGlkCglhc3NlcnQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozODkKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHRoaXMudHhuLnNlbmRlciA9PT0gKEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzKSwKCS8vICAgICAgICAgICAgICdJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXInLAoJLy8gICAgICAgICApCgl0eG4gU2VuZGVyCglmcmFtZV9kaWcgLTIgLy8gbmZkQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKQoJYXNzZXJ0Cgk9PQoKCS8vIElmIHNwZWNpZnlpbmcgTkZELCBhY2NvdW50IGFkZGluZyB2YWxpZGF0b3IgbXVzdCBiZSBvd25lcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzkzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5uZmRGb3JJbmZvID0gbmZkQXBwSUQKCWludCA3MgoJZnJhbWVfZGlnIC0yIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHVpbnQ2NCxhZGRyZXNzKXZvaWQKKmFiaV9yb3V0ZV9jaGFuZ2VWYWxpZGF0b3JDb21taXNzaW9uQWRkcmVzczoKCS8vIGNvbW1pc3Npb25BZGRyZXNzOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDAgKGNvbW1pc3Npb25BZGRyZXNzKSBmb3IgY2hhbmdlVmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MgbXVzdCBiZSBhIGFkZHJlc3MKCWFzc2VydAoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHVpbnQ2NCxhZGRyZXNzKXZvaWQKCWNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MKCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIGNvbW1pc3Npb25BZGRyZXNzOiBBZGRyZXNzKTogdm9pZAovLwovLyBDaGFuZ2UgdGhlIGNvbW1pc3Npb24gYWRkcmVzcyB0aGF0IHZhbGlkYXRvciByZXdhcmRzIGFyZSBzZW50IHRvLgovLyBbIE9OTFkgT1dORVIgQ0FOIENIQU5HRSBdCmNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzOgoJcHJvdG8gMiAwCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDAxCgkvLyB0aGlzLmNhbGxlck11c3RCZU93bmVyKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgY2FsbGVyTXVzdEJlT3duZXIKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MDIKCS8vIGFzc2VydChjb21taXNzaW9uQWRkcmVzcyAhPT0gQWRkcmVzcy56ZXJvQWRkcmVzcykKCWZyYW1lX2RpZyAtMiAvLyBjb21taXNzaW9uQWRkcmVzczogQWRkcmVzcwoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDAzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy52YWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyA9IGNvbW1pc3Npb25BZGRyZXNzCglpbnQgMTc3CglmcmFtZV9kaWcgLTIgLy8gY29tbWlzc2lvbkFkZHJlc3M6IEFkZHJlc3MKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCglyZXRzdWIKCi8vIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8odWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQpdm9pZAoqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvclJld2FyZEluZm86CgkvLyBSZXdhcmRQZXJQYXlvdXQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgoJYnRvaQoKCS8vIEdhdGluZ0Fzc2V0TWluQmFsYW5jZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyA1CglidG9pCgoJLy8gRW50cnlHYXRpbmdBc3NldHM6IHVpbnQ2NFs0XQoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAoJZHVwCglsZW4KCWludCAzMgoJPT0KCgkvLyBhcmd1bWVudCAyIChFbnRyeUdhdGluZ0Fzc2V0cykgZm9yIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8gbXVzdCBiZSBhIHVpbnQ2NFs0XQoJYXNzZXJ0CgoJLy8gRW50cnlHYXRpbmdBZGRyZXNzOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDMgKEVudHJ5R2F0aW5nQWRkcmVzcykgZm9yIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8gbXVzdCBiZSBhIGFkZHJlc3MKCWFzc2VydAoKCS8vIEVudHJ5R2F0aW5nVHlwZTogdWludDgKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMQoJPT0KCgkvLyBhcmd1bWVudCA0IChFbnRyeUdhdGluZ1R5cGUpIGZvciBjaGFuZ2VWYWxpZGF0b3JSZXdhcmRJbmZvIG11c3QgYmUgYSB1aW50OAoJYXNzZXJ0CglidG9pCgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mbyh1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCl2b2lkCgljYWxsc3ViIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8KCWludCAxCglyZXR1cm4KCi8vIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8odmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgRW50cnlHYXRpbmdUeXBlOiB1aW50OCwgRW50cnlHYXRpbmdBZGRyZXNzOiBBZGRyZXNzLCBFbnRyeUdhdGluZ0Fzc2V0czogU3RhdGljQXJyYXk8dWludDY0LCA0PiwgR2F0aW5nQXNzZXRNaW5CYWxhbmNlOiB1aW50NjQsIFJld2FyZFBlclBheW91dDogdWludDY0KTogdm9pZAovLwovLyBBbGxvdyB0aGUgYWRkaXRpb25hbCByZXdhcmRzIChnYXRpbmcgZW50cnksIGFkZGl0aW9uYWwgdG9rZW4gcmV3YXJkcykgaW5mb3JtYXRpb24gYmUgY2hhbmdlZCBhdCB3aWxsLgovLyBbIE9OTFkgT1dORVIgQ0FOIENIQU5HRSBdCmNoYW5nZVZhbGlkYXRvclJld2FyZEluZm86Cglwcm90byA2IDAKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MTgKCS8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQyMAoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgRW50cnlHYXRpbmdUeXBlID49IEdBVElOR19UWVBFX05PTkUgJiYgRW50cnlHYXRpbmdUeXBlIDwgR0FUSU5HX1RZUEVfQ09OU1RfTUFYLAoJLy8gICAgICAgICAgICAgJ2ludmFsaWQgRW50cnkgZ2F0aW5nIHR5cGUnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDAKCT49CglkdXAKCWJ6ICpza2lwX2FuZDEKCWZyYW1lX2RpZyAtMiAvLyBFbnRyeUdhdGluZ1R5cGU6IHVpbnQ4CglpbnQgNAoJPAoJJiYKCipza2lwX2FuZDE6CgkvLyBpbnZhbGlkIEVudHJ5IGdhdGluZyB0eXBlCglhc3NlcnQKCgkvLyAqaWY3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDI0CgkvLyBFbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX0FTU0VUU19DUkVBVEVEX0JZCglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDEKCT09CglieiAqaWY3X2VuZAoKCS8vICppZjdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDI1CgkvLyBhc3NlcnQoRW50cnlHYXRpbmdBZGRyZXNzICE9PSBnbG9iYWxzLnplcm9BZGRyZXNzKQoJZnJhbWVfZGlnIC0zIC8vIEVudHJ5R2F0aW5nQWRkcmVzczogQWRkcmVzcwoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoqaWY3X2VuZDoKCS8vICppZjhfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MjgKCS8vIEVudHJ5R2F0aW5nVHlwZSA9PT0gR0FUSU5HX1RZUEVfQ1JFQVRFRF9CWV9ORkRfQUREUkVTU0VTIHx8CgkvLyAgICAgICAgICAgICBFbnRyeUdhdGluZ1R5cGUgPT09IEdBVElOR19UWVBFX1NFR01FTlRfT0ZfTkZECglmcmFtZV9kaWcgLTIgLy8gRW50cnlHYXRpbmdUeXBlOiB1aW50OAoJaW50IDMKCT09CglkdXAKCWJueiAqc2tpcF9vcjEKCWZyYW1lX2RpZyAtMiAvLyBFbnRyeUdhdGluZ1R5cGU6IHVpbnQ4CglpbnQgNAoJPT0KCXx8Cgoqc2tpcF9vcjE6CglieiAqaWY4X2VuZAoKCS8vICppZjhfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDMxCgkvLyBhc3NlcnQodGhpcy5pc05GREFwcElEVmFsaWQoRW50cnlHYXRpbmdBc3NldHNbMF0pLCAncHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZEJykKCWZyYW1lX2RpZyAtNCAvLyBFbnRyeUdhdGluZ0Fzc2V0czogU3RhdGljQXJyYXk8dWludDY0LCA0PgoJZXh0cmFjdCAwIDgKCWJ0b2kKCWNhbGxzdWIgaXNORkRBcHBJRFZhbGlkCgoJLy8gcHJvdmlkZWQgTkZEIEFwcCBpZCBmb3IgZ2F0aW5nIG11c3QgYmUgdmFsaWQgTkZECglhc3NlcnQKCippZjhfZW5kOgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDMzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPSBFbnRyeUdhdGluZ1R5cGUKCWludCA4MAoJZnJhbWVfZGlnIC0yIC8vIEVudHJ5R2F0aW5nVHlwZTogdWludDgKCWl0b2IKCWV4dHJhY3QgNyAxCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQzNAoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcuZW50cnlHYXRpbmdBZGRyZXNzID0gRW50cnlHYXRpbmdBZGRyZXNzCglpbnQgODEKCWZyYW1lX2RpZyAtMyAvLyBFbnRyeUdhdGluZ0FkZHJlc3M6IEFkZHJlc3MKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDM1CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0cyA9IEVudHJ5R2F0aW5nQXNzZXRzCglpbnQgMTEzCglmcmFtZV9kaWcgLTQgLy8gRW50cnlHYXRpbmdBc3NldHM6IFN0YXRpY0FycmF5PHVpbnQ2NCwgND4KCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDM2CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5nYXRpbmdBc3NldE1pbkJhbGFuY2UgPSBHYXRpbmdBc3NldE1pbkJhbGFuY2UKCWludCAxNDUKCWZyYW1lX2RpZyAtNSAvLyBHYXRpbmdBc3NldE1pbkJhbGFuY2U6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MzcKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnJld2FyZFBlclBheW91dCA9IFJld2FyZFBlclBheW91dAoJaW50IDE2MQoJZnJhbWVfZGlnIC02IC8vIFJld2FyZFBlclBheW91dDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyBhZGRQb29sKHBheSx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCkKKmFiaV9yb3V0ZV9hZGRQb29sOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyBub2RlTnVtOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gbWJyUGF5bWVudDogcGF5Cgl0eG4gR3JvdXBJbmRleAoJaW50IDEKCS0KCWR1cAoJZ3R4bnMgVHlwZUVudW0KCWludCBwYXkKCT09CgoJLy8gYXJndW1lbnQgMiAobWJyUGF5bWVudCkgZm9yIGFkZFBvb2wgbXVzdCBiZSBhIHBheSB0cmFuc2FjdGlvbgoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBhZGRQb29sKHBheSx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCkKCWNhbGxzdWIgYWRkUG9vbAoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFBvb2wobWJyUGF5bWVudDogUGF5VHhuLCB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBub2RlTnVtOiB1aW50NjQpOiBWYWxpZGF0b3JQb29sS2V5Ci8vCi8vIEFkZHMgYSBuZXcgcG9vbCB0byBhIHZhbGlkYXRvcidzIHBvb2wgc2V0LCByZXR1cm5pbmcgdGhlICdrZXknIHRvIHJlZmVyZW5jZSB0aGUgcG9vbCBpbiB0aGUgZnV0dXJlIGZvciBzdGFraW5nLCBldGMuCi8vIFRoZSBjYWxsZXIgbXVzdCBwYXkgdGhlIGNvc3Qgb2YgdGhlIHZhbGlkYXRvcnMgTUJSIGluY3JlYXNlIGFzIHdlbGwgYXMgdGhlIE1CUiB0aGF0IHdpbGwgYmUgbmVlZGVkIGZvciB0aGUgcG9vbCBpdHNlbGYuCi8vCi8vIFsgT05MWSBPV05FUiBPUiBNQU5BR0VSIENBTiBjYWxsIF0KLy8gQHBhcmFtIHtQYXlUeG59IG1iclBheW1lbnQgcGF5bWVudCBmcm9tIGNhbGxlciB3aGljaCBjb3ZlcnMgbWJyIGluY3JlYXNlIG9mIGFkZGluZyBhIG5ldyBwb29sCi8vIEBwYXJhbSB7dWludDY0fSB2YWxpZGF0b3JJZCBpcyBpZCBvZiB2YWxpZGF0b3IgdG8gcG9vbCB0byAobXVzdCBiZSBvd25lciBvciBtYW5hZ2VyKQovLyBAcGFyYW0ge3VpbnQ2NH0gbm9kZU51bSBpcyBub2RlIG51bWJlciB0byBhZGQgdG8KLy8gQHJldHVybnMge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2wga2V5IHRvIGNyZWF0ZWQgcG9vbAphZGRQb29sOgoJcHJvdG8gMyAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ1MgoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lck9yTWFuYWdlcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyT3JNYW5hZ2VyCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDU1CgkvLyB2ZXJpZnlQYXlUeG4obWJyUGF5bWVudCwgeyByZWNlaXZlcjogdGhpcy5hcHAuYWRkcmVzcywgYW1vdW50OiB0aGlzLmdldE1ickFtb3VudHMoKS5hZGRQb29sTWJyIH0pCgkvLyB2ZXJpZnkgcmVjZWl2ZXIKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIFJlY2VpdmVyCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6InJlY2VpdmVyIiwiZXhwZWN0ZWQiOiJ0aGlzLmFwcC5hZGRyZXNzIn0KCWFzc2VydAoKCS8vIHZlcmlmeSBhbW91bnQKCWZyYW1lX2RpZyAtMSAvLyBtYnJQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJY2FsbHN1YiBnZXRNYnJBbW91bnRzCglleHRyYWN0IDggOAoJYnRvaQoJPT0KCgkvLyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb24gZmFpbGVkOiB7InR4biI6Im1iclBheW1lbnQiLCJmaWVsZCI6ImFtb3VudCIsImV4cGVjdGVkIjoidGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkUG9vbE1iciJ9Cglhc3NlcnQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NTcKCS8vIGFzc2VydCh0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLmV4aXN0cywgInNwZWNpZmllZCB2YWxpZGF0b3IgaWQgaXNuJ3QgdmFsaWQiKQoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJYm94X2xlbgoJc3dhcAoJcG9wCgoJLy8gc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBpc24ndCB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDU5CgkvLyBudW1Qb29sczogdWludDY0ID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyBhcyB1aW50NjQKCWludCAyNDIKCWludCAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIG51bVBvb2xzOiB1aW50NjQKCgkvLyAqaWY5X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDYwCgkvLyAobnVtUG9vbHMgYXMgdWludDY0KSA+PSBNQVhfUE9PTFMKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWludCAyNAoJPj0KCWJ6ICppZjlfZW5kCgoJLy8gKmlmOV9jb25zZXF1ZW50CgkvLyBhbHJlYWR5IGF0IG1heCBwb29sIHNpemUKCWVycgoKKmlmOV9lbmQ6CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NjMKCS8vIG51bVBvb2xzICs9IDEKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ2NgoJLy8gc2VuZEFwcENhbGwoewoJLy8gICAgICAgICAgICAgb25Db21wbGV0aW9uOiBPbkNvbXBsZXRpb24uTm9PcCwKCS8vICAgICAgICAgICAgIGFwcHJvdmFsUHJvZ3JhbTogWwoJLy8gICAgICAgICAgICAgICAgIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uZXh0cmFjdCgwLCA0MDk2KSwKCS8vICAgICAgICAgICAgICAgICB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLmV4dHJhY3QoNDA5NiwgdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5zaXplIC0gNDA5NiksCgkvLyAgICAgICAgICAgICBdLAoJLy8gICAgICAgICAgICAgY2xlYXJTdGF0ZVByb2dyYW06IFN0YWtpbmdQb29sLmNsZWFyUHJvZ3JhbSgpLAoJLy8gICAgICAgICAgICAgZ2xvYmFsTnVtVWludDogU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1VaW50LAoJLy8gICAgICAgICAgICAgZ2xvYmFsTnVtQnl0ZVNsaWNlOiBTdGFraW5nUG9vbC5zY2hlbWEuZ2xvYmFsLm51bUJ5dGVTbGljZSwKCS8vICAgICAgICAgICAgIGV4dHJhUHJvZ3JhbVBhZ2VzOiAzLAoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25BcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gY3JlYXRpbmdDb250cmFjdElELCB2YWxpZGF0b3JJZCwgcG9vbElkLCBtaW5FbnRyeVN0YWtlCgkvLyAgICAgICAgICAgICAgICAgbWV0aG9kKCdjcmVhdGVBcHBsaWNhdGlvbih1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCcpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodGhpcy5hcHAuaWQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodmFsaWRhdG9ySWQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IobnVtUG9vbHMgYXMgdWludDY0KSwKCS8vICAgICAgICAgICAgICAgICBpdG9iKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1pbkVudHJ5U3Rha2UpLAoJLy8gICAgICAgICAgICAgXSwKCS8vICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDY3CgkvLyBvbkNvbXBsZXRpb246IE9uQ29tcGxldGlvbi5Ob09wCglpbnQgMCAvLyBOb09wCglpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ2OAoJLy8gYXBwcm92YWxQcm9ncmFtOiBbCgkvLyAgICAgICAgICAgICAgICAgdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5leHRyYWN0KDAsIDQwOTYpLAoJLy8gICAgICAgICAgICAgICAgIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0uZXh0cmFjdCg0MDk2LCB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLnNpemUgLSA0MDk2KSwKCS8vICAgICAgICAgICAgIF0KCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWludCAwCglpbnQgNDA5NgoJYm94X2V4dHJhY3QKCWl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKCWJ5dGUgMHg3MDZmNmY2YzU0NjU2ZDcwNmM2MTc0NjU0MTcwNzA3MjZmNzY2MTZjNDI3OTc0NjU3MyAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKCWludCA0MDk2CglieXRlIDB4NzA2ZjZmNmM1NDY1NmQ3MDZjNjE3NDY1NDE3MDcwNzI2Zjc2NjE2YzQyNzk3NDY1NzMgLy8gInBvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMiCglib3hfbGVuCgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLnNpemUKCWFzc2VydAoJaW50IDQwOTYKCS0KCWJveF9leHRyYWN0CglpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDcyCgkvLyBjbGVhclN0YXRlUHJvZ3JhbTogU3Rha2luZ1Bvb2wuY2xlYXJQcm9ncmFtKCkKCWJ5dGUgYjY0IEN3PT0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NzMKCS8vIGdsb2JhbE51bVVpbnQ6IFN0YWtpbmdQb29sLnNjaGVtYS5nbG9iYWwubnVtVWludAoJaW50IDExCglpdHhuX2ZpZWxkIEdsb2JhbE51bVVpbnQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NzQKCS8vIGdsb2JhbE51bUJ5dGVTbGljZTogU3Rha2luZ1Bvb2wuc2NoZW1hLmdsb2JhbC5udW1CeXRlU2xpY2UKCWludCAzCglpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ3NQoJLy8gZXh0cmFQcm9ncmFtUGFnZXM6IDMKCWludCAzCglpdHhuX2ZpZWxkIEV4dHJhUHJvZ3JhbVBhZ2VzCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDc2CgkvLyBhcHBsaWNhdGlvbkFyZ3M6IFsKCS8vICAgICAgICAgICAgICAgICAvLyBjcmVhdGluZ0NvbnRyYWN0SUQsIHZhbGlkYXRvcklkLCBwb29sSWQsIG1pbkVudHJ5U3Rha2UKCS8vICAgICAgICAgICAgICAgICBtZXRob2QoJ2NyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkJyksCgkvLyAgICAgICAgICAgICAgICAgaXRvYih0aGlzLmFwcC5pZCksCgkvLyAgICAgICAgICAgICAgICAgaXRvYih2YWxpZGF0b3JJZCksCgkvLyAgICAgICAgICAgICAgICAgaXRvYihudW1Qb29scyBhcyB1aW50NjQpLAoJLy8gICAgICAgICAgICAgICAgIGl0b2IodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWluRW50cnlTdGFrZSksCgkvLyAgICAgICAgICAgICBdCgltZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCXR4bmEgQXBwbGljYXRpb25zIDAKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglpbnQgMjA5CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ4NgoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scyA9IG51bVBvb2xzIGFzIHVpbnQxNgoJaW50IDI0MgoJZnJhbWVfZGlnIDAgLy8gbnVtUG9vbHM6IHVpbnQ2NAoJaXRvYgoJZXh0cmFjdCA2IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDg5CgkvLyBwb29sQXBwSWQgPSB0aGlzLml0eG4uY3JlYXRlZEFwcGxpY2F0aW9uSUQuaWQKCWl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKCWZyYW1lX2J1cnkgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ5MAoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1tudW1Qb29scyAtIDFdLnBvb2xBcHBJZCA9IHBvb2xBcHBJZAoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgMCAvLyBudW1Qb29sczogdWludDY0CglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0OTEKCS8vIHRoaXMuYWRkUG9vbFRvTm9kZSh2YWxpZGF0b3JJZCwgcG9vbEFwcElkLCBub2RlTnVtKQoJZnJhbWVfZGlnIC0zIC8vIG5vZGVOdW06IHVpbnQ2NAoJZnJhbWVfZGlnIDEgLy8gcG9vbEFwcElkOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGFkZFBvb2xUb05vZGUKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0OTMKCS8vIHRoaXMucmV0aU9QX3ZhbGlkYXRvckFkZGVkUG9vbC5sb2coewoJLy8gICAgICAgICAgICAgaWQ6IHZhbGlkYXRvcklkLAoJLy8gICAgICAgICAgICAgbnVtOiBudW1Qb29scyBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKSwKCS8vICAgICAgICAgfSkKCWJ5dGUgMHhmYmNjMGY2YiAvLyByZXRpT1BfdmFsaWRhdG9yQWRkZWRQb29sKHVpbnQ2NCx1aW50MTYsdWludDY0KQoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWZyYW1lX2RpZyAwIC8vIG51bVBvb2xzOiB1aW50NjQKCWl0b2IKCWR1cAoJYml0bGVuCglpbnQgMTYKCTw9CgoJLy8gbnVtUG9vbHMgYXMgdWludDE2IG92ZXJmbG93ZWQgMTYgYml0cwoJYXNzZXJ0CglleHRyYWN0IDYgMgoJY29uY2F0CglmcmFtZV9kaWcgMSAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0Cgljb25jYXQKCWxvZwoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ5OQoJLy8gcmV0dXJuIHsgaWQ6IHZhbGlkYXRvcklkLCBwb29sSWQ6IG51bVBvb2xzIGFzIHVpbnQ2NCwgcG9vbEFwcElkOiB0aGlzLml0eG4hLmNyZWF0ZWRBcHBsaWNhdGlvbklELmlkIH0KCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCglmcmFtZV9kaWcgMCAvLyBudW1Qb29sczogdWludDY0CglpdG9iCgljb25jYXQKCWl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKCWl0b2IKCWNvbmNhdAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDEKCXJldHN1YgoKLy8gYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KQoqYWJpX3JvdXRlX2FkZFN0YWtlOgoJLy8gVGhlIEFCSSByZXR1cm4gcHJlZml4CglieXRlIDB4MTUxZjdjNzUKCgkvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gc3Rha2VkQW1vdW50UGF5bWVudDogcGF5Cgl0eG4gR3JvdXBJbmRleAoJaW50IDEKCS0KCWR1cAoJZ3R4bnMgVHlwZUVudW0KCWludCBwYXkKCT09CgoJLy8gYXJndW1lbnQgMiAoc3Rha2VkQW1vdW50UGF5bWVudCkgZm9yIGFkZFN0YWtlIG11c3QgYmUgYSBwYXkgdHJhbnNhY3Rpb24KCWFzc2VydAoKCS8vIGV4ZWN1dGUgYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJY2FsbHN1YiBhZGRTdGFrZQoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGFkZFN0YWtlKHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4biwgdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgdmFsdWVUb1ZlcmlmeTogdWludDY0KTogVmFsaWRhdG9yUG9vbEtleQovLwovLyBBZGRzIHN0YWtlIHRvIGEgdmFsaWRhdG9yIHBvb2wuCi8vCi8vIEBwYXJhbSB7UGF5VHhufSBzdGFrZWRBbW91bnRQYXltZW50IC0gcGF5bWVudCBjb21pbmcgZnJvbSBzdGFrZXIgdG8gcGxhY2UgaW50byBhIHBvb2wKLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWx1ZVRvVmVyaWZ5IC0gb25seSBpZiB2YWxpZGF0b3IgaGFzIGdhdGluZyB0byBlbnRlciAtIHRoaXMgaXMgYXNzZXQgaWQgb3IgbmZkIGlkIHRoYXQgY29ycmVzcG9uZHMgdG8gZ2F0aW5nLgovLyBUeG4gc2VuZGVyIGlzIGZhY3RvcmVkIGluIGFzIHdlbGwgaWYgdGhhdCBpcyBwYXJ0IG9mIGdhdGluZy4KLy8gKiBAcmV0dXJucyB7VmFsaWRhdG9yUG9vbEtleX0gLSBUaGUga2V5IG9mIHRoZSB2YWxpZGF0b3IgcG9vbC4KYWRkU3Rha2U6Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA1CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTEyCgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS5leGlzdHMsICJzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGlzbid0IHZhbGlkIikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoKCS8vIHNwZWNpZmllZCB2YWxpZGF0b3IgaWQgaXNuJ3QgdmFsaWQKCWFzc2VydAoKCS8vICppZjEwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTE1CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5zdW5zZXR0aW5nT24gPiAwCglpbnQgMjI2CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWludCAwCgk+CglieiAqaWYxMF9lbmQKCgkvLyAqaWYxMF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MTcKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5zdW5zZXR0aW5nT24gPiBnbG9iYWxzLmxhdGVzdFRpbWVzdGFtcCwKCS8vICAgICAgICAgICAgICAgICAiY2FuJ3Qgc3Rha2Ugd2l0aCBhIHZhbGlkYXRvciB0aGF0IGlzIHBhc3QgaXRzIHN1bnNldHRpbmcgdGltZSIsCgkvLyAgICAgICAgICAgICApCglpbnQgMjI2CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKCT4KCgkvLyBjYW4ndCBzdGFrZSB3aXRoIGEgdmFsaWRhdG9yIHRoYXQgaXMgcGFzdCBpdHMgc3Vuc2V0dGluZyB0aW1lCglhc3NlcnQKCippZjEwX2VuZDoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUyMwoJLy8gc3Rha2VyID0gdGhpcy50eG4uc2VuZGVyCgl0eG4gU2VuZGVyCglmcmFtZV9idXJ5IDAgLy8gc3Rha2VyOiBhZGRyZXNzCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTI3CgkvLyB2ZXJpZnlQYXlUeG4oc3Rha2VkQW1vdW50UGF5bWVudCwgewoJLy8gICAgICAgICAgICAgc2VuZGVyOiBzdGFrZXIsCgkvLyAgICAgICAgICAgICByZWNlaXZlcjogdGhpcy5hcHAuYWRkcmVzcywKCS8vICAgICAgICAgfSkKCS8vIHZlcmlmeSBzZW5kZXIKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIFNlbmRlcgoJZnJhbWVfZGlnIDAgLy8gc3Rha2VyOiBhZGRyZXNzCgk9PQoKCS8vIHRyYW5zYWN0aW9uIHZlcmlmaWNhdGlvbiBmYWlsZWQ6IHsidHhuIjoic3Rha2VkQW1vdW50UGF5bWVudCIsImZpZWxkIjoic2VuZGVyIiwiZXhwZWN0ZWQiOiJzdGFrZXIifQoJYXNzZXJ0CgoJLy8gdmVyaWZ5IHJlY2VpdmVyCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBSZWNlaXZlcgoJZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCT09CgoJLy8gdHJhbnNhY3Rpb24gdmVyaWZpY2F0aW9uIGZhaWxlZDogeyJ0eG4iOiJzdGFrZWRBbW91bnRQYXltZW50IiwiZmllbGQiOiJyZWNlaXZlciIsImV4cGVjdGVkIjoidGhpcy5hcHAuYWRkcmVzcyJ9Cglhc3NlcnQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzUKCS8vIHRoaXMuZG9lc1N0YWtlck1lZXRHYXRpbmcodmFsaWRhdG9ySWQsIHZhbHVlVG9WZXJpZnkpCglmcmFtZV9kaWcgLTMgLy8gdmFsdWVUb1ZlcmlmeTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBkb2VzU3Rha2VyTWVldEdhdGluZwoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUzNwoJLy8gcmVhbEFtb3VudCA9IHN0YWtlZEFtb3VudFBheW1lbnQuYW1vdW50CglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBBbW91bnQKCWZyYW1lX2J1cnkgMSAvLyByZWFsQW1vdW50OiB1aW50NjQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzgKCS8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NCA9IDAKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gbWJyQW10TGVmdEJlaGluZDogdWludDY0CgoJLy8gKmlmMTFfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NDAKCS8vIHRoaXMuZG9lc1N0YWtlck5lZWRUb1BheU1CUihzdGFrZXIpCglmcmFtZV9kaWcgMCAvLyBzdGFrZXI6IGFkZHJlc3MKCWNhbGxzdWIgZG9lc1N0YWtlck5lZWRUb1BheU1CUgoJYnogKmlmMTFfZW5kCgoJLy8gKmlmMTFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTQzCgkvLyBtYnJBbXRMZWZ0QmVoaW5kID0gdGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkU3Rha2VyTWJyCgljYWxsc3ViIGdldE1ickFtb3VudHMKCWV4dHJhY3QgMjQgOAoJYnRvaQoJZnJhbWVfYnVyeSAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU0NAoJLy8gcmVhbEFtb3VudCAtPSBtYnJBbXRMZWZ0QmVoaW5kCglmcmFtZV9kaWcgMSAvLyByZWFsQW1vdW50OiB1aW50NjQKCWZyYW1lX2RpZyAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoJLQoJZnJhbWVfYnVyeSAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU0NQoJLy8gdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikuY3JlYXRlKCkKCWJ5dGUgMHg3MzcwNzMgLy8gInNwcyIKCWZyYW1lX2RpZyAwIC8vIHN0YWtlcjogYWRkcmVzcwoJY29uY2F0CglpbnQgMTQ0Cglib3hfY3JlYXRlCglwb3AKCippZjExX2VuZDoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU0OQoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS50b3RhbEFsZ29TdGFrZWQgKyByZWFsQW1vdW50IDwgdGhpcy5tYXhBbGxvd2VkU3Rha2UoKSwKCS8vICAgICAgICAgICAgICd0b3RhbCBzdGFrZWQgZm9yIGFsbCBvZiBhIHZhbGlkYXRvcnMgcG9vbHMgbWF5IG5vdCBleGNlZWQgaGFyZCBjYXAnLAoJLy8gICAgICAgICApCglpbnQgMjUyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoJKwoJY2FsbHN1YiBtYXhBbGxvd2VkU3Rha2UKCTwKCgkvLyB0b3RhbCBzdGFrZWQgZm9yIGFsbCBvZiBhIHZhbGlkYXRvcnMgcG9vbHMgbWF5IG5vdCBleGNlZWQgaGFyZCBjYXAKCWFzc2VydAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU1NgoJLy8gZmluZFJldCA9IHRoaXMuZmluZFBvb2xGb3JTdGFrZXIodmFsaWRhdG9ySWQsIHN0YWtlciwgcmVhbEFtb3VudCkKCWZyYW1lX2RpZyAxIC8vIHJlYWxBbW91bnQ6IHVpbnQ2NAoJZnJhbWVfZGlnIDAgLy8gc3Rha2VyOiBhZGRyZXNzCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJY2FsbHN1YiBmaW5kUG9vbEZvclN0YWtlcgoJZnJhbWVfYnVyeSAzIC8vIGZpbmRSZXQ6ICgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NTcKCS8vIHBvb2xLZXkgPSBmaW5kUmV0WzBdCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NTgKCS8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IgPSBmaW5kUmV0WzFdCglmcmFtZV9kaWcgMyAvLyBmaW5kUmV0OiAoKHVpbnQ2NCx1aW50NjQsdWludDY0KSxib29sLGJvb2wpCglzdG9yZSAyNTUgLy8gZnVsbCBhcnJheQoJbG9hZCAyNTUgLy8gZnVsbCBhcnJheQoJaW50IDE5MgoJZ2V0Yml0CglmcmFtZV9idXJ5IDQgLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU1OQoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sID0gZmluZFJldFsyXQoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWludCAxOTMKCWdldGJpdAoJZnJhbWVfYnVyeSA1IC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoKCS8vICppZjEyX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTYwCgkvLyBwb29sS2V5LnBvb2xJZCA9PT0gMAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMAoJPT0KCWJ6ICppZjEyX2VuZAoKCS8vICppZjEyX2NvbnNlcXVlbnQKCS8vIE5vIHBvb2wgYXZhaWxhYmxlIHdpdGggZnJlZSBzdGFrZS4gIFZhbGlkYXRvciBuZWVkcyB0byBhZGQgYW5vdGhlciBwb29sCgllcnIKCippZjEyX2VuZDoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU2NQoJLy8gdGhpcy51cGRhdGVTdGFrZXJQb29sU2V0KHN0YWtlciwgcG9vbEtleSkKCWZyYW1lX2RpZyAzIC8vIGZpbmRSZXQ6ICgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKCXN0b3JlIDI1NSAvLyBmdWxsIGFycmF5Cglsb2FkIDI1NSAvLyBmdWxsIGFycmF5CglleHRyYWN0IDAgMjQKCWZyYW1lX2RpZyAwIC8vIHN0YWtlcjogYWRkcmVzcwoJY2FsbHN1YiB1cGRhdGVTdGFrZXJQb29sU2V0CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTY4CgkvLyB0aGlzLmNhbGxQb29sQWRkU3Rha2UoCgkvLyAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LAoJLy8gICAgICAgICAgICAgcG9vbEtleSwKCS8vICAgICAgICAgICAgIG1ickFtdExlZnRCZWhpbmQsCgkvLyAgICAgICAgICAgICBpc05ld1N0YWtlclRvVmFsaWRhdG9yLAoJLy8gICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1Byb3RvY29sLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgNSAvLyBpc05ld1N0YWtlclRvUHJvdG9jb2w6IGJvb2wKCWZyYW1lX2RpZyA0IC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCWZyYW1lX2RpZyAyIC8vIG1ickFtdExlZnRCZWhpbmQ6IHVpbnQ2NAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMCAyNAoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4bgoJY2FsbHN1YiBjYWxsUG9vbEFkZFN0YWtlCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTc1CgkvLyB0aGlzLnJldGlPUF9zdGFrZUFkZGVkLmxvZyh7CgkvLyAgICAgICAgICAgICBpZDogdmFsaWRhdG9ySWQsCgkvLyAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLAoJLy8gICAgICAgICAgICAgYW1vdW50U3Rha2VkOiByZWFsQW1vdW50LAoJLy8gICAgICAgICAgICAgc3Rha2VyOiBzdGFrZXIsCgkvLyAgICAgICAgIH0pCglieXRlIDB4OTYyYjQxNDMgLy8gcmV0aU9QX3N0YWtlQWRkZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQpCglmcmFtZV9kaWcgLTIgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgMCAvLyBzdGFrZXI6IGFkZHJlc3MKCWNvbmNhdAoJZnJhbWVfZGlnIDEgLy8gcmVhbEFtb3VudDogdWludDY0CglpdG9iCgljb25jYXQKCWNvbmNhdAoJbG9nCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTgzCgkvLyByZXR1cm4gcG9vbEtleQoJZnJhbWVfZGlnIDMgLy8gZmluZFJldDogKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWV4dHJhY3QgMCAyNAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDUKCXJldHN1YgoKLy8gc2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KQoqYWJpX3JvdXRlX3NldFRva2VuUGF5b3V0UmF0aW86CgkvLyBUaGUgQUJJIHJldHVybiBwcmVmaXgKCWJ5dGUgMHgxNTFmN2M3NQoKCS8vIHZhbGlkYXRvcklkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWJ0b2kKCgkvLyBleGVjdXRlIHNldFRva2VuUGF5b3V0UmF0aW8odWludDY0KSh1aW50NjRbMjRdLHVpbnQ2NCkKCWNhbGxzdWIgc2V0VG9rZW5QYXlvdXRSYXRpbwoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIHNldFRva2VuUGF5b3V0UmF0aW8odmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IFBvb2xUb2tlblBheW91dFJhdGlvCi8vCi8vIHNldFRva2VuUGF5b3V0UmF0aW8gaXMgY2FsbGVkIGJ5IFN0YWtpbmcgUG9vbCAjIDEgKE9OTFkpIHRvIGFzayB0aGUgdmFsaWRhdG9yICh1cykgdG8gY2FsY3VsYXRlIHRoZSByYXRpb3MKLy8gb2Ygc3Rha2UgaW4gdGhlIHBvb2xzIGZvciBzdWJzZXF1ZW50IHRva2VuIHBheW91dHMgKGllOiAyIHBvb2xzLCAnMTAwJyBhbGdvIHRvdGFsIHN0YWtlZCwgNjAgaW4gcG9vbCAxLCBhbmQgNDAKLy8gaW4gcG9vbCAyKSAgVGhpcyBpcyBkb25lIHNvIHdlIGhhdmUgYSBzdGFibGUgc25hcHNob3Qgb2Ygc3Rha2UgLSB0YWtlbiBvbmNlIHBlciBlcG9jaCAtIG9ubHkgdHJpZ2dlcmVkIGJ5Ci8vIHBvb2wgMSBkb2luZyBwYXlvdXQuICBwb29scyBvdGhlciB0aGFuIDEgZG9pbmcgcGF5b3V0IGNhbGwgcG9vbCAxIHRvIGFzayBpdCBkbyBpdCBmaXJzdC4KLy8gSXQgd291bGQgYmUgNjAvNDAlIGluIHRoZSBwb29sUGN0T2ZXaG9sZSB2YWx1ZXMuICBUaGUgdG9rZW4gcmV3YXJkIHBheW91dHMgdGhlbiB1c2UgdGhlc2UgdmFsdWVzIGluc3RlYWQgb2YKLy8gdGhlaXIgJ2N1cnJlbnQnIHN0YWtlIHdoaWNoIGNoYW5nZXMgYXMgcGFydCBvZiB0aGUgcGF5b3V0cyB0aGVtc2VsdmVzIChhbmQgcGVvcGxlIGNvdWxkIGJlIGNoYW5naW5nIHN0YWtlCi8vIGR1cmluZyB0aGUgZXBvY2ggdXBkYXRlcyBhY3Jvc3MgcG9vbHMpCi8vCi8vIE11bHRpcGxlIHBvb2xzIHdpbGwgY2FsbCB1cyB2aWEgcG9vbCAxIChwb29sMi0+cG9vbDEtPnZhbGlkYXRvciwgZXRjLikgc28gZG9uJ3QgYXNzZXJ0IG9uIHBvb2wxIGNhbGxpbmcgbXVsdGlwbGUKLy8gdGltZXMgaW4gc2FtZSBlcG9jaC4gIEp1c3QgcmV0dXJuLgovLwovLyBAcGFyYW0gdmFsaWRhdG9ySWQgLSB2YWxpZGF0b3IgaWQgKGFuZCB0aHVzIHBvb2wpIGNhbGxpbmcgdXMuICBWZXJpZmllZCBzbyB0aGF0IHNlbmRlciBNVVNUIGJlIHBvb2wgMSBvZiB0aGlzIHZhbGlkYXRvci4KLy8gQHJldHVybnMgUG9vbFRva2VuUGF5b3V0UmF0aW8gLSB0aGUgZmluaXNoZWQgcmF0aW8gZGF0YQpzZXRUb2tlblBheW91dFJhdGlvOgoJcHJvdG8gMSAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gOAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYwMwoJLy8gcG9vbDFBcHBJRCA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkCglpbnQgMjY4CglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMCAvLyBwb29sMUFwcElEOiB1aW50NjQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MDQKCS8vIGFzc2VydChwb29sMUFwcElEICE9PSAwKQoJZnJhbWVfZGlnIDAgLy8gcG9vbDFBcHBJRDogdWludDY0CglpbnQgMAoJIT0KCWFzc2VydAoKCS8vICppZjEzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjA2CgkvLyB0aGlzLnR4bi5zZW5kZXIgIT09IEFwcElELmZyb21VaW50NjQocG9vbDFBcHBJRCkuYWRkcmVzcwoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIDAgLy8gcG9vbDFBcHBJRDogdWludDY0CglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCSE9CglieiAqaWYxM19lbmQKCgkvLyAqaWYxM19jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MDcKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWIgKnNldFRva2VuUGF5b3V0UmF0aW8qcmV0dXJuCgoqaWYxM19lbmQ6CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MTMKCS8vIGN1clJvdW5kID0gZ2xvYmFscy5yb3VuZAoJZ2xvYmFsIFJvdW5kCglmcmFtZV9idXJ5IDEgLy8gY3VyUm91bmQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYxNAoJLy8gbGFzdFBheW91dFVwZGF0ZSA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUudG9rZW5QYXlvdXRSYXRpby51cGRhdGVkRm9yUGF5b3V0CglpbnQgODkyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCgkvLyAqaWYxNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYxNQoJLy8gbGFzdFBheW91dFVwZGF0ZSAhPT0gMAoJZnJhbWVfZGlnIDIgLy8gbGFzdFBheW91dFVwZGF0ZTogdWludDY0CglpbnQgMAoJIT0KCWJ6ICppZjE0X2VuZAoKCS8vICppZjE0X2NvbnNlcXVlbnQKCS8vICppZjE1X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjE3CgkvLyAoQXBwSUQuZnJvbVVpbnQ2NChwb29sMUFwcElEKS5nbG9iYWxTdGF0ZSgnbGFzdFBheW91dCcpIGFzIHVpbnQ2NCkgPT09IGxhc3RQYXlvdXRVcGRhdGUKCWZyYW1lX2RpZyAwIC8vIHBvb2wxQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDZjNjE3Mzc0NTA2MTc5NmY3NTc0IC8vICJsYXN0UGF5b3V0IgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQocG9vbDFBcHBJRCkuZ2xvYmFsU3RhdGUoJ2xhc3RQYXlvdXQnKQoJYXNzZXJ0CglmcmFtZV9kaWcgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCT09CglieiAqaWYxNV9lbmQKCgkvLyAqaWYxNV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MTgKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWIgKnNldFRva2VuUGF5b3V0UmF0aW8qcmV0dXJuCgoqaWYxNV9lbmQ6CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MjAKCS8vIGVwb2NoUm91bmRMZW5ndGggPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lcG9jaFJvdW5kTGVuZ3RoIGFzIHVpbnQ2NAoJaW50IDE2OQoJaW50IDQKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDMgLy8gZXBvY2hSb3VuZExlbmd0aDogdWludDY0CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjIxCgkvLyB0aGlzRXBvY2hCZWdpbiA9IGN1clJvdW5kIC0gKGN1clJvdW5kICUgZXBvY2hSb3VuZExlbmd0aCkKCWZyYW1lX2RpZyAxIC8vIGN1clJvdW5kOiB1aW50NjQKCWZyYW1lX2RpZyAxIC8vIGN1clJvdW5kOiB1aW50NjQKCWZyYW1lX2RpZyAzIC8vIGVwb2NoUm91bmRMZW5ndGg6IHVpbnQ2NAoJJQoJLQoJZnJhbWVfYnVyeSA0IC8vIHRoaXNFcG9jaEJlZ2luOiB1aW50NjQKCgkvLyAqaWYxNl9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYyMwoJLy8gbGFzdFBheW91dFVwZGF0ZSAtIChsYXN0UGF5b3V0VXBkYXRlICUgZXBvY2hSb3VuZExlbmd0aCkgPT09IHRoaXNFcG9jaEJlZ2luCglmcmFtZV9kaWcgMiAvLyBsYXN0UGF5b3V0VXBkYXRlOiB1aW50NjQKCWZyYW1lX2RpZyAyIC8vIGxhc3RQYXlvdXRVcGRhdGU6IHVpbnQ2NAoJZnJhbWVfZGlnIDMgLy8gZXBvY2hSb3VuZExlbmd0aDogdWludDY0CgklCgktCglmcmFtZV9kaWcgNCAvLyB0aGlzRXBvY2hCZWdpbjogdWludDY0Cgk9PQoJYnogKmlmMTZfZW5kCgoJLy8gKmlmMTZfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjI0CgkvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS50b2tlblBheW91dFJhdGlvCglpbnQgNzAwIC8vIGhlYWRPZmZzZXQKCWludCAyMDAKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CgliICpzZXRUb2tlblBheW91dFJhdGlvKnJldHVybgoKKmlmMTZfZW5kOgoKKmlmMTRfZW5kOgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjI3CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8udXBkYXRlZEZvclBheW91dCA9IGN1clJvdW5kCglpbnQgODkyCglmcmFtZV9kaWcgMSAvLyBjdXJSb3VuZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYyOQoJLy8gY3VyTnVtUG9vbHMgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnN0YXRlLm51bVBvb2xzIGFzIHVpbnQ2NAoJaW50IDI0MgoJaW50IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDUgLy8gY3VyTnVtUG9vbHM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYzMAoJLy8gdG90YWxTdGFrZUZvclZhbGlkYXRvciA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUudG90YWxBbGdvU3Rha2VkCglpbnQgMjUyCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgNiAvLyB0b3RhbFN0YWtlRm9yVmFsaWRhdG9yOiB1aW50NjQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MzEKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgY3VyTnVtUG9vbHM7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDcgLy8gaTogdWludDY0CgoqZm9yXzI6CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MzEKCS8vIGkgPCBjdXJOdW1Qb29scwoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglmcmFtZV9kaWcgNSAvLyBjdXJOdW1Qb29sczogdWludDY0Cgk8CglieiAqZm9yXzJfZW5kCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjM2CgkvLyBvdXJQb29sUGN0T2ZXaG9sZSA9IHdpZGVSYXRpbygKCS8vICAgICAgICAgICAgICAgICBbdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1tpXS50b3RhbEFsZ29TdGFrZWQsIDFfMDAwXzAwMF0sCgkvLyAgICAgICAgICAgICAgICAgW3RvdGFsU3Rha2VGb3JWYWxpZGF0b3JdLAoJLy8gICAgICAgICAgICAgKQoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglpbnQgMV8wMDBfMDAwCgltdWx3CglpbnQgMAoJZnJhbWVfZGlnIDYgLy8gdG90YWxTdGFrZUZvclZhbGlkYXRvcjogdWludDY0CglkaXZtb2R3Cglwb3AKCXBvcAoJc3dhcAoJIQoKCS8vIHdpZGVSYXRpbyBmYWlsZWQKCWFzc2VydAoJZnJhbWVfYnVyeSA4IC8vIG91clBvb2xQY3RPZldob2xlOiB1aW50NjQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NDAKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUudG9rZW5QYXlvdXRSYXRpby5wb29sUGN0T2ZXaG9sZVtpXSA9IG91clBvb2xQY3RPZldob2xlCglpbnQgNzAwCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWZyYW1lX2RpZyA4IC8vIG91clBvb2xQY3RPZldob2xlOiB1aW50NjQKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoqZm9yXzJfY29udGludWU6CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MzEKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSA3IC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzIKCipmb3JfMl9lbmQ6CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NDIKCS8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KCWludCA3MDAgLy8gaGVhZE9mZnNldAoJaW50IDIwMAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCipzZXRUb2tlblBheW91dFJhdGlvKnJldHVybjoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDgKCXJldHN1YgoKLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcygodWludDY0LHVpbnQ2NCx1aW50NjQpLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkCiphYmlfcm91dGVfc3Rha2VVcGRhdGVkVmlhUmV3YXJkczoKCS8vIHNhdHVyYXRlZEJ1cm5Ub0ZlZVNpbms6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQoJYnRvaQoKCS8vIHZhbGlkYXRvckNvbW1pc3Npb246IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAoJYnRvaQoKCS8vIHJld2FyZFRva2VuQW1vdW50UmVzZXJ2ZWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwoJYnRvaQoKCS8vIGFsZ29Ub0FkZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglidG9pCgoJLy8gcG9vbEtleTogKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZHVwCglsZW4KCWludCAyNAoJPT0KCgkvLyBhcmd1bWVudCA0IChwb29sS2V5KSBmb3Igc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyBtdXN0IGJlIGEgKHVpbnQ2NCx1aW50NjQsdWludDY0KQoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSBzdGFrZVVwZGF0ZWRWaWFSZXdhcmRzKCh1aW50NjQsdWludDY0LHVpbnQ2NCksdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKCWNhbGxzdWIgc3Rha2VVcGRhdGVkVmlhUmV3YXJkcwoJaW50IDEKCXJldHVybgoKLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyhwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5LCBhbGdvVG9BZGQ6IHVpbnQ2NCwgcmV3YXJkVG9rZW5BbW91bnRSZXNlcnZlZDogdWludDY0LCB2YWxpZGF0b3JDb21taXNzaW9uOiB1aW50NjQsIHNhdHVyYXRlZEJ1cm5Ub0ZlZVNpbms6IHVpbnQ2NCk6IHZvaWQKLy8KLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyBpcyBjYWxsZWQgYnkgU3Rha2luZyBwb29scyB0byBpbmZvcm0gdGhlIHZhbGlkYXRvciAodXMpIHRoYXQgYSBwYXJ0aWN1bGFyIGFtb3VudCBvZiB0b3RhbAovLyBzdGFrZSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgc3BlY2lmaWVkIHBvb2wuICBUaGlzIGlzIHVzZWQgdG8gdXBkYXRlIHRoZSBzdGF0cyB3ZSBoYXZlIGluIG91ciBQb29sSW5mbyBzdG9yYWdlLgovLyBUaGUgY2FsbGluZyBBcHAgaWQgaXMgdmFsaWRhdGVkIGFnYWluc3Qgb3VyIHBvb2wgbGlzdCBhcyB3ZWxsLgovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBWYWxpZGF0b3JQb29sS2V5IHR5cGUKLy8gQHBhcmFtIHt1aW50NjR9IGFsZ29Ub0FkZCAtIGFtb3VudCB0aGlzIHZhbGlkYXRvcidzIHRvdGFsIHN0YWtlIGluY3JlYXNlZCB2aWEgcmV3YXJkcwovLyBAcGFyYW0ge3VpbnQ2NH0gcmV3YXJkVG9rZW5BbW91bnRSZXNlcnZlZCAtIGFtb3VudCB0aGlzIHZhbGlkYXRvcidzIHRvdGFsIHN0YWtlIGluY3JlYXNlZCB2aWEgcmV3YXJkcyAodGhhdCBzaG91bGQgYmUKLy8gQHBhcmFtIHt1aW50NjR9IHZhbGlkYXRvckNvbW1pc3Npb24gLSB0aGUgY29tbWlzc2lvbiBhbW91bnQgdGhlIHZhbGlkYXRvciB3YXMgcGFpZCwgaWYgYW55Ci8vIEBwYXJhbSB7dWludDY0fSBzYXR1cmF0ZWRCdXJuVG9GZWVTaW5rIC0gaWYgdGhlIHBvb2wgd2FzIGluIHNhdHVyYXRlZCBzdGF0ZSwgdGhlIGFtb3VudCBzZW50IGJhY2sgdG8gdGhlIGZlZSBzaW5rLgovLyBzZWVuIGFzICdhY2NvdW50ZWQgZm9yL3BlbmRpbmcgc3BlbnQnKQpzdGFrZVVwZGF0ZWRWaWFSZXdhcmRzOgoJcHJvdG8gNSAwCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjYzCgkvLyB0aGlzLnZlcmlmeVBvb2xLZXlDYWxsZXIocG9vbEtleSkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CgljYWxsc3ViIHZlcmlmeVBvb2xLZXlDYWxsZXIKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NjYKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCArPSBhbGdvVG9BZGQKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAxMCAvLyBoZWFkT2Zmc2V0CgkrCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NjcKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS50b3RhbEFsZ29TdGFrZWQgKz0gYWxnb1RvQWRkCglpbnQgMjUyCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMiAvLyBhbGdvVG9BZGQ6IHVpbnQ2NAoJKwoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjY4CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUucmV3YXJkVG9rZW5IZWxkQmFjayArPSByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkCglpbnQgMjYwCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkOiB1aW50NjQKCSsKCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY3MAoJLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgKz0gYWxnb1RvQWRkCglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglhcHBfZ2xvYmFsX2dldAoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CgkrCglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglzd2FwCglhcHBfZ2xvYmFsX3B1dAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY3MwoJLy8gdGhpcy5yZXZlcmlmeU5GRE93bmVyc2hpcChwb29sS2V5LmlkKQoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCgljYWxsc3ViIHJldmVyaWZ5TkZET3duZXJzaGlwCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Njc1CgkvLyB0aGlzLnJldGlPUF9lcG9jaFJld2FyZFVwZGF0ZS5sb2coewoJLy8gICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICBwb29sQXBwSWQ6IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLAoJLy8gICAgICAgICAgICAgYWxnb0FkZGVkOiBhbGdvVG9BZGQsCgkvLyAgICAgICAgICAgICByZXdhcmRUb2tlbkhlbGRCYWNrOiByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkLAoJLy8gICAgICAgICAgICAgc2F0dXJhdGVkQnVyblRvRmVlU2luazogc2F0dXJhdGVkQnVyblRvRmVlU2luaywKCS8vICAgICAgICAgICAgIHZhbGlkYXRvckNvbW1pc3Npb246IHZhbGlkYXRvckNvbW1pc3Npb24sCgkvLyAgICAgICAgIH0pCglieXRlIDB4YjNlNDdjM2QgLy8gcmV0aU9QX2Vwb2NoUmV3YXJkVXBkYXRlKHVpbnQ2NCx1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTQgLy8gdmFsaWRhdG9yQ29tbWlzc2lvbjogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtNSAvLyBzYXR1cmF0ZWRCdXJuVG9GZWVTaW5rOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC0yIC8vIGFsZ29Ub0FkZDogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY29uY2F0Cglsb2cKCXJldHN1YgoKLy8gc3Rha2VSZW1vdmVkKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wpdm9pZAoqYWJpX3JvdXRlX3N0YWtlUmVtb3ZlZDoKCS8vIHN0YWtlclJlbW92ZWQ6IGJvb2wKCXR4bmEgQXBwbGljYXRpb25BcmdzIDUKCWR1cAoJbGVuCglpbnQgMQoJPT0KCgkvLyBhcmd1bWVudCAwIChzdGFrZXJSZW1vdmVkKSBmb3Igc3Rha2VSZW1vdmVkIG11c3QgYmUgYSBib29sCglhc3NlcnQKCWludCAwCglnZXRiaXQKCgkvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDQKCWJ0b2kKCgkvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDMKCWJ0b2kKCgkvLyBzdGFrZXI6IGFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMzIKCT09CgoJLy8gYXJndW1lbnQgMyAoc3Rha2VyKSBmb3Igc3Rha2VSZW1vdmVkIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyBwb29sS2V5OiAodWludDY0LHVpbnQ2NCx1aW50NjQpCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglkdXAKCWxlbgoJaW50IDI0Cgk9PQoKCS8vIGFyZ3VtZW50IDQgKHBvb2xLZXkpIGZvciBzdGFrZVJlbW92ZWQgbXVzdCBiZSBhICh1aW50NjQsdWludDY0LHVpbnQ2NCkKCWFzc2VydAoKCS8vIGV4ZWN1dGUgc3Rha2VSZW1vdmVkKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wpdm9pZAoJY2FsbHN1YiBzdGFrZVJlbW92ZWQKCWludCAxCglyZXR1cm4KCi8vIHN0YWtlUmVtb3ZlZChwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5LCBzdGFrZXI6IEFkZHJlc3MsIGFtb3VudFJlbW92ZWQ6IHVpbnQ2NCwgcmV3YXJkUmVtb3ZlZDogdWludDY0LCBzdGFrZXJSZW1vdmVkOiBib29sZWFuKTogdm9pZAovLwovLyBzdGFrZVJlbW92ZWQgaXMgY2FsbGVkIGJ5IFN0YWtpbmcgcG9vbHMgdG8gaW5mb3JtIHRoZSB2YWxpZGF0b3IgKHVzKSB0aGF0IGEgcGFydGljdWxhciBhbW91bnQgb2YgdG90YWwgc3Rha2UgaGFzIGJlZW4gcmVtb3ZlZAovLyBmcm9tIHRoZSBzcGVjaWZpZWQgcG9vbC4gIFRoaXMgaXMgdXNlZCB0byB1cGRhdGUgdGhlIHN0YXRzIHdlIGhhdmUgaW4gb3VyIFBvb2xJbmZvIHN0b3JhZ2UuCi8vIElmIGFueSBhbW91bnQgb2YgcmV3YXJkUmVtb3ZlZCBpcyBzcGVjaWZpZWQsIHRoZW4gdGhhdCBhbW91bnQgb2YgcmV3YXJkIGlzIHNlbnQgdG8gdGhlIHVzZQovLyBUaGUgY2FsbGluZyBBcHAgaWQgaXMgdmFsaWRhdGVkIGFnYWluc3Qgb3VyIHBvb2wgbGlzdCBhcyB3ZWxsLgovLwovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgY2FsbGluZyB1cyBmcm9tIHdoaWNoIHN0YWtlIHdhcyByZW1vdmVkCi8vIEBwYXJhbSB7QWRkcmVzc30gc3Rha2VyCi8vIEBwYXJhbSB7dWludDY0fSBhbW91bnRSZW1vdmVkIC0gYWxnbyBhbW91bnQgcmVtb3ZlZAovLyBAcGFyYW0ge3VpbnQ2NH0gcmV3YXJkUmVtb3ZlZCAtIGlmIGFwcGxpY2FibGUsIGFtb3VudCBvZiB0b2tlbiByZXdhcmQgcmVtb3ZlZCAoYnkgcG9vbCAxIGNhbGxlcikgb3IgVE8gcmVtb3ZlIGFuZCBwYXkgb3V0ICh2aWEgcG9vbCAxIGZyb20gZGlmZmVyZW50IHBvb2wgY2FsbGVyKQovLyBAcGFyYW0ge2Jvb2xlYW59IHN0YWtlclJlbW92ZWQKc3Rha2VSZW1vdmVkOgoJcHJvdG8gNSAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMwoKCS8vICppZjE3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzA1CgkvLyBnbG9iYWxzLm9wY29kZUJ1ZGdldCA8IDMwMAoJZ2xvYmFsIE9wY29kZUJ1ZGdldAoJaW50IDMwMAoJPAoJYnogKmlmMTdfZW5kCgoJLy8gKmlmMTdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzA2CgkvLyBpbmNyZWFzZU9wY29kZUJ1ZGdldCgpCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJaW50IDAKCWl0eG5fZmllbGQgRmVlCglieXRlIGI2NCBDb0VCIC8vICNwcmFnbWEgdmVyc2lvbiAxMDsgaW50IDEKCWR1cAoJaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCWludCBEZWxldGVBcHBsaWNhdGlvbgoJaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KCWl0eG5fc3VibWl0CgoqaWYxN19lbmQ6CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MDgKCS8vIHRoaXMudmVyaWZ5UG9vbEtleUNhbGxlcihwb29sS2V5KQoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWNhbGxzdWIgdmVyaWZ5UG9vbEtleUNhbGxlcgoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxMgoJLy8gYXNzZXJ0KGFtb3VudFJlbW92ZWQgPiAwIHx8IHJld2FyZFJlbW92ZWQgPiAwLCAnc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGFsZ28gb3IgcmV3YXJkIHdhcyByZW1vdmVkJykKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWludCAwCgk+CglkdXAKCWJueiAqc2tpcF9vcjIKCWZyYW1lX2RpZyAtNCAvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCWludCAwCgk+Cgl8fAoKKnNraXBfb3IyOgoJLy8gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGFsZ28gb3IgcmV3YXJkIHdhcyByZW1vdmVkCglhc3NlcnQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MTUKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCAtPSBhbW91bnRSZW1vdmVkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxNgoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsQWxnb1N0YWtlZCAtPSBhbW91bnRSZW1vdmVkCglpbnQgMjUyCglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxNwoJLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgLT0gYW1vdW50UmVtb3ZlZAoJYnl0ZSAweDczNzQ2MTZiNjU2NCAvLyAic3Rha2VkIgoJYXBwX2dsb2JhbF9nZXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCS0KCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCXN3YXAKCWFwcF9nbG9iYWxfcHV0CgoJLy8gKmlmMThfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MTkKCS8vIHJld2FyZFJlbW92ZWQgPiAwCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CglpbnQgMAoJPgoJYnogKmlmMThfZWxzZQoKCS8vICppZjE4X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyMAoJLy8gcmV3YXJkVG9rZW5JRCA9IHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5jb25maWcucmV3YXJkVG9rZW5JZAoJaW50IDE1MwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIHJld2FyZFRva2VuSUQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyMQoJLy8gYXNzZXJ0KHJld2FyZFRva2VuSUQgIT09IDAsICJyZXdhcmRSZW1vdmVkIGNhbid0IGJlIHNldCBpZiB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIHJld2FyZCB0b2tlbiEiKQoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JRDogdWludDY0CglpbnQgMAoJIT0KCgkvLyByZXdhcmRSZW1vdmVkIGNhbid0IGJlIHNldCBpZiB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIHJld2FyZCB0b2tlbiEKCWFzc2VydAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyMgoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS5yZXdhcmRUb2tlbkhlbGRCYWNrID49IHJld2FyZFJlbW92ZWQsCgkvLyAgICAgICAgICAgICAgICAgJ3Jld2FyZCBiZWluZyByZW1vdmVkIG11c3QgYmUgY292ZXJlZCBieSBob2xkIGJhY2sgYW1vdW50JywKCS8vICAgICAgICAgICAgICkKCWludCAyNjAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2RpZyAtNCAvLyByZXdhcmRSZW1vdmVkOiB1aW50NjQKCT49CgoJLy8gcmV3YXJkIGJlaW5nIHJlbW92ZWQgbXVzdCBiZSBjb3ZlcmVkIGJ5IGhvbGQgYmFjayBhbW91bnQKCWFzc2VydAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyOAoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnJld2FyZFRva2VuSGVsZEJhY2sgLT0gcmV3YXJkUmVtb3ZlZAoJaW50IDI2MAoJZHVwCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CgktCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyAqaWYxOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczMwoJLy8gcG9vbEtleS5wb29sSWQgIT09IDEKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCSE9CglieiAqaWYxOV9lbmQKCgkvLyAqaWYxOV9jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MzQKCS8vIHNlbmRNZXRob2RDYWxsPHR5cGVvZiBTdGFraW5nUG9vbC5wcm90b3R5cGUucGF5VG9rZW5SZXdhcmQ+KHsKCS8vICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRDogQXBwSUQuZnJvbVVpbnQ2NCh0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQXJnczogW3N0YWtlciwgcmV3YXJkVG9rZW5JRCwgcmV3YXJkUmVtb3ZlZF0sCgkvLyAgICAgICAgICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgltZXRob2QgInBheVRva2VuUmV3YXJkKGFkZHJlc3MsdWludDY0LHVpbnQ2NCl2b2lkIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MzUKCS8vIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQodGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzWzBdLnBvb2xBcHBJZCkKCWludCAyNjgKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczNgoJLy8gbWV0aG9kQXJnczogW3N0YWtlciwgcmV3YXJkVG9rZW5JRCwgcmV3YXJkUmVtb3ZlZF0KCWZyYW1lX2RpZyAtMiAvLyBzdGFrZXI6IEFkZHJlc3MKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklEOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgLTQgLy8gcmV3YXJkUmVtb3ZlZDogdWludDY0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCippZjE5X2VuZDoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczOQoJLy8gdGhpcy5yZXRpT1Bfc3Rha2VSZW1vdmVkLmxvZyh7CgkvLyAgICAgICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICAgICAgcG9vbE51bTogcG9vbEtleS5wb29sSWQgYXMgdWludDE2LAoJLy8gICAgICAgICAgICAgICAgIHBvb2xBcHBJZDogQXBwSUQuZnJvbVVpbnQ2NChwb29sS2V5LnBvb2xBcHBJZCksCgkvLyAgICAgICAgICAgICAgICAgc3Rha2VyOiBzdGFrZXIsCgkvLyAgICAgICAgICAgICAgICAgYW1vdW50VW5zdGFrZWQ6IGFtb3VudFJlbW92ZWQsCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5Bc3NldElkOiBBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JRCksCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5zUmVjZWl2ZWQ6IHJld2FyZFJlbW92ZWQsCgkvLyAgICAgICAgICAgICB9KQoJYnl0ZSAweDEyZjRiZDRiIC8vIHJldGlPUF9zdGFrZVJlbW92ZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTIgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC00IC8vIHJld2FyZFJlbW92ZWQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklEOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJY29uY2F0Cglsb2cKCWIgKmlmMThfZW5kCgoqaWYxOF9lbHNlOgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzQ5CgkvLyB0aGlzLnJldGlPUF9zdGFrZVJlbW92ZWQubG9nKHsKCS8vICAgICAgICAgICAgICAgICBpZDogcG9vbEtleS5pZCwKCS8vICAgICAgICAgICAgICAgICBwb29sTnVtOiBwb29sS2V5LnBvb2xJZCBhcyB1aW50MTYsCgkvLyAgICAgICAgICAgICAgICAgcG9vbEFwcElkOiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICBzdGFrZXI6IHN0YWtlciwKCS8vICAgICAgICAgICAgICAgICBhbW91bnRVbnN0YWtlZDogYW1vdW50UmVtb3ZlZCwKCS8vICAgICAgICAgICAgICAgICAvLyBubyB0b2tlbnMgcmV3YXJkZWQuLgoJLy8gICAgICAgICAgICAgICAgIHJld2FyZFRva2VuQXNzZXRJZDogQXNzZXRJRC56ZXJvSW5kZXgsCgkvLyAgICAgICAgICAgICAgICAgcmV3YXJkVG9rZW5zUmVjZWl2ZWQ6IDAsCgkvLyAgICAgICAgICAgICB9KQoJYnl0ZSAweDEyZjRiZDRiIC8vIHJldGlPUF9zdGFrZVJlbW92ZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCglkdXAKCWJpdGxlbgoJaW50IDE2Cgk8PQoKCS8vIHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNiBvdmVyZmxvd2VkIDE2IGJpdHMKCWFzc2VydAoJZXh0cmFjdCA2IDIKCWNvbmNhdAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMTYgOAoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTIgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBhbW91bnRSZW1vdmVkOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAKCWNvbmNhdAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAKCWNvbmNhdAoJY29uY2F0Cglsb2cKCippZjE4X2VuZDoKCS8vICppZjIwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzYxCgkvLyBzdGFrZXJSZW1vdmVkCglmcmFtZV9kaWcgLTUgLy8gc3Rha2VyUmVtb3ZlZDogYm9vbGVhbgoJYnogKmlmMjBfZW5kCgoJLy8gKmlmMjBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzYzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbcG9vbEtleS5wb29sSWQgLSAxXS50b3RhbFN0YWtlcnMgLT0gMQoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJaW50IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDEKCS0KCWl0b2IKCWV4dHJhY3QgNiAyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NjUKCS8vIHJlbW92ZVJldCA9IHRoaXMucmVtb3ZlRnJvbVN0YWtlclBvb2xTZXQoc3Rha2VyLCA8VmFsaWRhdG9yUG9vbEtleT57CgkvLyAgICAgICAgICAgICAgICAgaWQ6IHBvb2xLZXkuaWQsCgkvLyAgICAgICAgICAgICAgICAgcG9vbElkOiBwb29sS2V5LnBvb2xJZCwKCS8vICAgICAgICAgICAgICAgICBwb29sQXBwSWQ6IHBvb2xLZXkucG9vbEFwcElkLAoJLy8gICAgICAgICAgICAgfSkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY2FsbHN1YiByZW1vdmVGcm9tU3Rha2VyUG9vbFNldAoJZnJhbWVfYnVyeSAxIC8vIHJlbW92ZVJldDogKGJvb2wsYm9vbCkKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NzAKCS8vIHN0YWtlck91dE9mVGhpc1ZhbGlkYXRvciA9IHJlbW92ZVJldFswXQoJZnJhbWVfZGlnIDEgLy8gcmVtb3ZlUmV0OiAoYm9vbCxib29sKQoJc3RvcmUgMjU1IC8vIGZ1bGwgYXJyYXkKCWxvYWQgMjU1IC8vIGZ1bGwgYXJyYXkKCWludCAwCglnZXRiaXQKCWZyYW1lX2J1cnkgMiAvLyBzdGFrZXJPdXRPZlRoaXNWYWxpZGF0b3I6IGJvb2wKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NzEKCS8vIHN0YWtlck91dE9mUHJvdG9jb2wgPSByZW1vdmVSZXRbMV0KCWZyYW1lX2RpZyAxIC8vIHJlbW92ZVJldDogKGJvb2wsYm9vbCkKCXN0b3JlIDI1NSAvLyBmdWxsIGFycmF5Cglsb2FkIDI1NSAvLyBmdWxsIGFycmF5CglpbnQgMQoJZ2V0Yml0CglmcmFtZV9idXJ5IDMgLy8gc3Rha2VyT3V0T2ZQcm90b2NvbDogYm9vbAoKCS8vICppZjIxX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzczCgkvLyBzdGFrZXJPdXRPZlRoaXNWYWxpZGF0b3IKCWZyYW1lX2RpZyAyIC8vIHN0YWtlck91dE9mVGhpc1ZhbGlkYXRvcjogYm9vbAoJYnogKmlmMjFfZW5kCgoJLy8gKmlmMjFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Nzc0CgkvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUudG90YWxTdGFrZXJzIC09IDEKCWludCAyNDQKCWR1cAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDEKCS0KCWl0b2IKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKKmlmMjFfZW5kOgoJLy8gKmlmMjJfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NzcKCS8vIHN0YWtlck91dE9mUHJvdG9jb2wKCWZyYW1lX2RpZyAzIC8vIHN0YWtlck91dE9mUHJvdG9jb2w6IGJvb2wKCWJ6ICppZjIyX2VuZAoKCS8vICppZjIyX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc3OAoJLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlIC09IDEKCWJ5dGUgMHg2ZTc1NmQ1Mzc0NjE2YjY1NzI3MyAvLyAibnVtU3Rha2VycyIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMQoJLQoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJc3dhcAoJYXBwX2dsb2JhbF9wdXQKCippZjIyX2VuZDoKCippZjIwX2VuZDoKCXJldHN1YgoKLy8gZmluZFBvb2xGb3JTdGFrZXIodWludDY0LGFkZHJlc3MsdWludDY0KSgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkKKmFiaV9yb3V0ZV9maW5kUG9vbEZvclN0YWtlcjoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gYW1vdW50VG9TdGFrZTogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglidG9pCgoJLy8gc3Rha2VyOiBhZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglkdXAKCWxlbgoJaW50IDMyCgk9PQoKCS8vIGFyZ3VtZW50IDEgKHN0YWtlcikgZm9yIGZpbmRQb29sRm9yU3Rha2VyIG11c3QgYmUgYSBhZGRyZXNzCglhc3NlcnQKCgkvLyB2YWxpZGF0b3JJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglidG9pCgoJLy8gZXhlY3V0ZSBmaW5kUG9vbEZvclN0YWtlcih1aW50NjQsYWRkcmVzcyx1aW50NjQpKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKQoJY2FsbHN1YiBmaW5kUG9vbEZvclN0YWtlcgoJY29uY2F0Cglsb2cKCWludCAxCglyZXR1cm4KCi8vIGZpbmRQb29sRm9yU3Rha2VyKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIHN0YWtlcjogQWRkcmVzcywgYW1vdW50VG9TdGFrZTogdWludDY0KTogW1ZhbGlkYXRvclBvb2xLZXksIGJvb2xlYW4sIGJvb2xlYW5dCi8vCi8vIEZpbmRzIHRoZSBwb29sIGZvciBhIHN0YWtlciBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgdmFsaWRhdG9yIGlkLCBzdGFrZXIgYWRkcmVzcywgYW5kIGFtb3VudCB0byBzdGFrZS4KLy8gRmlyc3QgY2hlY2tzIHRoZSBzdGFrZXJzICdhbHJlYWR5IHN0YWtlZCBsaXN0JyBmb3IgdGhlIHZhbGlkYXRvciBwcmVmZXJyaW5nIHRob3NlIChhZGRpbmcgaWYgcG9zc2libGUpIHRoZW4gYWRkcwovLyB0byBuZXcgcG9vbCBpZiBuZWNlc3NhcnkuCi8vCi8vIEBwYXJhbSB7VmFsaWRhdG9ySWRUeXBlfSB2YWxpZGF0b3JJZCAtIFRoZSBpZCBvZiB0aGUgdmFsaWRhdG9yLgovLyBAcGFyYW0ge0FkZHJlc3N9IHN0YWtlciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzdGFrZXIuCi8vIEBwYXJhbSB7dWludDY0fSBhbW91bnRUb1N0YWtlIC0gVGhlIGFtb3VudCB0byBzdGFrZS4KLy8gQHJldHVybnMge1ZhbGlkYXRvclBvb2xLZXksIGJvb2xlYW4sIGJvb2xlYW59IC0gVGhlIHBvb2wgZm9yIHRoZSBzdGFrZXIsIHRydWUvZmFsc2Ugb24gd2hldGhlciB0aGUgc3Rha2VyIGlzICduZXcnCi8vIHRvIHRoaXMgVkFMSURBVE9SLCBhbmQgdHJ1ZS9mYWxzZSBpZiBzdGFrZXIgaXMgbmV3IHRvIHRoZSBwcm90b2NvbC4KZmluZFBvb2xGb3JTdGFrZXI6Cglwcm90byAzIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA3CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODAwCgkvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yID0gdHJ1ZQoJaW50IDEKCWZyYW1lX2J1cnkgMCAvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yOiBib29sCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODAxCgkvLyBpc05ld1N0YWtlclRvUHJvdG9jb2wgPSB0cnVlCglpbnQgMQoJZnJhbWVfYnVyeSAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgwOQoJLy8gbWF4UGVyUG9vbCA9IHRoaXMuZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHZhbGlkYXRvcklkKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWNhbGxzdWIgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sCglmcmFtZV9idXJ5IDIgLy8gbWF4UGVyUG9vbDogdWludDY0CgoJLy8gKmlmMjNfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MTIKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLmV4aXN0cwoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfbGVuCglzd2FwCglwb3AKCWJ6ICppZjIzX2VuZAoKCS8vICppZjIzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxMwoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0yIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxNAoJLy8gYXNzZXJ0KHZhbGlkYXRvcklkICE9PSAwKQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWludCAwCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODE1CgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IHBvb2xTZXQubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoKKmZvcl8zOgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODE1CgkvLyBpIDwgcG9vbFNldC5sZW5ndGgKCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDYKCTwKCWJ6ICpmb3JfM19lbmQKCgkvLyAqaWYyNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxNgoJLy8gZ2xvYmFscy5vcGNvZGVCdWRnZXQgPCAzMDAKCWdsb2JhbCBPcGNvZGVCdWRnZXQKCWludCAzMDAKCTwKCWJ6ICppZjI0X2VuZAoKCS8vICppZjI0X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxNwoJLy8gaW5jcmVhc2VPcGNvZGVCdWRnZXQoKQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCWludCAwCglpdHhuX2ZpZWxkIEZlZQoJYnl0ZSBiNjQgQ29FQiAvLyAjcHJhZ21hIHZlcnNpb24gMTA7IGludCAxCglkdXAKCWl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCglpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCglpbnQgRGVsZXRlQXBwbGljYXRpb24KCWl0eG5fZmllbGQgT25Db21wbGV0aW9uCglpdHhuX3N1Ym1pdAoKKmlmMjRfZW5kOgoJLy8gKmlmMjVfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MTkKCS8vIHBvb2xTZXRbaV0uaWQgPT09IDAKCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgk9PQoJYnogKmlmMjVfZW5kCgoJLy8gKmlmMjVfY29uc2VxdWVudAoJYiAqZm9yXzNfY29udGludWUKCippZjI1X2VuZDoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyMgoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sID0gZmFsc2UKCWludCAwCglmcmFtZV9idXJ5IDEgLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sCgoJLy8gKmlmMjZfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MjMKCS8vIHBvb2xTZXRbaV0uaWQgPT09IHZhbGlkYXRvcklkCglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgMAoJKwoJaW50IDgKCWV4dHJhY3QzCglidG9pCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJPT0KCWJ6ICppZjI2X2VuZAoKCS8vICppZjI2X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyNQoJLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciA9IGZhbHNlCglpbnQgMAoJZnJhbWVfYnVyeSAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCgkvLyAqaWYyN19jb25kaXRpb24KCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgyNwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1twb29sU2V0W2ldLnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCArCgkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50VG9TdGFrZSA8PQoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4UGVyUG9vbAoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgOCAvLyBoZWFkT2Zmc2V0CgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJKwoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8PQoJYnogKmlmMjdfZW5kCgoJLy8gKmlmMjdfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODMxCgkvLyByZXR1cm4gW3Bvb2xTZXRbaV0sIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IsIGlzTmV3U3Rha2VyVG9Qcm90b2NvbF0KCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWJ5dGUgMHgwMAoJaW50IDAKCWZyYW1lX2RpZyAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCXNldGJpdAoJaW50IDEKCWZyYW1lX2RpZyAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoJc2V0Yml0Cgljb25jYXQKCWIgKmZpbmRQb29sRm9yU3Rha2VyKnJldHVybgoKKmlmMjdfZW5kOgoKKmlmMjZfZW5kOgoKKmZvcl8zX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODE1CgkvLyBpICs9IDEKCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgNCAvLyBpOiB1aW50NjQKCWIgKmZvcl8zCgoqZm9yXzNfZW5kOgoKKmlmMjNfZW5kOgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODM4CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBhbW91bnRUb1N0YWtlID49IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1pbkVudHJ5U3Rha2UsCgkvLyAgICAgICAgICAgICAnbXVzdCBzdGFrZSBhdCBsZWFzdCB0aGUgbWluaW11bSBmb3IgdGhpcyBwb29sJywKCS8vICAgICAgICAgKQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJaW50IDIwOQoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk+PQoKCS8vIG11c3Qgc3Rha2UgYXQgbGVhc3QgdGhlIG1pbmltdW0gZm9yIHRoaXMgcG9vbAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ0CgkvLyBwb29scyA9IGNsb25lKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHMpCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWludCA0MzIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglmcmFtZV9idXJ5IDUgLy8gcG9vbHM6ICh1aW50NjQsdWludDE2LHVpbnQ2NClbMjRdCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ1CgkvLyBjdXJOdW1Qb29scyA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUubnVtUG9vbHMgYXMgdWludDY0CglpbnQgMjQyCglpbnQgMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgNiAvLyBjdXJOdW1Qb29sczogdWludDY0CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ2CgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IGN1ck51bVBvb2xzOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA3IC8vIGk6IHVpbnQ2NAoKKmZvcl80OgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ2CgkvLyBpIDwgY3VyTnVtUG9vbHMKCWZyYW1lX2RpZyA3IC8vIGk6IHVpbnQ2NAoJZnJhbWVfZGlnIDYgLy8gY3VyTnVtUG9vbHM6IHVpbnQ2NAoJPAoJYnogKmZvcl80X2VuZAoKCS8vICppZjI4X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ3CgkvLyBwb29sc1tpXS50b3RhbEFsZ29TdGFrZWQgKyBhbW91bnRUb1N0YWtlIDw9IG1heFBlclBvb2wKCWZyYW1lX2RpZyA1IC8vIHBvb2xzOiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDEwIC8vIGhlYWRPZmZzZXQKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJZnJhbWVfZGlnIC0zIC8vIGFtb3VudFRvU3Rha2U6IHVpbnQ2NAoJKwoJZnJhbWVfZGlnIDIgLy8gbWF4UGVyUG9vbDogdWludDY0Cgk8PQoJYnogKmlmMjhfZW5kCgoJLy8gKmlmMjhfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ4CgkvLyByZXR1cm4gWwoJLy8gICAgICAgICAgICAgICAgICAgICB7IGlkOiB2YWxpZGF0b3JJZCwgcG9vbElkOiBpICsgMSwgcG9vbEFwcElkOiBwb29sc1tpXS5wb29sQXBwSWQgfSwKCS8vICAgICAgICAgICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciwKCS8vICAgICAgICAgICAgICAgICAgICAgaXNOZXdTdGFrZXJUb1Byb3RvY29sLAoJLy8gICAgICAgICAgICAgICAgIF0KCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxCgkrCglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyA1IC8vIHBvb2xzOiAodWludDY0LHVpbnQxNix1aW50NjQpWzI0XQoJZnJhbWVfZGlnIDcgLy8gaTogdWludDY0CglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglieXRlIDB4MDAKCWludCAwCglmcmFtZV9kaWcgMCAvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yOiBib29sCglzZXRiaXQKCWludCAxCglmcmFtZV9kaWcgMSAvLyBpc05ld1N0YWtlclRvUHJvdG9jb2w6IGJvb2wKCXNldGJpdAoJY29uY2F0CgliICpmaW5kUG9vbEZvclN0YWtlcipyZXR1cm4KCippZjI4X2VuZDoKCipmb3JfNF9jb250aW51ZToKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg0NgoJLy8gaSArPSAxCglmcmFtZV9kaWcgNyAvLyBpOiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDcgLy8gaTogdWludDY0CgliICpmb3JfNAoKKmZvcl80X2VuZDoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg1NgoJLy8gcmV0dXJuIFt7IGlkOiB2YWxpZGF0b3JJZCwgcG9vbElkOiAwLCBwb29sQXBwSWQ6IDAgfSwgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciwgaXNOZXdTdGFrZXJUb1Byb3RvY29sXQoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCgljb25jYXQKCWJ5dGUgMHgwMAoJaW50IDAKCWZyYW1lX2RpZyAwIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3I6IGJvb2wKCXNldGJpdAoJaW50IDEKCWZyYW1lX2RpZyAxIC8vIGlzTmV3U3Rha2VyVG9Qcm90b2NvbDogYm9vbAoJc2V0Yml0Cgljb25jYXQKCipmaW5kUG9vbEZvclN0YWtlcipyZXR1cm46CgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCgkvLyBwb3AgYWxsIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHRoZSBzdGFjawoJcG9wbiA3CglyZXRzdWIKCi8vIG1vdmVQb29sVG9Ob2RlKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQKKmFiaV9yb3V0ZV9tb3ZlUG9vbFRvTm9kZToKCS8vIG5vZGVOdW06IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwoJYnRvaQoKCS8vIHBvb2xBcHBJZDogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglidG9pCgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgbW92ZVBvb2xUb05vZGUodWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZAoJY2FsbHN1YiBtb3ZlUG9vbFRvTm9kZQoJaW50IDEKCXJldHVybgoKLy8gbW92ZVBvb2xUb05vZGUodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcG9vbEFwcElkOiB1aW50NjQsIG5vZGVOdW06IHVpbnQ2NCk6IHZvaWQKLy8KLy8gRmluZCB0aGUgc3BlY2lmaWVkIHBvb2wgKGluIGFueSBub2RlIG51bWJlcikgYW5kIG1vdmUgaXQgdG8gdGhlIHNwZWNpZmllZCBub2RlLgovLyBUaGUgcG9vbCBhY2NvdW50IGlzIGZvcmNlZCBvZmZsaW5lIGlmIG1vdmVkIHNvIHByaW9yIG5vZGUgd2lsbCBzdGlsbCBydW4gZm9yIDMyMCByb3VuZHMgYnV0Ci8vIG5ldyBrZXkgZ29lcyBvbmxpbmUgb24gbmV3IG5vZGUgc29vbiBhZnRlciAoMzIwIHJvdW5kcyBhZnRlciBpdCBnb2VzIG9ubGluZSkKLy8gTm8tb3AgaWYgc3VjY2VzcywgYXNzZXJ0cyBpZiBub3QgZm91bmQgb3IgY2FuJ3QgbW92ZSAgKG5vIHNwYWNlIGluIHRhcmdldCkKLy8gWyBPTkxZIE9XTkVSIE9SIE1BTkFHRVIgQ0FOIENIQU5HRSBdCi8vCi8vIEBwYXJhbSB7VmFsaWRhdG9ySWRUeXBlfSB2YWxpZGF0b3JJZCAtIFRoZSBpZCBvZiB0aGUgdmFsaWRhdG9yLgovLyBAcGFyYW0ge3VpbnQ2NH0gcG9vbEFwcElkCi8vIEBwYXJhbSB7dWludDY0fSBub2RlTnVtCm1vdmVQb29sVG9Ob2RlOgoJcHJvdG8gMyAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3MQoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lck9yTWFuYWdlcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyT3JNYW5hZ2VyCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODczCgkvLyBub2RlUG9vbEFzc2lnbm1lbnRzID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5ub2RlUG9vbEFzc2lnbm1lbnRzKQoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfYnVyeSAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzQKCS8vIGFzc2VydChub2RlTnVtID49IDEgJiYgbm9kZU51bSA8PSBNQVhfTk9ERVMsICdub2RlIG51bWJlciBvdXQgb2YgYWxsb3dhYmxlIHJhbmdlJykKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCAxCgk+PQoJZHVwCglieiAqc2tpcF9hbmQyCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgOAoJPD0KCSYmCgoqc2tpcF9hbmQyOgoJLy8gbm9kZSBudW1iZXIgb3V0IG9mIGFsbG93YWJsZSByYW5nZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODc2CgkvLyBmb3IgKGxldCBzcmNOb2RlSWR4ID0gMDsgc3JjTm9kZUlkeCA8IE1BWF9OT0RFUzsgc3JjTm9kZUlkeCArPSAxKQoJaW50IDAKCWZyYW1lX2J1cnkgMSAvLyBzcmNOb2RlSWR4OiB1aW50NjQKCipmb3JfNToKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3NgoJLy8gc3JjTm9kZUlkeCA8IE1BWF9OT0RFUwoJZnJhbWVfZGlnIDEgLy8gc3JjTm9kZUlkeDogdWludDY0CglpbnQgOAoJPAoJYnogKmZvcl81X2VuZAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3NwoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBNQVhfUE9PTFNfUEVSX05PREU7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzY6CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzcKCS8vIGkgPCBNQVhfUE9PTFNfUEVSX05PREUKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDMKCTwKCWJ6ICpmb3JfNl9lbmQKCgkvLyAqaWYyOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3OAoJLy8gbm9kZVBvb2xBc3NpZ25tZW50cy5ub2Rlc1tzcmNOb2RlSWR4XS5wb29sQXBwSWRzW2ldID09PSBwb29sQXBwSWQKCWZyYW1lX2RpZyAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCWludCAwCglmcmFtZV9kaWcgMSAvLyBzcmNOb2RlSWR4OiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMAoJKwoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWZyYW1lX2RpZyAtMiAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJPT0KCWJ6ICppZjI5X2VuZAoKCS8vICppZjI5X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3OQoJLy8gYXNzZXJ0KG5vZGVOdW0gLSAxICE9PSBzcmNOb2RlSWR4LCAiY2FuJ3QgbW92ZSB0byBzYW1lIG5vZGUiKQoJZnJhbWVfZGlnIC0zIC8vIG5vZGVOdW06IHVpbnQ2NAoJaW50IDEKCS0KCWZyYW1lX2RpZyAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJIT0KCgkvLyBjYW4ndCBtb3ZlIHRvIHNhbWUgbm9kZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODgxCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLm5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbc3JjTm9kZUlkeF0ucG9vbEFwcElkc1tpXSA9IDAKCWludCA5MDAKCWZyYW1lX2RpZyAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4NAoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5nb09mZmxpbmU+KHsKCS8vICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKSwKCS8vICAgICAgICAgICAgICAgICAgICAgfSkKCWl0eG5fYmVnaW4KCWludCBhcHBsCglpdHhuX2ZpZWxkIFR5cGVFbnVtCgltZXRob2QgImdvT2ZmbGluZSgpdm9pZCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODg1CgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkKCWZyYW1lX2RpZyAtMiAvLyBwb29sQXBwSWQ6IHVpbnQ2NAoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4OQoJLy8gdGhpcy5hZGRQb29sVG9Ob2RlKHZhbGlkYXRvcklkLCBwb29sQXBwSWQsIG5vZGVOdW0pCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglmcmFtZV9kaWcgLTIgLy8gcG9vbEFwcElkOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGFkZFBvb2xUb05vZGUKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4OTAKCS8vIHJldHVybgoJcmV0c3ViCgoqaWYyOV9lbmQ6CgoqZm9yXzZfY29udGludWU6CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzcKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzYKCipmb3JfNl9lbmQ6CgoqZm9yXzVfY29udGludWU6CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzYKCS8vIHNyY05vZGVJZHggKz0gMQoJZnJhbWVfZGlnIDEgLy8gc3JjTm9kZUlkeDogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAxIC8vIHNyY05vZGVJZHg6IHVpbnQ2NAoJYiAqZm9yXzUKCipmb3JfNV9lbmQ6CgkvLyBjb3VsZG4ndCBmaW5kIHBvb2wgYXBwIGlkIGluIG5vZGVzIHRvIG1vdmUKCWVycgoJcmV0c3ViCgovLyBlbXB0eVRva2VuUmV3YXJkcyh1aW50NjQsYWRkcmVzcyl1aW50NjQKKmFiaV9yb3V0ZV9lbXB0eVRva2VuUmV3YXJkczoKCS8vIFRoZSBBQkkgcmV0dXJuIHByZWZpeAoJYnl0ZSAweDE1MWY3Yzc1CgoJLy8gcmVjZWl2ZXI6IGFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMzIKCT09CgoJLy8gYXJndW1lbnQgMCAocmVjZWl2ZXIpIGZvciBlbXB0eVRva2VuUmV3YXJkcyBtdXN0IGJlIGEgYWRkcmVzcwoJYXNzZXJ0CgoJLy8gdmFsaWRhdG9ySWQ6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJYnRvaQoKCS8vIGV4ZWN1dGUgZW1wdHlUb2tlblJld2FyZHModWludDY0LGFkZHJlc3MpdWludDY0CgljYWxsc3ViIGVtcHR5VG9rZW5SZXdhcmRzCglpdG9iCgljb25jYXQKCWxvZwoJaW50IDEKCXJldHVybgoKLy8gZW1wdHlUb2tlblJld2FyZHModmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcmVjZWl2ZXI6IEFkZHJlc3MpOiB1aW50NjQKLy8KLy8gU2VuZHMgdGhlIHJld2FyZCB0b2tlbnMgaGVsZCBpbiBwb29sIDEgdG8gc3BlY2lmaWVkIHJlY2VpdmVyLgovLyBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgdGhlIG93bmVyIHdoZW4gdGhleSB3YW50IHRvIGdldCByZXdhcmQgdG9rZW5zICdiYWNrJyB3aGljaCB0aGV5IHNlbnQgdG8KLy8gdGhlIGZpcnN0IHBvb2wgKGxpa2VseSBiZWNhdXNlIHZhbGlkYXRvciBpcyBzdW5zZXR0aW5nLiAgQW55IHRva2VucyBjdXJyZW50bHkgJ3Jlc2VydmVkJyBmb3Igc3Rha2VycyB0byBjbGFpbSB3aWxsCi8vIE5PVCBiZSBzZW50IGFzIHRoZXkgbXVzdCBiZSBoZWxkIGJhY2sgZm9yIHN0YWtlcnMgdG8gbGF0ZXIgY2xhaW0uCi8vIFsgT05MWSBPV05FUiBDQU4gQ0FMTF0KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7QWRkcmVzc30gcmVjZWl2ZXIgLSB0aGUgYWNjb3VudCB0byBzZW5kIHRoZSB0b2tlbnMgdG8gKG11c3QgYWxyZWFkeSBiZSBvcHRlZC1pbiB0byB0aGUgcmV3YXJkIHRva2VuKQovLyBAcmV0dXJucyB7dWludDY0fSB0aGUgYW1vdW50IG9mIHJld2FyZCB0b2tlbiBzZW50CmVtcHR5VG9rZW5SZXdhcmRzOgoJcHJvdG8gMiAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMwoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkwOQoJLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lcih2YWxpZGF0b3JJZCkKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCgljYWxsc3ViIGNhbGxlck11c3RCZU93bmVyCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTEwCgkvLyByZXdhcmRUb2tlbklkID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcucmV3YXJkVG9rZW5JZAoJaW50IDE1MwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTExCgkvLyByZXdhcmRUb2tlbkhlbGRCYWNrID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5yZXdhcmRUb2tlbkhlbGRCYWNrCglpbnQgMjYwCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMSAvLyByZXdhcmRUb2tlbkhlbGRCYWNrOiB1aW50NjQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MTIKCS8vIGFzc2VydChyZXdhcmRUb2tlbklkICE9PSAwLCAidGhpcyB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIGEgcmV3YXJkIHRva2VuIGRlZmluZWQiKQoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0CglpbnQgMAoJIT0KCgkvLyB0aGlzIHZhbGlkYXRvciBkb2Vzbid0IGhhdmUgYSByZXdhcmQgdG9rZW4gZGVmaW5lZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTEzCgkvLyBwb29sT25lQXBwSWQgPSBBcHBJRC5mcm9tVWludDY0KHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkKQoJaW50IDI2OAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MTUKCS8vIHRva2VuUmV3YXJkQmFsID0KCS8vICAgICAgICAgICAgIHBvb2xPbmVBcHBJZC5hZGRyZXNzLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JZCkpIC0gcmV3YXJkVG9rZW5IZWxkQmFjawoJZnJhbWVfZGlnIDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCXBvcAoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0Cglhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKCXBvcAoJZnJhbWVfZGlnIDEgLy8gcmV3YXJkVG9rZW5IZWxkQmFjazogdWludDY0CgktCglmcmFtZV9idXJ5IDMgLy8gdG9rZW5SZXdhcmRCYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkxOQoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5wYXlUb2tlblJld2FyZD4oewoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25JRDogcG9vbE9uZUFwcElkLAoJLy8gICAgICAgICAgICAgbWV0aG9kQXJnczogW3JlY2VpdmVyLCByZXdhcmRUb2tlbklkLCB0b2tlblJld2FyZEJhbF0sCgkvLyAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJbWV0aG9kICJwYXlUb2tlblJld2FyZChhZGRyZXNzLHVpbnQ2NCx1aW50NjQpdm9pZCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTIwCgkvLyBhcHBsaWNhdGlvbklEOiBwb29sT25lQXBwSWQKCWZyYW1lX2RpZyAyIC8vIHBvb2xPbmVBcHBJZDogdWludDY0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MjEKCS8vIG1ldGhvZEFyZ3M6IFtyZWNlaXZlciwgcmV3YXJkVG9rZW5JZCwgdG9rZW5SZXdhcmRCYWxdCglmcmFtZV9kaWcgLTIgLy8gcmVjZWl2ZXI6IEFkZHJlc3MKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMCAvLyByZXdhcmRUb2tlbklkOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCglmcmFtZV9kaWcgMyAvLyB0b2tlblJld2FyZEJhbDogdWludDY0CglpdG9iCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIFN1Ym1pdCBpbm5lciB0cmFuc2FjdGlvbgoJaXR4bl9zdWJtaXQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MjMKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHBvb2xPbmVBcHBJZC5hZGRyZXNzLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQocmV3YXJkVG9rZW5JZCkpID09PSByZXdhcmRUb2tlbkhlbGRCYWNrLAoJLy8gICAgICAgICAgICAgJ2JhbGFuY2Ugb2YgcmVtYWluaW5nIHJld2FyZCB0b2tlbnMgc2hvdWxkIG1hdGNoIHRoZSBoZWxkIGJhY2sgYW1vdW50JywKCS8vICAgICAgICAgKQoJZnJhbWVfZGlnIDIgLy8gcG9vbE9uZUFwcElkOiB1aW50NjQKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCXBvcAoJZnJhbWVfZGlnIDAgLy8gcmV3YXJkVG9rZW5JZDogdWludDY0Cglhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKCXBvcAoJZnJhbWVfZGlnIDEgLy8gcmV3YXJkVG9rZW5IZWxkQmFjazogdWludDY0Cgk9PQoKCS8vIGJhbGFuY2Ugb2YgcmVtYWluaW5nIHJld2FyZCB0b2tlbnMgc2hvdWxkIG1hdGNoIHRoZSBoZWxkIGJhY2sgYW1vdW50Cglhc3NlcnQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MjcKCS8vIHJldHVybiB0b2tlblJld2FyZEJhbAoJZnJhbWVfZGlnIDMgLy8gdG9rZW5SZXdhcmRCYWw6IHVpbnQ2NAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDMKCXJldHN1YgoKLy8gY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IHZvaWQKY2FsbGVyTXVzdEJlT3duZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDIwCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICB0aGlzLnR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLAoJLy8gICAgICAgICAgICAgJ2NhbiBvbmx5IGJlIGNhbGxlZCBieSB2YWxpZGF0b3Igb3duZXInLAoJLy8gICAgICAgICApCgl0eG4gU2VuZGVyCglpbnQgOAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJPT0KCgkvLyBjYW4gb25seSBiZSBjYWxsZWQgYnkgdmFsaWRhdG9yIG93bmVyCglhc3NlcnQKCXJldHN1YgoKLy8gY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXIodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IHZvaWQKY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDI3CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICB0aGlzLnR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyIHx8CgkvLyAgICAgICAgICAgICAgICAgdGhpcy50eG4uc2VuZGVyID09PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5tYW5hZ2VyLAoJLy8gICAgICAgICAgICAgJ2NhbiBvbmx5IGJlIGNhbGxlZCBieSBvd25lciBvciBtYW5hZ2VyIG9mIHZhbGlkYXRvcicsCgkvLyAgICAgICAgICkKCXR4biBTZW5kZXIKCWludCA4CglpbnQgMzIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0Cgk9PQoJZHVwCglibnogKnNraXBfb3IzCgl0eG4gU2VuZGVyCglpbnQgNDAKCWludCAzMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCT09Cgl8fAoKKnNraXBfb3IzOgoJLy8gY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IG93bmVyIG9yIG1hbmFnZXIgb2YgdmFsaWRhdG9yCglhc3NlcnQKCXJldHN1YgoKLy8gdmVyaWZ5UG9vbEtleUNhbGxlcihwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5KTogdm9pZAovLwovLyB2ZXJpZnlQb29sS2V5Q2FsbGVyIHZlcmlmaWVzIHRoZSBwYXNzZWQgaW4ga2V5IChmcm9tIGEgc3Rha2luZyBwb29sIGNhbGxpbmcgdXMgdG8gdXBkYXRlIG1ldHJpY3MpIGlzIHZhbGlkCi8vIGFuZCBtYXRjaGVzIHRoZSBpbmZvcm1hdGlvbiB3ZSBoYXZlIGluIG91ciBzdGF0ZS4gICdGYWtlJyBwb29scyBjb3VsZCBjYWxsIHVzIHRvIHVwZGF0ZSBvdXIgZGF0YSwgYnV0IHRoZXkKLy8gY2FuJ3QgZmFrZSB0aGUgaWRzIGFuZCBtb3N0IGltcG9ydGFudGx5IGFwcGxpY2F0aW9uIGlkKCEpIG9mIHRoZSBjYWxsZXIgdGhhdCBoYXMgdG8gbWF0Y2guCnZlcmlmeVBvb2xLZXlDYWxsZXI6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDQwCgkvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLmV4aXN0cywgInRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGlzbid0IHZhbGlkIikKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cglib3hfbGVuCglzd2FwCglwb3AKCgkvLyB0aGUgc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBpc24ndCB2YWxpZAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA0MQoJLy8gYXNzZXJ0KHBvb2xLZXkucG9vbElkIDw9IE1BWF9QT09MUywgJ3Bvb2wgaWQgbm90IGluIHZhbGlkIHJhbmdlJykKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDI0Cgk8PQoKCS8vIHBvb2wgaWQgbm90IGluIHZhbGlkIHJhbmdlCglhc3NlcnQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDQyCgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBwb29sS2V5LnBvb2xJZCA+IDAgJiYgKHBvb2xLZXkucG9vbElkIGFzIHVpbnQxNikgPD0gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLm51bVBvb2xzLAoJLy8gICAgICAgICAgICAgJ3Bvb2wgaWQgb3V0c2lkZSBvZiByYW5nZSBvZiBwb29scyBjcmVhdGVkIGZvciB0aGlzIHZhbGlkYXRvcicsCgkvLyAgICAgICAgICkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDAKCT4KCWR1cAoJYnogKnNraXBfYW5kMwoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMjQyCglpbnQgMgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk8PQoJJiYKCipza2lwX2FuZDM6CgkvLyBwb29sIGlkIG91dHNpZGUgb2YgcmFuZ2Ugb2YgcG9vbHMgY3JlYXRlZCBmb3IgdGhpcyB2YWxpZGF0b3IKCWFzc2VydAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNDgKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIHBvb2xLZXkucG9vbEFwcElkID09PSB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbcG9vbEtleS5wb29sSWQgLSAxXS5wb29sQXBwSWQsCgkvLyAgICAgICAgICAgICAiVGhlIHBhc3NlZCBpbiBhcHAgaWQgZG9lc24ndCBtYXRjaCB0aGUgcGFzc2VkIGluIGlkcyIsCgkvLyAgICAgICAgICkKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWludCAyNjggLy8gaGVhZE9mZnNldAoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgOCA4CglidG9pCglpbnQgMQoJLQoJaW50IDE4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglpbnQgOAoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCgk9PQoKCS8vIFRoZSBwYXNzZWQgaW4gYXBwIGlkIGRvZXNuJ3QgbWF0Y2ggdGhlIHBhc3NlZCBpbiBpZHMKCWFzc2VydAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNTMKCS8vIGFzc2VydCh0aGlzLnR4bi5zZW5kZXIgPT09IEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLmFkZHJlc3MpCgl0eG4gU2VuZGVyCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAxNiA4CglidG9pCglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCT09Cglhc3NlcnQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDU1CgkvLyBhc3NlcnQocG9vbEtleS5pZCA9PT0gKEFwcElELmZyb21VaW50NjQocG9vbEtleS5wb29sQXBwSWQpLmdsb2JhbFN0YXRlKCd2YWxpZGF0b3JJZCcpIGFzIHVpbnQ2NCkpCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWJ5dGUgMHg3NjYxNmM2OTY0NjE3NDZmNzI0OTY0IC8vICJ2YWxpZGF0b3JJZCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgndmFsaWRhdG9ySWQnKQoJYXNzZXJ0Cgk9PQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA1NgoJLy8gYXNzZXJ0KHBvb2xLZXkucG9vbElkID09PSAoQXBwSUQuZnJvbVVpbnQ2NChwb29sS2V5LnBvb2xBcHBJZCkuZ2xvYmFsU3RhdGUoJ3Bvb2xJZCcpIGFzIHVpbnQ2NCkpCglmcmFtZV9kaWcgLTEgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWZyYW1lX2RpZyAtMSAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDE2IDgKCWJ0b2kKCWJ5dGUgMHg3MDZmNmY2YzQ5NjQgLy8gInBvb2xJZCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xLZXkucG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgncG9vbElkJykKCWFzc2VydAoJPT0KCWFzc2VydAoJcmV0c3ViCgovLyByZXZlcmlmeU5GRE93bmVyc2hpcCh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogdm9pZAovLwovLyBUaGlzIG1ldGhvZCB2ZXJpZmllcyB0aGUgb3duZXJzaGlwIG9mIE5GRCAoTmFtZWQgRnVuY3Rpb24gRGF0YSkgYnkgYSB2YWxpZGF0b3IuCi8vIElmIHRoZSBvd25lcnNoaXAgaXMgbm8gbG9uZ2VyIHZhbGlkLCBpdCByZW1vdmVzIHRoZSBORkQgZnJvbSB0aGUgdmFsaWRhdG9yJ3MgY29uZmlndXJhdGlvbi4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3Igd2hvc2UgZGF0YSBzaG91bGQgYmUgcmUtZXZhbHVhdGVkLgpyZXZlcmlmeU5GRE93bmVyc2hpcDoKCXByb3RvIDEgMAoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXAKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDY2CgkvLyB2YWxpZGF0b3JDb25maWcgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZwoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJZnJhbWVfYnVyeSAwIC8vIHN0b3JhZ2Uga2V5Ly92YWxpZGF0b3JDb25maWcKCgkvLyAqaWYzMF9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNjcKCS8vIHZhbGlkYXRvckNvbmZpZy5uZmRGb3JJbmZvICE9PSAwCglpbnQgNzIKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJaW50IDAKCSE9CglieiAqaWYzMF9lbmQKCgkvLyAqaWYzMF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDcwCgkvLyBuZmRPd25lciA9IEFwcElELmZyb21VaW50NjQodmFsaWRhdG9yQ29uZmlnLm5mZEZvckluZm8pLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzCglpbnQgNzIKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQodmFsaWRhdG9yQ29uZmlnLm5mZEZvckluZm8pLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCgkvLyAqaWYzMV9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNzIKCS8vIHZhbGlkYXRvckNvbmZpZy5vd25lciAhPT0gbmZkT3duZXIgJiYgdmFsaWRhdG9yQ29uZmlnLm1hbmFnZXIgIT09IG5mZE93bmVyCglpbnQgOAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfZGlnIDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCSE9CglkdXAKCWJ6ICpza2lwX2FuZDQKCWludCA0MAoJaW50IDMyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfZGlnIDEgLy8gbmZkT3duZXI6IGFkZHJlc3MKCSE9CgkmJgoKKnNraXBfYW5kNDoKCWJ6ICppZjMxX2VuZAoKCS8vICppZjMxX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNzQKCS8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm5mZEZvckluZm8gPSAwCglpbnQgNzIKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKKmlmMzFfZW5kOgoKKmlmMzBfZW5kOgoJcmV0c3ViCgovLyB2YWxpZGF0ZUNvbmZpZyhjb25maWc6IFZhbGlkYXRvckNvbmZpZyk6IHZvaWQKdmFsaWRhdGVDb25maWc6Cglwcm90byAxIDAKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDgxCgkvLyBhc3NlcnQoY29uZmlnLm93bmVyICE9PSBBZGRyZXNzLnplcm9BZGRyZXNzKQoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDggMzIKCWdsb2JhbCBaZXJvQWRkcmVzcwoJIT0KCWFzc2VydAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwODIKCS8vIGFzc2VydChjb25maWcubWFuYWdlciAhPT0gQWRkcmVzcy56ZXJvQWRkcmVzcykKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA0MCAzMgoJZ2xvYmFsIFplcm9BZGRyZXNzCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA4MwoJLy8gYXNzZXJ0KHRoaXMudHhuLnNlbmRlciA9PT0gY29uZmlnLm93bmVyLCAnc2VuZGVyIG11c3QgYmUgb3duZXIgdG8gYWRkIG5ldyB2YWxpZGF0b3InKQoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDggMzIKCT09CgoJLy8gc2VuZGVyIG11c3QgYmUgb3duZXIgdG8gYWRkIG5ldyB2YWxpZGF0b3IKCWFzc2VydAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwODUKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIGNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPj0gR0FUSU5HX1RZUEVfTk9ORSAmJiBjb25maWcuZW50cnlHYXRpbmdUeXBlIDw9IEdBVElOR19UWVBFX0NPTlNUX01BWCwKCS8vICAgICAgICAgICAgICdnYXRpbmcgdHlwZSBub3QgdmFsaWQnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgODAgMQoJYnRvaQoJaW50IDAKCT49CglkdXAKCWJ6ICpza2lwX2FuZDUKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCA4MCAxCglidG9pCglpbnQgNAoJPD0KCSYmCgoqc2tpcF9hbmQ1OgoJLy8gZ2F0aW5nIHR5cGUgbm90IHZhbGlkCglhc3NlcnQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDg5CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICBjb25maWcuZXBvY2hSb3VuZExlbmd0aCA+PSBNSU5fRVBPQ0hfTEVOR1RIICYmIGNvbmZpZy5lcG9jaFJvdW5kTGVuZ3RoIDw9IE1BWF9FUE9DSF9MRU5HVEgsCgkvLyAgICAgICAgICAgICAnZXBvY2ggbGVuZ3RoIG5vdCBpbiBhbGxvd2FibGUgcmFuZ2UnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTY5IDQKCWJ0b2kKCWludCAxCgk+PQoJZHVwCglieiAqc2tpcF9hbmQ2CglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTY5IDQKCWJ0b2kKCWludCAxMDAwMDAwCgk8PQoJJiYKCipza2lwX2FuZDY6CgkvLyBlcG9jaCBsZW5ndGggbm90IGluIGFsbG93YWJsZSByYW5nZQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA5MwoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgY29uZmlnLnBlcmNlbnRUb1ZhbGlkYXRvciA+PSBNSU5fUENUX1RPX1ZBTElEQVRPUiAmJiBjb25maWcucGVyY2VudFRvVmFsaWRhdG9yIDw9IE1BWF9QQ1RfVE9fVkFMSURBVE9SLAoJLy8gICAgICAgICAgICAgJ2NvbW1pc3Npb24gcGVyY2VudGFnZSBub3QgdmFsaWQnLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTczIDQKCWJ0b2kKCWludCAwCgk+PQoJZHVwCglieiAqc2tpcF9hbmQ3CglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTczIDQKCWJ0b2kKCWludCAxMDAwMDAwCgk8PQoJJiYKCipza2lwX2FuZDc6CgkvLyBjb21taXNzaW9uIHBlcmNlbnRhZ2Ugbm90IHZhbGlkCglhc3NlcnQKCgkvLyAqaWYzMl9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwOTcKCS8vIGNvbmZpZy5wZXJjZW50VG9WYWxpZGF0b3IgIT09IDAKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAxNzMgNAoJYnRvaQoJaW50IDAKCSE9CglieiAqaWYzMl9lbmQKCgkvLyAqaWYzMl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDk4CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgY29uZmlnLnZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzICE9PSBBZGRyZXNzLnplcm9BZGRyZXNzLAoJLy8gICAgICAgICAgICAgICAgICd2YWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyBtdXN0IGJlIHNldCBpZiBwZXJjZW50IHRvIHZhbGlkYXRvciBpcyBub3QgMCcsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMTc3IDMyCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CgoJLy8gdmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MgbXVzdCBiZSBzZXQgaWYgcGVyY2VudCB0byB2YWxpZGF0b3IgaXMgbm90IDAKCWFzc2VydAoKKmlmMzJfZW5kOgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEwMwoJLy8gYXNzZXJ0KGNvbmZpZy5taW5FbnRyeVN0YWtlID49IE1JTl9BTEdPX1NUQUtFX1BFUl9QT09MLCAnc3Rha2luZyBwb29sIG11c3QgaGF2ZSBtaW5pbXVtIGVudHJ5IG9mIDEgYWxnbycpCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMjA5IDgKCWJ0b2kKCWludCAxMDAwMDAwCgk+PQoKCS8vIHN0YWtpbmcgcG9vbCBtdXN0IGhhdmUgbWluaW11bSBlbnRyeSBvZiAxIGFsZ28KCWFzc2VydAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMDUKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgIGNvbmZpZy5wb29sc1Blck5vZGUgPiAwICYmIGNvbmZpZy5wb29sc1Blck5vZGUgPD0gTUFYX1BPT0xTX1BFUl9OT0RFLAoJLy8gICAgICAgICAgICAgJ251bWJlciBvZiBwb29scyBwZXIgbm9kZSBtdXN0IGJlIGJlIGJldHdlZW4gMSBhbmQgdGhlIG1heGltdW0gYWxsb3dlZCBudW1iZXInLAoJLy8gICAgICAgICApCglmcmFtZV9kaWcgLTEgLy8gY29uZmlnOiBWYWxpZGF0b3JDb25maWcKCWV4dHJhY3QgMjI1IDEKCWJ0b2kKCWludCAwCgk+CglkdXAKCWJ6ICpza2lwX2FuZDgKCWZyYW1lX2RpZyAtMSAvLyBjb25maWc6IFZhbGlkYXRvckNvbmZpZwoJZXh0cmFjdCAyMjUgMQoJYnRvaQoJaW50IDMKCTw9CgkmJgoKKnNraXBfYW5kODoKCS8vIG51bWJlciBvZiBwb29scyBwZXIgbm9kZSBtdXN0IGJlIGJlIGJldHdlZW4gMSBhbmQgdGhlIG1heGltdW0gYWxsb3dlZCBudW1iZXIKCWFzc2VydAoKCS8vICppZjMzX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEwOQoJLy8gY29uZmlnLnN1bnNldHRpbmdPbiAhPT0gMAoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDIyNiA4CglidG9pCglpbnQgMAoJIT0KCWJ6ICppZjMzX2VuZAoKCS8vICppZjMzX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMTAKCS8vIGFzc2VydChjb25maWcuc3Vuc2V0dGluZ09uID4gZ2xvYmFscy5sYXRlc3RUaW1lc3RhbXAsICdzdW5zZXR0aW5nT24gbXVzdCBiZSBsYXRlciB0aGFuIG5vdyBpZiBzZXQnKQoJZnJhbWVfZGlnIC0xIC8vIGNvbmZpZzogVmFsaWRhdG9yQ29uZmlnCglleHRyYWN0IDIyNiA4CglidG9pCglnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCgk+CgoJLy8gc3Vuc2V0dGluZ09uIG11c3QgYmUgbGF0ZXIgdGhhbiBub3cgaWYgc2V0Cglhc3NlcnQKCippZjMzX2VuZDoKCXJldHN1YgoKLy8gY2FsbFBvb2xBZGRTdGFrZShzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4sIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXksIG1ickFtdFBhaWQ6IHVpbnQ2NCwgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbGVhbiwgaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sZWFuKTogdm9pZAovLwovLyBBZGRzIGEgc3Rha2VycyBhbW91bnQgb2YgYWxnbyB0byBhIHZhbGlkYXRvciBwb29sLCB0cmFuc2ZlcnJpbmcgdGhlIGFsZ28gd2UgcmVjZWl2ZWQgZnJvbSB0aGVtIChhbHJlYWR5IHZlcmlmaWVkCi8vIGJ5IG91ciBjYWxsZXIpIHRvIHRoZSBzdGFraW5nIHBvb2wgYWNjb3VudCwgYW5kIHRoZW4gdGVsbGluZyBpdCBhYm91dCB0aGUgYW1vdW50IGJlaW5nIGFkZGVkIGZvciB0aGUgc3BlY2lmaWVkCi8vIHN0YWtlci4KLy8KLy8gQHBhcmFtIHtQYXlUeG59IHN0YWtlZEFtb3VudFBheW1lbnQgLSBwYXltZW50IGNvbWluZyBmcm9tIHN0YWtlciB0byBwbGFjZSBpbnRvIGEgcG9vbAovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBUaGUga2V5IG9mIHRoZSB2YWxpZGF0b3IgcG9vbC4KLy8gQHBhcmFtIHt1aW50NjR9IG1ickFtdFBhaWQgLSBBbW91bnQgdGhlIHVzZXIgaXMgbGVhdmluZyBiZWhpbmQgaW4gdGhlIHZhbGlkYXRvciB0byBwYXkgZm9yIHRoZWlyIHN0YWtlciBNQlIgY29zdAovLyBAcGFyYW0ge2Jvb2xlYW59IGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IgLSBpZiB0aGlzIGlzIGEgbmV3LCBmaXJzdC10aW1lIHN0YWtlciB0byB0aGUgdmFsaWRhdG9yCi8vIEBwYXJhbSB7Ym9vbGVhbn0gaXNOZXdTdGFrZXJUb1Byb3RvY29sIC0gaWYgdGhpcyBpcyBhIG5ldywgZmlyc3QtdGltZSBzdGFrZXIgdG8gdGhlIHByb3RvY29sCmNhbGxQb29sQWRkU3Rha2U6Cglwcm90byA1IDAKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiAyCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEzMgoJLy8gcG9vbEFwcElkID0gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzW3Bvb2xLZXkucG9vbElkIC0gMV0ucG9vbEFwcElkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMAoJKwoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAwIC8vIHBvb2xBcHBJZDogdWludDY0CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEzNgoJLy8gc2VuZE1ldGhvZENhbGw8dHlwZW9mIFN0YWtpbmdQb29sLnByb3RvdHlwZS5hZGRTdGFrZSwgdWludDY0Pih7CgkvLyAgICAgICAgICAgICBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCksCgkvLyAgICAgICAgICAgICBtZXRob2RBcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gPT09PT09PQoJLy8gICAgICAgICAgICAgICAgIC8vIFRISVMgSVMgQSBTRU5EIG9mIHRoZSBhbW91bnQgcmVjZWl2ZWQgcmlnaHQgYmFjayBvdXQgYW5kIGludG8gdGhlIHN0YWtpbmcgcG9vbCBjb250cmFjdCBhY2NvdW50LgoJLy8gICAgICAgICAgICAgICAgIHsgYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQsIHJlY2VpdmVyOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuYWRkcmVzcyB9LAoJLy8gICAgICAgICAgICAgICAgIC8vID09PT09PT0KCS8vICAgICAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LnNlbmRlciwKCS8vICAgICAgICAgICAgIF0sCgkvLyAgICAgICAgIH0pCglpdHhuX2JlZ2luCglpbnQgcGF5CglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE0MQoJLy8gYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIEFtb3VudAoJZnJhbWVfZGlnIC0zIC8vIG1ickFtdFBhaWQ6IHVpbnQ2NAoJLQoJaXR4bl9maWVsZCBBbW91bnQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTQxCgkvLyByZWNlaXZlcjogQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmFkZHJlc3MKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglwb3AKCWl0eG5fZmllbGQgUmVjZWl2ZXIKCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCWl0eG5fbmV4dAoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAiYWRkU3Rha2UocGF5LGFkZHJlc3MpdWludDY0IgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTM3CgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTM4CgkvLyBtZXRob2RBcmdzOiBbCgkvLyAgICAgICAgICAgICAgICAgLy8gPT09PT09PQoJLy8gICAgICAgICAgICAgICAgIC8vIFRISVMgSVMgQSBTRU5EIG9mIHRoZSBhbW91bnQgcmVjZWl2ZWQgcmlnaHQgYmFjayBvdXQgYW5kIGludG8gdGhlIHN0YWtpbmcgcG9vbCBjb250cmFjdCBhY2NvdW50LgoJLy8gICAgICAgICAgICAgICAgIHsgYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQsIHJlY2VpdmVyOiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuYWRkcmVzcyB9LAoJLy8gICAgICAgICAgICAgICAgIC8vID09PT09PT0KCS8vICAgICAgICAgICAgICAgICBzdGFrZWRBbW91bnRQYXltZW50LnNlbmRlciwKCS8vICAgICAgICAgICAgIF0KCWZyYW1lX2RpZyAtMSAvLyBzdGFrZWRBbW91bnRQYXltZW50OiBQYXlUeG4KCWd0eG5zIFNlbmRlcgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCgkvLyBTdWJtaXQgaW5uZXIgdHJhbnNhY3Rpb24KCWl0eG5fc3VibWl0CglpdHhuIE51bUxvZ3MKCWludCAxCgktCglpdHhuYXMgTG9ncwoJZXh0cmFjdCA0IDAKCWJ0b2kKCgkvLyAqaWYzNF9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNDYKCS8vIGdsb2JhbHMub3Bjb2RlQnVkZ2V0IDwgNTAwCglnbG9iYWwgT3Bjb2RlQnVkZ2V0CglpbnQgNTAwCgk8CglieiAqaWYzNF9lbmQKCgkvLyAqaWYzNF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTQ3CgkvLyBpbmNyZWFzZU9wY29kZUJ1ZGdldCgpCglpdHhuX2JlZ2luCglpbnQgYXBwbAoJaXR4bl9maWVsZCBUeXBlRW51bQoJaW50IDAKCWl0eG5fZmllbGQgRmVlCglieXRlIGI2NCBDb0VCIC8vICNwcmFnbWEgdmVyc2lvbiAxMDsgaW50IDEKCWR1cAoJaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KCWl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KCWludCBEZWxldGVBcHBsaWNhdGlvbgoJaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KCWl0eG5fc3VibWl0CgoqaWYzNF9lbmQ6CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTUxCgkvLyBwb29sTnVtU3Rha2VycyA9IEFwcElELmZyb21VaW50NjQocG9vbEFwcElkKS5nbG9iYWxTdGF0ZSgnbnVtU3Rha2VycycpIGFzIHVpbnQ2NAoJZnJhbWVfZGlnIDAgLy8gcG9vbEFwcElkOiB1aW50NjQKCWJ5dGUgMHg2ZTc1NmQ1Mzc0NjE2YjY1NzI3MyAvLyAibnVtU3Rha2VycyIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHBvb2xBcHBJZCkuZ2xvYmFsU3RhdGUoJ251bVN0YWtlcnMnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDEgLy8gcG9vbE51bVN0YWtlcnM6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNTIKCS8vIHBvb2xBbGdvU3Rha2VkID0gQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmdsb2JhbFN0YXRlKCdzdGFrZWQnKSBhcyB1aW50NjQKCWZyYW1lX2RpZyAwIC8vIHBvb2xBcHBJZDogdWludDY0CglieXRlIDB4NzM3NDYxNmI2NTY0IC8vICJzdGFrZWQiCglhcHBfZ2xvYmFsX2dldF9leAoKCS8vIGdsb2JhbCBzdGF0ZSB2YWx1ZSBkb2VzIG5vdCBleGlzdDogQXBwSUQuZnJvbVVpbnQ2NChwb29sQXBwSWQpLmdsb2JhbFN0YXRlKCdzdGFrZWQnKQoJYXNzZXJ0CglmcmFtZV9idXJ5IDIgLy8gcG9vbEFsZ29TdGFrZWQ6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNTMKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsU3Rha2VycyA9IHBvb2xOdW1TdGFrZXJzIGFzIHVpbnQxNgoJaW50IDI2OCAvLyBoZWFkT2Zmc2V0CglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCA4IDgKCWJ0b2kKCWludCAxCgktCglpbnQgMTgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDggLy8gaGVhZE9mZnNldAoJKwoJZnJhbWVfZGlnIDEgLy8gcG9vbE51bVN0YWtlcnM6IHVpbnQ2NAoJaXRvYgoJZXh0cmFjdCA2IDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNTQKCS8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCA9IHBvb2xBbGdvU3Rha2VkCglpbnQgMjY4IC8vIGhlYWRPZmZzZXQKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDggOAoJYnRvaQoJaW50IDEKCS0KCWludCAxOAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCgkrCglpbnQgMTAgLy8gaGVhZE9mZnNldAoJKwoJZnJhbWVfZGlnIDIgLy8gcG9vbEFsZ29TdGFrZWQ6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0yIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCWV4dHJhY3QgMCA4CglidG9pCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9yZXBsYWNlCgoJLy8gKmlmMzVfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTU3CgkvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yCglmcmFtZV9kaWcgLTQgLy8gaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcjogYm9vbGVhbgoJYnogKmlmMzVfZW5kCgoJLy8gKmlmMzVfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE1OAoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsU3Rha2VycyArPSAxCglpbnQgMjQ0CglkdXAKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWludCAxCgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCippZjM1X2VuZDoKCS8vICppZjM2X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE2MAoJLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sCglmcmFtZV9kaWcgLTUgLy8gaXNOZXdTdGFrZXJUb1Byb3RvY29sOiBib29sZWFuCglieiAqaWYzNl9lbmQKCgkvLyAqaWYzNl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTYxCgkvLyB0aGlzLm51bVN0YWtlcnMudmFsdWUgKz0gMQoJYnl0ZSAweDZlNzU2ZDUzNzQ2MTZiNjU3MjczIC8vICJudW1TdGFrZXJzIgoJYXBwX2dsb2JhbF9nZXQKCWludCAxCgkrCglieXRlIDB4NmU3NTZkNTM3NDYxNmI2NTcyNzMgLy8gIm51bVN0YWtlcnMiCglzd2FwCglhcHBfZ2xvYmFsX3B1dAoKKmlmMzZfZW5kOgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE2MwoJLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnRvdGFsQWxnb1N0YWtlZCArPSBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWludCAyNTIKCWR1cAoJaW50IDgKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5CglleHRyYWN0IDAgOAoJYnRvaQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlZEFtb3VudFBheW1lbnQ6IFBheVR4bgoJZ3R4bnMgQW1vdW50CglmcmFtZV9kaWcgLTMgLy8gbWJyQW10UGFpZDogdWludDY0CgktCgkrCglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X3JlcGxhY2UKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTY0CgkvLyB0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSArPSBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCWFwcF9nbG9iYWxfZ2V0CglmcmFtZV9kaWcgLTEgLy8gc3Rha2VkQW1vdW50UGF5bWVudDogUGF5VHhuCglndHhucyBBbW91bnQKCWZyYW1lX2RpZyAtMyAvLyBtYnJBbXRQYWlkOiB1aW50NjQKCS0KCSsKCWJ5dGUgMHg3Mzc0NjE2YjY1NjQgLy8gInN0YWtlZCIKCXN3YXAKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCi8vIHVwZGF0ZVN0YWtlclBvb2xTZXQoc3Rha2VyOiBBZGRyZXNzLCBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5KTogdm9pZAp1cGRhdGVTdGFrZXJQb29sU2V0OgoJcHJvdG8gMiAwCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjgKCS8vIGFzc2VydCh0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS5leGlzdHMpCglieXRlIDB4NzM3MDczIC8vICJzcHMiCglmcmFtZV9kaWcgLTEgLy8gc3Rha2VyOiBBZGRyZXNzCgljb25jYXQKCWJveF9sZW4KCXN3YXAKCXBvcAoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE3MAoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDAgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNzEKCS8vIGZpcnN0RW1wdHkgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNzIKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoKKmZvcl83OgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE3MgoJLy8gaSA8IHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlLmxlbmd0aAoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl83X2VuZAoKCS8vICppZjM3X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE3MwoJLy8gcG9vbFNldFtpXSA9PT0gcG9vbEtleQoJZnJhbWVfZGlnIDAgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDI0CglleHRyYWN0MwoJZnJhbWVfZGlnIC0yIC8vIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkKCT09CglieiAqaWYzN19lbmQKCgkvLyAqaWYzN19jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTc1CgkvLyByZXR1cm4KCXJldHN1YgoKKmlmMzdfZW5kOgoJLy8gKmlmMzhfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTc3CgkvLyBmaXJzdEVtcHR5ID09PSAwICYmIHBvb2xTZXRbaV0uaWQgPT09IDAKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDAKCT09CglkdXAKCWJ6ICpza2lwX2FuZDkKCWZyYW1lX2RpZyAwIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAwCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWludCAwCgk9PQoJJiYKCipza2lwX2FuZDk6CglieiAqaWYzOF9lbmQKCgkvLyAqaWYzOF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTc4CgkvLyBmaXJzdEVtcHR5ID0gaSArIDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMSAvLyBmaXJzdEVtcHR5OiB1aW50NjQKCippZjM4X2VuZDoKCipmb3JfN19jb250aW51ZToKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNzIKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAyIC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzcKCipmb3JfN19lbmQ6CgkvLyAqaWYzOV9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExODEKCS8vIGZpcnN0RW1wdHkgPT09IDAKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDAKCT09CglieiAqaWYzOV9lbmQKCgkvLyAqaWYzOV9jb25zZXF1ZW50CgkvLyBObyBlbXB0eSBzbG90IGF2YWlsYWJsZSBpbiB0aGUgc3Rha2VyIHBvb2wgc2V0CgllcnIKCippZjM5X2VuZDoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExODQKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlW2ZpcnN0RW1wdHkgLSAxXSA9IHBvb2xLZXkKCWZyYW1lX2RpZyAxIC8vIGZpcnN0RW1wdHk6IHVpbnQ2NAoJaW50IDEKCS0KCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJcmV0c3ViCgovLyByZW1vdmVGcm9tU3Rha2VyUG9vbFNldChzdGFrZXI6IEFkZHJlc3MsIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkpOiBbYm9vbGVhbiwgYm9vbGVhbl0KLy8KLy8gUmVtb3ZlcyBhIHBvb2wga2V5IGZyb20gdGhlIHN0YWtlcidzIGFjdGl2ZSBwb29sIHNldCAtIGZhaWxzIGlmIG5vdCBmb3VuZCAoISkKLy8KLy8gQHBhcmFtIHtBZGRyZXNzfSBzdGFrZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgc3Rha2VyLgovLyBAcGFyYW0ge1ZhbGlkYXRvclBvb2xLZXl9IHBvb2xLZXkgLSBUaGUgcG9vbCBrZXkgdGhleSBzaG91bGQgYmUgc3RvcmVkIGluCi8vCi8vIEByZXR1cm4gW2Jvb2xlYW4sIGJvb2xlYW5dIFtpcyB0aGUgc3Rha2VyIGdvbmUgZnJvbSBBTEwgcG9vbHMgb2YgdGhlIGdpdmVuIFZBTElEQVRPUiwgYW5kIGlzIHN0YWtlciBnb25lIGZyb20gQUxMIHBvb2xzXQpyZW1vdmVGcm9tU3Rha2VyUG9vbFNldDoKCXByb3RvIDIgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTk3CgkvLyBpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAwIC8vIGluU2FtZVZhbGlkYXRvclBvb2xDb3VudDogdWludDY0CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5OAoJLy8gaW5BbnlQb29sQ291bnQgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAxIC8vIGluQW55UG9vbENvdW50OiB1aW50NjQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTk5CgkvLyBmb3VuZCA9IGZhbHNlCglpbnQgMAoJZnJhbWVfYnVyeSAyIC8vIGZvdW5kOiBib29sCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwMQoJLy8gcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cglib3hfZ2V0CgoJLy8gYm94IHZhbHVlIGRvZXMgbm90IGV4aXN0OiB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZQoJYXNzZXJ0CglmcmFtZV9idXJ5IDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDIKCS8vIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUubGVuZ3RoOyBpICs9IDEpCglpbnQgMAoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoKKmZvcl84OgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwMgoJLy8gaSA8IHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlLmxlbmd0aAoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgNgoJPAoJYnogKmZvcl84X2VuZAoKCS8vICppZjQwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwMwoJLy8gcG9vbFNldFtpXS5pZCA9PT0gMAoJZnJhbWVfZGlnIDMgLy8gcG9vbFNldDogKHVpbnQ2NCx1aW50NjQsdWludDY0KVs2XQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJaW50IDAKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWY0MF9lbmQKCgkvLyAqaWY0MF9jb25zZXF1ZW50CgliICpmb3JfOF9jb250aW51ZQoKKmlmNDBfZW5kOgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwNgoJLy8gaW5BbnlQb29sQ291bnQgKz0gMQoJZnJhbWVfZGlnIDEgLy8gaW5BbnlQb29sQ291bnQ6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMSAvLyBpbkFueVBvb2xDb3VudDogdWludDY0CgoJLy8gKmlmNDFfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjA3CgkvLyBwb29sU2V0W2ldLmlkID09PSBwb29sS2V5LmlkCglmcmFtZV9kaWcgMyAvLyBwb29sU2V0OiAodWludDY0LHVpbnQ2NCx1aW50NjQpWzZdCglmcmFtZV9kaWcgNCAvLyBpOiB1aW50NjQKCWludCAyNAoJKiAvLyBhY2MgKiB0eXBlTGVuZ3RoCglpbnQgMAoJKwoJaW50IDgKCWV4dHJhY3QzCglidG9pCglmcmFtZV9kaWcgLTIgLy8gcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleQoJZXh0cmFjdCAwIDgKCWJ0b2kKCT09CglieiAqaWY0MV9lbmQKCgkvLyAqaWY0MV9jb25zZXF1ZW50CgkvLyAqaWY0Ml9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDgKCS8vIHBvb2xTZXRbaV0gPT09IHBvb2xLZXkKCWZyYW1lX2RpZyAzIC8vIHBvb2xTZXQ6ICh1aW50NjQsdWludDY0LHVpbnQ2NClbNl0KCWZyYW1lX2RpZyA0IC8vIGk6IHVpbnQ2NAoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCWludCAyNAoJZXh0cmFjdDMKCWZyYW1lX2RpZyAtMiAvLyBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5Cgk9PQoJYnogKmlmNDJfZWxzZQoKCS8vICppZjQyX2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDkKCS8vIGZvdW5kID0gdHJ1ZQoJaW50IDEKCWZyYW1lX2J1cnkgMiAvLyBmb3VuZDogYm9vbAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMTEKCS8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlW2ldID0geyBpZDogMCwgcG9vbElkOiAwLCBwb29sQXBwSWQ6IDAgfQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAoJYnl0ZSAweDczNzA3MyAvLyAic3BzIgoJZnJhbWVfZGlnIC0xIC8vIHN0YWtlcjogQWRkcmVzcwoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoJYiAqaWY0Ml9lbmQKCippZjQyX2Vsc2U6CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjEzCgkvLyBpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgKz0gMQoJZnJhbWVfZGlnIDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCippZjQyX2VuZDoKCippZjQxX2VuZDoKCipmb3JfOF9jb250aW51ZToKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDIKCS8vIGkgKz0gMQoJZnJhbWVfZGlnIDQgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSA0IC8vIGk6IHVpbnQ2NAoJYiAqZm9yXzgKCipmb3JfOF9lbmQ6CgkvLyAqaWY0M19jb25kaXRpb24KCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMTcKCS8vICFmb3VuZAoJZnJhbWVfZGlnIDIgLy8gZm91bmQ6IGJvb2wKCSEKCWJ6ICppZjQzX2VuZAoKCS8vICppZjQzX2NvbnNlcXVlbnQKCS8vIE5vIG1hdGNoaW5nIHNsb3QgZm91bmQgd2hlbiB0b2xkIHRvIHJlbW92ZSBhIHBvb2wgZnJvbSB0aGUgc3Rha2VycyBzZXQKCWVycgoKKmlmNDNfZW5kOgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIyMQoJLy8gcmV0dXJuIFtpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgPT09IDAsIGluQW55UG9vbENvdW50ID09PSAwXQoJYnl0ZSAweDAwCglpbnQgMAoJZnJhbWVfZGlnIDAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50OiB1aW50NjQKCWludCAwCgk9PQoJc2V0Yml0CglpbnQgMQoJZnJhbWVfZGlnIDEgLy8gaW5BbnlQb29sQ291bnQ6IHVpbnQ2NAoJaW50IDAKCT09CglzZXRiaXQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCgkvLyBwb3AgYWxsIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHRoZSBzdGFjawoJcG9wbiA0CglyZXRzdWIKCi8vIGFkZFBvb2xUb05vZGUodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcG9vbEFwcElkOiB1aW50NjQsIG5vZGVOdW06IHVpbnQ2NCk6IHZvaWQKYWRkUG9vbFRvTm9kZToKCXByb3RvIDMgMAoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CglkdXBuIDIKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI1CgkvLyBub2RlUG9vbEFzc2lnbm1lbnRzID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5ub2RlUG9vbEFzc2lnbm1lbnRzKQoJaW50IDkwMCAvLyBoZWFkT2Zmc2V0CglpbnQgMTkyCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJZnJhbWVfYnVyeSAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI2CgkvLyBtYXhQb29sc1Blck5vZGVGb3JUaGlzVmFsaWRhdG9yID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcucG9vbHNQZXJOb2RlIGFzIHVpbnQ2NAoJaW50IDIyNQoJaW50IDEKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglidG9pCglmcmFtZV9idXJ5IDEgLy8gbWF4UG9vbHNQZXJOb2RlRm9yVGhpc1ZhbGlkYXRvcjogdWludDY0CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIyOAoJLy8gYXNzZXJ0KG5vZGVOdW0gPj0gMSAmJiBub2RlTnVtIDw9IE1BWF9OT0RFUywgJ25vZGUgbnVtYmVyIG5vdCBpbiB2YWxpZCByYW5nZScpCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgMQoJPj0KCWR1cAoJYnogKnNraXBfYW5kMTAKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCA4Cgk8PQoJJiYKCipza2lwX2FuZDEwOgoJLy8gbm9kZSBudW1iZXIgbm90IGluIHZhbGlkIHJhbmdlCglhc3NlcnQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjMwCgkvLyBmb3IgKGxldCBpID0gMDsgaSA8IG1heFBvb2xzUGVyTm9kZUZvclRoaXNWYWxpZGF0b3I7IGkgKz0gMSkKCWludCAwCglmcmFtZV9idXJ5IDIgLy8gaTogdWludDY0CgoqZm9yXzk6CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjMwCgkvLyBpIDwgbWF4UG9vbHNQZXJOb2RlRm9yVGhpc1ZhbGlkYXRvcgoJZnJhbWVfZGlnIDIgLy8gaTogdWludDY0CglmcmFtZV9kaWcgMSAvLyBtYXhQb29sc1Blck5vZGVGb3JUaGlzVmFsaWRhdG9yOiB1aW50NjQKCTwKCWJ6ICpmb3JfOV9lbmQKCgkvLyAqaWY0NF9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMzEKCS8vIG5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbbm9kZU51bSAtIDFdLnBvb2xBcHBJZHNbaV0gPT09IDAKCWZyYW1lX2RpZyAwIC8vIG5vZGVQb29sQXNzaWdubWVudHM6ICgodWludDY0WzNdKVs4XSkKCWludCAwCglmcmFtZV9kaWcgLTMgLy8gbm9kZU51bTogdWludDY0CglpbnQgMQoJLQoJaW50IDI0CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCAwCgkrCglmcmFtZV9kaWcgMiAvLyBpOiB1aW50NjQKCWludCA4CgkqIC8vIGFjYyAqIHR5cGVMZW5ndGgKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaW50IDAKCT09CglieiAqaWY0NF9lbmQKCgkvLyAqaWY0NF9jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjMzCgkvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLm5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbbm9kZU51bSAtIDFdLnBvb2xBcHBJZHNbaV0gPSBwb29sQXBwSWQKCWludCA5MDAKCWZyYW1lX2RpZyAtMyAvLyBub2RlTnVtOiB1aW50NjQKCWludCAxCgktCglpbnQgMjQKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJaW50IDAKCSsKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDgKCSogLy8gYWNjICogdHlwZUxlbmd0aAoJKwoJZnJhbWVfZGlnIC0yIC8vIHBvb2xBcHBJZDogdWludDY0CglpdG9iCglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfcmVwbGFjZQoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMzQKCS8vIHJldHVybgoJcmV0c3ViCgoqaWY0NF9lbmQ6CgoqZm9yXzlfY29udGludWU6CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjMwCgkvLyBpICs9IDEKCWZyYW1lX2RpZyAyIC8vIGk6IHVpbnQ2NAoJaW50IDEKCSsKCWZyYW1lX2J1cnkgMiAvLyBpOiB1aW50NjQKCWIgKmZvcl85CgoqZm9yXzlfZW5kOgoJLy8gbm8gYXZhaWxhYmxlIHNwYWNlIGluIHNwZWNpZmllZCBub2RlIGZvciB0aGlzIHBvb2wKCWVycgoJcmV0c3ViCgovLyBkb2VzU3Rha2VyTWVldEdhdGluZyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQpOiB2b2lkCi8vCi8vIENoZWNrcyBpZiBhIHN0YWtlciBtZWV0cyB0aGUgZ2F0aW5nIHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgYnkgdGhlIHZhbGlkYXRvci4KLy8KLy8gQHBhcmFtIHtWYWxpZGF0b3JJZFR5cGV9IHZhbGlkYXRvcklkIC0gVGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IuCi8vIEBwYXJhbSB7dWludDY0fSB2YWx1ZVRvVmVyaWZ5IC0gVGhlIHZhbHVlIHRvIHZlcmlmeSBhZ2FpbnN0IHRoZSBnYXRpbmcgcmVxdWlyZW1lbnRzLgovLyBAcmV0dXJucyB7dm9pZH0gb3IgYXNzZXJ0cyBpZiByZXF1aXJlbWVudHMgbm90IG1ldC4KZG9lc1N0YWtlck1lZXRHYXRpbmc6Cglwcm90byAyIDAKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoJZHVwbiA4CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI0OAoJLy8gdHlwZSA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLmVudHJ5R2F0aW5nVHlwZQoJaW50IDgwCglpbnQgMQoJYnl0ZSAweDc2IC8vICJ2IgoJZnJhbWVfZGlnIC0xIC8vIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUKCWl0b2IKCWNvbmNhdAoJY292ZXIgMgoJYm94X2V4dHJhY3QKCWJ0b2kKCWZyYW1lX2J1cnkgMCAvLyB0eXBlOiB1aW50OAoKCS8vICppZjQ1X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI0OQoJLy8gdHlwZSA9PT0gR0FUSU5HX1RZUEVfTk9ORQoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAwCgk9PQoJYnogKmlmNDVfZW5kCgoJLy8gKmlmNDVfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI1MAoJLy8gcmV0dXJuCglyZXRzdWIKCippZjQ1X2VuZDoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTIKCS8vIHN0YWtlciA9IHRoaXMudHhuLnNlbmRlcgoJdHhuIFNlbmRlcgoJZnJhbWVfYnVyeSAxIC8vIHN0YWtlcjogYWRkcmVzcwoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTMKCS8vIGNvbmZpZyA9IGNsb25lKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnKQoJaW50IDAKCWludCAyNDIKCWJ5dGUgMHg3NiAvLyAidiIKCWZyYW1lX2RpZyAtMSAvLyB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlCglpdG9iCgljb25jYXQKCWNvdmVyIDIKCWJveF9leHRyYWN0CglmcmFtZV9idXJ5IDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCgkvLyAqaWY0Nl9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTcKCS8vIHR5cGUgPT09IEdBVElOR19UWVBFX0FTU0VUU19DUkVBVEVEX0JZIHx8CgkvLyAgICAgICAgICAgICB0eXBlID09PSBHQVRJTkdfVFlQRV9BU1NFVF9JRCB8fAoJLy8gICAgICAgICAgICAgdHlwZSA9PT0gR0FUSU5HX1RZUEVfQ1JFQVRFRF9CWV9ORkRfQUREUkVTU0VTCglmcmFtZV9kaWcgMCAvLyB0eXBlOiB1aW50OAoJaW50IDEKCT09CglkdXAKCWJueiAqc2tpcF9vcjQKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMgoJPT0KCXx8Cgoqc2tpcF9vcjQ6CglkdXAKCWJueiAqc2tpcF9vcjUKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMwoJPT0KCXx8Cgoqc2tpcF9vcjU6CglieiAqaWY0Nl9lbmQKCgkvLyAqaWY0Nl9jb25zZXF1ZW50CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjYxCgkvLyBhc3NlcnQodmFsdWVUb1ZlcmlmeSAhPT0gMCkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWludCAwCgkhPQoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI2MgoJLy8gYmFsUmVxdWlyZWQgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5nYXRpbmdBc3NldE1pbkJhbGFuY2UKCWludCAxNDUKCWludCA4CglieXRlIDB4NzYgLy8gInYiCglmcmFtZV9kaWcgLTEgLy8gdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZQoJaXRvYgoJY29uY2F0Cgljb3ZlciAyCglib3hfZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSAzIC8vIGJhbFJlcXVpcmVkOiB1aW50NjQKCgkvLyAqaWY0N19jb25kaXRpb24KCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNjMKCS8vIGJhbFJlcXVpcmVkID09PSAwCglmcmFtZV9kaWcgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0CglpbnQgMAoJPT0KCWJ6ICppZjQ3X2VuZAoKCS8vICppZjQ3X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNjQKCS8vIGJhbFJlcXVpcmVkID0gMQoJaW50IDEKCWZyYW1lX2J1cnkgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0CgoqaWY0N19lbmQ6CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjY2CgkvLyBhc3NlcnQoCgkvLyAgICAgICAgICAgICAgICAgc3Rha2VyLmFzc2V0QmFsYW5jZShBc3NldElELmZyb21VaW50NjQodmFsdWVUb1ZlcmlmeSkpID49IGJhbFJlcXVpcmVkLAoJLy8gICAgICAgICAgICAgICAgICdtdXN0IGhhdmUgcmVxdWlyZWQgbWluaW11bSBiYWxhbmNlIG9mIHZhbGlkYXRvciBkZWZpbmVkIHRva2VuIHRvIGFkZCBzdGFrZScsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgMSAvLyBzdGFrZXI6IGFkZHJlc3MKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQoJcG9wCglmcmFtZV9kaWcgMyAvLyBiYWxSZXF1aXJlZDogdWludDY0Cgk+PQoKCS8vIG11c3QgaGF2ZSByZXF1aXJlZCBtaW5pbXVtIGJhbGFuY2Ugb2YgdmFsaWRhdG9yIGRlZmluZWQgdG9rZW4gdG8gYWRkIHN0YWtlCglhc3NlcnQKCippZjQ2X2VuZDoKCS8vICppZjQ4X2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3MQoJLy8gdHlwZSA9PT0gR0FUSU5HX1RZUEVfQVNTRVRTX0NSRUFURURfQlkKCWZyYW1lX2RpZyAwIC8vIHR5cGU6IHVpbnQ4CglpbnQgMQoJPT0KCWJ6ICppZjQ4X2VuZAoKCS8vICppZjQ4X2NvbnNlcXVlbnQKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNzIKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICBBc3NldElELmZyb21VaW50NjQodmFsdWVUb1ZlcmlmeSkuY3JlYXRvciA9PT0gY29uZmlnLmVudHJ5R2F0aW5nQWRkcmVzcywKCS8vICAgICAgICAgICAgICAgICAnc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgY3JlYXRlZCBieSBjcmVhdG9yIHRoYXQgdGhlIHZhbGlkYXRvciBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UnLAoJLy8gICAgICAgICAgICAgKQoJZnJhbWVfZGlnIC0yIC8vIHZhbHVlVG9WZXJpZnk6IHVpbnQ2NAoJYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKCXBvcAoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgODEgMzIKCT09CgoJLy8gc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgY3JlYXRlZCBieSBjcmVhdG9yIHRoYXQgdGhlIHZhbGlkYXRvciBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UKCWFzc2VydAoKKmlmNDhfZW5kOgoJLy8gKmlmNDlfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjc3CgkvLyB0eXBlID09PSBHQVRJTkdfVFlQRV9BU1NFVF9JRAoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAyCgk9PQoJYnogKmlmNDlfZW5kCgoJLy8gKmlmNDlfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3OAoJLy8gZm91bmQgPSBmYWxzZQoJaW50IDAKCWZyYW1lX2J1cnkgNCAvLyBmb3VuZDogYm9vbAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNzkKCS8vIGNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0cwoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMTEzIDMyCglkdXAKCWZyYW1lX2J1cnkgNSAvLyBjb3B5IG9mIHRoZSBhcnJheSB3ZSBhcmUgaXRlcmF0aW5nIG92ZXIKCWV4dHJhY3QgMCA4CglidG9pCglmcmFtZV9idXJ5IDYgLy8gYXNzZXRJZDogdWludDY0CglpbnQgMAoJZnJhbWVfYnVyeSA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCgoqZm9yT2ZfMDoKCS8vICppZjUwX2NvbmRpdGlvbgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI4MAoJLy8gdmFsdWVUb1ZlcmlmeSA9PT0gYXNzZXRJZAoJZnJhbWVfZGlnIC0yIC8vIHZhbHVlVG9WZXJpZnk6IHVpbnQ2NAoJZnJhbWVfZGlnIDYgLy8gYXNzZXRJZDogdWludDY0Cgk9PQoJYnogKmlmNTBfZW5kCgoJLy8gKmlmNTBfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI4MQoJLy8gZm91bmQgPSB0cnVlCglpbnQgMQoJZnJhbWVfYnVyeSA0IC8vIGZvdW5kOiBib29sCgliICpmb3JPZl8wX2VuZAoKKmlmNTBfZW5kOgoKKmZvck9mXzBfY29udGludWU6CgkvLyBpbmNyZW1lbnQgb2Zmc2V0IGFuZCBsb29wIGlmIG5vdCBvdXQgb2YgYm91bmRzCglmcmFtZV9kaWcgNyAvLyB0aGUgb2Zmc2V0IHdlIGFyZSBleHRyYWN0aW5nIHRoZSBuZXh0IGVsZW1lbnQgZnJvbQoJaW50IDgKCSsKCWR1cAoJaW50IDMyIC8vIG9mZnNldCBvZiBsYXN0IGVsZW1lbnQKCTwKCWJ6ICpmb3JPZl8wX2VuZAoJZnJhbWVfYnVyeSA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCglmcmFtZV9kaWcgNSAvLyBjb3B5IG9mIHRoZSBhcnJheSB3ZSBhcmUgaXRlcmF0aW5nIG92ZXIKCWZyYW1lX2RpZyA3IC8vIHRoZSBvZmZzZXQgd2UgYXJlIGV4dHJhY3RpbmcgdGhlIG5leHQgZWxlbWVudCBmcm9tCglpbnQgOAoJZXh0cmFjdAoJYnRvaQoJZnJhbWVfYnVyeSA2IC8vIGFzc2V0SWQ6IHVpbnQ2NAoJYiAqZm9yT2ZfMAoKKmZvck9mXzBfZW5kOgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI4NQoJLy8gYXNzZXJ0KGZvdW5kLCAnc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgaWRlbnRpY2FsIHRvIHRoZSBhc3NldCBpZCBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UnKQoJZnJhbWVfZGlnIDQgLy8gZm91bmQ6IGJvb2wKCgkvLyBzcGVjaWZpZWQgYXNzZXQgbXVzdCBiZSBpZGVudGljYWwgdG8gdGhlIGFzc2V0IGlkIGRlZmluZWQgYXMgYSByZXF1aXJlbWVudCB0byBzdGFrZQoJYXNzZXJ0CgoqaWY0OV9lbmQ6CgkvLyAqaWY1MV9jb25kaXRpb24KCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyODcKCS8vIHR5cGUgPT09IEdBVElOR19UWVBFX0NSRUFURURfQllfTkZEX0FERFJFU1NFUwoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCAzCgk9PQoJYnogKmlmNTFfZW5kCgoJLy8gKmlmNTFfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI5MAoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIHRoaXMuaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0KGNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0c1swXSwgQXNzZXRJRC5mcm9tVWludDY0KHZhbHVlVG9WZXJpZnkpLmNyZWF0b3IpLAoJLy8gICAgICAgICAgICAgICAgICdzcGVjaWZpZWQgYXNzZXQgbXVzdCBiZSBjcmVhdGVkIGJ5IGNyZWF0b3IgdGhhdCBpcyBvbmUgb2YgdGhlIGxpbmtlZCBhZGRyZXNzZXMgaW4gYW4gbmZkJywKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCglwb3AKCWZyYW1lX2RpZyAyIC8vIGNvbmZpZzogKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpCglleHRyYWN0IDExMyA4CglidG9pCgljYWxsc3ViIGlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdAoKCS8vIHNwZWNpZmllZCBhc3NldCBtdXN0IGJlIGNyZWF0ZWQgYnkgY3JlYXRvciB0aGF0IGlzIG9uZSBvZiB0aGUgbGlua2VkIGFkZHJlc3NlcyBpbiBhbiBuZmQKCWFzc2VydAoKKmlmNTFfZW5kOgoJLy8gKmlmNTJfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjk1CgkvLyB0eXBlID09PSBHQVRJTkdfVFlQRV9TRUdNRU5UX09GX05GRAoJZnJhbWVfZGlnIDAgLy8gdHlwZTogdWludDgKCWludCA0Cgk9PQoJYnogKmlmNTJfZW5kCgoJLy8gKmlmNTJfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI5NwoJLy8gdXNlck9mZmVyZWRORkRBcHBJRCA9IHZhbHVlVG9WZXJpZnkKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQKCWZyYW1lX2J1cnkgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjk4CgkvLyBhc3NlcnQodGhpcy5pc05GREFwcElEVmFsaWQodXNlck9mZmVyZWRORkRBcHBJRCksICdwcm92aWRlZCBORkQgbXVzdCBiZSB2YWxpZCcpCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWNhbGxzdWIgaXNORkRBcHBJRFZhbGlkCgoJLy8gcHJvdmlkZWQgTkZEIG11c3QgYmUgdmFsaWQKCWFzc2VydAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMDEKCS8vIGFzc2VydCgKCS8vICAgICAgICAgICAgICAgICByYXdCeXRlcyhBcHBJRC5mcm9tVWludDY0KHVzZXJPZmZlcmVkTkZEQXBwSUQpLmdsb2JhbFN0YXRlKCdpLm93bmVyLmEnKSBhcyBBZGRyZXNzKSA9PT0KCS8vICAgICAgICAgICAgICAgICAgICAgcmF3Qnl0ZXMoc3Rha2VyKSB8fCB0aGlzLmlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdCh1c2VyT2ZmZXJlZE5GREFwcElELCBzdGFrZXIpLAoJLy8gICAgICAgICAgICAgICAgICJwcm92aWRlZCBuZmQgZm9yIGVudHJ5IGlzbid0IG93bmVkIG9yIGxpbmtlZCB0byB0aGUgc3Rha2VyIiwKCS8vICAgICAgICAgICAgICkKCWZyYW1lX2RpZyA4IC8vIHVzZXJPZmZlcmVkTkZEQXBwSUQ6IHVpbnQ2NAoJYnl0ZSAweDY5MmU2Zjc3NmU2NTcyMmU2MSAvLyAiaS5vd25lci5hIgoJYXBwX2dsb2JhbF9nZXRfZXgKCgkvLyBnbG9iYWwgc3RhdGUgdmFsdWUgZG9lcyBub3QgZXhpc3Q6IEFwcElELmZyb21VaW50NjQodXNlck9mZmVyZWRORkRBcHBJRCkuZ2xvYmFsU3RhdGUoJ2kub3duZXIuYScpCglhc3NlcnQKCWZyYW1lX2RpZyAxIC8vIHN0YWtlcjogYWRkcmVzcwoJPT0KCWR1cAoJYm56ICpza2lwX29yNgoJZnJhbWVfZGlnIDEgLy8gc3Rha2VyOiBhZGRyZXNzCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWNhbGxzdWIgaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0Cgl8fAoKKnNraXBfb3I2OgoJLy8gcHJvdmlkZWQgbmZkIGZvciBlbnRyeSBpc24ndCBvd25lZCBvciBsaW5rZWQgdG8gdGhlIHN0YWtlcgoJYXNzZXJ0CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMwOAoJLy8gYXNzZXJ0KAoJLy8gICAgICAgICAgICAgICAgIGJ0b2koQXBwSUQuZnJvbVVpbnQ2NCh1c2VyT2ZmZXJlZE5GREFwcElEKS5nbG9iYWxTdGF0ZSgnaS5wYXJlbnRBcHBJRCcpIGFzIGJ5dGVzKSA9PT0KCS8vICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmVudHJ5R2F0aW5nQXNzZXRzWzBdLAoJLy8gICAgICAgICAgICAgICAgICdzcGVjaWZpZWQgbmZkIG11c3QgYmUgYSBzZWdtZW50IG9mIHRoZSBuZmQgdGhlIHZhbGlkYXRvciBzcGVjaWZpZWQgYXMgYSByZXF1aXJlbWVudCcsCgkvLyAgICAgICAgICAgICApCglmcmFtZV9kaWcgOCAvLyB1c2VyT2ZmZXJlZE5GREFwcElEOiB1aW50NjQKCWJ5dGUgMHg2OTJlNzA2MTcyNjU2ZTc0NDE3MDcwNDk0NCAvLyAiaS5wYXJlbnRBcHBJRCIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KHVzZXJPZmZlcmVkTkZEQXBwSUQpLmdsb2JhbFN0YXRlKCdpLnBhcmVudEFwcElEJykKCWFzc2VydAoJYnRvaQoJZnJhbWVfZGlnIDIgLy8gY29uZmlnOiAodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkKCWV4dHJhY3QgMTEzIDgKCWJ0b2kKCT09CgoJLy8gc3BlY2lmaWVkIG5mZCBtdXN0IGJlIGEgc2VnbWVudCBvZiB0aGUgbmZkIHRoZSB2YWxpZGF0b3Igc3BlY2lmaWVkIGFzIGEgcmVxdWlyZW1lbnQKCWFzc2VydAoKKmlmNTJfZW5kOgoJcmV0c3ViCgovLyBpc05GREFwcElEVmFsaWQobmZkQXBwSUQ6IHVpbnQ2NCk6IGJvb2xlYW4KLy8KLy8gQ2hlY2tzIGlmIHRoZSBnaXZlbiBORkQgQXBwIGlkIGlzIHZhbGlkLiAgVXNpbmcgb25seSB0aGUgQXBwIGlkIHRoZXJlJ3Mgbm8gdmFsaWRhdGlvbiBhZ2FpbnN0IHRoZSBuYW1lIChpZTogdGhhdCBuZmQgWCBpcyBuYW1lIFkpCi8vIFNvIGl0J3MgYXNzdW1lZCBmb3IgdGhlIGNhbGxlciwgdGhlIGFwcCBpZCBhbG9uZSBpcyBmaW5lLiAgVGhlIG5hbWUgaXMgZmV0Y2hlZCBmcm9tIHRoZSBzcGVjaWZpZWQgYXBwIGlkIGFuZCB0aGUgdHdvCi8vIHRvZ2V0aGVyIGFyZSB1c2VkIGZvciB2YWxpZGl0eSBjaGVjayBjYWxsIHRvIHRoZSBuZmQgcmVnaXN0cnkuCi8vCi8vIEBwYXJhbSB7dWludDY0fSBuZmRBcHBJRCAtIFRoZSBORkQgQXBwIGlkIHRvIHZlcmlmeS4KLy8KLy8gQHJldHVybnMge2Jvb2xlYW59IC0gUmV0dXJucyB0cnVlIGlmIHRoZSBORkQgQXBwIGlkIGlzIHZhbGlkLCBvdGhlcndpc2UgZmFsc2UuCmlzTkZEQXBwSURWYWxpZDoKCXByb3RvIDEgMQoKCS8vIFB1c2ggZW1wdHkgYnl0ZXMgYWZ0ZXIgdGhlIGZyYW1lIHBvaW50ZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzCglieXRlIDB4CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMyNwoJLy8gdXNlck9mZmVyZWRORkROYW1lID0gQXBwSUQuZnJvbVVpbnQ2NChuZmRBcHBJRCkuZ2xvYmFsU3RhdGUoJ2kubmFtZScpIGFzIHN0cmluZwoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWJ5dGUgMHg2OTJlNmU2MTZkNjUgLy8gImkubmFtZSIKCWFwcF9nbG9iYWxfZ2V0X2V4CgoJLy8gZ2xvYmFsIHN0YXRlIHZhbHVlIGRvZXMgbm90IGV4aXN0OiBBcHBJRC5mcm9tVWludDY0KG5mZEFwcElEKS5nbG9iYWxTdGF0ZSgnaS5uYW1lJykKCWFzc2VydAoJZnJhbWVfYnVyeSAwIC8vIHVzZXJPZmZlcmVkTkZETmFtZTogc3RyaW5nCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMyOQoJLy8gcmV0dXJuIHNlbmRNZXRob2RDYWxsPFtzdHJpbmcsIHVpbnQ2NF0sIGJvb2xlYW4+KHsKCS8vICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQodGhpcy5uZmRSZWdpc3RyeUFwcElkKSwKCS8vICAgICAgICAgICAgIG5hbWU6ICdpc1ZhbGlkTmZkQXBwSWQnLAoJLy8gICAgICAgICAgICAgbWV0aG9kQXJnczogW3VzZXJPZmZlcmVkTkZETmFtZSwgbmZkQXBwSURdLAoJLy8gICAgICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAiaXNWYWxpZE5mZEFwcElkKHN0cmluZyx1aW50NjQpYm9vbCIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMzMAoJLy8gYXBwbGljYXRpb25JRDogQXBwSUQuZnJvbVVpbnQ2NCh0aGlzLm5mZFJlZ2lzdHJ5QXBwSWQpCglsb2FkIDIwMCAvLyBUTVBMX25mZFJlZ2lzdHJ5QXBwSWQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMzIKCS8vIG1ldGhvZEFyZ3M6IFt1c2VyT2ZmZXJlZE5GRE5hbWUsIG5mZEFwcElEXQoJZnJhbWVfZGlnIDAgLy8gdXNlck9mZmVyZWRORkROYW1lOiBzdHJpbmcKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0b2IKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoJaXR4biBOdW1Mb2dzCglpbnQgMQoJLQoJaXR4bmFzIExvZ3MKCWV4dHJhY3QgNCAwCglpbnQgMAoJZ2V0Yml0CgoJLy8gc2V0IHRoZSBzdWJyb3V0aW5lIHJldHVybiB2YWx1ZQoJZnJhbWVfYnVyeSAwCglyZXRzdWIKCi8vIGlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdChuZmRBcHBJRDogdWludDY0LCBhZGRyVG9GaW5kOiBBZGRyZXNzKTogYm9vbGVhbgovLwovLyBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBhZGRyZXNzIGlzIHByZXNlbnQgaW4gYW4gTkZEcyBsaXN0IG9mIHZlcmlmaWVkIGFkZHJlc3Nlcy4KLy8gVGhlIE5GRCBpcyBhc3N1bWVkIHRvIGhhdmUgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcyBvZmZpY2lhbC4KLy8KLy8gQHBhcmFtIHt1aW50NjR9IG5mZEFwcElEIC0gVGhlIE5GRCBhcHBsaWNhdGlvbiBpZC4KLy8gQHBhcmFtIHtBZGRyZXNzfSBhZGRyVG9GaW5kIC0gVGhlIGFkZHJlc3MgdG8gZmluZCBpbiB0aGUgdi5jYUFsZ28uMC5hcyBwcm9wZXJ0eQovLyBAcmV0dXJuIHtib29sZWFufSAtIGB0cnVlYCBpZiB0aGUgYWRkcmVzcyBpcyBwcmVzZW50LCBgZmFsc2VgIG90aGVyd2lzZS4KaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0OgoJcHJvdG8gMiAxCgoJLy8gUHVzaCBlbXB0eSBieXRlcyBhZnRlciB0aGUgZnJhbWUgcG9pbnRlciB0byByZXNlcnZlIHNwYWNlIGZvciBsb2NhbCB2YXJpYWJsZXMKCWJ5dGUgMHgKCWR1cG4gMgoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDUKCS8vIHNlbmRBcHBDYWxsKHsKCS8vICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcElELmZyb21VaW50NjQobmZkQXBwSUQpLAoJLy8gICAgICAgICAgICAgYXBwbGljYXRpb25BcmdzOiBbJ3JlYWRfcHJvcGVydHknLCAndi5jYUFsZ28uMC5hcyddLAoJLy8gICAgICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzQ2CgkvLyBhcHBsaWNhdGlvbklEOiBBcHBJRC5mcm9tVWludDY0KG5mZEFwcElEKQoJZnJhbWVfZGlnIC0xIC8vIG5mZEFwcElEOiB1aW50NjQKCWl0eG5fZmllbGQgQXBwbGljYXRpb25JRAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDcKCS8vIGFwcGxpY2F0aW9uQXJnczogWydyZWFkX3Byb3BlcnR5JywgJ3YuY2FBbGdvLjAuYXMnXQoJYnl0ZSAweDcyNjU2MTY0NWY3MDcyNmY3MDY1NzI3NDc5IC8vICJyZWFkX3Byb3BlcnR5IgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCWJ5dGUgMHg3NjJlNjM2MTQxNmM2NzZmMmUzMDJlNjE3MyAvLyAidi5jYUFsZ28uMC5hcyIKCWl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDkKCS8vIGNhQWxnb0RhdGEgPSB0aGlzLml0eG4ubGFzdExvZwoJaXR4biBMYXN0TG9nCglmcmFtZV9idXJ5IDAgLy8gY2FBbGdvRGF0YTogYnl0ZVtdCgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM1MAoJLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBjYUFsZ29EYXRhLmxlbmd0aDsgaSArPSAzMikKCWludCAwCglmcmFtZV9idXJ5IDEgLy8gaTogdWludDY0CgoqZm9yXzEwOgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM1MAoJLy8gaSA8IGNhQWxnb0RhdGEubGVuZ3RoCglmcmFtZV9kaWcgMSAvLyBpOiB1aW50NjQKCWZyYW1lX2RpZyAwIC8vIGNhQWxnb0RhdGE6IGJ5dGVbXQoJbGVuCgk8CglieiAqZm9yXzEwX2VuZAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNTEKCS8vIGFkZHIgPSBleHRyYWN0MyhjYUFsZ29EYXRhLCBpLCAzMikKCWZyYW1lX2RpZyAwIC8vIGNhQWxnb0RhdGE6IGJ5dGVbXQoJZnJhbWVfZGlnIDEgLy8gaTogdWludDY0CglpbnQgMzIKCWV4dHJhY3QzCglmcmFtZV9idXJ5IDIgLy8gYWRkcjogYnl0ZVtdCgoJLy8gKmlmNTNfY29uZGl0aW9uCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzUyCgkvLyBhZGRyICE9PSByYXdCeXRlcyhnbG9iYWxzLnplcm9BZGRyZXNzKSAmJiBhZGRyID09PSByYXdCeXRlcyhhZGRyVG9GaW5kKQoJZnJhbWVfZGlnIDIgLy8gYWRkcjogYnl0ZVtdCglnbG9iYWwgWmVyb0FkZHJlc3MKCSE9CglkdXAKCWJ6ICpza2lwX2FuZDExCglmcmFtZV9kaWcgMiAvLyBhZGRyOiBieXRlW10KCWZyYW1lX2RpZyAtMiAvLyBhZGRyVG9GaW5kOiBBZGRyZXNzCgk9PQoJJiYKCipza2lwX2FuZDExOgoJYnogKmlmNTNfZW5kCgoJLy8gKmlmNTNfY29uc2VxdWVudAoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM1MwoJLy8gcmV0dXJuIHRydWUKCWludCAxCgliICppc0FkZHJlc3NJbk5GRENBQWxnb0xpc3QqcmV0dXJuCgoqaWY1M19lbmQ6CgoqZm9yXzEwX2NvbnRpbnVlOgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM1MAoJLy8gaSArPSAzMgoJZnJhbWVfZGlnIDEgLy8gaTogdWludDY0CglpbnQgMzIKCSsKCWZyYW1lX2J1cnkgMSAvLyBpOiB1aW50NjQKCWIgKmZvcl8xMAoKKmZvcl8xMF9lbmQ6CgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzU2CgkvLyByZXR1cm4gZmFsc2UKCWludCAwCgoqaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0KnJldHVybjoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoKCS8vIHBvcCBhbGwgbG9jYWwgdmFyaWFibGVzIGZyb20gdGhlIHN0YWNrCglwb3BuIDIKCXJldHN1YgoKLy8gYWxnb1NhdHVyYXRpb25MZXZlbCgpOiB1aW50NjQKLy8KLy8gUmV0dXJucyB0aGUgbWF4aW11bSBhbGxvd2VkIHN0YWtlIHBlciB2YWxpZGF0b3IgYmFzZWQgb24gYSBwZXJjZW50YWdlIG9mIGFsbCBjdXJyZW50IG9ubGluZSBzdGFrZSBiZWZvcmUKLy8gdGhlIHZhbGlkYXRvciBpcyBjb25zaWRlcmVkIHNhdHVyYXRlZCAtIHdoZXJlIHJld2FyZHMgYXJlIGRpbWluaXNoZWQuCi8vIE5PVEU6IHRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCB0d2ljZSAtIGhlcmUgYW5kIGluIHN0YWtpbmcgcG9vbCBjb250cmFjdC4gIEJvdGggbXVzdCBiZSBpZGVudGljYWwuCmFsZ29TYXR1cmF0aW9uTGV2ZWw6Cglwcm90byAwIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNjUKCS8vIG9ubGluZSA9IHRoaXMuZ2V0Q3VycmVudE9ubGluZVN0YWtlKCkKCWNhbGxzdWIgZ2V0Q3VycmVudE9ubGluZVN0YWtlCglmcmFtZV9idXJ5IDAgLy8gb25saW5lOiB1aW50NjQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzY3CgkvLyByZXR1cm4gd2lkZVJhdGlvKFtvbmxpbmUsIE1BWF9WQUxJREFUT1JfU09GVF9QQ1RfT0ZfT05MSU5FXzFERUNJTUFMXSwgWzEwMDBdKQoJZnJhbWVfZGlnIDAgLy8gb25saW5lOiB1aW50NjQKCWludCAxMDAKCW11bHcKCWludCAwCglpbnQgMTAwMAoJZGl2bW9kdwoJcG9wCglwb3AKCXN3YXAKCSEKCgkvLyB3aWRlUmF0aW8gZmFpbGVkCglhc3NlcnQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gbWF4QWxsb3dlZFN0YWtlKCk6IHVpbnQ2NAovLwovLyBSZXR1cm5zIHRoZSBNQVhJTVVNIGFsbG93ZWQgc3Rha2UgcGVyIHZhbGlkYXRvciBiYXNlZCBvbiBhIHBlcmNlbnRhZ2Ugb2YgYWxsIGN1cnJlbnQgb25saW5lIHN0YWtlLgovLyBBZGRpbmcgc3Rha2UgaXMgY29tcGxldGVseSBibG9ja2VkIGF0IHRoaXMgYW1vdW50LgptYXhBbGxvd2VkU3Rha2U6Cglwcm90byAwIDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNzUKCS8vIG9ubGluZSA9IHRoaXMuZ2V0Q3VycmVudE9ubGluZVN0YWtlKCkKCWNhbGxzdWIgZ2V0Q3VycmVudE9ubGluZVN0YWtlCglmcmFtZV9idXJ5IDAgLy8gb25saW5lOiB1aW50NjQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzc3CgkvLyByZXR1cm4gd2lkZVJhdGlvKFtvbmxpbmUsIE1BWF9WQUxJREFUT1JfSEFSRF9QQ1RfT0ZfT05MSU5FXzFERUNJTUFMXSwgWzEwMDBdKQoJZnJhbWVfZGlnIDAgLy8gb25saW5lOiB1aW50NjQKCWludCAxNTAKCW11bHcKCWludCAwCglpbnQgMTAwMAoJZGl2bW9kdwoJcG9wCglwb3AKCXN3YXAKCSEKCgkvLyB3aWRlUmF0aW8gZmFpbGVkCglhc3NlcnQKCgkvLyBzZXQgdGhlIHN1YnJvdXRpbmUgcmV0dXJuIHZhbHVlCglmcmFtZV9idXJ5IDAKCXJldHN1YgoKLy8gbWF4QWxnb0FsbG93ZWRQZXJQb29sKCk6IHVpbnQ2NAovLwovLyBSZXR1cm5zIHRoZSBNQVhJTVVNIGFsbG93ZWQgc3Rha2UgcGVyIHBvb2wgYW5kIHN0aWxsIHJlY2VpdmUgaW5jZW50aXZlcyAtIHdlJ2xsIHRyZWF0IHRoaXMgYXMgdGhlICdtYXggcGVyIHBvb2wnCm1heEFsZ29BbGxvd2VkUGVyUG9vbDoKCXByb3RvIDAgMQoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzODQKCS8vIHJldHVybiBnbG9iYWxzLnBheW91dHNNYXhCYWxhbmNlCglnbG9iYWwgUGF5b3V0c01heEJhbGFuY2UKCXJldHN1YgoKLy8gZ2V0Q3VycmVudE9ubGluZVN0YWtlKCk6IHVpbnQ2NApnZXRDdXJyZW50T25saW5lU3Rha2U6Cglwcm90byAwIDEKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzg4CgkvLyByZXR1cm4gb25saW5lU3Rha2UoKQoJb25saW5lX3N0YWtlCglyZXRzdWIKCi8vIG1pbkJhbGFuY2VGb3JBY2NvdW50KGNvbnRyYWN0czogdWludDY0LCBleHRyYVBhZ2VzOiB1aW50NjQsIGFzc2V0czogdWludDY0LCBsb2NhbEludHM6IHVpbnQ2NCwgbG9jYWxCeXRlczogdWludDY0LCBnbG9iYWxJbnRzOiB1aW50NjQsIGdsb2JhbEJ5dGVzOiB1aW50NjQpOiB1aW50NjQKbWluQmFsYW5jZUZvckFjY291bnQ6Cglwcm90byA3IDEKCgkvLyBQdXNoIGVtcHR5IGJ5dGVzIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcwoJYnl0ZSAweAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDAKCS8vIG1pbkJhbCA9IEFMR09SQU5EX0FDQ09VTlRfTUlOX0JBTEFOQ0UKCWludCAxMDAwMDAKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDEKCS8vIG1pbkJhbCArPSBjb250cmFjdHMgKiBBUFBMSUNBVElPTl9CQVNFX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMSAvLyBjb250cmFjdHM6IHVpbnQ2NAoJaW50IDEwMDAwMAoJKgoJKwoJZnJhbWVfYnVyeSAwIC8vIG1pbkJhbDogdWludDY0CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTQwMgoJLy8gbWluQmFsICs9IGV4dHJhUGFnZXMgKiBBUFBMSUNBVElPTl9CQVNFX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMiAvLyBleHRyYVBhZ2VzOiB1aW50NjQKCWludCAxMDAwMDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDMKCS8vIG1pbkJhbCArPSBhc3NldHMgKiBBU1NFVF9IT0xESU5HX0ZFRQoJZnJhbWVfZGlnIDAgLy8gbWluQmFsOiB1aW50NjQKCWZyYW1lX2RpZyAtMyAvLyBhc3NldHM6IHVpbnQ2NAoJaW50IDEwMDAwMAoJKgoJKwoJZnJhbWVfYnVyeSAwIC8vIG1pbkJhbDogdWludDY0CgoJLy8gY29udHJhY3RzXHZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTQwNAoJLy8gbWluQmFsICs9IGxvY2FsSW50cyAqIFNTQ19WQUxVRV9VSU5UCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoJZnJhbWVfZGlnIC00IC8vIGxvY2FsSW50czogdWludDY0CglpbnQgMjg1MDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDUKCS8vIG1pbkJhbCArPSBnbG9iYWxJbnRzICogU1NDX1ZBTFVFX1VJTlQKCWZyYW1lX2RpZyAwIC8vIG1pbkJhbDogdWludDY0CglmcmFtZV9kaWcgLTYgLy8gZ2xvYmFsSW50czogdWludDY0CglpbnQgMjg1MDAKCSoKCSsKCWZyYW1lX2J1cnkgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIGNvbnRyYWN0c1x2YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDYKCS8vIG1pbkJhbCArPSBsb2NhbEJ5dGVzICogU1NDX1ZBTFVFX0JZVEVTCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoJZnJhbWVfZGlnIC01IC8vIGxvY2FsQnl0ZXM6IHVpbnQ2NAoJaW50IDUwMDAwCgkqCgkrCglmcmFtZV9idXJ5IDAgLy8gbWluQmFsOiB1aW50NjQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDA3CgkvLyBtaW5CYWwgKz0gZ2xvYmFsQnl0ZXMgKiBTU0NfVkFMVUVfQllURVMKCWZyYW1lX2RpZyAwIC8vIG1pbkJhbDogdWludDY0CglmcmFtZV9kaWcgLTcgLy8gZ2xvYmFsQnl0ZXM6IHVpbnQ2NAoJaW50IDUwMDAwCgkqCgkrCglmcmFtZV9idXJ5IDAgLy8gbWluQmFsOiB1aW50NjQKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDA4CgkvLyByZXR1cm4gbWluQmFsCglmcmFtZV9kaWcgMCAvLyBtaW5CYWw6IHVpbnQ2NAoKCS8vIHNldCB0aGUgc3Vicm91dGluZSByZXR1cm4gdmFsdWUKCWZyYW1lX2J1cnkgMAoJcmV0c3ViCgovLyBjb3N0Rm9yQm94U3RvcmFnZSh0b3RhbE51bUJ5dGVzOiB1aW50NjQpOiB1aW50NjQKY29zdEZvckJveFN0b3JhZ2U6Cglwcm90byAxIDEKCgkvLyBjb250cmFjdHNcdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDE1CgkvLyByZXR1cm4gU0NCT1hfUEVSQk9YICsgdG90YWxOdW1CeXRlcyAqIFNDQk9YX1BFUkJZVEUKCWludCAyNTAwCglmcmFtZV9kaWcgLTEgLy8gdG90YWxOdW1CeXRlczogdWludDY0CglpbnQgNDAwCgkqCgkrCglyZXRzdWIKCipjcmVhdGVfTm9PcDoKCW1ldGhvZCAiY3JlYXRlQXBwbGljYXRpb24oKXZvaWQiCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAwCgltYXRjaCAqYWJpX3JvdXRlX2NyZWF0ZUFwcGxpY2F0aW9uCgoJLy8gdGhpcyBjb250cmFjdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGdpdmVuIEFCSSBtZXRob2QgZm9yIGNyZWF0ZSBOb09wCgllcnIKCipjYWxsX05vT3A6CgltZXRob2QgImluaXRTdGFraW5nQ29udHJhY3QodWludDY0KXZvaWQiCgltZXRob2QgImxvYWRTdGFraW5nQ29udHJhY3REYXRhKHVpbnQ2NCxieXRlW10pdm9pZCIKCW1ldGhvZCAiZmluYWxpemVTdGFraW5nQ29udHJhY3QoKXZvaWQiCgltZXRob2QgImdhcygpdm9pZCIKCW1ldGhvZCAiZ2V0TWJyQW1vdW50cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCgltZXRob2QgImdldFByb3RvY29sQ29uc3RyYWludHMoKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiZ2V0TnVtVmFsaWRhdG9ycygpdWludDY0IgoJbWV0aG9kICJnZXRWYWxpZGF0b3JDb25maWcodWludDY0KSh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiZ2V0VmFsaWRhdG9yU3RhdGUodWludDY0KSh1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQpIgoJbWV0aG9kICJnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpIgoJbWV0aG9kICJnZXRQb29scyh1aW50NjQpKHVpbnQ2NCx1aW50MTYsdWludDY0KVtdIgoJbWV0aG9kICJnZXRQb29sQXBwSWQodWludDY0LHVpbnQ2NCl1aW50NjQiCgltZXRob2QgImdldFBvb2xJbmZvKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpKHVpbnQ2NCx1aW50MTYsdWludDY0KSIKCW1ldGhvZCAiZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHVpbnQ2NCl1aW50NjQiCgltZXRob2QgImRvZXNTdGFrZXJOZWVkVG9QYXlNQlIoYWRkcmVzcylib29sIgoJbWV0aG9kICJnZXRTdGFrZWRQb29sc0ZvckFjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCx1aW50NjQpW10iCgltZXRob2QgImdldFRva2VuUGF5b3V0UmF0aW8odWludDY0KSh1aW50NjRbMjRdLHVpbnQ2NCkiCgltZXRob2QgImdldE5vZGVQb29sQXNzaWdubWVudHModWludDY0KSgodWludDY0WzNdKVs4XSkiCgltZXRob2QgImdldE5GRFJlZ2lzdHJ5SUQoKXVpbnQ2NCIKCW1ldGhvZCAiYWRkVmFsaWRhdG9yKHBheSxzdHJpbmcsKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIKCW1ldGhvZCAiY2hhbmdlVmFsaWRhdG9yTWFuYWdlcih1aW50NjQsYWRkcmVzcyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQiCgltZXRob2QgImNoYW5nZVZhbGlkYXRvck5GRCh1aW50NjQsdWludDY0LHN0cmluZyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyh1aW50NjQsYWRkcmVzcyl2b2lkIgoJbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JSZXdhcmRJbmZvKHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0KXZvaWQiCgltZXRob2QgImFkZFBvb2wocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAiYWRkU3Rha2UocGF5LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0KSIKCW1ldGhvZCAic2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KSIKCW1ldGhvZCAic3Rha2VVcGRhdGVkVmlhUmV3YXJkcygodWludDY0LHVpbnQ2NCx1aW50NjQpLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIgoJbWV0aG9kICJzdGFrZVJlbW92ZWQoKHVpbnQ2NCx1aW50NjQsdWludDY0KSxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCl2b2lkIgoJbWV0aG9kICJmaW5kUG9vbEZvclN0YWtlcih1aW50NjQsYWRkcmVzcyx1aW50NjQpKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYm9vbCxib29sKSIKCW1ldGhvZCAibW92ZVBvb2xUb05vZGUodWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIKCW1ldGhvZCAiZW1wdHlUb2tlblJld2FyZHModWludDY0LGFkZHJlc3MpdWludDY0IgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggKmFiaV9yb3V0ZV9pbml0U3Rha2luZ0NvbnRyYWN0ICphYmlfcm91dGVfbG9hZFN0YWtpbmdDb250cmFjdERhdGEgKmFiaV9yb3V0ZV9maW5hbGl6ZVN0YWtpbmdDb250cmFjdCAqYWJpX3JvdXRlX2dhcyAqYWJpX3JvdXRlX2dldE1ickFtb3VudHMgKmFiaV9yb3V0ZV9nZXRQcm90b2NvbENvbnN0cmFpbnRzICphYmlfcm91dGVfZ2V0TnVtVmFsaWRhdG9ycyAqYWJpX3JvdXRlX2dldFZhbGlkYXRvckNvbmZpZyAqYWJpX3JvdXRlX2dldFZhbGlkYXRvclN0YXRlICphYmlfcm91dGVfZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyICphYmlfcm91dGVfZ2V0UG9vbHMgKmFiaV9yb3V0ZV9nZXRQb29sQXBwSWQgKmFiaV9yb3V0ZV9nZXRQb29sSW5mbyAqYWJpX3JvdXRlX2dldEN1ck1heFN0YWtlUGVyUG9vbCAqYWJpX3JvdXRlX2RvZXNTdGFrZXJOZWVkVG9QYXlNQlIgKmFiaV9yb3V0ZV9nZXRTdGFrZWRQb29sc0ZvckFjY291bnQgKmFiaV9yb3V0ZV9nZXRUb2tlblBheW91dFJhdGlvICphYmlfcm91dGVfZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cyAqYWJpX3JvdXRlX2dldE5GRFJlZ2lzdHJ5SUQgKmFiaV9yb3V0ZV9hZGRWYWxpZGF0b3IgKmFiaV9yb3V0ZV9jaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyICphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyAqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvck5GRCAqYWJpX3JvdXRlX2NoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzICphYmlfcm91dGVfY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mbyAqYWJpX3JvdXRlX2FkZFBvb2wgKmFiaV9yb3V0ZV9hZGRTdGFrZSAqYWJpX3JvdXRlX3NldFRva2VuUGF5b3V0UmF0aW8gKmFiaV9yb3V0ZV9zdGFrZVVwZGF0ZWRWaWFSZXdhcmRzICphYmlfcm91dGVfc3Rha2VSZW1vdmVkICphYmlfcm91dGVfZmluZFBvb2xGb3JTdGFrZXIgKmFiaV9yb3V0ZV9tb3ZlUG9vbFRvTm9kZSAqYWJpX3JvdXRlX2VtcHR5VG9rZW5SZXdhcmRzCgoJLy8gdGhpcyBjb250cmFjdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGdpdmVuIEFCSSBtZXRob2QgZm9yIGNhbGwgTm9PcAoJZXJy","clear":"I3ByYWdtYSB2ZXJzaW9uIDEx"},"templateVariables":{"nfdRegistryAppId":{"type":"uint64"}},"scratchVariables":{"nfdRegistryAppId":{"type":"uint64","slot":200}},"compilerInfo":{"compiler":"algod","compilerVersion":{"major":3,"minor":26,"patch":231714,"commitHash":"8b6c443d"}}} + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +// Aliases for non-encoded ABI values + +type uint64 = bigint; +type byte = number; +type address = string; +type uint8 = bigint; +type uint32 = bigint; +type uint16 = bigint; +type bool = boolean; +type pay = AppMethodCallTransactionArgument; +type AVMBytes = Uint8Array; + +// Type definitions for ARC-56 structs + +export type ValidatorInfo = { + config: { + id: uint64, + owner: address, + manager: address, + nfdForInfo: uint64, + entryGatingType: uint8, + entryGatingAddress: address, + entryGatingAssets: uint64[], + gatingAssetMinBalance: uint64, + rewardTokenId: uint64, + rewardPerPayout: uint64, + epochRoundLength: uint32, + percentToValidator: uint32, + validatorCommissionAddress: address, + minEntryStake: uint64, + maxAlgoPerPool: uint64, + poolsPerNode: uint8, + sunsettingOn: uint64, + sunsettingTo: uint64 + }, + state: { + numPools: uint16, + totalStakers: uint64, + totalAlgoStaked: uint64, + rewardTokenHeldBack: uint64 + }, + pools: [uint64,uint16,uint64][], + tokenPayoutRatio: { + poolPctOfWhole: uint64[], + updatedForPayout: uint64 + }, + nodePoolAssignments: { + nodes: [uint64[]][] + } +} + +export type MbrAmounts = { + addValidatorMbr: uint64, + addPoolMbr: uint64, + poolInitMbr: uint64, + addStakerMbr: uint64 +} + +export type Constraints = { + epochPayoutRoundsMin: uint64, + epochPayoutRoundsMax: uint64, + minPctToValidatorWFourDecimals: uint64, + maxPctToValidatorWFourDecimals: uint64, + minEntryStake: uint64, + maxAlgoPerPool: uint64, + maxAlgoPerValidator: uint64, + amtConsideredSaturated: uint64, + maxNodes: uint64, + maxPoolsPerNode: uint64, + maxStakersPerPool: uint64 +} + +export type ValidatorConfig = { + id: uint64, + owner: address, + manager: address, + nfdForInfo: uint64, + entryGatingType: uint8, + entryGatingAddress: address, + entryGatingAssets: uint64[], + gatingAssetMinBalance: uint64, + rewardTokenId: uint64, + rewardPerPayout: uint64, + epochRoundLength: uint32, + percentToValidator: uint32, + validatorCommissionAddress: address, + minEntryStake: uint64, + maxAlgoPerPool: uint64, + poolsPerNode: uint8, + sunsettingOn: uint64, + sunsettingTo: uint64 +} + +export type ValidatorCurState = { + numPools: uint16, + totalStakers: uint64, + totalAlgoStaked: uint64, + rewardTokenHeldBack: uint64 +} + +export type PoolInfo = { + poolAppId: uint64, + totalStakers: uint16, + totalAlgoStaked: uint64 +} + +export type ValidatorPoolKey = { + id: uint64, + poolId: uint64, + poolAppId: uint64 +} + +export type PoolTokenPayoutRatio = { + poolPctOfWhole: uint64[], + updatedForPayout: uint64 +} + +export type NodePoolAssignmentConfig = { + nodes: [uint64[]][] +} + + +/** + * Deploy-time template variables + */ +export type TemplateVariables = { + nfdRegistryAppId: uint64, +} +/** + * Defines the types of available calls and state of the ValidatorRegistry smart contract. + */ +export type ValidatorRegistryTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'createApplication()void' | 'createApplication', { + argsObj: { + } + argsTuple: [] + returns: void + }> + & Record<'initStakingContract(uint64)void' | 'initStakingContract', { + argsObj: { + approvalProgramSize: bigint | number + } + argsTuple: [approvalProgramSize: bigint | number] + returns: void + }> + & Record<'loadStakingContractData(uint64,byte[])void' | 'loadStakingContractData', { + argsObj: { + offset: bigint | number + data: Uint8Array + } + argsTuple: [offset: bigint | number, data: Uint8Array] + returns: void + }> + & Record<'finalizeStakingContract()void' | 'finalizeStakingContract', { + argsObj: { + } + argsTuple: [] + returns: void + }> + & Record<'gas()void' | 'gas', { + argsObj: { + } + argsTuple: [] + returns: void + }> + & Record<'getMbrAmounts()(uint64,uint64,uint64,uint64)' | 'getMbrAmounts', { + argsObj: { + } + argsTuple: [] + returns: MbrAmounts + }> + & Record<'getProtocolConstraints()(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)' | 'getProtocolConstraints', { + argsObj: { + } + argsTuple: [] + returns: Constraints + }> + & Record<'getNumValidators()uint64' | 'getNumValidators', { + argsObj: { + } + argsTuple: [] + returns: bigint + }> + & Record<'getValidatorConfig(uint64)(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64)' | 'getValidatorConfig', { + argsObj: { + validatorId: bigint | number + } + argsTuple: [validatorId: bigint | number] + returns: ValidatorConfig + }> + & Record<'getValidatorState(uint64)(uint16,uint64,uint64,uint64)' | 'getValidatorState', { + argsObj: { + validatorId: bigint | number + } + argsTuple: [validatorId: bigint | number] + returns: ValidatorCurState + }> + & Record<'getValidatorOwnerAndManager(uint64)(address,address)' | 'getValidatorOwnerAndManager', { + argsObj: { + validatorId: bigint | number + } + argsTuple: [validatorId: bigint | number] + returns: [string, string] + }> + & Record<'getPools(uint64)(uint64,uint16,uint64)[]' | 'getPools', { + argsObj: { + /** + * PoolInfo[] - array of pools + Not callable from other contracts because 1K return but can be called w/ simulate which bumps log returns + + */ + validatorId: bigint | number + } + argsTuple: [validatorId: bigint | number] + returns: [bigint, bigint, bigint][] + }> + & Record<'getPoolAppId(uint64,uint64)uint64' | 'getPoolAppId', { + argsObj: { + validatorId: bigint | number + poolId: bigint | number + } + argsTuple: [validatorId: bigint | number, poolId: bigint | number] + returns: bigint + }> + & Record<'getPoolInfo((uint64,uint64,uint64))(uint64,uint16,uint64)' | 'getPoolInfo', { + argsObj: { + poolKey: ValidatorPoolKey + } + argsTuple: [poolKey: ValidatorPoolKey] + returns: PoolInfo + }> + & Record<'getCurMaxStakePerPool(uint64)uint64' | 'getCurMaxStakePerPool', { + argsObj: { + /** + * The id of the validator. + */ + validatorId: bigint | number + } + argsTuple: [validatorId: bigint | number] + returns: bigint + }> + & Record<'doesStakerNeedToPayMBR(address)bool' | 'doesStakerNeedToPayMBR', { + argsObj: { + staker: string + } + argsTuple: [staker: string] + returns: boolean + }> + & Record<'getStakedPoolsForAccount(address)(uint64,uint64,uint64)[]' | 'getStakedPoolsForAccount', { + argsObj: { + /** + * The account to retrieve staked pools for. + ValidatorPoolKey[] - The array of staked pools for the account. + + */ + staker: string + } + argsTuple: [staker: string] + returns: [bigint, bigint, bigint][] + }> + & Record<'getTokenPayoutRatio(uint64)(uint64[24],uint64)' | 'getTokenPayoutRatio', { + argsObj: { + /** + * The id of the validator. + PoolTokenPayoutRatio - The token payout ratio for the validator. + + */ + validatorId: bigint | number + } + argsTuple: [validatorId: bigint | number] + returns: PoolTokenPayoutRatio + }> + & Record<'getNodePoolAssignments(uint64)((uint64[3])[8])' | 'getNodePoolAssignments', { + argsObj: { + validatorId: bigint | number + } + argsTuple: [validatorId: bigint | number] + returns: NodePoolAssignmentConfig + }> + & Record<'getNFDRegistryID()uint64' | 'getNFDRegistryID', { + argsObj: { + } + argsTuple: [] + returns: bigint + }> + & Record<'addValidator(pay,string,(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64))uint64' | 'addValidator', { + argsObj: { + /** + * payment from caller which covers mbr increase of new validator storage + */ + mbrPayment: AppMethodCallTransactionArgument + /** + * (Optional) Name of nfd (used as double-check against id specified in config) + */ + nfdName: string + /** + * ValidatorConfig struct + */ + config: ValidatorConfig + } + argsTuple: [mbrPayment: AppMethodCallTransactionArgument, nfdName: string, config: ValidatorConfig] + /** + * uint64 validator id + */ + returns: bigint + }> + & Record<'changeValidatorManager(uint64,address)void' | 'changeValidatorManager', { + argsObj: { + /** + * The id of the validator to change the manager for. + */ + validatorId: bigint | number + /** + * The new manager address. + */ + manager: string + } + argsTuple: [validatorId: bigint | number, manager: string] + returns: void + }> + & Record<'changeValidatorSunsetInfo(uint64,uint64,uint64)void' | 'changeValidatorSunsetInfo', { + argsObj: { + /** + * The id of the validator to update. + */ + validatorId: bigint | number + /** + * The new sunset timestamp. + */ + sunsettingOn: bigint | number + /** + * The new sunset to validator id. + */ + sunsettingTo: bigint | number + } + argsTuple: [validatorId: bigint | number, sunsettingOn: bigint | number, sunsettingTo: bigint | number] + returns: void + }> + & Record<'changeValidatorNFD(uint64,uint64,string)void' | 'changeValidatorNFD', { + argsObj: { + /** + * The id of the validator to update. + */ + validatorId: bigint | number + /** + * The application id of the NFD to assign to the validator. + */ + nfdAppId: bigint | number + /** + * The name of the NFD (which must match) + */ + nfdName: string + } + argsTuple: [validatorId: bigint | number, nfdAppId: bigint | number, nfdName: string] + returns: void + }> + & Record<'changeValidatorCommissionAddress(uint64,address)void' | 'changeValidatorCommissionAddress', { + argsObj: { + validatorId: bigint | number + commissionAddress: string + } + argsTuple: [validatorId: bigint | number, commissionAddress: string] + returns: void + }> + & Record<'changeValidatorRewardInfo(uint64,uint8,address,uint64[4],uint64,uint64)void' | 'changeValidatorRewardInfo', { + argsObj: { + validatorId: bigint | number + entryGatingType: bigint | number + entryGatingAddress: string + entryGatingAssets: [bigint | number, bigint | number, bigint | number, bigint | number] + gatingAssetMinBalance: bigint | number + rewardPerPayout: bigint | number + } + argsTuple: [validatorId: bigint | number, entryGatingType: bigint | number, entryGatingAddress: string, entryGatingAssets: [bigint | number, bigint | number, bigint | number, bigint | number], gatingAssetMinBalance: bigint | number, rewardPerPayout: bigint | number] + returns: void + }> + & Record<'addPool(pay,uint64,uint64)(uint64,uint64,uint64)' | 'addPool', { + argsObj: { + /** + * payment from caller which covers mbr increase of adding a new pool + */ + mbrPayment: AppMethodCallTransactionArgument + /** + * is id of validator to pool to (must be owner or manager) + */ + validatorId: bigint | number + /** + * is node number to add to + */ + nodeNum: bigint | number + } + argsTuple: [mbrPayment: AppMethodCallTransactionArgument, validatorId: bigint | number, nodeNum: bigint | number] + /** + * ValidatorPoolKey pool key to created pool + */ + returns: ValidatorPoolKey + }> + & Record<'addStake(pay,uint64,uint64)(uint64,uint64,uint64)' | 'addStake', { + argsObj: { + /** + * payment coming from staker to place into a pool + */ + stakedAmountPayment: AppMethodCallTransactionArgument + /** + * The id of the validator. + */ + validatorId: bigint | number + /** + * only if validator has gating to enter - this is asset id or nfd id that corresponds to gating. + Txn sender is factored in as well if that is part of gating. + * + + */ + valueToVerify: bigint | number + } + argsTuple: [stakedAmountPayment: AppMethodCallTransactionArgument, validatorId: bigint | number, valueToVerify: bigint | number] + /** + * ValidatorPoolKey - The key of the validator pool. + */ + returns: ValidatorPoolKey + }> + & Record<'setTokenPayoutRatio(uint64)(uint64[24],uint64)' | 'setTokenPayoutRatio', { + argsObj: { + /** + * validator id (and thus pool) calling us. Verified so that sender MUST be pool 1 of this validator. + */ + validatorId: bigint | number + } + argsTuple: [validatorId: bigint | number] + /** + * PoolTokenPayoutRatio - the finished ratio data + */ + returns: PoolTokenPayoutRatio + }> + & Record<'stakeUpdatedViaRewards((uint64,uint64,uint64),uint64,uint64,uint64,uint64)void' | 'stakeUpdatedViaRewards', { + argsObj: { + /** + * ValidatorPoolKey type + */ + poolKey: ValidatorPoolKey + /** + * amount this validator's total stake increased via rewards + */ + algoToAdd: bigint | number + /** + * amount this validator's total stake increased via rewards (that should be + */ + rewardTokenAmountReserved: bigint | number + /** + * the commission amount the validator was paid, if any + */ + validatorCommission: bigint | number + /** + * if the pool was in saturated state, the amount sent back to the fee sink. + seen as 'accounted for/pending spent') + + */ + saturatedBurnToFeeSink: bigint | number + } + argsTuple: [poolKey: ValidatorPoolKey, algoToAdd: bigint | number, rewardTokenAmountReserved: bigint | number, validatorCommission: bigint | number, saturatedBurnToFeeSink: bigint | number] + returns: void + }> + & Record<'stakeRemoved((uint64,uint64,uint64),address,uint64,uint64,bool)void' | 'stakeRemoved', { + argsObj: { + /** + * calling us from which stake was removed + */ + poolKey: ValidatorPoolKey + staker: string + /** + * algo amount removed + */ + amountRemoved: bigint | number + /** + * if applicable, amount of token reward removed (by pool 1 caller) or TO remove and pay out (via pool 1 from different pool caller) + */ + rewardRemoved: bigint | number + stakerRemoved: boolean + } + argsTuple: [poolKey: ValidatorPoolKey, staker: string, amountRemoved: bigint | number, rewardRemoved: bigint | number, stakerRemoved: boolean] + returns: void + }> + & Record<'findPoolForStaker(uint64,address,uint64)((uint64,uint64,uint64),bool,bool)' | 'findPoolForStaker', { + argsObj: { + /** + * The id of the validator. + */ + validatorId: bigint | number + /** + * The address of the staker. + */ + staker: string + /** + * The amount to stake. + */ + amountToStake: bigint | number + } + argsTuple: [validatorId: bigint | number, staker: string, amountToStake: bigint | number] + /** + * ValidatorPoolKey, boolean, boolean - The pool for the staker, true/false on whether the staker is 'new' + to this VALIDATOR, and true/false if staker is new to the protocol. + + */ + returns: [[bigint, bigint, bigint], boolean, boolean] + }> + & Record<'movePoolToNode(uint64,uint64,uint64)void' | 'movePoolToNode', { + argsObj: { + /** + * The id of the validator. + */ + validatorId: bigint | number + poolAppId: bigint | number + nodeNum: bigint | number + } + argsTuple: [validatorId: bigint | number, poolAppId: bigint | number, nodeNum: bigint | number] + returns: void + }> + & Record<'emptyTokenRewards(uint64,address)uint64' | 'emptyTokenRewards', { + argsObj: { + /** + * The id of the validator. + */ + validatorId: bigint | number + /** + * the account to send the tokens to (must already be opted-in to the reward token) + */ + receiver: string + } + argsTuple: [validatorId: bigint | number, receiver: string] + /** + * uint64 the amount of reward token sent + */ + returns: bigint + }> + /** + * Defines the shape of the state of the application. + */ + state: { + global: { + keys: { + stakingPoolInitialized: boolean + numValidators: bigint + numStakers: bigint + totalAlgoStaked: bigint + } + } + box: { + keys: { + stakingPoolApprovalProgram: Uint8Array + } + maps: { + validatorList: Map + stakerPoolSet: Map + } + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type ValidatorRegistrySignatures = keyof ValidatorRegistryTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type ValidatorRegistryNonVoidMethodSignatures = keyof ValidatorRegistryTypes['methods'] extends infer T ? T extends keyof ValidatorRegistryTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand> + } +> +/** + * Maps a method signature from the ValidatorRegistry smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = ValidatorRegistryTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the ValidatorRegistry smart contract to the method's return type + */ +export type MethodReturn = ValidatorRegistryTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed global state of the application. + */ +export type GlobalKeysState = ValidatorRegistryTypes['state']['global']['keys'] + +/** + * Defines the shape of the keyed box state of the application. + */ +export type BoxKeysState = ValidatorRegistryTypes['state']['box']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type ValidatorRegistryCreateCallParams = + | Expand & {method: 'createApplication'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema> + | Expand & {method: 'createApplication()void'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema> +/** + * Defines arguments required for the deploy method. + */ +export type ValidatorRegistryDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: ValidatorRegistryCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the ValidatorRegistry smart contract + */ +export abstract class ValidatorRegistryParamsFactory { + /** + * Gets available create ABI call param factories + */ + static get create() { + return { + _resolveByMethod(params: TParams) { + switch(params.method) { + case 'createApplication': + case 'createApplication()void': + return ValidatorRegistryParamsFactory.create.createApplication(params) + } + throw new Error(`Unknown ' + verb + ' method`) + }, + + /** + * Constructs create ABI call params for the ValidatorRegistry smart contract using the createApplication()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + createApplication(params: CallParams<'createApplication()void'> & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC}): AppClientMethodCallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC} { + return { + ...params, + method: 'createApplication()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + }, + } + } + + /** + * Constructs a no op call for the initStakingContract(uint64)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static initStakingContract(params: CallParams<'initStakingContract(uint64)void'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'initStakingContract(uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.approvalProgramSize], + } + } + /** + * Constructs a no op call for the loadStakingContractData(uint64,byte[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static loadStakingContractData(params: CallParams<'loadStakingContractData(uint64,byte[])void'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'loadStakingContractData(uint64,byte[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.offset, params.args.data], + } + } + /** + * Constructs a no op call for the finalizeStakingContract()void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static finalizeStakingContract(params: CallParams<'finalizeStakingContract()void'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'finalizeStakingContract()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the gas()void ABI method + * + * gas is a dummy no-op call that can be used to pool-up resource references and opcode cost + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static gas(params: CallParams<'gas()void'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'gas()void' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the getMbrAmounts()(uint64,uint64,uint64,uint64) ABI method + * + * Returns the MBR amounts needed for various actions: + [ + addValidatorMbr: uint64 - mbr needed to add a new validator - paid to validator contract + addPoolMbr: uint64 - mbr needed to add a new pool - paid to validator + poolInitMbr: uint64 - mbr needed to initStorage() of pool - paid to pool itself + addStakerMbr: uint64 - mbr staker needs to add to first staking payment (stays w/ validator) + ] + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getMbrAmounts(params: CallParams<'getMbrAmounts()(uint64,uint64,uint64,uint64)'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'getMbrAmounts()(uint64,uint64,uint64,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the getProtocolConstraints()(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64) ABI method + * + * Returns the protocol constraints so that UIs can limit what users specify for validator configuration parameters. + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getProtocolConstraints(params: CallParams<'getProtocolConstraints()(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'getProtocolConstraints()(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the getNumValidators()uint64 ABI method + * + * Returns the current number of validators + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getNumValidators(params: CallParams<'getNumValidators()uint64'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'getNumValidators()uint64' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the getValidatorConfig(uint64)(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getValidatorConfig(params: CallParams<'getValidatorConfig(uint64)(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64)'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'getValidatorConfig(uint64)(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.validatorId], + } + } + /** + * Constructs a no op call for the getValidatorState(uint64)(uint16,uint64,uint64,uint64) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getValidatorState(params: CallParams<'getValidatorState(uint64)(uint16,uint64,uint64,uint64)'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'getValidatorState(uint64)(uint16,uint64,uint64,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.validatorId], + } + } + /** + * Constructs a no op call for the getValidatorOwnerAndManager(uint64)(address,address) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getValidatorOwnerAndManager(params: CallParams<'getValidatorOwnerAndManager(uint64)(address,address)'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'getValidatorOwnerAndManager(uint64)(address,address)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.validatorId], + } + } + /** + * Constructs a no op call for the getPools(uint64)(uint64,uint16,uint64)[] ABI method + * + * Return list of all pools for this validator. + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getPools(params: CallParams<'getPools(uint64)(uint64,uint16,uint64)[]'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'getPools(uint64)(uint64,uint16,uint64)[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.validatorId], + } + } + /** + * Constructs a no op call for the getPoolAppId(uint64,uint64)uint64 ABI method + * + * getPoolAppId is useful for callers to determine app to call for removing stake if they don't have staking or + want to get staker list for an account. The staking pool also uses it to get the app id of staking pool 1 + (which contains reward tokens if being used) so that the amount available can be determined. + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getPoolAppId(params: CallParams<'getPoolAppId(uint64,uint64)uint64'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'getPoolAppId(uint64,uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.validatorId, params.args.poolId], + } + } + /** + * Constructs a no op call for the getPoolInfo((uint64,uint64,uint64))(uint64,uint16,uint64) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getPoolInfo(params: CallParams<'getPoolInfo((uint64,uint64,uint64))(uint64,uint16,uint64)'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'getPoolInfo((uint64,uint64,uint64))(uint64,uint16,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.poolKey], + } + } + /** + * Constructs a no op call for the getCurMaxStakePerPool(uint64)uint64 ABI method + * + * Calculate the maximum stake per pool for a given validator. + Normally this would be maxAlgoPerPool, but it should also never go above MaxAllowedStake / numPools so + as pools are added the max allowed per pool can reduce. + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getCurMaxStakePerPool(params: CallParams<'getCurMaxStakePerPool(uint64)uint64'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'getCurMaxStakePerPool(uint64)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.validatorId], + } + } + /** + * Constructs a no op call for the doesStakerNeedToPayMBR(address)bool ABI method + * + * Helper callers can call w/ simulate to determine if 'AddStaker' MBR should be included w/ staking amount + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static doesStakerNeedToPayMbr(params: CallParams<'doesStakerNeedToPayMBR(address)bool'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'doesStakerNeedToPayMBR(address)bool' as const, + args: Array.isArray(params.args) ? params.args : [params.args.staker], + } + } + /** + * Constructs a no op call for the getStakedPoolsForAccount(address)(uint64,uint64,uint64)[] ABI method + * + * Retrieves the staked pools for an account. + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getStakedPoolsForAccount(params: CallParams<'getStakedPoolsForAccount(address)(uint64,uint64,uint64)[]'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'getStakedPoolsForAccount(address)(uint64,uint64,uint64)[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.staker], + } + } + /** + * Constructs a no op call for the getTokenPayoutRatio(uint64)(uint64[24],uint64) ABI method + * + * Retrieves the token payout ratio for a given validator - returning the pool ratios of whole so that token + payouts across pools can be based on a stable snaphost of stake. + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getTokenPayoutRatio(params: CallParams<'getTokenPayoutRatio(uint64)(uint64[24],uint64)'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'getTokenPayoutRatio(uint64)(uint64[24],uint64)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.validatorId], + } + } + /** + * Constructs a no op call for the getNodePoolAssignments(uint64)((uint64[3])[8]) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getNodePoolAssignments(params: CallParams<'getNodePoolAssignments(uint64)((uint64[3])[8])'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'getNodePoolAssignments(uint64)((uint64[3])[8])' as const, + args: Array.isArray(params.args) ? params.args : [params.args.validatorId], + } + } + /** + * Constructs a no op call for the getNFDRegistryID()uint64 ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getNfdRegistryId(params: CallParams<'getNFDRegistryID()uint64'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'getNFDRegistryID()uint64' as const, + args: Array.isArray(params.args) ? params.args : [], + } + } + /** + * Constructs a no op call for the addValidator(pay,string,(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64))uint64 ABI method + * + * Adds a new validator + Requires at least 10 ALGO as the 'fee' for the transaction to help dissuade spammed validator adds. + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static addValidator(params: CallParams<'addValidator(pay,string,(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64))uint64'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'addValidator(pay,string,(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64))uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.mbrPayment, params.args.nfdName, params.args.config], + } + } + /** + * Constructs a no op call for the changeValidatorManager(uint64,address)void ABI method + * + * Changes the Validator manager for a specific Validator id. + [ ONLY OWNER CAN CHANGE ] + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static changeValidatorManager(params: CallParams<'changeValidatorManager(uint64,address)void'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'changeValidatorManager(uint64,address)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.validatorId, params.args.manager], + } + } + /** + * Constructs a no op call for the changeValidatorSunsetInfo(uint64,uint64,uint64)void ABI method + * + * Updates the sunset information for a given validator. + [ ONLY OWNER CAN CHANGE ] + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static changeValidatorSunsetInfo(params: CallParams<'changeValidatorSunsetInfo(uint64,uint64,uint64)void'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'changeValidatorSunsetInfo(uint64,uint64,uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.validatorId, params.args.sunsettingOn, params.args.sunsettingTo], + } + } + /** + * Constructs a no op call for the changeValidatorNFD(uint64,uint64,string)void ABI method + * + * Changes the NFD for a validator in the validatorList contract. + [ ONLY OWNER CAN CHANGE ] + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static changeValidatorNfd(params: CallParams<'changeValidatorNFD(uint64,uint64,string)void'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'changeValidatorNFD(uint64,uint64,string)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.validatorId, params.args.nfdAppId, params.args.nfdName], + } + } + /** + * Constructs a no op call for the changeValidatorCommissionAddress(uint64,address)void ABI method + * + * Change the commission address that validator rewards are sent to. + [ ONLY OWNER CAN CHANGE ] + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static changeValidatorCommissionAddress(params: CallParams<'changeValidatorCommissionAddress(uint64,address)void'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'changeValidatorCommissionAddress(uint64,address)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.validatorId, params.args.commissionAddress], + } + } + /** + * Constructs a no op call for the changeValidatorRewardInfo(uint64,uint8,address,uint64[4],uint64,uint64)void ABI method + * + * Allow the additional rewards (gating entry, additional token rewards) information be changed at will. + [ ONLY OWNER CAN CHANGE ] + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static changeValidatorRewardInfo(params: CallParams<'changeValidatorRewardInfo(uint64,uint8,address,uint64[4],uint64,uint64)void'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'changeValidatorRewardInfo(uint64,uint8,address,uint64[4],uint64,uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.validatorId, params.args.entryGatingType, params.args.entryGatingAddress, params.args.entryGatingAssets, params.args.gatingAssetMinBalance, params.args.rewardPerPayout], + } + } + /** + * Constructs a no op call for the addPool(pay,uint64,uint64)(uint64,uint64,uint64) ABI method + * + * Adds a new pool to a validator's pool set, returning the 'key' to reference the pool in the future for staking, etc. + The caller must pay the cost of the validators MBR increase as well as the MBR that will be needed for the pool itself. + + + [ ONLY OWNER OR MANAGER CAN call ] + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static addPool(params: CallParams<'addPool(pay,uint64,uint64)(uint64,uint64,uint64)'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'addPool(pay,uint64,uint64)(uint64,uint64,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.mbrPayment, params.args.validatorId, params.args.nodeNum], + } + } + /** + * Constructs a no op call for the addStake(pay,uint64,uint64)(uint64,uint64,uint64) ABI method + * + * Adds stake to a validator pool. + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static addStake(params: CallParams<'addStake(pay,uint64,uint64)(uint64,uint64,uint64)'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'addStake(pay,uint64,uint64)(uint64,uint64,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.stakedAmountPayment, params.args.validatorId, params.args.valueToVerify], + } + } + /** + * Constructs a no op call for the setTokenPayoutRatio(uint64)(uint64[24],uint64) ABI method + * + * setTokenPayoutRatio is called by Staking Pool # 1 (ONLY) to ask the validator (us) to calculate the ratios + of stake in the pools for subsequent token payouts (ie: 2 pools, '100' algo total staked, 60 in pool 1, and 40 + in pool 2) This is done so we have a stable snapshot of stake - taken once per epoch - only triggered by + pool 1 doing payout. pools other than 1 doing payout call pool 1 to ask it do it first. + It would be 60/40% in the poolPctOfWhole values. The token reward payouts then use these values instead of + their 'current' stake which changes as part of the payouts themselves (and people could be changing stake + during the epoch updates across pools) + + + Multiple pools will call us via pool 1 (pool2-pool1-validator, etc.) so don't assert on pool1 calling multiple + times in same epoch. Just return. + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static setTokenPayoutRatio(params: CallParams<'setTokenPayoutRatio(uint64)(uint64[24],uint64)'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'setTokenPayoutRatio(uint64)(uint64[24],uint64)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.validatorId], + } + } + /** + * Constructs a no op call for the stakeUpdatedViaRewards((uint64,uint64,uint64),uint64,uint64,uint64,uint64)void ABI method + * + * stakeUpdatedViaRewards is called by Staking pools to inform the validator (us) that a particular amount of total + stake has been added to the specified pool. This is used to update the stats we have in our PoolInfo storage. + The calling App id is validated against our pool list as well. + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static stakeUpdatedViaRewards(params: CallParams<'stakeUpdatedViaRewards((uint64,uint64,uint64),uint64,uint64,uint64,uint64)void'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'stakeUpdatedViaRewards((uint64,uint64,uint64),uint64,uint64,uint64,uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.poolKey, params.args.algoToAdd, params.args.rewardTokenAmountReserved, params.args.validatorCommission, params.args.saturatedBurnToFeeSink], + } + } + /** + * Constructs a no op call for the stakeRemoved((uint64,uint64,uint64),address,uint64,uint64,bool)void ABI method + * + * stakeRemoved is called by Staking pools to inform the validator (us) that a particular amount of total stake has been removed + from the specified pool. This is used to update the stats we have in our PoolInfo storage. + If any amount of rewardRemoved is specified, then that amount of reward is sent to the use + The calling App id is validated against our pool list as well. + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static stakeRemoved(params: CallParams<'stakeRemoved((uint64,uint64,uint64),address,uint64,uint64,bool)void'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'stakeRemoved((uint64,uint64,uint64),address,uint64,uint64,bool)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.poolKey, params.args.staker, params.args.amountRemoved, params.args.rewardRemoved, params.args.stakerRemoved], + } + } + /** + * Constructs a no op call for the findPoolForStaker(uint64,address,uint64)((uint64,uint64,uint64),bool,bool) ABI method + * + * Finds the pool for a staker based on the provided validator id, staker address, and amount to stake. + First checks the stakers 'already staked list' for the validator preferring those (adding if possible) then adds + to new pool if necessary. + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static findPoolForStaker(params: CallParams<'findPoolForStaker(uint64,address,uint64)((uint64,uint64,uint64),bool,bool)'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'findPoolForStaker(uint64,address,uint64)((uint64,uint64,uint64),bool,bool)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.validatorId, params.args.staker, params.args.amountToStake], + } + } + /** + * Constructs a no op call for the movePoolToNode(uint64,uint64,uint64)void ABI method + * + * Find the specified pool (in any node number) and move it to the specified node. + The pool account is forced offline if moved so prior node will still run for 320 rounds but + new key goes online on new node soon after (320 rounds after it goes online) + No-op if success, asserts if not found or can't move (no space in target) + [ ONLY OWNER OR MANAGER CAN CHANGE ] + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static movePoolToNode(params: CallParams<'movePoolToNode(uint64,uint64,uint64)void'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'movePoolToNode(uint64,uint64,uint64)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.validatorId, params.args.poolAppId, params.args.nodeNum], + } + } + /** + * Constructs a no op call for the emptyTokenRewards(uint64,address)uint64 ABI method + * + * Sends the reward tokens held in pool 1 to specified receiver. + This is intended to be used by the owner when they want to get reward tokens 'back' which they sent to + the first pool (likely because validator is sunsetting. Any tokens currently 'reserved' for stakers to claim will + NOT be sent as they must be held back for stakers to later claim. + [ ONLY OWNER CAN CALL] + + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static emptyTokenRewards(params: CallParams<'emptyTokenRewards(uint64,address)uint64'> & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'emptyTokenRewards(uint64,address)uint64' as const, + args: Array.isArray(params.args) ? params.args : [params.args.validatorId, params.args.receiver], + } + } +} + +/** + * A factory to create and deploy one or more instance of the ValidatorRegistry smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class ValidatorRegistryFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: AppFactory + + /** + * Creates a new instance of `ValidatorRegistryFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new ValidatorRegistryClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new ValidatorRegistryClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the ValidatorRegistry smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: ValidatorRegistryDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + createParams: params.createParams?.method ? ValidatorRegistryParamsFactory.create._resolveByMethod(params.createParams) : params.createParams, + }) + return { result: result.result, appClient: new ValidatorRegistryClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = (($this) => { + return { + /** + * Gets available create methods + */ + get create() { + return { + /** + * Creates a new instance of the ValidatorRegistry smart contract using the createApplication()void ABI method. + * + * @param params The params for the smart contract call + * @returns The create params + */ + createApplication(params: Expand & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + return $this.appFactory.params.create(ValidatorRegistryParamsFactory.create.createApplication(params)) + }, + } + }, + + } + })(this) + + /** + * Create transactions for the current app + */ + readonly createTransaction = (($this) => { + return { + /** + * Gets available create methods + */ + get create() { + return { + /** + * Creates a new instance of the ValidatorRegistry smart contract using the createApplication()void ABI method. + * + * @param params The params for the smart contract call + * @returns The create params + */ + createApplication(params: Expand & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + return $this.appFactory.params.create(ValidatorRegistryParamsFactory.create.createApplication(params)) + }, + } + }, + + } + })(this) + + /** + * Send calls to the current app + */ + readonly send = (($this) => { + return { + /** + * Gets available create methods + */ + get create() { + return { + /** + * Creates a new instance of the ValidatorRegistry smart contract using an ABI method call using the createApplication()void ABI method. + * + * @param params The params for the smart contract call + * @returns The create result + */ + async createApplication(params: Expand & AppClientCompilationParams & CreateSchema & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + const result = await $this.appFactory.send.create(ValidatorRegistryParamsFactory.create.createApplication(params)) + return { result: { ...result.result, return: result.result.return as undefined | MethodReturn<'createApplication()void'> }, appClient: new ValidatorRegistryClient(result.appClient) } + }, + } + }, + + } + })(this) + +} +/** + * A client to make calls to the ValidatorRegistry smart contract + */ +export class ValidatorRegistryClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: AppClient + + /** + * Creates a new instance of `ValidatorRegistryClient` + * + * @param appClient An `AppClient` instance which has been created with the ValidatorRegistry app spec + */ + constructor(appClient: AppClient) + /** + * Creates a new instance of `ValidatorRegistryClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: AppClient | Omit) { + this.appClient = appClientOrParams instanceof AppClient ? appClientOrParams : new AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Checks for decode errors on the given return value and maps the return value to the return type for the given method + * @returns The typed return value or undefined if there was no value + */ + decodeReturnValue(method: TSignature, returnValue: ABIReturn | undefined) { + return returnValue !== undefined ? getArc56ReturnValue>(returnValue, this.appClient.getABIMethod(method), APP_SPEC.structs) : undefined + } + + /** + * Returns a new `ValidatorRegistryClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new ValidatorRegistryClient(await AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `ValidatorRegistryClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new ValidatorRegistryClient(await AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = (($this) => { + return { + /** + * Makes a clear_state call to an existing instance of the ValidatorRegistry smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState(params?: Expand) { + return $this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the ValidatorRegistry smart contract using the initStakingContract(uint64)void ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + initStakingContract(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.initStakingContract(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the loadStakingContractData(uint64,byte[])void ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + loadStakingContractData(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.loadStakingContractData(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the finalizeStakingContract()void ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + finalizeStakingContract(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.finalizeStakingContract(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the gas()void ABI method. + * + * gas is a dummy no-op call that can be used to pool-up resource references and opcode cost + * + * @param params The params for the smart contract call + * @returns The call params + */ + gas(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.gas(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getMbrAmounts()(uint64,uint64,uint64,uint64) ABI method. + * + * Returns the MBR amounts needed for various actions: + [ + addValidatorMbr: uint64 - mbr needed to add a new validator - paid to validator contract + addPoolMbr: uint64 - mbr needed to add a new pool - paid to validator + poolInitMbr: uint64 - mbr needed to initStorage() of pool - paid to pool itself + addStakerMbr: uint64 - mbr staker needs to add to first staking payment (stays w/ validator) + ] + + * + * @param params The params for the smart contract call + * @returns The call params + */ + getMbrAmounts(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.getMbrAmounts(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getProtocolConstraints()(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64) ABI method. + * + * Returns the protocol constraints so that UIs can limit what users specify for validator configuration parameters. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getProtocolConstraints(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.getProtocolConstraints(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getNumValidators()uint64 ABI method. + * + * Returns the current number of validators + * + * @param params The params for the smart contract call + * @returns The call params + */ + getNumValidators(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.getNumValidators(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getValidatorConfig(uint64)(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64) ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getValidatorConfig(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.getValidatorConfig(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getValidatorState(uint64)(uint16,uint64,uint64,uint64) ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getValidatorState(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.getValidatorState(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getValidatorOwnerAndManager(uint64)(address,address) ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getValidatorOwnerAndManager(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.getValidatorOwnerAndManager(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getPools(uint64)(uint64,uint16,uint64)[] ABI method. + * + * Return list of all pools for this validator. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getPools(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.getPools(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getPoolAppId(uint64,uint64)uint64 ABI method. + * + * getPoolAppId is useful for callers to determine app to call for removing stake if they don't have staking or + want to get staker list for an account. The staking pool also uses it to get the app id of staking pool 1 + (which contains reward tokens if being used) so that the amount available can be determined. + + * + * @param params The params for the smart contract call + * @returns The call params + */ + getPoolAppId(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.getPoolAppId(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getPoolInfo((uint64,uint64,uint64))(uint64,uint16,uint64) ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getPoolInfo(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.getPoolInfo(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getCurMaxStakePerPool(uint64)uint64 ABI method. + * + * Calculate the maximum stake per pool for a given validator. + Normally this would be maxAlgoPerPool, but it should also never go above MaxAllowedStake / numPools so + as pools are added the max allowed per pool can reduce. + + * + * @param params The params for the smart contract call + * @returns The call params + */ + getCurMaxStakePerPool(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.getCurMaxStakePerPool(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the doesStakerNeedToPayMBR(address)bool ABI method. + * + * Helper callers can call w/ simulate to determine if 'AddStaker' MBR should be included w/ staking amount + * + * @param params The params for the smart contract call + * @returns The call params + */ + doesStakerNeedToPayMbr(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.doesStakerNeedToPayMbr(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getStakedPoolsForAccount(address)(uint64,uint64,uint64)[] ABI method. + * + * Retrieves the staked pools for an account. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getStakedPoolsForAccount(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.getStakedPoolsForAccount(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getTokenPayoutRatio(uint64)(uint64[24],uint64) ABI method. + * + * Retrieves the token payout ratio for a given validator - returning the pool ratios of whole so that token + payouts across pools can be based on a stable snaphost of stake. + + * + * @param params The params for the smart contract call + * @returns The call params + */ + getTokenPayoutRatio(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.getTokenPayoutRatio(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getNodePoolAssignments(uint64)((uint64[3])[8]) ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getNodePoolAssignments(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.getNodePoolAssignments(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getNFDRegistryID()uint64 ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getNfdRegistryId(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.getNfdRegistryId(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the addValidator(pay,string,(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64))uint64 ABI method. + * + * Adds a new validator + Requires at least 10 ALGO as the 'fee' for the transaction to help dissuade spammed validator adds. + + * + * @param params The params for the smart contract call + * @returns The call params: uint64 validator id + */ + addValidator(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.addValidator(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the changeValidatorManager(uint64,address)void ABI method. + * + * Changes the Validator manager for a specific Validator id. + [ ONLY OWNER CAN CHANGE ] + + * + * @param params The params for the smart contract call + * @returns The call params + */ + changeValidatorManager(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.changeValidatorManager(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the changeValidatorSunsetInfo(uint64,uint64,uint64)void ABI method. + * + * Updates the sunset information for a given validator. + [ ONLY OWNER CAN CHANGE ] + + * + * @param params The params for the smart contract call + * @returns The call params + */ + changeValidatorSunsetInfo(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.changeValidatorSunsetInfo(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the changeValidatorNFD(uint64,uint64,string)void ABI method. + * + * Changes the NFD for a validator in the validatorList contract. + [ ONLY OWNER CAN CHANGE ] + + * + * @param params The params for the smart contract call + * @returns The call params + */ + changeValidatorNfd(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.changeValidatorNfd(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the changeValidatorCommissionAddress(uint64,address)void ABI method. + * + * Change the commission address that validator rewards are sent to. + [ ONLY OWNER CAN CHANGE ] + + * + * @param params The params for the smart contract call + * @returns The call params + */ + changeValidatorCommissionAddress(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.changeValidatorCommissionAddress(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the changeValidatorRewardInfo(uint64,uint8,address,uint64[4],uint64,uint64)void ABI method. + * + * Allow the additional rewards (gating entry, additional token rewards) information be changed at will. + [ ONLY OWNER CAN CHANGE ] + + * + * @param params The params for the smart contract call + * @returns The call params + */ + changeValidatorRewardInfo(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.changeValidatorRewardInfo(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the addPool(pay,uint64,uint64)(uint64,uint64,uint64) ABI method. + * + * Adds a new pool to a validator's pool set, returning the 'key' to reference the pool in the future for staking, etc. + The caller must pay the cost of the validators MBR increase as well as the MBR that will be needed for the pool itself. + + + [ ONLY OWNER OR MANAGER CAN call ] + + * + * @param params The params for the smart contract call + * @returns The call params: ValidatorPoolKey pool key to created pool + */ + addPool(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.addPool(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the addStake(pay,uint64,uint64)(uint64,uint64,uint64) ABI method. + * + * Adds stake to a validator pool. + * + * @param params The params for the smart contract call + * @returns The call params: ValidatorPoolKey - The key of the validator pool. + */ + addStake(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.addStake(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the setTokenPayoutRatio(uint64)(uint64[24],uint64) ABI method. + * + * setTokenPayoutRatio is called by Staking Pool # 1 (ONLY) to ask the validator (us) to calculate the ratios + of stake in the pools for subsequent token payouts (ie: 2 pools, '100' algo total staked, 60 in pool 1, and 40 + in pool 2) This is done so we have a stable snapshot of stake - taken once per epoch - only triggered by + pool 1 doing payout. pools other than 1 doing payout call pool 1 to ask it do it first. + It would be 60/40% in the poolPctOfWhole values. The token reward payouts then use these values instead of + their 'current' stake which changes as part of the payouts themselves (and people could be changing stake + during the epoch updates across pools) + + + Multiple pools will call us via pool 1 (pool2-pool1-validator, etc.) so don't assert on pool1 calling multiple + times in same epoch. Just return. + + * + * @param params The params for the smart contract call + * @returns The call params: PoolTokenPayoutRatio - the finished ratio data + */ + setTokenPayoutRatio(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.setTokenPayoutRatio(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the stakeUpdatedViaRewards((uint64,uint64,uint64),uint64,uint64,uint64,uint64)void ABI method. + * + * stakeUpdatedViaRewards is called by Staking pools to inform the validator (us) that a particular amount of total + stake has been added to the specified pool. This is used to update the stats we have in our PoolInfo storage. + The calling App id is validated against our pool list as well. + + * + * @param params The params for the smart contract call + * @returns The call params + */ + stakeUpdatedViaRewards(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.stakeUpdatedViaRewards(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the stakeRemoved((uint64,uint64,uint64),address,uint64,uint64,bool)void ABI method. + * + * stakeRemoved is called by Staking pools to inform the validator (us) that a particular amount of total stake has been removed + from the specified pool. This is used to update the stats we have in our PoolInfo storage. + If any amount of rewardRemoved is specified, then that amount of reward is sent to the use + The calling App id is validated against our pool list as well. + + * + * @param params The params for the smart contract call + * @returns The call params + */ + stakeRemoved(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.stakeRemoved(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the findPoolForStaker(uint64,address,uint64)((uint64,uint64,uint64),bool,bool) ABI method. + * + * Finds the pool for a staker based on the provided validator id, staker address, and amount to stake. + First checks the stakers 'already staked list' for the validator preferring those (adding if possible) then adds + to new pool if necessary. + + * + * @param params The params for the smart contract call + * @returns The call params: ValidatorPoolKey, boolean, boolean - The pool for the staker, true/false on whether the staker is 'new' + to this VALIDATOR, and true/false if staker is new to the protocol. + + */ + findPoolForStaker(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.findPoolForStaker(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the movePoolToNode(uint64,uint64,uint64)void ABI method. + * + * Find the specified pool (in any node number) and move it to the specified node. + The pool account is forced offline if moved so prior node will still run for 320 rounds but + new key goes online on new node soon after (320 rounds after it goes online) + No-op if success, asserts if not found or can't move (no space in target) + [ ONLY OWNER OR MANAGER CAN CHANGE ] + + * + * @param params The params for the smart contract call + * @returns The call params + */ + movePoolToNode(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.movePoolToNode(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the emptyTokenRewards(uint64,address)uint64 ABI method. + * + * Sends the reward tokens held in pool 1 to specified receiver. + This is intended to be used by the owner when they want to get reward tokens 'back' which they sent to + the first pool (likely because validator is sunsetting. Any tokens currently 'reserved' for stakers to claim will + NOT be sent as they must be held back for stakers to later claim. + [ ONLY OWNER CAN CALL] + + * + * @param params The params for the smart contract call + * @returns The call params: uint64 the amount of reward token sent + */ + emptyTokenRewards(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.params.call(ValidatorRegistryParamsFactory.emptyTokenRewards(params)) + }, + } + })(this) + + /** + * Create transactions for the current app + */ + readonly createTransaction = (($this) => { + return { + /** + * Makes a clear_state call to an existing instance of the ValidatorRegistry smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState(params?: Expand) { + return $this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the ValidatorRegistry smart contract using the initStakingContract(uint64)void ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + initStakingContract(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.initStakingContract(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the loadStakingContractData(uint64,byte[])void ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + loadStakingContractData(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.loadStakingContractData(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the finalizeStakingContract()void ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + finalizeStakingContract(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.finalizeStakingContract(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the gas()void ABI method. + * + * gas is a dummy no-op call that can be used to pool-up resource references and opcode cost + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + gas(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.gas(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getMbrAmounts()(uint64,uint64,uint64,uint64) ABI method. + * + * Returns the MBR amounts needed for various actions: + [ + addValidatorMbr: uint64 - mbr needed to add a new validator - paid to validator contract + addPoolMbr: uint64 - mbr needed to add a new pool - paid to validator + poolInitMbr: uint64 - mbr needed to initStorage() of pool - paid to pool itself + addStakerMbr: uint64 - mbr staker needs to add to first staking payment (stays w/ validator) + ] + + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getMbrAmounts(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.getMbrAmounts(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getProtocolConstraints()(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64) ABI method. + * + * Returns the protocol constraints so that UIs can limit what users specify for validator configuration parameters. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getProtocolConstraints(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.getProtocolConstraints(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getNumValidators()uint64 ABI method. + * + * Returns the current number of validators + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getNumValidators(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.getNumValidators(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getValidatorConfig(uint64)(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64) ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getValidatorConfig(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.getValidatorConfig(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getValidatorState(uint64)(uint16,uint64,uint64,uint64) ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getValidatorState(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.getValidatorState(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getValidatorOwnerAndManager(uint64)(address,address) ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getValidatorOwnerAndManager(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.getValidatorOwnerAndManager(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getPools(uint64)(uint64,uint16,uint64)[] ABI method. + * + * Return list of all pools for this validator. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getPools(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.getPools(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getPoolAppId(uint64,uint64)uint64 ABI method. + * + * getPoolAppId is useful for callers to determine app to call for removing stake if they don't have staking or + want to get staker list for an account. The staking pool also uses it to get the app id of staking pool 1 + (which contains reward tokens if being used) so that the amount available can be determined. + + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getPoolAppId(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.getPoolAppId(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getPoolInfo((uint64,uint64,uint64))(uint64,uint16,uint64) ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getPoolInfo(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.getPoolInfo(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getCurMaxStakePerPool(uint64)uint64 ABI method. + * + * Calculate the maximum stake per pool for a given validator. + Normally this would be maxAlgoPerPool, but it should also never go above MaxAllowedStake / numPools so + as pools are added the max allowed per pool can reduce. + + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getCurMaxStakePerPool(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.getCurMaxStakePerPool(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the doesStakerNeedToPayMBR(address)bool ABI method. + * + * Helper callers can call w/ simulate to determine if 'AddStaker' MBR should be included w/ staking amount + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + doesStakerNeedToPayMbr(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.doesStakerNeedToPayMbr(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getStakedPoolsForAccount(address)(uint64,uint64,uint64)[] ABI method. + * + * Retrieves the staked pools for an account. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getStakedPoolsForAccount(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.getStakedPoolsForAccount(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getTokenPayoutRatio(uint64)(uint64[24],uint64) ABI method. + * + * Retrieves the token payout ratio for a given validator - returning the pool ratios of whole so that token + payouts across pools can be based on a stable snaphost of stake. + + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getTokenPayoutRatio(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.getTokenPayoutRatio(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getNodePoolAssignments(uint64)((uint64[3])[8]) ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getNodePoolAssignments(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.getNodePoolAssignments(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getNFDRegistryID()uint64 ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getNfdRegistryId(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.getNfdRegistryId(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the addValidator(pay,string,(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64))uint64 ABI method. + * + * Adds a new validator + Requires at least 10 ALGO as the 'fee' for the transaction to help dissuade spammed validator adds. + + * + * @param params The params for the smart contract call + * @returns The call transaction: uint64 validator id + */ + addValidator(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.addValidator(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the changeValidatorManager(uint64,address)void ABI method. + * + * Changes the Validator manager for a specific Validator id. + [ ONLY OWNER CAN CHANGE ] + + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + changeValidatorManager(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.changeValidatorManager(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the changeValidatorSunsetInfo(uint64,uint64,uint64)void ABI method. + * + * Updates the sunset information for a given validator. + [ ONLY OWNER CAN CHANGE ] + + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + changeValidatorSunsetInfo(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.changeValidatorSunsetInfo(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the changeValidatorNFD(uint64,uint64,string)void ABI method. + * + * Changes the NFD for a validator in the validatorList contract. + [ ONLY OWNER CAN CHANGE ] + + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + changeValidatorNfd(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.changeValidatorNfd(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the changeValidatorCommissionAddress(uint64,address)void ABI method. + * + * Change the commission address that validator rewards are sent to. + [ ONLY OWNER CAN CHANGE ] + + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + changeValidatorCommissionAddress(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.changeValidatorCommissionAddress(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the changeValidatorRewardInfo(uint64,uint8,address,uint64[4],uint64,uint64)void ABI method. + * + * Allow the additional rewards (gating entry, additional token rewards) information be changed at will. + [ ONLY OWNER CAN CHANGE ] + + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + changeValidatorRewardInfo(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.changeValidatorRewardInfo(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the addPool(pay,uint64,uint64)(uint64,uint64,uint64) ABI method. + * + * Adds a new pool to a validator's pool set, returning the 'key' to reference the pool in the future for staking, etc. + The caller must pay the cost of the validators MBR increase as well as the MBR that will be needed for the pool itself. + + + [ ONLY OWNER OR MANAGER CAN call ] + + * + * @param params The params for the smart contract call + * @returns The call transaction: ValidatorPoolKey pool key to created pool + */ + addPool(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.addPool(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the addStake(pay,uint64,uint64)(uint64,uint64,uint64) ABI method. + * + * Adds stake to a validator pool. + * + * @param params The params for the smart contract call + * @returns The call transaction: ValidatorPoolKey - The key of the validator pool. + */ + addStake(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.addStake(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the setTokenPayoutRatio(uint64)(uint64[24],uint64) ABI method. + * + * setTokenPayoutRatio is called by Staking Pool # 1 (ONLY) to ask the validator (us) to calculate the ratios + of stake in the pools for subsequent token payouts (ie: 2 pools, '100' algo total staked, 60 in pool 1, and 40 + in pool 2) This is done so we have a stable snapshot of stake - taken once per epoch - only triggered by + pool 1 doing payout. pools other than 1 doing payout call pool 1 to ask it do it first. + It would be 60/40% in the poolPctOfWhole values. The token reward payouts then use these values instead of + their 'current' stake which changes as part of the payouts themselves (and people could be changing stake + during the epoch updates across pools) + + + Multiple pools will call us via pool 1 (pool2-pool1-validator, etc.) so don't assert on pool1 calling multiple + times in same epoch. Just return. + + * + * @param params The params for the smart contract call + * @returns The call transaction: PoolTokenPayoutRatio - the finished ratio data + */ + setTokenPayoutRatio(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.setTokenPayoutRatio(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the stakeUpdatedViaRewards((uint64,uint64,uint64),uint64,uint64,uint64,uint64)void ABI method. + * + * stakeUpdatedViaRewards is called by Staking pools to inform the validator (us) that a particular amount of total + stake has been added to the specified pool. This is used to update the stats we have in our PoolInfo storage. + The calling App id is validated against our pool list as well. + + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + stakeUpdatedViaRewards(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.stakeUpdatedViaRewards(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the stakeRemoved((uint64,uint64,uint64),address,uint64,uint64,bool)void ABI method. + * + * stakeRemoved is called by Staking pools to inform the validator (us) that a particular amount of total stake has been removed + from the specified pool. This is used to update the stats we have in our PoolInfo storage. + If any amount of rewardRemoved is specified, then that amount of reward is sent to the use + The calling App id is validated against our pool list as well. + + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + stakeRemoved(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.stakeRemoved(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the findPoolForStaker(uint64,address,uint64)((uint64,uint64,uint64),bool,bool) ABI method. + * + * Finds the pool for a staker based on the provided validator id, staker address, and amount to stake. + First checks the stakers 'already staked list' for the validator preferring those (adding if possible) then adds + to new pool if necessary. + + * + * @param params The params for the smart contract call + * @returns The call transaction: ValidatorPoolKey, boolean, boolean - The pool for the staker, true/false on whether the staker is 'new' + to this VALIDATOR, and true/false if staker is new to the protocol. + + */ + findPoolForStaker(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.findPoolForStaker(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the movePoolToNode(uint64,uint64,uint64)void ABI method. + * + * Find the specified pool (in any node number) and move it to the specified node. + The pool account is forced offline if moved so prior node will still run for 320 rounds but + new key goes online on new node soon after (320 rounds after it goes online) + No-op if success, asserts if not found or can't move (no space in target) + [ ONLY OWNER OR MANAGER CAN CHANGE ] + + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + movePoolToNode(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.movePoolToNode(params)) + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the emptyTokenRewards(uint64,address)uint64 ABI method. + * + * Sends the reward tokens held in pool 1 to specified receiver. + This is intended to be used by the owner when they want to get reward tokens 'back' which they sent to + the first pool (likely because validator is sunsetting. Any tokens currently 'reserved' for stakers to claim will + NOT be sent as they must be held back for stakers to later claim. + [ ONLY OWNER CAN CALL] + + * + * @param params The params for the smart contract call + * @returns The call transaction: uint64 the amount of reward token sent + */ + emptyTokenRewards(params: Expand & {onComplete?: OnApplicationComplete.NoOpOC}>) { + return $this.appClient.createTransaction.call(ValidatorRegistryParamsFactory.emptyTokenRewards(params)) + }, + } + })(this) + + /** + * Send calls to the current app + */ + readonly send = (($this) => { + return { + /** + * Makes a clear_state call to an existing instance of the ValidatorRegistry smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState(params?: Expand) { + return $this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the ValidatorRegistry smart contract using the initStakingContract(uint64)void ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async initStakingContract(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.initStakingContract(params)) + return {...result, return: result.return as undefined | MethodReturn<'initStakingContract(uint64)void'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the loadStakingContractData(uint64,byte[])void ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async loadStakingContractData(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.loadStakingContractData(params)) + return {...result, return: result.return as undefined | MethodReturn<'loadStakingContractData(uint64,byte[])void'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the finalizeStakingContract()void ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async finalizeStakingContract(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.finalizeStakingContract(params)) + return {...result, return: result.return as undefined | MethodReturn<'finalizeStakingContract()void'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the gas()void ABI method. + * + * gas is a dummy no-op call that can be used to pool-up resource references and opcode cost + * + * @param params The params for the smart contract call + * @returns The call result + */ + async gas(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.gas(params)) + return {...result, return: result.return as undefined | MethodReturn<'gas()void'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getMbrAmounts()(uint64,uint64,uint64,uint64) ABI method. + * + * Returns the MBR amounts needed for various actions: + [ + addValidatorMbr: uint64 - mbr needed to add a new validator - paid to validator contract + addPoolMbr: uint64 - mbr needed to add a new pool - paid to validator + poolInitMbr: uint64 - mbr needed to initStorage() of pool - paid to pool itself + addStakerMbr: uint64 - mbr staker needs to add to first staking payment (stays w/ validator) + ] + + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getMbrAmounts(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.getMbrAmounts(params)) + return {...result, return: result.return as undefined | MethodReturn<'getMbrAmounts()(uint64,uint64,uint64,uint64)'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getProtocolConstraints()(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64) ABI method. + * + * Returns the protocol constraints so that UIs can limit what users specify for validator configuration parameters. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getProtocolConstraints(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.getProtocolConstraints(params)) + return {...result, return: result.return as undefined | MethodReturn<'getProtocolConstraints()(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getNumValidators()uint64 ABI method. + * + * Returns the current number of validators + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getNumValidators(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.getNumValidators(params)) + return {...result, return: result.return as undefined | MethodReturn<'getNumValidators()uint64'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getValidatorConfig(uint64)(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64) ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getValidatorConfig(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.getValidatorConfig(params)) + return {...result, return: result.return as undefined | MethodReturn<'getValidatorConfig(uint64)(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64)'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getValidatorState(uint64)(uint16,uint64,uint64,uint64) ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getValidatorState(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.getValidatorState(params)) + return {...result, return: result.return as undefined | MethodReturn<'getValidatorState(uint64)(uint16,uint64,uint64,uint64)'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getValidatorOwnerAndManager(uint64)(address,address) ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getValidatorOwnerAndManager(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.getValidatorOwnerAndManager(params)) + return {...result, return: result.return as undefined | MethodReturn<'getValidatorOwnerAndManager(uint64)(address,address)'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getPools(uint64)(uint64,uint16,uint64)[] ABI method. + * + * Return list of all pools for this validator. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getPools(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.getPools(params)) + return {...result, return: result.return as undefined | MethodReturn<'getPools(uint64)(uint64,uint16,uint64)[]'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getPoolAppId(uint64,uint64)uint64 ABI method. + * + * getPoolAppId is useful for callers to determine app to call for removing stake if they don't have staking or + want to get staker list for an account. The staking pool also uses it to get the app id of staking pool 1 + (which contains reward tokens if being used) so that the amount available can be determined. + + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getPoolAppId(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.getPoolAppId(params)) + return {...result, return: result.return as undefined | MethodReturn<'getPoolAppId(uint64,uint64)uint64'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getPoolInfo((uint64,uint64,uint64))(uint64,uint16,uint64) ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getPoolInfo(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.getPoolInfo(params)) + return {...result, return: result.return as undefined | MethodReturn<'getPoolInfo((uint64,uint64,uint64))(uint64,uint16,uint64)'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getCurMaxStakePerPool(uint64)uint64 ABI method. + * + * Calculate the maximum stake per pool for a given validator. + Normally this would be maxAlgoPerPool, but it should also never go above MaxAllowedStake / numPools so + as pools are added the max allowed per pool can reduce. + + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getCurMaxStakePerPool(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.getCurMaxStakePerPool(params)) + return {...result, return: result.return as undefined | MethodReturn<'getCurMaxStakePerPool(uint64)uint64'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the doesStakerNeedToPayMBR(address)bool ABI method. + * + * Helper callers can call w/ simulate to determine if 'AddStaker' MBR should be included w/ staking amount + * + * @param params The params for the smart contract call + * @returns The call result + */ + async doesStakerNeedToPayMbr(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.doesStakerNeedToPayMbr(params)) + return {...result, return: result.return as undefined | MethodReturn<'doesStakerNeedToPayMBR(address)bool'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getStakedPoolsForAccount(address)(uint64,uint64,uint64)[] ABI method. + * + * Retrieves the staked pools for an account. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getStakedPoolsForAccount(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.getStakedPoolsForAccount(params)) + return {...result, return: result.return as undefined | MethodReturn<'getStakedPoolsForAccount(address)(uint64,uint64,uint64)[]'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getTokenPayoutRatio(uint64)(uint64[24],uint64) ABI method. + * + * Retrieves the token payout ratio for a given validator - returning the pool ratios of whole so that token + payouts across pools can be based on a stable snaphost of stake. + + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getTokenPayoutRatio(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.getTokenPayoutRatio(params)) + return {...result, return: result.return as undefined | MethodReturn<'getTokenPayoutRatio(uint64)(uint64[24],uint64)'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getNodePoolAssignments(uint64)((uint64[3])[8]) ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getNodePoolAssignments(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.getNodePoolAssignments(params)) + return {...result, return: result.return as undefined | MethodReturn<'getNodePoolAssignments(uint64)((uint64[3])[8])'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the getNFDRegistryID()uint64 ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getNfdRegistryId(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}> = {args: []}) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.getNfdRegistryId(params)) + return {...result, return: result.return as undefined | MethodReturn<'getNFDRegistryID()uint64'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the addValidator(pay,string,(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64))uint64 ABI method. + * + * Adds a new validator + Requires at least 10 ALGO as the 'fee' for the transaction to help dissuade spammed validator adds. + + * + * @param params The params for the smart contract call + * @returns The call result: uint64 validator id + */ + async addValidator(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.addValidator(params)) + return {...result, return: result.return as undefined | MethodReturn<'addValidator(pay,string,(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64))uint64'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the changeValidatorManager(uint64,address)void ABI method. + * + * Changes the Validator manager for a specific Validator id. + [ ONLY OWNER CAN CHANGE ] + + * + * @param params The params for the smart contract call + * @returns The call result + */ + async changeValidatorManager(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.changeValidatorManager(params)) + return {...result, return: result.return as undefined | MethodReturn<'changeValidatorManager(uint64,address)void'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the changeValidatorSunsetInfo(uint64,uint64,uint64)void ABI method. + * + * Updates the sunset information for a given validator. + [ ONLY OWNER CAN CHANGE ] + + * + * @param params The params for the smart contract call + * @returns The call result + */ + async changeValidatorSunsetInfo(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.changeValidatorSunsetInfo(params)) + return {...result, return: result.return as undefined | MethodReturn<'changeValidatorSunsetInfo(uint64,uint64,uint64)void'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the changeValidatorNFD(uint64,uint64,string)void ABI method. + * + * Changes the NFD for a validator in the validatorList contract. + [ ONLY OWNER CAN CHANGE ] + + * + * @param params The params for the smart contract call + * @returns The call result + */ + async changeValidatorNfd(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.changeValidatorNfd(params)) + return {...result, return: result.return as undefined | MethodReturn<'changeValidatorNFD(uint64,uint64,string)void'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the changeValidatorCommissionAddress(uint64,address)void ABI method. + * + * Change the commission address that validator rewards are sent to. + [ ONLY OWNER CAN CHANGE ] + + * + * @param params The params for the smart contract call + * @returns The call result + */ + async changeValidatorCommissionAddress(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.changeValidatorCommissionAddress(params)) + return {...result, return: result.return as undefined | MethodReturn<'changeValidatorCommissionAddress(uint64,address)void'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the changeValidatorRewardInfo(uint64,uint8,address,uint64[4],uint64,uint64)void ABI method. + * + * Allow the additional rewards (gating entry, additional token rewards) information be changed at will. + [ ONLY OWNER CAN CHANGE ] + + * + * @param params The params for the smart contract call + * @returns The call result + */ + async changeValidatorRewardInfo(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.changeValidatorRewardInfo(params)) + return {...result, return: result.return as undefined | MethodReturn<'changeValidatorRewardInfo(uint64,uint8,address,uint64[4],uint64,uint64)void'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the addPool(pay,uint64,uint64)(uint64,uint64,uint64) ABI method. + * + * Adds a new pool to a validator's pool set, returning the 'key' to reference the pool in the future for staking, etc. + The caller must pay the cost of the validators MBR increase as well as the MBR that will be needed for the pool itself. + + + [ ONLY OWNER OR MANAGER CAN call ] + + * + * @param params The params for the smart contract call + * @returns The call result: ValidatorPoolKey pool key to created pool + */ + async addPool(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.addPool(params)) + return {...result, return: result.return as undefined | MethodReturn<'addPool(pay,uint64,uint64)(uint64,uint64,uint64)'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the addStake(pay,uint64,uint64)(uint64,uint64,uint64) ABI method. + * + * Adds stake to a validator pool. + * + * @param params The params for the smart contract call + * @returns The call result: ValidatorPoolKey - The key of the validator pool. + */ + async addStake(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.addStake(params)) + return {...result, return: result.return as undefined | MethodReturn<'addStake(pay,uint64,uint64)(uint64,uint64,uint64)'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the setTokenPayoutRatio(uint64)(uint64[24],uint64) ABI method. + * + * setTokenPayoutRatio is called by Staking Pool # 1 (ONLY) to ask the validator (us) to calculate the ratios + of stake in the pools for subsequent token payouts (ie: 2 pools, '100' algo total staked, 60 in pool 1, and 40 + in pool 2) This is done so we have a stable snapshot of stake - taken once per epoch - only triggered by + pool 1 doing payout. pools other than 1 doing payout call pool 1 to ask it do it first. + It would be 60/40% in the poolPctOfWhole values. The token reward payouts then use these values instead of + their 'current' stake which changes as part of the payouts themselves (and people could be changing stake + during the epoch updates across pools) + + + Multiple pools will call us via pool 1 (pool2-pool1-validator, etc.) so don't assert on pool1 calling multiple + times in same epoch. Just return. + + * + * @param params The params for the smart contract call + * @returns The call result: PoolTokenPayoutRatio - the finished ratio data + */ + async setTokenPayoutRatio(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.setTokenPayoutRatio(params)) + return {...result, return: result.return as undefined | MethodReturn<'setTokenPayoutRatio(uint64)(uint64[24],uint64)'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the stakeUpdatedViaRewards((uint64,uint64,uint64),uint64,uint64,uint64,uint64)void ABI method. + * + * stakeUpdatedViaRewards is called by Staking pools to inform the validator (us) that a particular amount of total + stake has been added to the specified pool. This is used to update the stats we have in our PoolInfo storage. + The calling App id is validated against our pool list as well. + + * + * @param params The params for the smart contract call + * @returns The call result + */ + async stakeUpdatedViaRewards(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.stakeUpdatedViaRewards(params)) + return {...result, return: result.return as undefined | MethodReturn<'stakeUpdatedViaRewards((uint64,uint64,uint64),uint64,uint64,uint64,uint64)void'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the stakeRemoved((uint64,uint64,uint64),address,uint64,uint64,bool)void ABI method. + * + * stakeRemoved is called by Staking pools to inform the validator (us) that a particular amount of total stake has been removed + from the specified pool. This is used to update the stats we have in our PoolInfo storage. + If any amount of rewardRemoved is specified, then that amount of reward is sent to the use + The calling App id is validated against our pool list as well. + + * + * @param params The params for the smart contract call + * @returns The call result + */ + async stakeRemoved(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.stakeRemoved(params)) + return {...result, return: result.return as undefined | MethodReturn<'stakeRemoved((uint64,uint64,uint64),address,uint64,uint64,bool)void'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the findPoolForStaker(uint64,address,uint64)((uint64,uint64,uint64),bool,bool) ABI method. + * + * Finds the pool for a staker based on the provided validator id, staker address, and amount to stake. + First checks the stakers 'already staked list' for the validator preferring those (adding if possible) then adds + to new pool if necessary. + + * + * @param params The params for the smart contract call + * @returns The call result: ValidatorPoolKey, boolean, boolean - The pool for the staker, true/false on whether the staker is 'new' + to this VALIDATOR, and true/false if staker is new to the protocol. + + */ + async findPoolForStaker(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.findPoolForStaker(params)) + return {...result, return: result.return as undefined | MethodReturn<'findPoolForStaker(uint64,address,uint64)((uint64,uint64,uint64),bool,bool)'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the movePoolToNode(uint64,uint64,uint64)void ABI method. + * + * Find the specified pool (in any node number) and move it to the specified node. + The pool account is forced offline if moved so prior node will still run for 320 rounds but + new key goes online on new node soon after (320 rounds after it goes online) + No-op if success, asserts if not found or can't move (no space in target) + [ ONLY OWNER OR MANAGER CAN CHANGE ] + + * + * @param params The params for the smart contract call + * @returns The call result + */ + async movePoolToNode(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.movePoolToNode(params)) + return {...result, return: result.return as undefined | MethodReturn<'movePoolToNode(uint64,uint64,uint64)void'>} + }, + /** + * Makes a call to the ValidatorRegistry smart contract using the emptyTokenRewards(uint64,address)uint64 ABI method. + * + * Sends the reward tokens held in pool 1 to specified receiver. + This is intended to be used by the owner when they want to get reward tokens 'back' which they sent to + the first pool (likely because validator is sunsetting. Any tokens currently 'reserved' for stakers to claim will + NOT be sent as they must be held back for stakers to later claim. + [ ONLY OWNER CAN CALL] + + * + * @param params The params for the smart contract call + * @returns The call result: uint64 the amount of reward token sent + */ + async emptyTokenRewards(params: Expand & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}>) { + const result = await $this.appClient.send.call(ValidatorRegistryParamsFactory.emptyTokenRewards(params)) + return {...result, return: result.return as undefined | MethodReturn<'emptyTokenRewards(uint64,address)uint64'>} + }, + } + })(this) + + /** + * Methods to access state for the current ValidatorRegistry app + */ + state = { + /** + * Methods to access global state for the current ValidatorRegistry app + */ + global: { + /** + * Get all current keyed values from global state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.global.getAll() + return { + stakingPoolInitialized: result.stakingPoolInitialized, + numValidators: result.numValidators, + numStakers: result.numStakers, + totalAlgoStaked: result.totalAlgoStaked, + } + }, + /** + * Get the current value of the stakingPoolInitialized key in global state + */ + stakingPoolInitialized: async (): Promise => { return (await this.appClient.state.global.getValue("stakingPoolInitialized")) as boolean | undefined }, + /** + * Get the current value of the numValidators key in global state + */ + numValidators: async (): Promise => { return (await this.appClient.state.global.getValue("numValidators")) as bigint | undefined }, + /** + * Get the current value of the numStakers key in global state + */ + numStakers: async (): Promise => { return (await this.appClient.state.global.getValue("numStakers")) as bigint | undefined }, + /** + * Get the current value of the totalAlgoStaked key in global state + */ + totalAlgoStaked: async (): Promise => { return (await this.appClient.state.global.getValue("totalAlgoStaked")) as bigint | undefined }, + }, + /** + * Methods to access box state for the current ValidatorRegistry app + */ + box: { + /** + * Get all current keyed values from box state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.box.getAll() + return { + stakingPoolApprovalProgram: result.stakingPoolApprovalProgram, + } + }, + /** + * Get the current value of the stakingPoolApprovalProgram key in box state + */ + stakingPoolApprovalProgram: async (): Promise => { return (await this.appClient.state.box.getValue("stakingPoolApprovalProgram")) as Uint8Array | undefined }, + /** + * Get values from the validatorList map in box state + */ + validatorList: { + /** + * Get all current values of the validatorList map in box state + */ + getMap: async (): Promise> => { return (await this.appClient.state.box.getMap("validatorList")) as Map }, + /** + * Get a current value of the validatorList map by key from box state + */ + value: async (key: bigint | number): Promise => { return await this.appClient.state.box.getMapValue("validatorList", key) as ValidatorInfo | undefined }, + }, + /** + * Get values from the stakerPoolSet map in box state + */ + stakerPoolSet: { + /** + * Get all current values of the stakerPoolSet map in box state + */ + getMap: async (): Promise> => { return (await this.appClient.state.box.getMap("stakerPoolSet")) as Map }, + /** + * Get a current value of the stakerPoolSet map by key from box state + */ + value: async (key: string): Promise<[[bigint, bigint, bigint], [bigint, bigint, bigint], [bigint, bigint, bigint], [bigint, bigint, bigint], [bigint, bigint, bigint], [bigint, bigint, bigint]] | undefined> => { return await this.appClient.state.box.getMapValue("stakerPoolSet", key) as [[bigint, bigint, bigint], [bigint, bigint, bigint], [bigint, bigint, bigint], [bigint, bigint, bigint], [bigint, bigint, bigint], [bigint, bigint, bigint]] | undefined }, + }, + }, + } + + public newGroup(): ValidatorRegistryComposer { + const client = this + const composer = client.appClient.newGroup() + let promiseChain:Promise = Promise.resolve() + const resultMappers: Array any)> = [] + return { + /** + * Add a initStakingContract(uint64)void method call against the ValidatorRegistry contract + */ + initStakingContract(params: CallParams<'initStakingContract(uint64)void'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.initStakingContract(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a loadStakingContractData(uint64,byte[])void method call against the ValidatorRegistry contract + */ + loadStakingContractData(params: CallParams<'loadStakingContractData(uint64,byte[])void'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.loadStakingContractData(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a finalizeStakingContract()void method call against the ValidatorRegistry contract + */ + finalizeStakingContract(params: CallParams<'finalizeStakingContract()void'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.finalizeStakingContract(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a gas()void method call against the ValidatorRegistry contract + */ + gas(params: CallParams<'gas()void'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.gas(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a getMbrAmounts()(uint64,uint64,uint64,uint64) method call against the ValidatorRegistry contract + */ + getMbrAmounts(params: CallParams<'getMbrAmounts()(uint64,uint64,uint64,uint64)'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getMbrAmounts(params))) + resultMappers.push((v) => client.decodeReturnValue('getMbrAmounts()(uint64,uint64,uint64,uint64)', v)) + return this + }, + /** + * Add a getProtocolConstraints()(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64) method call against the ValidatorRegistry contract + */ + getProtocolConstraints(params: CallParams<'getProtocolConstraints()(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getProtocolConstraints(params))) + resultMappers.push((v) => client.decodeReturnValue('getProtocolConstraints()(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)', v)) + return this + }, + /** + * Add a getNumValidators()uint64 method call against the ValidatorRegistry contract + */ + getNumValidators(params: CallParams<'getNumValidators()uint64'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getNumValidators(params))) + resultMappers.push((v) => client.decodeReturnValue('getNumValidators()uint64', v)) + return this + }, + /** + * Add a getValidatorConfig(uint64)(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64) method call against the ValidatorRegistry contract + */ + getValidatorConfig(params: CallParams<'getValidatorConfig(uint64)(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64)'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getValidatorConfig(params))) + resultMappers.push((v) => client.decodeReturnValue('getValidatorConfig(uint64)(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64)', v)) + return this + }, + /** + * Add a getValidatorState(uint64)(uint16,uint64,uint64,uint64) method call against the ValidatorRegistry contract + */ + getValidatorState(params: CallParams<'getValidatorState(uint64)(uint16,uint64,uint64,uint64)'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getValidatorState(params))) + resultMappers.push((v) => client.decodeReturnValue('getValidatorState(uint64)(uint16,uint64,uint64,uint64)', v)) + return this + }, + /** + * Add a getValidatorOwnerAndManager(uint64)(address,address) method call against the ValidatorRegistry contract + */ + getValidatorOwnerAndManager(params: CallParams<'getValidatorOwnerAndManager(uint64)(address,address)'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getValidatorOwnerAndManager(params))) + resultMappers.push((v) => client.decodeReturnValue('getValidatorOwnerAndManager(uint64)(address,address)', v)) + return this + }, + /** + * Add a getPools(uint64)(uint64,uint16,uint64)[] method call against the ValidatorRegistry contract + */ + getPools(params: CallParams<'getPools(uint64)(uint64,uint16,uint64)[]'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getPools(params))) + resultMappers.push((v) => client.decodeReturnValue('getPools(uint64)(uint64,uint16,uint64)[]', v)) + return this + }, + /** + * Add a getPoolAppId(uint64,uint64)uint64 method call against the ValidatorRegistry contract + */ + getPoolAppId(params: CallParams<'getPoolAppId(uint64,uint64)uint64'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getPoolAppId(params))) + resultMappers.push((v) => client.decodeReturnValue('getPoolAppId(uint64,uint64)uint64', v)) + return this + }, + /** + * Add a getPoolInfo((uint64,uint64,uint64))(uint64,uint16,uint64) method call against the ValidatorRegistry contract + */ + getPoolInfo(params: CallParams<'getPoolInfo((uint64,uint64,uint64))(uint64,uint16,uint64)'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getPoolInfo(params))) + resultMappers.push((v) => client.decodeReturnValue('getPoolInfo((uint64,uint64,uint64))(uint64,uint16,uint64)', v)) + return this + }, + /** + * Add a getCurMaxStakePerPool(uint64)uint64 method call against the ValidatorRegistry contract + */ + getCurMaxStakePerPool(params: CallParams<'getCurMaxStakePerPool(uint64)uint64'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getCurMaxStakePerPool(params))) + resultMappers.push((v) => client.decodeReturnValue('getCurMaxStakePerPool(uint64)uint64', v)) + return this + }, + /** + * Add a doesStakerNeedToPayMBR(address)bool method call against the ValidatorRegistry contract + */ + doesStakerNeedToPayMbr(params: CallParams<'doesStakerNeedToPayMBR(address)bool'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.doesStakerNeedToPayMbr(params))) + resultMappers.push((v) => client.decodeReturnValue('doesStakerNeedToPayMBR(address)bool', v)) + return this + }, + /** + * Add a getStakedPoolsForAccount(address)(uint64,uint64,uint64)[] method call against the ValidatorRegistry contract + */ + getStakedPoolsForAccount(params: CallParams<'getStakedPoolsForAccount(address)(uint64,uint64,uint64)[]'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getStakedPoolsForAccount(params))) + resultMappers.push((v) => client.decodeReturnValue('getStakedPoolsForAccount(address)(uint64,uint64,uint64)[]', v)) + return this + }, + /** + * Add a getTokenPayoutRatio(uint64)(uint64[24],uint64) method call against the ValidatorRegistry contract + */ + getTokenPayoutRatio(params: CallParams<'getTokenPayoutRatio(uint64)(uint64[24],uint64)'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getTokenPayoutRatio(params))) + resultMappers.push((v) => client.decodeReturnValue('getTokenPayoutRatio(uint64)(uint64[24],uint64)', v)) + return this + }, + /** + * Add a getNodePoolAssignments(uint64)((uint64[3])[8]) method call against the ValidatorRegistry contract + */ + getNodePoolAssignments(params: CallParams<'getNodePoolAssignments(uint64)((uint64[3])[8])'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getNodePoolAssignments(params))) + resultMappers.push((v) => client.decodeReturnValue('getNodePoolAssignments(uint64)((uint64[3])[8])', v)) + return this + }, + /** + * Add a getNFDRegistryID()uint64 method call against the ValidatorRegistry contract + */ + getNfdRegistryId(params: CallParams<'getNFDRegistryID()uint64'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getNfdRegistryId(params))) + resultMappers.push((v) => client.decodeReturnValue('getNFDRegistryID()uint64', v)) + return this + }, + /** + * Add a addValidator(pay,string,(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64))uint64 method call against the ValidatorRegistry contract + */ + addValidator(params: CallParams<'addValidator(pay,string,(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64))uint64'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.addValidator(params))) + resultMappers.push((v) => client.decodeReturnValue('addValidator(pay,string,(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64))uint64', v)) + return this + }, + /** + * Add a changeValidatorManager(uint64,address)void method call against the ValidatorRegistry contract + */ + changeValidatorManager(params: CallParams<'changeValidatorManager(uint64,address)void'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.changeValidatorManager(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a changeValidatorSunsetInfo(uint64,uint64,uint64)void method call against the ValidatorRegistry contract + */ + changeValidatorSunsetInfo(params: CallParams<'changeValidatorSunsetInfo(uint64,uint64,uint64)void'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.changeValidatorSunsetInfo(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a changeValidatorNFD(uint64,uint64,string)void method call against the ValidatorRegistry contract + */ + changeValidatorNfd(params: CallParams<'changeValidatorNFD(uint64,uint64,string)void'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.changeValidatorNfd(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a changeValidatorCommissionAddress(uint64,address)void method call against the ValidatorRegistry contract + */ + changeValidatorCommissionAddress(params: CallParams<'changeValidatorCommissionAddress(uint64,address)void'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.changeValidatorCommissionAddress(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a changeValidatorRewardInfo(uint64,uint8,address,uint64[4],uint64,uint64)void method call against the ValidatorRegistry contract + */ + changeValidatorRewardInfo(params: CallParams<'changeValidatorRewardInfo(uint64,uint8,address,uint64[4],uint64,uint64)void'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.changeValidatorRewardInfo(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a addPool(pay,uint64,uint64)(uint64,uint64,uint64) method call against the ValidatorRegistry contract + */ + addPool(params: CallParams<'addPool(pay,uint64,uint64)(uint64,uint64,uint64)'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.addPool(params))) + resultMappers.push((v) => client.decodeReturnValue('addPool(pay,uint64,uint64)(uint64,uint64,uint64)', v)) + return this + }, + /** + * Add a addStake(pay,uint64,uint64)(uint64,uint64,uint64) method call against the ValidatorRegistry contract + */ + addStake(params: CallParams<'addStake(pay,uint64,uint64)(uint64,uint64,uint64)'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.addStake(params))) + resultMappers.push((v) => client.decodeReturnValue('addStake(pay,uint64,uint64)(uint64,uint64,uint64)', v)) + return this + }, + /** + * Add a setTokenPayoutRatio(uint64)(uint64[24],uint64) method call against the ValidatorRegistry contract + */ + setTokenPayoutRatio(params: CallParams<'setTokenPayoutRatio(uint64)(uint64[24],uint64)'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setTokenPayoutRatio(params))) + resultMappers.push((v) => client.decodeReturnValue('setTokenPayoutRatio(uint64)(uint64[24],uint64)', v)) + return this + }, + /** + * Add a stakeUpdatedViaRewards((uint64,uint64,uint64),uint64,uint64,uint64,uint64)void method call against the ValidatorRegistry contract + */ + stakeUpdatedViaRewards(params: CallParams<'stakeUpdatedViaRewards((uint64,uint64,uint64),uint64,uint64,uint64,uint64)void'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.stakeUpdatedViaRewards(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a stakeRemoved((uint64,uint64,uint64),address,uint64,uint64,bool)void method call against the ValidatorRegistry contract + */ + stakeRemoved(params: CallParams<'stakeRemoved((uint64,uint64,uint64),address,uint64,uint64,bool)void'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.stakeRemoved(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a findPoolForStaker(uint64,address,uint64)((uint64,uint64,uint64),bool,bool) method call against the ValidatorRegistry contract + */ + findPoolForStaker(params: CallParams<'findPoolForStaker(uint64,address,uint64)((uint64,uint64,uint64),bool,bool)'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.findPoolForStaker(params))) + resultMappers.push((v) => client.decodeReturnValue('findPoolForStaker(uint64,address,uint64)((uint64,uint64,uint64),bool,bool)', v)) + return this + }, + /** + * Add a movePoolToNode(uint64,uint64,uint64)void method call against the ValidatorRegistry contract + */ + movePoolToNode(params: CallParams<'movePoolToNode(uint64,uint64,uint64)void'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.movePoolToNode(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a emptyTokenRewards(uint64,address)uint64 method call against the ValidatorRegistry contract + */ + emptyTokenRewards(params: CallParams<'emptyTokenRewards(uint64,address)uint64'> & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.emptyTokenRewards(params))) + resultMappers.push((v) => client.decodeReturnValue('emptyTokenRewards(uint64,address)uint64', v)) + return this + }, + /** + * Add a clear state call to the ValidatorRegistry contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await composer.simulate(options) + return { + ...result, + returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) + } + } + } as unknown as ValidatorRegistryComposer + } +} +export type ValidatorRegistryComposer = { + /** + * Calls the initStakingContract(uint64)void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + initStakingContract(params?: CallParams<'initStakingContract(uint64)void'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'initStakingContract(uint64)void'> | undefined]> + + /** + * Calls the loadStakingContractData(uint64,byte[])void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + loadStakingContractData(params?: CallParams<'loadStakingContractData(uint64,byte[])void'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'loadStakingContractData(uint64,byte[])void'> | undefined]> + + /** + * Calls the finalizeStakingContract()void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + finalizeStakingContract(params?: CallParams<'finalizeStakingContract()void'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'finalizeStakingContract()void'> | undefined]> + + /** + * Calls the gas()void ABI method. + * + * gas is a dummy no-op call that can be used to pool-up resource references and opcode cost + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + gas(params?: CallParams<'gas()void'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'gas()void'> | undefined]> + + /** + * Calls the getMbrAmounts()(uint64,uint64,uint64,uint64) ABI method. + * + * Returns the MBR amounts needed for various actions: + [ + addValidatorMbr: uint64 - mbr needed to add a new validator - paid to validator contract + addPoolMbr: uint64 - mbr needed to add a new pool - paid to validator + poolInitMbr: uint64 - mbr needed to initStorage() of pool - paid to pool itself + addStakerMbr: uint64 - mbr staker needs to add to first staking payment (stays w/ validator) + ] + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getMbrAmounts(params?: CallParams<'getMbrAmounts()(uint64,uint64,uint64,uint64)'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'getMbrAmounts()(uint64,uint64,uint64,uint64)'> | undefined]> + + /** + * Calls the getProtocolConstraints()(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64) ABI method. + * + * Returns the protocol constraints so that UIs can limit what users specify for validator configuration parameters. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getProtocolConstraints(params?: CallParams<'getProtocolConstraints()(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'getProtocolConstraints()(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)'> | undefined]> + + /** + * Calls the getNumValidators()uint64 ABI method. + * + * Returns the current number of validators + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getNumValidators(params?: CallParams<'getNumValidators()uint64'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'getNumValidators()uint64'> | undefined]> + + /** + * Calls the getValidatorConfig(uint64)(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64) ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getValidatorConfig(params?: CallParams<'getValidatorConfig(uint64)(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64)'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'getValidatorConfig(uint64)(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64)'> | undefined]> + + /** + * Calls the getValidatorState(uint64)(uint16,uint64,uint64,uint64) ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getValidatorState(params?: CallParams<'getValidatorState(uint64)(uint16,uint64,uint64,uint64)'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'getValidatorState(uint64)(uint16,uint64,uint64,uint64)'> | undefined]> + + /** + * Calls the getValidatorOwnerAndManager(uint64)(address,address) ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getValidatorOwnerAndManager(params?: CallParams<'getValidatorOwnerAndManager(uint64)(address,address)'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'getValidatorOwnerAndManager(uint64)(address,address)'> | undefined]> + + /** + * Calls the getPools(uint64)(uint64,uint16,uint64)[] ABI method. + * + * Return list of all pools for this validator. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getPools(params?: CallParams<'getPools(uint64)(uint64,uint16,uint64)[]'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'getPools(uint64)(uint64,uint16,uint64)[]'> | undefined]> + + /** + * Calls the getPoolAppId(uint64,uint64)uint64 ABI method. + * + * getPoolAppId is useful for callers to determine app to call for removing stake if they don't have staking or + want to get staker list for an account. The staking pool also uses it to get the app id of staking pool 1 + (which contains reward tokens if being used) so that the amount available can be determined. + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getPoolAppId(params?: CallParams<'getPoolAppId(uint64,uint64)uint64'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'getPoolAppId(uint64,uint64)uint64'> | undefined]> + + /** + * Calls the getPoolInfo((uint64,uint64,uint64))(uint64,uint16,uint64) ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getPoolInfo(params?: CallParams<'getPoolInfo((uint64,uint64,uint64))(uint64,uint16,uint64)'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'getPoolInfo((uint64,uint64,uint64))(uint64,uint16,uint64)'> | undefined]> + + /** + * Calls the getCurMaxStakePerPool(uint64)uint64 ABI method. + * + * Calculate the maximum stake per pool for a given validator. + Normally this would be maxAlgoPerPool, but it should also never go above MaxAllowedStake / numPools so + as pools are added the max allowed per pool can reduce. + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getCurMaxStakePerPool(params?: CallParams<'getCurMaxStakePerPool(uint64)uint64'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'getCurMaxStakePerPool(uint64)uint64'> | undefined]> + + /** + * Calls the doesStakerNeedToPayMBR(address)bool ABI method. + * + * Helper callers can call w/ simulate to determine if 'AddStaker' MBR should be included w/ staking amount + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + doesStakerNeedToPayMbr(params?: CallParams<'doesStakerNeedToPayMBR(address)bool'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'doesStakerNeedToPayMBR(address)bool'> | undefined]> + + /** + * Calls the getStakedPoolsForAccount(address)(uint64,uint64,uint64)[] ABI method. + * + * Retrieves the staked pools for an account. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getStakedPoolsForAccount(params?: CallParams<'getStakedPoolsForAccount(address)(uint64,uint64,uint64)[]'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'getStakedPoolsForAccount(address)(uint64,uint64,uint64)[]'> | undefined]> + + /** + * Calls the getTokenPayoutRatio(uint64)(uint64[24],uint64) ABI method. + * + * Retrieves the token payout ratio for a given validator - returning the pool ratios of whole so that token + payouts across pools can be based on a stable snaphost of stake. + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getTokenPayoutRatio(params?: CallParams<'getTokenPayoutRatio(uint64)(uint64[24],uint64)'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'getTokenPayoutRatio(uint64)(uint64[24],uint64)'> | undefined]> + + /** + * Calls the getNodePoolAssignments(uint64)((uint64[3])[8]) ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getNodePoolAssignments(params?: CallParams<'getNodePoolAssignments(uint64)((uint64[3])[8])'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'getNodePoolAssignments(uint64)((uint64[3])[8])'> | undefined]> + + /** + * Calls the getNFDRegistryID()uint64 ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getNfdRegistryId(params?: CallParams<'getNFDRegistryID()uint64'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'getNFDRegistryID()uint64'> | undefined]> + + /** + * Calls the addValidator(pay,string,(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64))uint64 ABI method. + * + * Adds a new validator + Requires at least 10 ALGO as the 'fee' for the transaction to help dissuade spammed validator adds. + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + addValidator(params?: CallParams<'addValidator(pay,string,(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64))uint64'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'addValidator(pay,string,(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64))uint64'> | undefined]> + + /** + * Calls the changeValidatorManager(uint64,address)void ABI method. + * + * Changes the Validator manager for a specific Validator id. + [ ONLY OWNER CAN CHANGE ] + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + changeValidatorManager(params?: CallParams<'changeValidatorManager(uint64,address)void'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'changeValidatorManager(uint64,address)void'> | undefined]> + + /** + * Calls the changeValidatorSunsetInfo(uint64,uint64,uint64)void ABI method. + * + * Updates the sunset information for a given validator. + [ ONLY OWNER CAN CHANGE ] + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + changeValidatorSunsetInfo(params?: CallParams<'changeValidatorSunsetInfo(uint64,uint64,uint64)void'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'changeValidatorSunsetInfo(uint64,uint64,uint64)void'> | undefined]> + + /** + * Calls the changeValidatorNFD(uint64,uint64,string)void ABI method. + * + * Changes the NFD for a validator in the validatorList contract. + [ ONLY OWNER CAN CHANGE ] + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + changeValidatorNfd(params?: CallParams<'changeValidatorNFD(uint64,uint64,string)void'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'changeValidatorNFD(uint64,uint64,string)void'> | undefined]> + + /** + * Calls the changeValidatorCommissionAddress(uint64,address)void ABI method. + * + * Change the commission address that validator rewards are sent to. + [ ONLY OWNER CAN CHANGE ] + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + changeValidatorCommissionAddress(params?: CallParams<'changeValidatorCommissionAddress(uint64,address)void'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'changeValidatorCommissionAddress(uint64,address)void'> | undefined]> + + /** + * Calls the changeValidatorRewardInfo(uint64,uint8,address,uint64[4],uint64,uint64)void ABI method. + * + * Allow the additional rewards (gating entry, additional token rewards) information be changed at will. + [ ONLY OWNER CAN CHANGE ] + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + changeValidatorRewardInfo(params?: CallParams<'changeValidatorRewardInfo(uint64,uint8,address,uint64[4],uint64,uint64)void'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'changeValidatorRewardInfo(uint64,uint8,address,uint64[4],uint64,uint64)void'> | undefined]> + + /** + * Calls the addPool(pay,uint64,uint64)(uint64,uint64,uint64) ABI method. + * + * Adds a new pool to a validator's pool set, returning the 'key' to reference the pool in the future for staking, etc. + The caller must pay the cost of the validators MBR increase as well as the MBR that will be needed for the pool itself. + + + [ ONLY OWNER OR MANAGER CAN call ] + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + addPool(params?: CallParams<'addPool(pay,uint64,uint64)(uint64,uint64,uint64)'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'addPool(pay,uint64,uint64)(uint64,uint64,uint64)'> | undefined]> + + /** + * Calls the addStake(pay,uint64,uint64)(uint64,uint64,uint64) ABI method. + * + * Adds stake to a validator pool. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + addStake(params?: CallParams<'addStake(pay,uint64,uint64)(uint64,uint64,uint64)'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'addStake(pay,uint64,uint64)(uint64,uint64,uint64)'> | undefined]> + + /** + * Calls the setTokenPayoutRatio(uint64)(uint64[24],uint64) ABI method. + * + * setTokenPayoutRatio is called by Staking Pool # 1 (ONLY) to ask the validator (us) to calculate the ratios + of stake in the pools for subsequent token payouts (ie: 2 pools, '100' algo total staked, 60 in pool 1, and 40 + in pool 2) This is done so we have a stable snapshot of stake - taken once per epoch - only triggered by + pool 1 doing payout. pools other than 1 doing payout call pool 1 to ask it do it first. + It would be 60/40% in the poolPctOfWhole values. The token reward payouts then use these values instead of + their 'current' stake which changes as part of the payouts themselves (and people could be changing stake + during the epoch updates across pools) + + + Multiple pools will call us via pool 1 (pool2-pool1-validator, etc.) so don't assert on pool1 calling multiple + times in same epoch. Just return. + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + setTokenPayoutRatio(params?: CallParams<'setTokenPayoutRatio(uint64)(uint64[24],uint64)'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'setTokenPayoutRatio(uint64)(uint64[24],uint64)'> | undefined]> + + /** + * Calls the stakeUpdatedViaRewards((uint64,uint64,uint64),uint64,uint64,uint64,uint64)void ABI method. + * + * stakeUpdatedViaRewards is called by Staking pools to inform the validator (us) that a particular amount of total + stake has been added to the specified pool. This is used to update the stats we have in our PoolInfo storage. + The calling App id is validated against our pool list as well. + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + stakeUpdatedViaRewards(params?: CallParams<'stakeUpdatedViaRewards((uint64,uint64,uint64),uint64,uint64,uint64,uint64)void'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'stakeUpdatedViaRewards((uint64,uint64,uint64),uint64,uint64,uint64,uint64)void'> | undefined]> + + /** + * Calls the stakeRemoved((uint64,uint64,uint64),address,uint64,uint64,bool)void ABI method. + * + * stakeRemoved is called by Staking pools to inform the validator (us) that a particular amount of total stake has been removed + from the specified pool. This is used to update the stats we have in our PoolInfo storage. + If any amount of rewardRemoved is specified, then that amount of reward is sent to the use + The calling App id is validated against our pool list as well. + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + stakeRemoved(params?: CallParams<'stakeRemoved((uint64,uint64,uint64),address,uint64,uint64,bool)void'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'stakeRemoved((uint64,uint64,uint64),address,uint64,uint64,bool)void'> | undefined]> + + /** + * Calls the findPoolForStaker(uint64,address,uint64)((uint64,uint64,uint64),bool,bool) ABI method. + * + * Finds the pool for a staker based on the provided validator id, staker address, and amount to stake. + First checks the stakers 'already staked list' for the validator preferring those (adding if possible) then adds + to new pool if necessary. + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + findPoolForStaker(params?: CallParams<'findPoolForStaker(uint64,address,uint64)((uint64,uint64,uint64),bool,bool)'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'findPoolForStaker(uint64,address,uint64)((uint64,uint64,uint64),bool,bool)'> | undefined]> + + /** + * Calls the movePoolToNode(uint64,uint64,uint64)void ABI method. + * + * Find the specified pool (in any node number) and move it to the specified node. + The pool account is forced offline if moved so prior node will still run for 320 rounds but + new key goes online on new node soon after (320 rounds after it goes online) + No-op if success, asserts if not found or can't move (no space in target) + [ ONLY OWNER OR MANAGER CAN CHANGE ] + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + movePoolToNode(params?: CallParams<'movePoolToNode(uint64,uint64,uint64)void'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'movePoolToNode(uint64,uint64,uint64)void'> | undefined]> + + /** + * Calls the emptyTokenRewards(uint64,address)uint64 ABI method. + * + * Sends the reward tokens held in pool 1 to specified receiver. + This is intended to be used by the owner when they want to get reward tokens 'back' which they sent to + the first pool (likely because validator is sunsetting. Any tokens currently 'reserved' for stakers to claim will + NOT be sent as they must be held back for stakers to later claim. + [ ONLY OWNER CAN CALL] + + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + emptyTokenRewards(params?: CallParams<'emptyTokenRewards(uint64,address)uint64'>): ValidatorRegistryComposer<[...TReturns, MethodReturn<'emptyTokenRewards(uint64,address)uint64'> | undefined]> + + /** + * Makes a clear_state call to an existing instance of the ValidatorRegistry smart contract. + * + * @param args The arguments for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): ValidatorRegistryComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): ValidatorRegistryComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): AlgoKitComposer + /** + * Simulates the transaction group and returns the result + */ + simulate(options?: SimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type ValidatorRegistryComposerResults = Expand + diff --git a/contracts/helpers/helpers.ts b/contracts/helpers/helpers.ts index 00e85765..f64bc2a7 100644 --- a/contracts/helpers/helpers.ts +++ b/contracts/helpers/helpers.ts @@ -1,22 +1,12 @@ -import { - Account, - Address, - Algodv2, - bytesToBigInt, - decodeAddress, - encodeAddress, - encodeUint64, - getApplicationAddress, - makeAssetCreateTxnWithSuggestedParamsFromObject, - makePaymentTxnWithSuggestedParamsFromObject, -} from 'algosdk' +import { Account, getApplicationAddress } from 'algosdk' +import { randomUUID } from 'crypto' import { LogicError } from '@algorandfoundation/algokit-utils/types/logic-error' import { AlgoAmount } from '@algorandfoundation/algokit-utils/types/amount' import { AlgorandTestAutomationContext } from '@algorandfoundation/algokit-utils/types/testing' import { consoleLogger } from '@algorandfoundation/algokit-utils/types/logging' -import { signTransaction, waitForConfirmation } from '@algorandfoundation/algokit-utils' -import { ValidatorRegistryClient } from '../contracts/clients/ValidatorRegistryClient' -import { StakingPoolClient } from '../contracts/clients/StakingPoolClient' +import { PoolInfo, ValidatorConfig, ValidatorRegistryClient } from '../contracts/clients_new/ValidatorRegistryClient' +import { StakedInfo, StakingPoolClient, ValidatorPoolKey } from '../contracts/clients_new/StakingPoolClient' +import { PaymentParams } from '@algorandfoundation/algokit-utils/types/composer' export const ALGORAND_ZERO_ADDRESS_STRING = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ' @@ -26,967 +16,464 @@ export const GATING_TYPE_ASSET_ID = 2 export const GATING_TYPE_CREATED_BY_NFD_ADDRESSES = 3 export const GATING_TYPE_SEGMENT_OF_NFD = 4 -export class ValidatorConfig { - id: bigint // id of this validator (sequentially assigned) - - owner: string // account that controls config - presumably cold-wallet - - manager: string // account that triggers/pays for payouts and keyreg transactions - needs to be hotwallet as node has to sign for the transactions - - // Optional NFD AppID which the validator uses to describe their validator pool - // NFD must be currently OWNED by address that adds the validator - nfdForInfo: bigint - - entryGatingType: number - - entryGatingAddress: string - - entryGatingAssets: [bigint, bigint, bigint, bigint] - - gatingAssetMinBalance: bigint - - rewardTokenID: bigint - - rewardPerPayout: bigint - - epochRoundLength: number // Payout frequency in minutes (can be no shorter than this) - - percentToValidator: number // Payout percentage expressed w/ four decimals - ie: 50000 = 5% -> .0005 - - - validatorCommissionAddress: string // account that receives the validation commission each epoch payout - - minEntryStake: bigint // minimum stake required to enter pool - - maxAlgoPerPool: bigint // maximum stake allowed per pool (to keep under incentive limits) - - poolsPerNode: number // Number of pools to allow per node (max of 3 is recommended) - - sunsettingOn: bigint // timestamp when validator will sunset (if != 0) - - sunsettingTo: bigint // validator id that validator is 'moving' to (if known) - - // getValidatorConfig(uint64)(uint64,address,address,uint64,uint16,uint32,address,uint64,uint64,uint8) - // constructor to take array of values like ABI string above and set into the named instance vars - constructor([ - id, - owner, - manager, - nfdForInfo, - entryGatingType, - entryGatingAddress, - entryGatingAssets, - gatingAssetMinBalance, - rewardTokenID, - rewardPerPayout, - epochRoundLength, - percentToValidator, - validatorCommissionAddress, - minEntryStake, - maxAlgoPerPool, - poolsPerNode, - sunsettingOn, - sunsettingTo, - ]: [ - bigint, - string, - string, - bigint, - number, - string, - [bigint, bigint, bigint, bigint], - bigint, - bigint, - bigint, - number, - number, - string, - bigint, - bigint, - number, - bigint, - bigint, - ]) { - this.id = id - this.owner = owner - this.manager = manager - this.nfdForInfo = nfdForInfo - this.entryGatingType = Number(entryGatingType) - this.entryGatingAddress = entryGatingAddress - this.entryGatingAssets = entryGatingAssets - this.gatingAssetMinBalance = gatingAssetMinBalance - this.rewardTokenID = rewardTokenID - this.rewardPerPayout = rewardPerPayout - this.epochRoundLength = Number(epochRoundLength) - this.percentToValidator = Number(percentToValidator) - this.validatorCommissionAddress = validatorCommissionAddress - this.minEntryStake = minEntryStake - this.maxAlgoPerPool = maxAlgoPerPool - this.poolsPerNode = Number(poolsPerNode) - this.sunsettingOn = sunsettingOn - this.sunsettingTo = sunsettingTo - } -} - const DefaultValidatorConfig: ValidatorConfig = { - id: BigInt(0), - owner: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ', - manager: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ', - nfdForInfo: 0n, - entryGatingType: GATING_TYPE_NONE, - entryGatingAddress: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ', - entryGatingAssets: [0n, 0n, 0n, 0n], - gatingAssetMinBalance: 0n, - rewardTokenID: 0n, - rewardPerPayout: 0n, - epochRoundLength: 1, // minimum allowed - percentToValidator: 10000, // 1.0000% - validatorCommissionAddress: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ', - minEntryStake: BigInt(AlgoAmount.Algos(1000).microAlgos), - maxAlgoPerPool: 0n, // float w/ online caps - poolsPerNode: 3, - sunsettingOn: 0n, - sunsettingTo: 0n, + id: BigInt(0), + owner: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ', + manager: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ', + nfdForInfo: 0n, + entryGatingType: GATING_TYPE_NONE, + entryGatingAddress: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ', + entryGatingAssets: [0n, 0n, 0n, 0n], + gatingAssetMinBalance: 0n, + rewardTokenId: 0n, + rewardPerPayout: 0n, + epochRoundLength: 1, // minimum allowed + percentToValidator: 10000, // 1.0000% + validatorCommissionAddress: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ', + minEntryStake: BigInt(AlgoAmount.Algos(1000).microAlgos), + maxAlgoPerPool: 0n, // float w/ online caps + poolsPerNode: 3, + sunsettingOn: 0n, + sunsettingTo: 0n, } export function createValidatorConfig(inputConfig: Partial): ValidatorConfig { - const configObj = { - ...DefaultValidatorConfig, - ...inputConfig, - } - - return new ValidatorConfig([ - configObj.id, - configObj.owner, - configObj.manager, - configObj.nfdForInfo, - configObj.entryGatingType, - configObj.entryGatingAddress, - configObj.entryGatingAssets, - configObj.gatingAssetMinBalance, - configObj.rewardTokenID, - configObj.rewardPerPayout, - configObj.epochRoundLength, - configObj.percentToValidator, - configObj.validatorCommissionAddress, - configObj.minEntryStake, - configObj.maxAlgoPerPool, - configObj.poolsPerNode, - configObj.sunsettingOn, - configObj.sunsettingTo, - ]) -} - -function validatorConfigAsArray( - config: ValidatorConfig, -): [ - bigint, - string, - string, - bigint, - number, - string, - [bigint, bigint, bigint, bigint], - bigint, - bigint, - bigint, - number, - number, - string, - bigint, - bigint, - number, - bigint, - bigint, -] { - return [ - config.id, - config.owner, - config.manager, - config.nfdForInfo, - config.entryGatingType, - config.entryGatingAddress, - config.entryGatingAssets, - config.gatingAssetMinBalance, - config.rewardTokenID, - config.rewardPerPayout, - config.epochRoundLength, - config.percentToValidator, - config.validatorCommissionAddress, - config.minEntryStake, - config.maxAlgoPerPool, - config.poolsPerNode, - config.sunsettingOn, - config.sunsettingTo, - ] -} - -class ValidatorCurState { - numPools: number // current number of pools this validator has - capped at MaxPools - - totalStakers: bigint // total number of stakers across all pools - - totalAlgoStaked: bigint // total amount staked to this validator across ALL of its pools - - rewardTokenHeldBack: bigint // amount of token held back for future payout to stakers - - constructor([numPools, totalStakers, totalAlgoStaked, rewardTokenHeldBack]: [number, bigint, bigint, bigint]) { - this.numPools = Number(numPools) - this.totalStakers = totalStakers - this.totalAlgoStaked = totalAlgoStaked - this.rewardTokenHeldBack = rewardTokenHeldBack - } -} - -export class PoolInfo { - poolAppId: bigint // The App id of this staking pool contract instance - - totalStakers: number - - totalAlgoStaked: bigint - - constructor([poolAppId, totalStakers, totalAlgoStaked]: [bigint, number, bigint]) { - this.poolAppId = poolAppId - this.totalStakers = Number(totalStakers) - this.totalAlgoStaked = totalAlgoStaked - } -} - -export class ValidatorPoolKey { - id: bigint - - poolId: bigint // 0 means INVALID ! - so 1 is index, technically of [0] - - poolAppId: bigint - - constructor([id, poolId, poolAppId]: [bigint, bigint, bigint]) { - this.id = id - this.poolId = poolId - this.poolAppId = poolAppId - } - - encode(): [bigint, bigint, bigint] { - return [this.id, this.poolId, this.poolAppId] - } -} - -// StakedInfo is the testing-friendly version of what's stored as a static array in each staking pool -export class StakedInfo { - staker: Address - - balance: bigint - - totalRewarded: bigint - - rewardTokenBalance: bigint - - entryRound: bigint - - constructor(data: Uint8Array) { - this.staker = decodeAddress(encodeAddress(data.slice(0, 32))) - this.balance = bytesToBigInt(data.slice(32, 40)) - this.totalRewarded = bytesToBigInt(data.slice(40, 48)) - this.rewardTokenBalance = bytesToBigInt(data.slice(48, 56)) - this.entryRound = bytesToBigInt(data.slice(56, 64)) - } - - public static fromValues([staker, balance, totalRewarded, rewardTokenBalance, entryRound]: [ - string, - bigint, - bigint, - bigint, - bigint, - ]): StakedInfo { - return { - staker: decodeAddress(staker), - balance, - totalRewarded, - rewardTokenBalance, - entryRound, - } - } - - public static FromBoxData(boxData: Uint8Array): StakedInfo[] { - // take 64-byte chunks of boxData and return as an array of StakedInfo values (initialized via its constructor - // which takes 64-byte chunks and returns an initialized StakedInfo - const chunkSize = 64 - const stakedInfoArray: StakedInfo[] = [] - for (let i = 0; i < boxData.length; i += chunkSize) { - const chunk = boxData.slice(i, i + chunkSize) - stakedInfoArray.push(new StakedInfo(chunk)) - } - return stakedInfoArray - } -} - -// ProtocolConstraints returns data from the contracts on minimums, maximums, etc. -export class ProtocolConstraints { - epochPayoutRoundsMin: bigint - - epochPayoutRoundsMax: bigint - - MinPctToValidatorWFourDecimals: bigint - - MaxPctToValidatorWFourDecimals: bigint - - MinEntryStake: bigint // in microAlgo - - MaxAlgoPerPool: bigint // in microAlgo - - MaxAlgoPerValidator: bigint // in microAlgo - - AmtConsideredSaturated: bigint - - MaxNodes: bigint - - MaxPoolsPerNode: bigint - - MaxStakersPerPool: bigint - - constructor([ - epochPayoutRoundsMin, - epochPayoutRoundsMax, - MinPctToValidatorWFourDecimals, - MaxPctToValidatorWFourDecimals, - MinEntryStake, - MaxAlgoPerPool, - MaxAlgoPerValidator, - AmtConsideredSaturated, - MaxNodes, - MaxPoolsPerNode, - MaxStakersPerPool, - ]: [bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint]) { - this.epochPayoutRoundsMin = epochPayoutRoundsMin - this.epochPayoutRoundsMax = epochPayoutRoundsMax - this.MinPctToValidatorWFourDecimals = MinPctToValidatorWFourDecimals - this.MaxPctToValidatorWFourDecimals = MaxPctToValidatorWFourDecimals - this.MinEntryStake = MinEntryStake - this.MaxAlgoPerPool = MaxAlgoPerPool - this.MaxAlgoPerValidator = MaxAlgoPerValidator - this.AmtConsideredSaturated = AmtConsideredSaturated - this.MaxNodes = MaxNodes - this.MaxPoolsPerNode = MaxPoolsPerNode - this.MaxStakersPerPool = MaxStakersPerPool - } - - public static fromValues([ - epochPayoutRoundsMin, - epochPayoutRoundsMax, - MinPctToValidatorWFourDecimals, - MaxPctToValidatorWFourDecimals, - MinEntryStake, - MaxAlgoPerPool, - MaxAlgoPerValidator, - AmtConsideredSaturated, - MaxNodes, - MaxPoolsPerNode, - MaxStakersPerPool, - ]: [bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint]): ProtocolConstraints { - return { - epochPayoutRoundsMin, - epochPayoutRoundsMax, - MinPctToValidatorWFourDecimals, - MaxPctToValidatorWFourDecimals, - MinEntryStake, - MaxAlgoPerPool, - MaxAlgoPerValidator, - AmtConsideredSaturated, - MaxNodes, - MaxPoolsPerNode, - MaxStakersPerPool, - } - } -} - -class PoolTokenPayoutRatio { - PoolPctOfWhole: bigint[] - - UpdatedForPayout: bigint - - constructor([PoolPctOfWhole, UpdatedForPayout]: [bigint[], bigint]) { - this.PoolPctOfWhole = PoolPctOfWhole - this.UpdatedForPayout = UpdatedForPayout - } -} - -function concatUint8Arrays(a: Uint8Array, b: Uint8Array): Uint8Array { - const result = new Uint8Array(a.length + b.length) - result.set(a) - result.set(b, a.length) - return result + return { + ...DefaultValidatorConfig, + ...inputConfig, + } } export async function getStakeInfoFromBoxValue(stakeClient: StakingPoolClient) { - const stakerData = await stakeClient.appClient.getBoxValue('stakers') - return StakedInfo.FromBoxData(stakerData) -} - -export function getValidatorListBoxName(validatorId: number) { - const prefix = new TextEncoder().encode('v') - return concatUint8Arrays(prefix, encodeUint64(validatorId)) -} - -// function getStakerPoolSetBoxName(stakerAccount: Account) { -// const prefix = new TextEncoder().encode('sps'); -// return concatUint8Arrays(prefix, decodeAddress(stakerAccount.addr).publicKey); -// } - -// function getStakersBoxName() { -// return new TextEncoder().encode('stakers'); -// } - -export async function getMbrAmountsFromValidatorClient(validatorClient: ValidatorRegistryClient) { - const result = await validatorClient.compose().getMbrAmounts({}, {}).simulate({ allowUnnamedResources: true }) - return result.returns![0] + const data = await stakeClient.state.box.stakers() + return data!.map( + (s) => + ({ + account: s[0], + balance: s[1], + totalRewarded: s[2], + rewardTokenBalance: s[3], + entryRound: s[4], + }) satisfies StakedInfo, + ) } export async function getProtocolConstraints(validatorClient: ValidatorRegistryClient) { - return new ProtocolConstraints( - (await validatorClient.compose().getProtocolConstraints({}, {}).simulate()).returns![0], - ) + return (await validatorClient.newGroup().getProtocolConstraints().simulate()).returns[0]! } export async function addValidator( - context: AlgorandTestAutomationContext, - validatorClient: ValidatorRegistryClient, - owner: Account, - config: ValidatorConfig, - validatorMbr: bigint, + context: AlgorandTestAutomationContext, + validatorClient: ValidatorRegistryClient, + owner: Account, + config: ValidatorConfig, + validatorMbr: bigint, ) { - const suggestedParams = await context.algod.getTransactionParams().do() - const validatorsAppRef = await validatorClient.appClient.getAppReference() - - suggestedParams.flatFee = true - suggestedParams.fee = AlgoAmount.Algos(10.001).microAlgos - - // Pay the additional mbr to the validator contract for the new validator mbr - const payValidatorMbr = makePaymentTxnWithSuggestedParamsFromObject({ - from: context.testAccount.addr, - to: validatorsAppRef.appAddress, - amount: Number(validatorMbr), - suggestedParams, - }) - - try { - const results = await validatorClient - .compose() - .addValidator( - { - // the required MBR payment transaction.. - mbrPayment: { - transaction: payValidatorMbr, - signer: context.testAccount, - }, - // -- - nfdName: '', - config: validatorConfigAsArray(config), - }, - { - sender: owner, - }, - ) - .execute({ populateAppCallResources: true, suppressLog: true }) - return Number(results.returns![0]) - } catch (e) { - // throw validatorClient.appClient.exposeLogicError(e as Error) - consoleLogger.warn((e as LogicError).message) - throw e - } + try { + const results = await validatorClient + .newGroup() + .addValidator({ + args: { + // the required MBR payment transaction.. + mbrPayment: context.algorand.createTransaction.payment({ + sender: context.testAccount.addr, + receiver: validatorClient.appAddress, + amount: AlgoAmount.MicroAlgo(validatorMbr), + staticFee: AlgoAmount.Algos(10.001), + }), + // -- + nfdName: '', + config: config, + }, + sender: owner.addr, + }) + .send({ populateAppCallResources: true, suppressLog: true }) + return Number(results.returns![0]) + } catch (e) { + // throw validatorClient.appClient.exposeLogicError(e as Error) + consoleLogger.warn((e as LogicError).message) + throw e + } } export async function getValidatorState(validatorClient: ValidatorRegistryClient, validatorId: number) { - return new ValidatorCurState( - ( - await validatorClient - .compose() - .getValidatorState({ validatorId }, {}) - .simulate({ allowUnnamedResources: true }) - ).returns![0], - ) + // If getValidatorState was marked readonly this could be `(await validatorClient.send.getValidatorState({ args: [validatorId] })).return!` + return ( + await validatorClient + .newGroup() + .getValidatorState({ args: [validatorId] }) + .simulate({ allowUnnamedResources: true }) + ).returns[0]! } export async function addStakingPool( - context: AlgorandTestAutomationContext, - validatorClient: ValidatorRegistryClient, - validatorId: number, - nodeNum: number, - vldtrAcct: Account, - poolMbr: bigint, - poolInitMbr: bigint, + context: AlgorandTestAutomationContext, + validatorClient: ValidatorRegistryClient, + validatorId: number, + nodeNum: number, + vldtrAcct: Account, + poolMbr: bigint, + poolInitMbr: bigint, ) { - const suggestedParams = await context.algod.getTransactionParams().do() - const validatorsAppRef = await validatorClient.appClient.getAppReference() - - // suggestedParams.firstRound -= 15 - // suggestedParams.lastRound -= 15 - consoleLogger.info(`addStakingPool: firstRound:${suggestedParams.firstRound}`) - // Pay the additional mbr to the validator contract for the new pool mbr - const payPoolMbr = makePaymentTxnWithSuggestedParamsFromObject({ - from: context.testAccount.addr, - to: validatorsAppRef.appAddress, - amount: Number(poolMbr), - suggestedParams, - }) - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - let addPoolResults: any - // Before validator can add pools it needs to be funded - try { - // Now add a staking pool - addPoolResults = await validatorClient - .compose() - .gas({}, { note: '1' }) - .gas({}, { note: '2' }) - .addPool( - { - mbrPayment: { transaction: payPoolMbr, signer: context.testAccount }, - validatorId, - nodeNum, - }, - { - sendParams: { - fee: AlgoAmount.MicroAlgos(2000), - }, - sender: vldtrAcct, - }, - ) - .execute({ populateAppCallResources: true, suppressLog: true }) - } catch (exception) { - console.log((exception as LogicError).message) - throw exception - } - const poolKey = new ValidatorPoolKey(addPoolResults.returns![2]) - - // Pay the mbr to the newly created staking pool contract to cover its upcoming box mbr storage req - const payStakingPoolMbr = makePaymentTxnWithSuggestedParamsFromObject({ - from: context.testAccount.addr, - to: getApplicationAddress(poolKey.poolAppId), - amount: Number(poolInitMbr), - suggestedParams, - }) + const suggestedParams = await context.algod.getTransactionParams().do() + consoleLogger.info(`addStakingPool: firstRound:${suggestedParams.firstRound}`) + + // Before validator can add pools it needs to be funded + try { + // Now add a staking pool + const addPoolResults = await validatorClient + .newGroup() + .gas({ args: {}, note: randomUUID() }) + .gas({ args: {}, note: '2' }) + .addPool({ + args: { + mbrPayment: context.algorand.createTransaction.payment({ + sender: context.testAccount.addr, + receiver: validatorClient.appAddress, + amount: AlgoAmount.MicroAlgo(poolMbr), + }), + validatorId, + nodeNum, + }, + staticFee: AlgoAmount.MicroAlgos(2000), + sender: vldtrAcct.addr, + }) + .send({ populateAppCallResources: true, suppressLog: true }) + + const poolKey = addPoolResults.returns[2]! // now tell it to initialize its storage (w/ our mbr payment) - const newPoolClient = new StakingPoolClient( - { sender: vldtrAcct, resolveBy: 'id', id: poolKey.poolAppId }, - context.algod, - ) + const newPoolClient = context.algorand.client.getTypedAppClientById(StakingPoolClient, { + appId: poolKey.poolAppId, + defaultSender: vldtrAcct.addr, + }) await newPoolClient - .compose() - .gas({}, { note: '1' }) - .gas({}, { note: '2' }) - .initStorage( - { - // the required MBR payment transaction - mbrPayment: { transaction: payStakingPoolMbr, signer: context.testAccount }, - }, - { - sendParams: { - fee: AlgoAmount.MicroAlgos(3000), - }, - }, - ) - .execute({ populateAppCallResources: true, suppressLog: true }) + .newGroup() + .gas({ args: {}, note: randomUUID() }) + .gas({ args: {}, note: randomUUID() }) + .initStorage({ + args: { + // the required MBR payment transaction + mbrPayment: context.algorand.createTransaction.payment({ + sender: context.testAccount.addr, + receiver: newPoolClient.appAddress, + amount: AlgoAmount.MicroAlgo(poolInitMbr), + }), + }, + staticFee: AlgoAmount.MicroAlgos(3000), + }) + .send({ populateAppCallResources: true, suppressLog: true }) return poolKey + } catch (exception) { + console.log((exception as LogicError).message) + throw exception + } } export async function getPoolInfo(validatorClient: ValidatorRegistryClient, poolKey: ValidatorPoolKey) { - try { - const PoolRet = await validatorClient - .compose() - .getPoolInfo({ poolKey: poolKey.encode() }, {}) - .simulate({ allowUnnamedResources: true }) - return new PoolInfo(PoolRet.returns![0]) - } catch (exception) { - console.log((exception as LogicError).message) - throw validatorClient.appClient.exposeLogicError(exception as Error) - // throw exception; - } + // If getPoolInfo was marked readonly this could be `(await validatorClient.send.getPoolInfo({ args: [poolKey] })).return!` + return ( + await validatorClient + .newGroup() + .getPoolInfo({ args: [poolKey] }) + .simulate({ allowUnnamedResources: true }) + ).returns[0]! } export async function getPools(validatorClient: ValidatorRegistryClient, validatorId: number): Promise { - const pools = await validatorClient.getPools({ validatorId }, { sendParams: { populateAppCallResources: true } }) - const retPoolInfo: PoolInfo[] = [] - pools.return!.forEach((poolInfo) => { - retPoolInfo.push(new PoolInfo(poolInfo)) - }) - return retPoolInfo + return ( + await validatorClient + .newGroup() + .getPools({ args: [validatorId] }) + .simulate({ allowUnnamedResources: true }) + ).returns[0]!.map((poolInfo) => ({ poolAppId: poolInfo[0], totalStakers: poolInfo[1], totalAlgoStaked: poolInfo[2] }) satisfies PoolInfo) } export async function getCurMaxStakePerPool(validatorClient: ValidatorRegistryClient, validatorId: number) { - try { - return ( - await validatorClient - .compose() - .getCurMaxStakePerPool({ validatorId }) - .simulate({ allowUnnamedResources: true }) - ).returns![0] - } catch (exception) { - console.log((exception as LogicError).message) - throw validatorClient.appClient.exposeLogicError(exception as Error) - } + // If getCurMaxStakePerPool was marked readonly this could be `(await validatorClient.send.getCurMaxStakePerPool({ args: [validatorId] })).return!` + return ( + await validatorClient + .newGroup() + .getCurMaxStakePerPool({ args: [validatorId] }) + .simulate({ allowUnnamedResources: true }) + ).returns![0] } export async function getStakedPoolsForAccount( - validatorClient: ValidatorRegistryClient, - stakerAccount: Account, + validatorClient: ValidatorRegistryClient, + stakerAccount: Account, ): Promise { - const results = await validatorClient.getStakedPoolsForAccount( - { staker: stakerAccount.addr }, - { sendParams: { populateAppCallResources: true } }, - ) - const retPoolKeys: ValidatorPoolKey[] = [] - results.return!.forEach((poolKey) => { - retPoolKeys.push(new ValidatorPoolKey(poolKey)) - }) - return retPoolKeys + const results = await validatorClient.send.getStakedPoolsForAccount({ + args: { staker: stakerAccount.addr }, + populateAppCallResources: true, + }) + + const retPoolKeys: ValidatorPoolKey[] = [] + results.return!.forEach((poolKey) => { + retPoolKeys.push({ id: poolKey[0], poolId: poolKey[1], poolAppId: poolKey[2] } satisfies ValidatorPoolKey) + }) + return retPoolKeys } export async function getStakerInfo(stakeClient: StakingPoolClient, staker: Account) { - try { - return StakedInfo.fromValues( - ( - await stakeClient - .compose() - .getStakerInfo({ staker: staker.addr }, {}) - .simulate({ allowUnnamedResources: true }) - ).returns![0], - ) - } catch (exception) { - console.log((exception as LogicError).message) - throw stakeClient.appClient.exposeLogicError(exception as Error) - // throw exception; - } + return ( + await stakeClient + .newGroup() + .getStakerInfo({ args: { staker: staker.addr } }) + .simulate({ allowUnnamedResources: true }) + ).returns[0]! } export async function getTokenPayoutRatio(validatorClient: ValidatorRegistryClient, validatorId: number) { - return new PoolTokenPayoutRatio( - ( - await validatorClient - .compose() - .getTokenPayoutRatio({ validatorId }, {}) - .simulate({ allowUnnamedResources: true }) - ).returns![0], - ) + return ( + await validatorClient + .newGroup() + .getTokenPayoutRatio({ args: [validatorId] }) + .simulate({ allowUnnamedResources: true }) + ).returns[0]! } export async function addStake( - context: AlgorandTestAutomationContext, - validatorClient: ValidatorRegistryClient, - vldtrId: number, - staker: Account, - algoAmount: AlgoAmount, - valueToVerify: bigint, // depends on gating but could be nfd id, or asset id + context: AlgorandTestAutomationContext, + validatorClient: ValidatorRegistryClient, + vldtrId: number, + staker: Account, + algoAmount: AlgoAmount, + valueToVerify: bigint, // depends on gating but could be nfd id, or asset id ): Promise<[ValidatorPoolKey, AlgoAmount]> { - try { - const suggestedParams = await context.algod.getTransactionParams().do() - const validatorsAppRef = await validatorClient.appClient.getAppReference() - - suggestedParams.flatFee = true - suggestedParams.fee = 0 - - const findPoolSim = await validatorClient - .compose() - .gas({}) - .findPoolForStaker( - { validatorId: vldtrId, staker: staker.addr, amountToStake: algoAmount.microAlgos }, - { - sendParams: { - fee: AlgoAmount.MicroAlgos(2000), - }, - }, - ) - .simulate({ allowUnnamedResources: true }) - if (findPoolSim.simulateResponse.txnGroups[0].failureMessage !== undefined) { - consoleLogger.error( - `simulate failed in findPoolForStaker: ${findPoolSim.simulateResponse.txnGroups[0].failureMessage}`, - ) - } - const expectedPool = findPoolSim.returns![1] - - const poolKey = new ValidatorPoolKey(expectedPool[0]) - const willBeNewStaker = expectedPool[1] - - consoleLogger.info( - `addStake findPool for stake:${algoAmount.toString()} will add to validator:${poolKey.id}, pool:${poolKey.poolId} and willBeNew:${willBeNewStaker}`, - ) - - // Pay the stake to the validator contract - const stakeTransfer = makePaymentTxnWithSuggestedParamsFromObject({ - from: staker.addr, - to: validatorsAppRef.appAddress, - amount: algoAmount.microAlgos, - suggestedParams, - }) - - // simulate to get fees - let fees = AlgoAmount.MicroAlgos(240_000) - const simulateResults = await validatorClient - .compose() - .gas({}) - .addStake( - // This the actual send of stake to the ac - { - stakedAmountPayment: { transaction: stakeTransfer, signer: staker }, - validatorId: vldtrId, - valueToVerify, - }, - { sendParams: { fee: fees }, sender: staker }, - ) - .simulate({ allowUnnamedResources: true, allowMoreLogging: true }) - - stakeTransfer.group = undefined - fees = AlgoAmount.MicroAlgos( - 2000 + - 1000 * - Math.floor(((simulateResults.simulateResponse.txnGroups[0].appBudgetAdded as number) + 699) / 700), - ) - consoleLogger.info(`addStake fees:${fees.toString()}`) - - const results = await validatorClient - .compose() - .gas({}, { sendParams: { fee: AlgoAmount.MicroAlgos(0) } }) - .addStake( - { - // -- - // This the actual send of stake to the validator contract (which then sends to the staking pool) - stakedAmountPayment: { transaction: stakeTransfer, signer: staker }, - // -- - validatorId: vldtrId, - valueToVerify, - }, - { sendParams: { fee: fees }, sender: staker }, - ) - .execute({ populateAppCallResources: true, suppressLog: true }) - - return [new ValidatorPoolKey(results.returns[1]), fees] - } catch (exception) { - consoleLogger.warn((exception as LogicError).message) - // throw validatorClient.appClient.exposeLogicError(exception as Error); - throw exception + try { + const findPoolSim = await validatorClient + .newGroup() + .gas() + .findPoolForStaker({ + args: { validatorId: vldtrId, staker: staker.addr, amountToStake: algoAmount.microAlgos }, + staticFee: AlgoAmount.MicroAlgos(2000), + }) + .simulate({ allowUnnamedResources: true }) + if (findPoolSim.simulateResponse.txnGroups[0].failureMessage !== undefined) { + consoleLogger.error(`simulate failed in findPoolForStaker: ${findPoolSim.simulateResponse.txnGroups[0].failureMessage}`) } -} + const expectedPool = findPoolSim.returns[1]! -export async function removeStake( - stakeClient: StakingPoolClient, - staker: Account, - unstakeAmount: AlgoAmount, - altSender?: Account, -) { - const simulateResults = await stakeClient - .compose() - .gas({}, { note: '1', sendParams: { fee: AlgoAmount.MicroAlgos(0) } }) - .gas({}, { note: '2', sendParams: { fee: AlgoAmount.MicroAlgos(0) } }) - .removeStake( - { staker: staker.addr, amountToUnstake: unstakeAmount.microAlgos }, - { - sendParams: { - fee: AlgoAmount.MicroAlgos(240000), - }, - sender: altSender || staker, - }, - ) - .simulate({ allowUnnamedResources: true }) - - const itxnfees = AlgoAmount.MicroAlgos( - 1000 * Math.floor(((simulateResults.simulateResponse.txnGroups[0].appBudgetAdded as number) + 699) / 700), - ) - consoleLogger.info(`removeStake fees:${itxnfees.toString()}`) - - try { - await stakeClient - .compose() - .gas({}, { note: '1', sendParams: { fee: AlgoAmount.MicroAlgos(0) } }) - .gas({}, { note: '2', sendParams: { fee: AlgoAmount.MicroAlgos(0) } }) - .removeStake( - { staker: staker.addr, amountToUnstake: unstakeAmount.microAlgos }, - { - sendParams: { - // pays us back and tells validator about balance changed - fee: AlgoAmount.MicroAlgos(itxnfees.microAlgos), - }, - sender: altSender || staker, - }, - ) - .execute({ populateAppCallResources: true, suppressLog: true }) - } catch (exception) { - consoleLogger.warn((exception as LogicError).message) - // throw stakeClient.appClient.exposeLogicError(exception as Error); - throw exception - } - return itxnfees.microAlgos -} + const poolKey = { id: expectedPool[0][0], poolId: expectedPool[0][1], poolAppId: expectedPool[0][2] } satisfies ValidatorPoolKey + const willBeNewStaker = expectedPool[1] -export async function claimTokens(stakeClient: StakingPoolClient, staker: Account) { - const simulateResults = await stakeClient - .compose() - .gas({}, { note: '1', sendParams: { fee: AlgoAmount.MicroAlgos(0) } }) - .gas({}, { note: '2', sendParams: { fee: AlgoAmount.MicroAlgos(0) } }) - .claimTokens( - {}, - { - sendParams: { - fee: AlgoAmount.MicroAlgos(240000), - }, - sender: staker, - }, - ) - .simulate({ allowUnnamedResources: true }) - - const itxnfees = AlgoAmount.MicroAlgos( - 1000 * Math.floor(((simulateResults.simulateResponse.txnGroups[0].appBudgetAdded as number) + 699) / 700), + consoleLogger.info( + `addStake findPool for stake:${algoAmount.toString()} will add to validator:${poolKey.id}, pool:${poolKey.poolId} and willBeNew:${willBeNewStaker}`, ) - consoleLogger.info(`removeStake fees:${itxnfees.toString()}`) - - try { - await stakeClient - .compose() - .gas({}, { note: '1', sendParams: { fee: AlgoAmount.MicroAlgos(0) } }) - .gas({}, { note: '2', sendParams: { fee: AlgoAmount.MicroAlgos(0) } }) - .claimTokens( - {}, - { - sendParams: { - // pays us back and tells validator about balance changed - fee: AlgoAmount.MicroAlgos(itxnfees.microAlgos), - }, - sender: staker, - }, - ) - .execute({ populateAppCallResources: true, suppressLog: true }) - } catch (exception) { - consoleLogger.warn((exception as LogicError).message) - // throw stakeClient.appClient.exposeLogicError(exception as Error); - throw exception + + const stakeTransfer: PaymentParams = { + sender: staker.addr, + receiver: validatorClient.appAddress, + amount: algoAmount, + staticFee: (0).algo(), } - return itxnfees.microAlgos -} -export async function epochBalanceUpdate(stakeClient: StakingPoolClient) { + // simulate to get fees let fees = AlgoAmount.MicroAlgos(240_000) - const simulateResults = await stakeClient - .compose() - .gas({}, { note: '1' }) - .gas({}, { note: '2' }) - .epochBalanceUpdate({}, { sendParams: { fee: fees } }) - .simulate({ allowUnnamedResources: true, allowMoreLogging: true }) + const simulateResults = await validatorClient + .newGroup() + .gas() + .addStake( + // This the actual send of stake to the ac + { + args: { + stakedAmountPayment: context.algorand.createTransaction.payment(stakeTransfer), + validatorId: vldtrId, + valueToVerify, + }, + staticFee: fees, + sender: staker.addr, + }, + ) + .simulate({ allowUnnamedResources: true, allowMoreLogging: true }) fees = AlgoAmount.MicroAlgos( - 1000 * Math.floor(((simulateResults.simulateResponse.txnGroups[0].appBudgetAdded as number) + 699) / 700), + 2000 + 1000 * Math.floor(((simulateResults.simulateResponse.txnGroups[0].appBudgetAdded as number) + 699) / 700), ) - consoleLogger.info(`epoch update fees of:${fees.toString()}`) + consoleLogger.info(`addStake fees:${fees.toString()}`) + + const results = await validatorClient + .newGroup() + .gas({ args: [], staticFee: AlgoAmount.MicroAlgos(0) }) + .addStake({ + args: { + // -- + // This the actual send of stake to the validator contract (which then sends to the staking pool) + stakedAmountPayment: context.algorand.createTransaction.payment(stakeTransfer), + // -- + validatorId: vldtrId, + valueToVerify, + }, + staticFee: fees, + sender: staker.addr, + }) + .send({ populateAppCallResources: true, suppressLog: true }) + + return [results.returns[1]!, fees] + } catch (exception) { + consoleLogger.warn((exception as LogicError).message) + // throw validatorClient.appClient.exposeLogicError(exception as Error); + throw exception + } +} + +export async function removeStake(stakeClient: StakingPoolClient, staker: Account, unstakeAmount: AlgoAmount, altSender?: Account) { + const simulateResults = await stakeClient + .newGroup() + .gas({ args: [], note: '1', staticFee: AlgoAmount.MicroAlgos(0) }) + .gas({ args: [], note: '2', staticFee: AlgoAmount.MicroAlgos(0) }) + .removeStake({ + args: { staker: staker.addr, amountToUnstake: unstakeAmount.microAlgos }, + staticFee: AlgoAmount.MicroAlgos(240000), + sender: (altSender || staker).addr, + }) + .simulate({ allowUnnamedResources: true }) + + const itxnfees = AlgoAmount.MicroAlgos( + 1000 * Math.floor(((simulateResults.simulateResponse.txnGroups[0].appBudgetAdded as number) + 699) / 700), + ) + consoleLogger.info(`removeStake fees:${itxnfees.toString()}`) + try { await stakeClient - .compose() - .gas({}, { note: '1', sendParams: { fee: AlgoAmount.MicroAlgos(0) } }) - .gas({}, { note: '2', sendParams: { fee: AlgoAmount.MicroAlgos(0) } }) - .epochBalanceUpdate({}, { sendParams: { fee: fees } }) - .execute({ populateAppCallResources: true, suppressLog: true }) - return fees + .newGroup() + .gas({ args: [], note: '1', staticFee: AlgoAmount.MicroAlgos(0) }) + .gas({ args: [], note: '2', staticFee: AlgoAmount.MicroAlgos(0) }) + .removeStake({ + args: { staker: staker.addr, amountToUnstake: unstakeAmount.microAlgos }, + staticFee: AlgoAmount.MicroAlgos(itxnfees.microAlgo), + sender: (altSender || staker).addr, + }) + .send({ populateAppCallResources: true, suppressLog: true }) + } catch (exception) { + consoleLogger.warn((exception as LogicError).message) + // throw stakeClient.appClient.exposeLogicError(exception as Error); + throw exception + } + return itxnfees.microAlgos } -export async function logStakingPoolInfo( - context: AlgorandTestAutomationContext, - PoolAppID: bigint, - msgToDisplay: string, -) { - const firstPoolClient = new StakingPoolClient( - { sender: context.testAccount, resolveBy: 'id', id: PoolAppID }, - context.algod, - ) - const stakingPoolGS = await firstPoolClient.appClient.getGlobalState() - const stakers = await getStakeInfoFromBoxValue(firstPoolClient) - // iterate stakers displaying the info - const lastPayout = stakingPoolGS.lastPayout ? stakingPoolGS.lastPayout.value : 0 - consoleLogger.info(`${msgToDisplay}, last Payout: ${lastPayout}`) - for (let i = 0; i < stakers.length; i += 1) { - if (encodeAddress(stakers[i].staker.publicKey) !== ALGORAND_ZERO_ADDRESS_STRING) { - consoleLogger.info( - `${i}: Staker:${encodeAddress(stakers[i].staker.publicKey)}, Balance:${stakers[i].balance}, ` + - `Rwd Tokens:${stakers[i].rewardTokenBalance} Entry:${stakers[i].entryRound}`, - ) - } +export async function claimTokens(stakeClient: StakingPoolClient, staker: Account) { + const simulateResults = await stakeClient + .newGroup() + .gas({ args: [], note: '1', staticFee: AlgoAmount.MicroAlgos(0) }) + .gas({ args: [], note: '2', staticFee: AlgoAmount.MicroAlgos(0) }) + .claimTokens({ args: {}, staticFee: AlgoAmount.MicroAlgos(240000), sender: staker.addr }) + .simulate({ allowUnnamedResources: true }) + + const itxnfees = AlgoAmount.MicroAlgos( + 1000 * Math.floor(((simulateResults.simulateResponse.txnGroups[0].appBudgetAdded as number) + 699) / 700), + ) + consoleLogger.info(`removeStake fees:${itxnfees.toString()}`) + + try { + await stakeClient + .newGroup() + .gas({ args: [], note: '1', staticFee: AlgoAmount.MicroAlgos(0) }) + .gas({ args: [], note: '2', staticFee: AlgoAmount.MicroAlgos(0) }) + .claimTokens({ args: {}, staticFee: AlgoAmount.MicroAlgos(itxnfees.microAlgo), sender: staker.addr }) + .send({ populateAppCallResources: true, suppressLog: true }) + } catch (exception) { + consoleLogger.warn((exception as LogicError).message) + // throw stakeClient.appClient.exposeLogicError(exception as Error); + throw exception + } + return itxnfees.microAlgos +} + +export async function epochBalanceUpdate(stakeClient: StakingPoolClient) { + let fees = AlgoAmount.MicroAlgos(240_000) + const simulateResults = await stakeClient + .newGroup() + .gas({ args: [], note: '1', staticFee: AlgoAmount.MicroAlgos(0) }) + .gas({ args: [], note: '2', staticFee: AlgoAmount.MicroAlgos(0) }) + .epochBalanceUpdate({ args: {}, staticFee: fees }) + .simulate({ allowUnnamedResources: true, allowMoreLogging: true }) + + fees = AlgoAmount.MicroAlgos(1000 * Math.floor(((simulateResults.simulateResponse.txnGroups[0].appBudgetAdded as number) + 699) / 700)) + consoleLogger.info(`epoch update fees of:${fees.toString()}`) + + await stakeClient + .newGroup() + .gas({ args: [], note: '1', staticFee: AlgoAmount.MicroAlgos(0) }) + .gas({ args: [], note: '2', staticFee: AlgoAmount.MicroAlgos(0) }) + .epochBalanceUpdate({ args: {}, staticFee: fees }) + .send({ populateAppCallResources: true, suppressLog: true }) + return fees +} + +export async function logStakingPoolInfo(context: AlgorandTestAutomationContext, poolAppID: bigint, msgToDisplay: string) { + const firstPoolClient = context.algorand.client.getTypedAppClientById(StakingPoolClient, { + appId: poolAppID, + defaultSender: context.testAccount.addr, + }) + const stakingPoolGS = await firstPoolClient.state.global.getAll() + const stakers = await getStakeInfoFromBoxValue(firstPoolClient) + // iterate stakers displaying the info + const lastPayout = stakingPoolGS.lastPayout ? stakingPoolGS.lastPayout : 0n + consoleLogger.info(`${msgToDisplay}, last Payout: ${lastPayout}`) + for (let i = 0; i < stakers.length; i += 1) { + if (stakers[i].account !== ALGORAND_ZERO_ADDRESS_STRING) { + consoleLogger.info( + `${i}: Staker:${stakers[i].account}, Balance:${stakers[i].balance}, ` + + `Rwd Tokens:${stakers[i].rewardTokenBalance} Entry:${stakers[i].entryRound}`, + ) } + } } export async function getPoolAvailBalance(context: AlgorandTestAutomationContext, poolKey: ValidatorPoolKey) { - const poolAcctInfo = await context.algod.accountInformation(getApplicationAddress(poolKey.poolAppId)).do() - return BigInt(poolAcctInfo.amount - poolAcctInfo['min-balance']) + const poolAcctInfo = await context.algorand.account.getInformation(getApplicationAddress(poolKey.poolAppId)) + return poolAcctInfo.balance.microAlgo - poolAcctInfo.minBalance.microAlgo } export async function createAsset( - client: Algodv2, - sender: Account, - assetName: string, - unitName: string, - total?: number, - decimals?: number, + context: AlgorandTestAutomationContext, + sender: Account, + assetName: string, + unitName: string, + total?: number, + decimals?: number, ) { - const newTotal = !total ? Math.floor(Math.random() * 100) + 20 : total - const newDecimals = !decimals ? 6 : decimals - - const params = await client.getTransactionParams().do() - - const txn = makeAssetCreateTxnWithSuggestedParamsFromObject({ - from: sender.addr, - suggestedParams: params, - total: newTotal * 10 ** newDecimals, - decimals: newDecimals, - defaultFrozen: false, - unitName, - assetName, - manager: sender.addr, - reserve: sender.addr, - freeze: sender.addr, - clawback: sender.addr, - assetURL: 'https://path/to/my/asset/details', - }) - - const stxn = txn.signTxn(sender.sk) - - let txid = await client.sendRawTransaction(stxn).do() - txid = txid.txId - - const ptx = await client.pendingTransactionInformation(txid).do() - - const assetId = ptx['asset-index'] - - return assetId + const newTotal = !total ? Math.floor(Math.random() * 100) + 20 : total + const newDecimals = !decimals ? 6 : decimals + + const asset = await context.algorand.send.assetCreate({ + sender: sender.addr, + total: BigInt(newTotal * 10 ** newDecimals), + decimals: newDecimals, + defaultFrozen: false, + unitName, + assetName, + manager: sender.addr, + reserve: sender.addr, + freeze: sender.addr, + clawback: sender.addr, + url: 'https://path/to/my/asset/details', + }) + + return asset.assetId } export async function incrementRoundNumberBy(context: AlgorandTestAutomationContext, rounds: number) { - if (rounds === 0) { - return - } - // send rounds number of 'dummy' pay self 0 transactions - let params = await context.algod.getTransactionParams().do() - console.log('block before incrementRoundNumberBy:', params.firstRound) - let txnid = '' - for (let i = 0; i < rounds; i += 1) { - // we definitely want the await here - we want to ensure these are a block per transaction (in dev mode) - const txn = makePaymentTxnWithSuggestedParamsFromObject({ - from: context.testAccount.addr, - to: context.testAccount.addr, - amount: 0, - note: new TextEncoder().encode(`${i}`), - suggestedParams: params, - }) - txnid = txn.txID() - const signedTransaction = await signTransaction(txn, context.testAccount) - await context.algod.sendRawTransaction(signedTransaction).do() - } - // wait for the final transaction to show up... - await waitForConfirmation(txnid, rounds + 1, context.algod) - - params = await context.algod.getTransactionParams().do() - console.log('block AFTER incrementRoundNumberBy:', params.firstRound) -} - -export function bigIntFromBytes(bytes: Uint8Array): bigint { - let result = BigInt(0) - bytes.forEach((byte) => { - // eslint-disable-next-line no-bitwise - result = (result << BigInt(8)) | BigInt(byte) + if (rounds === 0) { + return + } + // Send `rounds` number of 'dummy' pay self 0 transactions + let params = await context.algod.getTransactionParams().do() + console.log('block before incrementRoundNumberBy:', params.firstRound) + for (let i = 0; i < rounds; i += 1) { + await context.algorand.send.payment({ + sender: context.testAccount.addr, + receiver: context.testAccount.addr, + amount: AlgoAmount.MicroAlgo(0), + note: randomUUID(), }) - return result + } + + params = await context.algod.getTransactionParams().do() + console.log('block AFTER incrementRoundNumberBy:', params.firstRound) } diff --git a/contracts/package.json b/contracts/package.json index 37902b14..318d3d04 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -3,7 +3,7 @@ "version": "0.10.0", "license": "MIT", "scripts": { - "generate-client": "algokit generate client contracts/artifacts/ --language typescript --output contracts/clients/{contract_name}Client.ts && ./update_contract_artifacts.sh", + "generate-client": "pnpx @algorandfoundation/algokit-client-generator@4.0.0-beta.4 generate -a contracts/artifacts/StakingPool.arc56_draft.json -o contracts/clients_new/StakingPoolClient.ts && pnpx @algorandfoundation/algokit-client-generator@4.0.0-beta.4 generate -a contracts/artifacts/ValidatorRegistry.arc56_draft.json -o contracts/clients_new/ValidatorRegistryClient.ts && algokit generate client contracts/artifacts/ --language typescript --output contracts/clients/{contract_name}Client.ts && ./update_contract_artifacts.sh", "compile-contract": "tealscript contracts/*.algo.ts contracts/artifacts", "generate-components": "algokit-generate-component contracts/artifacts/validatorRegistry.arc32.json contracts/artifacts/components", "noalgobuild": "pnpm run compile-contract -- --skip-algod && pnpm run generate-client", @@ -17,7 +17,7 @@ "prettier:fix": "npx prettier --write ." }, "dependencies": { - "@algorandfoundation/algokit-utils": "^6.2.1", + "@algorandfoundation/algokit-utils": "7.0.0-beta.7", "algosdk": "^2.9.0" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dad21ba2..fd1a89f5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,8 +11,8 @@ importers: contracts: dependencies: '@algorandfoundation/algokit-utils': - specifier: ^6.2.1 - version: 6.2.1(algosdk@2.9.0) + specifier: 7.0.0-beta.7 + version: 7.0.0-beta.7(algosdk@2.9.0) algosdk: specifier: ^2.9.0 version: 2.9.0 @@ -170,7 +170,7 @@ importers: version: 1.56.5(@tanstack/react-router@1.56.5(@tanstack/router-generator@1.57.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tremor/react': specifier: 3.18.1 - version: 3.18.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.7)(typescript@5.5.4))) + version: 3.18.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4))) '@txnlab/use-wallet-react': specifier: 3.7.0 version: 3.7.0(@blockshake/defly-connect@1.1.6(algosdk@2.9.0))(@perawallet/connect@1.3.4(algosdk@2.9.0))(@walletconnect/modal@2.6.2(@types/react@18.3.5)(react@18.3.1))(algosdk@2.9.0)(lute-connect@1.4.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -242,7 +242,7 @@ importers: version: 2.5.2 tailwindcss-animate: specifier: 1.0.7 - version: 1.0.7(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.7)(typescript@5.5.4))) + version: 1.0.7(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4))) tslib: specifier: 2.7.0 version: 2.7.0 @@ -251,7 +251,7 @@ importers: version: 10.0.3(react@18.3.1) vite-plugin-node-polyfills: specifier: 0.22.0 - version: 0.22.0(rollup@4.22.0)(vite@5.4.6(@types/node@20.16.7)) + version: 0.22.0(rollup@4.22.0)(vite@5.4.6(@types/node@20.16.5)) zod: specifier: 3.23.8 version: 3.23.8 @@ -261,7 +261,7 @@ importers: version: 1.47.0 '@tanstack/router-vite-plugin': specifier: 1.56.4 - version: 1.56.4(vite@5.4.6(@types/node@20.16.7)) + version: 1.56.4(vite@5.4.6(@types/node@20.16.5)) '@testing-library/dom': specifier: 10.4.0 version: 10.4.0 @@ -276,7 +276,7 @@ importers: version: 6.2.2 '@types/node': specifier: 20.16.5 - version: 20.16.7 + version: 20.16.5 '@types/react': specifier: 18.3.5 version: 18.3.5 @@ -291,10 +291,10 @@ importers: version: 8.5.0(eslint@8.57.0)(typescript@5.5.4) '@vitejs/plugin-react': specifier: 4.3.1 - version: 4.3.1(vite@5.4.6(@types/node@20.16.7)) + version: 4.3.1(vite@5.4.6(@types/node@20.16.5)) '@vitest/coverage-v8': specifier: 2.1.1 - version: 2.1.1(vitest@2.1.1(@types/node@20.16.7)(jsdom@24.1.3)(msw@2.4.4(typescript@5.5.4))) + version: 2.1.1(vitest@2.1.1(@types/node@20.16.5)(jsdom@24.1.3)(msw@2.4.4(typescript@5.5.4))) algo-msgpack-with-bigint: specifier: 2.1.1 version: 2.1.1 @@ -327,19 +327,19 @@ importers: version: 3.3.3 tailwindcss: specifier: 3.4.10 - version: 3.4.10(ts-node@10.9.2(@types/node@20.16.7)(typescript@5.5.4)) + version: 3.4.10(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4)) ts-node: specifier: 10.9.2 - version: 10.9.2(@types/node@20.16.7)(typescript@5.5.4) + version: 10.9.2(@types/node@20.16.5)(typescript@5.5.4) typescript: specifier: 5.5.4 version: 5.5.4 vite: specifier: 5.4.6 - version: 5.4.6(@types/node@20.16.7) + version: 5.4.6(@types/node@20.16.5) vitest: specifier: 2.1.1 - version: 2.1.1(@types/node@20.16.7)(jsdom@24.1.3)(msw@2.4.4(typescript@5.5.4)) + version: 2.1.1(@types/node@20.16.5)(jsdom@24.1.3)(msw@2.4.4(typescript@5.5.4)) packages: @@ -363,6 +363,12 @@ packages: peerDependencies: algosdk: ^2.7.0 + '@algorandfoundation/algokit-utils@7.0.0-beta.7': + resolution: {integrity: sha512-xueS9bYnboF3x4Zp/7mCgkLZQR91b5NOuM6aZawv5ySZ+GrRqqZnThJYcGVSNG5GSlGp1ypkEi3oXeApmwdGCA==} + engines: {node: '>=18.0'} + peerDependencies: + algosdk: ^2.7.0 + '@algorandfoundation/tealscript@0.103.0': resolution: {integrity: sha512-l6W+Z1/FHYX0UL6RFSScWdFsfNygX+ei/Lw1IVO+fBQOpSW01RqT2mHPyBghDpvw9cHOX5wVcuUVWpe6R+ew4A==} hasBin: true @@ -1951,6 +1957,9 @@ packages: '@types/mute-stream@0.0.4': resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} + '@types/node@20.16.5': + resolution: {integrity: sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==} + '@types/node@20.16.7': resolution: {integrity: sha512-QkDQjAY3gkvJNcZOWwzy3BN34RweT0OQ9zJyvLCU0kSK22dO2QYh/NHGfbEAYylPYzRB1/iXcojS79wOg5gFSw==} @@ -5256,6 +5265,11 @@ snapshots: algosdk: 2.9.0 buffer: 6.0.3 + '@algorandfoundation/algokit-utils@7.0.0-beta.7(algosdk@2.9.0)': + dependencies: + algosdk: 2.9.0 + buffer: 6.0.3 + '@algorandfoundation/tealscript@0.103.0': dependencies: '@microsoft/tsdoc': 0.14.2 @@ -5661,9 +5675,9 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@headlessui/tailwindcss@0.2.1(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.7)(typescript@5.5.4)))': + '@headlessui/tailwindcss@0.2.1(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4)))': dependencies: - tailwindcss: 3.4.10(ts-node@10.9.2(@types/node@20.16.7)(typescript@5.5.4)) + tailwindcss: 3.4.10(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4)) '@hookform/resolvers@3.9.0(react-hook-form@7.53.0(react@18.3.1))': dependencies: @@ -6610,7 +6624,7 @@ snapshots: tsx: 4.19.0 zod: 3.23.8 - '@tanstack/router-plugin@1.57.9(vite@5.4.6(@types/node@20.16.7))': + '@tanstack/router-plugin@1.57.9(vite@5.4.6(@types/node@20.16.5))': dependencies: '@babel/core': 7.25.2 '@babel/generator': 7.25.6 @@ -6631,14 +6645,14 @@ snapshots: unplugin: 1.14.1 zod: 3.23.8 optionalDependencies: - vite: 5.4.6(@types/node@20.16.7) + vite: 5.4.6(@types/node@20.16.5) transitivePeerDependencies: - supports-color - webpack-sources - '@tanstack/router-vite-plugin@1.56.4(vite@5.4.6(@types/node@20.16.7))': + '@tanstack/router-vite-plugin@1.56.4(vite@5.4.6(@types/node@20.16.5))': dependencies: - '@tanstack/router-plugin': 1.57.9(vite@5.4.6(@types/node@20.16.7)) + '@tanstack/router-plugin': 1.57.9(vite@5.4.6(@types/node@20.16.5)) transitivePeerDependencies: - '@rsbuild/core' - supports-color @@ -6685,11 +6699,11 @@ snapshots: '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@tremor/react@3.18.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.7)(typescript@5.5.4)))': + '@tremor/react@3.18.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4)))': dependencies: '@floating-ui/react': 0.19.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@headlessui/tailwindcss': 0.2.1(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.7)(typescript@5.5.4))) + '@headlessui/tailwindcss': 0.2.1(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4))) date-fns: 3.6.0 react: 18.3.1 react-day-picker: 8.10.1(date-fns@3.6.0)(react@18.3.1) @@ -6801,7 +6815,11 @@ snapshots: '@types/mute-stream@0.0.4': dependencies: - '@types/node': 20.16.7 + '@types/node': 20.16.5 + + '@types/node@20.16.5': + dependencies: + undici-types: 6.19.8 '@types/node@20.16.7': dependencies: @@ -7005,18 +7023,18 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-react@4.3.1(vite@5.4.6(@types/node@20.16.7))': + '@vitejs/plugin-react@4.3.1(vite@5.4.6(@types/node@20.16.5))': dependencies: '@babel/core': 7.25.2 '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.25.2) '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.25.2) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.4.6(@types/node@20.16.7) + vite: 5.4.6(@types/node@20.16.5) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@2.1.1(vitest@2.1.1(@types/node@20.16.7)(jsdom@24.1.3)(msw@2.4.4(typescript@5.5.4)))': + '@vitest/coverage-v8@2.1.1(vitest@2.1.1(@types/node@20.16.5)(jsdom@24.1.3)(msw@2.4.4(typescript@5.5.4)))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -7030,7 +7048,7 @@ snapshots: std-env: 3.7.0 test-exclude: 7.0.1 tinyrainbow: 1.2.0 - vitest: 2.1.1(@types/node@20.16.7)(jsdom@24.1.3)(msw@2.4.4(typescript@5.5.4)) + vitest: 2.1.1(@types/node@20.16.5)(jsdom@24.1.3)(msw@2.4.4(typescript@5.5.4)) transitivePeerDependencies: - supports-color @@ -7041,14 +7059,14 @@ snapshots: chai: 5.1.1 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(msw@2.4.4(typescript@5.5.4))(vite@5.4.6(@types/node@20.16.7))': + '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(msw@2.4.4(typescript@5.5.4))(vite@5.4.6(@types/node@20.16.5))': dependencies: '@vitest/spy': 2.1.1 estree-walker: 3.0.3 magic-string: 0.30.11 optionalDependencies: msw: 2.4.4(typescript@5.5.4) - vite: 5.4.6(@types/node@20.16.7) + vite: 5.4.6(@types/node@20.16.5) '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(msw@2.4.4(typescript@5.6.2))(vite@5.4.6(@types/node@22.7.4))': dependencies: @@ -9598,13 +9616,13 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.4.45 - postcss-load-config@4.0.2(postcss@8.4.45)(ts-node@10.9.2(@types/node@20.16.7)(typescript@5.5.4)): + postcss-load-config@4.0.2(postcss@8.4.45)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4)): dependencies: lilconfig: 3.1.2 yaml: 2.5.1 optionalDependencies: postcss: 8.4.45 - ts-node: 10.9.2(@types/node@20.16.7)(typescript@5.5.4) + ts-node: 10.9.2(@types/node@20.16.5)(typescript@5.5.4) postcss-nested@6.2.0(postcss@8.4.45): dependencies: @@ -10150,11 +10168,11 @@ snapshots: tailwind-merge@2.5.2: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.7)(typescript@5.5.4))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4))): dependencies: - tailwindcss: 3.4.10(ts-node@10.9.2(@types/node@20.16.7)(typescript@5.5.4)) + tailwindcss: 3.4.10(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4)) - tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.7)(typescript@5.5.4)): + tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -10173,7 +10191,7 @@ snapshots: postcss: 8.4.45 postcss-import: 15.1.0(postcss@8.4.45) postcss-js: 4.0.1(postcss@8.4.45) - postcss-load-config: 4.0.2(postcss@8.4.45)(ts-node@10.9.2(@types/node@20.16.7)(typescript@5.5.4)) + postcss-load-config: 4.0.2(postcss@8.4.45)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4)) postcss-nested: 6.2.0(postcss@8.4.45) postcss-selector-parser: 6.1.2 resolve: 1.22.8 @@ -10255,14 +10273,14 @@ snapshots: '@ts-morph/common': 0.21.0 code-block-writer: 12.0.0 - ts-node@10.9.2(@types/node@20.16.7)(typescript@5.5.4): + ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.16.7 + '@types/node': 20.16.5 acorn: 8.12.1 acorn-walk: 8.3.4 arg: 4.1.3 @@ -10496,12 +10514,12 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vite-node@2.1.1(@types/node@20.16.7): + vite-node@2.1.1(@types/node@20.16.5): dependencies: cac: 6.7.14 debug: 4.3.7 pathe: 1.1.2 - vite: 5.4.6(@types/node@20.16.7) + vite: 5.4.6(@types/node@20.16.5) transitivePeerDependencies: - '@types/node' - less @@ -10530,21 +10548,21 @@ snapshots: - supports-color - terser - vite-plugin-node-polyfills@0.22.0(rollup@4.22.0)(vite@5.4.6(@types/node@20.16.7)): + vite-plugin-node-polyfills@0.22.0(rollup@4.22.0)(vite@5.4.6(@types/node@20.16.5)): dependencies: '@rollup/plugin-inject': 5.0.5(rollup@4.22.0) node-stdlib-browser: 1.2.0 - vite: 5.4.6(@types/node@20.16.7) + vite: 5.4.6(@types/node@20.16.5) transitivePeerDependencies: - rollup - vite@5.4.6(@types/node@20.16.7): + vite@5.4.6(@types/node@20.16.5): dependencies: esbuild: 0.21.5 postcss: 8.4.45 rollup: 4.22.0 optionalDependencies: - '@types/node': 20.16.7 + '@types/node': 20.16.5 fsevents: 2.3.3 vite@5.4.6(@types/node@22.7.4): @@ -10556,10 +10574,10 @@ snapshots: '@types/node': 22.7.4 fsevents: 2.3.3 - vitest@2.1.1(@types/node@20.16.7)(jsdom@24.1.3)(msw@2.4.4(typescript@5.5.4)): + vitest@2.1.1(@types/node@20.16.5)(jsdom@24.1.3)(msw@2.4.4(typescript@5.5.4)): dependencies: '@vitest/expect': 2.1.1 - '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(msw@2.4.4(typescript@5.5.4))(vite@5.4.6(@types/node@20.16.7)) + '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(msw@2.4.4(typescript@5.5.4))(vite@5.4.6(@types/node@20.16.5)) '@vitest/pretty-format': 2.1.1 '@vitest/runner': 2.1.1 '@vitest/snapshot': 2.1.1 @@ -10574,11 +10592,11 @@ snapshots: tinyexec: 0.3.0 tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 5.4.6(@types/node@20.16.7) - vite-node: 2.1.1(@types/node@20.16.7) + vite: 5.4.6(@types/node@20.16.5) + vite-node: 2.1.1(@types/node@20.16.5) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.16.7 + '@types/node': 20.16.5 jsdom: 24.1.3 transitivePeerDependencies: - less From 2db31c0e59fe789ec35449117d4e3c151f58427c Mon Sep 17 00:00:00 2001 From: Patrick Bennett Date: Sun, 29 Sep 2024 23:04:01 -0400 Subject: [PATCH 03/24] Run full CI tests for dev PRs as well --- .github/workflows/ci-tests.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci-tests.yaml b/.github/workflows/ci-tests.yaml index 7dcb7daa..b1593780 100644 --- a/.github/workflows/ci-tests.yaml +++ b/.github/workflows/ci-tests.yaml @@ -3,6 +3,7 @@ on: pull_request: branches: - 'main' + - 'dev' jobs: ci-tests: From 91c85698ae22d0726cbd7124e356bc1a7c8aaa9a Mon Sep 17 00:00:00 2001 From: Doug Richar Date: Mon, 30 Sep 2024 14:19:50 -0400 Subject: [PATCH 04/24] fix(ui): enhance overall accessibility and ARIA support (#289) * fix(ui): enhance overall accessibility and ARIA support - Add ARIA labels and roles to form inputs and buttons - Enhance color contrast for text elements in dark mode - Improve semantic structure of headings in card components - Update `InfoPopover` for better screen reader support - Refactor form fields in `AddValidatorForm` for accessibility - Adjust text colors in `Footer` for better visibility * fix(ui): add ARIA labels to Select components - Add aria-label attributes to `SelectTrigger` components in: - AddValidatorForm - NodeSelect - SelectAccount - UnstakeModal - EditEntryGating - StakingDetails - Update placeholder text in `UnstakeModal`'s `SelectValue` --- ui/src/components/AddPoolModal.tsx | 6 +- ui/src/components/AddStakeModal.tsx | 4 +- ui/src/components/AddValidatorForm.tsx | 138 +++++++++++------- ui/src/components/AssetLookup.tsx | 6 +- ui/src/components/Footer.tsx | 2 +- ui/src/components/InfoPopover.tsx | 18 ++- ui/src/components/NfdAvatar.tsx | 9 +- ui/src/components/NfdLookup.tsx | 3 + ui/src/components/NfdThumbnail.tsx | 2 +- ui/src/components/NodeSelect.tsx | 2 +- ui/src/components/SelectAccount.tsx | 2 +- ui/src/components/UnstakeModal.tsx | 13 +- .../components/ValidatorDetails/Details.tsx | 2 +- .../EditCommissionAccount.tsx | 3 +- .../ValidatorDetails/EditEntryGating.tsx | 57 ++++++-- .../ValidatorDetails/EditManagerAccount.tsx | 7 +- .../ValidatorDetails/EditNfdForInfo.tsx | 10 +- .../ValidatorDetails/EditRewardPerPayout.tsx | 4 +- .../ValidatorDetails/EditSunsettingInfo.tsx | 25 +++- .../ValidatorDetails/Highlights.tsx | 16 +- .../ValidatorDetails/LinkPoolToNfdModal.tsx | 4 + .../ValidatorDetails/StakingDetails.tsx | 8 +- ui/src/components/ValidatorTable.tsx | 11 +- ui/src/components/ui/badge.tsx | 2 +- ui/src/components/ui/button.tsx | 2 +- ui/src/components/ui/card.tsx | 10 +- ui/src/components/ui/select.tsx | 2 +- 27 files changed, 254 insertions(+), 114 deletions(-) diff --git a/ui/src/components/AddPoolModal.tsx b/ui/src/components/AddPoolModal.tsx index a9de8b70..43bc3b8e 100644 --- a/ui/src/components/AddPoolModal.tsx +++ b/ui/src/components/AddPoolModal.tsx @@ -484,11 +484,15 @@ export function AddPoolModal({ hidden: !showRewardTokenInfo, })} /> - + Link Pool to NFD ( - Amount to Stake + Amount to Stake
{ field.onChange(e) // Inform react-hook-form of the change diff --git a/ui/src/components/AddValidatorForm.tsx b/ui/src/components/AddValidatorForm.tsx index 022ea690..daa4f1dc 100644 --- a/ui/src/components/AddValidatorForm.tsx +++ b/ui/src/components/AddValidatorForm.tsx @@ -375,9 +375,9 @@ export function AddValidatorForm({ constraints }: AddValidatorFormProps) { name="owner" render={({ field }) => ( - + Owner account - + Account that controls config (cold wallet recommended) * @@ -385,14 +385,16 @@ export function AddValidatorForm({ constraints }: AddValidatorFormProps) {
@@ -414,9 +419,9 @@ export function AddValidatorForm({ constraints }: AddValidatorFormProps) { name="manager" render={({ field }) => ( - + Manager account - + Account that triggers payouts and keyreg transactions (must sign transactions) @@ -425,14 +430,16 @@ export function AddValidatorForm({ constraints }: AddValidatorFormProps) {
@@ -454,9 +464,9 @@ export function AddValidatorForm({ constraints }: AddValidatorFormProps) { name="validatorCommissionAddress" render={({ field }) => ( - + Commission account - + Account that receives validator commission payments * @@ -464,14 +474,16 @@ export function AddValidatorForm({ constraints }: AddValidatorFormProps) {
@@ -498,9 +513,9 @@ export function AddValidatorForm({ constraints }: AddValidatorFormProps) { name="minEntryStake" render={({ field }) => ( - + Minimum entry stake - + Minimum stake required to enter a pool * @@ -508,9 +523,18 @@ export function AddValidatorForm({ constraints }: AddValidatorFormProps) {
- +
- +
{errors.minEntryStake?.message} @@ -523,9 +547,9 @@ export function AddValidatorForm({ constraints }: AddValidatorFormProps) { name="epochRoundLength" render={({ field }) => ( - + Epoch length - + Frequency of rewards payouts, in blocks. If a timeframe is selected, it will be converted to blocks based on the current average block time (approx.{' '} {blockTime.secs} seconds). @@ -535,13 +559,17 @@ export function AddValidatorForm({ constraints }: AddValidatorFormProps) {
+ {errors.percentToValidator?.message} @@ -606,7 +634,7 @@ export function AddValidatorForm({ constraints }: AddValidatorFormProps) { Pools per node - + Number of pools to allow per node (max of 3 is recommended) * @@ -614,7 +642,7 @@ export function AddValidatorForm({ constraints }: AddValidatorFormProps) { 0 ? 'pr-10' : '', )} - placeholder="" + placeholder="Enter NFD name" autoComplete="new-password" spellCheck="false" {...field} @@ -738,6 +767,7 @@ export function AddValidatorForm({ constraints }: AddValidatorFormProps) {

( - Amount per payout + Amount per payout - + Enter amount in whole units (not base units) {errors.rewardPerPayout?.message} @@ -775,7 +805,7 @@ export function AddValidatorForm({ constraints }: AddValidatorFormProps) { Gating type - + Require stakers to hold a qualified asset to enter pool (optional) @@ -804,7 +834,7 @@ export function AddValidatorForm({ constraints }: AddValidatorFormProps) { }} > - + @@ -831,15 +861,19 @@ export function AddValidatorForm({ constraints }: AddValidatorFormProps) { name="entryGatingAddress" render={({ field }) => ( - + Asset creator account - + Must hold asset created by this account to enter pool * - + {errors.entryGatingAddress?.message} @@ -851,12 +885,16 @@ export function AddValidatorForm({ constraints }: AddValidatorFormProps) {
+ Asset ID - + Must hold asset with this ID to enter pool * @@ -911,9 +949,9 @@ export function AddValidatorForm({ constraints }: AddValidatorFormProps) { name="entryGatingNfdCreator" render={({ field }) => ( - + Asset creator NFD - + Must hold asset created by an account linked to this NFD to enter pool * @@ -921,8 +959,9 @@ export function AddValidatorForm({ constraints }: AddValidatorFormProps) {
0 ? 'pr-10' : '')} - placeholder="" + placeholder="Enter NFD name" autoComplete="new-password" spellCheck="false" {...field} @@ -971,9 +1010,9 @@ export function AddValidatorForm({ constraints }: AddValidatorFormProps) { name="entryGatingNfdParent" render={({ field }) => ( - + Root/parent NFD - + Must hold a segment of this root/parent NFD to enter pool * @@ -982,11 +1021,12 @@ export function AddValidatorForm({ constraints }: AddValidatorFormProps) {
0 ? 'pr-10' : '', )} - placeholder="" + placeholder="Enter NFD name" autoComplete="new-password" spellCheck="false" {...field} @@ -1069,14 +1109,14 @@ export function AddValidatorForm({ constraints }: AddValidatorFormProps) { - + Minimum balance - + Optional minimum required balance of the entry gating asset. - + No minimum if left blank {errors.gatingAssetMinBalance?.message} diff --git a/ui/src/components/AssetLookup.tsx b/ui/src/components/AssetLookup.tsx index 78cab672..ea10f06b 100644 --- a/ui/src/components/AssetLookup.tsx +++ b/ui/src/components/AssetLookup.tsx @@ -18,6 +18,7 @@ interface AssetLookupProps< TName extends FieldPath = FieldPath, > { form: UseFormReturn + id: string name: TName asset: Asset | null setAsset: (asset: Asset | null) => void @@ -33,6 +34,7 @@ export function AssetLookup< TName extends FieldPath = FieldPath, >({ form, + id, name, asset, setAsset, @@ -100,7 +102,7 @@ export function AssetLookup< const renderLabel = () => { if (typeof label === 'string') { - return {label} + return {label} } if (label) { @@ -121,9 +123,11 @@ export function AssetLookup<
{ field.onChange(e) // Inform react-hook-form of the change diff --git a/ui/src/components/Footer.tsx b/ui/src/components/Footer.tsx index 133cd84e..33767c2b 100644 --- a/ui/src/components/Footer.tsx +++ b/ui/src/components/Footer.tsx @@ -52,7 +52,7 @@ export function Footer() { ))}
-

+

Réti Pooling v{__APP_VERSION__} |{' '} - - + + - + {children} diff --git a/ui/src/components/NfdAvatar.tsx b/ui/src/components/NfdAvatar.tsx index b8c867f4..39e78309 100644 --- a/ui/src/components/NfdAvatar.tsx +++ b/ui/src/components/NfdAvatar.tsx @@ -6,12 +6,17 @@ import { getNfdAvatarUrl } from '@/utils/nfd' interface NfdAvatarProps { nfd: Nfd className?: string + alt?: string } -const NfdAvatar: React.FC = React.memo(function NfdAvatar({ nfd, className = '' }) { +const NfdAvatar: React.FC = React.memo(function NfdAvatar({ + nfd, + className = '', + alt, +}) { return ( - + ) }) diff --git a/ui/src/components/NfdLookup.tsx b/ui/src/components/NfdLookup.tsx index 642e2edd..60e75c9b 100644 --- a/ui/src/components/NfdLookup.tsx +++ b/ui/src/components/NfdLookup.tsx @@ -25,6 +25,7 @@ interface NfdLookupProps< TName extends FieldPath = FieldPath, > { form: UseFormReturn + id: string name: TName nfd: Nfd | null setNfd: (nfd: Nfd | null) => void @@ -42,6 +43,7 @@ export function NfdLookup< TName extends FieldPath = FieldPath, >({ form, + id, name, nfd, setNfd, @@ -143,6 +145,7 @@ export function NfdLookup<

( <>
- +
{nfd.name}
diff --git a/ui/src/components/NodeSelect.tsx b/ui/src/components/NodeSelect.tsx index a3e4c61c..0cd4d9fd 100644 --- a/ui/src/components/NodeSelect.tsx +++ b/ui/src/components/NodeSelect.tsx @@ -17,7 +17,7 @@ interface NodeSelectProps { export function NodeSelect({ nodesInfo, value, onValueChange }: NodeSelectProps) { return ( - + diff --git a/ui/src/components/UnstakeModal.tsx b/ui/src/components/UnstakeModal.tsx index 83a83dc9..522fc9d1 100644 --- a/ui/src/components/UnstakeModal.tsx +++ b/ui/src/components/UnstakeModal.tsx @@ -281,8 +281,8 @@ export function UnstakeModal({ validator, setValidator, stakesByValidator }: Uns ) : ( <> +
) - case BigInt(GatingType.SegmentNfd): + case GatingType.SegmentNfd: return ( <> Segment of{' '} diff --git a/ui/src/components/AddValidatorForm.tsx b/ui/src/components/AddValidatorForm.tsx index dbd66258..af3c1ea4 100644 --- a/ui/src/components/AddValidatorForm.tsx +++ b/ui/src/components/AddValidatorForm.tsx @@ -337,7 +337,7 @@ export function AddValidatorForm({ constraints }: AddValidatorFormProps) { ) // Fetch validator data - const newData = await fetchValidator(BigInt(validatorId!)) + const newData = await fetchValidator(validatorId) // Seed/update query cache with new data setValidatorQueriesData(queryClient, newData) diff --git a/ui/src/components/ValidatorDetails/Details.tsx b/ui/src/components/ValidatorDetails/Details.tsx index 3af4a7b9..54939a38 100644 --- a/ui/src/components/ValidatorDetails/Details.tsx +++ b/ui/src/components/ValidatorDetails/Details.tsx @@ -78,9 +78,9 @@ export function Details({ validator }: DetailsProps) { const { entryGatingType, entryGatingAddress, entryGatingAssets } = validator.config switch (entryGatingType) { - case BigInt(GatingType.None): + case GatingType.None: return 'None' - case BigInt(GatingType.CreatorAccount): + case GatingType.CreatorAccount: return ( <> Asset creator{' '} @@ -94,7 +94,7 @@ export function Details({ validator }: DetailsProps) { ) - case BigInt(GatingType.AssetId): + case GatingType.AssetId: return ( <> Asset(s) @@ -109,7 +109,7 @@ export function Details({ validator }: DetailsProps) { ) - case BigInt(GatingType.CreatorNfd): + case GatingType.CreatorNfd: return ( <> Asset creator{' '} @@ -118,7 +118,7 @@ export function Details({ validator }: DetailsProps) {
) - case BigInt(GatingType.SegmentNfd): + case GatingType.SegmentNfd: return ( <> Segment of{' '} @@ -296,7 +296,7 @@ export function Details({ validator }: DetailsProps) { Entry Gating
- {validator.config.entryGatingType === 0n ? ( + {validator.config.entryGatingType === 0 ? ( -- ) : (
{renderEntryGating()}
diff --git a/ui/src/components/ValidatorDetails/EditEntryGating.tsx b/ui/src/components/ValidatorDetails/EditEntryGating.tsx index 189b3f02..bcb2862e 100644 --- a/ui/src/components/ValidatorDetails/EditEntryGating.tsx +++ b/ui/src/components/ValidatorDetails/EditEntryGating.tsx @@ -68,12 +68,12 @@ export function EditEntryGating({ validator }: EditEntryGatingProps) { const [isFetchingNfdCreator, setIsFetchingNfdCreator] = React.useState(false) const [nfdCreatorAppId, setNfdCreatorAppId] = React.useState( - entryGatingType === BigInt(GatingType.CreatorNfd) ? entryGatingAssets[0] : 0n, + entryGatingType === GatingType.CreatorNfd ? entryGatingAssets[0] : 0n, ) const [isFetchingNfdParent, setIsFetchingNfdParent] = React.useState(false) const [nfdParentAppId, setNfdParentAppId] = React.useState( - entryGatingType === BigInt(GatingType.SegmentNfd) ? entryGatingAssets[0] : 0n, + entryGatingType === GatingType.SegmentNfd ? entryGatingAssets[0] : 0n, ) const nfdCreatorQuery = useQuery(nfdQueryOptions(nfdCreatorAppId)) @@ -107,7 +107,7 @@ export function EditEntryGating({ validator }: EditEntryGatingProps) { entryGatingType: String(entryGatingType), entryGatingAddress: entryGatingAddress, entryGatingAssets: - entryGatingType === BigInt(GatingType.AssetId) + entryGatingType === GatingType.AssetId ? entryGatingAssets .filter((assetId) => assetId > 0) .map((assetId) => ({ value: String(assetId) })) diff --git a/ui/src/components/ValidatorDetails/Highlights.tsx b/ui/src/components/ValidatorDetails/Highlights.tsx index 14d5e803..60e6ebca 100644 --- a/ui/src/components/ValidatorDetails/Highlights.tsx +++ b/ui/src/components/ValidatorDetails/Highlights.tsx @@ -29,7 +29,7 @@ export function Highlights({ validator, constraints }: HighlightsProps) { const hasSlots = React.useMemo(() => { return poolAssignment - ? validatorHasAvailableSlots(poolAssignment, Number(validator.config.poolsPerNode)) + ? validatorHasAvailableSlots(poolAssignment, validator.config.poolsPerNode) : false }, [poolAssignment, validator.config.poolsPerNode]) @@ -38,7 +38,7 @@ export function Highlights({ validator, constraints }: HighlightsProps) { const totalStakers = validator.state.totalStakers const maxStakers = calculateMaxStakers(validator, constraints) const { poolsPerNode } = validator.config - const maxNodes = constraints.maxNodes + const maxNodes = Number(constraints.maxNodes) return ( <> diff --git a/ui/src/components/ValidatorDetails/StakingDetails.tsx b/ui/src/components/ValidatorDetails/StakingDetails.tsx index 1fba6d80..5ae6924a 100644 --- a/ui/src/components/ValidatorDetails/StakingDetails.tsx +++ b/ui/src/components/ValidatorDetails/StakingDetails.tsx @@ -66,7 +66,7 @@ export function StakingDetails({ validator, constraints, stakesByValidator }: St const poolData = validator?.pools.map((pool, index) => ({ name: `Pool ${index + 1}`, - value: convertFromBaseUnits(Number(pool.totalAlgoStaked || 1n), 6), + value: convertFromBaseUnits(pool.totalAlgoStaked || 1n, 6), })) || [] const { stakersChartData, poolsInfo, isLoading, errorMessage } = useStakersChartData({ @@ -78,7 +78,7 @@ export function StakingDetails({ validator, constraints, stakesByValidator }: St // Set poolApyQuery staleTime to epoch length in ms const blockTime = useBlockTime() - const staleTime = Number(validator.config.epochRoundLength) * blockTime.ms + const staleTime = validator.config.epochRoundLength * blockTime.ms // Fetch APY for selected pool (setting poolAppId to 0 disables query) const poolApyQuery = useQuery(poolApyQueryOptions(selectedPoolInfo?.poolAppId || 0n, staleTime)) @@ -245,7 +245,7 @@ export function StakingDetails({ validator, constraints, stakesByValidator }: St
Total Pools
- {Number(validator.state.numPools)} + {validator.state.numPools}
@@ -263,7 +263,7 @@ export function StakingDetails({ validator, constraints, stakesByValidator }: St Total Stakers
- {Number(validator.state.totalStakers)} + {validator.state.totalStakers.toString()}
@@ -370,7 +370,7 @@ export function StakingDetails({ validator, constraints, stakesByValidator }: St
Stakers
- {Number(selectedPoolInfo.totalStakers)} + {selectedPoolInfo.totalStakers.toString()}
diff --git a/ui/src/components/ValidatorInfoRow.tsx b/ui/src/components/ValidatorInfoRow.tsx index ba450d76..81652139 100644 --- a/ui/src/components/ValidatorInfoRow.tsx +++ b/ui/src/components/ValidatorInfoRow.tsx @@ -1,6 +1,7 @@ import { DisplayAsset } from '@/components/DisplayAsset' +import { Constraints } from '@/contracts/ValidatorRegistryClient' import { useBlockTime } from '@/hooks/useBlockTime' -import { Constraints, Validator } from '@/interfaces/validator' +import { Validator } from '@/interfaces/validator' import { calculateMaxStakers } from '@/utils/contracts' import { formatDuration } from '@/utils/dayjs' import { formatAmount, formatAssetAmount } from '@/utils/format' @@ -42,7 +43,7 @@ export function ValidatorInfoRow({ validator, constraints }: ValidatorInfoRowPro
@@ -50,7 +51,8 @@ export function ValidatorInfoRow({ validator, constraints }: ValidatorInfoRowPro

Pools / Max

- {validator.state.numPools} / {validator.config.poolsPerNode * constraints.maxNodes} + {validator.state.numPools} /{' '} + {validator.config.poolsPerNode * Number(constraints.maxNodes)}

@@ -82,7 +84,7 @@ export function ValidatorInfoRow({ validator, constraints }: ValidatorInfoRowPro

Reward Token

diff --git a/ui/src/interfaces/validator.ts b/ui/src/interfaces/validator.ts index 92b4db0b..146a690a 100644 --- a/ui/src/interfaces/validator.ts +++ b/ui/src/interfaces/validator.ts @@ -18,7 +18,7 @@ export type ValidatorConfigInput = Omit< export interface LocalPoolInfo { poolId: bigint poolAppId: bigint - totalStakers: bigint + totalStakers: number totalAlgoStaked: bigint poolAddress?: string algodVersion?: string @@ -60,5 +60,5 @@ export interface FindPoolForStakerResponse { export type PoolData = { balance: bigint lastPayout?: bigint - apy?: bigint + apy?: number } diff --git a/ui/src/utils/contracts.ts b/ui/src/utils/contracts.ts index 310271a1..0158d421 100644 --- a/ui/src/utils/contracts.ts +++ b/ui/src/utils/contracts.ts @@ -26,12 +26,10 @@ import { Constraints, NodePoolAssignmentConfig } from '@/contracts/ValidatorRegi */ export function processNodePoolAssignment( nodes: NodePoolAssignmentConfig, - poolsPerNode: bigint, + poolsPerNode: number, ): NodeInfo[] { return nodes.nodes.map((nodeConfig, index) => { - const availableSlots = nodeConfig[0].filter( - (slot, i) => i < Number(poolsPerNode) && slot === 0n, - ).length + const availableSlots = nodeConfig[0].filter((slot, i) => i < poolsPerNode && slot === 0n).length return { index: index + 1, @@ -64,7 +62,7 @@ export function validatorHasAvailableSlots( */ export function findFirstAvailableNode( nodePoolAssignmentConfig: NodePoolAssignmentConfig, - poolsPerNode: bigint, + poolsPerNode: number, ): number | null { for (let nodeIndex = 0; nodeIndex < nodePoolAssignmentConfig.nodes.length; nodeIndex++) { const slotIndex = nodePoolAssignmentConfig.nodes[nodeIndex][0].indexOf(0n) @@ -177,7 +175,7 @@ export function transformEntryGatingAssets( * @returns {bigint} Maximum total stake */ export function calculateMaxStake(validator: Validator, constraints?: Constraints): bigint { - if (validator.state.numPools === 0n || !constraints) { + if (validator.state.numPools === 0 || !constraints) { return BigInt(0) } @@ -194,11 +192,11 @@ export function calculateMaxStake(validator: Validator, constraints?: Constraint * Calculate the maximum number of stakers based on the validator's configuration and protocol constraints * @param {Validator} validator - Validator object * @param {Constraints} constraints - Protocol constraints object - * @returns {bigint} Maximum number of stakers + * @returns {number} Maximum number of stakers */ -export function calculateMaxStakers(validator: Validator, constraints?: Constraints): bigint { - const maxStakersPerPool = constraints?.maxStakersPerPool || 0n - const maxStakers = maxStakersPerPool * BigInt(validator.state.numPools) +export function calculateMaxStakers(validator: Validator, constraints?: Constraints): number { + const maxStakersPerPool = Number(constraints?.maxStakersPerPool || 0) + const maxStakers = maxStakersPerPool * validator.state.numPools return maxStakers } @@ -220,7 +218,7 @@ export function isStakingDisabled( } const { numPools, totalStakers, totalAlgoStaked } = validator.state - const noPools = numPools === 0n + const noPools = numPools === 0 const maxStake = calculateMaxStake(validator, constraints) const maxStakeReached = Number(totalAlgoStaked) >= Number(maxStake) @@ -247,7 +245,7 @@ export function isUnstakingDisabled( if (!activeAddress) { return true } - const noPools = validator.state.numPools === 0n + const noPools = validator.state.numPools === 0 const validatorHasStake = stakesByValidator.some( (stake) => stake.validatorId === BigInt(validator.id), ) @@ -270,7 +268,7 @@ export function isAddingPoolDisabled( if (!activeAddress || !constraints) { return true } - const maxNodes = constraints.maxNodes + const maxNodes = Number(constraints.maxNodes) const { numPools } = validator.state const { poolsPerNode } = validator.config @@ -342,7 +340,7 @@ export async function fetchValueToVerify( const { entryGatingType, entryGatingAddress, entryGatingAssets } = validator.config const minBalance = validator.config.gatingAssetMinBalance - if (entryGatingType === BigInt(GatingType.CreatorAccount)) { + if (entryGatingType === GatingType.CreatorAccount) { const creatorAddress = entryGatingAddress const accountInfo = await fetchAccountInformation(creatorAddress) @@ -352,12 +350,12 @@ export async function fetchValueToVerify( } } - if (entryGatingType === BigInt(GatingType.AssetId)) { + if (entryGatingType === GatingType.AssetId) { const assetIds = entryGatingAssets.filter((asset) => asset !== 0n) return findValueToVerify(heldAssets, assetIds, minBalance) } - if (entryGatingType === BigInt(GatingType.CreatorNfd)) { + if (entryGatingType === GatingType.CreatorNfd) { const nfdAppId = entryGatingAssets[0] const nfd = await fetchNfd(nfdAppId, { view: 'tiny' }) const addresses = nfd.caAlgo || [] @@ -373,7 +371,7 @@ export async function fetchValueToVerify( return findValueToVerify(heldAssets, assetIds, minBalance) } - if (entryGatingType === BigInt(GatingType.SegmentNfd)) { + if (entryGatingType === GatingType.SegmentNfd) { const parentAppID = entryGatingAssets[0] try { @@ -452,11 +450,11 @@ export function calculateMaxAvailableToStake( * @returns {number | null} Rewards eligibility percentage, or null if any input parameters are zero/undefined */ export function calculateRewardEligibility( - epochRoundLength: bigint = 0n, + epochRoundLength: number = 0, lastPoolPayoutRound: bigint = 0n, entryRound: bigint = 0n, ): number | null { - if (epochRoundLength === 0n || lastPoolPayoutRound === 0n || entryRound === 0n) { + if (epochRoundLength === 0 || lastPoolPayoutRound === 0n || entryRound === 0n) { return null } @@ -474,7 +472,7 @@ export function calculateRewardEligibility( const remainingRoundsInEpoch = Math.max(0, Number(nextPayoutRound - entryRound)) // Calculate eligibility as a percentage of the epoch length - const eligibilePercent = (remainingRoundsInEpoch / Number(epochRoundLength)) * 100 + const eligibilePercent = (remainingRoundsInEpoch / epochRoundLength) * 100 // Ensure eligibility is within 0-100% range const rewardEligibility = Math.max(0, Math.min(eligibilePercent, 100)) @@ -639,8 +637,8 @@ export function calculateValidatorPoolMetrics( // Calculate APY only for pools with non-zero balance const nonZeroBalancePools = poolsData.filter((data) => data.balance > 0n) - const totalApy = nonZeroBalancePools.reduce((sum: bigint, data) => sum + (data.apy || 0n), 0n) - const apy = nonZeroBalancePools.length > 0 ? Number(totalApy) / nonZeroBalancePools.length : 0 + const totalApy = nonZeroBalancePools.reduce((sum, data) => sum + (data.apy || 0), 0) + const apy = nonZeroBalancePools.length > 0 ? totalApy / nonZeroBalancePools.length : 0 return { rewardsBalance, roundsSinceLastPayout, apy } } diff --git a/ui/src/utils/tests/abi.ts b/ui/src/utils/tests/abi.ts index 6ead567e..8448557e 100644 --- a/ui/src/utils/tests/abi.ts +++ b/ui/src/utils/tests/abi.ts @@ -1,6 +1,6 @@ import { ABIValue } from 'algosdk' -import { StakingPoolSig } from '@/contracts/StakingPoolClient' -import { ValidatorRegistrySig } from '@/contracts/ValidatorRegistryClient' +import { StakingPoolSignatures } from '@/contracts/StakingPoolClient' +import { ValidatorRegistrySignatures } from '@/contracts/ValidatorRegistryClient' export interface MethodCallParams { method: string @@ -18,7 +18,7 @@ export interface MethodCallParams { * encodeCallParams('getPools', { validatorId: 1 }) */ export function encodeCallParams( - method: ValidatorRegistrySig | StakingPoolSig, + method: ValidatorRegistrySignatures | StakingPoolSignatures, args: MethodCallParams['args'], ): Uint8Array { const methodName = method.split('(', 1)[0] diff --git a/ui/src/utils/tests/fixtures/validators.ts b/ui/src/utils/tests/fixtures/validators.ts index 75522ae8..b12d11d7 100644 --- a/ui/src/utils/tests/fixtures/validators.ts +++ b/ui/src/utils/tests/fixtures/validators.ts @@ -1,12 +1,5 @@ import { ALGORAND_ZERO_ADDRESS_STRING } from '@/constants/accounts' -import { - Constraints, - NodeConfig, - LocalPoolInfo, - Validator, - ValidatorConfig, - ValidatorState, -} from '@/interfaces/validator' +import { LocalPoolInfo, Validator } from '@/interfaces/validator' import { ACCOUNT_1, ACCOUNT_2, @@ -15,17 +8,18 @@ import { ACCOUNT_5, } from '@/utils/tests/fixtures/accounts' import { createStaticArray } from '@/utils/tests/utils' +import { ValidatorConfig, ValidatorCurState } from '@/contracts/ValidatorRegistryClient' export const MOCK_VALIDATOR_1_CONFIG: ValidatorConfig = { - id: 1, + id: 1n, owner: ACCOUNT_1, manager: ACCOUNT_1, - nfdForInfo: 0, + nfdForInfo: 0n, entryGatingType: 0, entryGatingAddress: ALGORAND_ZERO_ADDRESS_STRING, - entryGatingAssets: [0, 0, 0, 0], + entryGatingAssets: [0n, 0n, 0n, 0n], gatingAssetMinBalance: 0n, - rewardTokenId: 0, + rewardTokenId: 0n, rewardPerPayout: 0n, epochRoundLength: 1286, percentToValidator: 5, @@ -33,29 +27,29 @@ export const MOCK_VALIDATOR_1_CONFIG: ValidatorConfig = { minEntryStake: 10n, maxAlgoPerPool: 0n, poolsPerNode: 1, - sunsettingOn: 0, - sunsettingTo: 0, + sunsettingOn: 0n, + sunsettingTo: 0n, } -export const MOCK_VALIDATOR_1_STATE: ValidatorState = { +export const MOCK_VALIDATOR_1_STATE: ValidatorCurState = { numPools: 2, - totalStakers: 2, + totalStakers: 2n, totalAlgoStaked: 72000000000000n, rewardTokenHeldBack: 0n, } export const MOCK_VALIDATOR_1_POOLS: LocalPoolInfo[] = [ { - poolId: 1, - poolAppId: 1010, + poolId: 1n, + poolAppId: 1010n, totalStakers: 2, totalAlgoStaked: 70000000000000n, poolAddress: ACCOUNT_2, algodVersion: '3.23.1 rel/stable [34171a94] : v0.8.0 [d346b13]', }, { - poolId: 2, - poolAppId: 1011, + poolId: 2n, + poolAppId: 1011n, totalStakers: 2, totalAlgoStaked: 2000000000000n, poolAddress: ACCOUNT_3, @@ -73,15 +67,15 @@ export const MOCK_VALIDATOR_1_POOL_ASSIGNMENT: NodeConfig[] = createStaticArray< ) export const MOCK_VALIDATOR_2_CONFIG: ValidatorConfig = { - id: 2, + id: 2n, owner: ACCOUNT_4, manager: ACCOUNT_4, - nfdForInfo: 0, + nfdForInfo: 0n, entryGatingType: 0, entryGatingAddress: ALGORAND_ZERO_ADDRESS_STRING, - entryGatingAssets: [0, 0, 0, 0], + entryGatingAssets: [0n, 0n, 0n, 0n], gatingAssetMinBalance: 0n, - rewardTokenId: 0, + rewardTokenId: 0n, rewardPerPayout: 0n, epochRoundLength: 1286, percentToValidator: 5, @@ -89,21 +83,21 @@ export const MOCK_VALIDATOR_2_CONFIG: ValidatorConfig = { minEntryStake: 10n, maxAlgoPerPool: 0n, poolsPerNode: 1, - sunsettingOn: 0, - sunsettingTo: 0, + sunsettingOn: 0n, + sunsettingTo: 0n, } -export const MOCK_VALIDATOR_2_STATE: ValidatorState = { +export const MOCK_VALIDATOR_2_STATE: ValidatorCurState = { numPools: 1, - totalStakers: 1, + totalStakers: 1n, totalAlgoStaked: 1000n, rewardTokenHeldBack: 0n, } export const MOCK_VALIDATOR_2_POOLS: LocalPoolInfo[] = [ { - poolId: 1, - poolAppId: 1020, + poolId: 1n, + poolAppId: 1020n, totalStakers: 1, totalAlgoStaked: 1000n, poolAddress: ACCOUNT_5, @@ -120,7 +114,7 @@ export const MOCK_VALIDATOR_2_POOL_ASSIGNMENT: NodeConfig[] = createStaticArray< const { id: validator1Id, ...validator1Config } = MOCK_VALIDATOR_1_CONFIG export const MOCK_VALIDATOR_1: Validator = { - id: validator1Id, + id: BigInt(validator1Id), config: validator1Config, state: MOCK_VALIDATOR_1_STATE, pools: MOCK_VALIDATOR_1_POOLS, @@ -130,7 +124,7 @@ export const MOCK_VALIDATOR_1: Validator = { const { id: validator2Id, ...validator2Config } = MOCK_VALIDATOR_2_CONFIG export const MOCK_VALIDATOR_2: Validator = { - id: validator1Id, + id: BigInt(validator1Id), config: validator2Config, state: MOCK_VALIDATOR_2_STATE, pools: MOCK_VALIDATOR_2_POOLS, From 84a6fb1a8d05df1513cfe976b1dc47bd7eb16c81 Mon Sep 17 00:00:00 2001 From: Patrick Bennett Date: Mon, 7 Oct 2024 01:47:39 -0400 Subject: [PATCH 15/24] Fix queryKey to handle bigint app ids --- ui/src/api/queries.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/src/api/queries.ts b/ui/src/api/queries.ts index 80b32809..c3a08680 100644 --- a/ui/src/api/queries.ts +++ b/ui/src/api/queries.ts @@ -113,7 +113,7 @@ export const validatorPoolsQueryOptions = (validatorId: number) => export const stakedInfoQueryOptions = (poolAppId: number) => queryOptions({ - queryKey: ['staked-info', poolAppId], + queryKey: ['staked-info', poolAppId.toString()], queryFn: () => fetchStakedInfoForPool(BigInt(poolAppId)), enabled: !!poolAppId, }) @@ -135,7 +135,7 @@ export const blockTimeQueryOptions = queryOptions({ export const poolApyQueryOptions = (poolAppId: bigint, staleTime?: number) => queryOptions({ - queryKey: ['pool-apy', Number(poolAppId)], + queryKey: ['pool-apy', poolAppId.toString()], queryFn: () => fetchPoolApy(BigInt(poolAppId)), enabled: !!poolAppId, staleTime: staleTime || 1000 * 60 * 60, // 1 hour From a0efbacfc28920c7db118b9a071a6ace71498209 Mon Sep 17 00:00:00 2001 From: Patrick Bennett Date: Mon, 7 Oct 2024 02:09:50 -0400 Subject: [PATCH 16/24] Changed to simplified read-only calls Updates to claimTokens (not tested though) --- contracts/helpers/helpers.ts | 39 ++++++++---------------------------- ui/src/api/contracts.ts | 18 +++++++++++------ 2 files changed, 20 insertions(+), 37 deletions(-) diff --git a/contracts/helpers/helpers.ts b/contracts/helpers/helpers.ts index 87b5d75b..78512169 100644 --- a/contracts/helpers/helpers.ts +++ b/contracts/helpers/helpers.ts @@ -5,12 +5,7 @@ import { LogicError } from '@algorandfoundation/algokit-utils/types/logic-error' import { AlgorandTestAutomationContext } from '@algorandfoundation/algokit-utils/types/testing' import { Account, getApplicationAddress } from 'algosdk' import { randomUUID } from 'crypto' -import { - StakedInfo, - StakedInfoFromTuple, - StakingPoolClient, - ValidatorPoolKey, -} from '../contracts/clients/StakingPoolClient' +import { StakedInfoFromTuple, StakingPoolClient, ValidatorPoolKey } from '../contracts/clients/StakingPoolClient' import { PoolInfo, PoolInfoFromTuple, @@ -60,7 +55,7 @@ export async function getStakeInfoFromBoxValue(stakeClient: StakingPoolClient) { } export async function getProtocolConstraints(validatorClient: ValidatorRegistryClient) { - return (await validatorClient.newGroup().getProtocolConstraints().simulate()).returns[0]! + return (await validatorClient.send.getProtocolConstraints()).return! } export async function addValidator( @@ -98,8 +93,7 @@ export async function addValidator( } export async function getValidatorState(validatorClient: ValidatorRegistryClient, validatorId: number) { - return (await validatorClient.send.getValidatorState({ args: { validatorId }, populateAppCallResources: true })) - .return! + return (await validatorClient.send.getValidatorState({ args: { validatorId } })).return! } export async function addStakingPool( @@ -111,9 +105,6 @@ export async function addStakingPool( poolMbr: bigint, poolInitMbr: bigint, ) { - // const suggestedParams = await context.algod.getTransactionParams().do() - // consoleLogger.info(`addStakingPool: firstRound:${suggestedParams.firstRound}`) - // Before validator can add pools it needs to be funded try { // Now add a staking pool @@ -170,7 +161,7 @@ export async function addStakingPool( } export async function getPoolInfo(validatorClient: ValidatorRegistryClient, poolKey: ValidatorPoolKey) { - return (await validatorClient.send.getPoolInfo({ args: [poolKey], populateAppCallResources: true })).return! + return (await validatorClient.send.getPoolInfo({ args: { poolKey } })).return! } export async function getPools(validatorClient: ValidatorRegistryClient, validatorId: number): Promise { @@ -180,22 +171,14 @@ export async function getPools(validatorClient: ValidatorRegistryClient, validat } export async function getCurMaxStakePerPool(validatorClient: ValidatorRegistryClient, validatorId: number) { - return ( - await validatorClient.send.getCurMaxStakePerPool({ - args: { validatorId }, - populateAppCallResources: true, - }) - ).return! + return (await validatorClient.send.getCurMaxStakePerPool({ args: { validatorId } })).return! } export async function getStakedPoolsForAccount( validatorClient: ValidatorRegistryClient, stakerAccount: Account, ): Promise { - const results = await validatorClient.send.getStakedPoolsForAccount({ - args: { staker: stakerAccount.addr }, - populateAppCallResources: true, - }) + const results = await validatorClient.send.getStakedPoolsForAccount({ args: { staker: stakerAccount.addr } }) const retPoolKeys: ValidatorPoolKey[] = [] results.return!.forEach((poolKey) => { @@ -205,17 +188,11 @@ export async function getStakedPoolsForAccount( } export async function getStakerInfo(stakeClient: StakingPoolClient, staker: Account) { - return ( - await stakeClient.send.getStakerInfo({ - args: { staker: staker.addr }, - populateAppCallResources: true, - }) - ).return! + return (await stakeClient.send.getStakerInfo({ args: { staker: staker.addr } })).return! } export async function getTokenPayoutRatio(validatorClient: ValidatorRegistryClient, validatorId: number) { - return (await validatorClient.send.getTokenPayoutRatio({ args: { validatorId }, populateAppCallResources: true })) - .return! + return (await validatorClient.send.getTokenPayoutRatio({ args: { validatorId } })).return! } export async function addStake( diff --git a/ui/src/api/contracts.ts b/ui/src/api/contracts.ts index c8f9266b..1a98b980 100644 --- a/ui/src/api/contracts.ts +++ b/ui/src/api/contracts.ts @@ -969,27 +969,32 @@ export async function fetchValidatorPools( } } -export async function claimTokens(pools: PoolInfo[], activeAddress: string, authAddr?: string) { +export async function claimTokens( + pools: PoolInfo[], + signer: algosdk.TransactionSigner, + activeAddress: string, + authAddr?: string, +) { const [algorand, stakingFactory] = getStakingPoolFactory() const feeComposer = algorand.newGroup() - const simulateSigner = makeEmptyTransactionSigner(authAddr) + const simSigner = makeEmptyTransactionSigner(authAddr) for (const pool of pools) { const client = stakingFactory.getAppClientById({ appId: pool.poolAppId, defaultSender: activeAddress, + defaultSigner: simSigner, }) - const signer = simulateSigner feeComposer .addAppCallMethodCall( - await client.params.gas({ args: [], note: '1', staticFee: (0).microAlgo(), signer }), + await client.params.gas({ args: [], note: '1', staticFee: (0).microAlgo() }), ) .addAppCallMethodCall( - await client.params.gas({ args: [], note: '2', staticFee: (0).microAlgo(), signer }), + await client.params.gas({ args: [], note: '2', staticFee: (0).microAlgo() }), ) .addAppCallMethodCall( - await client.params.claimTokens({ args: {}, staticFee: (240_000).microAlgo(), signer }), + await client.params.claimTokens({ args: {}, staticFee: (240_000).microAlgo() }), ) } @@ -1013,6 +1018,7 @@ export async function claimTokens(pools: PoolInfo[], activeAddress: string, auth appId: pool.poolAppId, // Assumes this address was registered already with the AlgorandClient and the use-wallet signer defaultSender: activeAddress, + defaultSigner: signer, }) composer .addAppCallMethodCall( From 859666a39fe912ce29e930620c99aabb5dab5fc9 Mon Sep 17 00:00:00 2001 From: Patrick Bennett Date: Mon, 7 Oct 2024 17:30:59 -0400 Subject: [PATCH 17/24] More fixes related to algokit clients --- contracts/bootstrap/package.json | 2 +- contracts/package.json | 2 +- nodemgr/poolcmds.go | 12 +- pnpm-lock.yaml | 18 +- ui/package.json | 2 +- ui/src/api/contracts.ts | 32 +-- ui/src/api/queries.ts | 10 +- ui/src/components/ClaimTokens.tsx | 2 +- ui/src/components/StakingTable.tsx | 15 +- ui/src/components/UnstakeModal.tsx | 2 +- .../ValidatorDetails/EditNfdForInfo.tsx | 10 +- .../ValidatorDetails/EditSunsettingInfo.tsx | 2 +- .../ValidatorDetails/StakingDetails.tsx | 2 +- ui/src/components/ValidatorTable.tsx | 8 +- ui/src/contracts/ValidatorRegistryClient.ts | 196 +++++++++--------- ui/src/interfaces/validator.ts | 13 +- ui/src/utils/contracts.spec.ts | 12 +- ui/src/utils/contracts.ts | 8 +- ui/src/utils/tests/fixtures/boxes.ts | 2 +- ui/src/utils/tests/fixtures/validators.ts | 45 ++-- ui/src/utils/tests/msw/handlers.ts | 4 +- 21 files changed, 192 insertions(+), 207 deletions(-) diff --git a/contracts/bootstrap/package.json b/contracts/bootstrap/package.json index 9fc2aa60..3b394463 100644 --- a/contracts/bootstrap/package.json +++ b/contracts/bootstrap/package.json @@ -11,7 +11,7 @@ }, "license": "MIT", "dependencies": { - "@algorandfoundation/algokit-utils": "7.0.0-beta.10", + "@algorandfoundation/algokit-utils": "7.0.0-beta.11", "algosdk": "^2.9.0", "prompts": "^2.4.2", "yargs": "^17.7.2" diff --git a/contracts/package.json b/contracts/package.json index 8b2f8bba..9a03f2df 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -17,7 +17,7 @@ "prettier:fix": "npx prettier --write ." }, "dependencies": { - "@algorandfoundation/algokit-utils": "7.0.0-beta.10", + "@algorandfoundation/algokit-utils": "7.0.0-beta.11", "algosdk": "^2.9.0" }, "devDependencies": { diff --git a/nodemgr/poolcmds.go b/nodemgr/poolcmds.go index 4555249d..38028b45 100644 --- a/nodemgr/poolcmds.go +++ b/nodemgr/poolcmds.go @@ -9,6 +9,7 @@ import ( "strconv" "strings" "text/tabwriter" + "time" "github.com/algorand/go-algorand-sdk/v2/crypto" "github.com/algorand/go-algorand-sdk/v2/types" @@ -335,8 +336,15 @@ func PoolLedger(ctx context.Context, command *cli.Command) error { floatApr, _, _ := new(big.Float).Parse(apr.String(), 10) floatApr.Quo(floatApr, big.NewFloat(10000.0)) fmt.Fprintf(tw, "APR %%: %s\t\n", floatApr.String()) - fmt.Fprintf(tw, "Last Epoch: %d\t\n", lastPayout-(lastPayout%uint64(config.EpochRoundLength))) - fmt.Fprintf(tw, "Next Payout: %d\t\n", adjustedEpoch) + fmt.Fprintf(tw, "Last Epoch Start: %d\t\n", lastPayout-(lastPayout%uint64(config.EpochRoundLength))) + fmt.Fprintf(tw, "Last Payout: %d\t\n", lastPayout-(lastPayout%uint64(config.EpochRoundLength))) + fmt.Fprintf(tw, "Current round: %d\t\n", params.FirstRoundValid) + fmt.Fprintf(tw, "Next Planned Payout: %d\t\n", nextEpoch) + if adjustedEpoch != nextEpoch { + fmt.Fprintf(tw, "Next possible payout: %d\t\n", adjustedEpoch) + } + blockTime, _ := algo.CalcBlockTimes(ctx, App.algoClient, 10) + fmt.Fprintf(tw, "in approx: %s\t\n", (time.Duration(adjustedEpoch-uint64(params.FirstRoundValid)) * blockTime).Round(time.Second)) if nextEpoch < uint64(params.FirstRoundValid) { fmt.Fprintf(tw, "Missed payout by: %d\t\n", uint64(params.FirstRoundValid)-nextEpoch) } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0c73a495..6135e473 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,8 +11,8 @@ importers: contracts: dependencies: '@algorandfoundation/algokit-utils': - specifier: 7.0.0-beta.10 - version: 7.0.0-beta.10(algosdk@2.9.0) + specifier: 7.0.0-beta.11 + version: 7.0.0-beta.11(algosdk@2.9.0) algosdk: specifier: ^2.9.0 version: 2.9.0 @@ -63,8 +63,8 @@ importers: contracts/bootstrap: dependencies: '@algorandfoundation/algokit-utils': - specifier: 7.0.0-beta.10 - version: 7.0.0-beta.10(algosdk@2.9.0) + specifier: 7.0.0-beta.11 + version: 7.0.0-beta.11(algosdk@2.9.0) algosdk: specifier: ^2.9.0 version: 2.9.0 @@ -94,8 +94,8 @@ importers: ui: dependencies: '@algorandfoundation/algokit-utils': - specifier: 7.0.0-beta.10 - version: 7.0.0-beta.10(algosdk@2.9.0) + specifier: 7.0.0-beta.11 + version: 7.0.0-beta.11(algosdk@2.9.0) '@blockshake/defly-connect': specifier: 1.1.6 version: 1.1.6(algosdk@2.9.0) @@ -357,8 +357,8 @@ packages: peerDependencies: algosdk: ^2.7.0 - '@algorandfoundation/algokit-utils@7.0.0-beta.10': - resolution: {integrity: sha512-KpdPeCxaH3Nwm07oEfRJdWPg5tcFoUrKzSPswRrYfDwQHC8HL/TUY33u/ov6dGaRiL06sRobn6b9ZLMTsEeZlA==} + '@algorandfoundation/algokit-utils@7.0.0-beta.11': + resolution: {integrity: sha512-uCqGMOuRS65qWOogWfMgBqrARACr9vNlBeRIGGqew0q8pnb2svX8lmIsZVPETJ0HS5khrEnt3J3zMsAKdklT0g==} engines: {node: '>=18.0'} peerDependencies: algosdk: ^2.7.0 @@ -5183,7 +5183,7 @@ snapshots: algosdk: 2.9.0 buffer: 6.0.3 - '@algorandfoundation/algokit-utils@7.0.0-beta.10(algosdk@2.9.0)': + '@algorandfoundation/algokit-utils@7.0.0-beta.11(algosdk@2.9.0)': dependencies: algosdk: 2.9.0 buffer: 6.0.3 diff --git a/ui/package.json b/ui/package.json index 4bbd06a4..cd3b211a 100644 --- a/ui/package.json +++ b/ui/package.json @@ -37,7 +37,7 @@ "vitest": "2.1.1" }, "dependencies": { - "@algorandfoundation/algokit-utils": "7.0.0-beta.10", + "@algorandfoundation/algokit-utils": "7.0.0-beta.11", "@blockshake/defly-connect": "1.1.6", "@hookform/resolvers": "3.9.0", "@perawallet/connect": "1.3.4", diff --git a/ui/src/api/contracts.ts b/ui/src/api/contracts.ts index 1a98b980..a0f932ce 100644 --- a/ui/src/api/contracts.ts +++ b/ui/src/api/contracts.ts @@ -1,6 +1,5 @@ import * as algokit from '@algorandfoundation/algokit-utils' import { AlgoAmount } from '@algorandfoundation/algokit-utils/types/amount' -import { ClientManager } from '@algorandfoundation/algokit-utils/types/client-manager' import { QueryClient } from '@tanstack/react-query' import algosdk from 'algosdk' import { fetchAccountBalance, fetchAsset, isOptedInToAsset } from '@/api/algod' @@ -14,14 +13,18 @@ import { import { fetchNfd } from '@/api/nfd' import { ALGORAND_ZERO_ADDRESS_STRING } from '@/constants/accounts' import { GatingType } from '@/constants/gating' -import { StakedInfo, StakingPoolClient, ValidatorPoolKey } from '@/contracts/StakingPoolClient' +import { + StakedInfo, + StakedInfoFromTuple, + StakingPoolClient, + ValidatorPoolKey, +} from '@/contracts/StakingPoolClient' import { Constraints, MbrAmounts, NodePoolAssignmentConfig, PoolInfo, ValidatorConfig, - ValidatorCurState, ValidatorRegistryClient, } from '@/contracts/ValidatorRegistryClient' import { Asset } from '@/interfaces/algod' @@ -37,17 +40,9 @@ import { import { makeEmptyTransactionSigner } from '@/lib/makeEmptyTransactionSigner' import { BalanceChecker } from '@/utils/balanceChecker' import { calculateValidatorPoolMetrics } from '@/utils/contracts' -import { getAlgodConfigFromViteEnvironment } from '@/utils/network/getAlgoClientConfigs' import { ParamsCache } from '@/utils/paramsCache' import { encodeCallParams } from '@/utils/tests/abi' -const algodConfig = getAlgodConfigFromViteEnvironment() -const algodClient = ClientManager.getAlgodClient({ - server: algodConfig.server, - port: algodConfig.port, - token: algodConfig.token, -}) - export function callGetNumValidators(validatorClient: ValidatorRegistryClient) { return validatorClient.send.getNumValidators({ args: {}, @@ -1037,16 +1032,9 @@ export async function fetchStakedInfoForPool(poolAppId: bigint): Promise - ({ - account: s[0], - balance: s[1], - totalRewarded: s[2], - rewardTokenBalance: s[3], - entryRound: s[4], - }) satisfies StakedInfo, - ) + return stakers! + .map((s): StakedInfo => StakedInfoFromTuple(s)) + .filter((staker) => staker.account !== ALGORAND_ZERO_ADDRESS_STRING) } catch (error) { console.error(error) throw error @@ -1090,7 +1078,7 @@ export async function changeValidatorSunsetInfo( export async function changeValidatorNfd( validatorId: number | bigint, - nfdAppId: number, + nfdAppId: bigint, nfdName: string, signer: algosdk.TransactionSigner, activeAddress: string, diff --git a/ui/src/api/queries.ts b/ui/src/api/queries.ts index c3a08680..06d743c8 100644 --- a/ui/src/api/queries.ts +++ b/ui/src/api/queries.ts @@ -68,12 +68,12 @@ export const assetHoldingQueryOptions = (address: string | null) => }) export const nfdQueryOptions = ( - nameOrId: string | number, + nameOrId: string | bigint, params: NfdGetNFDParams = { view: 'brief' }, options: CacheRequestConfig = {}, ) => queryOptions({ - queryKey: ['nfd', String(nameOrId), params], + queryKey: ['nfd', nameOrId.toString(), params], queryFn: () => fetchNfd(String(nameOrId), params, options), enabled: !!nameOrId, placeholderData: keepPreviousData, @@ -111,10 +111,10 @@ export const validatorPoolsQueryOptions = (validatorId: number) => enabled: !!validatorId, }) -export const stakedInfoQueryOptions = (poolAppId: number) => +export const stakedInfoQueryOptions = (poolAppId: bigint) => queryOptions({ queryKey: ['staked-info', poolAppId.toString()], - queryFn: () => fetchStakedInfoForPool(BigInt(poolAppId)), + queryFn: () => fetchStakedInfoForPool(poolAppId), enabled: !!poolAppId, }) @@ -136,7 +136,7 @@ export const blockTimeQueryOptions = queryOptions({ export const poolApyQueryOptions = (poolAppId: bigint, staleTime?: number) => queryOptions({ queryKey: ['pool-apy', poolAppId.toString()], - queryFn: () => fetchPoolApy(BigInt(poolAppId)), + queryFn: () => fetchPoolApy(poolAppId), enabled: !!poolAppId, staleTime: staleTime || 1000 * 60 * 60, // 1 hour }) diff --git a/ui/src/components/ClaimTokens.tsx b/ui/src/components/ClaimTokens.tsx index 888a9913..7efe2f64 100644 --- a/ui/src/components/ClaimTokens.tsx +++ b/ui/src/components/ClaimTokens.tsx @@ -40,7 +40,7 @@ export function ClaimTokens({ validator, rewardTokenBalance }: ClaimTokensProps) toast.loading('Sign transactions to claim reward tokens...', { id: toastId }) - await claimTokens(validator.pools, activeAddress, authAddress) + await claimTokens(validator.pools, transactionSigner, activeAddress, authAddress) toast.success(
diff --git a/ui/src/components/StakingTable.tsx b/ui/src/components/StakingTable.tsx index e6f3c82d..39f27f7e 100644 --- a/ui/src/components/StakingTable.tsx +++ b/ui/src/components/StakingTable.tsx @@ -39,7 +39,7 @@ import { } from '@/components/ui/table' import { UnstakeModal } from '@/components/UnstakeModal' import { StakerValidatorData } from '@/interfaces/staking' -import { Constraints, Validator } from '@/interfaces/validator' +import { Validator } from '@/interfaces/validator' import { useAuthAddress } from '@/providers/AuthAddressProvider' import { calculateRewardEligibility, @@ -55,6 +55,7 @@ import { ellipseAddressJsx } from '@/utils/ellipseAddress' import { formatAssetAmount } from '@/utils/format' import { globalFilterFn } from '@/utils/table' import { cn } from '@/utils/ui' +import { Constraints } from '@/contracts/ValidatorRegistryClient' interface StakingTableProps { validators: Validator[] @@ -88,7 +89,7 @@ export function StakingTable({ accessorFn: (row) => row.validatorId, header: ({ column }) => , cell: ({ row }) => { - const validator = validators.find((v) => v.id === row.original.validatorId) + const validator = validators.find((v) => BigInt(v.id) === row.original.validatorId) if (!validator) { return 'Unknown Validator' @@ -99,13 +100,13 @@ export function StakingTable({
{isSunsetted(validator) ? ( ) : isSunsetting(validator) ? ( @@ -158,7 +159,7 @@ export function StakingTable({ accessorKey: 'rewardTokenBalance', header: ({ column }) => , cell: ({ row }) => { - const validator = validators.find((v) => v.id === row.original.validatorId) + const validator = validators.find((v) => BigInt(v.id) === row.original.validatorId) if (!validator?.rewardToken) { return -- } @@ -176,7 +177,7 @@ export function StakingTable({ header: ({ column }) => , cell: ({ row }) => { const stakerValidatorData = row.original - const validator = validators.find((v) => v.id === stakerValidatorData.validatorId) + const validator = validators.find((v) => BigInt(v.id) === stakerValidatorData.validatorId) const { epochRoundLength } = validator?.config || {} const allPoolsEligibility = stakerValidatorData.pools.map((poolData) => { @@ -201,7 +202,7 @@ export function StakingTable({ id: 'actions', cell: ({ row }) => { const validatorId = row.original.validatorId - const validator = validators.find((v) => v.id === validatorId) + const validator = validators.find((v) => BigInt(v.id) === validatorId) if (!validator || !activeAddress) return null diff --git a/ui/src/components/UnstakeModal.tsx b/ui/src/components/UnstakeModal.tsx index e8e87e72..d4f773f5 100644 --- a/ui/src/components/UnstakeModal.tsx +++ b/ui/src/components/UnstakeModal.tsx @@ -222,7 +222,7 @@ export function UnstakeModal({ validator, setValidator, stakesByValidator }: Uns ) // Refetch validator data - const newData = await fetchValidator(BigInt(validator!.id)) + const newData = await fetchValidator(validator!.id) // Seed/update query cache with new data setValidatorQueriesData(queryClient, newData) diff --git a/ui/src/components/ValidatorDetails/EditNfdForInfo.tsx b/ui/src/components/ValidatorDetails/EditNfdForInfo.tsx index d01ae4f9..1fab5c08 100644 --- a/ui/src/components/ValidatorDetails/EditNfdForInfo.tsx +++ b/ui/src/components/ValidatorDetails/EditNfdForInfo.tsx @@ -44,7 +44,7 @@ export function EditNfdForInfo({ validator }: EditNfdForInfoProps) { const { nfdForInfo } = validator.config const [isFetchingNfdForInfo, setIsFetchingNfdForInfo] = React.useState(false) - const [nfdForInfoAppId, setNfdForInfoAppId] = React.useState(nfdForInfo) + const [nfdForInfoAppId, setNfdForInfoAppId] = React.useState(nfdForInfo) const { transactionSigner, activeAddress } = useWallet() const queryClient = useQueryClient() @@ -89,7 +89,7 @@ export function EditNfdForInfo({ validator }: EditNfdForInfoProps) { // If we have an app id, clear error if it exists form.clearErrors('nfdForInfo') - setNfdForInfoAppId(nfd.appID!) + setNfdForInfoAppId(BigInt(nfd.appID!)) // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (error: any) { let message: string @@ -125,11 +125,11 @@ export function EditNfdForInfo({ validator }: EditNfdForInfoProps) { const showPrimaryMintNfd = ( name: string, isFetching: boolean, - appId: number, + appId: bigint, errorMessage?: string, ) => { return ( - !isFetching && appId === 0 && errorMessage === 'NFD app ID not found' && isValidName(name) + !isFetching && appId === 0n && errorMessage === 'NFD app ID not found' && isValidName(name) ) } @@ -224,7 +224,7 @@ export function EditNfdForInfo({ validator }: EditNfdForInfoProps) { {...field} onChange={(e) => { field.onChange(e) // Inform react-hook-form of the change - setNfdForInfoAppId(0) // Reset NFD app ID + setNfdForInfoAppId(0n) // Reset NFD app ID setIsFetchingNfdForInfo(true) // Set fetching state debouncedNfdForInfoCheck(e.target.value) // Perform debounced validation }} diff --git a/ui/src/components/ValidatorDetails/EditSunsettingInfo.tsx b/ui/src/components/ValidatorDetails/EditSunsettingInfo.tsx index 9cb82e97..c1037635 100644 --- a/ui/src/components/ValidatorDetails/EditSunsettingInfo.tsx +++ b/ui/src/components/ValidatorDetails/EditSunsettingInfo.tsx @@ -52,7 +52,7 @@ export function EditSunsettingInfo({ validator }: EditSunsettingInfoProps) { const { sunsettingOn, sunsettingTo } = validator.config const defaultValues = { enableSunset: sunsettingOn > 0, - sunsettingOn: sunsettingOn > 0 ? dayjs.unix(sunsettingOn).toDate() : undefined, + sunsettingOn: sunsettingOn > 0 ? dayjs.unix(Number(sunsettingOn)).toDate() : undefined, sunsettingTo: String(sunsettingTo || ''), } diff --git a/ui/src/components/ValidatorDetails/StakingDetails.tsx b/ui/src/components/ValidatorDetails/StakingDetails.tsx index 5ae6924a..ee4af3ca 100644 --- a/ui/src/components/ValidatorDetails/StakingDetails.tsx +++ b/ui/src/components/ValidatorDetails/StakingDetails.tsx @@ -66,7 +66,7 @@ export function StakingDetails({ validator, constraints, stakesByValidator }: St const poolData = validator?.pools.map((pool, index) => ({ name: `Pool ${index + 1}`, - value: convertFromBaseUnits(pool.totalAlgoStaked || 1n, 6), + value: convertFromBaseUnits(Number(pool.totalAlgoStaked || 1n), 6), })) || [] const { stakersChartData, poolsInfo, isLoading, errorMessage } = useStakersChartData({ diff --git a/ui/src/components/ValidatorTable.tsx b/ui/src/components/ValidatorTable.tsx index a792db29..629ee033 100644 --- a/ui/src/components/ValidatorTable.tsx +++ b/ui/src/components/ValidatorTable.tsx @@ -253,7 +253,7 @@ export function ValidatorTable({ cell: ({ row }) => { const validator = row.original - if (validator.state.numPools === 0n) return '--' + if (validator.state.numPools === 0) return '--' const currentStakeAlgos = AlgoAmount.MicroAlgos( Number(validator.state.totalAlgoStaked), @@ -301,7 +301,7 @@ export function ValidatorTable({ header: ({ column }) => , cell: ({ row }) => { const validator = row.original - if (validator.state.numPools == 0n) return '--' + if (validator.state.numPools == 0) return '--' return }, @@ -353,10 +353,10 @@ export function ValidatorTable({ const isDevelopment = process.env.NODE_ENV === 'development' const hasRewardToken = validator.config.rewardTokenId > 0 const canSendRewardTokens = isDevelopment && canManage && hasRewardToken - const sendRewardTokensDisabled = validator.state.numPools === 0n + const sendRewardTokensDisabled = validator.state.numPools === 0 const stakerValidatorData = stakesByValidator.find( - (data) => data.validatorId === validator.id, + (data) => data.validatorId === BigInt(validator.id), ) const stakerPoolData = stakerValidatorData?.pools const canSimulateEpoch = isDevelopment && canManage && !!stakerPoolData diff --git a/ui/src/contracts/ValidatorRegistryClient.ts b/ui/src/contracts/ValidatorRegistryClient.ts index 0074076f..593b1106 100644 --- a/ui/src/contracts/ValidatorRegistryClient.ts +++ b/ui/src/contracts/ValidatorRegistryClient.ts @@ -165,7 +165,7 @@ export type ValidatorConfig = { nfdForInfo: uint64, entryGatingType: uint8, entryGatingAddress: address, - entryGatingAssets: uint64[], + entryGatingAssets: [uint64,uint64,uint64,uint64], gatingAssetMinBalance: uint64, rewardTokenId: uint64, rewardPerPayout: uint64, @@ -1291,8 +1291,8 @@ export abstract class ValidatorRegistryParamsFactory { * * Adds a new pool to a validator's pool set, returning the 'key' to reference the pool in the future for staking, etc. The caller must pay the cost of the validators MBR increase as well as the MBR that will be needed for the pool itself. - - + + [ ONLY OWNER OR MANAGER CAN call ] * @@ -1331,8 +1331,8 @@ export abstract class ValidatorRegistryParamsFactory { It would be 60/40% in the poolPctOfWhole values. The token reward payouts then use these values instead of their 'current' stake which changes as part of the payouts themselves (and people could be changing stake during the epoch updates across pools) - - + + Multiple pools will call us via pool 1 (pool2-pool1-validator, etc.) so don't assert on pool1 calling multiple times in same epoch. Just return. @@ -1464,22 +1464,22 @@ export class ValidatorRegistryFactory { appSpec: APP_SPEC, }) } - + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ public get appName() { return this.appFactory.appName } - + /** The ARC-56 app spec being used */ get appSpec() { return APP_SPEC } - + /** A reference to the underlying `AlgorandClient` this app factory is using. */ public get algorand(): AlgorandClientInterface { return this.appFactory.algorand } - + /** * Returns a new `AppClient` client for an app instance of the given ID. * @@ -1491,7 +1491,7 @@ export class ValidatorRegistryFactory { public getAppClientById(params: AppFactoryAppClientParams) { return new ValidatorRegistryClient(this.appFactory.getAppClientById(params)) } - + /** * Returns a new `AppClient` client, resolving the app by creator address and name * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). @@ -1613,7 +1613,7 @@ export class ValidatorRegistryClient { appSpec: APP_SPEC, }) } - + /** * Checks for decode errors on the given return value and maps the return value to the return type for the given method * @returns The typed return value or undefined if there was no value @@ -1621,7 +1621,7 @@ export class ValidatorRegistryClient { decodeReturnValue(method: TSignature, returnValue: ABIReturn | undefined) { return returnValue !== undefined ? getArc56ReturnValue>(returnValue, this.appClient.getABIMethod(method), APP_SPEC.structs) : undefined } - + /** * Returns a new `ValidatorRegistryClient` client, resolving the app by creator address and name * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). @@ -1630,7 +1630,7 @@ export class ValidatorRegistryClient { public static async fromCreatorAndName(params: Omit): Promise { return new ValidatorRegistryClient(await AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) } - + /** * Returns an `ValidatorRegistryClient` instance for the current network based on * pre-determined network-specific app IDs specified in the ARC-56 app spec. @@ -1643,27 +1643,27 @@ export class ValidatorRegistryClient { ): Promise { return new ValidatorRegistryClient(await AppClient.fromNetwork({...params, appSpec: APP_SPEC})) } - + /** The ID of the app instance this client is linked to. */ public get appId() { return this.appClient.appId } - + /** The app address of the app instance this client is linked to. */ public get appAddress() { return this.appClient.appAddress } - + /** The name of the app. */ public get appName() { return this.appClient.appName } - + /** The ARC-56 app spec being used */ public get appSpec() { return this.appClient.appSpec } - + /** A reference to the underlying `AlgorandClient` this app client is using. */ public get algorand(): AlgorandClientInterface { return this.appClient.algorand @@ -1727,7 +1727,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getMbrAmounts()(uint64,uint64,uint64,uint64)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Returns the MBR amounts needed for various actions: @@ -1748,7 +1748,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getProtocolConstraints()(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Returns the protocol constraints so that UIs can limit what users specify for validator configuration parameters. @@ -1762,7 +1762,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getNumValidators()uint64` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Returns the current number of validators @@ -1776,7 +1776,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getValidatorConfig(uint64)(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call @@ -1788,7 +1788,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getValidatorState(uint64)(uint16,uint64,uint64,uint64)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call @@ -1800,7 +1800,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getValidatorOwnerAndManager(uint64)(address,address)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call @@ -1812,7 +1812,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getPools(uint64)(uint64,uint16,uint64)[]` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Return list of all pools for this validator. @@ -1826,7 +1826,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getPoolAppId(uint64,uint64)uint64` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * getPoolAppId is useful for callers to determine app to call for removing stake if they don't have staking or @@ -1843,7 +1843,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getPoolInfo((uint64,uint64,uint64))(uint64,uint16,uint64)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call @@ -1855,7 +1855,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getCurMaxStakePerPool(uint64)uint64` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Calculate the maximum stake per pool for a given validator. @@ -1872,7 +1872,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `doesStakerNeedToPayMBR(address)bool` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Helper callers can call w/ simulate to determine if 'AddStaker' MBR should be included w/ staking amount @@ -1886,7 +1886,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getStakedPoolsForAccount(address)(uint64,uint64,uint64)[]` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Retrieves the staked pools for an account. @@ -1900,7 +1900,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getTokenPayoutRatio(uint64)(uint64[24],uint64)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Retrieves the token payout ratio for a given validator - returning the pool ratios of whole so that token @@ -1916,7 +1916,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getNodePoolAssignments(uint64)((uint64[3])[8])` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call @@ -1928,7 +1928,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getNFDRegistryID()uint64` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call @@ -2027,8 +2027,8 @@ export class ValidatorRegistryClient { * * Adds a new pool to a validator's pool set, returning the 'key' to reference the pool in the future for staking, etc. The caller must pay the cost of the validators MBR increase as well as the MBR that will be needed for the pool itself. - - + + [ ONLY OWNER OR MANAGER CAN call ] * @@ -2061,8 +2061,8 @@ export class ValidatorRegistryClient { It would be 60/40% in the poolPctOfWhole values. The token reward payouts then use these values instead of their 'current' stake which changes as part of the payouts themselves (and people could be changing stake during the epoch updates across pools) - - + + Multiple pools will call us via pool 1 (pool2-pool1-validator, etc.) so don't assert on pool1 calling multiple times in same epoch. Just return. @@ -2107,7 +2107,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `findPoolForStaker(uint64,address,uint64)((uint64,uint64,uint64),bool,bool)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Finds the pool for a staker based on the provided validator id, staker address, and amount to stake. @@ -2218,7 +2218,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getMbrAmounts()(uint64,uint64,uint64,uint64)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Returns the MBR amounts needed for various actions: @@ -2239,7 +2239,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getProtocolConstraints()(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Returns the protocol constraints so that UIs can limit what users specify for validator configuration parameters. @@ -2253,7 +2253,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getNumValidators()uint64` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Returns the current number of validators @@ -2267,7 +2267,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getValidatorConfig(uint64)(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call @@ -2279,7 +2279,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getValidatorState(uint64)(uint16,uint64,uint64,uint64)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call @@ -2291,7 +2291,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getValidatorOwnerAndManager(uint64)(address,address)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call @@ -2303,7 +2303,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getPools(uint64)(uint64,uint16,uint64)[]` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Return list of all pools for this validator. @@ -2317,7 +2317,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getPoolAppId(uint64,uint64)uint64` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * getPoolAppId is useful for callers to determine app to call for removing stake if they don't have staking or @@ -2334,7 +2334,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getPoolInfo((uint64,uint64,uint64))(uint64,uint16,uint64)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call @@ -2346,7 +2346,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getCurMaxStakePerPool(uint64)uint64` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Calculate the maximum stake per pool for a given validator. @@ -2363,7 +2363,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `doesStakerNeedToPayMBR(address)bool` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Helper callers can call w/ simulate to determine if 'AddStaker' MBR should be included w/ staking amount @@ -2377,7 +2377,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getStakedPoolsForAccount(address)(uint64,uint64,uint64)[]` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Retrieves the staked pools for an account. @@ -2391,7 +2391,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getTokenPayoutRatio(uint64)(uint64[24],uint64)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Retrieves the token payout ratio for a given validator - returning the pool ratios of whole so that token @@ -2407,7 +2407,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getNodePoolAssignments(uint64)((uint64[3])[8])` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call @@ -2419,7 +2419,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getNFDRegistryID()uint64` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call @@ -2518,8 +2518,8 @@ export class ValidatorRegistryClient { * * Adds a new pool to a validator's pool set, returning the 'key' to reference the pool in the future for staking, etc. The caller must pay the cost of the validators MBR increase as well as the MBR that will be needed for the pool itself. - - + + [ ONLY OWNER OR MANAGER CAN call ] * @@ -2552,8 +2552,8 @@ export class ValidatorRegistryClient { It would be 60/40% in the poolPctOfWhole values. The token reward payouts then use these values instead of their 'current' stake which changes as part of the payouts themselves (and people could be changing stake during the epoch updates across pools) - - + + Multiple pools will call us via pool 1 (pool2-pool1-validator, etc.) so don't assert on pool1 calling multiple times in same epoch. Just return. @@ -2598,7 +2598,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `findPoolForStaker(uint64,address,uint64)((uint64,uint64,uint64),bool,bool)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Finds the pool for a staker based on the provided validator id, staker address, and amount to stake. @@ -2713,7 +2713,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getMbrAmounts()(uint64,uint64,uint64,uint64)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Returns the MBR amounts needed for various actions: @@ -2735,7 +2735,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getProtocolConstraints()(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Returns the protocol constraints so that UIs can limit what users specify for validator configuration parameters. @@ -2750,7 +2750,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getNumValidators()uint64` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Returns the current number of validators @@ -2765,7 +2765,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getValidatorConfig(uint64)(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call @@ -2778,7 +2778,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getValidatorState(uint64)(uint16,uint64,uint64,uint64)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call @@ -2791,7 +2791,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getValidatorOwnerAndManager(uint64)(address,address)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call @@ -2804,7 +2804,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getPools(uint64)(uint64,uint16,uint64)[]` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Return list of all pools for this validator. @@ -2819,7 +2819,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getPoolAppId(uint64,uint64)uint64` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * getPoolAppId is useful for callers to determine app to call for removing stake if they don't have staking or @@ -2837,7 +2837,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getPoolInfo((uint64,uint64,uint64))(uint64,uint16,uint64)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call @@ -2850,7 +2850,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getCurMaxStakePerPool(uint64)uint64` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Calculate the maximum stake per pool for a given validator. @@ -2868,7 +2868,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `doesStakerNeedToPayMBR(address)bool` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Helper callers can call w/ simulate to determine if 'AddStaker' MBR should be included w/ staking amount @@ -2883,7 +2883,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getStakedPoolsForAccount(address)(uint64,uint64,uint64)[]` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Retrieves the staked pools for an account. @@ -2898,7 +2898,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getTokenPayoutRatio(uint64)(uint64[24],uint64)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Retrieves the token payout ratio for a given validator - returning the pool ratios of whole so that token @@ -2915,7 +2915,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getNodePoolAssignments(uint64)((uint64[3])[8])` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call @@ -2928,7 +2928,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `getNFDRegistryID()uint64` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call @@ -3034,8 +3034,8 @@ export class ValidatorRegistryClient { * * Adds a new pool to a validator's pool set, returning the 'key' to reference the pool in the future for staking, etc. The caller must pay the cost of the validators MBR increase as well as the MBR that will be needed for the pool itself. - - + + [ ONLY OWNER OR MANAGER CAN call ] * @@ -3070,8 +3070,8 @@ export class ValidatorRegistryClient { It would be 60/40% in the poolPctOfWhole values. The token reward payouts then use these values instead of their 'current' stake which changes as part of the payouts themselves (and people could be changing stake during the epoch updates across pools) - - + + Multiple pools will call us via pool 1 (pool2-pool1-validator, etc.) so don't assert on pool1 calling multiple times in same epoch. Just return. @@ -3119,7 +3119,7 @@ export class ValidatorRegistryClient { /** * Makes a call to the ValidatorRegistry smart contract using the `findPoolForStaker(uint64,address,uint64)((uint64,uint64,uint64),bool,bool)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Finds the pool for a staker based on the provided validator id, staker address, and amount to stake. @@ -3177,7 +3177,7 @@ export class ValidatorRegistryClient { /** * Makes a readonly (simulated) call to the ValidatorRegistry smart contract using the `getMbrAmounts()(uint64,uint64,uint64,uint64)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Returns the MBR amounts needed for various actions: @@ -3199,7 +3199,7 @@ export class ValidatorRegistryClient { /** * Makes a readonly (simulated) call to the ValidatorRegistry smart contract using the `getProtocolConstraints()(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Returns the protocol constraints so that UIs can limit what users specify for validator configuration parameters. @@ -3214,7 +3214,7 @@ export class ValidatorRegistryClient { /** * Makes a readonly (simulated) call to the ValidatorRegistry smart contract using the `getNumValidators()uint64` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Returns the current number of validators @@ -3229,7 +3229,7 @@ export class ValidatorRegistryClient { /** * Makes a readonly (simulated) call to the ValidatorRegistry smart contract using the `getValidatorConfig(uint64)(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call @@ -3242,7 +3242,7 @@ export class ValidatorRegistryClient { /** * Makes a readonly (simulated) call to the ValidatorRegistry smart contract using the `getValidatorState(uint64)(uint16,uint64,uint64,uint64)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call @@ -3255,7 +3255,7 @@ export class ValidatorRegistryClient { /** * Makes a readonly (simulated) call to the ValidatorRegistry smart contract using the `getValidatorOwnerAndManager(uint64)(address,address)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call @@ -3268,7 +3268,7 @@ export class ValidatorRegistryClient { /** * Makes a readonly (simulated) call to the ValidatorRegistry smart contract using the `getPools(uint64)(uint64,uint16,uint64)[]` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Return list of all pools for this validator. @@ -3283,7 +3283,7 @@ export class ValidatorRegistryClient { /** * Makes a readonly (simulated) call to the ValidatorRegistry smart contract using the `getPoolAppId(uint64,uint64)uint64` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * getPoolAppId is useful for callers to determine app to call for removing stake if they don't have staking or @@ -3301,7 +3301,7 @@ export class ValidatorRegistryClient { /** * Makes a readonly (simulated) call to the ValidatorRegistry smart contract using the `getPoolInfo((uint64,uint64,uint64))(uint64,uint16,uint64)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call @@ -3314,7 +3314,7 @@ export class ValidatorRegistryClient { /** * Makes a readonly (simulated) call to the ValidatorRegistry smart contract using the `getCurMaxStakePerPool(uint64)uint64` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Calculate the maximum stake per pool for a given validator. @@ -3332,7 +3332,7 @@ export class ValidatorRegistryClient { /** * Makes a readonly (simulated) call to the ValidatorRegistry smart contract using the `doesStakerNeedToPayMBR(address)bool` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Helper callers can call w/ simulate to determine if 'AddStaker' MBR should be included w/ staking amount @@ -3347,7 +3347,7 @@ export class ValidatorRegistryClient { /** * Makes a readonly (simulated) call to the ValidatorRegistry smart contract using the `getStakedPoolsForAccount(address)(uint64,uint64,uint64)[]` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Retrieves the staked pools for an account. @@ -3362,7 +3362,7 @@ export class ValidatorRegistryClient { /** * Makes a readonly (simulated) call to the ValidatorRegistry smart contract using the `getTokenPayoutRatio(uint64)(uint64[24],uint64)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Retrieves the token payout ratio for a given validator - returning the pool ratios of whole so that token @@ -3379,7 +3379,7 @@ export class ValidatorRegistryClient { /** * Makes a readonly (simulated) call to the ValidatorRegistry smart contract using the `getNodePoolAssignments(uint64)((uint64[3])[8])` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call @@ -3392,7 +3392,7 @@ export class ValidatorRegistryClient { /** * Makes a readonly (simulated) call to the ValidatorRegistry smart contract using the `getNFDRegistryID()uint64` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call @@ -3405,7 +3405,7 @@ export class ValidatorRegistryClient { /** * Makes a readonly (simulated) call to the ValidatorRegistry smart contract using the `findPoolForStaker(uint64,address,uint64)((uint64,uint64,uint64),bool,bool)` ABI method. - * + * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * Finds the pool for a staker based on the provided validator id, staker address, and amount to stake. @@ -4100,8 +4100,8 @@ export type ValidatorRegistryComposer = { * * Adds a new pool to a validator's pool set, returning the 'key' to reference the pool in the future for staking, etc. The caller must pay the cost of the validators MBR increase as well as the MBR that will be needed for the pool itself. - - + + [ ONLY OWNER OR MANAGER CAN call ] * @@ -4132,8 +4132,8 @@ export type ValidatorRegistryComposer = { It would be 60/40% in the poolPctOfWhole values. The token reward payouts then use these values instead of their 'current' stake which changes as part of the payouts themselves (and people could be changing stake during the epoch updates across pools) - - + + Multiple pools will call us via pool 1 (pool2-pool1-validator, etc.) so don't assert on pool1 calling multiple times in same epoch. Just return. diff --git a/ui/src/interfaces/validator.ts b/ui/src/interfaces/validator.ts index 146a690a..c47dca50 100644 --- a/ui/src/interfaces/validator.ts +++ b/ui/src/interfaces/validator.ts @@ -9,6 +9,7 @@ import { } from '@/contracts/ValidatorRegistryClient' export type EntryGatingAssets = [bigint, bigint, bigint, bigint] +// export type EntryGatingAssets = bigint[] export type ValidatorConfigInput = Omit< ToStringTypes, @@ -24,6 +25,11 @@ export interface LocalPoolInfo { algodVersion?: string } +export interface NodeConfig { + poolAppIds: bigint[] +} +// export type NodeConfig = [bigint, ...bigint[]] + export type NodeInfo = { index: number availableSlots: number @@ -49,13 +55,6 @@ export interface FindPoolForStakerResponse { isNewStakerToProtocol: boolean } -// export interface MbrAmounts { -// validatorMbr: number -// poolMbr: number -// poolInitMbr: number -// stakerMbr: number -// } -// // Used for calculating validator metrics export type PoolData = { balance: bigint diff --git a/ui/src/utils/contracts.spec.ts b/ui/src/utils/contracts.spec.ts index b7e391ec..d7645296 100644 --- a/ui/src/utils/contracts.spec.ts +++ b/ui/src/utils/contracts.spec.ts @@ -77,7 +77,7 @@ describe('calculateMaxStake', () => { state: { ...MOCK_VALIDATOR_1.state, numPools: 0, - totalStakers: 0, + totalStakers: 0n, totalAlgoStaked: 0n, }, } @@ -152,7 +152,7 @@ describe('isStakingDisabled', () => { ...MOCK_VALIDATOR_1, state: { ...MOCK_VALIDATOR_1.state, - totalStakers: 400, // Assuming this exceeds the maxStakersPerPool * numPools + totalStakers: 400n, // Assuming this exceeds the maxStakersPerPool * numPools }, } expect(isStakingDisabled(activeAddress, validator, constraints)).toBe(true) @@ -185,7 +185,7 @@ describe('isStakingDisabled', () => { ...MOCK_VALIDATOR_1, config: { ...MOCK_VALIDATOR_1.config, - sunsettingOn: Math.floor(Date.now() / 1000) - 10, // 10 seconds in the past + sunsettingOn: BigInt(Math.floor(Date.now() / 1000) - 10), // 10 seconds in the past }, } expect(isStakingDisabled(activeAddress, sunsettedValidator, constraints)).toBe(true) @@ -196,7 +196,7 @@ describe('isStakingDisabled', () => { ...MOCK_VALIDATOR_1, config: { ...MOCK_VALIDATOR_1.config, - sunsettingOn: 0, // Not sunsetted + sunsettingOn: 0n, // Not sunsetted }, } expect(isStakingDisabled(activeAddress, normalValidator, constraints)).toBe(false) @@ -210,7 +210,7 @@ describe('isUnstakingDisabled', () => { const stakesWithValidator = [ { - validatorId: 1, + validatorId: 1n, balance: 1000n, totalRewarded: 0n, rewardTokenBalance: 0n, @@ -222,7 +222,7 @@ describe('isUnstakingDisabled', () => { const stakesWithoutValidator = [ { - validatorId: 2, + validatorId: 2n, balance: 1000n, totalRewarded: 0n, rewardTokenBalance: 0n, diff --git a/ui/src/utils/contracts.ts b/ui/src/utils/contracts.ts index 0158d421..bf81d989 100644 --- a/ui/src/utils/contracts.ts +++ b/ui/src/utils/contracts.ts @@ -7,13 +7,7 @@ import { Indicator } from '@/constants/indicator' import { Asset, AssetHolding } from '@/interfaces/algod' import { NfdSearchV2Params } from '@/interfaces/nfd' import { StakerValidatorData } from '@/interfaces/staking' -import { - EntryGatingAssets, - NodeInfo, - PoolData, - LocalPoolInfo, - Validator, -} from '@/interfaces/validator' +import { LocalPoolInfo, NodeInfo, PoolData, Validator } from '@/interfaces/validator' import { dayjs } from '@/utils/dayjs' import { convertToBaseUnits, roundToFirstNonZeroDecimal, roundToWholeAlgos } from '@/utils/format' import { Constraints, NodePoolAssignmentConfig } from '@/contracts/ValidatorRegistryClient' diff --git a/ui/src/utils/tests/fixtures/boxes.ts b/ui/src/utils/tests/fixtures/boxes.ts index 79414e0b..44773f6b 100644 --- a/ui/src/utils/tests/fixtures/boxes.ts +++ b/ui/src/utils/tests/fixtures/boxes.ts @@ -1,10 +1,10 @@ import { AlgoAmount } from '@algorandfoundation/algokit-utils/types/amount' import algosdk from 'algosdk' import { ALGORAND_ZERO_ADDRESS_STRING } from '@/constants/accounts' -import { StakedInfo } from '@/interfaces/staking' import { LAST_ROUND } from '@/utils/tests/constants' import { ACCOUNT_1, ACCOUNT_2 } from '@/utils/tests/fixtures/accounts' import { createStaticArray } from '@/utils/tests/utils' +import { StakedInfo } from '@/contracts/StakingPoolClient' export const DEFAULT_STAKED_INFO: StakedInfo = { account: ALGORAND_ZERO_ADDRESS_STRING, diff --git a/ui/src/utils/tests/fixtures/validators.ts b/ui/src/utils/tests/fixtures/validators.ts index b12d11d7..1e0c7738 100644 --- a/ui/src/utils/tests/fixtures/validators.ts +++ b/ui/src/utils/tests/fixtures/validators.ts @@ -7,8 +7,12 @@ import { ACCOUNT_4, ACCOUNT_5, } from '@/utils/tests/fixtures/accounts' -import { createStaticArray } from '@/utils/tests/utils' -import { ValidatorConfig, ValidatorCurState } from '@/contracts/ValidatorRegistryClient' +import { + Constraints, + NodePoolAssignmentConfig, + ValidatorConfig, + ValidatorCurState, +} from '@/contracts/ValidatorRegistryClient' export const MOCK_VALIDATOR_1_CONFIG: ValidatorConfig = { id: 1n, @@ -57,14 +61,9 @@ export const MOCK_VALIDATOR_1_POOLS: LocalPoolInfo[] = [ }, ] -export const MOCK_VALIDATOR_1_POOL_ASSIGNMENT: NodeConfig[] = createStaticArray( - [ - [70000000000000n, 0n, 0n], - [2000000000000n, 0n, 0n], - ], - [0n, 0n, 0n], - 8, -) +export const MOCK_VALIDATOR_1_POOL_ASSIGNMENT: NodePoolAssignmentConfig = { + nodes: [[[70000000000000n, 0n, 0n]], [[2000000000000n, 0n, 0n]], [[0n, 0n, 0n]]], +} export const MOCK_VALIDATOR_2_CONFIG: ValidatorConfig = { id: 2n, @@ -105,16 +104,14 @@ export const MOCK_VALIDATOR_2_POOLS: LocalPoolInfo[] = [ }, ] -export const MOCK_VALIDATOR_2_POOL_ASSIGNMENT: NodeConfig[] = createStaticArray( - [[1000n, 0n, 0n]], - [0n, 0n, 0n], - 8, -) +export const MOCK_VALIDATOR_2_POOL_ASSIGNMENT: NodePoolAssignmentConfig = { + nodes: [[[1000n, 0n, 0n]], [[0n, 0n, 0n]]], +} const { id: validator1Id, ...validator1Config } = MOCK_VALIDATOR_1_CONFIG export const MOCK_VALIDATOR_1: Validator = { - id: BigInt(validator1Id), + id: Number(validator1Id), config: validator1Config, state: MOCK_VALIDATOR_1_STATE, pools: MOCK_VALIDATOR_1_POOLS, @@ -124,7 +121,7 @@ export const MOCK_VALIDATOR_1: Validator = { const { id: validator2Id, ...validator2Config } = MOCK_VALIDATOR_2_CONFIG export const MOCK_VALIDATOR_2: Validator = { - id: BigInt(validator1Id), + id: Number(validator1Id), config: validator2Config, state: MOCK_VALIDATOR_2_STATE, pools: MOCK_VALIDATOR_2_POOLS, @@ -132,15 +129,15 @@ export const MOCK_VALIDATOR_2: Validator = { } export const MOCK_CONSTRAINTS: Constraints = { - payoutRoundsMin: 1, - payoutRoundsMax: 1000000, - commissionPctMin: 0, - commissionPctMax: 1000000, + epochPayoutRoundsMin: 1n, + epochPayoutRoundsMax: 1000000n, + minPctToValidatorWFourDecimals: 0n, + maxPctToValidatorWFourDecimals: 1000000n, minEntryStake: 1000000n, maxAlgoPerPool: 70000000000000n, maxAlgoPerValidator: 300000000000000n, amtConsideredSaturated: 200000000000000n, - maxNodes: 8, - maxPoolsPerNode: 3, - maxStakersPerPool: 200, + maxNodes: 8n, + maxPoolsPerNode: 3n, + maxStakersPerPool: 200n, } diff --git a/ui/src/utils/tests/msw/handlers.ts b/ui/src/utils/tests/msw/handlers.ts index 744a6d37..ee85c122 100644 --- a/ui/src/utils/tests/msw/handlers.ts +++ b/ui/src/utils/tests/msw/handlers.ts @@ -123,9 +123,7 @@ const handlers = [ const callParams = JSON.parse(note) as MethodCallParams /* Construct mock response */ - const methods = ValidatorRegistrySpec.contract.methods.map( - (method) => new ABIMethod(method), - ) + const methods = ValidatorRegistrySpec.methods.map((method) => new ABIMethod(method)) const method = getMethodByName(methods, callParams.method) if (!method) { throw new Error('Method not found') From b6b5a32067a85bb6fbbc366e5301b8aeae8f0779 Mon Sep 17 00:00:00 2001 From: Patrick Bennett Date: Mon, 7 Oct 2024 17:48:24 -0400 Subject: [PATCH 18/24] Fix linting errors --- contracts/bootstrap/index.ts | 12 ++++++------ ui/src/api/clients.ts | 9 ++------- ui/src/api/contracts.ts | 7 ++++++- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/contracts/bootstrap/index.ts b/contracts/bootstrap/index.ts index 80090c9f..eccea031 100644 --- a/contracts/bootstrap/index.ts +++ b/contracts/bootstrap/index.ts @@ -134,7 +134,7 @@ async function main() { // Generate staking pool template instance that we load into the validator registry instance's box storage const stakingPoolFactory = algorand.client.getTypedAppFactory(StakingPoolFactory) - const { approvalProgramCompilationResult: approvalCompiled } = await stakingPoolFactory.appFactory.compile({ + const { compiledApproval } = await stakingPoolFactory.appFactory.compile({ deployTimeParams: { nfdRegistryAppId: Number(registryAppID), }, @@ -173,19 +173,19 @@ async function main() { }) console.log( - `loading the ${approvalCompiled!.compiledBase64ToBytes.length} bytes of the staking contract into the validator contracts box storage`, + `loading the ${compiledApproval!.compiledBase64ToBytes.length} bytes of the staking contract into the validator contracts box storage`, ) // Load the staking pool contract bytecode into the validator contract via box storage so it can later deploy const composer = validatorApp.appClient.newGroup().initStakingContract({ - args: { approvalProgramSize: approvalCompiled!.compiledBase64ToBytes.length }, + args: { approvalProgramSize: compiledApproval!.compiledBase64ToBytes.length }, }) // load the StakingPool contract into box storage of the validator - // call loadStakingContractData - chunking the data from approvalCompiled 2000 bytes at a time - for (let i = 0; i < approvalCompiled!.compiledBase64ToBytes.length; i += 2000) { + // call loadStakingContractData - chunking the data from compiledApproval 2000 bytes at a time + for (let i = 0; i < compiledApproval!.compiledBase64ToBytes.length; i += 2000) { composer.loadStakingContractData({ - args: { offset: i, data: approvalCompiled!.compiledBase64ToBytes.subarray(i, i + 2000) }, + args: { offset: i, data: compiledApproval!.compiledBase64ToBytes.subarray(i, i + 2000) }, }) } await composer.finalizeStakingContract().send({ populateAppCallResources: true, suppressLog: true }) diff --git a/ui/src/api/clients.ts b/ui/src/api/clients.ts index 467e8abc..568e0607 100644 --- a/ui/src/api/clients.ts +++ b/ui/src/api/clients.ts @@ -1,16 +1,10 @@ -import { TransactionSignerAccount } from '@algorandfoundation/algokit-utils/types/account' -import { ClientManager } from '@algorandfoundation/algokit-utils/types/client-manager' import algosdk from 'algosdk' import { FEE_SINK } from '@/constants/accounts' import { StakingPoolClient, StakingPoolFactory } from '@/contracts/StakingPoolClient' -import { - ValidatorRegistryClient, - ValidatorRegistryFactory, -} from '@/contracts/ValidatorRegistryClient' +import { ValidatorRegistryClient } from '@/contracts/ValidatorRegistryClient' import { makeEmptyTransactionSigner } from '@/lib/makeEmptyTransactionSigner' import { getRetiAppIdFromViteEnvironment } from '@/utils/env' import { getAlgodConfigFromViteEnvironment } from '@/utils/network/getAlgoClientConfigs' -import { ParamsCache } from '@/utils/paramsCache' import { AlgorandClient } from '@algorandfoundation/algokit-utils' const algodConfig = getAlgodConfigFromViteEnvironment() @@ -21,6 +15,7 @@ const RETI_APP_ID = BigInt(getRetiAppIdFromViteEnvironment()) export function getStakingPoolFactory(): [AlgorandClient, StakingPoolFactory] { return [algorandClient, new StakingPoolFactory({ algorand: algorandClient })] } + export async function getValidatorClient( signer: algosdk.TransactionSigner, activeAddress: string, diff --git a/ui/src/api/contracts.ts b/ui/src/api/contracts.ts index a0f932ce..a68851b3 100644 --- a/ui/src/api/contracts.ts +++ b/ui/src/api/contracts.ts @@ -255,7 +255,12 @@ export async function addValidator( ) { const validatorClient = await getValidatorClient(signer, activeAddress) - const { addValidatorMbr } = (await validatorClient.send.getMbrAmounts({ args: {} })).return! + const { addValidatorMbr } = ( + await validatorClient.send.getMbrAmounts({ + args: {}, + signer: makeEmptyTransactionSigner(authAddr), + }) + ).return! const payValidatorMbr = await validatorClient.appClient.createTransaction.fundAppAccount({ sender: activeAddress, From ad56644f8bd78bf7b2122b5df5d6129c65f04179 Mon Sep 17 00:00:00 2001 From: Patrick Bennett Date: Tue, 8 Oct 2024 11:56:02 -0400 Subject: [PATCH 19/24] Reduce validity window for addStake/removeStake/epochBalanceUpdate and addStakingPool These are instances where the block time might be calculated by the staking pool contract and it needs a smaller 'valid' block range in order to fetch timestamps from prior blocks. --- nodemgr/internal/lib/reti/stakingpool.go | 3 +++ nodemgr/internal/lib/reti/validator.go | 3 +++ 2 files changed, 6 insertions(+) diff --git a/nodemgr/internal/lib/reti/stakingpool.go b/nodemgr/internal/lib/reti/stakingpool.go index 7aa09c1b..0c922626 100644 --- a/nodemgr/internal/lib/reti/stakingpool.go +++ b/nodemgr/internal/lib/reti/stakingpool.go @@ -162,6 +162,9 @@ func (r *Reti) EpochBalanceUpdate(poolID int, poolAppID uint64, caller types.Add return err } + // reduce validity window - good practice - but also required by the reti contracts to have smaller validity window so accessing prior blocks works + params.LastRoundValid = params.FirstRoundValid + 100 + getAtc := func(feesToUse uint64) (transaction.AtomicTransactionComposer, error) { atc := transaction.AtomicTransactionComposer{} gasMethod, _ := r.poolContract.GetMethodByName("gas") diff --git a/nodemgr/internal/lib/reti/validator.go b/nodemgr/internal/lib/reti/validator.go index b623575f..eff07b3e 100644 --- a/nodemgr/internal/lib/reti/validator.go +++ b/nodemgr/internal/lib/reti/validator.go @@ -860,6 +860,7 @@ func (r *Reti) AddStakingPool(nodeNum uint64) (*ValidatorPoolKey, error) { if err != nil { return nil, err } + params.LastRoundValid = params.FirstRoundValid + 100 managerAddr, _ := types.DecodeAddress(info.Config.Manager) @@ -1076,6 +1077,7 @@ func (r *Reti) AddStake(validatorId uint64, staker types.Address, amount uint64, if err != nil { return nil, err } + params.LastRoundValid = params.FirstRoundValid + 100 // first determine how much we might have to add in MBR if this is a first-time staker mbrs, err := r.getMbrAmounts(staker) @@ -1206,6 +1208,7 @@ func (r *Reti) RemoveStake(poolKey ValidatorPoolKey, signer types.Address, stake if err != nil { return err } + params.LastRoundValid = params.FirstRoundValid + 100 extraApps := []uint64{} extraAssets := []uint64{} From 01a21893f0d2191d8c8bbcc7b7a19f01c51e4e58 Mon Sep 17 00:00:00 2001 From: Patrick Bennett Date: Tue, 8 Oct 2024 11:58:07 -0400 Subject: [PATCH 20/24] update non-major dependencies --- pnpm-lock.yaml | 1648 +++++++++++++++++++++++++++++------------------ ui/package.json | 74 +-- 2 files changed, 1072 insertions(+), 650 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6135e473..1d036925 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -58,7 +58,7 @@ importers: version: 5.5.4 vitest: specifier: 2.1.1 - version: 2.1.1(@types/node@22.7.4)(jsdom@24.1.3)(msw@2.4.4(typescript@5.5.4)) + version: 2.1.1(@types/node@22.7.4)(jsdom@24.1.3)(msw@2.4.9(typescript@5.5.4)) contracts/bootstrap: dependencies: @@ -106,89 +106,89 @@ importers: specifier: 1.3.4 version: 1.3.4(algosdk@2.9.0) '@radix-ui/react-avatar': - specifier: 1.1.0 - version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-checkbox': specifier: 1.1.1 - version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-checkbox': + specifier: 1.1.2 + version: 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-collapsible': - specifier: 1.1.0 - version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-dialog': specifier: 1.1.1 - version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dialog': + specifier: 1.1.2 + version: 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-dropdown-menu': - specifier: 2.1.1 - version: 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 2.1.2 + version: 2.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-hover-card': - specifier: 1.1.1 - version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 1.1.2 + version: 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-icons': specifier: 1.3.0 version: 1.3.0(react@18.3.1) '@radix-ui/react-label': specifier: 2.1.0 - version: 2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-navigation-menu': - specifier: 1.2.0 - version: 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 1.2.1 + version: 1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-popover': - specifier: 1.1.1 - version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 1.1.2 + version: 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-scroll-area': - specifier: 1.1.0 - version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 1.2.0 + version: 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-select': - specifier: 2.1.1 - version: 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 2.1.2 + version: 2.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-separator': specifier: 1.1.0 - version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': specifier: 1.1.0 - version: 1.1.0(@types/react@18.3.5)(react@18.3.1) + version: 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-switch': - specifier: 1.1.0 - version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 1.1.1 + version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-tooltip': - specifier: 1.1.2 - version: 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 1.1.3 + version: 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-query': - specifier: 5.55.3 - version: 5.55.3(react@18.3.1) + specifier: 5.59.0 + version: 5.59.0(react@18.3.1) '@tanstack/react-query-devtools': - specifier: 5.55.2 - version: 5.55.2(@tanstack/react-query@5.55.3(react@18.3.1))(react@18.3.1) + specifier: 5.59.0 + version: 5.59.0(@tanstack/react-query@5.59.0(react@18.3.1))(react@18.3.1) '@tanstack/react-router': - specifier: 1.56.5 - version: 1.56.5(@tanstack/router-generator@1.57.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 1.62.0 + version: 1.62.0(@tanstack/router-generator@1.58.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-table': specifier: 8.20.5 version: 8.20.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/router-devtools': - specifier: 1.56.5 - version: 1.56.5(@tanstack/react-router@1.56.5(@tanstack/router-generator@1.57.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 1.62.0 + version: 1.62.0(@tanstack/react-router@1.62.0(@tanstack/router-generator@1.58.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tremor/react': - specifier: 3.18.1 - version: 3.18.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4))) + specifier: 3.18.3 + version: 3.18.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))) '@txnlab/use-wallet-react': - specifier: 3.7.0 - version: 3.7.0(@blockshake/defly-connect@1.1.6(algosdk@2.9.0))(@perawallet/connect@1.3.4(algosdk@2.9.0))(@walletconnect/modal@2.6.2(@types/react@18.3.5)(react@18.3.1))(algosdk@2.9.0)(lute-connect@1.4.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 3.7.2 + version: 3.7.2(@blockshake/defly-connect@1.1.6(algosdk@2.9.0))(@perawallet/connect@1.3.4(algosdk@2.9.0))(@walletconnect/modal@2.7.0(@types/react@18.3.11)(react@18.3.1))(algosdk@2.9.0)(lute-connect@1.4.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@walletconnect/modal-sign-html': - specifier: 2.6.2 - version: 2.6.2(@types/react@18.3.5)(react@18.3.1) + specifier: 2.7.0 + version: 2.7.0(@types/react@18.3.11)(react@18.3.1) algosdk: specifier: ^2.9.0 version: 2.9.0 axios: - specifier: 1.7.4 - version: 1.7.4 + specifier: 1.7.7 + version: 1.7.7 axios-cache-interceptor: - specifier: 1.5.3 - version: 1.5.3(axios@1.7.4) + specifier: 1.6.0 + version: 1.6.0(axios@1.7.7) big.js: - specifier: 6.2.1 - version: 6.2.1 + specifier: 6.2.2 + version: 6.2.2 class-variance-authority: specifier: 0.7.0 version: 0.7.0 @@ -205,8 +205,8 @@ importers: specifier: 1.11.13 version: 1.11.13 lucide-react: - specifier: 0.439.0 - version: 0.439.0(react@18.3.1) + specifier: 0.447.0 + version: 0.447.0(react@18.3.1) lute-connect: specifier: 1.4.1 version: 1.4.1 @@ -238,11 +238,11 @@ importers: specifier: 1.5.0 version: 1.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) tailwind-merge: - specifier: 2.5.2 - version: 2.5.2 + specifier: 2.5.3 + version: 2.5.3 tailwindcss-animate: specifier: 1.0.7 - version: 1.0.7(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4))) + version: 1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))) tslib: specifier: 2.7.0 version: 2.7.0 @@ -251,17 +251,17 @@ importers: version: 10.0.3(react@18.3.1) vite-plugin-node-polyfills: specifier: 0.22.0 - version: 0.22.0(rollup@4.22.0)(vite@5.4.6(@types/node@20.16.5)) + version: 0.22.0(rollup@4.22.0)(vite@5.4.8(@types/node@20.16.10)) zod: specifier: 3.23.8 version: 3.23.8 devDependencies: '@playwright/test': - specifier: 1.47.0 - version: 1.47.0 + specifier: 1.47.2 + version: 1.47.2 '@tanstack/router-vite-plugin': - specifier: 1.56.4 - version: 1.56.4(vite@5.4.6(@types/node@20.16.5)) + specifier: 1.62.0 + version: 1.62.0(vite@5.4.8(@types/node@20.16.10)) '@testing-library/dom': specifier: 10.4.0 version: 10.4.0 @@ -270,37 +270,37 @@ importers: version: 6.5.0 '@testing-library/react': specifier: 16.0.1 - version: 16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/big.js': specifier: 6.2.2 version: 6.2.2 '@types/node': - specifier: 20.16.5 - version: 20.16.5 + specifier: 20.16.10 + version: 20.16.10 '@types/react': - specifier: 18.3.5 - version: 18.3.5 + specifier: 18.3.11 + version: 18.3.11 '@types/react-dom': specifier: 18.3.0 version: 18.3.0 '@typescript-eslint/eslint-plugin': specifier: 8.7.0 - version: 8.7.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4) + version: 8.7.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2) '@typescript-eslint/parser': specifier: 8.7.0 - version: 8.7.0(eslint@8.57.1)(typescript@5.5.4) + version: 8.7.0(eslint@8.57.1)(typescript@5.6.2) '@vitejs/plugin-react': - specifier: 4.3.1 - version: 4.3.1(vite@5.4.6(@types/node@20.16.5)) + specifier: 4.3.2 + version: 4.3.2(vite@5.4.8(@types/node@20.16.10)) '@vitest/coverage-v8': - specifier: 2.1.1 - version: 2.1.1(vitest@2.1.1(@types/node@20.16.5)(jsdom@24.1.3)(msw@2.4.4(typescript@5.5.4))) + specifier: 2.1.2 + version: 2.1.2(vitest@2.1.2(@types/node@20.16.10)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2))) algo-msgpack-with-bigint: specifier: 2.1.1 version: 2.1.1 autoprefixer: specifier: 10.4.20 - version: 10.4.20(postcss@8.4.45) + version: 10.4.20(postcss@8.4.47) eslint: specifier: 8.57.1 version: 8.57.1 @@ -314,32 +314,32 @@ importers: specifier: 24.1.3 version: 24.1.3 msw: - specifier: 2.4.4 - version: 2.4.4(typescript@5.5.4) + specifier: 2.4.9 + version: 2.4.9(typescript@5.6.2) playwright: - specifier: 1.47.0 - version: 1.47.0 + specifier: 1.47.2 + version: 1.47.2 postcss: - specifier: 8.4.45 - version: 8.4.45 + specifier: 8.4.47 + version: 8.4.47 prettier: specifier: 3.3.3 version: 3.3.3 tailwindcss: - specifier: 3.4.10 - version: 3.4.10(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4)) + specifier: 3.4.13 + version: 3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)) ts-node: specifier: 10.9.2 - version: 10.9.2(@types/node@20.16.5)(typescript@5.5.4) + version: 10.9.2(@types/node@20.16.10)(typescript@5.6.2) typescript: - specifier: 5.5.4 - version: 5.5.4 + specifier: 5.6.2 + version: 5.6.2 vite: - specifier: 5.4.6 - version: 5.4.6(@types/node@20.16.5) + specifier: 5.4.8 + version: 5.4.8(@types/node@20.16.10) vitest: - specifier: 2.1.1 - version: 2.1.1(@types/node@20.16.5)(jsdom@24.1.3)(msw@2.4.4(typescript@5.5.4)) + specifier: 2.1.2 + version: 2.1.2(@types/node@20.16.10)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2)) packages: @@ -379,73 +379,136 @@ packages: resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.25.7': + resolution: {integrity: sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.25.4': resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} engines: {node: '>=6.9.0'} + '@babel/compat-data@7.25.7': + resolution: {integrity: sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==} + engines: {node: '>=6.9.0'} + '@babel/core@7.25.2': resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} engines: {node: '>=6.9.0'} + '@babel/core@7.25.7': + resolution: {integrity: sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==} + engines: {node: '>=6.9.0'} + '@babel/generator@7.25.6': resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} engines: {node: '>=6.9.0'} + '@babel/generator@7.25.7': + resolution: {integrity: sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==} + engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.25.2': resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.25.7': + resolution: {integrity: sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.24.7': resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.25.7': + resolution: {integrity: sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-transforms@7.25.2': resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.25.7': + resolution: {integrity: sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-plugin-utils@7.24.8': resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.25.7': + resolution: {integrity: sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==} + engines: {node: '>=6.9.0'} + '@babel/helper-simple-access@7.24.7': resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} + '@babel/helper-simple-access@7.25.7': + resolution: {integrity: sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.24.8': resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.25.7': + resolution: {integrity: sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.24.7': resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.25.7': + resolution: {integrity: sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.24.8': resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.25.7': + resolution: {integrity: sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==} + engines: {node: '>=6.9.0'} + '@babel/helpers@7.25.6': resolution: {integrity: sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==} engines: {node: '>=6.9.0'} + '@babel/helpers@7.25.7': + resolution: {integrity: sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==} + engines: {node: '>=6.9.0'} + '@babel/highlight@7.24.7': resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} + '@babel/highlight@7.25.7': + resolution: {integrity: sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==} + engines: {node: '>=6.9.0'} + '@babel/parser@7.25.6': resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-syntax-jsx@7.24.7': - resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} + '@babel/parser@7.25.7': + resolution: {integrity: sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-jsx@7.25.7': + resolution: {integrity: sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.25.4': - resolution: {integrity: sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==} + '@babel/plugin-syntax-typescript@7.25.7': + resolution: {integrity: sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -470,14 +533,26 @@ packages: resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} engines: {node: '>=6.9.0'} + '@babel/template@7.25.7': + resolution: {integrity: sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.25.6': resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.25.7': + resolution: {integrity: sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==} + engines: {node: '>=6.9.0'} + '@babel/types@7.25.6': resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} engines: {node: '>=6.9.0'} + '@babel/types@7.25.7': + resolution: {integrity: sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==} + engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -943,8 +1018,8 @@ packages: resolution: {integrity: sha512-z10PF9JV6SbjFq+/rYabM+8CVlMokgl8RFGvieSGNTmrkQanfHn+15XBrhG3BgUfvmTeSeyShfOHpG0i9zEdcg==} deprecated: Motion One for Vue is deprecated. Use Oku Motion instead https://oku-ui.com/motion - '@mswjs/interceptors@0.35.1': - resolution: {integrity: sha512-nMuUaMCtg8oKSTHwAnsoGRN6c1RZXNm6+ebEoe9SBGALVlBIzniZoSuC/itNCLOt51YEEYsF0svB/sOzYhqLPA==} + '@mswjs/interceptors@0.35.9': + resolution: {integrity: sha512-SSnyl/4ni/2ViHKkiZb8eajA/eN1DNFaHjhGiLUdZvDz6PKF4COSf/17xqSz64nOo2Ia29SA6B2KNCsyCbVmaQ==} engines: {node: '>=18'} '@nodelib/fs.scandir@2.1.5': @@ -1063,8 +1138,8 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@playwright/test@1.47.0': - resolution: {integrity: sha512-SgAdlSwYVpToI4e/IH19IHHWvoijAYH5hu2MWSXptRypLSnzj51PcGD+rsOXFayde4P9ZLi+loXVwArg6IUkCA==} + '@playwright/test@1.47.2': + resolution: {integrity: sha512-jTXRsoSPONAs8Za9QEQdyjFn+0ZQFjCiIztAIF6bi1HqhBzG9Ma7g1WotyiGqFSBRZjIEqMdT8RUlbk1QVhzCQ==} engines: {node: '>=18'} hasBin: true @@ -1087,8 +1162,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-avatar@1.1.0': - resolution: {integrity: sha512-Q/PbuSMk/vyAd/UoIShVGZ7StHHeRFYU7wXmi5GV+8cLXflZAEpHL/F697H1klrzxKXNtZ97vWiC0q3RKUH8UA==} + '@radix-ui/react-avatar@1.1.1': + resolution: {integrity: sha512-eoOtThOmxeoizxpX6RiEsQZ2wj5r4+zoeqAwO0cBaFQGjJwIH3dIX0OCxNrCyrrdxG+vBweMETh3VziQG7c1kw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1100,8 +1175,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-checkbox@1.1.1': - resolution: {integrity: sha512-0i/EKJ222Afa1FE0C6pNJxDq1itzcl3HChE9DwskA4th4KRse8ojx8a1nVcOjwJdbpDLcz7uol77yYnQNMHdKw==} + '@radix-ui/react-checkbox@1.1.2': + resolution: {integrity: sha512-/i0fl686zaJbDQLNKrkCbMyDm6FQMt4jg323k7HuqitoANm9sE23Ql8yOK3Wusk34HSLKDChhMux05FnP6KUkw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1113,8 +1188,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-collapsible@1.1.0': - resolution: {integrity: sha512-zQY7Epa8sTL0mq4ajSJpjgn2YmCgyrG7RsQgLp3C0LQVkG7+Tf6Pv1CeNWZLyqMjhdPkBa5Lx7wYBeSu7uCSTA==} + '@radix-ui/react-collapsible@1.1.1': + resolution: {integrity: sha512-1///SnrfQHJEofLokyczERxQbWfCGQlQ2XsCZMucVs6it+lq9iw4vXy+uDn1edlb58cOZOWSldnfPAYcT4O/Yg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1157,8 +1232,17 @@ packages: '@types/react': optional: true - '@radix-ui/react-dialog@1.1.1': - resolution: {integrity: sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==} + '@radix-ui/react-context@1.1.1': + resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dialog@1.1.2': + resolution: {integrity: sha512-Yj4dZtqa2o+kG61fzB0H2qUvmwBA2oyQroGLyNtBj1beo1khoQ3q1a2AO8rrQYjd8256CO9+N8L9tvsS+bnIyA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1179,8 +1263,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-dismissable-layer@1.1.0': - resolution: {integrity: sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==} + '@radix-ui/react-dismissable-layer@1.1.1': + resolution: {integrity: sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1192,8 +1276,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-dropdown-menu@2.1.1': - resolution: {integrity: sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ==} + '@radix-ui/react-dropdown-menu@2.1.2': + resolution: {integrity: sha512-GVZMR+eqK8/Kes0a36Qrv+i20bAPXSn8rCBTHx30w+3ECnR5o3xixAlqcVaYvLeyKUsm0aqyhWfmUcqufM8nYA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1205,8 +1289,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-focus-guards@1.1.0': - resolution: {integrity: sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==} + '@radix-ui/react-focus-guards@1.1.1': + resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1227,8 +1311,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-hover-card@1.1.1': - resolution: {integrity: sha512-IwzAOP97hQpDADYVKrEEHUH/b2LA+9MgB0LgdmnbFO2u/3M5hmEofjjr2M6CyzUblaAqJdFm6B7oFtU72DPXrA==} + '@radix-ui/react-hover-card@1.1.2': + resolution: {integrity: sha512-Y5w0qGhysvmqsIy6nQxaPa6mXNKznfoGjOfBgzOjocLxr2XlSjqBMYQQL+FfyogsMuX+m8cZyQGYhJxvxUzO4w==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1267,8 +1351,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-menu@2.1.1': - resolution: {integrity: sha512-oa3mXRRVjHi6DZu/ghuzdylyjaMXLymx83irM7hTxutQbD+7IhPKdMdRHD26Rm+kHRrWcrUkkRPv5pd47a2xFQ==} + '@radix-ui/react-menu@2.1.2': + resolution: {integrity: sha512-lZ0R4qR2Al6fZ4yCCZzu/ReTFrylHFxIqy7OezIpWF4bL0o9biKo0pFIvkaew3TyZ9Fy5gYVrR5zCGZBVbO1zg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1280,8 +1364,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-navigation-menu@1.2.0': - resolution: {integrity: sha512-OQ8tcwAOR0DhPlSY3e4VMXeHiol7la4PPdJWhhwJiJA+NLX0SaCaonOkRnI3gCDHoZ7Fo7bb/G6q25fRM2Y+3Q==} + '@radix-ui/react-navigation-menu@1.2.1': + resolution: {integrity: sha512-egDo0yJD2IK8L17gC82vptkvW1jLeni1VuqCyzY727dSJdk5cDjINomouLoNk8RVF7g2aNIfENKWL4UzeU9c8Q==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1293,8 +1377,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-popover@1.1.1': - resolution: {integrity: sha512-3y1A3isulwnWhvTTwmIreiB8CF4L+qRjZnK1wYLO7pplddzXKby/GnZ2M7OZY3qgnl6p9AodUIHRYGXNah8Y7g==} + '@radix-ui/react-popover@1.1.2': + resolution: {integrity: sha512-u2HRUyWW+lOiA2g0Le0tMmT55FGOEWHwPFt1EPfbLly7uXQExFo5duNKqG2DzmFXIdqOeNd+TpE8baHWJCyP9w==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1319,8 +1403,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-portal@1.1.1': - resolution: {integrity: sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==} + '@radix-ui/react-portal@1.1.2': + resolution: {integrity: sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1332,8 +1416,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-presence@1.1.0': - resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==} + '@radix-ui/react-presence@1.1.1': + resolution: {integrity: sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1371,8 +1455,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-scroll-area@1.1.0': - resolution: {integrity: sha512-9ArIZ9HWhsrfqS765h+GZuLoxaRHD/j0ZWOWilsCvYTpYJp8XwCqNG7Dt9Nu/TItKOdgLGkOPCodQvDc+UMwYg==} + '@radix-ui/react-scroll-area@1.2.0': + resolution: {integrity: sha512-q2jMBdsJ9zB7QG6ngQNzNwlvxLQqONyL58QbEGwuyRZZb/ARQwk3uQVbCF7GvQVOtV6EU/pDxAw3zRzJZI3rpQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1384,8 +1468,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-select@2.1.1': - resolution: {integrity: sha512-8iRDfyLtzxlprOo9IicnzvpsO1wNCkuwzzCM+Z5Rb5tNOpCdMvcc2AkzX0Fz+Tz9v6NJ5B/7EEgyZveo4FBRfQ==} + '@radix-ui/react-select@2.1.2': + resolution: {integrity: sha512-rZJtWmorC7dFRi0owDmoijm6nSJH1tVw64QGiNIZ9PNLyBDtG+iAq+XGsya052At4BfarzY/Dhv9wrrUr6IMZA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1419,8 +1503,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-switch@1.1.0': - resolution: {integrity: sha512-OBzy5WAj641k0AOSpKQtreDMe+isX0MQJ1IVyF03ucdF3DunOnROVrjWs8zsXUxC3zfZ6JL9HFVCUlMghz9dJw==} + '@radix-ui/react-switch@1.1.1': + resolution: {integrity: sha512-diPqDDoBcZPSicYoMWdWx+bCPuTRH4QSp9J+65IvtdS0Kuzt67bI6n32vCj8q6NZmYW/ah+2orOtMwcX5eQwIg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1432,8 +1516,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-tooltip@1.1.2': - resolution: {integrity: sha512-9XRsLwe6Yb9B/tlnYCPVUd/TFS4J7HuOZW345DCeC6vKIxQGMZdx21RK4VoZauPD5frgkXTYVS5y90L+3YBn4w==} + '@radix-ui/react-tooltip@1.1.3': + resolution: {integrity: sha512-Z4w1FIS0BqVFI2c1jZvb/uDVJijJjJ2ZMuPV81oVgTZ7g3BZxobplnMVvXtFWgtozdvYJ+MFWtwkM5S2HnAong==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1679,37 +1763,36 @@ packages: '@stablelib/x25519@1.0.3': resolution: {integrity: sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==} - '@tanstack/history@1.51.7': - resolution: {integrity: sha512-y25aH3NDbdUp5Gk6Fnb77LsHTT2JrzVgI44ZiyEOf8i2j14Ma3oJ80fCw7rT/iV4xa4IN2Yex9flAsZQdh1i4A==} + '@tanstack/history@1.61.1': + resolution: {integrity: sha512-2CqERleeqO3hkhJmyJm37tiL3LYgeOpmo8szqdjgtnnG0z7ZpvzkZz6HkfOr9Ca/ha7mhAiouSvLYuLkM37AMg==} engines: {node: '>=12'} - '@tanstack/query-core@5.55.3': - resolution: {integrity: sha512-JpRWbOiTBaddMg/oYNBeBle3m0wFTZnfLc2dtZgjdr3NZaqSGzIkPDFf6gjTWKq5zxWJTZNtsKSihVKQ7wL3VQ==} + '@tanstack/query-core@5.59.0': + resolution: {integrity: sha512-WGD8uIhX6/deH/tkZqPNcRyAhDUqs729bWKoByYHSogcshXfFbppOdTER5+qY7mFvu8KEFJwT0nxr8RfPTVh0Q==} - '@tanstack/query-devtools@5.55.1': - resolution: {integrity: sha512-2g0TWQGlkyHs9maHIU5A7lRunG4Rj3Y5lOEenE+fydE4zk7GqRs7rKJBp7F74iqRo/cA9V6t1YYQWqd6YRBmcQ==} + '@tanstack/query-devtools@5.58.0': + resolution: {integrity: sha512-iFdQEFXaYYxqgrv63ots+65FGI+tNp5ZS5PdMU1DWisxk3fez5HG3FyVlbUva+RdYS5hSLbxZ9aw3yEs97GNTw==} - '@tanstack/react-query-devtools@5.55.2': - resolution: {integrity: sha512-QkL5Saai7MqEEkGNjhtNB0F1iD4DjpKnvrBM3510L54N8/+4tBPXjMB5a2+ADTYgOrtm4Gn8sJQs/qWKmdpqIg==} + '@tanstack/react-query-devtools@5.59.0': + resolution: {integrity: sha512-Kz7577FQGU8qmJxROIT/aOwmkTcxfBqgTP6r1AIvuJxVMVHPkp8eQxWQ7BnfBsy/KTJHiV9vMtRVo1+R1tB3vg==} peerDependencies: - '@tanstack/react-query': ^5.55.2 + '@tanstack/react-query': ^5.59.0 react: ^18 || ^19 - '@tanstack/react-query@5.55.3': - resolution: {integrity: sha512-DzVFYNKMZPaEj+RNmG1lUjmR3CVFf1GoPvE03/0IN+5C8/VYiIMUhi4YgLQPnksrUarIzPPw1N2MPRvuRysLwQ==} + '@tanstack/react-query@5.59.0': + resolution: {integrity: sha512-YDXp3OORbYR+8HNQx+lf4F73NoiCmCcSvZvgxE29OifmQFk0sBlO26NWLHpcNERo92tVk3w+JQ53/vkcRUY1hA==} peerDependencies: react: ^18 || ^19 - '@tanstack/react-router@1.56.5': - resolution: {integrity: sha512-qCmBgplLlqOSW1eLlKglTTFMv9zlsL8CJZWN0J0+YLkHSmbsdTKQhfA4bFveXL+EwjrJgFT+/GgIfB8fZEp8PQ==} + '@tanstack/react-router@1.62.0': + resolution: {integrity: sha512-Vry/GwXiIHHpFilXy3M82Oyh1O1ULJNHVv8XbZ2QtcvftxkXcotsWD1Rt3KhgvXjBA8Zb/ueYN9ASPtkTdMoqQ==} engines: {node: '>=12'} peerDependencies: - '@tanstack/react-generator': '*' - '@tanstack/router-generator': 1.56.4 + '@tanstack/router-generator': 1.58.12 react: '>=18' react-dom: '>=18' peerDependenciesMeta: - '@tanstack/react-generator': + '@tanstack/router-generator': optional: true '@tanstack/react-store@0.5.5': @@ -1731,23 +1814,23 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@tanstack/router-devtools@1.56.5': - resolution: {integrity: sha512-/yI0St7ldXxajH5BmKiO2FsrD1wQ1Z4ZxLLG1RKeIJsVBz5zWWvlI7tlv5EpBVdVgiGQPrd2turx4gUKFLVP+g==} + '@tanstack/router-devtools@1.62.0': + resolution: {integrity: sha512-924zXF6GXYPxH7mH36jGC7QAONUnqWtABFFhnwheyD8LDMnI06jEj8xOIhMEa8fEjkUDON28dz97fm0fjk/i3Q==} engines: {node: '>=12'} peerDependencies: - '@tanstack/react-router': ^1.56.5 + '@tanstack/react-router': ^1.62.0 react: '>=18' react-dom: '>=18' - '@tanstack/router-generator@1.57.9': - resolution: {integrity: sha512-zDkyb6JLkvHc/Hhu9F+Gn4JzUR7ZgtH1rbcI2H14JG8IjW1ahtko/r0a2Ev+G4kNqhZF0a5sSgh/tMQOIPZyjg==} + '@tanstack/router-generator@1.58.12': + resolution: {integrity: sha512-Ovzb+zCbiRgJAg6awTXWQjn1uRkVyiBc4jiIk7ll2hg0bHjIOsgiegwx/F2YKycY98vWj9TLv/U4Hoo4rmK0IA==} engines: {node: '>=12'} - '@tanstack/router-plugin@1.57.9': - resolution: {integrity: sha512-hMQeZE9TXy10ZNbOkYJDtx07neJUaebTAU/Ep7wAV/uVvgkuGcsjHfXU1HyNfSJV/9Iivrua7ozIJzW2ep+V/A==} + '@tanstack/router-plugin@1.62.0': + resolution: {integrity: sha512-I+S1QWjKKvWqEns4pwH4KfM0jkiXv00Q5DnG0lw7DKETfBy77UpMLUDruayKfeqErbMv/ksxt6hSlpm3Hlx2dw==} engines: {node: '>=12'} peerDependencies: - '@rsbuild/core': '>=1.0.1-rc.5' + '@rsbuild/core': '>=1.0.2' vite: '>=5.0.0' webpack: '>=5.92.0' peerDependenciesMeta: @@ -1758,8 +1841,8 @@ packages: webpack: optional: true - '@tanstack/router-vite-plugin@1.56.4': - resolution: {integrity: sha512-P/BKXDHfiCczMwyuOnKQFcS5Krh0dxLa42+eHoH0iPonsFUAeEStavM72cq4J/eqcls6Jvei6aneKSFlLtDz9g==} + '@tanstack/router-vite-plugin@1.62.0': + resolution: {integrity: sha512-6DzSVAuCiy4y+IVnE7rdo/KEBcBuo7iO0fj7RwiPC5ds48T41yndNhlnxm4TX5ON9JNS/9dcxK5M/C2UwAgiRA==} engines: {node: '>=12'} '@tanstack/store@0.5.5': @@ -1799,8 +1882,8 @@ packages: '@types/react-dom': optional: true - '@tremor/react@3.18.1': - resolution: {integrity: sha512-Tyt6pDsPUyVr6cIDZIVgO2gIdLMG7R8oqhA/i/yBnAAAsljfIAIV6azP/jIVIqbvar6mczm5wwbSX8eOfc0yVQ==} + '@tremor/react@3.18.3': + resolution: {integrity: sha512-7QyGE2W9f2FpwH24TKy3/mqBgLl4sHZeQcXP3rxXZ8W2AUq7AVaG1+vIT3xXxISrkh7zknjWlZsuhoF8NWNVDw==} peerDependencies: react: ^18.0.0 react-dom: '>=16.6.0' @@ -1823,8 +1906,8 @@ packages: '@tsconfig/node18@18.2.4': resolution: {integrity: sha512-5xxU8vVs9/FNcvm3gE07fPbn9tl6tqGGWA9tSlwsUEkBxtRnTsNmwrV8gasZ9F/EobaSv9+nu8AxUKccw77JpQ==} - '@txnlab/use-wallet-react@3.7.0': - resolution: {integrity: sha512-eoRPilP+iaSoSr2IP8TbnRvu5cM4ap+5huyhbKqprt/hplel+bn2puHO94hmzJZdZIvZBEjyYnq/9OGui2gJ4A==} + '@txnlab/use-wallet-react@3.7.2': + resolution: {integrity: sha512-ofVE3XHNkkQ8wAgL1Pf4CcL/2DizlruPx64mjjjmgbvjQ90ldcCNuvxK0k/Tc/BobJcmJqTugM3T9t7JxEIT7w==} peerDependencies: '@blockshake/defly-connect': ^1.1.6 '@magic-ext/algorand': ^23.6.0 @@ -1855,8 +1938,8 @@ packages: magic-sdk: optional: true - '@txnlab/use-wallet@3.7.0': - resolution: {integrity: sha512-fZpGpmp+F4csTE9BYhbObuAdRIocmtWXToU08KWcQrMLkLOyx49a0Gu3Q0DwlMFFiv9kI6sHJ7XquwhCIksMbQ==} + '@txnlab/use-wallet@3.7.2': + resolution: {integrity: sha512-UfvgCeZrJ4sItU/WrcDtdFf+3V9c9Gi7umthlQRHJ3iNCWFZs136GGSCDhy/tb6pUgpRPP2Lz/8bUuzAcx+Cgg==} peerDependencies: '@agoralabs-sh/avm-web-provider': ^1.6.2 '@blockshake/defly-connect': ^1.1.6 @@ -1942,8 +2025,8 @@ packages: '@types/mute-stream@0.0.4': resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} - '@types/node@20.16.5': - resolution: {integrity: sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==} + '@types/node@20.16.10': + resolution: {integrity: sha512-vQUKgWTjEIRFCvK6CyriPH3MZYiYlNy0fKiEYHWbcoWLEgs4opurGGKlebrTLqdSMIbXImH6XExNiIyNUv3WpA==} '@types/node@20.16.7': resolution: {integrity: sha512-QkDQjAY3gkvJNcZOWwzy3BN34RweT0OQ9zJyvLCU0kSK22dO2QYh/NHGfbEAYylPYzRB1/iXcojS79wOg5gFSw==} @@ -1960,8 +2043,8 @@ packages: '@types/react-dom@18.3.0': resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} - '@types/react@18.3.5': - resolution: {integrity: sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==} + '@types/react@18.3.11': + resolution: {integrity: sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==} '@types/statuses@2.0.5': resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==} @@ -2041,17 +2124,17 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@vitejs/plugin-react@4.3.1': - resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==} + '@vitejs/plugin-react@4.3.2': + resolution: {integrity: sha512-hieu+o05v4glEBucTcKMK3dlES0OeJlD9YVOAPraVMOInBCwzumaIFiUjr4bHK7NPgnAHgiskUoceKercrN8vg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 - '@vitest/coverage-v8@2.1.1': - resolution: {integrity: sha512-md/A7A3c42oTT8JUHSqjP5uKTWJejzUW4jalpvs+rZ27gsURsMU8DEb+8Jf8C6Kj2gwfSHJqobDNBuoqlm0cFw==} + '@vitest/coverage-v8@2.1.2': + resolution: {integrity: sha512-b7kHrFrs2urS0cOk5N10lttI8UdJ/yP3nB4JYTREvR5o18cR99yPpK4gK8oQgI42BVv0ILWYUSYB7AXkAUDc0g==} peerDependencies: - '@vitest/browser': 2.1.1 - vitest: 2.1.1 + '@vitest/browser': 2.1.2 + vitest: 2.1.2 peerDependenciesMeta: '@vitest/browser': optional: true @@ -2059,6 +2142,9 @@ packages: '@vitest/expect@2.1.1': resolution: {integrity: sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==} + '@vitest/expect@2.1.2': + resolution: {integrity: sha512-FEgtlN8mIUSEAAnlvn7mP8vzaWhEaAEvhSXCqrsijM7K6QqjB11qoRZYEd4AKSCDz8p0/+yH5LzhZ47qt+EyPg==} + '@vitest/mocker@2.1.1': resolution: {integrity: sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==} peerDependencies: @@ -2071,21 +2157,48 @@ packages: vite: optional: true + '@vitest/mocker@2.1.2': + resolution: {integrity: sha512-ExElkCGMS13JAJy+812fw1aCv2QO/LBK6CyO4WOPAzLTmve50gydOlWhgdBJPx2ztbADUq3JVI0C5U+bShaeEA==} + peerDependencies: + '@vitest/spy': 2.1.2 + msw: ^2.3.5 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + '@vitest/pretty-format@2.1.1': resolution: {integrity: sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==} + '@vitest/pretty-format@2.1.2': + resolution: {integrity: sha512-FIoglbHrSUlOJPDGIrh2bjX1sNars5HbxlcsFKCtKzu4+5lpsRhOCVcuzp0fEhAGHkPZRIXVNzPcpSlkoZ3LuA==} + '@vitest/runner@2.1.1': resolution: {integrity: sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==} + '@vitest/runner@2.1.2': + resolution: {integrity: sha512-UCsPtvluHO3u7jdoONGjOSil+uON5SSvU9buQh3lP7GgUXHp78guN1wRmZDX4wGK6J10f9NUtP6pO+SFquoMlw==} + '@vitest/snapshot@2.1.1': resolution: {integrity: sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==} + '@vitest/snapshot@2.1.2': + resolution: {integrity: sha512-xtAeNsZ++aRIYIUsek7VHzry/9AcxeULlegBvsdLncLmNCR6tR8SRjn8BbDP4naxtccvzTqZ+L1ltZlRCfBZFA==} + '@vitest/spy@2.1.1': resolution: {integrity: sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==} + '@vitest/spy@2.1.2': + resolution: {integrity: sha512-GSUi5zoy+abNRJwmFhBDC0yRuVUn8WMlQscvnbbXdKLXX9dE59YbfwXxuJ/mth6eeqIzofU8BB5XDo/Ns/qK2A==} + '@vitest/utils@2.1.1': resolution: {integrity: sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==} + '@vitest/utils@2.1.2': + resolution: {integrity: sha512-zMO2KdYy6mx56btx9JvAqAZ6EyS3g49krMPPrgOp1yxGZiA93HumGk+bZ5jIZtOg5/VBYl5eBmGRQHqq4FG6uQ==} + '@walletconnect/browser-utils@1.8.0': resolution: {integrity: sha512-Wcqqx+wjxIo9fv6eBUFHPsW1y/bGWWRboni5dfD8PtOmrihrEpOCmvRJe4rfl7xgJW8Ea9UqKEaq0bIRLHlK4A==} @@ -2143,17 +2256,17 @@ packages: '@walletconnect/logger@2.1.2': resolution: {integrity: sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==} - '@walletconnect/modal-core@2.6.2': - resolution: {integrity: sha512-cv8ibvdOJQv2B+nyxP9IIFdxvQznMz8OOr/oR/AaUZym4hjXNL/l1a2UlSQBXrVjo3xxbouMxLb3kBsHoYP2CA==} + '@walletconnect/modal-core@2.7.0': + resolution: {integrity: sha512-oyMIfdlNdpyKF2kTJowTixZSo0PGlCJRdssUN/EZdA6H6v03hZnf09JnwpljZNfir2M65Dvjm/15nGrDQnlxSA==} - '@walletconnect/modal-sign-html@2.6.2': - resolution: {integrity: sha512-p9VhWTikRfUIdUUrOsHj0vRFx0FmI6qraE6kVqxOeLwO9OoLQ6xpIRYpYwPrmASMaXRKFbLul1R3F1MKpBPvcA==} + '@walletconnect/modal-sign-html@2.7.0': + resolution: {integrity: sha512-KPQxffA49rvG1s9/fE4u6pZZODZq8iDFd/oXcpeaXppIXPN3ZowJHMiLMl5Y26duRsHG8ce9z+AtfVIItjFWgg==} - '@walletconnect/modal-ui@2.6.2': - resolution: {integrity: sha512-rbdstM1HPGvr7jprQkyPggX7rP4XiCG85ZA+zWBEX0dVQg8PpAgRUqpeub4xQKDgY7pY/xLRXSiCVdWGqvG2HA==} + '@walletconnect/modal-ui@2.7.0': + resolution: {integrity: sha512-gERYvU7D7K1ANCN/8vUgsE0d2hnRemfAFZ2novm9aZBg7TEd/4EgB+AqbJ+1dc7GhOL6dazckVq78TgccHb7mQ==} - '@walletconnect/modal@2.6.2': - resolution: {integrity: sha512-eFopgKi8AjKf/0U4SemvcYw9zlLpx9njVN8sf6DAkowC2Md0gPU/UNEbH1Wwj407pEKnEds98pKWib1NN1ACoA==} + '@walletconnect/modal@2.7.0': + resolution: {integrity: sha512-RQVt58oJ+rwqnPcIvRFeMGKuXb9qkgSmwz4noF8JZGUym3gUAzVs+uW2NQ1Owm9XOJAV+sANrtJ+VoVq1ftElw==} '@walletconnect/randombytes@1.0.3': resolution: {integrity: sha512-35lpzxcHFbTN3ABefC9W+uBpNZl1GC4Wpx0ed30gibfO/y9oLdy1NznbV96HARQKSBV9J9M/rrtIvf6a23jfYw==} @@ -2346,14 +2459,14 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - axios-cache-interceptor@1.5.3: - resolution: {integrity: sha512-kPgGId9XW7tR+VF7hgSkqF4f6FrV4ecCyKxjkD9v1hNJ4sXSAskocr7SMKaVHVvrbzVeruwB6yL6Y9/lY1ApKg==} + axios-cache-interceptor@1.6.0: + resolution: {integrity: sha512-xuo4mZckPQmNV50bJpsMmGfpFV8SXsUWWUVKf1DXQy7t9p+6Pan9zrD3icAlCIdoYFw/ZJFKV6nUVqy8j0XCLQ==} engines: {node: '>=12'} peerDependencies: axios: ^1 - axios@1.7.4: - resolution: {integrity: sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==} + axios@1.7.7: + resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} babel-dead-code-elimination@1.0.6: resolution: {integrity: sha512-JxFi9qyRJpN0LjEbbjbN8g0ux71Qppn9R8Qe3k6QzHg2CaKsbUQtbn307LQGiDLGjV6JCtEFqfxzVig9MyDCHQ==} @@ -2364,8 +2477,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - big.js@6.2.1: - resolution: {integrity: sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==} + big.js@6.2.2: + resolution: {integrity: sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==} bignumber.js@9.1.2: resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} @@ -2426,6 +2539,11 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.24.0: + resolution: {integrity: sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + buffer-xor@1.0.3: resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} @@ -2467,6 +2585,9 @@ packages: caniuse-lite@1.0.30001660: resolution: {integrity: sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==} + caniuse-lite@1.0.30001667: + resolution: {integrity: sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==} + capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} @@ -2852,6 +2973,9 @@ packages: electron-to-chromium@1.5.20: resolution: {integrity: sha512-74mdl6Fs1HHzK9SUX4CKFxAtAe3nUns48y79TskHNAG6fGOlLfyKA4j855x+0b5u8rWJIrlaG9tcTPstMlwjIw==} + electron-to-chromium@1.5.33: + resolution: {integrity: sha512-+cYTcFB1QqD4j4LegwLfpCNxifb6dDFUAwk6RsLusCwIaZI6or2f+q8rs5tTB2YC53HhOlIbEaqHMAAC8IOIwA==} + elliptic@6.5.7: resolution: {integrity: sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==} @@ -3547,6 +3671,11 @@ packages: engines: {node: '>=4'} hasBin: true + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + json-bigint@1.0.0: resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} @@ -3645,8 +3774,8 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lucide-react@0.439.0: - resolution: {integrity: sha512-PafSWvDTpxdtNEndS2HIHxcNAbd54OaqSYJO90/b63rab2HWYqDbH194j0i82ZFdWOAcf0AHinRykXRRK2PJbw==} + lucide-react@0.447.0: + resolution: {integrity: sha512-SZ//hQmvi+kDKrNepArVkYK7/jfeZ5uFNEnYmd45RKZcbGD78KLnrcNXmgeg6m+xNHFvTG+CblszXCy4n6DN4w==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc @@ -3751,8 +3880,8 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - msw@2.4.4: - resolution: {integrity: sha512-iuM0qGs4YmgYCLH+xqb07w2e/e4fYmsx3+WHVlIOUA34TW1sw+wRpNmOlXnLDkw/T7233Jnm6t+aNf4v2E3e2Q==} + msw@2.4.9: + resolution: {integrity: sha512-1m8xccT6ipN4PTqLinPwmzhxQREuxaEJYdx4nIbggxP8aM7r1e71vE7RtOUSQoAm1LydjGfZKy7370XD/tsuYg==} engines: {node: '>=18'} hasBin: true peerDependencies: @@ -4033,13 +4162,13 @@ packages: pkg-types@1.2.0: resolution: {integrity: sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==} - playwright-core@1.47.0: - resolution: {integrity: sha512-1DyHT8OqkcfCkYUD9zzUTfg7EfTd+6a8MkD/NWOvjo0u/SCNd5YmY/lJwFvUZOxJbWNds+ei7ic2+R/cRz/PDg==} + playwright-core@1.47.2: + resolution: {integrity: sha512-3JvMfF+9LJfe16l7AbSmU555PaTl2tPyQsVInqm3id16pdDfvZ8TTZ/pyzmkbDrZTQefyzU7AIHlZqQnxpqHVQ==} engines: {node: '>=18'} hasBin: true - playwright@1.47.0: - resolution: {integrity: sha512-jOWiRq2pdNAX/mwLiwFYnPHpEZ4rM+fRSQpRHwEwZlP2PUANvL3+aJOF/bvISMhFD30rqMxUB4RJx9aQbfh4Ww==} + playwright@1.47.2: + resolution: {integrity: sha512-nx1cLMmQWqmA3UsnjaaokyoUpdVaaDhJhMoxX2qj3McpjnsqFHs516QAKYhqHAgOP+oCFTEOCOAaD1RgD/RQfA==} engines: {node: '>=18'} hasBin: true @@ -4092,8 +4221,8 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.4.45: - resolution: {integrity: sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==} + postcss@8.4.47: + resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -4243,8 +4372,8 @@ packages: '@types/react': optional: true - react-remove-scroll@2.5.7: - resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==} + react-remove-scroll@2.6.0: + resolution: {integrity: sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==} engines: {node: '>=10'} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -4589,19 +4718,16 @@ packages: tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - tailwind-merge@1.14.0: - resolution: {integrity: sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==} - - tailwind-merge@2.5.2: - resolution: {integrity: sha512-kjEBm+pvD+6eAwzJL2Bi+02/9LFLal1Gs61+QB7HvTfQQ0aXwC5LGT8PEt1gS0CWKktKe6ysPTAy3cBC5MeiIg==} + tailwind-merge@2.5.3: + resolution: {integrity: sha512-d9ZolCAIzom1nf/5p4LdD5zvjmgSxY0BGgdSvmXIoMYAiPdAW/dSpP7joCDYFY7r/HkEa2qmPtkgsu0xjQeQtw==} tailwindcss-animate@1.0.7: resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} peerDependencies: tailwindcss: '>=3.0.0 || insiders' - tailwindcss@3.4.10: - resolution: {integrity: sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w==} + tailwindcss@3.4.13: + resolution: {integrity: sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw==} engines: {node: '>=14.0.0'} hasBin: true @@ -4707,8 +4833,8 @@ packages: tslib@2.7.0: resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} - tsx@4.19.0: - resolution: {integrity: sha512-bV30kM7bsLZKZIOCHeMNVMJ32/LuJzLVajkQI/qf92J2Qr08ueLQvW00PUZGiuLPP760UINwupgUj8qrSCPUKg==} + tsx@4.19.1: + resolution: {integrity: sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==} engines: {node: '>=18.0.0'} hasBin: true @@ -4937,13 +5063,18 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true + vite-node@2.1.2: + resolution: {integrity: sha512-HPcGNN5g/7I2OtPjLqgOtCRu/qhVvBxTUD3qzitmL0SrG1cWFzxzhMDWussxSbrRYWqnKf8P2jiNhPMSN+ymsQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + vite-plugin-node-polyfills@0.22.0: resolution: {integrity: sha512-F+G3LjiGbG8QpbH9bZ//GSBr9i1InSTkaulfUHFa9jkLqVGORFBoqc2A/Yu5Mmh1kNAbiAeKeK+6aaQUf3x0JA==} peerDependencies: vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 - vite@5.4.6: - resolution: {integrity: sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q==} + vite@5.4.8: + resolution: {integrity: sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -4998,6 +5129,31 @@ packages: jsdom: optional: true + vitest@2.1.2: + resolution: {integrity: sha512-veNjLizOMkRrJ6xxb+pvxN6/QAWg95mzcRjtmkepXdN87FNfxAss9RKe2far/G9cQpipfgP2taqg0KiWsquj8A==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.1.2 + '@vitest/ui': 2.1.2 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vlq@2.0.4: resolution: {integrity: sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA==} @@ -5191,7 +5347,7 @@ snapshots: '@algorandfoundation/tealscript@0.103.0': dependencies: '@microsoft/tsdoc': 0.14.2 - '@playwright/test': 1.47.0 + '@playwright/test': 1.47.2 argparse: 2.0.1 dotenv: 16.4.5 glob: 10.4.5 @@ -5217,8 +5373,15 @@ snapshots: '@babel/highlight': 7.24.7 picocolors: 1.1.0 + '@babel/code-frame@7.25.7': + dependencies: + '@babel/highlight': 7.25.7 + picocolors: 1.1.0 + '@babel/compat-data@7.25.4': {} + '@babel/compat-data@7.25.7': {} + '@babel/core@7.25.2': dependencies: '@ampproject/remapping': 2.3.0 @@ -5239,6 +5402,26 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/core@7.25.7': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.25.7 + '@babel/generator': 7.25.7 + '@babel/helper-compilation-targets': 7.25.7 + '@babel/helper-module-transforms': 7.25.7(@babel/core@7.25.7) + '@babel/helpers': 7.25.7 + '@babel/parser': 7.25.7 + '@babel/template': 7.25.7 + '@babel/traverse': 7.25.7 + '@babel/types': 7.25.7 + convert-source-map: 2.0.0 + debug: 4.3.7 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/generator@7.25.6': dependencies: '@babel/types': 7.25.6 @@ -5246,6 +5429,13 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 + '@babel/generator@7.25.7': + dependencies: + '@babel/types': 7.25.7 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.0.2 + '@babel/helper-compilation-targets@7.25.2': dependencies: '@babel/compat-data': 7.25.4 @@ -5254,6 +5444,14 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-compilation-targets@7.25.7': + dependencies: + '@babel/compat-data': 7.25.7 + '@babel/helper-validator-option': 7.25.7 + browserslist: 4.24.0 + lru-cache: 5.1.1 + semver: 6.3.1 + '@babel/helper-module-imports@7.24.7': dependencies: '@babel/traverse': 7.25.6 @@ -5261,6 +5459,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-imports@7.25.7': + dependencies: + '@babel/traverse': 7.25.7 + '@babel/types': 7.25.7 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -5271,8 +5476,20 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.25.7(@babel/core@7.25.7)': + dependencies: + '@babel/core': 7.25.7 + '@babel/helper-module-imports': 7.25.7 + '@babel/helper-simple-access': 7.25.7 + '@babel/helper-validator-identifier': 7.25.7 + '@babel/traverse': 7.25.7 + transitivePeerDependencies: + - supports-color + '@babel/helper-plugin-utils@7.24.8': {} + '@babel/helper-plugin-utils@7.25.7': {} + '@babel/helper-simple-access@7.24.7': dependencies: '@babel/traverse': 7.25.6 @@ -5280,17 +5497,35 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-simple-access@7.25.7': + dependencies: + '@babel/traverse': 7.25.7 + '@babel/types': 7.25.7 + transitivePeerDependencies: + - supports-color + '@babel/helper-string-parser@7.24.8': {} + '@babel/helper-string-parser@7.25.7': {} + '@babel/helper-validator-identifier@7.24.7': {} + '@babel/helper-validator-identifier@7.25.7': {} + '@babel/helper-validator-option@7.24.8': {} + '@babel/helper-validator-option@7.25.7': {} + '@babel/helpers@7.25.6': dependencies: '@babel/template': 7.25.0 '@babel/types': 7.25.6 + '@babel/helpers@7.25.7': + dependencies: + '@babel/template': 7.25.7 + '@babel/types': 7.25.7 + '@babel/highlight@7.24.7': dependencies: '@babel/helper-validator-identifier': 7.24.7 @@ -5298,19 +5533,30 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.0 + '@babel/highlight@7.25.7': + dependencies: + '@babel/helper-validator-identifier': 7.25.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.1.0 + '@babel/parser@7.25.6': dependencies: '@babel/types': 7.25.6 - '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)': + '@babel/parser@7.25.7': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/types': 7.25.7 - '@babel/plugin-syntax-typescript@7.25.4(@babel/core@7.25.2)': + '@babel/plugin-syntax-jsx@7.25.7(@babel/core@7.25.7)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.7 + '@babel/helper-plugin-utils': 7.25.7 + + '@babel/plugin-syntax-typescript@7.25.7(@babel/core@7.25.7)': + dependencies: + '@babel/core': 7.25.7 + '@babel/helper-plugin-utils': 7.25.7 '@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.25.2)': dependencies: @@ -5332,6 +5578,12 @@ snapshots: '@babel/parser': 7.25.6 '@babel/types': 7.25.6 + '@babel/template@7.25.7': + dependencies: + '@babel/code-frame': 7.25.7 + '@babel/parser': 7.25.7 + '@babel/types': 7.25.7 + '@babel/traverse@7.25.6': dependencies: '@babel/code-frame': 7.24.7 @@ -5344,12 +5596,30 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.25.7': + dependencies: + '@babel/code-frame': 7.25.7 + '@babel/generator': 7.25.7 + '@babel/parser': 7.25.7 + '@babel/template': 7.25.7 + '@babel/types': 7.25.7 + debug: 4.3.7 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + '@babel/types@7.25.6': dependencies: '@babel/helper-string-parser': 7.24.8 '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 + '@babel/types@7.25.7': + dependencies: + '@babel/helper-string-parser': 7.25.7 + '@babel/helper-validator-identifier': 7.25.7 + to-fast-properties: 2.0.0 + '@bcoe/v8-coverage@0.2.3': {} '@blockshake/defly-connect@1.1.6(algosdk@2.9.0)': @@ -5586,9 +5856,9 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@headlessui/tailwindcss@0.2.1(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4)))': + '@headlessui/tailwindcss@0.2.1(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)))': dependencies: - tailwindcss: 3.4.10(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4)) + tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)) '@hookform/resolvers@3.9.0(react-hook-form@7.53.0(react@18.3.1))': dependencies: @@ -5725,7 +5995,7 @@ snapshots: '@motionone/dom': 10.18.0 tslib: 2.7.0 - '@mswjs/interceptors@0.35.1': + '@mswjs/interceptors@0.35.9': dependencies: '@open-draft/deferred-promise': 2.2.0 '@open-draft/logger': 0.3.0 @@ -5834,486 +6104,492 @@ snapshots: '@pkgr/core@0.1.1': {} - '@playwright/test@1.47.0': + '@playwright/test@1.47.2': dependencies: - playwright: 1.47.0 + playwright: 1.47.2 '@radix-ui/number@1.1.0': {} '@radix-ui/primitive@1.1.0': {} - '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 '@types/react-dom': 18.3.0 - '@radix-ui/react-avatar@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-avatar@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 '@types/react-dom': 18.3.0 - '@radix-ui/react-checkbox@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-checkbox@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 '@types/react-dom': 18.3.0 - '@radix-ui/react-collapsible@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-collapsible@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 '@types/react-dom': 18.3.0 - '@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 '@types/react-dom': 18.3.0 - '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.5)(react@18.3.1)': + '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.11)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.11 + + '@radix-ui/react-context@1.1.0(@types/react@18.3.11)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 - '@radix-ui/react-context@1.1.0(@types/react@18.3.5)(react@18.3.1)': + '@radix-ui/react-context@1.1.1(@types/react@18.3.11)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 - '@radix-ui/react-dialog@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dialog@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.7(@types/react@18.3.5)(react@18.3.1) + react-remove-scroll: 2.6.0(@types/react@18.3.11)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 '@types/react-dom': 18.3.0 - '@radix-ui/react-direction@1.1.0(@types/react@18.3.5)(react@18.3.1)': + '@radix-ui/react-direction@1.1.0(@types/react@18.3.11)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 - '@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dismissable-layer@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 '@types/react-dom': 18.3.0 - '@radix-ui/react-dropdown-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dropdown-menu@2.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-menu': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-menu': 2.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 '@types/react-dom': 18.3.0 - '@radix-ui/react-focus-guards@1.1.0(@types/react@18.3.5)(react@18.3.1)': + '@radix-ui/react-focus-guards@1.1.1(@types/react@18.3.11)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 - '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 '@types/react-dom': 18.3.0 - '@radix-ui/react-hover-card@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-hover-card@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 '@types/react-dom': 18.3.0 '@radix-ui/react-icons@1.3.0(react@18.3.1)': dependencies: react: 18.3.1 - '@radix-ui/react-id@1.1.0(@types/react@18.3.5)(react@18.3.1)': + '@radix-ui/react-id@1.1.0(@types/react@18.3.11)(react@18.3.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 - '@radix-ui/react-label@2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-label@2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 '@types/react-dom': 18.3.0 - '@radix-ui/react-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-menu@2.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.7(@types/react@18.3.5)(react@18.3.1) + react-remove-scroll: 2.6.0(@types/react@18.3.11)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 '@types/react-dom': 18.3.0 - '@radix-ui/react-navigation-menu@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-navigation-menu@1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 '@types/react-dom': 18.3.0 - '@radix-ui/react-popover@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-popover@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.7(@types/react@18.3.5)(react@18.3.1) + react-remove-scroll: 2.6.0(@types/react@18.3.11)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 '@types/react-dom': 18.3.0 - '@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@floating-ui/react-dom': 2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/rect': 1.1.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 '@types/react-dom': 18.3.0 - '@radix-ui/react-portal@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-portal@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 '@types/react-dom': 18.3.0 - '@radix-ui/react-presence@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-presence@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 '@types/react-dom': 18.3.0 - '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 '@types/react-dom': 18.3.0 - '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 '@types/react-dom': 18.3.0 - '@radix-ui/react-scroll-area@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-scroll-area@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/number': 1.1.0 '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 '@types/react-dom': 18.3.0 - '@radix-ui/react-select@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-select@2.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/number': 1.1.0 '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.7(@types/react@18.3.5)(react@18.3.1) + react-remove-scroll: 2.6.0(@types/react@18.3.11)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 '@types/react-dom': 18.3.0 - '@radix-ui/react-separator@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-separator@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 '@types/react-dom': 18.3.0 - '@radix-ui/react-slot@1.1.0(@types/react@18.3.5)(react@18.3.1)': + '@radix-ui/react-slot@1.1.0(@types/react@18.3.11)(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 - '@radix-ui/react-switch@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-switch@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 '@types/react-dom': 18.3.0 - '@radix-ui/react-tooltip@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-tooltip@1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 '@types/react-dom': 18.3.0 - '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.5)(react@18.3.1)': + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.11)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 - '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.5)(react@18.3.1)': + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.11)(react@18.3.1)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 - '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.5)(react@18.3.1)': + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.11)(react@18.3.1)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 - '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.5)(react@18.3.1)': + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.11)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 - '@radix-ui/react-use-previous@1.1.0(@types/react@18.3.5)(react@18.3.1)': + '@radix-ui/react-use-previous@1.1.0(@types/react@18.3.11)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 - '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.5)(react@18.3.1)': + '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.11)(react@18.3.1)': dependencies: '@radix-ui/rect': 1.1.0 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 - '@radix-ui/react-use-size@1.1.0(@types/react@18.3.5)(react@18.3.1)': + '@radix-ui/react-use-size@1.1.0(@types/react@18.3.11)(react@18.3.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 - '@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 '@types/react-dom': 18.3.0 '@radix-ui/rect@1.1.0': {} @@ -6464,32 +6740,33 @@ snapshots: '@stablelib/random': 1.0.2 '@stablelib/wipe': 1.0.1 - '@tanstack/history@1.51.7': {} + '@tanstack/history@1.61.1': {} - '@tanstack/query-core@5.55.3': {} + '@tanstack/query-core@5.59.0': {} - '@tanstack/query-devtools@5.55.1': {} + '@tanstack/query-devtools@5.58.0': {} - '@tanstack/react-query-devtools@5.55.2(@tanstack/react-query@5.55.3(react@18.3.1))(react@18.3.1)': + '@tanstack/react-query-devtools@5.59.0(@tanstack/react-query@5.59.0(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/query-devtools': 5.55.1 - '@tanstack/react-query': 5.55.3(react@18.3.1) + '@tanstack/query-devtools': 5.58.0 + '@tanstack/react-query': 5.59.0(react@18.3.1) react: 18.3.1 - '@tanstack/react-query@5.55.3(react@18.3.1)': + '@tanstack/react-query@5.59.0(react@18.3.1)': dependencies: - '@tanstack/query-core': 5.55.3 + '@tanstack/query-core': 5.59.0 react: 18.3.1 - '@tanstack/react-router@1.56.5(@tanstack/router-generator@1.57.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-router@1.62.0(@tanstack/router-generator@1.58.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/history': 1.51.7 + '@tanstack/history': 1.61.1 '@tanstack/react-store': 0.5.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tanstack/router-generator': 1.57.9 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 + optionalDependencies: + '@tanstack/router-generator': 1.58.12 '@tanstack/react-store@0.5.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -6510,9 +6787,9 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@tanstack/router-devtools@1.56.5(@tanstack/react-router@1.56.5(@tanstack/router-generator@1.57.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/router-devtools@1.62.0(@tanstack/react-router@1.62.0(@tanstack/router-generator@1.58.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/react-router': 1.56.5(@tanstack/router-generator@1.57.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-router': 1.62.0(@tanstack/router-generator@1.58.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) clsx: 2.1.1 goober: 2.1.14(csstype@3.1.3) react: 18.3.1 @@ -6520,24 +6797,24 @@ snapshots: transitivePeerDependencies: - csstype - '@tanstack/router-generator@1.57.9': + '@tanstack/router-generator@1.58.12': dependencies: '@tanstack/virtual-file-routes': 1.56.0 prettier: 3.3.3 - tsx: 4.19.0 + tsx: 4.19.1 zod: 3.23.8 - '@tanstack/router-plugin@1.57.9(vite@5.4.6(@types/node@20.16.5))': - dependencies: - '@babel/core': 7.25.2 - '@babel/generator': 7.25.6 - '@babel/parser': 7.25.6 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-syntax-typescript': 7.25.4(@babel/core@7.25.2) - '@babel/template': 7.25.0 - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 - '@tanstack/router-generator': 1.57.9 + '@tanstack/router-plugin@1.62.0(vite@5.4.8(@types/node@20.16.10))': + dependencies: + '@babel/core': 7.25.7 + '@babel/generator': 7.25.7 + '@babel/parser': 7.25.7 + '@babel/plugin-syntax-jsx': 7.25.7(@babel/core@7.25.7) + '@babel/plugin-syntax-typescript': 7.25.7(@babel/core@7.25.7) + '@babel/template': 7.25.7 + '@babel/traverse': 7.25.7 + '@babel/types': 7.25.7 + '@tanstack/router-generator': 1.58.12 '@tanstack/virtual-file-routes': 1.56.0 '@types/babel__core': 7.20.5 '@types/babel__generator': 7.6.8 @@ -6548,14 +6825,14 @@ snapshots: unplugin: 1.14.1 zod: 3.23.8 optionalDependencies: - vite: 5.4.6(@types/node@20.16.5) + vite: 5.4.8(@types/node@20.16.10) transitivePeerDependencies: - supports-color - webpack-sources - '@tanstack/router-vite-plugin@1.56.4(vite@5.4.6(@types/node@20.16.5))': + '@tanstack/router-vite-plugin@1.62.0(vite@5.4.8(@types/node@20.16.10))': dependencies: - '@tanstack/router-plugin': 1.57.9(vite@5.4.6(@types/node@20.16.5)) + '@tanstack/router-plugin': 1.62.0(vite@5.4.8(@types/node@20.16.10)) transitivePeerDependencies: - '@rsbuild/core' - supports-color @@ -6592,28 +6869,28 @@ snapshots: lodash: 4.17.21 redent: 3.0.0 - '@testing-library/react@16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@testing-library/react@16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.6 '@testing-library/dom': 10.4.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 '@types/react-dom': 18.3.0 - '@tremor/react@3.18.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4)))': + '@tremor/react@3.18.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)))': dependencies: '@floating-ui/react': 0.19.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@headlessui/tailwindcss': 0.2.1(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4))) + '@headlessui/tailwindcss': 0.2.1(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))) date-fns: 3.6.0 react: 18.3.1 react-day-picker: 8.10.1(date-fns@3.6.0)(react@18.3.1) react-dom: 18.3.1(react@18.3.1) react-transition-state: 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) recharts: 2.12.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - tailwind-merge: 1.14.0 + tailwind-merge: 2.5.3 transitivePeerDependencies: - tailwindcss @@ -6634,29 +6911,29 @@ snapshots: '@tsconfig/node18@18.2.4': {} - '@txnlab/use-wallet-react@3.7.0(@blockshake/defly-connect@1.1.6(algosdk@2.9.0))(@perawallet/connect@1.3.4(algosdk@2.9.0))(@walletconnect/modal@2.6.2(@types/react@18.3.5)(react@18.3.1))(algosdk@2.9.0)(lute-connect@1.4.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@txnlab/use-wallet-react@3.7.2(@blockshake/defly-connect@1.1.6(algosdk@2.9.0))(@perawallet/connect@1.3.4(algosdk@2.9.0))(@walletconnect/modal@2.7.0(@types/react@18.3.11)(react@18.3.1))(algosdk@2.9.0)(lute-connect@1.4.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/react-store': 0.5.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@txnlab/use-wallet': 3.7.0(@blockshake/defly-connect@1.1.6(algosdk@2.9.0))(@perawallet/connect@1.3.4(algosdk@2.9.0))(@walletconnect/modal@2.6.2(@types/react@18.3.5)(react@18.3.1))(algosdk@2.9.0)(lute-connect@1.4.1) + '@txnlab/use-wallet': 3.7.2(@blockshake/defly-connect@1.1.6(algosdk@2.9.0))(@perawallet/connect@1.3.4(algosdk@2.9.0))(@walletconnect/modal@2.7.0(@types/react@18.3.11)(react@18.3.1))(algosdk@2.9.0)(lute-connect@1.4.1) algosdk: 2.9.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@blockshake/defly-connect': 1.1.6(algosdk@2.9.0) '@perawallet/connect': 1.3.4(algosdk@2.9.0) - '@walletconnect/modal': 2.6.2(@types/react@18.3.5)(react@18.3.1) + '@walletconnect/modal': 2.7.0(@types/react@18.3.11)(react@18.3.1) lute-connect: 1.4.1 transitivePeerDependencies: - '@agoralabs-sh/avm-web-provider' - '@txnlab/use-wallet@3.7.0(@blockshake/defly-connect@1.1.6(algosdk@2.9.0))(@perawallet/connect@1.3.4(algosdk@2.9.0))(@walletconnect/modal@2.6.2(@types/react@18.3.5)(react@18.3.1))(algosdk@2.9.0)(lute-connect@1.4.1)': + '@txnlab/use-wallet@3.7.2(@blockshake/defly-connect@1.1.6(algosdk@2.9.0))(@perawallet/connect@1.3.4(algosdk@2.9.0))(@walletconnect/modal@2.7.0(@types/react@18.3.11)(react@18.3.1))(algosdk@2.9.0)(lute-connect@1.4.1)': dependencies: '@tanstack/store': 0.5.5 algosdk: 2.9.0 optionalDependencies: '@blockshake/defly-connect': 1.1.6(algosdk@2.9.0) '@perawallet/connect': 1.3.4(algosdk@2.9.0) - '@walletconnect/modal': 2.6.2(@types/react@18.3.5)(react@18.3.1) + '@walletconnect/modal': 2.7.0(@types/react@18.3.11)(react@18.3.1) lute-connect: 1.4.1 '@types/aria-query@5.0.4': {} @@ -6718,9 +6995,9 @@ snapshots: '@types/mute-stream@0.0.4': dependencies: - '@types/node': 22.7.4 + '@types/node': 20.16.10 - '@types/node@20.16.5': + '@types/node@20.16.10': dependencies: undici-types: 6.19.8 @@ -6734,16 +7011,16 @@ snapshots: '@types/prompts@2.4.9': dependencies: - '@types/node': 20.16.7 + '@types/node': 20.16.10 kleur: 3.0.3 '@types/prop-types@15.7.12': {} '@types/react-dom@18.3.0': dependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 - '@types/react@18.3.5': + '@types/react@18.3.11': dependencies: '@types/prop-types': 15.7.12 csstype: 3.1.3 @@ -6780,6 +7057,24 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/eslint-plugin@8.7.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2)': + dependencies: + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 8.7.0(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/scope-manager': 8.7.0 + '@typescript-eslint/type-utils': 8.7.0(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/utils': 8.7.0(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/visitor-keys': 8.7.0 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.3.0(typescript@5.6.2) + optionalDependencies: + typescript: 5.6.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.5.4)': dependencies: '@typescript-eslint/scope-manager': 8.7.0 @@ -6793,6 +7088,19 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.6.2)': + dependencies: + '@typescript-eslint/scope-manager': 8.7.0 + '@typescript-eslint/types': 8.7.0 + '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.2) + '@typescript-eslint/visitor-keys': 8.7.0 + debug: 4.3.7 + eslint: 8.57.1 + optionalDependencies: + typescript: 5.6.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/scope-manager@8.7.0': dependencies: '@typescript-eslint/types': 8.7.0 @@ -6810,6 +7118,18 @@ snapshots: - eslint - supports-color + '@typescript-eslint/type-utils@8.7.0(eslint@8.57.1)(typescript@5.6.2)': + dependencies: + '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.2) + '@typescript-eslint/utils': 8.7.0(eslint@8.57.1)(typescript@5.6.2) + debug: 4.3.7 + ts-api-utils: 1.3.0(typescript@5.6.2) + optionalDependencies: + typescript: 5.6.2 + transitivePeerDependencies: + - eslint + - supports-color + '@typescript-eslint/types@8.7.0': {} '@typescript-eslint/typescript-estree@8.7.0(typescript@5.5.4)': @@ -6827,6 +7147,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@8.7.0(typescript@5.6.2)': + dependencies: + '@typescript-eslint/types': 8.7.0 + '@typescript-eslint/visitor-keys': 8.7.0 + debug: 4.3.7 + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.6.2) + optionalDependencies: + typescript: 5.6.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/utils@8.7.0(eslint@8.57.1)(typescript@5.5.4)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) @@ -6838,6 +7173,17 @@ snapshots: - supports-color - typescript + '@typescript-eslint/utils@8.7.0(eslint@8.57.1)(typescript@5.6.2)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) + '@typescript-eslint/scope-manager': 8.7.0 + '@typescript-eslint/types': 8.7.0 + '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.2) + eslint: 8.57.1 + transitivePeerDependencies: + - supports-color + - typescript + '@typescript-eslint/visitor-keys@8.7.0': dependencies: '@typescript-eslint/types': 8.7.0 @@ -6845,18 +7191,18 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-react@4.3.1(vite@5.4.6(@types/node@20.16.5))': + '@vitejs/plugin-react@4.3.2(vite@5.4.8(@types/node@20.16.10))': dependencies: '@babel/core': 7.25.2 '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.25.2) '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.25.2) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.4.6(@types/node@20.16.5) + vite: 5.4.8(@types/node@20.16.10) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@2.1.1(vitest@2.1.1(@types/node@20.16.5)(jsdom@24.1.3)(msw@2.4.4(typescript@5.5.4)))': + '@vitest/coverage-v8@2.1.2(vitest@2.1.2(@types/node@20.16.10)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2)))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -6870,7 +7216,7 @@ snapshots: std-env: 3.7.0 test-exclude: 7.0.1 tinyrainbow: 1.2.0 - vitest: 2.1.1(@types/node@20.16.5)(jsdom@24.1.3)(msw@2.4.4(typescript@5.5.4)) + vitest: 2.1.2(@types/node@20.16.10)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2)) transitivePeerDependencies: - supports-color @@ -6881,49 +7227,81 @@ snapshots: chai: 5.1.1 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(msw@2.4.4(typescript@5.5.4))(vite@5.4.6(@types/node@20.16.5))': + '@vitest/expect@2.1.2': + dependencies: + '@vitest/spy': 2.1.2 + '@vitest/utils': 2.1.2 + chai: 5.1.1 + tinyrainbow: 1.2.0 + + '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(msw@2.4.9(typescript@5.5.4))(vite@5.4.8(@types/node@22.7.4))': dependencies: '@vitest/spy': 2.1.1 estree-walker: 3.0.3 magic-string: 0.30.11 optionalDependencies: - msw: 2.4.4(typescript@5.5.4) - vite: 5.4.6(@types/node@20.16.5) + msw: 2.4.9(typescript@5.5.4) + vite: 5.4.8(@types/node@22.7.4) - '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(msw@2.4.4(typescript@5.5.4))(vite@5.4.6(@types/node@22.7.4))': + '@vitest/mocker@2.1.2(@vitest/spy@2.1.2)(msw@2.4.9(typescript@5.6.2))(vite@5.4.8(@types/node@20.16.10))': dependencies: - '@vitest/spy': 2.1.1 + '@vitest/spy': 2.1.2 estree-walker: 3.0.3 magic-string: 0.30.11 optionalDependencies: - msw: 2.4.4(typescript@5.5.4) - vite: 5.4.6(@types/node@22.7.4) + msw: 2.4.9(typescript@5.6.2) + vite: 5.4.8(@types/node@20.16.10) '@vitest/pretty-format@2.1.1': dependencies: tinyrainbow: 1.2.0 + '@vitest/pretty-format@2.1.2': + dependencies: + tinyrainbow: 1.2.0 + '@vitest/runner@2.1.1': dependencies: '@vitest/utils': 2.1.1 pathe: 1.1.2 + '@vitest/runner@2.1.2': + dependencies: + '@vitest/utils': 2.1.2 + pathe: 1.1.2 + '@vitest/snapshot@2.1.1': dependencies: '@vitest/pretty-format': 2.1.1 magic-string: 0.30.11 pathe: 1.1.2 + '@vitest/snapshot@2.1.2': + dependencies: + '@vitest/pretty-format': 2.1.2 + magic-string: 0.30.11 + pathe: 1.1.2 + '@vitest/spy@2.1.1': dependencies: tinyspy: 3.0.2 + '@vitest/spy@2.1.2': + dependencies: + tinyspy: 3.0.2 + '@vitest/utils@2.1.1': dependencies: '@vitest/pretty-format': 2.1.1 loupe: 3.1.1 tinyrainbow: 1.2.0 + '@vitest/utils@2.1.2': + dependencies: + '@vitest/pretty-format': 2.1.2 + loupe: 3.1.1 + tinyrainbow: 1.2.0 + '@walletconnect/browser-utils@1.8.0': dependencies: '@walletconnect/safe-json': 1.0.0 @@ -7081,16 +7459,16 @@ snapshots: '@walletconnect/safe-json': 1.0.2 pino: 7.11.0 - '@walletconnect/modal-core@2.6.2(@types/react@18.3.5)(react@18.3.1)': + '@walletconnect/modal-core@2.7.0(@types/react@18.3.11)(react@18.3.1)': dependencies: - valtio: 1.11.2(@types/react@18.3.5)(react@18.3.1) + valtio: 1.11.2(@types/react@18.3.11)(react@18.3.1) transitivePeerDependencies: - '@types/react' - react - '@walletconnect/modal-sign-html@2.6.2(@types/react@18.3.5)(react@18.3.1)': + '@walletconnect/modal-sign-html@2.7.0(@types/react@18.3.11)(react@18.3.1)': dependencies: - '@walletconnect/modal': 2.6.2(@types/react@18.3.5)(react@18.3.1) + '@walletconnect/modal': 2.7.0(@types/react@18.3.11)(react@18.3.1) '@walletconnect/sign-client': 2.10.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -7112,9 +7490,9 @@ snapshots: - uWebSockets.js - utf-8-validate - '@walletconnect/modal-ui@2.6.2(@types/react@18.3.5)(react@18.3.1)': + '@walletconnect/modal-ui@2.7.0(@types/react@18.3.11)(react@18.3.1)': dependencies: - '@walletconnect/modal-core': 2.6.2(@types/react@18.3.5)(react@18.3.1) + '@walletconnect/modal-core': 2.7.0(@types/react@18.3.11)(react@18.3.1) lit: 2.8.0 motion: 10.16.2 qrcode: 1.5.3 @@ -7122,10 +7500,10 @@ snapshots: - '@types/react' - react - '@walletconnect/modal@2.6.2(@types/react@18.3.5)(react@18.3.1)': + '@walletconnect/modal@2.7.0(@types/react@18.3.11)(react@18.3.1)': dependencies: - '@walletconnect/modal-core': 2.6.2(@types/react@18.3.5)(react@18.3.1) - '@walletconnect/modal-ui': 2.6.2(@types/react@18.3.5)(react@18.3.1) + '@walletconnect/modal-core': 2.7.0(@types/react@18.3.11)(react@18.3.1) + '@walletconnect/modal-ui': 2.7.0(@types/react@18.3.11)(react@18.3.1) transitivePeerDependencies: - '@types/react' - react @@ -7139,7 +7517,7 @@ snapshots: '@walletconnect/relay-api@1.0.11': dependencies: - '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/relay-auth@1.0.4': dependencies: @@ -7433,28 +7811,28 @@ snapshots: atomic-sleep@1.0.0: {} - autoprefixer@10.4.20(postcss@8.4.45): + autoprefixer@10.4.20(postcss@8.4.47): dependencies: browserslist: 4.23.3 caniuse-lite: 1.0.30001660 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.0 - postcss: 8.4.45 + postcss: 8.4.47 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 - axios-cache-interceptor@1.5.3(axios@1.7.4): + axios-cache-interceptor@1.6.0(axios@1.7.7): dependencies: - axios: 1.7.4 + axios: 1.7.7 cache-parser: 1.2.5 fast-defer: 1.1.8 object-code: 1.3.3 - axios@1.7.4: + axios@1.7.7: dependencies: follow-redirects: 1.15.9 form-data: 4.0.0 @@ -7464,10 +7842,10 @@ snapshots: babel-dead-code-elimination@1.0.6: dependencies: - '@babel/core': 7.25.2 - '@babel/parser': 7.25.6 - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 + '@babel/core': 7.25.7 + '@babel/parser': 7.25.7 + '@babel/traverse': 7.25.7 + '@babel/types': 7.25.7 transitivePeerDependencies: - supports-color @@ -7475,7 +7853,7 @@ snapshots: base64-js@1.5.1: {} - big.js@6.2.1: {} + big.js@6.2.2: {} bignumber.js@9.1.2: {} @@ -7559,6 +7937,13 @@ snapshots: node-releases: 2.0.18 update-browserslist-db: 1.1.0(browserslist@4.23.3) + browserslist@4.24.0: + dependencies: + caniuse-lite: 1.0.30001667 + electron-to-chromium: 1.5.33 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.24.0) + buffer-xor@1.0.3: {} buffer@5.7.1: @@ -7598,6 +7983,8 @@ snapshots: caniuse-lite@1.0.30001660: {} + caniuse-lite@1.0.30001667: {} + capital-case@1.0.4: dependencies: no-case: 3.0.4 @@ -7981,6 +8368,8 @@ snapshots: electron-to-chromium@1.5.20: {} + electron-to-chromium@1.5.33: {} + elliptic@6.5.7: dependencies: bn.js: 4.12.0 @@ -8808,6 +9197,8 @@ snapshots: jsesc@2.5.2: {} + jsesc@3.0.2: {} + json-bigint@1.0.0: dependencies: bignumber.js: 9.1.2 @@ -8918,7 +9309,7 @@ snapshots: dependencies: yallist: 3.1.1 - lucide-react@0.439.0(react@18.3.1): + lucide-react@0.447.0(react@18.3.1): dependencies: react: 18.3.1 @@ -9016,13 +9407,13 @@ snapshots: ms@2.1.3: {} - msw@2.4.4(typescript@5.5.4): + msw@2.4.9(typescript@5.5.4): dependencies: '@bundled-es-modules/cookie': 2.0.0 '@bundled-es-modules/statuses': 1.0.1 '@bundled-es-modules/tough-cookie': 0.1.6 '@inquirer/confirm': 3.2.0 - '@mswjs/interceptors': 0.35.1 + '@mswjs/interceptors': 0.35.9 '@open-draft/until': 2.1.0 '@types/cookie': 0.6.0 '@types/statuses': 2.0.5 @@ -9037,6 +9428,29 @@ snapshots: yargs: 17.7.2 optionalDependencies: typescript: 5.5.4 + optional: true + + msw@2.4.9(typescript@5.6.2): + dependencies: + '@bundled-es-modules/cookie': 2.0.0 + '@bundled-es-modules/statuses': 1.0.1 + '@bundled-es-modules/tough-cookie': 0.1.6 + '@inquirer/confirm': 3.2.0 + '@mswjs/interceptors': 0.35.9 + '@open-draft/until': 2.1.0 + '@types/cookie': 0.6.0 + '@types/statuses': 2.0.5 + chalk: 4.1.2 + graphql: 16.9.0 + headers-polyfill: 4.0.3 + is-node-process: 1.2.0 + outvariant: 1.4.3 + path-to-regexp: 6.3.0 + strict-event-emitter: 0.5.1 + type-fest: 4.26.1 + yargs: 17.7.2 + optionalDependencies: + typescript: 5.6.2 multiformats@9.9.0: {} @@ -9333,11 +9747,11 @@ snapshots: mlly: 1.7.1 pathe: 1.1.2 - playwright-core@1.47.0: {} + playwright-core@1.47.2: {} - playwright@1.47.0: + playwright@1.47.2: dependencies: - playwright-core: 1.47.0 + playwright-core: 1.47.2 optionalDependencies: fsevents: 2.3.2 @@ -9347,29 +9761,29 @@ snapshots: possible-typed-array-names@1.0.0: {} - postcss-import@15.1.0(postcss@8.4.45): + postcss-import@15.1.0(postcss@8.4.47): dependencies: - postcss: 8.4.45 + postcss: 8.4.47 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - postcss-js@4.0.1(postcss@8.4.45): + postcss-js@4.0.1(postcss@8.4.47): dependencies: camelcase-css: 2.0.1 - postcss: 8.4.45 + postcss: 8.4.47 - postcss-load-config@4.0.2(postcss@8.4.45)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4)): + postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)): dependencies: lilconfig: 3.1.2 yaml: 2.5.1 optionalDependencies: - postcss: 8.4.45 - ts-node: 10.9.2(@types/node@20.16.5)(typescript@5.5.4) + postcss: 8.4.47 + ts-node: 10.9.2(@types/node@20.16.10)(typescript@5.6.2) - postcss-nested@6.2.0(postcss@8.4.45): + postcss-nested@6.2.0(postcss@8.4.47): dependencies: - postcss: 8.4.45 + postcss: 8.4.47 postcss-selector-parser: 6.1.2 postcss-selector-parser@6.1.2: @@ -9379,7 +9793,7 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.4.45: + postcss@8.4.47: dependencies: nanoid: 3.3.7 picocolors: 1.1.0 @@ -9520,24 +9934,24 @@ snapshots: react-refresh@0.14.2: {} - react-remove-scroll-bar@2.3.6(@types/react@18.3.5)(react@18.3.1): + react-remove-scroll-bar@2.3.6(@types/react@18.3.11)(react@18.3.1): dependencies: react: 18.3.1 - react-style-singleton: 2.2.1(@types/react@18.3.5)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.11)(react@18.3.1) tslib: 2.7.0 optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 - react-remove-scroll@2.5.7(@types/react@18.3.5)(react@18.3.1): + react-remove-scroll@2.6.0(@types/react@18.3.11)(react@18.3.1): dependencies: react: 18.3.1 - react-remove-scroll-bar: 2.3.6(@types/react@18.3.5)(react@18.3.1) - react-style-singleton: 2.2.1(@types/react@18.3.5)(react@18.3.1) + react-remove-scroll-bar: 2.3.6(@types/react@18.3.11)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.11)(react@18.3.1) tslib: 2.7.0 - use-callback-ref: 1.3.2(@types/react@18.3.5)(react@18.3.1) - use-sidecar: 1.1.2(@types/react@18.3.5)(react@18.3.1) + use-callback-ref: 1.3.2(@types/react@18.3.11)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.11)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 react-smooth@4.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: @@ -9547,14 +9961,14 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-style-singleton@2.2.1(@types/react@18.3.5)(react@18.3.1): + react-style-singleton@2.2.1(@types/react@18.3.11)(react@18.3.1): dependencies: get-nonce: 1.0.1 invariant: 2.2.4 react: 18.3.1 tslib: 2.7.0 optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: @@ -9907,15 +10321,13 @@ snapshots: tabbable@6.2.0: {} - tailwind-merge@1.14.0: {} + tailwind-merge@2.5.3: {} - tailwind-merge@2.5.2: {} - - tailwindcss-animate@1.0.7(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))): dependencies: - tailwindcss: 3.4.10(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4)) + tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)) - tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4)): + tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -9931,11 +10343,11 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.0 - postcss: 8.4.45 - postcss-import: 15.1.0(postcss@8.4.45) - postcss-js: 4.0.1(postcss@8.4.45) - postcss-load-config: 4.0.2(postcss@8.4.45)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4)) - postcss-nested: 6.2.0(postcss@8.4.45) + postcss: 8.4.47 + postcss-import: 15.1.0(postcss@8.4.47) + postcss-js: 4.0.1(postcss@8.4.47) + postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)) + postcss-nested: 6.2.0(postcss@8.4.47) postcss-selector-parser: 6.1.2 resolve: 1.22.8 sucrase: 3.35.0 @@ -10005,6 +10417,10 @@ snapshots: dependencies: typescript: 5.5.4 + ts-api-utils@1.3.0(typescript@5.6.2): + dependencies: + typescript: 5.6.2 + ts-interface-checker@0.1.13: {} ts-morph@20.0.0: @@ -10012,21 +10428,21 @@ snapshots: '@ts-morph/common': 0.21.0 code-block-writer: 12.0.0 - ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4): + ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.16.5 + '@types/node': 20.16.10 acorn: 8.12.1 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.5.4 + typescript: 5.6.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 @@ -10041,7 +10457,7 @@ snapshots: tslib@2.7.0: {} - tsx@4.19.0: + tsx@4.19.1: dependencies: esbuild: 0.23.1 get-tsconfig: 4.8.0 @@ -10165,6 +10581,12 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.0 + update-browserslist-db@1.1.0(browserslist@4.24.0): + dependencies: + browserslist: 4.24.0 + escalade: 3.2.0 + picocolors: 1.1.0 + upper-case-first@2.0.2: dependencies: tslib: 2.7.0 @@ -10189,24 +10611,24 @@ snapshots: punycode: 1.4.1 qs: 6.13.0 - use-callback-ref@1.3.2(@types/react@18.3.5)(react@18.3.1): + use-callback-ref@1.3.2(@types/react@18.3.11)(react@18.3.1): dependencies: react: 18.3.1 tslib: 2.7.0 optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 use-debounce@10.0.3(react@18.3.1): dependencies: react: 18.3.1 - use-sidecar@1.1.2(@types/react@18.3.5)(react@18.3.1): + use-sidecar@1.1.2(@types/react@18.3.11)(react@18.3.1): dependencies: detect-node-es: 1.1.0 react: 18.3.1 tslib: 2.7.0 optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 use-sync-external-store@1.2.0(react@18.3.1): dependencies: @@ -10228,12 +10650,12 @@ snapshots: v8-compile-cache-lib@3.0.1: {} - valtio@1.11.2(@types/react@18.3.5)(react@18.3.1): + valtio@1.11.2(@types/react@18.3.11)(react@18.3.1): dependencies: proxy-compare: 2.5.1 use-sync-external-store: 1.2.0(react@18.3.1) optionalDependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.11 react: 18.3.1 victory-vendor@36.9.2: @@ -10253,12 +10675,12 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vite-node@2.1.1(@types/node@20.16.5): + vite-node@2.1.1(@types/node@22.7.4): dependencies: cac: 6.7.14 debug: 4.3.7 pathe: 1.1.2 - vite: 5.4.6(@types/node@20.16.5) + vite: 5.4.8(@types/node@22.7.4) transitivePeerDependencies: - '@types/node' - less @@ -10270,12 +10692,12 @@ snapshots: - supports-color - terser - vite-node@2.1.1(@types/node@22.7.4): + vite-node@2.1.2(@types/node@20.16.10): dependencies: cac: 6.7.14 debug: 4.3.7 pathe: 1.1.2 - vite: 5.4.6(@types/node@22.7.4) + vite: 5.4.8(@types/node@20.16.10) transitivePeerDependencies: - '@types/node' - less @@ -10287,36 +10709,36 @@ snapshots: - supports-color - terser - vite-plugin-node-polyfills@0.22.0(rollup@4.22.0)(vite@5.4.6(@types/node@20.16.5)): + vite-plugin-node-polyfills@0.22.0(rollup@4.22.0)(vite@5.4.8(@types/node@20.16.10)): dependencies: '@rollup/plugin-inject': 5.0.5(rollup@4.22.0) node-stdlib-browser: 1.2.0 - vite: 5.4.6(@types/node@20.16.5) + vite: 5.4.8(@types/node@20.16.10) transitivePeerDependencies: - rollup - vite@5.4.6(@types/node@20.16.5): + vite@5.4.8(@types/node@20.16.10): dependencies: esbuild: 0.21.5 - postcss: 8.4.45 + postcss: 8.4.47 rollup: 4.22.0 optionalDependencies: - '@types/node': 20.16.5 + '@types/node': 20.16.10 fsevents: 2.3.3 - vite@5.4.6(@types/node@22.7.4): + vite@5.4.8(@types/node@22.7.4): dependencies: esbuild: 0.21.5 - postcss: 8.4.45 + postcss: 8.4.47 rollup: 4.22.0 optionalDependencies: '@types/node': 22.7.4 fsevents: 2.3.3 - vitest@2.1.1(@types/node@20.16.5)(jsdom@24.1.3)(msw@2.4.4(typescript@5.5.4)): + vitest@2.1.1(@types/node@22.7.4)(jsdom@24.1.3)(msw@2.4.9(typescript@5.5.4)): dependencies: '@vitest/expect': 2.1.1 - '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(msw@2.4.4(typescript@5.5.4))(vite@5.4.6(@types/node@20.16.5)) + '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(msw@2.4.9(typescript@5.5.4))(vite@5.4.8(@types/node@22.7.4)) '@vitest/pretty-format': 2.1.1 '@vitest/runner': 2.1.1 '@vitest/snapshot': 2.1.1 @@ -10331,11 +10753,11 @@ snapshots: tinyexec: 0.3.0 tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 5.4.6(@types/node@20.16.5) - vite-node: 2.1.1(@types/node@20.16.5) + vite: 5.4.8(@types/node@22.7.4) + vite-node: 2.1.1(@types/node@22.7.4) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.16.5 + '@types/node': 22.7.4 jsdom: 24.1.3 transitivePeerDependencies: - less @@ -10348,15 +10770,15 @@ snapshots: - supports-color - terser - vitest@2.1.1(@types/node@22.7.4)(jsdom@24.1.3)(msw@2.4.4(typescript@5.5.4)): + vitest@2.1.2(@types/node@20.16.10)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2)): dependencies: - '@vitest/expect': 2.1.1 - '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(msw@2.4.4(typescript@5.5.4))(vite@5.4.6(@types/node@22.7.4)) - '@vitest/pretty-format': 2.1.1 - '@vitest/runner': 2.1.1 - '@vitest/snapshot': 2.1.1 - '@vitest/spy': 2.1.1 - '@vitest/utils': 2.1.1 + '@vitest/expect': 2.1.2 + '@vitest/mocker': 2.1.2(@vitest/spy@2.1.2)(msw@2.4.9(typescript@5.6.2))(vite@5.4.8(@types/node@20.16.10)) + '@vitest/pretty-format': 2.1.2 + '@vitest/runner': 2.1.2 + '@vitest/snapshot': 2.1.2 + '@vitest/spy': 2.1.2 + '@vitest/utils': 2.1.2 chai: 5.1.1 debug: 4.3.7 magic-string: 0.30.11 @@ -10366,11 +10788,11 @@ snapshots: tinyexec: 0.3.0 tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 5.4.6(@types/node@22.7.4) - vite-node: 2.1.1(@types/node@22.7.4) + vite: 5.4.8(@types/node@20.16.10) + vite-node: 2.1.2(@types/node@20.16.10) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.7.4 + '@types/node': 20.16.10 jsdom: 24.1.3 transitivePeerDependencies: - less diff --git a/ui/package.json b/ui/package.json index cd3b211a..91d83e7b 100644 --- a/ui/package.json +++ b/ui/package.json @@ -7,74 +7,74 @@ "node": "20" }, "devDependencies": { - "@playwright/test": "1.47.0", - "@tanstack/router-vite-plugin": "1.56.4", + "@playwright/test": "1.47.2", + "@tanstack/router-vite-plugin": "1.62.0", "@testing-library/dom": "10.4.0", "@testing-library/jest-dom": "6.5.0", "@testing-library/react": "16.0.1", "@types/big.js": "6.2.2", - "@types/node": "20.16.5", - "@types/react": "18.3.5", + "@types/node": "20.16.10", + "@types/react": "18.3.11", "@types/react-dom": "18.3.0", "@typescript-eslint/eslint-plugin": "8.7.0", "@typescript-eslint/parser": "8.7.0", - "@vitejs/plugin-react": "4.3.1", - "@vitest/coverage-v8": "2.1.1", + "@vitejs/plugin-react": "4.3.2", + "@vitest/coverage-v8": "2.1.2", "algo-msgpack-with-bigint": "2.1.1", "autoprefixer": "10.4.20", "eslint": "8.57.1", "eslint-config-prettier": "9.1.0", "eslint-plugin-prettier": "5.2.1", "jsdom": "24.1.3", - "msw": "2.4.4", - "playwright": "1.47.0", - "postcss": "8.4.45", + "msw": "2.4.9", + "playwright": "1.47.2", + "postcss": "8.4.47", "prettier": "3.3.3", - "tailwindcss": "3.4.10", + "tailwindcss": "3.4.13", "ts-node": "10.9.2", - "typescript": "5.5.4", - "vite": "5.4.6", - "vitest": "2.1.1" + "typescript": "5.6.2", + "vite": "5.4.8", + "vitest": "2.1.2" }, "dependencies": { "@algorandfoundation/algokit-utils": "7.0.0-beta.11", "@blockshake/defly-connect": "1.1.6", "@hookform/resolvers": "3.9.0", "@perawallet/connect": "1.3.4", - "@radix-ui/react-avatar": "1.1.0", - "@radix-ui/react-checkbox": "1.1.1", - "@radix-ui/react-collapsible": "1.1.0", - "@radix-ui/react-dialog": "1.1.1", - "@radix-ui/react-dropdown-menu": "2.1.1", - "@radix-ui/react-hover-card": "1.1.1", + "@radix-ui/react-avatar": "1.1.1", + "@radix-ui/react-checkbox": "1.1.2", + "@radix-ui/react-collapsible": "1.1.1", + "@radix-ui/react-dialog": "1.1.2", + "@radix-ui/react-dropdown-menu": "2.1.2", + "@radix-ui/react-hover-card": "1.1.2", "@radix-ui/react-icons": "1.3.0", "@radix-ui/react-label": "2.1.0", - "@radix-ui/react-navigation-menu": "1.2.0", - "@radix-ui/react-popover": "1.1.1", - "@radix-ui/react-scroll-area": "1.1.0", - "@radix-ui/react-select": "2.1.1", + "@radix-ui/react-navigation-menu": "1.2.1", + "@radix-ui/react-popover": "1.1.2", + "@radix-ui/react-scroll-area": "1.2.0", + "@radix-ui/react-select": "2.1.2", "@radix-ui/react-separator": "1.1.0", "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-switch": "1.1.0", - "@radix-ui/react-tooltip": "1.1.2", - "@tanstack/react-query": "5.55.3", - "@tanstack/react-query-devtools": "5.55.2", - "@tanstack/react-router": "1.56.5", + "@radix-ui/react-switch": "1.1.1", + "@radix-ui/react-tooltip": "1.1.3", + "@tanstack/react-query": "5.59.0", + "@tanstack/react-query-devtools": "5.59.0", + "@tanstack/react-router": "1.62.0", "@tanstack/react-table": "8.20.5", - "@tanstack/router-devtools": "1.56.5", - "@tremor/react": "3.18.1", - "@txnlab/use-wallet-react": "3.7.0", - "@walletconnect/modal-sign-html": "2.6.2", + "@tanstack/router-devtools": "1.62.0", + "@tremor/react": "3.18.3", + "@txnlab/use-wallet-react": "3.7.2", + "@walletconnect/modal-sign-html": "2.7.0", "algosdk": "^2.9.0", - "axios": "1.7.4", - "axios-cache-interceptor": "1.5.3", - "big.js": "6.2.1", + "axios": "1.7.7", + "axios-cache-interceptor": "1.6.0", + "big.js": "6.2.2", "class-variance-authority": "0.7.0", "clsx": "2.1.1", "copy-to-clipboard": "3.3.3", "date-fns": "3.6.0", "dayjs": "1.11.13", - "lucide-react": "0.439.0", + "lucide-react": "0.447.0", "lute-connect": "1.4.1", "next-themes": "0.3.0", "notistack": "3.0.1", @@ -85,7 +85,7 @@ "react-helmet-async": "2.0.5", "react-hook-form": "7.53.0", "sonner": "1.5.0", - "tailwind-merge": "2.5.2", + "tailwind-merge": "2.5.3", "tailwindcss-animate": "1.0.7", "tslib": "2.7.0", "use-debounce": "10.0.3", From 2938623f1663ddaa91aeeb83a29b13a20402ecbe Mon Sep 17 00:00:00 2001 From: Patrick Bennett Date: Tue, 8 Oct 2024 12:15:54 -0400 Subject: [PATCH 21/24] Revert "update non-major dependencies" This reverts commit 01a21893f0d2191d8c8bbcc7b7a19f01c51e4e58. --- pnpm-lock.yaml | 1648 ++++++++++++++++++----------------------------- ui/package.json | 74 +-- 2 files changed, 650 insertions(+), 1072 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1d036925..6135e473 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -58,7 +58,7 @@ importers: version: 5.5.4 vitest: specifier: 2.1.1 - version: 2.1.1(@types/node@22.7.4)(jsdom@24.1.3)(msw@2.4.9(typescript@5.5.4)) + version: 2.1.1(@types/node@22.7.4)(jsdom@24.1.3)(msw@2.4.4(typescript@5.5.4)) contracts/bootstrap: dependencies: @@ -106,89 +106,89 @@ importers: specifier: 1.3.4 version: 1.3.4(algosdk@2.9.0) '@radix-ui/react-avatar': - specifier: 1.1.1 - version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 1.1.0 + version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-checkbox': - specifier: 1.1.2 - version: 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-collapsible': specifier: 1.1.1 - version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-collapsible': + specifier: 1.1.0 + version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-dialog': - specifier: 1.1.2 - version: 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 1.1.1 + version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-dropdown-menu': - specifier: 2.1.2 - version: 2.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 2.1.1 + version: 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-hover-card': - specifier: 1.1.2 - version: 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 1.1.1 + version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-icons': specifier: 1.3.0 version: 1.3.0(react@18.3.1) '@radix-ui/react-label': specifier: 2.1.0 - version: 2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-navigation-menu': - specifier: 1.2.1 - version: 1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 1.2.0 + version: 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-popover': - specifier: 1.1.2 - version: 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 1.1.1 + version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-scroll-area': - specifier: 1.2.0 - version: 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 1.1.0 + version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-select': - specifier: 2.1.2 - version: 2.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 2.1.1 + version: 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-separator': specifier: 1.1.0 - version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': specifier: 1.1.0 - version: 1.1.0(@types/react@18.3.11)(react@18.3.1) + version: 1.1.0(@types/react@18.3.5)(react@18.3.1) '@radix-ui/react-switch': - specifier: 1.1.1 - version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 1.1.0 + version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-tooltip': - specifier: 1.1.3 - version: 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 1.1.2 + version: 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-query': - specifier: 5.59.0 - version: 5.59.0(react@18.3.1) + specifier: 5.55.3 + version: 5.55.3(react@18.3.1) '@tanstack/react-query-devtools': - specifier: 5.59.0 - version: 5.59.0(@tanstack/react-query@5.59.0(react@18.3.1))(react@18.3.1) + specifier: 5.55.2 + version: 5.55.2(@tanstack/react-query@5.55.3(react@18.3.1))(react@18.3.1) '@tanstack/react-router': - specifier: 1.62.0 - version: 1.62.0(@tanstack/router-generator@1.58.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 1.56.5 + version: 1.56.5(@tanstack/router-generator@1.57.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-table': specifier: 8.20.5 version: 8.20.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/router-devtools': - specifier: 1.62.0 - version: 1.62.0(@tanstack/react-router@1.62.0(@tanstack/router-generator@1.58.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 1.56.5 + version: 1.56.5(@tanstack/react-router@1.56.5(@tanstack/router-generator@1.57.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tremor/react': - specifier: 3.18.3 - version: 3.18.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))) + specifier: 3.18.1 + version: 3.18.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4))) '@txnlab/use-wallet-react': - specifier: 3.7.2 - version: 3.7.2(@blockshake/defly-connect@1.1.6(algosdk@2.9.0))(@perawallet/connect@1.3.4(algosdk@2.9.0))(@walletconnect/modal@2.7.0(@types/react@18.3.11)(react@18.3.1))(algosdk@2.9.0)(lute-connect@1.4.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 3.7.0 + version: 3.7.0(@blockshake/defly-connect@1.1.6(algosdk@2.9.0))(@perawallet/connect@1.3.4(algosdk@2.9.0))(@walletconnect/modal@2.6.2(@types/react@18.3.5)(react@18.3.1))(algosdk@2.9.0)(lute-connect@1.4.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@walletconnect/modal-sign-html': - specifier: 2.7.0 - version: 2.7.0(@types/react@18.3.11)(react@18.3.1) + specifier: 2.6.2 + version: 2.6.2(@types/react@18.3.5)(react@18.3.1) algosdk: specifier: ^2.9.0 version: 2.9.0 axios: - specifier: 1.7.7 - version: 1.7.7 + specifier: 1.7.4 + version: 1.7.4 axios-cache-interceptor: - specifier: 1.6.0 - version: 1.6.0(axios@1.7.7) + specifier: 1.5.3 + version: 1.5.3(axios@1.7.4) big.js: - specifier: 6.2.2 - version: 6.2.2 + specifier: 6.2.1 + version: 6.2.1 class-variance-authority: specifier: 0.7.0 version: 0.7.0 @@ -205,8 +205,8 @@ importers: specifier: 1.11.13 version: 1.11.13 lucide-react: - specifier: 0.447.0 - version: 0.447.0(react@18.3.1) + specifier: 0.439.0 + version: 0.439.0(react@18.3.1) lute-connect: specifier: 1.4.1 version: 1.4.1 @@ -238,11 +238,11 @@ importers: specifier: 1.5.0 version: 1.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) tailwind-merge: - specifier: 2.5.3 - version: 2.5.3 + specifier: 2.5.2 + version: 2.5.2 tailwindcss-animate: specifier: 1.0.7 - version: 1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))) + version: 1.0.7(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4))) tslib: specifier: 2.7.0 version: 2.7.0 @@ -251,17 +251,17 @@ importers: version: 10.0.3(react@18.3.1) vite-plugin-node-polyfills: specifier: 0.22.0 - version: 0.22.0(rollup@4.22.0)(vite@5.4.8(@types/node@20.16.10)) + version: 0.22.0(rollup@4.22.0)(vite@5.4.6(@types/node@20.16.5)) zod: specifier: 3.23.8 version: 3.23.8 devDependencies: '@playwright/test': - specifier: 1.47.2 - version: 1.47.2 + specifier: 1.47.0 + version: 1.47.0 '@tanstack/router-vite-plugin': - specifier: 1.62.0 - version: 1.62.0(vite@5.4.8(@types/node@20.16.10)) + specifier: 1.56.4 + version: 1.56.4(vite@5.4.6(@types/node@20.16.5)) '@testing-library/dom': specifier: 10.4.0 version: 10.4.0 @@ -270,37 +270,37 @@ importers: version: 6.5.0 '@testing-library/react': specifier: 16.0.1 - version: 16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/big.js': specifier: 6.2.2 version: 6.2.2 '@types/node': - specifier: 20.16.10 - version: 20.16.10 + specifier: 20.16.5 + version: 20.16.5 '@types/react': - specifier: 18.3.11 - version: 18.3.11 + specifier: 18.3.5 + version: 18.3.5 '@types/react-dom': specifier: 18.3.0 version: 18.3.0 '@typescript-eslint/eslint-plugin': specifier: 8.7.0 - version: 8.7.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2) + version: 8.7.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4) '@typescript-eslint/parser': specifier: 8.7.0 - version: 8.7.0(eslint@8.57.1)(typescript@5.6.2) + version: 8.7.0(eslint@8.57.1)(typescript@5.5.4) '@vitejs/plugin-react': - specifier: 4.3.2 - version: 4.3.2(vite@5.4.8(@types/node@20.16.10)) + specifier: 4.3.1 + version: 4.3.1(vite@5.4.6(@types/node@20.16.5)) '@vitest/coverage-v8': - specifier: 2.1.2 - version: 2.1.2(vitest@2.1.2(@types/node@20.16.10)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2))) + specifier: 2.1.1 + version: 2.1.1(vitest@2.1.1(@types/node@20.16.5)(jsdom@24.1.3)(msw@2.4.4(typescript@5.5.4))) algo-msgpack-with-bigint: specifier: 2.1.1 version: 2.1.1 autoprefixer: specifier: 10.4.20 - version: 10.4.20(postcss@8.4.47) + version: 10.4.20(postcss@8.4.45) eslint: specifier: 8.57.1 version: 8.57.1 @@ -314,32 +314,32 @@ importers: specifier: 24.1.3 version: 24.1.3 msw: - specifier: 2.4.9 - version: 2.4.9(typescript@5.6.2) + specifier: 2.4.4 + version: 2.4.4(typescript@5.5.4) playwright: - specifier: 1.47.2 - version: 1.47.2 + specifier: 1.47.0 + version: 1.47.0 postcss: - specifier: 8.4.47 - version: 8.4.47 + specifier: 8.4.45 + version: 8.4.45 prettier: specifier: 3.3.3 version: 3.3.3 tailwindcss: - specifier: 3.4.13 - version: 3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)) + specifier: 3.4.10 + version: 3.4.10(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4)) ts-node: specifier: 10.9.2 - version: 10.9.2(@types/node@20.16.10)(typescript@5.6.2) + version: 10.9.2(@types/node@20.16.5)(typescript@5.5.4) typescript: - specifier: 5.6.2 - version: 5.6.2 + specifier: 5.5.4 + version: 5.5.4 vite: - specifier: 5.4.8 - version: 5.4.8(@types/node@20.16.10) + specifier: 5.4.6 + version: 5.4.6(@types/node@20.16.5) vitest: - specifier: 2.1.2 - version: 2.1.2(@types/node@20.16.10)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2)) + specifier: 2.1.1 + version: 2.1.1(@types/node@20.16.5)(jsdom@24.1.3)(msw@2.4.4(typescript@5.5.4)) packages: @@ -379,136 +379,73 @@ packages: resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} - '@babel/code-frame@7.25.7': - resolution: {integrity: sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==} - engines: {node: '>=6.9.0'} - '@babel/compat-data@7.25.4': resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.25.7': - resolution: {integrity: sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==} - engines: {node: '>=6.9.0'} - '@babel/core@7.25.2': resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} engines: {node: '>=6.9.0'} - '@babel/core@7.25.7': - resolution: {integrity: sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==} - engines: {node: '>=6.9.0'} - '@babel/generator@7.25.6': resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} engines: {node: '>=6.9.0'} - '@babel/generator@7.25.7': - resolution: {integrity: sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==} - engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.25.2': resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.25.7': - resolution: {integrity: sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==} - engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.24.7': resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.25.7': - resolution: {integrity: sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==} - engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.25.2': resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-module-transforms@7.25.7': - resolution: {integrity: sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-plugin-utils@7.24.8': resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.25.7': - resolution: {integrity: sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==} - engines: {node: '>=6.9.0'} - '@babel/helper-simple-access@7.24.7': resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} - '@babel/helper-simple-access@7.25.7': - resolution: {integrity: sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==} - engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.8': resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.25.7': - resolution: {integrity: sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.24.7': resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.7': - resolution: {integrity: sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.24.8': resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.25.7': - resolution: {integrity: sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==} - engines: {node: '>=6.9.0'} - '@babel/helpers@7.25.6': resolution: {integrity: sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.25.7': - resolution: {integrity: sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==} - engines: {node: '>=6.9.0'} - '@babel/highlight@7.24.7': resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.25.7': - resolution: {integrity: sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==} - engines: {node: '>=6.9.0'} - '@babel/parser@7.25.6': resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@7.25.7': - resolution: {integrity: sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/plugin-syntax-jsx@7.25.7': - resolution: {integrity: sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==} + '@babel/plugin-syntax-jsx@7.24.7': + resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.25.7': - resolution: {integrity: sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==} + '@babel/plugin-syntax-typescript@7.25.4': + resolution: {integrity: sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -533,26 +470,14 @@ packages: resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} engines: {node: '>=6.9.0'} - '@babel/template@7.25.7': - resolution: {integrity: sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==} - engines: {node: '>=6.9.0'} - '@babel/traverse@7.25.6': resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.25.7': - resolution: {integrity: sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==} - engines: {node: '>=6.9.0'} - '@babel/types@7.25.6': resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} engines: {node: '>=6.9.0'} - '@babel/types@7.25.7': - resolution: {integrity: sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==} - engines: {node: '>=6.9.0'} - '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -1018,8 +943,8 @@ packages: resolution: {integrity: sha512-z10PF9JV6SbjFq+/rYabM+8CVlMokgl8RFGvieSGNTmrkQanfHn+15XBrhG3BgUfvmTeSeyShfOHpG0i9zEdcg==} deprecated: Motion One for Vue is deprecated. Use Oku Motion instead https://oku-ui.com/motion - '@mswjs/interceptors@0.35.9': - resolution: {integrity: sha512-SSnyl/4ni/2ViHKkiZb8eajA/eN1DNFaHjhGiLUdZvDz6PKF4COSf/17xqSz64nOo2Ia29SA6B2KNCsyCbVmaQ==} + '@mswjs/interceptors@0.35.1': + resolution: {integrity: sha512-nMuUaMCtg8oKSTHwAnsoGRN6c1RZXNm6+ebEoe9SBGALVlBIzniZoSuC/itNCLOt51YEEYsF0svB/sOzYhqLPA==} engines: {node: '>=18'} '@nodelib/fs.scandir@2.1.5': @@ -1138,8 +1063,8 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@playwright/test@1.47.2': - resolution: {integrity: sha512-jTXRsoSPONAs8Za9QEQdyjFn+0ZQFjCiIztAIF6bi1HqhBzG9Ma7g1WotyiGqFSBRZjIEqMdT8RUlbk1QVhzCQ==} + '@playwright/test@1.47.0': + resolution: {integrity: sha512-SgAdlSwYVpToI4e/IH19IHHWvoijAYH5hu2MWSXptRypLSnzj51PcGD+rsOXFayde4P9ZLi+loXVwArg6IUkCA==} engines: {node: '>=18'} hasBin: true @@ -1162,8 +1087,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-avatar@1.1.1': - resolution: {integrity: sha512-eoOtThOmxeoizxpX6RiEsQZ2wj5r4+zoeqAwO0cBaFQGjJwIH3dIX0OCxNrCyrrdxG+vBweMETh3VziQG7c1kw==} + '@radix-ui/react-avatar@1.1.0': + resolution: {integrity: sha512-Q/PbuSMk/vyAd/UoIShVGZ7StHHeRFYU7wXmi5GV+8cLXflZAEpHL/F697H1klrzxKXNtZ97vWiC0q3RKUH8UA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1175,8 +1100,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-checkbox@1.1.2': - resolution: {integrity: sha512-/i0fl686zaJbDQLNKrkCbMyDm6FQMt4jg323k7HuqitoANm9sE23Ql8yOK3Wusk34HSLKDChhMux05FnP6KUkw==} + '@radix-ui/react-checkbox@1.1.1': + resolution: {integrity: sha512-0i/EKJ222Afa1FE0C6pNJxDq1itzcl3HChE9DwskA4th4KRse8ojx8a1nVcOjwJdbpDLcz7uol77yYnQNMHdKw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1188,8 +1113,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-collapsible@1.1.1': - resolution: {integrity: sha512-1///SnrfQHJEofLokyczERxQbWfCGQlQ2XsCZMucVs6it+lq9iw4vXy+uDn1edlb58cOZOWSldnfPAYcT4O/Yg==} + '@radix-ui/react-collapsible@1.1.0': + resolution: {integrity: sha512-zQY7Epa8sTL0mq4ajSJpjgn2YmCgyrG7RsQgLp3C0LQVkG7+Tf6Pv1CeNWZLyqMjhdPkBa5Lx7wYBeSu7uCSTA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1232,17 +1157,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-context@1.1.1': - resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-dialog@1.1.2': - resolution: {integrity: sha512-Yj4dZtqa2o+kG61fzB0H2qUvmwBA2oyQroGLyNtBj1beo1khoQ3q1a2AO8rrQYjd8256CO9+N8L9tvsS+bnIyA==} + '@radix-ui/react-dialog@1.1.1': + resolution: {integrity: sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1263,8 +1179,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-dismissable-layer@1.1.1': - resolution: {integrity: sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==} + '@radix-ui/react-dismissable-layer@1.1.0': + resolution: {integrity: sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1276,8 +1192,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-dropdown-menu@2.1.2': - resolution: {integrity: sha512-GVZMR+eqK8/Kes0a36Qrv+i20bAPXSn8rCBTHx30w+3ECnR5o3xixAlqcVaYvLeyKUsm0aqyhWfmUcqufM8nYA==} + '@radix-ui/react-dropdown-menu@2.1.1': + resolution: {integrity: sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1289,8 +1205,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-focus-guards@1.1.1': - resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==} + '@radix-ui/react-focus-guards@1.1.0': + resolution: {integrity: sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1311,8 +1227,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-hover-card@1.1.2': - resolution: {integrity: sha512-Y5w0qGhysvmqsIy6nQxaPa6mXNKznfoGjOfBgzOjocLxr2XlSjqBMYQQL+FfyogsMuX+m8cZyQGYhJxvxUzO4w==} + '@radix-ui/react-hover-card@1.1.1': + resolution: {integrity: sha512-IwzAOP97hQpDADYVKrEEHUH/b2LA+9MgB0LgdmnbFO2u/3M5hmEofjjr2M6CyzUblaAqJdFm6B7oFtU72DPXrA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1351,8 +1267,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-menu@2.1.2': - resolution: {integrity: sha512-lZ0R4qR2Al6fZ4yCCZzu/ReTFrylHFxIqy7OezIpWF4bL0o9biKo0pFIvkaew3TyZ9Fy5gYVrR5zCGZBVbO1zg==} + '@radix-ui/react-menu@2.1.1': + resolution: {integrity: sha512-oa3mXRRVjHi6DZu/ghuzdylyjaMXLymx83irM7hTxutQbD+7IhPKdMdRHD26Rm+kHRrWcrUkkRPv5pd47a2xFQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1364,8 +1280,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-navigation-menu@1.2.1': - resolution: {integrity: sha512-egDo0yJD2IK8L17gC82vptkvW1jLeni1VuqCyzY727dSJdk5cDjINomouLoNk8RVF7g2aNIfENKWL4UzeU9c8Q==} + '@radix-ui/react-navigation-menu@1.2.0': + resolution: {integrity: sha512-OQ8tcwAOR0DhPlSY3e4VMXeHiol7la4PPdJWhhwJiJA+NLX0SaCaonOkRnI3gCDHoZ7Fo7bb/G6q25fRM2Y+3Q==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1377,8 +1293,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-popover@1.1.2': - resolution: {integrity: sha512-u2HRUyWW+lOiA2g0Le0tMmT55FGOEWHwPFt1EPfbLly7uXQExFo5duNKqG2DzmFXIdqOeNd+TpE8baHWJCyP9w==} + '@radix-ui/react-popover@1.1.1': + resolution: {integrity: sha512-3y1A3isulwnWhvTTwmIreiB8CF4L+qRjZnK1wYLO7pplddzXKby/GnZ2M7OZY3qgnl6p9AodUIHRYGXNah8Y7g==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1403,8 +1319,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-portal@1.1.2': - resolution: {integrity: sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==} + '@radix-ui/react-portal@1.1.1': + resolution: {integrity: sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1416,8 +1332,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-presence@1.1.1': - resolution: {integrity: sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==} + '@radix-ui/react-presence@1.1.0': + resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1455,8 +1371,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-scroll-area@1.2.0': - resolution: {integrity: sha512-q2jMBdsJ9zB7QG6ngQNzNwlvxLQqONyL58QbEGwuyRZZb/ARQwk3uQVbCF7GvQVOtV6EU/pDxAw3zRzJZI3rpQ==} + '@radix-ui/react-scroll-area@1.1.0': + resolution: {integrity: sha512-9ArIZ9HWhsrfqS765h+GZuLoxaRHD/j0ZWOWilsCvYTpYJp8XwCqNG7Dt9Nu/TItKOdgLGkOPCodQvDc+UMwYg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1468,8 +1384,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-select@2.1.2': - resolution: {integrity: sha512-rZJtWmorC7dFRi0owDmoijm6nSJH1tVw64QGiNIZ9PNLyBDtG+iAq+XGsya052At4BfarzY/Dhv9wrrUr6IMZA==} + '@radix-ui/react-select@2.1.1': + resolution: {integrity: sha512-8iRDfyLtzxlprOo9IicnzvpsO1wNCkuwzzCM+Z5Rb5tNOpCdMvcc2AkzX0Fz+Tz9v6NJ5B/7EEgyZveo4FBRfQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1503,8 +1419,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-switch@1.1.1': - resolution: {integrity: sha512-diPqDDoBcZPSicYoMWdWx+bCPuTRH4QSp9J+65IvtdS0Kuzt67bI6n32vCj8q6NZmYW/ah+2orOtMwcX5eQwIg==} + '@radix-ui/react-switch@1.1.0': + resolution: {integrity: sha512-OBzy5WAj641k0AOSpKQtreDMe+isX0MQJ1IVyF03ucdF3DunOnROVrjWs8zsXUxC3zfZ6JL9HFVCUlMghz9dJw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1516,8 +1432,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-tooltip@1.1.3': - resolution: {integrity: sha512-Z4w1FIS0BqVFI2c1jZvb/uDVJijJjJ2ZMuPV81oVgTZ7g3BZxobplnMVvXtFWgtozdvYJ+MFWtwkM5S2HnAong==} + '@radix-ui/react-tooltip@1.1.2': + resolution: {integrity: sha512-9XRsLwe6Yb9B/tlnYCPVUd/TFS4J7HuOZW345DCeC6vKIxQGMZdx21RK4VoZauPD5frgkXTYVS5y90L+3YBn4w==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1763,36 +1679,37 @@ packages: '@stablelib/x25519@1.0.3': resolution: {integrity: sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==} - '@tanstack/history@1.61.1': - resolution: {integrity: sha512-2CqERleeqO3hkhJmyJm37tiL3LYgeOpmo8szqdjgtnnG0z7ZpvzkZz6HkfOr9Ca/ha7mhAiouSvLYuLkM37AMg==} + '@tanstack/history@1.51.7': + resolution: {integrity: sha512-y25aH3NDbdUp5Gk6Fnb77LsHTT2JrzVgI44ZiyEOf8i2j14Ma3oJ80fCw7rT/iV4xa4IN2Yex9flAsZQdh1i4A==} engines: {node: '>=12'} - '@tanstack/query-core@5.59.0': - resolution: {integrity: sha512-WGD8uIhX6/deH/tkZqPNcRyAhDUqs729bWKoByYHSogcshXfFbppOdTER5+qY7mFvu8KEFJwT0nxr8RfPTVh0Q==} + '@tanstack/query-core@5.55.3': + resolution: {integrity: sha512-JpRWbOiTBaddMg/oYNBeBle3m0wFTZnfLc2dtZgjdr3NZaqSGzIkPDFf6gjTWKq5zxWJTZNtsKSihVKQ7wL3VQ==} - '@tanstack/query-devtools@5.58.0': - resolution: {integrity: sha512-iFdQEFXaYYxqgrv63ots+65FGI+tNp5ZS5PdMU1DWisxk3fez5HG3FyVlbUva+RdYS5hSLbxZ9aw3yEs97GNTw==} + '@tanstack/query-devtools@5.55.1': + resolution: {integrity: sha512-2g0TWQGlkyHs9maHIU5A7lRunG4Rj3Y5lOEenE+fydE4zk7GqRs7rKJBp7F74iqRo/cA9V6t1YYQWqd6YRBmcQ==} - '@tanstack/react-query-devtools@5.59.0': - resolution: {integrity: sha512-Kz7577FQGU8qmJxROIT/aOwmkTcxfBqgTP6r1AIvuJxVMVHPkp8eQxWQ7BnfBsy/KTJHiV9vMtRVo1+R1tB3vg==} + '@tanstack/react-query-devtools@5.55.2': + resolution: {integrity: sha512-QkL5Saai7MqEEkGNjhtNB0F1iD4DjpKnvrBM3510L54N8/+4tBPXjMB5a2+ADTYgOrtm4Gn8sJQs/qWKmdpqIg==} peerDependencies: - '@tanstack/react-query': ^5.59.0 + '@tanstack/react-query': ^5.55.2 react: ^18 || ^19 - '@tanstack/react-query@5.59.0': - resolution: {integrity: sha512-YDXp3OORbYR+8HNQx+lf4F73NoiCmCcSvZvgxE29OifmQFk0sBlO26NWLHpcNERo92tVk3w+JQ53/vkcRUY1hA==} + '@tanstack/react-query@5.55.3': + resolution: {integrity: sha512-DzVFYNKMZPaEj+RNmG1lUjmR3CVFf1GoPvE03/0IN+5C8/VYiIMUhi4YgLQPnksrUarIzPPw1N2MPRvuRysLwQ==} peerDependencies: react: ^18 || ^19 - '@tanstack/react-router@1.62.0': - resolution: {integrity: sha512-Vry/GwXiIHHpFilXy3M82Oyh1O1ULJNHVv8XbZ2QtcvftxkXcotsWD1Rt3KhgvXjBA8Zb/ueYN9ASPtkTdMoqQ==} + '@tanstack/react-router@1.56.5': + resolution: {integrity: sha512-qCmBgplLlqOSW1eLlKglTTFMv9zlsL8CJZWN0J0+YLkHSmbsdTKQhfA4bFveXL+EwjrJgFT+/GgIfB8fZEp8PQ==} engines: {node: '>=12'} peerDependencies: - '@tanstack/router-generator': 1.58.12 + '@tanstack/react-generator': '*' + '@tanstack/router-generator': 1.56.4 react: '>=18' react-dom: '>=18' peerDependenciesMeta: - '@tanstack/router-generator': + '@tanstack/react-generator': optional: true '@tanstack/react-store@0.5.5': @@ -1814,23 +1731,23 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@tanstack/router-devtools@1.62.0': - resolution: {integrity: sha512-924zXF6GXYPxH7mH36jGC7QAONUnqWtABFFhnwheyD8LDMnI06jEj8xOIhMEa8fEjkUDON28dz97fm0fjk/i3Q==} + '@tanstack/router-devtools@1.56.5': + resolution: {integrity: sha512-/yI0St7ldXxajH5BmKiO2FsrD1wQ1Z4ZxLLG1RKeIJsVBz5zWWvlI7tlv5EpBVdVgiGQPrd2turx4gUKFLVP+g==} engines: {node: '>=12'} peerDependencies: - '@tanstack/react-router': ^1.62.0 + '@tanstack/react-router': ^1.56.5 react: '>=18' react-dom: '>=18' - '@tanstack/router-generator@1.58.12': - resolution: {integrity: sha512-Ovzb+zCbiRgJAg6awTXWQjn1uRkVyiBc4jiIk7ll2hg0bHjIOsgiegwx/F2YKycY98vWj9TLv/U4Hoo4rmK0IA==} + '@tanstack/router-generator@1.57.9': + resolution: {integrity: sha512-zDkyb6JLkvHc/Hhu9F+Gn4JzUR7ZgtH1rbcI2H14JG8IjW1ahtko/r0a2Ev+G4kNqhZF0a5sSgh/tMQOIPZyjg==} engines: {node: '>=12'} - '@tanstack/router-plugin@1.62.0': - resolution: {integrity: sha512-I+S1QWjKKvWqEns4pwH4KfM0jkiXv00Q5DnG0lw7DKETfBy77UpMLUDruayKfeqErbMv/ksxt6hSlpm3Hlx2dw==} + '@tanstack/router-plugin@1.57.9': + resolution: {integrity: sha512-hMQeZE9TXy10ZNbOkYJDtx07neJUaebTAU/Ep7wAV/uVvgkuGcsjHfXU1HyNfSJV/9Iivrua7ozIJzW2ep+V/A==} engines: {node: '>=12'} peerDependencies: - '@rsbuild/core': '>=1.0.2' + '@rsbuild/core': '>=1.0.1-rc.5' vite: '>=5.0.0' webpack: '>=5.92.0' peerDependenciesMeta: @@ -1841,8 +1758,8 @@ packages: webpack: optional: true - '@tanstack/router-vite-plugin@1.62.0': - resolution: {integrity: sha512-6DzSVAuCiy4y+IVnE7rdo/KEBcBuo7iO0fj7RwiPC5ds48T41yndNhlnxm4TX5ON9JNS/9dcxK5M/C2UwAgiRA==} + '@tanstack/router-vite-plugin@1.56.4': + resolution: {integrity: sha512-P/BKXDHfiCczMwyuOnKQFcS5Krh0dxLa42+eHoH0iPonsFUAeEStavM72cq4J/eqcls6Jvei6aneKSFlLtDz9g==} engines: {node: '>=12'} '@tanstack/store@0.5.5': @@ -1882,8 +1799,8 @@ packages: '@types/react-dom': optional: true - '@tremor/react@3.18.3': - resolution: {integrity: sha512-7QyGE2W9f2FpwH24TKy3/mqBgLl4sHZeQcXP3rxXZ8W2AUq7AVaG1+vIT3xXxISrkh7zknjWlZsuhoF8NWNVDw==} + '@tremor/react@3.18.1': + resolution: {integrity: sha512-Tyt6pDsPUyVr6cIDZIVgO2gIdLMG7R8oqhA/i/yBnAAAsljfIAIV6azP/jIVIqbvar6mczm5wwbSX8eOfc0yVQ==} peerDependencies: react: ^18.0.0 react-dom: '>=16.6.0' @@ -1906,8 +1823,8 @@ packages: '@tsconfig/node18@18.2.4': resolution: {integrity: sha512-5xxU8vVs9/FNcvm3gE07fPbn9tl6tqGGWA9tSlwsUEkBxtRnTsNmwrV8gasZ9F/EobaSv9+nu8AxUKccw77JpQ==} - '@txnlab/use-wallet-react@3.7.2': - resolution: {integrity: sha512-ofVE3XHNkkQ8wAgL1Pf4CcL/2DizlruPx64mjjjmgbvjQ90ldcCNuvxK0k/Tc/BobJcmJqTugM3T9t7JxEIT7w==} + '@txnlab/use-wallet-react@3.7.0': + resolution: {integrity: sha512-eoRPilP+iaSoSr2IP8TbnRvu5cM4ap+5huyhbKqprt/hplel+bn2puHO94hmzJZdZIvZBEjyYnq/9OGui2gJ4A==} peerDependencies: '@blockshake/defly-connect': ^1.1.6 '@magic-ext/algorand': ^23.6.0 @@ -1938,8 +1855,8 @@ packages: magic-sdk: optional: true - '@txnlab/use-wallet@3.7.2': - resolution: {integrity: sha512-UfvgCeZrJ4sItU/WrcDtdFf+3V9c9Gi7umthlQRHJ3iNCWFZs136GGSCDhy/tb6pUgpRPP2Lz/8bUuzAcx+Cgg==} + '@txnlab/use-wallet@3.7.0': + resolution: {integrity: sha512-fZpGpmp+F4csTE9BYhbObuAdRIocmtWXToU08KWcQrMLkLOyx49a0Gu3Q0DwlMFFiv9kI6sHJ7XquwhCIksMbQ==} peerDependencies: '@agoralabs-sh/avm-web-provider': ^1.6.2 '@blockshake/defly-connect': ^1.1.6 @@ -2025,8 +1942,8 @@ packages: '@types/mute-stream@0.0.4': resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} - '@types/node@20.16.10': - resolution: {integrity: sha512-vQUKgWTjEIRFCvK6CyriPH3MZYiYlNy0fKiEYHWbcoWLEgs4opurGGKlebrTLqdSMIbXImH6XExNiIyNUv3WpA==} + '@types/node@20.16.5': + resolution: {integrity: sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==} '@types/node@20.16.7': resolution: {integrity: sha512-QkDQjAY3gkvJNcZOWwzy3BN34RweT0OQ9zJyvLCU0kSK22dO2QYh/NHGfbEAYylPYzRB1/iXcojS79wOg5gFSw==} @@ -2043,8 +1960,8 @@ packages: '@types/react-dom@18.3.0': resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} - '@types/react@18.3.11': - resolution: {integrity: sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==} + '@types/react@18.3.5': + resolution: {integrity: sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==} '@types/statuses@2.0.5': resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==} @@ -2124,17 +2041,17 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@vitejs/plugin-react@4.3.2': - resolution: {integrity: sha512-hieu+o05v4glEBucTcKMK3dlES0OeJlD9YVOAPraVMOInBCwzumaIFiUjr4bHK7NPgnAHgiskUoceKercrN8vg==} + '@vitejs/plugin-react@4.3.1': + resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 - '@vitest/coverage-v8@2.1.2': - resolution: {integrity: sha512-b7kHrFrs2urS0cOk5N10lttI8UdJ/yP3nB4JYTREvR5o18cR99yPpK4gK8oQgI42BVv0ILWYUSYB7AXkAUDc0g==} + '@vitest/coverage-v8@2.1.1': + resolution: {integrity: sha512-md/A7A3c42oTT8JUHSqjP5uKTWJejzUW4jalpvs+rZ27gsURsMU8DEb+8Jf8C6Kj2gwfSHJqobDNBuoqlm0cFw==} peerDependencies: - '@vitest/browser': 2.1.2 - vitest: 2.1.2 + '@vitest/browser': 2.1.1 + vitest: 2.1.1 peerDependenciesMeta: '@vitest/browser': optional: true @@ -2142,9 +2059,6 @@ packages: '@vitest/expect@2.1.1': resolution: {integrity: sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==} - '@vitest/expect@2.1.2': - resolution: {integrity: sha512-FEgtlN8mIUSEAAnlvn7mP8vzaWhEaAEvhSXCqrsijM7K6QqjB11qoRZYEd4AKSCDz8p0/+yH5LzhZ47qt+EyPg==} - '@vitest/mocker@2.1.1': resolution: {integrity: sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==} peerDependencies: @@ -2157,48 +2071,21 @@ packages: vite: optional: true - '@vitest/mocker@2.1.2': - resolution: {integrity: sha512-ExElkCGMS13JAJy+812fw1aCv2QO/LBK6CyO4WOPAzLTmve50gydOlWhgdBJPx2ztbADUq3JVI0C5U+bShaeEA==} - peerDependencies: - '@vitest/spy': 2.1.2 - msw: ^2.3.5 - vite: ^5.0.0 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true - '@vitest/pretty-format@2.1.1': resolution: {integrity: sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==} - '@vitest/pretty-format@2.1.2': - resolution: {integrity: sha512-FIoglbHrSUlOJPDGIrh2bjX1sNars5HbxlcsFKCtKzu4+5lpsRhOCVcuzp0fEhAGHkPZRIXVNzPcpSlkoZ3LuA==} - '@vitest/runner@2.1.1': resolution: {integrity: sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==} - '@vitest/runner@2.1.2': - resolution: {integrity: sha512-UCsPtvluHO3u7jdoONGjOSil+uON5SSvU9buQh3lP7GgUXHp78guN1wRmZDX4wGK6J10f9NUtP6pO+SFquoMlw==} - '@vitest/snapshot@2.1.1': resolution: {integrity: sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==} - '@vitest/snapshot@2.1.2': - resolution: {integrity: sha512-xtAeNsZ++aRIYIUsek7VHzry/9AcxeULlegBvsdLncLmNCR6tR8SRjn8BbDP4naxtccvzTqZ+L1ltZlRCfBZFA==} - '@vitest/spy@2.1.1': resolution: {integrity: sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==} - '@vitest/spy@2.1.2': - resolution: {integrity: sha512-GSUi5zoy+abNRJwmFhBDC0yRuVUn8WMlQscvnbbXdKLXX9dE59YbfwXxuJ/mth6eeqIzofU8BB5XDo/Ns/qK2A==} - '@vitest/utils@2.1.1': resolution: {integrity: sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==} - '@vitest/utils@2.1.2': - resolution: {integrity: sha512-zMO2KdYy6mx56btx9JvAqAZ6EyS3g49krMPPrgOp1yxGZiA93HumGk+bZ5jIZtOg5/VBYl5eBmGRQHqq4FG6uQ==} - '@walletconnect/browser-utils@1.8.0': resolution: {integrity: sha512-Wcqqx+wjxIo9fv6eBUFHPsW1y/bGWWRboni5dfD8PtOmrihrEpOCmvRJe4rfl7xgJW8Ea9UqKEaq0bIRLHlK4A==} @@ -2256,17 +2143,17 @@ packages: '@walletconnect/logger@2.1.2': resolution: {integrity: sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==} - '@walletconnect/modal-core@2.7.0': - resolution: {integrity: sha512-oyMIfdlNdpyKF2kTJowTixZSo0PGlCJRdssUN/EZdA6H6v03hZnf09JnwpljZNfir2M65Dvjm/15nGrDQnlxSA==} + '@walletconnect/modal-core@2.6.2': + resolution: {integrity: sha512-cv8ibvdOJQv2B+nyxP9IIFdxvQznMz8OOr/oR/AaUZym4hjXNL/l1a2UlSQBXrVjo3xxbouMxLb3kBsHoYP2CA==} - '@walletconnect/modal-sign-html@2.7.0': - resolution: {integrity: sha512-KPQxffA49rvG1s9/fE4u6pZZODZq8iDFd/oXcpeaXppIXPN3ZowJHMiLMl5Y26duRsHG8ce9z+AtfVIItjFWgg==} + '@walletconnect/modal-sign-html@2.6.2': + resolution: {integrity: sha512-p9VhWTikRfUIdUUrOsHj0vRFx0FmI6qraE6kVqxOeLwO9OoLQ6xpIRYpYwPrmASMaXRKFbLul1R3F1MKpBPvcA==} - '@walletconnect/modal-ui@2.7.0': - resolution: {integrity: sha512-gERYvU7D7K1ANCN/8vUgsE0d2hnRemfAFZ2novm9aZBg7TEd/4EgB+AqbJ+1dc7GhOL6dazckVq78TgccHb7mQ==} + '@walletconnect/modal-ui@2.6.2': + resolution: {integrity: sha512-rbdstM1HPGvr7jprQkyPggX7rP4XiCG85ZA+zWBEX0dVQg8PpAgRUqpeub4xQKDgY7pY/xLRXSiCVdWGqvG2HA==} - '@walletconnect/modal@2.7.0': - resolution: {integrity: sha512-RQVt58oJ+rwqnPcIvRFeMGKuXb9qkgSmwz4noF8JZGUym3gUAzVs+uW2NQ1Owm9XOJAV+sANrtJ+VoVq1ftElw==} + '@walletconnect/modal@2.6.2': + resolution: {integrity: sha512-eFopgKi8AjKf/0U4SemvcYw9zlLpx9njVN8sf6DAkowC2Md0gPU/UNEbH1Wwj407pEKnEds98pKWib1NN1ACoA==} '@walletconnect/randombytes@1.0.3': resolution: {integrity: sha512-35lpzxcHFbTN3ABefC9W+uBpNZl1GC4Wpx0ed30gibfO/y9oLdy1NznbV96HARQKSBV9J9M/rrtIvf6a23jfYw==} @@ -2459,14 +2346,14 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - axios-cache-interceptor@1.6.0: - resolution: {integrity: sha512-xuo4mZckPQmNV50bJpsMmGfpFV8SXsUWWUVKf1DXQy7t9p+6Pan9zrD3icAlCIdoYFw/ZJFKV6nUVqy8j0XCLQ==} + axios-cache-interceptor@1.5.3: + resolution: {integrity: sha512-kPgGId9XW7tR+VF7hgSkqF4f6FrV4ecCyKxjkD9v1hNJ4sXSAskocr7SMKaVHVvrbzVeruwB6yL6Y9/lY1ApKg==} engines: {node: '>=12'} peerDependencies: axios: ^1 - axios@1.7.7: - resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} + axios@1.7.4: + resolution: {integrity: sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==} babel-dead-code-elimination@1.0.6: resolution: {integrity: sha512-JxFi9qyRJpN0LjEbbjbN8g0ux71Qppn9R8Qe3k6QzHg2CaKsbUQtbn307LQGiDLGjV6JCtEFqfxzVig9MyDCHQ==} @@ -2477,8 +2364,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - big.js@6.2.2: - resolution: {integrity: sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==} + big.js@6.2.1: + resolution: {integrity: sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==} bignumber.js@9.1.2: resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} @@ -2539,11 +2426,6 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - browserslist@4.24.0: - resolution: {integrity: sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - buffer-xor@1.0.3: resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} @@ -2585,9 +2467,6 @@ packages: caniuse-lite@1.0.30001660: resolution: {integrity: sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==} - caniuse-lite@1.0.30001667: - resolution: {integrity: sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==} - capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} @@ -2973,9 +2852,6 @@ packages: electron-to-chromium@1.5.20: resolution: {integrity: sha512-74mdl6Fs1HHzK9SUX4CKFxAtAe3nUns48y79TskHNAG6fGOlLfyKA4j855x+0b5u8rWJIrlaG9tcTPstMlwjIw==} - electron-to-chromium@1.5.33: - resolution: {integrity: sha512-+cYTcFB1QqD4j4LegwLfpCNxifb6dDFUAwk6RsLusCwIaZI6or2f+q8rs5tTB2YC53HhOlIbEaqHMAAC8IOIwA==} - elliptic@6.5.7: resolution: {integrity: sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==} @@ -3671,11 +3547,6 @@ packages: engines: {node: '>=4'} hasBin: true - jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} - hasBin: true - json-bigint@1.0.0: resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} @@ -3774,8 +3645,8 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lucide-react@0.447.0: - resolution: {integrity: sha512-SZ//hQmvi+kDKrNepArVkYK7/jfeZ5uFNEnYmd45RKZcbGD78KLnrcNXmgeg6m+xNHFvTG+CblszXCy4n6DN4w==} + lucide-react@0.439.0: + resolution: {integrity: sha512-PafSWvDTpxdtNEndS2HIHxcNAbd54OaqSYJO90/b63rab2HWYqDbH194j0i82ZFdWOAcf0AHinRykXRRK2PJbw==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc @@ -3880,8 +3751,8 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - msw@2.4.9: - resolution: {integrity: sha512-1m8xccT6ipN4PTqLinPwmzhxQREuxaEJYdx4nIbggxP8aM7r1e71vE7RtOUSQoAm1LydjGfZKy7370XD/tsuYg==} + msw@2.4.4: + resolution: {integrity: sha512-iuM0qGs4YmgYCLH+xqb07w2e/e4fYmsx3+WHVlIOUA34TW1sw+wRpNmOlXnLDkw/T7233Jnm6t+aNf4v2E3e2Q==} engines: {node: '>=18'} hasBin: true peerDependencies: @@ -4162,13 +4033,13 @@ packages: pkg-types@1.2.0: resolution: {integrity: sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==} - playwright-core@1.47.2: - resolution: {integrity: sha512-3JvMfF+9LJfe16l7AbSmU555PaTl2tPyQsVInqm3id16pdDfvZ8TTZ/pyzmkbDrZTQefyzU7AIHlZqQnxpqHVQ==} + playwright-core@1.47.0: + resolution: {integrity: sha512-1DyHT8OqkcfCkYUD9zzUTfg7EfTd+6a8MkD/NWOvjo0u/SCNd5YmY/lJwFvUZOxJbWNds+ei7ic2+R/cRz/PDg==} engines: {node: '>=18'} hasBin: true - playwright@1.47.2: - resolution: {integrity: sha512-nx1cLMmQWqmA3UsnjaaokyoUpdVaaDhJhMoxX2qj3McpjnsqFHs516QAKYhqHAgOP+oCFTEOCOAaD1RgD/RQfA==} + playwright@1.47.0: + resolution: {integrity: sha512-jOWiRq2pdNAX/mwLiwFYnPHpEZ4rM+fRSQpRHwEwZlP2PUANvL3+aJOF/bvISMhFD30rqMxUB4RJx9aQbfh4Ww==} engines: {node: '>=18'} hasBin: true @@ -4221,8 +4092,8 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.4.47: - resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} + postcss@8.4.45: + resolution: {integrity: sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -4372,8 +4243,8 @@ packages: '@types/react': optional: true - react-remove-scroll@2.6.0: - resolution: {integrity: sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==} + react-remove-scroll@2.5.7: + resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==} engines: {node: '>=10'} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -4718,16 +4589,19 @@ packages: tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - tailwind-merge@2.5.3: - resolution: {integrity: sha512-d9ZolCAIzom1nf/5p4LdD5zvjmgSxY0BGgdSvmXIoMYAiPdAW/dSpP7joCDYFY7r/HkEa2qmPtkgsu0xjQeQtw==} + tailwind-merge@1.14.0: + resolution: {integrity: sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==} + + tailwind-merge@2.5.2: + resolution: {integrity: sha512-kjEBm+pvD+6eAwzJL2Bi+02/9LFLal1Gs61+QB7HvTfQQ0aXwC5LGT8PEt1gS0CWKktKe6ysPTAy3cBC5MeiIg==} tailwindcss-animate@1.0.7: resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} peerDependencies: tailwindcss: '>=3.0.0 || insiders' - tailwindcss@3.4.13: - resolution: {integrity: sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw==} + tailwindcss@3.4.10: + resolution: {integrity: sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w==} engines: {node: '>=14.0.0'} hasBin: true @@ -4833,8 +4707,8 @@ packages: tslib@2.7.0: resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} - tsx@4.19.1: - resolution: {integrity: sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==} + tsx@4.19.0: + resolution: {integrity: sha512-bV30kM7bsLZKZIOCHeMNVMJ32/LuJzLVajkQI/qf92J2Qr08ueLQvW00PUZGiuLPP760UINwupgUj8qrSCPUKg==} engines: {node: '>=18.0.0'} hasBin: true @@ -5063,18 +4937,13 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite-node@2.1.2: - resolution: {integrity: sha512-HPcGNN5g/7I2OtPjLqgOtCRu/qhVvBxTUD3qzitmL0SrG1cWFzxzhMDWussxSbrRYWqnKf8P2jiNhPMSN+ymsQ==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - vite-plugin-node-polyfills@0.22.0: resolution: {integrity: sha512-F+G3LjiGbG8QpbH9bZ//GSBr9i1InSTkaulfUHFa9jkLqVGORFBoqc2A/Yu5Mmh1kNAbiAeKeK+6aaQUf3x0JA==} peerDependencies: vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 - vite@5.4.8: - resolution: {integrity: sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==} + vite@5.4.6: + resolution: {integrity: sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -5129,31 +4998,6 @@ packages: jsdom: optional: true - vitest@2.1.2: - resolution: {integrity: sha512-veNjLizOMkRrJ6xxb+pvxN6/QAWg95mzcRjtmkepXdN87FNfxAss9RKe2far/G9cQpipfgP2taqg0KiWsquj8A==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.1.2 - '@vitest/ui': 2.1.2 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - vlq@2.0.4: resolution: {integrity: sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA==} @@ -5347,7 +5191,7 @@ snapshots: '@algorandfoundation/tealscript@0.103.0': dependencies: '@microsoft/tsdoc': 0.14.2 - '@playwright/test': 1.47.2 + '@playwright/test': 1.47.0 argparse: 2.0.1 dotenv: 16.4.5 glob: 10.4.5 @@ -5373,15 +5217,8 @@ snapshots: '@babel/highlight': 7.24.7 picocolors: 1.1.0 - '@babel/code-frame@7.25.7': - dependencies: - '@babel/highlight': 7.25.7 - picocolors: 1.1.0 - '@babel/compat-data@7.25.4': {} - '@babel/compat-data@7.25.7': {} - '@babel/core@7.25.2': dependencies: '@ampproject/remapping': 2.3.0 @@ -5402,26 +5239,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/core@7.25.7': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.25.7 - '@babel/generator': 7.25.7 - '@babel/helper-compilation-targets': 7.25.7 - '@babel/helper-module-transforms': 7.25.7(@babel/core@7.25.7) - '@babel/helpers': 7.25.7 - '@babel/parser': 7.25.7 - '@babel/template': 7.25.7 - '@babel/traverse': 7.25.7 - '@babel/types': 7.25.7 - convert-source-map: 2.0.0 - debug: 4.3.7 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - '@babel/generator@7.25.6': dependencies: '@babel/types': 7.25.6 @@ -5429,13 +5246,6 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 - '@babel/generator@7.25.7': - dependencies: - '@babel/types': 7.25.7 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 3.0.2 - '@babel/helper-compilation-targets@7.25.2': dependencies: '@babel/compat-data': 7.25.4 @@ -5444,14 +5254,6 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-compilation-targets@7.25.7': - dependencies: - '@babel/compat-data': 7.25.7 - '@babel/helper-validator-option': 7.25.7 - browserslist: 4.24.0 - lru-cache: 5.1.1 - semver: 6.3.1 - '@babel/helper-module-imports@7.24.7': dependencies: '@babel/traverse': 7.25.6 @@ -5459,13 +5261,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.25.7': - dependencies: - '@babel/traverse': 7.25.7 - '@babel/types': 7.25.7 - transitivePeerDependencies: - - supports-color - '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -5476,20 +5271,8 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.25.7(@babel/core@7.25.7)': - dependencies: - '@babel/core': 7.25.7 - '@babel/helper-module-imports': 7.25.7 - '@babel/helper-simple-access': 7.25.7 - '@babel/helper-validator-identifier': 7.25.7 - '@babel/traverse': 7.25.7 - transitivePeerDependencies: - - supports-color - '@babel/helper-plugin-utils@7.24.8': {} - '@babel/helper-plugin-utils@7.25.7': {} - '@babel/helper-simple-access@7.24.7': dependencies: '@babel/traverse': 7.25.6 @@ -5497,35 +5280,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-simple-access@7.25.7': - dependencies: - '@babel/traverse': 7.25.7 - '@babel/types': 7.25.7 - transitivePeerDependencies: - - supports-color - '@babel/helper-string-parser@7.24.8': {} - '@babel/helper-string-parser@7.25.7': {} - '@babel/helper-validator-identifier@7.24.7': {} - '@babel/helper-validator-identifier@7.25.7': {} - '@babel/helper-validator-option@7.24.8': {} - '@babel/helper-validator-option@7.25.7': {} - '@babel/helpers@7.25.6': dependencies: '@babel/template': 7.25.0 '@babel/types': 7.25.6 - '@babel/helpers@7.25.7': - dependencies: - '@babel/template': 7.25.7 - '@babel/types': 7.25.7 - '@babel/highlight@7.24.7': dependencies: '@babel/helper-validator-identifier': 7.24.7 @@ -5533,30 +5298,19 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.0 - '@babel/highlight@7.25.7': - dependencies: - '@babel/helper-validator-identifier': 7.25.7 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.1.0 - '@babel/parser@7.25.6': dependencies: '@babel/types': 7.25.6 - '@babel/parser@7.25.7': + '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)': dependencies: - '@babel/types': 7.25.7 - - '@babel/plugin-syntax-jsx@7.25.7(@babel/core@7.25.7)': - dependencies: - '@babel/core': 7.25.7 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-typescript@7.25.7(@babel/core@7.25.7)': + '@babel/plugin-syntax-typescript@7.25.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.25.7 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 '@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.25.2)': dependencies: @@ -5578,12 +5332,6 @@ snapshots: '@babel/parser': 7.25.6 '@babel/types': 7.25.6 - '@babel/template@7.25.7': - dependencies: - '@babel/code-frame': 7.25.7 - '@babel/parser': 7.25.7 - '@babel/types': 7.25.7 - '@babel/traverse@7.25.6': dependencies: '@babel/code-frame': 7.24.7 @@ -5596,30 +5344,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/traverse@7.25.7': - dependencies: - '@babel/code-frame': 7.25.7 - '@babel/generator': 7.25.7 - '@babel/parser': 7.25.7 - '@babel/template': 7.25.7 - '@babel/types': 7.25.7 - debug: 4.3.7 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - '@babel/types@7.25.6': dependencies: '@babel/helper-string-parser': 7.24.8 '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 - '@babel/types@7.25.7': - dependencies: - '@babel/helper-string-parser': 7.25.7 - '@babel/helper-validator-identifier': 7.25.7 - to-fast-properties: 2.0.0 - '@bcoe/v8-coverage@0.2.3': {} '@blockshake/defly-connect@1.1.6(algosdk@2.9.0)': @@ -5856,9 +5586,9 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@headlessui/tailwindcss@0.2.1(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)))': + '@headlessui/tailwindcss@0.2.1(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4)))': dependencies: - tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)) + tailwindcss: 3.4.10(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4)) '@hookform/resolvers@3.9.0(react-hook-form@7.53.0(react@18.3.1))': dependencies: @@ -5995,7 +5725,7 @@ snapshots: '@motionone/dom': 10.18.0 tslib: 2.7.0 - '@mswjs/interceptors@0.35.9': + '@mswjs/interceptors@0.35.1': dependencies: '@open-draft/deferred-promise': 2.2.0 '@open-draft/logger': 0.3.0 @@ -6104,492 +5834,486 @@ snapshots: '@pkgr/core@0.1.1': {} - '@playwright/test@1.47.2': + '@playwright/test@1.47.0': dependencies: - playwright: 1.47.2 + playwright: 1.47.0 '@radix-ui/number@1.1.0': {} '@radix-ui/primitive@1.1.0': {} - '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@radix-ui/react-avatar@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-avatar@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@radix-ui/react-checkbox@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-checkbox@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.5)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@radix-ui/react-collapsible@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-collapsible@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.5)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.11)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.11 - - '@radix-ui/react-context@1.1.0(@types/react@18.3.11)(react@18.3.1)': + '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.5)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 - '@radix-ui/react-context@1.1.1(@types/react@18.3.11)(react@18.3.1)': + '@radix-ui/react-context@1.1.0(@types/react@18.3.5)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 - '@radix-ui/react-dialog@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dialog@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.3.1) aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.6.0(@types/react@18.3.11)(react@18.3.1) + react-remove-scroll: 2.5.7(@types/react@18.3.5)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@radix-ui/react-direction@1.1.0(@types/react@18.3.11)(react@18.3.1)': + '@radix-ui/react-direction@1.1.0(@types/react@18.3.5)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 - '@radix-ui/react-dismissable-layer@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.5)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@radix-ui/react-dropdown-menu@2.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dropdown-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-menu': 2.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-menu': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@radix-ui/react-focus-guards@1.1.1(@types/react@18.3.11)(react@18.3.1)': + '@radix-ui/react-focus-guards@1.1.0(@types/react@18.3.5)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 - '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@radix-ui/react-hover-card@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-hover-card@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 '@radix-ui/react-icons@1.3.0(react@18.3.1)': dependencies: react: 18.3.1 - '@radix-ui/react-id@1.1.0(@types/react@18.3.11)(react@18.3.1)': + '@radix-ui/react-id@1.1.0(@types/react@18.3.5)(react@18.3.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 - '@radix-ui/react-label@2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-label@2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@radix-ui/react-menu@2.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1) aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.6.0(@types/react@18.3.11)(react@18.3.1) + react-remove-scroll: 2.5.7(@types/react@18.3.5)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@radix-ui/react-navigation-menu@1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-navigation-menu@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@radix-ui/react-popover@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-popover@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.3.1) aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.6.0(@types/react@18.3.11)(react@18.3.1) + react-remove-scroll: 2.5.7(@types/react@18.3.5)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@floating-ui/react-dom': 2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.5)(react@18.3.1) '@radix-ui/rect': 1.1.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@radix-ui/react-portal@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-portal@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@radix-ui/react-presence@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-presence@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.5)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@radix-ui/react-scroll-area@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-scroll-area@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/number': 1.1.0 '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@radix-ui/react-select@2.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-select@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/number': 1.1.0 '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.6.0(@types/react@18.3.11)(react@18.3.1) + react-remove-scroll: 2.5.7(@types/react@18.3.5)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@radix-ui/react-separator@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-separator@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@radix-ui/react-slot@1.1.0(@types/react@18.3.11)(react@18.3.1)': + '@radix-ui/react-slot@1.1.0(@types/react@18.3.5)(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 - '@radix-ui/react-switch@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-switch@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.5)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@radix-ui/react-tooltip@1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-tooltip@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.11)(react@18.3.1)': + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.5)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 - '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.11)(react@18.3.1)': + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.5)(react@18.3.1)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 - '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.11)(react@18.3.1)': + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.5)(react@18.3.1)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 - '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.11)(react@18.3.1)': + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.5)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 - '@radix-ui/react-use-previous@1.1.0(@types/react@18.3.11)(react@18.3.1)': + '@radix-ui/react-use-previous@1.1.0(@types/react@18.3.5)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 - '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.11)(react@18.3.1)': + '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.5)(react@18.3.1)': dependencies: '@radix-ui/rect': 1.1.0 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 - '@radix-ui/react-use-size@1.1.0(@types/react@18.3.11)(react@18.3.1)': + '@radix-ui/react-use-size@1.1.0(@types/react@18.3.5)(react@18.3.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 - '@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 '@radix-ui/rect@1.1.0': {} @@ -6740,33 +6464,32 @@ snapshots: '@stablelib/random': 1.0.2 '@stablelib/wipe': 1.0.1 - '@tanstack/history@1.61.1': {} + '@tanstack/history@1.51.7': {} - '@tanstack/query-core@5.59.0': {} + '@tanstack/query-core@5.55.3': {} - '@tanstack/query-devtools@5.58.0': {} + '@tanstack/query-devtools@5.55.1': {} - '@tanstack/react-query-devtools@5.59.0(@tanstack/react-query@5.59.0(react@18.3.1))(react@18.3.1)': + '@tanstack/react-query-devtools@5.55.2(@tanstack/react-query@5.55.3(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/query-devtools': 5.58.0 - '@tanstack/react-query': 5.59.0(react@18.3.1) + '@tanstack/query-devtools': 5.55.1 + '@tanstack/react-query': 5.55.3(react@18.3.1) react: 18.3.1 - '@tanstack/react-query@5.59.0(react@18.3.1)': + '@tanstack/react-query@5.55.3(react@18.3.1)': dependencies: - '@tanstack/query-core': 5.59.0 + '@tanstack/query-core': 5.55.3 react: 18.3.1 - '@tanstack/react-router@1.62.0(@tanstack/router-generator@1.58.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-router@1.56.5(@tanstack/router-generator@1.57.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/history': 1.61.1 + '@tanstack/history': 1.51.7 '@tanstack/react-store': 0.5.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/router-generator': 1.57.9 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - optionalDependencies: - '@tanstack/router-generator': 1.58.12 '@tanstack/react-store@0.5.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -6787,9 +6510,9 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@tanstack/router-devtools@1.62.0(@tanstack/react-router@1.62.0(@tanstack/router-generator@1.58.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/router-devtools@1.56.5(@tanstack/react-router@1.56.5(@tanstack/router-generator@1.57.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/react-router': 1.62.0(@tanstack/router-generator@1.58.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-router': 1.56.5(@tanstack/router-generator@1.57.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) clsx: 2.1.1 goober: 2.1.14(csstype@3.1.3) react: 18.3.1 @@ -6797,24 +6520,24 @@ snapshots: transitivePeerDependencies: - csstype - '@tanstack/router-generator@1.58.12': + '@tanstack/router-generator@1.57.9': dependencies: '@tanstack/virtual-file-routes': 1.56.0 prettier: 3.3.3 - tsx: 4.19.1 + tsx: 4.19.0 zod: 3.23.8 - '@tanstack/router-plugin@1.62.0(vite@5.4.8(@types/node@20.16.10))': - dependencies: - '@babel/core': 7.25.7 - '@babel/generator': 7.25.7 - '@babel/parser': 7.25.7 - '@babel/plugin-syntax-jsx': 7.25.7(@babel/core@7.25.7) - '@babel/plugin-syntax-typescript': 7.25.7(@babel/core@7.25.7) - '@babel/template': 7.25.7 - '@babel/traverse': 7.25.7 - '@babel/types': 7.25.7 - '@tanstack/router-generator': 1.58.12 + '@tanstack/router-plugin@1.57.9(vite@5.4.6(@types/node@20.16.5))': + dependencies: + '@babel/core': 7.25.2 + '@babel/generator': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-syntax-typescript': 7.25.4(@babel/core@7.25.2) + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + '@tanstack/router-generator': 1.57.9 '@tanstack/virtual-file-routes': 1.56.0 '@types/babel__core': 7.20.5 '@types/babel__generator': 7.6.8 @@ -6825,14 +6548,14 @@ snapshots: unplugin: 1.14.1 zod: 3.23.8 optionalDependencies: - vite: 5.4.8(@types/node@20.16.10) + vite: 5.4.6(@types/node@20.16.5) transitivePeerDependencies: - supports-color - webpack-sources - '@tanstack/router-vite-plugin@1.62.0(vite@5.4.8(@types/node@20.16.10))': + '@tanstack/router-vite-plugin@1.56.4(vite@5.4.6(@types/node@20.16.5))': dependencies: - '@tanstack/router-plugin': 1.62.0(vite@5.4.8(@types/node@20.16.10)) + '@tanstack/router-plugin': 1.57.9(vite@5.4.6(@types/node@20.16.5)) transitivePeerDependencies: - '@rsbuild/core' - supports-color @@ -6869,28 +6592,28 @@ snapshots: lodash: 4.17.21 redent: 3.0.0 - '@testing-library/react@16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@testing-library/react@16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.6 '@testing-library/dom': 10.4.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@tremor/react@3.18.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)))': + '@tremor/react@3.18.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4)))': dependencies: '@floating-ui/react': 0.19.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@headlessui/tailwindcss': 0.2.1(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))) + '@headlessui/tailwindcss': 0.2.1(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4))) date-fns: 3.6.0 react: 18.3.1 react-day-picker: 8.10.1(date-fns@3.6.0)(react@18.3.1) react-dom: 18.3.1(react@18.3.1) react-transition-state: 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) recharts: 2.12.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - tailwind-merge: 2.5.3 + tailwind-merge: 1.14.0 transitivePeerDependencies: - tailwindcss @@ -6911,29 +6634,29 @@ snapshots: '@tsconfig/node18@18.2.4': {} - '@txnlab/use-wallet-react@3.7.2(@blockshake/defly-connect@1.1.6(algosdk@2.9.0))(@perawallet/connect@1.3.4(algosdk@2.9.0))(@walletconnect/modal@2.7.0(@types/react@18.3.11)(react@18.3.1))(algosdk@2.9.0)(lute-connect@1.4.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@txnlab/use-wallet-react@3.7.0(@blockshake/defly-connect@1.1.6(algosdk@2.9.0))(@perawallet/connect@1.3.4(algosdk@2.9.0))(@walletconnect/modal@2.6.2(@types/react@18.3.5)(react@18.3.1))(algosdk@2.9.0)(lute-connect@1.4.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/react-store': 0.5.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@txnlab/use-wallet': 3.7.2(@blockshake/defly-connect@1.1.6(algosdk@2.9.0))(@perawallet/connect@1.3.4(algosdk@2.9.0))(@walletconnect/modal@2.7.0(@types/react@18.3.11)(react@18.3.1))(algosdk@2.9.0)(lute-connect@1.4.1) + '@txnlab/use-wallet': 3.7.0(@blockshake/defly-connect@1.1.6(algosdk@2.9.0))(@perawallet/connect@1.3.4(algosdk@2.9.0))(@walletconnect/modal@2.6.2(@types/react@18.3.5)(react@18.3.1))(algosdk@2.9.0)(lute-connect@1.4.1) algosdk: 2.9.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@blockshake/defly-connect': 1.1.6(algosdk@2.9.0) '@perawallet/connect': 1.3.4(algosdk@2.9.0) - '@walletconnect/modal': 2.7.0(@types/react@18.3.11)(react@18.3.1) + '@walletconnect/modal': 2.6.2(@types/react@18.3.5)(react@18.3.1) lute-connect: 1.4.1 transitivePeerDependencies: - '@agoralabs-sh/avm-web-provider' - '@txnlab/use-wallet@3.7.2(@blockshake/defly-connect@1.1.6(algosdk@2.9.0))(@perawallet/connect@1.3.4(algosdk@2.9.0))(@walletconnect/modal@2.7.0(@types/react@18.3.11)(react@18.3.1))(algosdk@2.9.0)(lute-connect@1.4.1)': + '@txnlab/use-wallet@3.7.0(@blockshake/defly-connect@1.1.6(algosdk@2.9.0))(@perawallet/connect@1.3.4(algosdk@2.9.0))(@walletconnect/modal@2.6.2(@types/react@18.3.5)(react@18.3.1))(algosdk@2.9.0)(lute-connect@1.4.1)': dependencies: '@tanstack/store': 0.5.5 algosdk: 2.9.0 optionalDependencies: '@blockshake/defly-connect': 1.1.6(algosdk@2.9.0) '@perawallet/connect': 1.3.4(algosdk@2.9.0) - '@walletconnect/modal': 2.7.0(@types/react@18.3.11)(react@18.3.1) + '@walletconnect/modal': 2.6.2(@types/react@18.3.5)(react@18.3.1) lute-connect: 1.4.1 '@types/aria-query@5.0.4': {} @@ -6995,9 +6718,9 @@ snapshots: '@types/mute-stream@0.0.4': dependencies: - '@types/node': 20.16.10 + '@types/node': 22.7.4 - '@types/node@20.16.10': + '@types/node@20.16.5': dependencies: undici-types: 6.19.8 @@ -7011,16 +6734,16 @@ snapshots: '@types/prompts@2.4.9': dependencies: - '@types/node': 20.16.10 + '@types/node': 20.16.7 kleur: 3.0.3 '@types/prop-types@15.7.12': {} '@types/react-dom@18.3.0': dependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 - '@types/react@18.3.11': + '@types/react@18.3.5': dependencies: '@types/prop-types': 15.7.12 csstype: 3.1.3 @@ -7057,24 +6780,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.7.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2)': - dependencies: - '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 8.7.0(eslint@8.57.1)(typescript@5.6.2) - '@typescript-eslint/scope-manager': 8.7.0 - '@typescript-eslint/type-utils': 8.7.0(eslint@8.57.1)(typescript@5.6.2) - '@typescript-eslint/utils': 8.7.0(eslint@8.57.1)(typescript@5.6.2) - '@typescript-eslint/visitor-keys': 8.7.0 - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.6.2) - optionalDependencies: - typescript: 5.6.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.5.4)': dependencies: '@typescript-eslint/scope-manager': 8.7.0 @@ -7088,19 +6793,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.6.2)': - dependencies: - '@typescript-eslint/scope-manager': 8.7.0 - '@typescript-eslint/types': 8.7.0 - '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.2) - '@typescript-eslint/visitor-keys': 8.7.0 - debug: 4.3.7 - eslint: 8.57.1 - optionalDependencies: - typescript: 5.6.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/scope-manager@8.7.0': dependencies: '@typescript-eslint/types': 8.7.0 @@ -7118,18 +6810,6 @@ snapshots: - eslint - supports-color - '@typescript-eslint/type-utils@8.7.0(eslint@8.57.1)(typescript@5.6.2)': - dependencies: - '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.2) - '@typescript-eslint/utils': 8.7.0(eslint@8.57.1)(typescript@5.6.2) - debug: 4.3.7 - ts-api-utils: 1.3.0(typescript@5.6.2) - optionalDependencies: - typescript: 5.6.2 - transitivePeerDependencies: - - eslint - - supports-color - '@typescript-eslint/types@8.7.0': {} '@typescript-eslint/typescript-estree@8.7.0(typescript@5.5.4)': @@ -7147,21 +6827,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.7.0(typescript@5.6.2)': - dependencies: - '@typescript-eslint/types': 8.7.0 - '@typescript-eslint/visitor-keys': 8.7.0 - debug: 4.3.7 - fast-glob: 3.3.2 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.6.2) - optionalDependencies: - typescript: 5.6.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/utils@8.7.0(eslint@8.57.1)(typescript@5.5.4)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) @@ -7173,17 +6838,6 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@8.7.0(eslint@8.57.1)(typescript@5.6.2)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.7.0 - '@typescript-eslint/types': 8.7.0 - '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.2) - eslint: 8.57.1 - transitivePeerDependencies: - - supports-color - - typescript - '@typescript-eslint/visitor-keys@8.7.0': dependencies: '@typescript-eslint/types': 8.7.0 @@ -7191,18 +6845,18 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-react@4.3.2(vite@5.4.8(@types/node@20.16.10))': + '@vitejs/plugin-react@4.3.1(vite@5.4.6(@types/node@20.16.5))': dependencies: '@babel/core': 7.25.2 '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.25.2) '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.25.2) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.4.8(@types/node@20.16.10) + vite: 5.4.6(@types/node@20.16.5) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@2.1.2(vitest@2.1.2(@types/node@20.16.10)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2)))': + '@vitest/coverage-v8@2.1.1(vitest@2.1.1(@types/node@20.16.5)(jsdom@24.1.3)(msw@2.4.4(typescript@5.5.4)))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -7216,7 +6870,7 @@ snapshots: std-env: 3.7.0 test-exclude: 7.0.1 tinyrainbow: 1.2.0 - vitest: 2.1.2(@types/node@20.16.10)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2)) + vitest: 2.1.1(@types/node@20.16.5)(jsdom@24.1.3)(msw@2.4.4(typescript@5.5.4)) transitivePeerDependencies: - supports-color @@ -7227,81 +6881,49 @@ snapshots: chai: 5.1.1 tinyrainbow: 1.2.0 - '@vitest/expect@2.1.2': - dependencies: - '@vitest/spy': 2.1.2 - '@vitest/utils': 2.1.2 - chai: 5.1.1 - tinyrainbow: 1.2.0 - - '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(msw@2.4.9(typescript@5.5.4))(vite@5.4.8(@types/node@22.7.4))': + '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(msw@2.4.4(typescript@5.5.4))(vite@5.4.6(@types/node@20.16.5))': dependencies: '@vitest/spy': 2.1.1 estree-walker: 3.0.3 magic-string: 0.30.11 optionalDependencies: - msw: 2.4.9(typescript@5.5.4) - vite: 5.4.8(@types/node@22.7.4) + msw: 2.4.4(typescript@5.5.4) + vite: 5.4.6(@types/node@20.16.5) - '@vitest/mocker@2.1.2(@vitest/spy@2.1.2)(msw@2.4.9(typescript@5.6.2))(vite@5.4.8(@types/node@20.16.10))': + '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(msw@2.4.4(typescript@5.5.4))(vite@5.4.6(@types/node@22.7.4))': dependencies: - '@vitest/spy': 2.1.2 + '@vitest/spy': 2.1.1 estree-walker: 3.0.3 magic-string: 0.30.11 optionalDependencies: - msw: 2.4.9(typescript@5.6.2) - vite: 5.4.8(@types/node@20.16.10) + msw: 2.4.4(typescript@5.5.4) + vite: 5.4.6(@types/node@22.7.4) '@vitest/pretty-format@2.1.1': dependencies: tinyrainbow: 1.2.0 - '@vitest/pretty-format@2.1.2': - dependencies: - tinyrainbow: 1.2.0 - '@vitest/runner@2.1.1': dependencies: '@vitest/utils': 2.1.1 pathe: 1.1.2 - '@vitest/runner@2.1.2': - dependencies: - '@vitest/utils': 2.1.2 - pathe: 1.1.2 - '@vitest/snapshot@2.1.1': dependencies: '@vitest/pretty-format': 2.1.1 magic-string: 0.30.11 pathe: 1.1.2 - '@vitest/snapshot@2.1.2': - dependencies: - '@vitest/pretty-format': 2.1.2 - magic-string: 0.30.11 - pathe: 1.1.2 - '@vitest/spy@2.1.1': dependencies: tinyspy: 3.0.2 - '@vitest/spy@2.1.2': - dependencies: - tinyspy: 3.0.2 - '@vitest/utils@2.1.1': dependencies: '@vitest/pretty-format': 2.1.1 loupe: 3.1.1 tinyrainbow: 1.2.0 - '@vitest/utils@2.1.2': - dependencies: - '@vitest/pretty-format': 2.1.2 - loupe: 3.1.1 - tinyrainbow: 1.2.0 - '@walletconnect/browser-utils@1.8.0': dependencies: '@walletconnect/safe-json': 1.0.0 @@ -7459,16 +7081,16 @@ snapshots: '@walletconnect/safe-json': 1.0.2 pino: 7.11.0 - '@walletconnect/modal-core@2.7.0(@types/react@18.3.11)(react@18.3.1)': + '@walletconnect/modal-core@2.6.2(@types/react@18.3.5)(react@18.3.1)': dependencies: - valtio: 1.11.2(@types/react@18.3.11)(react@18.3.1) + valtio: 1.11.2(@types/react@18.3.5)(react@18.3.1) transitivePeerDependencies: - '@types/react' - react - '@walletconnect/modal-sign-html@2.7.0(@types/react@18.3.11)(react@18.3.1)': + '@walletconnect/modal-sign-html@2.6.2(@types/react@18.3.5)(react@18.3.1)': dependencies: - '@walletconnect/modal': 2.7.0(@types/react@18.3.11)(react@18.3.1) + '@walletconnect/modal': 2.6.2(@types/react@18.3.5)(react@18.3.1) '@walletconnect/sign-client': 2.10.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -7490,9 +7112,9 @@ snapshots: - uWebSockets.js - utf-8-validate - '@walletconnect/modal-ui@2.7.0(@types/react@18.3.11)(react@18.3.1)': + '@walletconnect/modal-ui@2.6.2(@types/react@18.3.5)(react@18.3.1)': dependencies: - '@walletconnect/modal-core': 2.7.0(@types/react@18.3.11)(react@18.3.1) + '@walletconnect/modal-core': 2.6.2(@types/react@18.3.5)(react@18.3.1) lit: 2.8.0 motion: 10.16.2 qrcode: 1.5.3 @@ -7500,10 +7122,10 @@ snapshots: - '@types/react' - react - '@walletconnect/modal@2.7.0(@types/react@18.3.11)(react@18.3.1)': + '@walletconnect/modal@2.6.2(@types/react@18.3.5)(react@18.3.1)': dependencies: - '@walletconnect/modal-core': 2.7.0(@types/react@18.3.11)(react@18.3.1) - '@walletconnect/modal-ui': 2.7.0(@types/react@18.3.11)(react@18.3.1) + '@walletconnect/modal-core': 2.6.2(@types/react@18.3.5)(react@18.3.1) + '@walletconnect/modal-ui': 2.6.2(@types/react@18.3.5)(react@18.3.1) transitivePeerDependencies: - '@types/react' - react @@ -7517,7 +7139,7 @@ snapshots: '@walletconnect/relay-api@1.0.11': dependencies: - '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-types': 1.0.3 '@walletconnect/relay-auth@1.0.4': dependencies: @@ -7811,28 +7433,28 @@ snapshots: atomic-sleep@1.0.0: {} - autoprefixer@10.4.20(postcss@8.4.47): + autoprefixer@10.4.20(postcss@8.4.45): dependencies: browserslist: 4.23.3 caniuse-lite: 1.0.30001660 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.0 - postcss: 8.4.47 + postcss: 8.4.45 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 - axios-cache-interceptor@1.6.0(axios@1.7.7): + axios-cache-interceptor@1.5.3(axios@1.7.4): dependencies: - axios: 1.7.7 + axios: 1.7.4 cache-parser: 1.2.5 fast-defer: 1.1.8 object-code: 1.3.3 - axios@1.7.7: + axios@1.7.4: dependencies: follow-redirects: 1.15.9 form-data: 4.0.0 @@ -7842,10 +7464,10 @@ snapshots: babel-dead-code-elimination@1.0.6: dependencies: - '@babel/core': 7.25.7 - '@babel/parser': 7.25.7 - '@babel/traverse': 7.25.7 - '@babel/types': 7.25.7 + '@babel/core': 7.25.2 + '@babel/parser': 7.25.6 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color @@ -7853,7 +7475,7 @@ snapshots: base64-js@1.5.1: {} - big.js@6.2.2: {} + big.js@6.2.1: {} bignumber.js@9.1.2: {} @@ -7937,13 +7559,6 @@ snapshots: node-releases: 2.0.18 update-browserslist-db: 1.1.0(browserslist@4.23.3) - browserslist@4.24.0: - dependencies: - caniuse-lite: 1.0.30001667 - electron-to-chromium: 1.5.33 - node-releases: 2.0.18 - update-browserslist-db: 1.1.0(browserslist@4.24.0) - buffer-xor@1.0.3: {} buffer@5.7.1: @@ -7983,8 +7598,6 @@ snapshots: caniuse-lite@1.0.30001660: {} - caniuse-lite@1.0.30001667: {} - capital-case@1.0.4: dependencies: no-case: 3.0.4 @@ -8368,8 +7981,6 @@ snapshots: electron-to-chromium@1.5.20: {} - electron-to-chromium@1.5.33: {} - elliptic@6.5.7: dependencies: bn.js: 4.12.0 @@ -9197,8 +8808,6 @@ snapshots: jsesc@2.5.2: {} - jsesc@3.0.2: {} - json-bigint@1.0.0: dependencies: bignumber.js: 9.1.2 @@ -9309,7 +8918,7 @@ snapshots: dependencies: yallist: 3.1.1 - lucide-react@0.447.0(react@18.3.1): + lucide-react@0.439.0(react@18.3.1): dependencies: react: 18.3.1 @@ -9407,13 +9016,13 @@ snapshots: ms@2.1.3: {} - msw@2.4.9(typescript@5.5.4): + msw@2.4.4(typescript@5.5.4): dependencies: '@bundled-es-modules/cookie': 2.0.0 '@bundled-es-modules/statuses': 1.0.1 '@bundled-es-modules/tough-cookie': 0.1.6 '@inquirer/confirm': 3.2.0 - '@mswjs/interceptors': 0.35.9 + '@mswjs/interceptors': 0.35.1 '@open-draft/until': 2.1.0 '@types/cookie': 0.6.0 '@types/statuses': 2.0.5 @@ -9428,29 +9037,6 @@ snapshots: yargs: 17.7.2 optionalDependencies: typescript: 5.5.4 - optional: true - - msw@2.4.9(typescript@5.6.2): - dependencies: - '@bundled-es-modules/cookie': 2.0.0 - '@bundled-es-modules/statuses': 1.0.1 - '@bundled-es-modules/tough-cookie': 0.1.6 - '@inquirer/confirm': 3.2.0 - '@mswjs/interceptors': 0.35.9 - '@open-draft/until': 2.1.0 - '@types/cookie': 0.6.0 - '@types/statuses': 2.0.5 - chalk: 4.1.2 - graphql: 16.9.0 - headers-polyfill: 4.0.3 - is-node-process: 1.2.0 - outvariant: 1.4.3 - path-to-regexp: 6.3.0 - strict-event-emitter: 0.5.1 - type-fest: 4.26.1 - yargs: 17.7.2 - optionalDependencies: - typescript: 5.6.2 multiformats@9.9.0: {} @@ -9747,11 +9333,11 @@ snapshots: mlly: 1.7.1 pathe: 1.1.2 - playwright-core@1.47.2: {} + playwright-core@1.47.0: {} - playwright@1.47.2: + playwright@1.47.0: dependencies: - playwright-core: 1.47.2 + playwright-core: 1.47.0 optionalDependencies: fsevents: 2.3.2 @@ -9761,29 +9347,29 @@ snapshots: possible-typed-array-names@1.0.0: {} - postcss-import@15.1.0(postcss@8.4.47): + postcss-import@15.1.0(postcss@8.4.45): dependencies: - postcss: 8.4.47 + postcss: 8.4.45 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - postcss-js@4.0.1(postcss@8.4.47): + postcss-js@4.0.1(postcss@8.4.45): dependencies: camelcase-css: 2.0.1 - postcss: 8.4.47 + postcss: 8.4.45 - postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)): + postcss-load-config@4.0.2(postcss@8.4.45)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4)): dependencies: lilconfig: 3.1.2 yaml: 2.5.1 optionalDependencies: - postcss: 8.4.47 - ts-node: 10.9.2(@types/node@20.16.10)(typescript@5.6.2) + postcss: 8.4.45 + ts-node: 10.9.2(@types/node@20.16.5)(typescript@5.5.4) - postcss-nested@6.2.0(postcss@8.4.47): + postcss-nested@6.2.0(postcss@8.4.45): dependencies: - postcss: 8.4.47 + postcss: 8.4.45 postcss-selector-parser: 6.1.2 postcss-selector-parser@6.1.2: @@ -9793,7 +9379,7 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.4.47: + postcss@8.4.45: dependencies: nanoid: 3.3.7 picocolors: 1.1.0 @@ -9934,24 +9520,24 @@ snapshots: react-refresh@0.14.2: {} - react-remove-scroll-bar@2.3.6(@types/react@18.3.11)(react@18.3.1): + react-remove-scroll-bar@2.3.6(@types/react@18.3.5)(react@18.3.1): dependencies: react: 18.3.1 - react-style-singleton: 2.2.1(@types/react@18.3.11)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.5)(react@18.3.1) tslib: 2.7.0 optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 - react-remove-scroll@2.6.0(@types/react@18.3.11)(react@18.3.1): + react-remove-scroll@2.5.7(@types/react@18.3.5)(react@18.3.1): dependencies: react: 18.3.1 - react-remove-scroll-bar: 2.3.6(@types/react@18.3.11)(react@18.3.1) - react-style-singleton: 2.2.1(@types/react@18.3.11)(react@18.3.1) + react-remove-scroll-bar: 2.3.6(@types/react@18.3.5)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.5)(react@18.3.1) tslib: 2.7.0 - use-callback-ref: 1.3.2(@types/react@18.3.11)(react@18.3.1) - use-sidecar: 1.1.2(@types/react@18.3.11)(react@18.3.1) + use-callback-ref: 1.3.2(@types/react@18.3.5)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.5)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 react-smooth@4.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: @@ -9961,14 +9547,14 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-style-singleton@2.2.1(@types/react@18.3.11)(react@18.3.1): + react-style-singleton@2.2.1(@types/react@18.3.5)(react@18.3.1): dependencies: get-nonce: 1.0.1 invariant: 2.2.4 react: 18.3.1 tslib: 2.7.0 optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: @@ -10321,13 +9907,15 @@ snapshots: tabbable@6.2.0: {} - tailwind-merge@2.5.3: {} + tailwind-merge@1.14.0: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))): + tailwind-merge@2.5.2: {} + + tailwindcss-animate@1.0.7(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4))): dependencies: - tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)) + tailwindcss: 3.4.10(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4)) - tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)): + tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -10343,11 +9931,11 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.0 - postcss: 8.4.47 - postcss-import: 15.1.0(postcss@8.4.47) - postcss-js: 4.0.1(postcss@8.4.47) - postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)) - postcss-nested: 6.2.0(postcss@8.4.47) + postcss: 8.4.45 + postcss-import: 15.1.0(postcss@8.4.45) + postcss-js: 4.0.1(postcss@8.4.45) + postcss-load-config: 4.0.2(postcss@8.4.45)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4)) + postcss-nested: 6.2.0(postcss@8.4.45) postcss-selector-parser: 6.1.2 resolve: 1.22.8 sucrase: 3.35.0 @@ -10417,10 +10005,6 @@ snapshots: dependencies: typescript: 5.5.4 - ts-api-utils@1.3.0(typescript@5.6.2): - dependencies: - typescript: 5.6.2 - ts-interface-checker@0.1.13: {} ts-morph@20.0.0: @@ -10428,21 +10012,21 @@ snapshots: '@ts-morph/common': 0.21.0 code-block-writer: 12.0.0 - ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2): + ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.16.10 + '@types/node': 20.16.5 acorn: 8.12.1 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.6.2 + typescript: 5.5.4 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 @@ -10457,7 +10041,7 @@ snapshots: tslib@2.7.0: {} - tsx@4.19.1: + tsx@4.19.0: dependencies: esbuild: 0.23.1 get-tsconfig: 4.8.0 @@ -10581,12 +10165,6 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.0 - update-browserslist-db@1.1.0(browserslist@4.24.0): - dependencies: - browserslist: 4.24.0 - escalade: 3.2.0 - picocolors: 1.1.0 - upper-case-first@2.0.2: dependencies: tslib: 2.7.0 @@ -10611,24 +10189,24 @@ snapshots: punycode: 1.4.1 qs: 6.13.0 - use-callback-ref@1.3.2(@types/react@18.3.11)(react@18.3.1): + use-callback-ref@1.3.2(@types/react@18.3.5)(react@18.3.1): dependencies: react: 18.3.1 tslib: 2.7.0 optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 use-debounce@10.0.3(react@18.3.1): dependencies: react: 18.3.1 - use-sidecar@1.1.2(@types/react@18.3.11)(react@18.3.1): + use-sidecar@1.1.2(@types/react@18.3.5)(react@18.3.1): dependencies: detect-node-es: 1.1.0 react: 18.3.1 tslib: 2.7.0 optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 use-sync-external-store@1.2.0(react@18.3.1): dependencies: @@ -10650,12 +10228,12 @@ snapshots: v8-compile-cache-lib@3.0.1: {} - valtio@1.11.2(@types/react@18.3.11)(react@18.3.1): + valtio@1.11.2(@types/react@18.3.5)(react@18.3.1): dependencies: proxy-compare: 2.5.1 use-sync-external-store: 1.2.0(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.5 react: 18.3.1 victory-vendor@36.9.2: @@ -10675,12 +10253,12 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vite-node@2.1.1(@types/node@22.7.4): + vite-node@2.1.1(@types/node@20.16.5): dependencies: cac: 6.7.14 debug: 4.3.7 pathe: 1.1.2 - vite: 5.4.8(@types/node@22.7.4) + vite: 5.4.6(@types/node@20.16.5) transitivePeerDependencies: - '@types/node' - less @@ -10692,12 +10270,12 @@ snapshots: - supports-color - terser - vite-node@2.1.2(@types/node@20.16.10): + vite-node@2.1.1(@types/node@22.7.4): dependencies: cac: 6.7.14 debug: 4.3.7 pathe: 1.1.2 - vite: 5.4.8(@types/node@20.16.10) + vite: 5.4.6(@types/node@22.7.4) transitivePeerDependencies: - '@types/node' - less @@ -10709,36 +10287,36 @@ snapshots: - supports-color - terser - vite-plugin-node-polyfills@0.22.0(rollup@4.22.0)(vite@5.4.8(@types/node@20.16.10)): + vite-plugin-node-polyfills@0.22.0(rollup@4.22.0)(vite@5.4.6(@types/node@20.16.5)): dependencies: '@rollup/plugin-inject': 5.0.5(rollup@4.22.0) node-stdlib-browser: 1.2.0 - vite: 5.4.8(@types/node@20.16.10) + vite: 5.4.6(@types/node@20.16.5) transitivePeerDependencies: - rollup - vite@5.4.8(@types/node@20.16.10): + vite@5.4.6(@types/node@20.16.5): dependencies: esbuild: 0.21.5 - postcss: 8.4.47 + postcss: 8.4.45 rollup: 4.22.0 optionalDependencies: - '@types/node': 20.16.10 + '@types/node': 20.16.5 fsevents: 2.3.3 - vite@5.4.8(@types/node@22.7.4): + vite@5.4.6(@types/node@22.7.4): dependencies: esbuild: 0.21.5 - postcss: 8.4.47 + postcss: 8.4.45 rollup: 4.22.0 optionalDependencies: '@types/node': 22.7.4 fsevents: 2.3.3 - vitest@2.1.1(@types/node@22.7.4)(jsdom@24.1.3)(msw@2.4.9(typescript@5.5.4)): + vitest@2.1.1(@types/node@20.16.5)(jsdom@24.1.3)(msw@2.4.4(typescript@5.5.4)): dependencies: '@vitest/expect': 2.1.1 - '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(msw@2.4.9(typescript@5.5.4))(vite@5.4.8(@types/node@22.7.4)) + '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(msw@2.4.4(typescript@5.5.4))(vite@5.4.6(@types/node@20.16.5)) '@vitest/pretty-format': 2.1.1 '@vitest/runner': 2.1.1 '@vitest/snapshot': 2.1.1 @@ -10753,11 +10331,11 @@ snapshots: tinyexec: 0.3.0 tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 5.4.8(@types/node@22.7.4) - vite-node: 2.1.1(@types/node@22.7.4) + vite: 5.4.6(@types/node@20.16.5) + vite-node: 2.1.1(@types/node@20.16.5) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.7.4 + '@types/node': 20.16.5 jsdom: 24.1.3 transitivePeerDependencies: - less @@ -10770,15 +10348,15 @@ snapshots: - supports-color - terser - vitest@2.1.2(@types/node@20.16.10)(jsdom@24.1.3)(msw@2.4.9(typescript@5.6.2)): + vitest@2.1.1(@types/node@22.7.4)(jsdom@24.1.3)(msw@2.4.4(typescript@5.5.4)): dependencies: - '@vitest/expect': 2.1.2 - '@vitest/mocker': 2.1.2(@vitest/spy@2.1.2)(msw@2.4.9(typescript@5.6.2))(vite@5.4.8(@types/node@20.16.10)) - '@vitest/pretty-format': 2.1.2 - '@vitest/runner': 2.1.2 - '@vitest/snapshot': 2.1.2 - '@vitest/spy': 2.1.2 - '@vitest/utils': 2.1.2 + '@vitest/expect': 2.1.1 + '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(msw@2.4.4(typescript@5.5.4))(vite@5.4.6(@types/node@22.7.4)) + '@vitest/pretty-format': 2.1.1 + '@vitest/runner': 2.1.1 + '@vitest/snapshot': 2.1.1 + '@vitest/spy': 2.1.1 + '@vitest/utils': 2.1.1 chai: 5.1.1 debug: 4.3.7 magic-string: 0.30.11 @@ -10788,11 +10366,11 @@ snapshots: tinyexec: 0.3.0 tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 5.4.8(@types/node@20.16.10) - vite-node: 2.1.2(@types/node@20.16.10) + vite: 5.4.6(@types/node@22.7.4) + vite-node: 2.1.1(@types/node@22.7.4) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.16.10 + '@types/node': 22.7.4 jsdom: 24.1.3 transitivePeerDependencies: - less diff --git a/ui/package.json b/ui/package.json index 91d83e7b..cd3b211a 100644 --- a/ui/package.json +++ b/ui/package.json @@ -7,74 +7,74 @@ "node": "20" }, "devDependencies": { - "@playwright/test": "1.47.2", - "@tanstack/router-vite-plugin": "1.62.0", + "@playwright/test": "1.47.0", + "@tanstack/router-vite-plugin": "1.56.4", "@testing-library/dom": "10.4.0", "@testing-library/jest-dom": "6.5.0", "@testing-library/react": "16.0.1", "@types/big.js": "6.2.2", - "@types/node": "20.16.10", - "@types/react": "18.3.11", + "@types/node": "20.16.5", + "@types/react": "18.3.5", "@types/react-dom": "18.3.0", "@typescript-eslint/eslint-plugin": "8.7.0", "@typescript-eslint/parser": "8.7.0", - "@vitejs/plugin-react": "4.3.2", - "@vitest/coverage-v8": "2.1.2", + "@vitejs/plugin-react": "4.3.1", + "@vitest/coverage-v8": "2.1.1", "algo-msgpack-with-bigint": "2.1.1", "autoprefixer": "10.4.20", "eslint": "8.57.1", "eslint-config-prettier": "9.1.0", "eslint-plugin-prettier": "5.2.1", "jsdom": "24.1.3", - "msw": "2.4.9", - "playwright": "1.47.2", - "postcss": "8.4.47", + "msw": "2.4.4", + "playwright": "1.47.0", + "postcss": "8.4.45", "prettier": "3.3.3", - "tailwindcss": "3.4.13", + "tailwindcss": "3.4.10", "ts-node": "10.9.2", - "typescript": "5.6.2", - "vite": "5.4.8", - "vitest": "2.1.2" + "typescript": "5.5.4", + "vite": "5.4.6", + "vitest": "2.1.1" }, "dependencies": { "@algorandfoundation/algokit-utils": "7.0.0-beta.11", "@blockshake/defly-connect": "1.1.6", "@hookform/resolvers": "3.9.0", "@perawallet/connect": "1.3.4", - "@radix-ui/react-avatar": "1.1.1", - "@radix-ui/react-checkbox": "1.1.2", - "@radix-ui/react-collapsible": "1.1.1", - "@radix-ui/react-dialog": "1.1.2", - "@radix-ui/react-dropdown-menu": "2.1.2", - "@radix-ui/react-hover-card": "1.1.2", + "@radix-ui/react-avatar": "1.1.0", + "@radix-ui/react-checkbox": "1.1.1", + "@radix-ui/react-collapsible": "1.1.0", + "@radix-ui/react-dialog": "1.1.1", + "@radix-ui/react-dropdown-menu": "2.1.1", + "@radix-ui/react-hover-card": "1.1.1", "@radix-ui/react-icons": "1.3.0", "@radix-ui/react-label": "2.1.0", - "@radix-ui/react-navigation-menu": "1.2.1", - "@radix-ui/react-popover": "1.1.2", - "@radix-ui/react-scroll-area": "1.2.0", - "@radix-ui/react-select": "2.1.2", + "@radix-ui/react-navigation-menu": "1.2.0", + "@radix-ui/react-popover": "1.1.1", + "@radix-ui/react-scroll-area": "1.1.0", + "@radix-ui/react-select": "2.1.1", "@radix-ui/react-separator": "1.1.0", "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-switch": "1.1.1", - "@radix-ui/react-tooltip": "1.1.3", - "@tanstack/react-query": "5.59.0", - "@tanstack/react-query-devtools": "5.59.0", - "@tanstack/react-router": "1.62.0", + "@radix-ui/react-switch": "1.1.0", + "@radix-ui/react-tooltip": "1.1.2", + "@tanstack/react-query": "5.55.3", + "@tanstack/react-query-devtools": "5.55.2", + "@tanstack/react-router": "1.56.5", "@tanstack/react-table": "8.20.5", - "@tanstack/router-devtools": "1.62.0", - "@tremor/react": "3.18.3", - "@txnlab/use-wallet-react": "3.7.2", - "@walletconnect/modal-sign-html": "2.7.0", + "@tanstack/router-devtools": "1.56.5", + "@tremor/react": "3.18.1", + "@txnlab/use-wallet-react": "3.7.0", + "@walletconnect/modal-sign-html": "2.6.2", "algosdk": "^2.9.0", - "axios": "1.7.7", - "axios-cache-interceptor": "1.6.0", - "big.js": "6.2.2", + "axios": "1.7.4", + "axios-cache-interceptor": "1.5.3", + "big.js": "6.2.1", "class-variance-authority": "0.7.0", "clsx": "2.1.1", "copy-to-clipboard": "3.3.3", "date-fns": "3.6.0", "dayjs": "1.11.13", - "lucide-react": "0.447.0", + "lucide-react": "0.439.0", "lute-connect": "1.4.1", "next-themes": "0.3.0", "notistack": "3.0.1", @@ -85,7 +85,7 @@ "react-helmet-async": "2.0.5", "react-hook-form": "7.53.0", "sonner": "1.5.0", - "tailwind-merge": "2.5.3", + "tailwind-merge": "2.5.2", "tailwindcss-animate": "1.0.7", "tslib": "2.7.0", "use-debounce": "10.0.3", From 6163b797c6c18eacfe4263242b39b416abae405c Mon Sep 17 00:00:00 2001 From: Patrick Bennett Date: Wed, 9 Oct 2024 16:40:42 -0400 Subject: [PATCH 22/24] Still some oddities in staking table comparisons (because of number vs bigint for validator id types) but this seems to fix staking table display. Removed unused argument in GoOnline nodemgr method. --- nodemgr/daemon.go | 4 ++-- nodemgr/internal/lib/reti/stakingpool.go | 2 +- ui/src/components/StakingTable.tsx | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/nodemgr/daemon.go b/nodemgr/daemon.go index e20d655f..8c86c1f5 100644 --- a/nodemgr/daemon.go +++ b/nodemgr/daemon.go @@ -414,7 +414,7 @@ func (d *Daemon) ensureParticipationNotOnline(_ context.Context, poolAccounts ma // going offline to online - we pass that info on via the third arg so the extra fees are included to make the // account eligible for payments. - err = App.retiClient.GoOnline(info.poolAppId, managerAddr, true, keyToUse.Key.VoteParticipationKey, keyToUse.Key.SelectionParticipationKey, keyToUse.Key.StateProofKey, keyToUse.Key.VoteFirstValid, keyToUse.Key.VoteLastValid, keyToUse.Key.VoteKeyDilution) + err = App.retiClient.GoOnline(info.poolAppId, managerAddr, keyToUse.Key.VoteParticipationKey, keyToUse.Key.SelectionParticipationKey, keyToUse.Key.StateProofKey, keyToUse.Key.VoteFirstValid, keyToUse.Key.VoteLastValid, keyToUse.Key.VoteKeyDilution) if err != nil { return fmt.Errorf("unable to go online for key:%s, account:%s [pool app id:%d], err:%w", keyToUse.Id, account, info.poolAppId, err) } @@ -530,7 +530,7 @@ func (d *Daemon) ensureParticipationCheckNeedsSwitched(ctx context.Context, pool } // Ok, we're already online but its time to switch to the new key - it's in valid range misc.Infof(d.logger, "account:%s going online against newest of %d part keys, id:%s", account, len(keysForAccount), keyToCheck.Id) - err = App.retiClient.GoOnline(info.poolAppId, managerAddr, false, keyToCheck.Key.VoteParticipationKey, keyToCheck.Key.SelectionParticipationKey, keyToCheck.Key.StateProofKey, keyToCheck.Key.VoteFirstValid, keyToCheck.Key.VoteLastValid, keyToCheck.Key.VoteKeyDilution) + err = App.retiClient.GoOnline(info.poolAppId, managerAddr, keyToCheck.Key.VoteParticipationKey, keyToCheck.Key.SelectionParticipationKey, keyToCheck.Key.StateProofKey, keyToCheck.Key.VoteFirstValid, keyToCheck.Key.VoteLastValid, keyToCheck.Key.VoteKeyDilution) if err != nil { return fmt.Errorf("unable to go online for account:%s [pool app id:%d], err: %w", account, info.poolAppId, err) } diff --git a/nodemgr/internal/lib/reti/stakingpool.go b/nodemgr/internal/lib/reti/stakingpool.go index 0c922626..9dae1886 100644 --- a/nodemgr/internal/lib/reti/stakingpool.go +++ b/nodemgr/internal/lib/reti/stakingpool.go @@ -283,7 +283,7 @@ func (r *Reti) EpochBalanceUpdate(poolID int, poolAppID uint64, caller types.Add return nil } -func (r *Reti) GoOnline(poolAppID uint64, caller types.Address, needsIncentiveFeePaid bool, votePK []byte, selectionPK []byte, stateProofPK []byte, voteFirst uint64, voteLast uint64, voteKeyDilution uint64) error { +func (r *Reti) GoOnline(poolAppID uint64, caller types.Address, votePK []byte, selectionPK []byte, stateProofPK []byte, voteFirst uint64, voteLast uint64, voteKeyDilution uint64) error { var ( err error poolAddress = crypto.GetApplicationAddress(poolAppID).String() diff --git a/ui/src/components/StakingTable.tsx b/ui/src/components/StakingTable.tsx index 39f27f7e..2cd77e1f 100644 --- a/ui/src/components/StakingTable.tsx +++ b/ui/src/components/StakingTable.tsx @@ -89,7 +89,7 @@ export function StakingTable({ accessorFn: (row) => row.validatorId, header: ({ column }) => , cell: ({ row }) => { - const validator = validators.find((v) => BigInt(v.id) === row.original.validatorId) + const validator = validators.find((v) => BigInt(v.id) === BigInt(row.original.validatorId)) if (!validator) { return 'Unknown Validator' @@ -159,7 +159,7 @@ export function StakingTable({ accessorKey: 'rewardTokenBalance', header: ({ column }) => , cell: ({ row }) => { - const validator = validators.find((v) => BigInt(v.id) === row.original.validatorId) + const validator = validators.find((v) => BigInt(v.id) === BigInt(row.original.validatorId)) if (!validator?.rewardToken) { return -- } From 24703fbd60eb14a69fcd60757595068e559e39fe Mon Sep 17 00:00:00 2001 From: Patrick Bennett Date: Wed, 9 Oct 2024 17:28:52 -0400 Subject: [PATCH 23/24] chore: v0.11.0 --- contracts/bootstrap/package.json | 2 +- contracts/package.json | 2 +- ui/package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/bootstrap/package.json b/contracts/bootstrap/package.json index 3b394463..82972eae 100644 --- a/contracts/bootstrap/package.json +++ b/contracts/bootstrap/package.json @@ -1,6 +1,6 @@ { "name": "bootstrap", - "version": "0.10.1", + "version": "0.11.0", "description": "", "main": "index.ts", "scripts": { diff --git a/contracts/package.json b/contracts/package.json index 9a03f2df..53a4a500 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -1,6 +1,6 @@ { "name": "reti-contracts", - "version": "0.10.1", + "version": "0.11.0", "license": "MIT", "scripts": { "generate-client": "pnpx @algorandfoundation/algokit-client-generator@4.0.0-beta.5 generate -a contracts/artifacts/StakingPool.arc56_draft.json -o contracts/clients/StakingPoolClient.ts && pnpx @algorandfoundation/algokit-client-generator@4.0.0-beta.5 generate -a contracts/artifacts/ValidatorRegistry.arc56_draft.json -o contracts/clients/ValidatorRegistryClient.ts && ./update_contract_artifacts.sh", diff --git a/ui/package.json b/ui/package.json index cd3b211a..49aba4d5 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,6 +1,6 @@ { "name": "reti-ui", - "version": "0.10.1", + "version": "0.11.0", "private": true, "type": "module", "engines": { From b4f19d00bd31f7af1d7b367e70398b43d8ac9f9c Mon Sep 17 00:00:00 2001 From: Patrick Bennett Date: Wed, 9 Oct 2024 18:22:08 -0400 Subject: [PATCH 24/24] chore: update fnet reti app id to 639070 --- nodemgr/internal/lib/algo/networks.go | 2 +- ui/.env.template | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nodemgr/internal/lib/algo/networks.go b/nodemgr/internal/lib/algo/networks.go index 581b88cf..139cee75 100644 --- a/nodemgr/internal/lib/algo/networks.go +++ b/nodemgr/internal/lib/algo/networks.go @@ -87,7 +87,7 @@ func getDefaults(network string) NetworkConfig { cfg.NFDAPIUrl = "https://api.betanet.nf.domains" cfg.NodeURL = "https://betanet-api.algonode.cloud" case "fnet": - cfg.RetiAppID = 3221 + cfg.RetiAppID = 639070 cfg.NFDAPIUrl = "https://api.betanet.nf.domains" cfg.NodeURL = "https://fnet-api.4160.nodely.dev" case "sandbox": diff --git a/ui/.env.template b/ui/.env.template index 3cd9fb43..e02eee24 100644 --- a/ui/.env.template +++ b/ui/.env.template @@ -102,7 +102,7 @@ VITE_NFD_APP_URL=https://app.testnet.nf.domains VITE_NFD_REGISTRY_APP_ID=84366825 # Reti -VITE_RETI_APP_ID=3221 +VITE_RETI_APP_ID=639070 # ======================== # MainNet configuration: